diff --git a/.dockerignore b/.dockerignore index 2e6259d23d..9c6ac6b4aa 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,5 @@ .dockerignore .editorconfig -.travis.yml GPLv3.txt LICENSE README.md @@ -26,5 +25,4 @@ tgstation.dyn.rsc libmariadb.dll rust_g.dll BSQL.dll -appveyor.yml Dockerfile diff --git a/.editorconfig b/.editorconfig index 13dcd5e029..c44572fbf9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,11 +1,14 @@ [*] -insert_final_newline = true indent_style = tab indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +#end_of_line = lf [*.yml] indent_style = space indent_size = 2 -[*.txt] -insert_final_newline = false +[*.py] +indent_style = space diff --git a/.gitattributes b/.gitattributes index a0a624af04..b23dfe6932 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,9 +1,45 @@ -# merger hooks, run tools/hooks/install.bat or install.sh to set up -*.dmm merge=dmm -*.dmi merge=dmi - -# force changelog merging to use union -html/changelog.html merge=union - -# force all files to be LF * text=auto + +## Enforce text mode and LF line breaks +## porter note: not yet LFing dm. +# *.bat text eol=lf +*.css text eol=lf +# *.dm text eol=lf +# *.dme text eol=lf +# *.dmf text eol=lf +*.htm text eol=lf +*.html text eol=lf +*.js text eol=lf +*.json text eol=lf +*.jsx text eol=lf +# *.md text eol=lf +*.py text eol=lf +*.scss text eol=lf +# *.sh text eol=lf +# *.sql text eol=lf +*.svg text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +# *.txt text eol=lf +*.yaml text eol=lf +*.yml text eol=lf + +## Enforce binary mode +*.bmp binary +*.dll binary +*.dmb binary +*.exe binary +*.gif binary +*.jpg binary +*.png binary +*.so binary + +## Merger hooks, run tools/hooks/install.bat or install.sh to set up +*.dmm text eol=lf merge=dmm +*.dmi binary merge=dmi + +##Force tab indents on dm files +*.dm whitespace=indent-with-non-tab + +## Force changelog merging to use union +html/changelog.html text eol=lf merge=union diff --git a/.github/workflows/autobuild_tgui.yml b/.github/workflows/autobuild_tgui.yml deleted file mode 100644 index 226ea2b7ce..0000000000 --- a/.github/workflows/autobuild_tgui.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Autobuild TGUI - -on: - push: - branches: - - 'master' - paths: - - 'tgui/**.js' - - 'tgui/**.scss' - -jobs: - build: - name: Rebuild TGUI - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v1 - with: - fetch-depth: 25 - - name: Setup Node - uses: actions/setup-node@v1 - with: - node-version: '>=12.13' - - name: Build TGUI - run: bin/tgui --ci - working-directory: ./tgui - - name: Commit Artifacts - run: | - git config --local user.email "action@github.com" - git config --local user.name "TGUI" - git pull origin master - git commit -m "Automatic TGUI Rebuild [ci skip]" -a || true - - name: Push Artifacts - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_MASTER_KEY }} diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml new file mode 100644 index 0000000000..76a1c26656 --- /dev/null +++ b/.github/workflows/ci_suite.yml @@ -0,0 +1,114 @@ +name: CI Suite +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + run_linters: + if: "!contains(github.event.head_commit.message, '[ci skip]')" + name: Run Linters + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup cache + uses: actions/cache@v2 + with: + path: $HOME/SpacemanDMM + key: ${{ runner.os }}-spacemandmm + - name: Install Tools + run: | + pip3 install setuptools + bash tools/ci/install_build_tools.sh + bash tools/ci/install_spaceman_dmm.sh dreamchecker + pip3 install -r tools/mapmerge2/requirements.txt + - name: Run Linters + run: | + bash tools/ci/check_filedirs.sh tgstation.dme + bash tools/ci/check_changelogs.sh + find . -name "*.php" -print0 | xargs -0 -n1 php -l + find . -name "*.json" -not -path "*/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py + bash tools/ci/build_tgui.sh + bash tools/ci/check_grep.sh + python3 tools/mapmerge2/dmi.py --test + ~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 + - name: Annotate Lints + uses: yogstation13/DreamAnnotate@v1 + if: always() + with: + outputFile: output-annotations.txt + + compile_all_maps: + if: "!contains(github.event.head_commit.message, '[ci skip]')" + name: Compile Maps + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup cache + uses: actions/cache@v2 + with: + path: $HOME/BYOND + key: ${{ runner.os }}-byond + - name: Compile All Maps + run: | + bash tools/ci/install_byond.sh + source $HOME/BYOND/byond/bin/byondsetup + python3 tools/ci/template_dm_generator.py + bash tools/ci/dm.sh -DCIBUILDING -DCITESTING -DALL_MAPS tgstation.dme + run_all_tests: + if: "!contains(github.event.head_commit.message, '[ci skip]')" + name: Integration Tests + runs-on: ubuntu-latest + services: + mysql: + image: mysql:latest + env: + MYSQL_ROOT_PASSWORD: root + ports: + - 3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + steps: + - uses: actions/checkout@v2 + - name: Setup cache + uses: actions/cache@v2 + with: + path: $HOME/BYOND + key: ${{ runner.os }}-byond + - name: Setup database + run: | + sudo systemctl start mysql + mysql -u root -proot -e 'CREATE DATABASE tg_ci;' + mysql -u root -proot tg_ci < SQL/tgstation_schema.sql + mysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;' + mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql + - name: Install rust-g + run: | + sudo dpkg --add-architecture i386 + sudo apt update || true + sudo apt install libssl1.1:i386 + bash tools/ci/install_rust_g.sh + # - name: Compile and run tests + # run: | + # bash tools/ci/install_byond.sh + # source $HOME/BYOND/byond/bin/byondsetup + # bash tools/ci/dm.sh -DCIBUILDING tgstation.dme + # bash tools/ci/run_server.sh + test_windows: + if: "!contains(github.event.head_commit.message, '[ci skip]')" + name: Windows Build + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - name: Compile + run: pwsh tools/ci/build.ps1 + - name: Create artifact + run: | + md deploy + bash tools/deploy.sh ./deploy + - name: Deploy artifact + uses: actions/upload-artifact@v2 + with: + name: deploy + path: deploy diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index 4fd396f133..c8756f0d28 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -15,7 +15,7 @@ jobs: CHANGELOG_ENABLER: ${{ secrets.CHANGELOG_ENABLER }} run: | unset SECRET_EXISTS - if [-n $CHANGELOG_ENABLER]; then SECRET_EXISTS='true' ; fi + if [ -n $CHANGELOG_ENABLER ]; then SECRET_EXISTS='true' ; fi echo ::set-output name=CL_ENABLED::${SECRET_EXISTS} - name: "Setup python" if: steps.value_holder.outputs.CL_ENABLED diff --git a/.github/workflows/docker_publish.yml b/.github/workflows/docker_publish.yml new file mode 100644 index 0000000000..7417a382c4 --- /dev/null +++ b/.github/workflows/docker_publish.yml @@ -0,0 +1,22 @@ +name: Docker Build + +on: + push: + branches: + - master + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Build and Publish Docker Image to Registry + uses: elgohr/Publish-Docker-Github-Action@master + with: + name: tgstation/tgstation + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + dockerfile: Dockerfile + tags: "latest" + cache: true diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml new file mode 100644 index 0000000000..d0d61be073 --- /dev/null +++ b/.github/workflows/generate_documentation.yml @@ -0,0 +1,31 @@ +name: Generate documentation +on: + push: + branches: + - master +jobs: + generate_documentation: + if: "!contains(github.event.head_commit.message, '[ci skip]')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup cache + uses: actions/cache@v2 + with: + path: $HOME/SpacemanDMM + key: ${{ runner.os }}-spacemandmm + - name: Install SpacemanDMM + run: bash tools/ci/install_spaceman_dmm.sh dmdoc + - name: Generate documentation + run: | + ~/dmdoc + touch dmdoc/.nojekyll + echo codedocs.tgstation13.org > dmdoc/CNAME + - name: Deploy + uses: JamesIves/github-pages-deploy-action@3.7.1 + with: + BRANCH: gh-pages + CLEAN: true + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SINGLE_COMMIT: true + FOLDER: dmdoc diff --git a/.github/workflows/round_id_linker.yml b/.github/workflows/round_id_linker.yml new file mode 100644 index 0000000000..37998a93eb --- /dev/null +++ b/.github/workflows/round_id_linker.yml @@ -0,0 +1,12 @@ +name: "Round ID Linker" +on: + issues: + types: [opened] + +jobs: + link_rounds: + runs-on: ubuntu-latest + steps: + - uses: Cidatel-Station-13/round_linker@master #notice: fork the round linkies from tg!! + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml new file mode 100644 index 0000000000..c7bb5c970c --- /dev/null +++ b/.github/workflows/update_tgs_dmapi.yml @@ -0,0 +1,47 @@ +name: Update TGS DMAPI + +on: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + +jobs: + update-dmapi: + runs-on: ubuntu-latest + name: Update the TGS DMAPI + steps: + - name: Clone + uses: actions/checkout@v2 + + - name: Branch + run: | + git branch -f tgs-dmapi-update + git checkout tgs-dmapi-update + git reset --hard master + + - name: Apply DMAPI update + uses: tgstation/tgs-dmapi-updater@v2 + with: + header-path: 'code/__DEFINES/tgs.dm' + library-path: 'code/modules/tgs' + + - name: Commit and Push + continue-on-error: true + run: | + git config user.name tgstation-server + git config user.email tgstation-server@users.noreply.github.com + git add . + git commit -m 'Update TGS DMAPI' + git push -f -u origin tgs-dmapi-update + + - name: Create Pull Request + uses: repo-sync/pull-request@v2 + if: ${{ success() }} + with: + source_branch: "tgs-dmapi-update" + destination_branch: "master" + pr_title: "Automatic TGS DMAPI Update" + pr_body: "This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging." + pr_label: "Tools" + pr_allow_empty: false + github_token: ${{ secrets.TGS_UPDATER }} diff --git a/.gitignore b/.gitignore index f65245c021..e885761104 100644 --- a/.gitignore +++ b/.gitignore @@ -198,13 +198,36 @@ Temporary Items !/.vscode/extensions.json tools/MapAtmosFixer/MapAtmosFixer/obj/* tools/MapAtmosFixer/MapAtmosFixer/bin/* +tools/CreditsTool/bin/* +tools/CreditsTool/obj/* #GitHub Atom .atom-build.json -#Jukebox audio files -/config/jukebox_music/**/* +#KDevelop and Kate +*.kdev4* +*.kate-swp #extra map stuff /_maps/**/backup/ /_maps/templates.dm + +#dmdoc default folder +/dmdoc + +# Ignore custom music and title screens (amend as appropriate) +/config/jukebox_music/sounds/* +!/config/jukebox_music/sounds/exclude +/config/title_music/sounds/* +!/config/title_music/sounds/exclude +/config/title_screens/images/* +!/config/title_screens/images/exclude + +#Linux docker +tools/LinuxOneShot/SetupProgram/obj/* +tools/LinuxOneShot/SetupProgram/bin/* +tools/LinuxOneShot/SetupProgram/.vs +tools/LinuxOneShot/Database +tools/LinuxOneShot/TGS_Config +tools/LinuxOneShot/TGS_Instances +tools/LinuxOneShot/TGS_Logs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..11d27b55d3 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,11 @@ +build: + stage: build + rules: + - if: $CI_MERGE_REQUEST_IID || $CI_COMMIT_REF_NAME == "master" + changes: + - tgui/**/*.js + - tgui/**/*.scss + when: always + image: node:lts + script: + - tgui/bin/tgui --ci diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2214df3aee..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,78 +0,0 @@ -language: generic -dist: xenial -sudo: false - -branches: - except: - - ___TGS3TempBranch - - ___TGSTempBranch - -matrix: - include: - - name: "Run Linters" - addons: - apt: - packages: - - python3 - - python3-pip - - python3-setuptools - install: - - tools/travis/install_build_tools.sh - - tools/travis/install_dreamchecker.sh - script: - - tools/travis/check_filedirs.sh tgstation.dme - - tools/travis/check_changelogs.sh - - find . -name "*.php" -print0 | xargs -0 -n1 php -l - - find . -name "*.json" -not -path "*/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py - - tools/travis/build_tgui.sh - - tools/travis/check_grep.sh - - python3 tools/travis/check_line_endings.py - - ~/dreamchecker - - - name: "Compile All Maps" - addons: - apt: - packages: - - libstdc++6:i386 - cache: - directories: - - $HOME/BYOND - install: - - tools/travis/install_byond.sh - - source $HOME/BYOND/byond/bin/byondsetup - before_script: - - tools/travis/template_dm_generator.py - script: - - tools/travis/dm.sh -DTRAVISBUILDING -DTRAVISTESTING -DALL_MAPS tgstation.dme - - - name: "Compile and Run Tests" - addons: - mariadb: '10.2' - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - libstdc++6:i386 - - gcc-multilib - - g++-7 - - g++-7-multilib - - libmariadb-client-lgpl-dev:i386 - - libmariadbd-dev - cache: - directories: - - $HOME/BYOND - - $HOME/libmariadb - install: - - tools/travis/install_byond.sh - - source $HOME/BYOND/byond/bin/byondsetup - - tools/travis/install_libmariadb.sh - - tools/travis/install_rust_g.sh - before_script: - - mysql -u root -e 'CREATE DATABASE tg_travis;' - - mysql -u root tg_travis < SQL/tgstation_schema.sql - - mysql -u root -e 'CREATE DATABASE tg_travis_prefixed;' - - mysql -u root tg_travis_prefixed < SQL/tgstation_schema_prefixed.sql - - tools/travis/build_bsql.sh - script: - - tools/travis/dm.sh -DTRAVISBUILDING tgstation.dme || travis_terminate 1 - - tools/travis/run_server.sh diff --git a/.vscode/extensions.json b/.vscode/extensions.json index ca0e6ad997..bf0d9d2fb9 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,10 @@ { - "recommendations": [ - "gbasood.byond-dm-language-support", - "platymuus.dm-langclient", - "EditorConfig.EditorConfig" - ] + "recommendations": [ + "gbasood.byond-dm-language-support", + "platymuus.dm-langclient", + "EditorConfig.EditorConfig", + "arcanis.vscode-zipfs", + "dbaeumer.vscode-eslint", + "kevinkyang.auto-comment-blocks" + ] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..f95b8f7cc6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "eslint.nodePath": "tgui/.yarn/sdks", + "eslint.workingDirectories": [ + "./tgui" + ], + "search.exclude": { + "tgui/.yarn": true, + "tgui/.pnp.*": true + }, + "workbench.editorAssociations": [ + { + "filenamePattern": "*.dmi", + "viewType": "imagePreview.previewEditor" + } + ], + "files.eol": "\n", + "gitlens.advanced.blame.customArguments": ["-w"] +} diff --git a/Dockerfile b/Dockerfile index e8a5f44908..cca7e43a54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,12 @@ -FROM tgstation/byond:513.1508 as base +FROM tgstation/byond:513.1533 as base -FROM base as build_base +FROM base as rust_g RUN apt-get update \ && apt-get install -y --no-install-recommends \ git \ ca-certificates -FROM build_base as rust_g - WORKDIR /rust_g RUN apt-get install -y --no-install-recommends \ @@ -27,36 +25,6 @@ RUN /bin/bash -c "source dependencies.sh \ && git checkout FETCH_HEAD \ && ~/.cargo/bin/cargo build --release -FROM build_base as bsql - -WORKDIR /bsql - -RUN apt-get install -y --no-install-recommends software-properties-common \ - && add-apt-repository ppa:ubuntu-toolchain-r/test \ - && apt-get update \ - && apt-get install -y --no-install-recommends \ - cmake \ - make \ - g++-7 \ - libmariadb-client-lgpl-dev \ - && git init \ - && git remote add origin https://github.com/tgstation/BSQL - -COPY dependencies.sh . - -RUN /bin/bash -c "source dependencies.sh \ - && git fetch --depth 1 origin \$BSQL_VERSION" \ - && git checkout FETCH_HEAD - -WORKDIR /bsql/artifacts - -ENV CC=gcc-7 CXX=g++-7 - -RUN ln -s /usr/include/mariadb /usr/include/mysql \ - && ln -s /usr/lib/i386-linux-gnu /root/MariaDB \ - && cmake .. \ - && make - FROM base as dm_base WORKDIR /tgstation @@ -65,26 +33,30 @@ FROM dm_base as build COPY . . -RUN DreamMaker -max_errors 0 tgstation.dme && tools/deploy.sh /deploy +RUN DreamMaker -max_errors 0 tgstation.dme \ + && tools/deploy.sh /deploy \ + && rm /deploy/*.dll FROM dm_base EXPOSE 1337 RUN apt-get update \ + && apt-get install -y --no-install-recommends software-properties-common \ + && add-apt-repository ppa:ubuntu-toolchain-r/test \ + && apt-get update \ + && apt-get upgrade -y \ + && apt-get dist-upgrade -y \ && apt-get install -y --no-install-recommends \ + libmariadb2 \ mariadb-client \ libssl1.0.0 \ && rm -rf /var/lib/apt/lists/* \ && mkdir -p /root/.byond/bin COPY --from=rust_g /rust_g/target/release/librust_g.so /root/.byond/bin/rust_g -COPY --from=bsql /bsql/artifacts/src/BSQL/libBSQL.so ./ COPY --from=build /deploy ./ -#bsql fexists memes -RUN ln -s /tgstation/libBSQL.so /root/.byond/bin/libBSQL.so - VOLUME [ "/tgstation/config", "/tgstation/data" ] ENTRYPOINT [ "DreamDaemon", "tgstation.dmb", "-port", "1337", "-trusted", "-close", "-verbose" ] diff --git a/README.md b/README.md index 0ecf4c5b01..bbceb0f05b 100644 --- a/README.md +++ b/README.md @@ -1,175 +1,175 @@ -## Citadel Station 13 -Based and maintained from /tg/station. - -[![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13) -[![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") -[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue") - -[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/pretty-risque.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/you-didnt-ask-for-this.svg)](http://forthebadge.com) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) - -**Upstream Information** -* **Website:** -* **Code:** -* **Wiki:** -* **Codedocs:** -* **/tg/station Discord:** -* **Coderbus Discord:** -* ~~**IRC:** ~~ (dead) - -**Citadel Station Information** -* **Website:** -* **Code:** -* **Wiki:** -* **Forums:** -* **Ban Appeals:** -* **Discord:** - -## DOWNLOADING - -There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code - -Option 1: -Follow this: http://www.tgstation13.org/wiki/Setting_up_git - -Option 2: Download the source code as a zip by clicking the ZIP button in the -code tab of https://github.com/tgstation/tgstation -(note: this will use a lot of bandwidth if you wish to update and is a lot of -hassle if you want to make any changes at all, so it's not recommended.) - -Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2) - -## INSTALLATION - -First-time installation should be fairly straightforward. First, you'll need -BYOND installed. You can get it from https://www.byond.com/download. Once you've done -that, extract the game files to wherever you want to keep them. This is a -sourcecode-only release, so the next step is to compile the server files. -Open tgstation.dme by double-clicking it, open the Build menu, and click -compile. This'll take a little while, and if everything's done right you'll get -a message like this: - -``` -saving tgstation.dmb (DEBUG mode) -tgstation.dmb - 0 errors, 0 warnings -``` - -If you see any errors or warnings, something has gone wrong - possibly a corrupt -download or the files extracted wrong. If problems persist, ask for assistance -in irc://irc.rizon.net/coderbus - -Once that's done, open up the config folder. You'll want to edit config.txt to -set the probabilities for different gamemodes in Secret and to set your server -location so that all your players don't get disconnected at the end of each -round. It's recommended you don't turn on the gamemodes with probability 0, -except Extended, as they have various issues and aren't currently being tested, -so they may have unknown and bizarre bugs. Extended is essentially no mode, and -isn't in the Secret rotation by default as it's just not very fun. - -You'll also want to edit config/admins.txt to remove the default admins and add -your own. "Game Master" is the highest level of access, and probably the one -you'll want to use for now. You can set up your own ranks and find out more in -config/admin_ranks.txt - -The format is - -``` -byondkey = Rank -``` - -where the admin rank must be properly capitalised. - -This codebase also depends on a native library called rust-g. A precompiled -Windows DLL is included in this repository, but Linux users will need to build -and install it themselves. Directions can be found at the [rust-g -repo](https://github.com/tgstation13/rust-g). - -Finally, to start the server, run Dream Daemon and enter the path to your -compiled tgstation.dmb file. Make sure to set the port to the one you -specified in the config.txt, and set the Security box to 'Safe'. Then press GO -and the server should start up and be ready to join. It is also recommended that -you set up the SQL backend (see below). - -## UPDATING - -To update an existing installation, first back up your /config and /data folders -as these store your server configuration, player preferences and banlist. - -Then, extract the new files (preferably into a clean directory, but updating in -place should work fine), copy your /config and /data folders back into the new -install, overwriting when prompted except if we've specified otherwise, and -recompile the game. Once you start the server up again, you should be running -the new version. - -## HOSTING - -If you'd like a more robust server hosting option for tgstation and its -derivatives. Check out our server tools suite at -https://github.com/tgstation/tgstation-server - -## MAPS - -/tg/station currently comes equipped with five maps. - -* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation) -* [MetaStation](https://tgstation13.org/wiki/MetaStation) -* [DeltaStation](https://tgstation13.org/wiki/DeltaStation) -* [OmegaStation](https://tgstation13.org/wiki/OmegaStation) -* [PubbyStation](https://tgstation13.org/wiki/PubbyStation) - - -All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility. - -The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round. - -If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file. - -Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger) - -## AWAY MISSIONS - -/tg/station supports loading away missions however they are disabled by default. - -Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code. - -To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load. - -## SQL SETUP - -The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database - -## WEB/CDN RESOURCE DELIVERY - -Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server. - -1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0` -1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc. - * If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers. - * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files. - -## IRC BOT SETUP - -Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified -IRC channel/server, see the /tools/minibot folder for more - -## CONTRIBUTING - -Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md) - -## LICENSE - -All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html). - -All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). -(Including tools unless their readme specifies otherwise.) - -See LICENSE and GPLv3.txt for more details. - -The TGS3 API is licensed as a subproject under the MIT license. - -See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license. - -tgui clientside is licensed as a subproject under the MIT license. -Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1 -tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). - -All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. +## Citadel Station 13 +Based and maintained from /tg/station. + +[![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13) +[![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") +[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue") + +[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/pretty-risque.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/you-didnt-ask-for-this.svg)](http://forthebadge.com) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) + +**Upstream Information** +* **Website:** +* **Code:** +* **Wiki:** +* **Codedocs:** +* **/tg/station Discord:** +* **Coderbus Discord:** +* ~~**IRC:** ~~ (dead) + +**Citadel Station Information** +* **Website:** +* **Code:** +* **Wiki:** +* **Forums:** +* **Ban Appeals:** +* **Discord:** + +## DOWNLOADING + +There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code + +Option 1: +Follow this: http://www.tgstation13.org/wiki/Setting_up_git + +Option 2: Download the source code as a zip by clicking the ZIP button in the +code tab of https://github.com/tgstation/tgstation +(note: this will use a lot of bandwidth if you wish to update and is a lot of +hassle if you want to make any changes at all, so it's not recommended.) + +Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2) + +## INSTALLATION + +First-time installation should be fairly straightforward. First, you'll need +BYOND installed. You can get it from https://www.byond.com/download. Once you've done +that, extract the game files to wherever you want to keep them. This is a +sourcecode-only release, so the next step is to compile the server files. +Open tgstation.dme by double-clicking it, open the Build menu, and click +compile. This'll take a little while, and if everything's done right you'll get +a message like this: + +``` +saving tgstation.dmb (DEBUG mode) +tgstation.dmb - 0 errors, 0 warnings +``` + +If you see any errors or warnings, something has gone wrong - possibly a corrupt +download or the files extracted wrong. If problems persist, ask for assistance +in irc://irc.rizon.net/coderbus + +Once that's done, open up the config folder. You'll want to edit config.txt to +set the probabilities for different gamemodes in Secret and to set your server +location so that all your players don't get disconnected at the end of each +round. It's recommended you don't turn on the gamemodes with probability 0, +except Extended, as they have various issues and aren't currently being tested, +so they may have unknown and bizarre bugs. Extended is essentially no mode, and +isn't in the Secret rotation by default as it's just not very fun. + +You'll also want to edit config/admins.txt to remove the default admins and add +your own. "Game Master" is the highest level of access, and probably the one +you'll want to use for now. You can set up your own ranks and find out more in +config/admin_ranks.txt + +The format is + +``` +byondkey = Rank +``` + +where the admin rank must be properly capitalised. + +This codebase also depends on a native library called rust-g. A precompiled +Windows DLL is included in this repository, but Linux users will need to build +and install it themselves. Directions can be found at the [rust-g +repo](https://github.com/tgstation13/rust-g). + +Finally, to start the server, run Dream Daemon and enter the path to your +compiled tgstation.dmb file. Make sure to set the port to the one you +specified in the config.txt, and set the Security box to 'Safe'. Then press GO +and the server should start up and be ready to join. It is also recommended that +you set up the SQL backend (see below). + +## UPDATING + +To update an existing installation, first back up your /config and /data folders +as these store your server configuration, player preferences and banlist. + +Then, extract the new files (preferably into a clean directory, but updating in +place should work fine), copy your /config and /data folders back into the new +install, overwriting when prompted except if we've specified otherwise, and +recompile the game. Once you start the server up again, you should be running +the new version. + +## HOSTING + +If you'd like a more robust server hosting option for tgstation and its +derivatives. Check out our server tools suite at +https://github.com/tgstation/tgstation-server + +## MAPS + +/tg/station currently comes equipped with five maps. + +* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation) +* [MetaStation](https://tgstation13.org/wiki/MetaStation) +* [DeltaStation](https://tgstation13.org/wiki/DeltaStation) +* [OmegaStation](https://tgstation13.org/wiki/OmegaStation) +* [PubbyStation](https://tgstation13.org/wiki/PubbyStation) + + +All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility. + +The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round. + +If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file. + +Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger) + +## AWAY MISSIONS + +/tg/station supports loading away missions however they are disabled by default. + +Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code. + +To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load. + +## SQL SETUP + +The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database + +## WEB/CDN RESOURCE DELIVERY + +Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server. + +1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0` +1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc. + * If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers. + * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files. + +## IRC BOT SETUP + +Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified +IRC channel/server, see the /tools/minibot folder for more + +## CONTRIBUTING + +Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md) + +## LICENSE + +All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html). + +All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). +(Including tools unless their readme specifies otherwise.) + +See LICENSE and GPLv3.txt for more details. + +The TGS3 API is licensed as a subproject under the MIT license. + +See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license. + +tgui clientside is licensed as a subproject under the MIT license. +Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1 +tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). + +All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index dc0861220a..34baaaa4c6 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -1,473 +1,473 @@ -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `admin` --- - -DROP TABLE IF EXISTS `admin`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `admin` ( - `ckey` varchar(32) NOT NULL, - `rank` varchar(32) NOT NULL, - PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `admin_log` --- - -DROP TABLE IF EXISTS `admin_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `admin_log` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `datetime` datetime NOT NULL, - `round_id` int(11) unsigned NOT NULL, - `adminckey` varchar(32) NOT NULL, - `adminip` int(10) unsigned NOT NULL, - `operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL, - `target` varchar(32) NOT NULL, - `log` varchar(1000) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `admin_ranks` --- - -DROP TABLE IF EXISTS `admin_ranks`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `admin_ranks` ( - `rank` varchar(32) NOT NULL, - `flags` smallint(5) unsigned NOT NULL, - `exclude_flags` smallint(5) unsigned NOT NULL, - `can_edit_flags` smallint(5) unsigned NOT NULL, - PRIMARY KEY (`rank`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ban` --- - -DROP TABLE IF EXISTS `ban`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `ban` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `bantime` datetime NOT NULL, - `server_ip` int(10) unsigned NOT NULL, - `server_port` smallint(5) unsigned NOT NULL, - `round_id` int(11) NOT NULL, - `bantype` enum('PERMABAN','TEMPBAN','JOB_PERMABAN','JOB_TEMPBAN','ADMIN_PERMABAN','ADMIN_TEMPBAN') NOT NULL, - `reason` varchar(2048) NOT NULL, - `job` varchar(32) DEFAULT NULL, - `duration` int(11) NOT NULL, - `expiration_time` datetime NOT NULL, - `ckey` varchar(32) NOT NULL, - `computerid` varchar(32) NOT NULL, - `ip` int(10) unsigned NOT NULL, - `a_ckey` varchar(32) NOT NULL, - `a_computerid` varchar(32) NOT NULL, - `a_ip` int(10) unsigned NOT NULL, - `who` varchar(2048) NOT NULL, - `adminwho` varchar(2048) NOT NULL, - `edits` text, - `unbanned` tinyint(3) unsigned DEFAULT NULL, - `unbanned_datetime` datetime DEFAULT NULL, - `unbanned_ckey` varchar(32) DEFAULT NULL, - `unbanned_computerid` varchar(32) DEFAULT NULL, - `unbanned_ip` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `idx_ban_checkban` (`ckey`,`bantype`,`expiration_time`,`unbanned`,`job`), - KEY `idx_ban_isbanned` (`ckey`,`ip`,`computerid`,`bantype`,`expiration_time`,`unbanned`), - KEY `idx_ban_count` (`id`,`a_ckey`,`bantype`,`expiration_time`,`unbanned`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `connection_log` --- - -DROP TABLE IF EXISTS `connection_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `connection_log` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `datetime` datetime DEFAULT NULL, - `server_ip` int(10) unsigned NOT NULL, - `server_port` smallint(5) unsigned NOT NULL, - `round_id` int(11) unsigned NOT NULL, - `ckey` varchar(45) DEFAULT NULL, - `ip` int(10) unsigned NOT NULL, - `computerid` varchar(45) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `death` --- - -DROP TABLE IF EXISTS `death`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `death` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `pod` varchar(50) NOT NULL, - `x_coord` smallint(5) unsigned NOT NULL, - `y_coord` smallint(5) unsigned NOT NULL, - `z_coord` smallint(5) unsigned NOT NULL, - `mapname` varchar(32) NOT NULL, - `server_ip` int(10) unsigned NOT NULL, - `server_port` smallint(5) unsigned NOT NULL, - `round_id` int(11) NOT NULL, - `tod` datetime NOT NULL COMMENT 'Time of death', - `job` varchar(32) NOT NULL, - `special` varchar(32) DEFAULT NULL, - `name` varchar(96) NOT NULL, - `byondkey` varchar(32) NOT NULL, - `laname` varchar(96) DEFAULT NULL, - `lakey` varchar(32) DEFAULT NULL, - `bruteloss` smallint(5) unsigned NOT NULL, - `brainloss` smallint(5) unsigned NOT NULL, - `fireloss` smallint(5) unsigned NOT NULL, - `oxyloss` smallint(5) unsigned NOT NULL, - `toxloss` smallint(5) unsigned NOT NULL, - `cloneloss` smallint(5) unsigned NOT NULL, - `staminaloss` smallint(5) unsigned NOT NULL, - `last_words` varchar(255) DEFAULT NULL, - `suicide` tinyint(1) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `feedback` --- - -DROP TABLE IF EXISTS `feedback`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `feedback` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `datetime` datetime NOT NULL, - `round_id` int(11) unsigned NOT NULL, - `key_name` varchar(32) NOT NULL, - `key_type` enum('text', 'amount', 'tally', 'nested tally', 'associative') NOT NULL, - `version` tinyint(3) unsigned NOT NULL, - `json` json NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ipintel` --- - -DROP TABLE IF EXISTS `ipintel`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `ipintel` ( - `ip` int(10) unsigned NOT NULL, - `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `intel` double NOT NULL DEFAULT '0', - PRIMARY KEY (`ip`), - KEY `idx_ipintel` (`ip`,`intel`,`date`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `legacy_population` --- - -DROP TABLE IF EXISTS `legacy_population`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `legacy_population` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `playercount` int(11) DEFAULT NULL, - `admincount` int(11) DEFAULT NULL, - `time` datetime NOT NULL, - `server_ip` int(10) unsigned NOT NULL, - `server_port` smallint(5) unsigned NOT NULL, - `round_id` int(11) unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `library` --- - -DROP TABLE IF EXISTS `library`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `library` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `author` varchar(45) NOT NULL, - `title` varchar(45) NOT NULL, - `content` text NOT NULL, - `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL, - `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY', - `datetime` datetime NOT NULL, - `deleted` tinyint(1) unsigned DEFAULT NULL, - `round_id_created` int(11) unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `deleted_idx` (`deleted`), - KEY `idx_lib_id_del` (`id`,`deleted`), - KEY `idx_lib_del_title` (`deleted`,`title`), - KEY `idx_lib_search` (`deleted`,`author`,`title`,`category`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `messages` --- - -DROP TABLE IF EXISTS `messages`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `messages` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `type` enum('memo','message','message sent','note','watchlist entry') NOT NULL, - `targetckey` varchar(32) NOT NULL, - `adminckey` varchar(32) NOT NULL, - `text` varchar(2048) NOT NULL, - `timestamp` datetime NOT NULL, - `server` varchar(32) DEFAULT NULL, - `server_ip` int(10) unsigned NOT NULL, - `server_port` smallint(5) unsigned NOT NULL, - `round_id` int(11) unsigned NOT NULL, - `secret` tinyint(1) unsigned NOT NULL, - `expire_timestamp` datetime DEFAULT NULL, - `severity` enum('high','medium','minor','none') DEFAULT NULL, - `lasteditor` varchar(32) DEFAULT NULL, - `edits` text, - `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - KEY `idx_msg_ckey_time` (`targetckey`,`timestamp`, `deleted`), - KEY `idx_msg_type_ckeys_time` (`type`,`targetckey`,`adminckey`,`timestamp`, `deleted`), - KEY `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`, `deleted`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `role_time` --- - -DROP TABLE IF EXISTS `role_time`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; - -CREATE TABLE `role_time` -( `ckey` VARCHAR(32) NOT NULL , - `job` VARCHAR(32) NOT NULL , - `minutes` INT UNSIGNED NOT NULL, - PRIMARY KEY (`ckey`, `job`) - ) ENGINE = InnoDB; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `role_time` --- - -DROP TABLE IF EXISTS `role_time_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; - -CREATE TABLE IF NOT EXISTS `role_time_log` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `ckey` varchar(32) NOT NULL, - `job` varchar(128) NOT NULL, - `delta` int(11) NOT NULL, - `datetime` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - PRIMARY KEY (`id`), - KEY `ckey` (`ckey`), - KEY `job` (`job`), - KEY `datetime` (`datetime`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `player` --- - -DROP TABLE IF EXISTS `player`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `player` ( - `ckey` varchar(32) NOT NULL, - `byond_key` varchar(32) DEFAULT NULL, - `firstseen` datetime NOT NULL, - `firstseen_round_id` int(11) unsigned NOT NULL, - `lastseen` datetime NOT NULL, - `lastseen_round_id` int(11) unsigned NOT NULL, - `ip` int(10) unsigned NOT NULL, - `computerid` varchar(32) NOT NULL, - `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player', - `accountjoindate` DATE DEFAULT NULL, - `flags` smallint(5) unsigned DEFAULT '0' NOT NULL, - PRIMARY KEY (`ckey`), - KEY `idx_player_cid_ckey` (`computerid`,`ckey`), - KEY `idx_player_ip_ckey` (`ip`,`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `poll_option` --- - -DROP TABLE IF EXISTS `poll_option`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `poll_option` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `pollid` int(11) NOT NULL, - `text` varchar(255) NOT NULL, - `minval` int(3) DEFAULT NULL, - `maxval` int(3) DEFAULT NULL, - `descmin` varchar(32) DEFAULT NULL, - `descmid` varchar(32) DEFAULT NULL, - `descmax` varchar(32) DEFAULT NULL, - `default_percentage_calc` tinyint(1) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `idx_pop_pollid` (`pollid`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `poll_question` --- - -DROP TABLE IF EXISTS `poll_question`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `poll_question` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `polltype` enum('OPTION','TEXT','NUMVAL','MULTICHOICE','IRV') NOT NULL, - `starttime` datetime NOT NULL, - `endtime` datetime NOT NULL, - `question` varchar(255) NOT NULL, - `adminonly` tinyint(1) unsigned NOT NULL, - `multiplechoiceoptions` int(2) DEFAULT NULL, - `createdby_ckey` varchar(32) DEFAULT NULL, - `createdby_ip` int(10) unsigned NOT NULL, - `dontshow` tinyint(1) unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `idx_pquest_question_time_ckey` (`question`,`starttime`,`endtime`,`createdby_ckey`,`createdby_ip`), - KEY `idx_pquest_time_admin` (`starttime`,`endtime`,`adminonly`), - KEY `idx_pquest_id_time_type_admin` (`id`,`starttime`,`endtime`,`polltype`,`adminonly`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `poll_textreply` --- - -DROP TABLE IF EXISTS `poll_textreply`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `poll_textreply` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `datetime` datetime NOT NULL, - `pollid` int(11) NOT NULL, - `ckey` varchar(32) NOT NULL, - `ip` int(10) unsigned NOT NULL, - `replytext` varchar(2048) NOT NULL, - `adminrank` varchar(32) NOT NULL DEFAULT 'Player', - PRIMARY KEY (`id`), - KEY `idx_ptext_pollid_ckey` (`pollid`,`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `poll_vote` --- - -DROP TABLE IF EXISTS `poll_vote`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `poll_vote` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `datetime` datetime NOT NULL, - `pollid` int(11) NOT NULL, - `optionid` int(11) NOT NULL, - `ckey` varchar(32) NOT NULL, - `ip` int(10) unsigned NOT NULL, - `adminrank` varchar(32) NOT NULL, - `rating` int(2) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `idx_pvote_pollid_ckey` (`pollid`,`ckey`), - KEY `idx_pvote_optionid_ckey` (`optionid`,`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `round` --- -DROP TABLE IF EXISTS `round`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `round` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `initialize_datetime` DATETIME NOT NULL, - `start_datetime` DATETIME NULL, - `shutdown_datetime` DATETIME NULL, - `end_datetime` DATETIME NULL, - `server_ip` INT(10) UNSIGNED NOT NULL, - `server_port` SMALLINT(5) UNSIGNED NOT NULL, - `commit_hash` CHAR(40) NULL, - `game_mode` VARCHAR(32) NULL, - `game_mode_result` VARCHAR(64) NULL, - `end_state` VARCHAR(64) NULL, - `shuttle_name` VARCHAR(64) NULL, - `map_name` VARCHAR(32) NULL, - `station_name` VARCHAR(80) NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - --- --- Table structure for table `schema_revision` --- -DROP TABLE IF EXISTS `schema_revision`; -CREATE TABLE `schema_revision` ( - `major` TINYINT(3) unsigned NOT NULL, - `minor` TINYINT(3) unsigned NOT NULL, - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`major`, `minor`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -DELIMITER $$ -CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes); -END -$$ -CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes); -END -$$ -CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes); -END -$$ - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `admin` +-- + +DROP TABLE IF EXISTS `admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `admin` ( + `ckey` varchar(32) NOT NULL, + `rank` varchar(32) NOT NULL, + PRIMARY KEY (`ckey`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `admin_log` +-- + +DROP TABLE IF EXISTS `admin_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `admin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `datetime` datetime NOT NULL, + `round_id` int(11) unsigned NOT NULL, + `adminckey` varchar(32) NOT NULL, + `adminip` int(10) unsigned NOT NULL, + `operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL, + `target` varchar(32) NOT NULL, + `log` varchar(1000) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `admin_ranks` +-- + +DROP TABLE IF EXISTS `admin_ranks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `admin_ranks` ( + `rank` varchar(32) NOT NULL, + `flags` smallint(5) unsigned NOT NULL, + `exclude_flags` smallint(5) unsigned NOT NULL, + `can_edit_flags` smallint(5) unsigned NOT NULL, + PRIMARY KEY (`rank`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ban` +-- + +DROP TABLE IF EXISTS `ban`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ban` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `bantime` datetime NOT NULL, + `server_ip` int(10) unsigned NOT NULL, + `server_port` smallint(5) unsigned NOT NULL, + `round_id` int(11) NOT NULL, + `bantype` enum('PERMABAN','TEMPBAN','JOB_PERMABAN','JOB_TEMPBAN','ADMIN_PERMABAN','ADMIN_TEMPBAN') NOT NULL, + `reason` varchar(2048) NOT NULL, + `job` varchar(32) DEFAULT NULL, + `duration` int(11) NOT NULL, + `expiration_time` datetime NOT NULL, + `ckey` varchar(32) NOT NULL, + `computerid` varchar(32) NOT NULL, + `ip` int(10) unsigned NOT NULL, + `a_ckey` varchar(32) NOT NULL, + `a_computerid` varchar(32) NOT NULL, + `a_ip` int(10) unsigned NOT NULL, + `who` varchar(2048) NOT NULL, + `adminwho` varchar(2048) NOT NULL, + `edits` text, + `unbanned` tinyint(3) unsigned DEFAULT NULL, + `unbanned_datetime` datetime DEFAULT NULL, + `unbanned_ckey` varchar(32) DEFAULT NULL, + `unbanned_computerid` varchar(32) DEFAULT NULL, + `unbanned_ip` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_ban_checkban` (`ckey`,`bantype`,`expiration_time`,`unbanned`,`job`), + KEY `idx_ban_isbanned` (`ckey`,`ip`,`computerid`,`bantype`,`expiration_time`,`unbanned`), + KEY `idx_ban_count` (`id`,`a_ckey`,`bantype`,`expiration_time`,`unbanned`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `connection_log` +-- + +DROP TABLE IF EXISTS `connection_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `connection_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `datetime` datetime DEFAULT NULL, + `server_ip` int(10) unsigned NOT NULL, + `server_port` smallint(5) unsigned NOT NULL, + `round_id` int(11) unsigned NOT NULL, + `ckey` varchar(45) DEFAULT NULL, + `ip` int(10) unsigned NOT NULL, + `computerid` varchar(45) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `death` +-- + +DROP TABLE IF EXISTS `death`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `death` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `pod` varchar(50) NOT NULL, + `x_coord` smallint(5) unsigned NOT NULL, + `y_coord` smallint(5) unsigned NOT NULL, + `z_coord` smallint(5) unsigned NOT NULL, + `mapname` varchar(32) NOT NULL, + `server_ip` int(10) unsigned NOT NULL, + `server_port` smallint(5) unsigned NOT NULL, + `round_id` int(11) NOT NULL, + `tod` datetime NOT NULL COMMENT 'Time of death', + `job` varchar(32) NOT NULL, + `special` varchar(32) DEFAULT NULL, + `name` varchar(96) NOT NULL, + `byondkey` varchar(32) NOT NULL, + `laname` varchar(96) DEFAULT NULL, + `lakey` varchar(32) DEFAULT NULL, + `bruteloss` smallint(5) unsigned NOT NULL, + `brainloss` smallint(5) unsigned NOT NULL, + `fireloss` smallint(5) unsigned NOT NULL, + `oxyloss` smallint(5) unsigned NOT NULL, + `toxloss` smallint(5) unsigned NOT NULL, + `cloneloss` smallint(5) unsigned NOT NULL, + `staminaloss` smallint(5) unsigned NOT NULL, + `last_words` varchar(255) DEFAULT NULL, + `suicide` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `feedback` +-- + +DROP TABLE IF EXISTS `feedback`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `feedback` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `datetime` datetime NOT NULL, + `round_id` int(11) unsigned NOT NULL, + `key_name` varchar(32) NOT NULL, + `key_type` enum('text', 'amount', 'tally', 'nested tally', 'associative') NOT NULL, + `version` tinyint(3) unsigned NOT NULL, + `json` json NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ipintel` +-- + +DROP TABLE IF EXISTS `ipintel`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ipintel` ( + `ip` int(10) unsigned NOT NULL, + `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `intel` double NOT NULL DEFAULT '0', + PRIMARY KEY (`ip`), + KEY `idx_ipintel` (`ip`,`intel`,`date`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `legacy_population` +-- + +DROP TABLE IF EXISTS `legacy_population`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `legacy_population` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `playercount` int(11) DEFAULT NULL, + `admincount` int(11) DEFAULT NULL, + `time` datetime NOT NULL, + `server_ip` int(10) unsigned NOT NULL, + `server_port` smallint(5) unsigned NOT NULL, + `round_id` int(11) unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `library` +-- + +DROP TABLE IF EXISTS `library`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `library` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `author` varchar(45) NOT NULL, + `title` varchar(45) NOT NULL, + `content` text NOT NULL, + `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL, + `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY', + `datetime` datetime NOT NULL, + `deleted` tinyint(1) unsigned DEFAULT NULL, + `round_id_created` int(11) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `deleted_idx` (`deleted`), + KEY `idx_lib_id_del` (`id`,`deleted`), + KEY `idx_lib_del_title` (`deleted`,`title`), + KEY `idx_lib_search` (`deleted`,`author`,`title`,`category`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `messages` +-- + +DROP TABLE IF EXISTS `messages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `messages` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `type` enum('memo','message','message sent','note','watchlist entry') NOT NULL, + `targetckey` varchar(32) NOT NULL, + `adminckey` varchar(32) NOT NULL, + `text` varchar(2048) NOT NULL, + `timestamp` datetime NOT NULL, + `server` varchar(32) DEFAULT NULL, + `server_ip` int(10) unsigned NOT NULL, + `server_port` smallint(5) unsigned NOT NULL, + `round_id` int(11) unsigned NOT NULL, + `secret` tinyint(1) unsigned NOT NULL, + `expire_timestamp` datetime DEFAULT NULL, + `severity` enum('high','medium','minor','none') DEFAULT NULL, + `lasteditor` varchar(32) DEFAULT NULL, + `edits` text, + `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_msg_ckey_time` (`targetckey`,`timestamp`, `deleted`), + KEY `idx_msg_type_ckeys_time` (`type`,`targetckey`,`adminckey`,`timestamp`, `deleted`), + KEY `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`, `deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `role_time` +-- + +DROP TABLE IF EXISTS `role_time`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; + +CREATE TABLE `role_time` +( `ckey` VARCHAR(32) NOT NULL , + `job` VARCHAR(32) NOT NULL , + `minutes` INT UNSIGNED NOT NULL, + PRIMARY KEY (`ckey`, `job`) + ) ENGINE = InnoDB; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `role_time` +-- + +DROP TABLE IF EXISTS `role_time_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; + +CREATE TABLE IF NOT EXISTS `role_time_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `ckey` varchar(32) NOT NULL, + `job` varchar(128) NOT NULL, + `delta` int(11) NOT NULL, + `datetime` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + PRIMARY KEY (`id`), + KEY `ckey` (`ckey`), + KEY `job` (`job`), + KEY `datetime` (`datetime`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `player` +-- + +DROP TABLE IF EXISTS `player`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `player` ( + `ckey` varchar(32) NOT NULL, + `byond_key` varchar(32) DEFAULT NULL, + `firstseen` datetime NOT NULL, + `firstseen_round_id` int(11) unsigned NOT NULL, + `lastseen` datetime NOT NULL, + `lastseen_round_id` int(11) unsigned NOT NULL, + `ip` int(10) unsigned NOT NULL, + `computerid` varchar(32) NOT NULL, + `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player', + `accountjoindate` DATE DEFAULT NULL, + `flags` smallint(5) unsigned DEFAULT '0' NOT NULL, + PRIMARY KEY (`ckey`), + KEY `idx_player_cid_ckey` (`computerid`,`ckey`), + KEY `idx_player_ip_ckey` (`ip`,`ckey`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `poll_option` +-- + +DROP TABLE IF EXISTS `poll_option`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `poll_option` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `pollid` int(11) NOT NULL, + `text` varchar(255) NOT NULL, + `minval` int(3) DEFAULT NULL, + `maxval` int(3) DEFAULT NULL, + `descmin` varchar(32) DEFAULT NULL, + `descmid` varchar(32) DEFAULT NULL, + `descmax` varchar(32) DEFAULT NULL, + `default_percentage_calc` tinyint(1) unsigned NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `idx_pop_pollid` (`pollid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `poll_question` +-- + +DROP TABLE IF EXISTS `poll_question`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `poll_question` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `polltype` enum('OPTION','TEXT','NUMVAL','MULTICHOICE','IRV') NOT NULL, + `starttime` datetime NOT NULL, + `endtime` datetime NOT NULL, + `question` varchar(255) NOT NULL, + `adminonly` tinyint(1) unsigned NOT NULL, + `multiplechoiceoptions` int(2) DEFAULT NULL, + `createdby_ckey` varchar(32) DEFAULT NULL, + `createdby_ip` int(10) unsigned NOT NULL, + `dontshow` tinyint(1) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_pquest_question_time_ckey` (`question`,`starttime`,`endtime`,`createdby_ckey`,`createdby_ip`), + KEY `idx_pquest_time_admin` (`starttime`,`endtime`,`adminonly`), + KEY `idx_pquest_id_time_type_admin` (`id`,`starttime`,`endtime`,`polltype`,`adminonly`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `poll_textreply` +-- + +DROP TABLE IF EXISTS `poll_textreply`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `poll_textreply` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `datetime` datetime NOT NULL, + `pollid` int(11) NOT NULL, + `ckey` varchar(32) NOT NULL, + `ip` int(10) unsigned NOT NULL, + `replytext` varchar(2048) NOT NULL, + `adminrank` varchar(32) NOT NULL DEFAULT 'Player', + PRIMARY KEY (`id`), + KEY `idx_ptext_pollid_ckey` (`pollid`,`ckey`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `poll_vote` +-- + +DROP TABLE IF EXISTS `poll_vote`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `poll_vote` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `datetime` datetime NOT NULL, + `pollid` int(11) NOT NULL, + `optionid` int(11) NOT NULL, + `ckey` varchar(32) NOT NULL, + `ip` int(10) unsigned NOT NULL, + `adminrank` varchar(32) NOT NULL, + `rating` int(2) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_pvote_pollid_ckey` (`pollid`,`ckey`), + KEY `idx_pvote_optionid_ckey` (`optionid`,`ckey`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `round` +-- +DROP TABLE IF EXISTS `round`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `round` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `initialize_datetime` DATETIME NOT NULL, + `start_datetime` DATETIME NULL, + `shutdown_datetime` DATETIME NULL, + `end_datetime` DATETIME NULL, + `server_ip` INT(10) UNSIGNED NOT NULL, + `server_port` SMALLINT(5) UNSIGNED NOT NULL, + `commit_hash` CHAR(40) NULL, + `game_mode` VARCHAR(32) NULL, + `game_mode_result` VARCHAR(64) NULL, + `end_state` VARCHAR(64) NULL, + `shuttle_name` VARCHAR(64) NULL, + `map_name` VARCHAR(32) NULL, + `station_name` VARCHAR(80) NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +-- +-- Table structure for table `schema_revision` +-- +DROP TABLE IF EXISTS `schema_revision`; +CREATE TABLE `schema_revision` ( + `major` TINYINT(3) unsigned NOT NULL, + `minor` TINYINT(3) unsigned NOT NULL, + `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`major`, `minor`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +DELIMITER $$ +CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes); +END +$$ +CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes); +END +$$ +CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes); +END +$$ + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml index b827472254..81aff0d557 100644 --- a/SpacemanDMM.toml +++ b/SpacemanDMM.toml @@ -1,2 +1,9 @@ [langserver] dreamchecker = true + +[code_standards] +disallow_relative_type_definitions = true +disallow_relative_proc_definitions = true + +[dmdoc] +use_typepath_names = true diff --git a/TGS3.json b/TGS3.json index 2a2b80cf95..228854a166 100644 --- a/TGS3.json +++ b/TGS3.json @@ -1,22 +1,9 @@ -{ - "documentation": "/tg/station server 3 configuration file", - "changelog": { - "script": "tools/ss13_genchangelog.py", - "arguments": "html/changelog.html html/changelogs", - "pip_dependancies": [ - "PyYaml", - "beautifulsoup4" - ] - }, - "synchronize_paths": [ - "html/changelog.html", - "html/changelogs/*" - ], - "static_directories": [ - "config", - "data" - ], - "dlls": [ - "libmariadb.dll" - ] - } +{ + "documentation": "/tg/station server 3 configuration file", + "synchronize_paths": [], + "static_directories": [ + "config", + "data" + ], + "dlls": [] + } diff --git a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm index 37a89ba2ff..e20fa042d7 100644 --- a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm +++ b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm @@ -18,7 +18,7 @@ /obj/item/mining_scanner, /obj/item/flashlight/lantern, /obj/item/card/id/mining, -/obj/item/gps/mining, +/obj/item/gps/mining/off, /turf/open/floor/plating, /area/ruin/powered/golem_ship) "d" = ( @@ -32,7 +32,7 @@ /obj/item/mining_scanner, /obj/item/flashlight/lantern, /obj/item/card/id/mining, -/obj/item/gps/mining, +/obj/item/gps/mining/off, /turf/open/floor/plating, /area/ruin/powered/golem_ship) "e" = ( @@ -71,8 +71,8 @@ /area/ruin/powered/golem_ship) "k" = ( /obj/machinery/computer/arcade/battle{ - icon_state = "arcade"; - dir = 4 + dir = 4; + icon_state = "arcade" }, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) @@ -112,8 +112,8 @@ /area/ruin/powered/golem_ship) "s" = ( /obj/machinery/computer/arcade/orion_trail{ - icon_state = "arcade"; - dir = 4 + dir = 4; + icon_state = "arcade" }, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) @@ -139,6 +139,7 @@ dir = 4; name = "shrine of the liberator" }, +/obj/item/tcg_card/special/golem, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) "v" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm index 93b221c446..a32c526ec4 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm @@ -14,6 +14,10 @@ }, /turf/open/floor/plating/beach/sand, /area/icemoon/surface/outdoors) +"l" = ( +/obj/item/tcg_card/special/morph, +/turf/open/floor/plating/beach/sand, +/area/icemoon/surface/outdoors) "I" = ( /turf/closed/indestructible/fakeglass, /area/icemoon/surface/outdoors) @@ -72,7 +76,7 @@ L c c c -U +l U a b diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm index 704ac63a7d..7a41256478 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm @@ -20,6 +20,10 @@ }, /turf/open/floor/mineral/diamond, /area/icemoon/surface/outdoors) +"f" = ( +/obj/item/tcg_card/special/xenomaid, +/turf/open/floor/mineral/diamond, +/area/icemoon/surface/outdoors) (1,1,1) = {" a @@ -65,7 +69,7 @@ a a a b -c +f c c b diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm index 23abc4b731..9ea8747846 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm @@ -49,6 +49,7 @@ /area/ruin/unpowered) "k" = ( /obj/structure/closet/crate/freezer, +/obj/item/tcg_card/special/demonic_miner, /turf/open/floor/wood, /area/ruin/unpowered) "l" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm index a383c2e8c4..5861309eff 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm @@ -31,6 +31,10 @@ "N" = ( /turf/open/indestructible/necropolis/ice, /area/icemoon/underground/explored) +"S" = ( +/obj/item/tcg_card/special/wendigo, +/turf/open/indestructible/necropolis/ice, +/area/icemoon/underground/explored) "U" = ( /obj/item/paper/crumpled/bloody{ info = "for your own sake, do not enter" @@ -451,7 +455,7 @@ a N N N -N +S N N N diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 639d63772c..cd512e44b6 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -862,6 +862,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/item/tcg_card/special/honk, /turf/open/floor/plating, /area/ruin/powered/clownplanet) "bF" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm index eab08815f3..c2bdea157e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm @@ -111,6 +111,17 @@ /obj/structure/alien/resin/membrane, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) +"ax" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs, +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien/drone, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"ay" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/indestructible/boss, +/area/ruin/unpowered/xenonest) "aA" = ( /obj/structure/alien/weeds, /obj/item/flamethrower, @@ -130,6 +141,17 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) +"aD" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/turf/open/chasm/lavaland, +/area/ruin/unpowered/xenonest) "aE" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/ash, @@ -160,6 +182,19 @@ /obj/effect/decal/cleanable/blood, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) +"aK" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/chasm/lavaland, +/area/ruin/unpowered/xenonest) "aL" = ( /obj/structure/alien/weeds, /obj/item/tank/internals/plasma, @@ -170,6 +205,26 @@ /obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) +"aN" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/turf/open/indestructible/boss, +/area/ruin/unpowered/xenonest) +"aO" = ( +/obj/structure/alien/weeds, +/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"aP" = ( +/obj/structure/alien/weeds, +/obj/effect/mob_spawn/alien/corpse/humanoid/hunter, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) "aQ" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -215,13 +270,6 @@ /obj/effect/gibspawner/xeno, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) -"aY" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs, -/mob/living/simple_animal/hostile/alien/drone, -/obj/structure/alien/weeds/node, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) "aZ" = ( /turf/closed/indestructible/riveted/boss, /area/ruin/unpowered/xenonest) @@ -338,10 +386,6 @@ /obj/structure/stone_tile, /turf/open/indestructible/boss, /area/ruin/unpowered/xenonest) -"bm" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/indestructible/boss, -/area/ruin/unpowered/xenonest) "bn" = ( /obj/structure/stone_tile/block{ dir = 4 @@ -365,12 +409,6 @@ /obj/structure/stone_tile/center, /turf/open/chasm/lavaland, /area/ruin/unpowered/xenonest) -"bp" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/chasm/lavaland, -/area/ruin/unpowered/xenonest) "bq" = ( /turf/open/chasm/lavaland, /area/ruin/unpowered/xenonest) @@ -391,33 +429,6 @@ }, /turf/open/chasm/lavaland, /area/ruin/unpowered/xenonest) -"bt" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center, -/turf/open/chasm/lavaland, -/area/ruin/unpowered/xenonest) -"bu" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/chasm/lavaland, -/area/ruin/unpowered/xenonest) -"bv" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked, -/turf/open/indestructible/boss, -/area/ruin/unpowered/xenonest) "bw" = ( /obj/structure/stone_tile/cracked{ dir = 4 @@ -492,19 +503,6 @@ /obj/structure/alien/weeds, /turf/template_noop, /area/ruin/unpowered/xenonest) -"bE" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/center/cracked, -/turf/open/chasm/lavaland, -/area/ruin/unpowered/xenonest) "dE" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -514,6 +512,12 @@ /obj/item/clothing/mask/facehugger/impregnated, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) +"gA" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) "iA" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -522,18 +526,24 @@ /obj/item/clothing/mask/facehugger/impregnated, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) -"kp" = ( -/obj/structure/alien/weeds, -/obj/item/reagent_containers/syringe/alien, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) "lG" = ( /obj/structure/alien/weeds, /obj/effect/mob_spawn/alien/corpse/humanoid/drone, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) -"pE" = ( -/obj/effect/mob_spawn/alien/corpse/humanoid/queen, +"lM" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/chasm/lavaland, +/area/ruin/unpowered/xenonest) +"nj" = ( +/obj/effect/mob_spawn/alien/corpse/humanoid/praetorian, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"tY" = ( +/obj/structure/alien/weeds/node, +/obj/effect/mob_spawn/alien/corpse/humanoid/hunter, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) "wA" = ( @@ -546,12 +556,23 @@ /mob/living/simple_animal/hostile/alien/sentinel, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) +"zj" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/chasm/lavaland, +/area/ruin/unpowered/xenonest) "Dd" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/gibs, /obj/item/storage/backpack/duffelbag/sec/surgery, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) +"Ha" = ( +/obj/structure/alien/weeds, +/obj/item/reagent_containers/syringe/alien, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) "JM" = ( /obj/structure/alien/weeds/node, /obj/effect/mob_spawn/alien/corpse/humanoid/drone, @@ -1075,7 +1096,7 @@ ac ac ac bi -aY +ax ac ac ac @@ -1123,7 +1144,7 @@ an an ac ac -am +gA ac ac aJ @@ -1278,10 +1299,10 @@ ac Dd ag ak -ag +aP af ac -lG +ag ac ac an @@ -1357,7 +1378,7 @@ ab ac af ag -ar +tY lG ag ag @@ -1511,7 +1532,7 @@ ac ah af ah -JM +ar Vi ak ag @@ -1618,7 +1639,7 @@ ag wA ag ag -pE +nj ag at ag @@ -1640,7 +1661,7 @@ ab aZ aZ aZ -bm +ay aZ aZ aZ @@ -1718,7 +1739,7 @@ ah ar ah ak -kp +Ha at ag ag @@ -1742,8 +1763,8 @@ ac aZ bc bj -bp -bt +lM +aD bx aZ ab @@ -1794,7 +1815,7 @@ ba bd bk bq -bu +zj by aZ ab @@ -1823,7 +1844,7 @@ ac ag ar ag -ag +aO ac ab ab @@ -1845,7 +1866,7 @@ aZ be bo bs -bE +aK bz aZ ab @@ -1896,7 +1917,7 @@ aZ bf bl br -bv +aN bA aZ ab diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm index d8713fd40a..134a692e41 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm @@ -155,6 +155,12 @@ /obj/item/stack/tile/brass/fifty, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/unexplored) +"Y" = ( +/obj/item/tcg_card/special/ratvar, +/turf/open/floor/clockwork{ + initial_gas_mix = "o2=14;n2=23;TEMP=300" + }, +/area/lavaland/surface/outdoors/unexplored) (1,1,1) = {" a @@ -484,7 +490,7 @@ h h h h -h +Y h l l @@ -709,7 +715,7 @@ b l l b -h +Y h t b diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm index cad120c3f2..c307c2caae 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm @@ -26,6 +26,10 @@ }, /turf/open/indestructible/hierophant/two, /area/ruin/unpowered/hierophant) +"s" = ( +/obj/item/tcg_card/special/hierophant, +/turf/open/indestructible/hierophant, +/area/ruin/unpowered/hierophant) (1,1,1) = {" a @@ -494,7 +498,7 @@ b b b c -b +s a a b diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index f4c8c7ea0e..7ac6d32b80 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -11,6 +11,13 @@ "d" = ( /turf/closed/wall/mineral/abductor, /area/ruin/unpowered) +"h" = ( +/obj/structure/closet/abductor, +/obj/item/tcg_card/special/abductor, +/turf/open/floor/plating/abductor{ + initial_gas_mix = "o2=14;n2=23;TEMP=300" + }, +/area/ruin/unpowered) "j" = ( /obj/machinery/abductor/experiment{ team_number = 100 @@ -188,7 +195,7 @@ a a c d -q +h t q d diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index d83b4cf2c3..d4b0e65f2d 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -567,6 +567,7 @@ "bm" = ( /obj/structure/closet/wardrobe/science_white, /obj/structure/disposalpipe/segment, +/obj/item/tcg_card/special/space_carp, /turf/open/floor/plasteel{ icon_state = "dark" }, diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index a1171400e6..bba36470dd 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -16,8 +16,8 @@ /area/template_noop) "ae" = ( /obj/structure/fluff/broken_flooring{ - icon_state = "plating"; - dir = 4 + dir = 4; + icon_state = "plating" }, /turf/template_noop, /area/template_noop) @@ -66,8 +66,8 @@ "an" = ( /obj/structure/lattice, /obj/structure/fluff/broken_flooring{ - icon_state = "plating"; - dir = 4 + dir = 4; + icon_state = "plating" }, /turf/template_noop, /area/template_noop) @@ -78,8 +78,8 @@ "ap" = ( /obj/structure/lattice, /obj/structure/fluff/broken_flooring{ - icon_state = "pile"; - dir = 8 + dir = 8; + icon_state = "pile" }, /turf/template_noop, /area/template_noop) @@ -133,8 +133,8 @@ /area/template_noop) "aE" = ( /obj/structure/fluff/broken_flooring{ - icon_state = "pile"; - dir = 4 + dir = 4; + icon_state = "pile" }, /turf/template_noop, /area/template_noop) @@ -1054,6 +1054,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/secure/weapon, /obj/item/gun/ballistic/automatic/pistol/APS, +/obj/item/tcg_card/special/spess_pirate, /turf/open/floor/plasteel/airless/dark, /area/shuttle/caravan/freighter2) "js" = ( diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 63e6770e42..beb93b319e 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -2372,7 +2372,7 @@ }, /area/awaymission/BMPship/Midship) "hh" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) "hi" = ( diff --git a/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm b/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm index e3b105d06e..ab5086e534 100644 --- a/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm +++ b/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm @@ -91,6 +91,10 @@ }, /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav) +"Y" = ( +/obj/item/tcg_card/special/gondola, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/space/has_grav) (1,1,1) = {" a @@ -339,7 +343,7 @@ b c c c -c +Y o c r diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm index 6e35de07be..a9beb9540e 100644 --- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm @@ -19,6 +19,7 @@ /area/ruin/space/has_grav/powered/mechtransport) "g" = ( /obj/structure/closet/crate/secure/loot, +/obj/item/tcg_card/special/phazon, /turf/open/floor/mineral/titanium/blue, /area/ruin/space/has_grav/powered/mechtransport) "h" = ( diff --git a/_maps/RandomRuins/SpaceRuins/skelter.dmm b/_maps/RandomRuins/SpaceRuins/skelter.dmm index f6e6584f10..77837392e4 100644 --- a/_maps/RandomRuins/SpaceRuins/skelter.dmm +++ b/_maps/RandomRuins/SpaceRuins/skelter.dmm @@ -1529,6 +1529,7 @@ icon_state = "warningline"; dir = 1 }, +/obj/item/paper/fluff/ruins/skelter/cloner, /turf/open/floor/plasteel, /area/ruin/space/has_grav/skelter/med) "dJ" = ( @@ -2485,10 +2486,13 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/skelter/engine/powerstorage) "fR" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/item/ammo_casing/c45, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/kitchen/knife/combat, /turf/open/floor/plating, /area/ruin/space/has_grav/skelter/engine/powerstorage) "fS" = ( @@ -2725,9 +2729,7 @@ /turf/open/floor/carpet, /area/ruin/space/has_grav/skelter/admin) "gx" = ( -/obj/machinery/door/firedoor{ - pixel_x = 0 - }, +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ icon_state = "1-2" @@ -2738,9 +2740,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/ruin/space/has_grav/skelter/shields) "gy" = ( -/obj/machinery/door/firedoor{ - pixel_x = 0 - }, +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/engineering{ name = "Shields" @@ -2826,10 +2826,12 @@ /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/skelter/sec) "gI" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/automatic/pistol/m1911, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/skelter/sec) +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/item/ammo_casing/c10mm, +/turf/open/floor/plating, +/area/ruin/space/has_grav/skelter/engine/powerstorage) "gJ" = ( /obj/machinery/power/terminal{ dir = 1 @@ -3285,17 +3287,10 @@ /turf/open/floor/plasteel/showroomfloor, /area/ruin/space/has_grav/skelter/comms) "hJ" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/ammo_casing/c45, -/turf/open/floor/plasteel/showroomfloor, -/area/ruin/space/has_grav/skelter/comms) +/obj/structure/rack, +/obj/item/ammo_box/magazine/m10mm, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/skelter/sec) "hK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ icon_state = "trimline_fill"; @@ -3843,19 +3838,10 @@ /turf/open/floor/plasteel/showroomfloor, /area/ruin/space/has_grav/skelter/comms) "iP" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, -/turf/open/floor/plasteel/showroomfloor, -/area/ruin/space/has_grav/skelter/comms) +/obj/structure/rack, +/obj/item/gun/ballistic/automatic/pistol, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/skelter/sec) "iQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/mineral/titanium, @@ -3934,17 +3920,15 @@ /turf/open/floor/plasteel/showroomfloor, /area/ruin/space/has_grav/skelter/comms) "iX" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/trimline/blue/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/ammo_casing/c45, +/obj/item/ammo_casing/c10mm, /turf/open/floor/plasteel/showroomfloor, /area/ruin/space/has_grav/skelter/comms) "iY" = ( @@ -4149,16 +4133,39 @@ /turf/open/floor/carpet, /area/ruin/space/has_grav/skelter/admin) "jv" = ( -/obj/structure/rack, -/obj/item/ammo_box/magazine/m45, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/skelter/sec) +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/gun/ballistic/automatic/pistol/no_mag, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/space/has_grav/skelter/comms) "jw" = ( /turf/open/space/basic, /area/space/nearstation) "jx" = ( /turf/open/space/basic, /area/template_noop) +"jy" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/ammo_casing/c10mm, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/space/has_grav/skelter/comms) (1,1,1) = {" ah @@ -4479,7 +4486,7 @@ eW cF fN gj -jv +hJ gl hw hU @@ -4539,7 +4546,7 @@ eX fx fN gj -gI +iP gl hx hx @@ -4657,7 +4664,7 @@ dI bI fc fA -fR +gI go gL iC @@ -4715,7 +4722,7 @@ bI bI bI eA -fd +fR fA fA fA @@ -4991,10 +4998,10 @@ ju gw dO hk -hJ +iX ij iF -iP +jv iW jh jl @@ -5025,7 +5032,7 @@ hK ii jm jn -iX +jy ii jl ah diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm index c95e0c7539..268c907445 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm @@ -17,10 +17,14 @@ /turf/open/floor/mineral/titanium, /area/ruin/powered) "ag" = ( -/obj/structure/shuttle/engine/propulsion/right{ - dir = 4 +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" }, -/turf/closed/wall/mineral/titanium, +/turf/open/floor/mineral/titanium, /area/ruin/powered) "ah" = ( /obj/structure/table/wood, @@ -70,20 +74,21 @@ /turf/open/floor/mineral/titanium, /area/ruin/powered) "ar" = ( -/obj/machinery/door/airlock/titanium{ - name = "Escape Pod Airlock" - }, -/turf/open/floor/mineral/titanium, +/turf/closed/wall/mineral/wood, /area/ruin/powered) "as" = ( /obj/machinery/light, /turf/open/floor/mineral/titanium, /area/ruin/powered) "at" = ( -/obj/structure/shuttle/engine/propulsion/left{ - dir = 4 +/obj/structure/extinguisher_cabinet{ + pixel_x = 5; + pixel_y = -32 }, -/turf/closed/wall/mineral/titanium, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium, /area/ruin/powered) "au" = ( /obj/item/seeds/tower, @@ -93,11 +98,15 @@ /area/ruin/powered) "av" = ( /obj/structure/table/wood, -/obj/item/paper/crumpled{ - info = "

So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.
Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..
Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.
Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.
Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.
Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?
The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders." +/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton, +/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton{ + pixel_x = -5; + pixel_y = 6 }, -/obj/item/pen, -/obj/item/stock_parts/cell/hyper, /turf/open/floor/plating/asteroid, /area/ruin/powered) "aw" = ( @@ -142,6 +151,17 @@ "aE" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/powered) +"aF" = ( +/obj/machinery/power/port_gen/pacman{ + active = 1; + anchored = 1; + sheets = 10 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) "aG" = ( /obj/structure/sink/puddle, /turf/open/floor/plating/asteroid, @@ -187,9 +207,7 @@ /turf/open/floor/plating/asteroid, /area/ruin/powered) "aQ" = ( -/obj/item/stack/ore/gold, -/obj/item/stack/ore/gold, -/obj/item/stack/ore/gold, +/obj/item/circuitboard/machine/circuit_imprinter, /turf/open/floor/plating/asteroid, /area/ruin/powered) "aR" = ( @@ -205,8 +223,12 @@ /turf/open/floor/plating/asteroid, /area/ruin/powered) "aU" = ( -/obj/item/flashlight/lamp, /obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/meat/slab/human{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/snacks/meat/slab/human, /turf/open/floor/plating/asteroid, /area/ruin/powered) "aV" = ( @@ -238,20 +260,24 @@ /turf/closed/mineral/random/no_caves/earth_like, /area/ruin/powered) "bc" = ( -/obj/item/circuitboard/machine/circuit_imprinter, +/obj/structure/table/wood, +/obj/item/vending_refill/snack, /turf/open/floor/plating/asteroid, /area/ruin/powered) "bd" = ( -/obj/item/grown/bananapeel, -/turf/open/floor/plating/asteroid, +/obj/structure/shuttle/engine/propulsion/right{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium, /area/ruin/powered) "be" = ( -/obj/effect/mob_spawn/human/corpse/cargo_tech, -/obj/structure/fans/tiny/invisible, +/obj/structure/chair/wood/normal{ + dir = 1 + }, /turf/open/floor/plating/asteroid, /area/ruin/powered) "bf" = ( -/obj/item/clothing/glasses/meson, +/obj/machinery/door/airlock/wood, /turf/open/floor/plating/asteroid, /area/ruin/powered) "bg" = ( @@ -275,50 +301,43 @@ /turf/open/floor/plating/asteroid, /area/ruin/powered) "bl" = ( -/obj/machinery/power/floodlight, -/obj/structure/cable{ - icon_state = "0-2" +/obj/machinery/door/airlock/titanium{ + name = "Escape Pod Airlock" }, -/turf/open/floor/plating/asteroid, +/turf/open/floor/mineral/titanium, /area/ruin/powered) "bm" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, +/obj/item/flashlight/lamp, +/obj/structure/table/wood, /turf/open/floor/plating/asteroid, /area/ruin/powered) "bn" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/structure/table/wood, +/obj/item/paper/crumpled{ + info = "

So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.
Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..
Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.
Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.
Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.
Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?
The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders." }, +/obj/item/pen, +/obj/item/stock_parts/cell/hyper, /turf/open/floor/plating/asteroid, /area/ruin/powered) "bo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, +/obj/item/grown/bananapeel, /turf/open/floor/plating/asteroid, /area/ruin/powered) "bp" = ( -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, +/obj/effect/mob_spawn/human/corpse/cargo_tech, +/obj/structure/fans/tiny/invisible, /turf/open/floor/plating/asteroid, /area/ruin/powered) "bq" = ( -/obj/structure/cable, -/obj/machinery/power/port_gen/pacman{ - active = 1; - anchored = 1; - sheets = 10 - }, +/obj/item/clothing/glasses/meson, /turf/open/floor/plating/asteroid, /area/ruin/powered) "br" = ( -/obj/item/stack/ore/iron, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/turf/open/floor/plating/asteroid, +/obj/effect/decal/cleanable/oil{ + icon_state = "floor5" + }, +/turf/open/floor/mineral/titanium, /area/ruin/powered) "bs" = ( /obj/item/flashlight/lamp/bananalamp, @@ -328,18 +347,181 @@ /obj/item/pickaxe/titanium, /turf/open/floor/plating/asteroid, /area/ruin/powered) +"fc" = ( +/obj/item/stack/ore/iron, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) "fp" = ( /turf/closed/mineral/random/high_chance/earth_like, /area/ruin/powered) "jx" = ( /turf/closed/mineral/silver/earth_like, /area/ruin/powered) +"ma" = ( +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"mr" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/mob_spawn/human/skeleton, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) "nc" = ( /turf/closed/mineral/bscrystal/earth_like, /area/ruin/powered) +"nl" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) +"oR" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"wU" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) +"zs" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) +"CY" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) +"DH" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) +"Ft" = ( +/obj/structure/reagent_dispensers/fueltank/high, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) +"HK" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"HP" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) +"Iy" = ( +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/structure/closet/crate/internals, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) "JZ" = ( /turf/closed/mineral/titanium/earth_like, /area/ruin/powered) +"Kj" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) "Lt" = ( /obj/structure/mirror, /turf/closed/wall/mineral/iron, @@ -347,6 +529,19 @@ "PG" = ( /turf/closed/mineral/gold/earth_like, /area/ruin/powered) +"Qi" = ( +/obj/structure/cable, +/obj/machinery/power/port_gen/pacman{ + active = 1; + anchored = 1; + sheets = 10 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"Sv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium, +/area/ruin/powered) "Ue" = ( /turf/closed/mineral/diamond/earth_like, /area/ruin/powered) @@ -358,6 +553,24 @@ /obj/item/circuitboard/machine/ore_redemption, /turf/open/floor/plating/asteroid, /area/ruin/powered) +"WP" = ( +/obj/item/stack/ore/gold, +/obj/item/stack/ore/gold, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"Xh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"XQ" = ( +/obj/structure/shuttle/engine/propulsion/left{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium, +/area/ruin/powered) (1,1,1) = {" aa @@ -1123,9 +1336,9 @@ bb bb af ak -ao -ao -ao +DH +an +mr ak af am @@ -1175,9 +1388,9 @@ bb aR ae ae -an -an -an +af +bl +af ae ae am @@ -1225,13 +1438,13 @@ ba ba bb aR +ae ag -ag -af -ar -af -at +nl +an +HP at +ae am bb fp @@ -1277,13 +1490,13 @@ aL bb bb aT -am -am -am -am -am -am -am +bl +br +an +an +an +an +bl aR bb bb @@ -1329,13 +1542,13 @@ am ba bb am -am -am -am -am -am -am -am +af +Ft +zs +Sv +CY +wU +af bg bb fp @@ -1381,13 +1594,13 @@ am ba bb bb -am -am -am -am -am -am -am +ae +Iy +aF +br +CY +CY +ae bb bb bb @@ -1432,14 +1645,14 @@ am bb bb bb -aU +am bd -am -am +bd +af bl -bm -am -am +af +XQ +XQ bb bb bb @@ -1484,15 +1697,15 @@ am bb bb ba -av -be am am am -bn -bo -bo -bq +am +am +am +am +am +am bb bb bb @@ -1525,10 +1738,10 @@ bb bb bb bb -ba -am -am -am +ar +ar +ar +ar am am am @@ -1536,15 +1749,15 @@ am bb bb bb -bc -bf am am am am am am -br +am +am +am bb bb bb @@ -1577,10 +1790,10 @@ bb bb bb bb -bb -bb -bb -bb +ar +av +am +ar am am am @@ -1629,10 +1842,10 @@ bb fp bb bb -bb -bb -bb -bb +ar +aU +be +bf am am am @@ -1645,8 +1858,8 @@ am am aR am -am -am +Kj +HK am bb bb @@ -1681,11 +1894,11 @@ bb bb bb bb -bb -bb -bb -bb -ba +ar +bc +am +ar +am am am am @@ -1698,10 +1911,10 @@ am am am am -am -am -am -am +oR +Xh +Xh +Qi ba ba ba @@ -1733,16 +1946,18 @@ bb bb bb bb -bb -bb -bb -bb +ar +ar +ar +ar ba ba ba aK ba ba +bm +bo am am am @@ -1750,9 +1965,7 @@ am am am am -bp -am -am +fc aR ba ba @@ -1795,16 +2008,16 @@ fp ba fp ba +bn +bp +am +am +am +am +am aP am am -am -am -am -am -am -am -am aR ba ba @@ -1848,14 +2061,14 @@ ba ba ba aQ -aP +bq am am aR am am -am -am +WP +aP bb am ba @@ -2009,7 +2222,7 @@ bg am am am -am +ma am aS bb diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 3e5c80253d..6e0c65f6aa 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -1453,7 +1453,7 @@ /area/ruin/space/has_grav/hotel/guestroom/room_2) "eu" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "ev" = ( diff --git a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm index 5bc10b30f0..69cf7c0867 100644 --- a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm +++ b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm @@ -153,10 +153,6 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"cX" = ( -/obj/structure/closet/secure_closet/miner, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "dk" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -398,6 +394,13 @@ }, /turf/open/floor/plating, /area/mine/laborcamp/security) +"he" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "hf" = ( /obj/item/kirbyplants/random, /turf/open/floor/plasteel, @@ -417,16 +420,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"hH" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "hP" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ @@ -503,6 +496,14 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"ja" = ( +/obj/item/bikehorn{ + color = "#000"; + desc = "A horn off of a bicycle. This one has been charred to hell and back, yet somehow it still honks."; + name = "charred bike horn" + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "jf" = ( /obj/structure/table, /obj/item/storage/firstaid/regular, @@ -769,11 +770,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/mine/laborcamp/security) -"nH" = ( -/obj/machinery/light, -/obj/structure/closet/wardrobe/miner, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "nI" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -841,6 +837,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/mine/production) +"nS" = ( +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "nX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -1275,8 +1277,12 @@ /turf/open/floor/plasteel, /area/mine/production) "uG" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/box, +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/item/flashlight, /turf/open/floor/plasteel, /area/mine/living_quarters) "uI" = ( @@ -1439,6 +1445,15 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"wQ" = ( +/obj/structure/table, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/tank/internals/emergency_oxygen, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "wV" = ( /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors/explored) @@ -1536,6 +1551,18 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"yZ" = ( +/obj/docking_port/stationary{ + area_type = /area/lavaland/surface/outdoors; + dir = 8; + dwidth = 3; + height = 7; + id = "lavaland_common_away"; + name = "Lavaland Mining Public Wing"; + width = 7 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "zh" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -1644,6 +1671,13 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/production) +"AC" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "AH" = ( /obj/machinery/cryopod{ dir = 4 @@ -1719,6 +1753,12 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/mine/living_quarters) +"By" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "BD" = ( /obj/machinery/door/airlock/maintenance{ name = "Mining Station Maintenance"; @@ -1843,6 +1883,7 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "Dr" = ( +/obj/structure/chair, /obj/structure/extinguisher_cabinet{ pixel_x = -5; pixel_y = 30 @@ -1850,9 +1891,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, /turf/open/floor/plasteel, /area/mine/living_quarters) "Dv" = ( @@ -2695,17 +2733,12 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "Pp" = ( -/obj/machinery/camera{ - c_tag = "Public Shuttle Lobby"; - network = list("mine") - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 +/obj/structure/table, +/obj/item/gps/mining{ + pixel_x = 3; + pixel_y = 5 }, +/obj/item/gps/mining, /turf/open/floor/plasteel, /area/mine/living_quarters) "Pq" = ( @@ -2750,6 +2783,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/white, /area/mine/laborcamp) +"Qd" = ( +/obj/structure/displaycase, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "Qi" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -2825,9 +2862,13 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "Ru" = ( +/obj/structure/chair, /obj/machinery/newscaster{ pixel_y = 32 }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "Rv" = ( @@ -3019,13 +3060,13 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /mob/living/simple_animal/bot/secbot/beepsky{ desc = "Powered by the tears and sweat of laborers."; name = "Prison Ofitser" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "Un" = ( @@ -3129,7 +3170,9 @@ /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) "VY" = ( -/obj/structure/closet/emcloset, +/obj/structure/closet/emcloset{ + anchored = 1 + }, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -3241,10 +3284,6 @@ }, /turf/open/floor/plating, /area/mine/living_quarters) -"XX" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/closed/wall, -/area/mine/living_quarters) "Ya" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp) @@ -4211,9 +4250,9 @@ VT VT VT VT -VT -VT -VT +Lm +Lm +Lm VT VT VT @@ -4266,12 +4305,12 @@ VT VT VT VT -VT -VT -VT -VT -VT -VT +Lm +Lm +Lm +Lm +Lm +Lm VT VT VT @@ -4322,15 +4361,15 @@ VT VT VT VT -VT -VT -VT -VT -VT -VT -VT -VT -VT +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm VT VT VT @@ -4379,16 +4418,16 @@ VT VT VT VT -VT -VT -VT -VT Lm Lm -VT -VT Lm -VT +Lm +Lm +Lm +Lm +Lm +Lm +Lm VT VT VT @@ -4435,17 +4474,17 @@ wz wz VT VT -VT -VT Lm -VT -VT -VT Lm -VT -VT -VT -VT +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm Lm VT VT @@ -4492,18 +4531,18 @@ wz wz Lm VT -VT -VT Lm Lm Lm Lm Lm -VT -VT -VT -VT -VT +Lm +Lm +Lm +Lm +Lm +Lm +Lm VT VT VT @@ -4549,7 +4588,6 @@ VT wz Lm VT -VT Lm Lm Lm @@ -4558,8 +4596,9 @@ Lm Lm Lm Lm -VT -VT +Lm +Lm +Lm VT VT VT @@ -4615,7 +4654,7 @@ Lm Lm Lm Lm -VT +Lm VT VT VT @@ -4662,11 +4701,11 @@ VT VT VT VT -VT Lm Lm -VT -VT +Lm +Lm +Lm Lm Lm Lm @@ -4722,10 +4761,10 @@ wz Lm Lm Lm -VT Lm Lm Lm +yZ Lm Lm Lm @@ -4772,18 +4811,18 @@ Gt Dv my VT +ja VT VT -VT +wz wz Lm Lm Lm -VT -Lm -Lm -Lm Lm +KV +he +KV Lm Lm Lm @@ -4833,14 +4872,14 @@ VT VT Lm Lm +wz +wz Lm Lm Lm -Lm -Lm -Lm -Lm -Lm +KV +Ag +KV Lm Lm VT @@ -4893,11 +4932,11 @@ Lm VN VN VN -XX -VN -VN -VN +KV VN +KV +AC +KV VT VT VT @@ -4949,12 +4988,12 @@ pu bn VN zy -Ag -Ag -Ag +By +nS +By Ag qZ -VN +KV VT VT VT @@ -5010,8 +5049,8 @@ Ag Ag Ag Ag -cX -VN +Ag +KV VT VT VT @@ -5067,8 +5106,8 @@ Ag uG uG Ag -cX -VN +eS +KV VT VT VT @@ -5124,8 +5163,8 @@ KO uG uG Ag -cX -VN +Ag +KV VT VT VT @@ -5181,7 +5220,7 @@ RP Ag Ag Ag -nH +oy VN VT VT @@ -5235,10 +5274,10 @@ oy VN Pp sx -eS -Ag -Ag -hH +Pp +wQ +Qd +Qd VN wz Lm diff --git a/_maps/RandomZLevels/away_mission/Academy.dmm b/_maps/RandomZLevels/away_mission/Academy.dmm index 37b0098fd2..9b61f50600 100644 --- a/_maps/RandomZLevels/away_mission/Academy.dmm +++ b/_maps/RandomZLevels/away_mission/Academy.dmm @@ -2710,7 +2710,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 4 diff --git a/_maps/RandomZLevels/away_mission/SnowCabin.dmm b/_maps/RandomZLevels/away_mission/SnowCabin.dmm index 844a134d27..dda382c4b7 100644 --- a/_maps/RandomZLevels/away_mission/SnowCabin.dmm +++ b/_maps/RandomZLevels/away_mission/SnowCabin.dmm @@ -312,7 +312,7 @@ /obj/structure/janitorialcart, /obj/item/mop, /obj/item/reagent_containers/glass/bucket, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/cabin) @@ -881,7 +881,7 @@ /turf/open/floor/plating, /area/awaymission/cabin) "cT" = ( -/obj/vehicle/ridden/atv, +/obj/vehicle/ridden/atv/snowmobile, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -893,7 +893,7 @@ /turf/open/floor/plating, /area/awaymission/cabin) "cV" = ( -/obj/vehicle/ridden/atv, +/obj/vehicle/ridden/atv/snowmobile, /turf/open/floor/plating, /area/awaymission/cabin) "cW" = ( diff --git a/_maps/RandomZLevels/away_mission/jungleresort.dmm b/_maps/RandomZLevels/away_mission/jungleresort.dmm new file mode 100644 index 0000000000..4afe638edb --- /dev/null +++ b/_maps/RandomZLevels/away_mission/jungleresort.dmm @@ -0,0 +1,26669 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ab" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"af" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/toy/plush/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"ai" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/closet/crate/secure/loot, +/obj/item/clothing/head/sombrero/shamebrero, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"ak" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"an" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"ap" = ( +/obj/structure/stone_tile/surrounding/burnt, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"ar" = ( +/obj/structure/flora/ausbushes/fullgrass, +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"as" = ( +/obj/structure/flora/junglebush/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"at" = ( +/obj/machinery/jukebox, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"az" = ( +/obj/structure/stone_tile/center, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"aA" = ( +/obj/machinery/light, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"aB" = ( +/obj/structure/flora/junglebush/large, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"aG" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/rock, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"aI" = ( +/obj/structure/flora/tree/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"aL" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"aP" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"aY" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"bf" = ( +/obj/structure/sign/barsign, +/turf/closed/wall/mineral/wood, +/area/awaymission/jungleresort) +"bg" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"bn" = ( +/obj/structure/flora/tree/jungle/small, +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"bp" = ( +/obj/structure/flora/tree/jungle, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"br" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/rock/pile/largejungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"bv" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"bw" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"by" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"bG" = ( +/turf/closed/indestructible/riveted, +/area/awaymission/jungleresort) +"bW" = ( +/obj/structure/table/wood, +/obj/machinery/button/door{ + id = "ResortCabin2"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/item/poster/random_official, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"bZ" = ( +/obj/structure/table/wood, +/obj/item/storage/box/donkpockets, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"cg" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/kitchen/knife, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"cn" = ( +/obj/structure/flora/junglebush/c, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"cw" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"cA" = ( +/obj/structure/flora/junglebush/b, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"cD" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"cH" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"cJ" = ( +/obj/structure/flora/junglebush/c, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"cK" = ( +/obj/structure/closet/crate, +/obj/item/clothing/head/collectable/petehat/gang, +/turf/open/floor/plating/rust, +/area/awaymission/jungleresort) +"cT" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/jungleresort) +"cV" = ( +/obj/structure/flora/junglebush/c, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"cX" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"cY" = ( +/obj/structure/flora/grass/jungle/b, +/mob/living/simple_animal/hostile/gorilla/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"dm" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/beer, +/obj/item/clothing/head/hardhat/cakehat, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"dn" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"dt" = ( +/obj/structure/table/wood, +/mob/living/carbon/monkey/punpun/curiousgorge, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"du" = ( +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"dC" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"dF" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"dW" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"dY" = ( +/obj/structure/flora/junglebush/large, +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ef" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/awaymission/jungleresort) +"ez" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"eB" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"eC" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"eD" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/machinery/button/door{ + id = "AbandonedCabinDorm"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/turf/open/floor/carpet/red, +/area/awaymission/jungleresort) +"eI" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/jungleresort) +"eJ" = ( +/obj/structure/flora/junglebush, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"eK" = ( +/obj/machinery/washing_machine, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"eN" = ( +/obj/item/clothing/suit/hooded/wintercoat/bar, +/obj/structure/table/wood, +/obj/item/clothing/head/that, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"eR" = ( +/obj/structure/bed, +/obj/item/bedsheet/captain, +/obj/machinery/button/door{ + id = "ResortManagerDorm"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"eT" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"fh" = ( +/obj/structure/table/wood, +/obj/machinery/button/door{ + id = "ResortCabin3"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 + }, +/obj/item/storage/wallet/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"fm" = ( +/obj/structure/reagent_dispensers/keg/mead, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"fy" = ( +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"fz" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"fH" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"fW" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"fX" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"gj" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"go" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"gv" = ( +/obj/structure/table/wood, +/obj/item/book/manual/chef_recipes, +/obj/item/toy/figure/chef, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"gC" = ( +/obj/item/clothing/head/rice_hat/cursed, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"gK" = ( +/obj/structure/table/wood, +/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted, +/obj/item/ammo_box/magazine/toy/smgm45, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"gL" = ( +/obj/structure/table/wood, +/obj/item/export/bottle/minikeg, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"gN" = ( +/obj/structure/table/wood/fancy, +/obj/item/candle/infinite, +/obj/item/toy/figure/chaplain, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"gU" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"gV" = ( +/obj/structure/table/wood, +/obj/machinery/button/door{ + id = "ResortCabin1"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/item/lipstick/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"gZ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/color/jumpskirt/random, +/obj/item/clothing/under/color/random, +/obj/item/clothing/under/color/random, +/obj/item/clothing/under/color/jumpskirt/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"hj" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"hk" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"hl" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"hp" = ( +/obj/structure/flora/tree/jungle/small, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ht" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"hv" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"hw" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"hy" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"hC" = ( +/obj/structure/flora/rock, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"hH" = ( +/obj/structure/flora/rock/jungle, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"hN" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"hU" = ( +/obj/structure/curtain, +/obj/machinery/shower, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"hX" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"ia" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ie" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ih" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"ii" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/carneburrito, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"im" = ( +/obj/machinery/computer/security/wooden_tv, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"io" = ( +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"is" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/rock/pile, +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"iv" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"iE" = ( +/obj/structure/closet/secure_closet/bar, +/obj/item/clothing/glasses/sunglasses/reagent, +/obj/item/clothing/under/rank/civilian/bartender/skirt, +/obj/item/clothing/accessory/waistcoat, +/obj/item/clothing/under/rank/civilian/bartender, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"iG" = ( +/obj/structure/flora/junglebush/large, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"iH" = ( +/obj/machinery/gibber, +/obj/machinery/light/small, +/turf/open/floor/plasteel/freezer, +/area/awaymission/jungleresort) +"iL" = ( +/obj/structure/bed, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/bedsheet/syndie, +/turf/open/floor/carpet/red, +/area/awaymission/jungleresort) +"iR" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"iU" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"iZ" = ( +/obj/item/storage/toolbox/artistic, +/obj/structure/table/wood/fancy, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"jb" = ( +/obj/structure/flora/rock/pile, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jh" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jj" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"js" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jw" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"jy" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jB" = ( +/obj/structure/flora/junglebush/large, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jD" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"jF" = ( +/obj/structure/flora/tree/jungle, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jH" = ( +/obj/structure/flora/junglebush/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jJ" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jL" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"jO" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"jQ" = ( +/obj/structure/flora/junglebush/c, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"kf" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/junglebush/c, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"kn" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"kq" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck/syndicate, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"kr" = ( +/obj/structure/flora/junglebush/large, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"kw" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"kz" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"kB" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"kI" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"kJ" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"kQ" = ( +/obj/machinery/processor, +/turf/open/floor/plasteel/freezer, +/area/awaymission/jungleresort) +"kW" = ( +/turf/closed/wall/rust, +/area/awaymission/jungleresort) +"le" = ( +/obj/structure/chair/sofa/corner, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"lf" = ( +/obj/structure/flora/rock/pile, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ll" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"lr" = ( +/obj/structure/flora/junglebush/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"lB" = ( +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"lF" = ( +/obj/structure/flora/junglebush, +/mob/living/simple_animal/hostile/gorilla/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"lJ" = ( +/obj/structure/flora/junglebush/c, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"lS" = ( +/obj/structure/toilet/secret/low_loot{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"lV" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ResortManagerDorm"; + name = "Resort Manager's Dorm" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"mg" = ( +/obj/machinery/door/airlock/engineering{ + name = "Resort Power" + }, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"mh" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"mk" = ( +/obj/structure/flora/junglebush/c, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ml" = ( +/obj/structure/table/wood, +/obj/item/toy/figure/captain, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"mt" = ( +/obj/structure/flora/junglebush, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"mu" = ( +/obj/machinery/door/window{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"my" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/lightreplacer, +/obj/item/storage/box/lights/mixed, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/item/clothing/glasses/meson/engine, +/obj/item/storage/belt/utility, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"mE" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"mY" = ( +/obj/structure/flora/rock, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"mZ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ne" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"nm" = ( +/obj/structure/flora/junglebush/c, +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"no" = ( +/obj/item/chair, +/obj/item/reagent_containers/food/drinks/beer, +/obj/machinery/light/floor, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"np" = ( +/obj/structure/flora/junglebush/c, +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"nq" = ( +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/jungleresort) +"nt" = ( +/obj/structure/flora/rock/jungle, +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/junglebush/c, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"nv" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"nw" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"nD" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"nJ" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"nU" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"od" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"og" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"oj" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"op" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/jungleresort) +"ot" = ( +/obj/structure/table/wood, +/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/nineteenXnineteen, +/obj/item/toy/crayon/spraycan, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"ou" = ( +/obj/item/clothing/glasses/meson, +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) +"ow" = ( +/obj/structure/flora/tree/jungle, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"oW" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/head/collectable/tophat, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"oX" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"oZ" = ( +/turf/closed/indestructible/riveted/boss, +/area/awaymission/jungleresort) +"pm" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"pn" = ( +/obj/structure/toilet/secret/low_loot, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"po" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"px" = ( +/obj/machinery/light, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"pC" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/rock/pile, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"pK" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/rock, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"pN" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"pP" = ( +/obj/structure/sign/warning, +/turf/closed/mineral/random/labormineral/jungle, +/area/awaymission/jungleresort) +"pQ" = ( +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"pT" = ( +/obj/structure/table, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/jungleresort) +"pU" = ( +/obj/structure/flora/junglebush/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"qa" = ( +/turf/open/floor/plating/rust, +/area/awaymission/jungleresort) +"qg" = ( +/turf/closed/wall/mineral/titanium, +/area/awaymission/jungleresort) +"qi" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/closet/crate/secure/loot, +/obj/item/clothing/head/rice_hat/cursed, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"qr" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"qs" = ( +/obj/item/storage/toolbox/syndicate, +/obj/structure/table/wood/fancy, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"qz" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"qC" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"qG" = ( +/obj/item/storage/toolbox/emergency, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/table/wood/fancy, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"rd" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"rg" = ( +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"rm" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"ro" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"rt" = ( +/obj/structure/chair/sofa/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"rv" = ( +/obj/item/statuebust, +/obj/structure/table/wood/fancy, +/turf/open/floor/plasteel/dark, +/area/awaymission/jungleresort) +"rx" = ( +/obj/structure/flora/junglebush, +/obj/structure/flora/junglebush/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"rF" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"rH" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"rP" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"rQ" = ( +/obj/structure/flora/tree/jungle/small, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"rS" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/beeplushie, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"rT" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"se" = ( +/obj/structure/flora/junglebush/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"sh" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"sn" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"so" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"sq" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"st" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"sD" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/baguette, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"sQ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"sR" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"sS" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigpack_robustgold, +/obj/item/clothing/mask/cigarette/robustgold, +/obj/item/lighter, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"td" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/junglebush/c, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ti" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"tm" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"tn" = ( +/obj/structure/flora/rock/pile, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"tu" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"tx" = ( +/obj/machinery/door/airlock/wood{ + name = "Resort Bar Backroom" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"tC" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/toxin, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"tH" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"tK" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"tS" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ResortCabin1"; + name = "Resort Cabin 1" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"tT" = ( +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"tZ" = ( +/obj/structure/flora/rock/pile, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uc" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ue" = ( +/obj/machinery/light, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uh" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"uj" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ResortCabin3"; + name = "Resort Cabin 3" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"ur" = ( +/obj/structure/flora/tree/jungle, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"us" = ( +/obj/structure/flora/rock, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uu" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uv" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"ux" = ( +/obj/item/stack/sheet/animalhide/monkey, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"uy" = ( +/obj/structure/chair/stool, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"uC" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uG" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"uO" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uS" = ( +/obj/structure/flora/rock/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uT" = ( +/obj/structure/table/wood, +/obj/item/folder/blue, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"uW" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uX" = ( +/obj/structure/flora/junglebush/large, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"uZ" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"vc" = ( +/obj/structure/flora/grass/jungle/b, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"vl" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"vq" = ( +/obj/structure/barricade/wooden, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"vs" = ( +/obj/structure/table/wood, +/obj/machinery/button/door{ + id = "ResortCabin4"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 + }, +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"vw" = ( +/obj/machinery/door/airlock/wood{ + name = "Abandoned Cabin" + }, +/obj/structure/barricade/wooden, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"vx" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"vy" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"vz" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"vK" = ( +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"vN" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"vZ" = ( +/obj/machinery/door/airlock/wood{ + name = "Resort Bar" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"wd" = ( +/obj/item/storage/bag/ore, +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) +"wj" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"wm" = ( +/obj/structure/flora/junglebush/c, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"wo" = ( +/obj/structure/table/wood/fancy, +/obj/item/storage/toolbox/gold_fake, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"wq" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"ws" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"wv" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"ww" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/hooded/wintercoat/captain/jungle, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"wF" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"wG" = ( +/obj/structure/flora/rock/jungle, +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"wH" = ( +/obj/structure/flora/junglebush/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"wJ" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"wS" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center/cracked, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"wV" = ( +/obj/structure/chair/wood, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"wZ" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"xr" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin/color, +/obj/item/toy/figure/assistant, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"xD" = ( +/obj/structure/flora/rock/pile, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"xH" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"xL" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"xQ" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/carpet/red, +/area/awaymission/jungleresort) +"xS" = ( +/obj/structure/chair/wood, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"xU" = ( +/obj/structure/flora/junglebush/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"xV" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"yb" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"yi" = ( +/obj/item/grown/log/tree, +/obj/item/lighter, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"yr" = ( +/obj/structure/statue/sandstone/venus, +/turf/open/floor/plasteel/dark, +/area/awaymission/jungleresort) +"yu" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"yw" = ( +/obj/item/pickaxe/mini, +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) +"yx" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"yy" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"yz" = ( +/obj/machinery/door/airlock/wood{ + name = "Resort Manager's Office" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"yC" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"yF" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"yJ" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"yK" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"yL" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"yM" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"yQ" = ( +/obj/effect/spawner/lootdrop/cig_packs, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"yS" = ( +/obj/machinery/door/window, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"yW" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/jungleresort) +"yX" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/salad/validsalad, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"yY" = ( +/obj/machinery/door/airlock/shuttle, +/turf/open/floor/mineral/titanium, +/area/awaymission/jungleresort) +"zl" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"zr" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"zx" = ( +/obj/structure/flora/junglebush/b, +/obj/structure/flora/rock, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"zA" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"zC" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"zH" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/jungleresort) +"zI" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"zK" = ( +/obj/structure/flora/rock/jungle, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"zP" = ( +/obj/structure/flora/tree/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"zV" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"zY" = ( +/obj/structure/flora/junglebush/c, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Aa" = ( +/obj/structure/flora/junglebush/c, +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ad" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Ag" = ( +/obj/machinery/door/airlock/wood{ + name = "Resort Office" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ah" = ( +/obj/structure/table/wood/poker, +/obj/item/dice/d6, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ak" = ( +/obj/structure/flora/junglebush/large, +/obj/structure/flora/rock/jungle, +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"An" = ( +/obj/effect/spawner/lootdrop/bedsheet, +/obj/structure/bed, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ar" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Az" = ( +/obj/structure/flora/junglebush/b, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"AC" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"AF" = ( +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"AR" = ( +/turf/closed/mineral/random/labormineral/jungle, +/area/awaymission/jungleresort) +"AS" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"AT" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"AU" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/structure/flora/rock, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"AV" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"Bh" = ( +/obj/machinery/light/floor, +/obj/structure/easel, +/obj/item/canvas/nineteenXnineteen, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Bn" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Bp" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Bq" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Br" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"BB" = ( +/obj/machinery/door/window, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"BM" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"BP" = ( +/obj/structure/dresser, +/turf/open/floor/carpet/red, +/area/awaymission/jungleresort) +"BQ" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"BY" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"BZ" = ( +/obj/structure/flora/junglebush/c, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Cc" = ( +/obj/item/mop, +/obj/structure/mopbucket, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"Co" = ( +/obj/structure/chair/wood/wings, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ct" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Cu" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Cv" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/port_gen/pacman/super, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"CA" = ( +/obj/structure/reagent_dispensers/watertank/high, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"CC" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"CH" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"CK" = ( +/obj/structure/flora/rock/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"CN" = ( +/obj/structure/flora/tree/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"CR" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"CT" = ( +/obj/item/storage/toolbox/greyscale, +/obj/structure/table/wood/fancy, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"CV" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"CY" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Db" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 6 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Di" = ( +/obj/item/storage/toolbox/drone, +/obj/structure/table/wood/fancy, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"Dj" = ( +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"Dr" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Du" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ResortCabin4"; + name = "Resort Cabin 4" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Dz" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/junglebush/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"DF" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"DL" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"DO" = ( +/obj/structure/flora/tree/jungle/small, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"DS" = ( +/obj/structure/flora/junglebush/large, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"DU" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/burger/plain, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ei" = ( +/obj/structure/table/wood, +/obj/machinery/door/window{ + dir = 8 + }, +/obj/item/paper/crumpled/awaymissions/jungleresort/notice, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"El" = ( +/obj/structure/flora/grass/jungle/b, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Eq" = ( +/obj/structure/frame/computer, +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/jungleresort) +"Et" = ( +/obj/structure/toilet/secret/low_loot{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Eu" = ( +/obj/structure/table/wood, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/toy/plush/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ex" = ( +/obj/structure/table/wood/fancy, +/obj/item/candle/infinite, +/turf/open/floor/plasteel/dark, +/area/awaymission/jungleresort) +"Ey" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"EA" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"EL" = ( +/obj/structure/table/wood, +/obj/item/storage/box/donkpockets, +/obj/item/storage/box/donkpockets, +/obj/item/camera, +/obj/item/camera_film, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"EO" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/jungleresort) +"EP" = ( +/obj/machinery/door/airlock/wood{ + name = "Resort Cafe" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"EQ" = ( +/obj/structure/flora/tree/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"EV" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Fd" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Fl" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Fq" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Fr" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Fz" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"FL" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"FN" = ( +/obj/structure/flora/tree/jungle, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"FO" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"FP" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"FQ" = ( +/obj/structure/flora/ausbushes/reedbush, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"FR" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"FT" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"FV" = ( +/obj/machinery/door/airlock/freezer{ + name = "Freezer" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"FX" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Gd" = ( +/obj/structure/chair/pew{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"Gk" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Gl" = ( +/obj/structure/sign/poster/random, +/turf/closed/wall/mineral/wood, +/area/awaymission/jungleresort) +"Gn" = ( +/obj/machinery/light, +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Gu" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Gv" = ( +/obj/structure/table/wood, +/obj/item/toy/figure/bartender, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Gz" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"GA" = ( +/obj/structure/flora/tree/jungle/small, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"GD" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"GN" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"GU" = ( +/obj/item/reagent_containers/food/snacks/sausage, +/obj/item/reagent_containers/food/snacks/sausage, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ha" = ( +/obj/structure/table/wood, +/obj/item/dualsaber/toy, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Hg" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"Hk" = ( +/obj/structure/flora/grass/jungle, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Hm" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Hr" = ( +/obj/structure/stone_tile/surrounding/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Hs" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Hw" = ( +/obj/machinery/door/airlock/wood{ + name = "Resort Arrivals" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Hy" = ( +/obj/structure/flora/rock/pile, +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"HC" = ( +/obj/structure/bonfire/dense, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"HD" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"HI" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ResortCabin2"; + name = "Resort Cabin 2" + }, +/obj/structure/barricade/wooden, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"HQ" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"HT" = ( +/mob/living/simple_animal/hostile/gorilla/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ih" = ( +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"Ii" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ij" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"Ir" = ( +/obj/effect/decal/cleanable/blood/gibs/human/down, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Iw" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/space_cash, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"IC" = ( +/obj/structure/flora/rock/pile, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"IF" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"IK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/barricade/wooden, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"IO" = ( +/obj/structure/barricade/wooden, +/obj/machinery/door/airlock/wood{ + id_tag = "ResortCabin5"; + name = "Resort Cabin 5" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"IR" = ( +/obj/structure/flora/junglebush/large, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"IW" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Jb" = ( +/obj/structure/flora/tree/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Jc" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Jd" = ( +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Jf" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Jh" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Jj" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Jo" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Jq" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Jt" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Jv" = ( +/obj/structure/filingcabinet, +/obj/structure/window/reinforced, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"Jz" = ( +/obj/effect/decal/cleanable/blood/splats, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"JF" = ( +/turf/open/floor/plasteel/dark, +/area/awaymission/jungleresort) +"JG" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/gibs/human/up, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"JK" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"JQ" = ( +/obj/item/toy/plush/carpplushie, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"JU" = ( +/obj/structure/stone_tile/slab/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"JZ" = ( +/obj/structure/flora/tree/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ka" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Kk" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"Kl" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ko" = ( +/turf/closed/wall/r_wall, +/area/awaymission/jungleresort) +"Kr" = ( +/obj/structure/flora/junglebush/b, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Kw" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"KC" = ( +/obj/machinery/telecomms/relay/preset/mining, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/circuit, +/area/awaymission/jungleresort) +"KJ" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"KM" = ( +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"KO" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"KR" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"KX" = ( +/obj/structure/flora/rock, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"KY" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"KZ" = ( +/obj/structure/flora/junglebush, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"La" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Ll" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Lp" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) +"Lr" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Lt" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Lu" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Lv" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"Ly" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"LE" = ( +/obj/structure/reagent_dispensers/keg/gargle, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"LK" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"LL" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes{ + charge = 1.5e+006; + input_level = 30000; + inputting = 0; + output_level = 7000 + }, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"LR" = ( +/mob/living/simple_animal/hostile/jungle/leaper/boss, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"LU" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"LW" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Mc" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"Mf" = ( +/obj/structure/flora/junglebush/large, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Mh" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle/applejack/empty, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Mp" = ( +/turf/closed/wall/mineral/wood, +/area/awaymission/jungleresort) +"Mx" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"MD" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"MF" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"MJ" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"MP" = ( +/turf/open/floor/plasteel/freezer, +/area/awaymission/jungleresort) +"MS" = ( +/obj/structure/flora/rock/pile, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"MW" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"MX" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"MY" = ( +/obj/structure/barricade/wooden, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"Nd" = ( +/obj/structure/flora/junglebush, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Nf" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Ni" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Nn" = ( +/obj/machinery/power/apc/auto_name/west, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"Nx" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/butteredtoast, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"NF" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"NU" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"Oe" = ( +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ol" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Or" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ou" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"Oz" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"OA" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"OB" = ( +/obj/item/storage/book/bible, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"ON" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/remains/human, +/obj/structure/stone_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"OU" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Pb" = ( +/obj/structure/flora/rock/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Pc" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"Pd" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Pg" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Pp" = ( +/obj/structure/flora/junglebush/c, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Pu" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Pv" = ( +/obj/structure/flora/junglebush/large, +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"PB" = ( +/obj/structure/flora/junglebush, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"PD" = ( +/obj/structure/flora/rock/jungle, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"PL" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"PM" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"PN" = ( +/turf/open/floor/mineral/titanium, +/area/awaymission/jungleresort) +"PP" = ( +/obj/structure/flora/rock, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"PS" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"PT" = ( +/obj/structure/flora/rock/pile, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"PW" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"PY" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Qa" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/effect/decal/cleanable/blood/gibs/torso, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Qc" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/floor/plasteel/freezer, +/area/awaymission/jungleresort) +"Qp" = ( +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) +"Qr" = ( +/obj/structure/chair/sofa{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Qt" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"Qz" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"QA" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"QB" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"QC" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"QE" = ( +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"QI" = ( +/obj/machinery/nuclearbomb/beer, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"QO" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"QX" = ( +/obj/structure/flora/junglebush, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Rd" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/storage/toolbox/electrical, +/obj/item/wrench, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/clothing/glasses/meson/engine, +/obj/item/storage/belt/utility, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"Rm" = ( +/obj/structure/flora/tree/jungle/small, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Rn" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/item/folder, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"Ro" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Rp" = ( +/obj/structure/flora/ausbushes/reedbush, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"RD" = ( +/obj/structure/flora/junglebush/c, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"RI" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/food/condiment/saltshaker, +/obj/item/reagent_containers/food/condiment/peppermill, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"RP" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/gibs/torso, +/obj/item/clothing/suit/curator, +/obj/item/clothing/under/rank/civilian/curator/treasure_hunter, +/obj/item/clothing/head/fedora/curator, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/melee/chainofcommand/jungle, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"RW" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"RX" = ( +/obj/structure/flora/junglebush/c, +/obj/structure/flora/rock/pile, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Sc" = ( +/obj/structure/flora/rock, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Se" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Sh" = ( +/obj/structure/flora/junglebush/large, +/obj/structure/flora/junglebush/c, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Si" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/structure/stone_tile/surrounding/burnt, +/obj/effect/decal/remains/human, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Sk" = ( +/obj/machinery/door/airlock/wood{ + name = "Resort Kitchen" + }, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Ss" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"St" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"SD" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"SF" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"SL" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"SO" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/stone_tile/surrounding/cracked, +/obj/item/clothing/suit/armor/vest, +/obj/item/clothing/head/helmet, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"SV" = ( +/obj/machinery/vending/wardrobe/bar_wardrobe, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"SW" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"SZ" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Ta" = ( +/obj/machinery/shower, +/obj/structure/curtain, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Tm" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/lootdrop/space_cash, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Tv" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Tw" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Tx" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ty" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"TC" = ( +/obj/machinery/deepfryer, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"TD" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"TG" = ( +/obj/structure/flora/rock/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"TI" = ( +/obj/structure/barricade/wooden, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"TM" = ( +/obj/structure/table/wood/fancy, +/obj/item/candle/infinite, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"TR" = ( +/obj/structure/table/wood, +/obj/item/storage/box/donkpockets, +/obj/item/storage/box/donkpockets, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"TT" = ( +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"TU" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) +"TX" = ( +/obj/structure/table/wood, +/obj/machinery/button/door{ + id = "ResortCabin5"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 + }, +/obj/item/poster/random_contraband, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Uc" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ud" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Ue" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Uo" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/innards, +/obj/structure/stone_tile/surrounding/cracked, +/obj/item/fireaxe, +/obj/item/clothing/head/hardhat/red, +/obj/item/clothing/shoes/workboots, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Us" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Uv" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"UB" = ( +/obj/structure/flora/junglebush, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"UH" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Vb" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Ve" = ( +/obj/structure/table/wood, +/obj/machinery/door/window{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"Vg" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Vh" = ( +/obj/item/storage/toolbox/electrical, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/table/wood/fancy, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"Vm" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"VI" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "AbandonedCabinDorm"; + name = "Abandoned Cabin Dorm" + }, +/turf/open/floor/carpet/red, +/area/awaymission/jungleresort) +"VJ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"VK" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/stamp, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"VL" = ( +/obj/structure/rack, +/obj/item/storage/backpack/satchel/explorer, +/obj/item/gps/mining, +/obj/item/radio, +/obj/item/flashlight, +/obj/item/flashlight/flare, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"VP" = ( +/obj/structure/flora/junglebush/b, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"VU" = ( +/obj/structure/flora/rock/pile/largejungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Wa" = ( +/obj/structure/flora/junglebush/c, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Wd" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"Wh" = ( +/obj/structure/flora/junglebush/large, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Wi" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Wj" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Wl" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Wo" = ( +/obj/structure/flora/tree/jungle/small, +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"WD" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/head/collectable/beret, +/turf/open/floor/plating/rust, +/area/awaymission/jungleresort) +"WE" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"WQ" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/gibs/torso, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"WU" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Xa" = ( +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Xd" = ( +/obj/structure/flora/grass/jungle, +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Xh" = ( +/obj/structure/flora/rock/jungle, +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Xj" = ( +/turf/closed/wall, +/area/awaymission/jungleresort) +"Xm" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"Xo" = ( +/obj/structure/flora/junglebush/c, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"Xq" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/circuit, +/area/awaymission/jungleresort) +"Xs" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Xu" = ( +/obj/structure/flora/junglebush/c, +/mob/living/simple_animal/hostile/gorilla/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Xz" = ( +/turf/open/floor/carpet/red, +/area/awaymission/jungleresort) +"XB" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"XC" = ( +/obj/item/grown/log/tree, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"XK" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"XM" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/salad/jungle, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"XR" = ( +/obj/structure/flora/tree/jungle/small, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"XV" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/curtain, +/turf/open/floor/wood, +/area/awaymission/jungleresort) +"XY" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/item/toy/figure/ian, +/turf/open/floor/carpet/blue, +/area/awaymission/jungleresort) +"XZ" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/power/port_gen/pacman/super, +/turf/open/floor/plating, +/area/awaymission/jungleresort) +"Yb" = ( +/obj/structure/bonfire/dense, +/obj/item/melee/roastingstick, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Yd" = ( +/obj/item/storage/box/marshmallow, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Ye" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/toy/figure/syndie, +/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted, +/turf/open/floor/carpet/red, +/area/awaymission/jungleresort) +"Yf" = ( +/obj/structure/flora/junglebush/c, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Yg" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Yh" = ( +/obj/item/clothing/under/color/grey/glorf, +/obj/item/clothing/gloves/color/fyellow/old, +/obj/item/clothing/shoes/sneakers/black, +/obj/item/clothing/mask/gas, +/obj/item/clothing/head/soft/grey, +/obj/effect/decal/remains/human, +/turf/open/floor/carpet, +/area/awaymission/jungleresort) +"Ym" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/rock/pile, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"Yp" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Yt" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plasteel/freezer, +/area/awaymission/jungleresort) +"YE" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"YF" = ( +/obj/machinery/gateway/away, +/turf/open/floor/plating/dirt/dark/jungle, +/area/awaymission/jungleresort) +"YJ" = ( +/obj/structure/flora/rock/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"YK" = ( +/obj/machinery/light/floor, +/turf/open/water/jungle, +/area/awaymission/jungleresort) +"YM" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"YP" = ( +/obj/structure/flora/rock/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"YQ" = ( +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"YU" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/jungleresort) +"YW" = ( +/obj/effect/decal/cleanable/blood/gibs/human/core, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"Zn" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/cleanable/blood/gibs/human/core, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"ZE" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"ZH" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) +"ZV" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/grass, +/area/awaymission/jungleresort) + +(1,1,1) = {" +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +"} +(2,1,1) = {" +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +"} +(3,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(4,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(5,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(6,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(7,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(8,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(9,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +oZ +AR +oZ +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(10,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +bv +Ue +tT +oZ +oZ +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(11,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +oZ +oZ +tT +RP +BQ +aL +tT +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(12,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +aL +JU +Gk +DF +SL +po +Jz +JU +oZ +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(13,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +tT +Si +rg +uG +dF +an +hX +ih +aL +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(14,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +aL +tT +po +VJ +LR +FR +Lt +tT +tT +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(15,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +Lr +JU +Yg +jO +Lv +hj +tT +Nf +aL +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +rd +vK +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Pg +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(16,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +oZ +Uo +ZE +ZH +Fl +aL +ez +SO +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Pg +YQ +YQ +ZV +YQ +wH +AR +AR +AR +AR +AR +YQ +YQ +wH +rd +cn +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(17,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +oZ +tT +ap +YW +Db +Ly +oZ +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +CN +cn +YQ +rF +Pg +YQ +rd +YQ +YQ +YQ +CN +YQ +YQ +kr +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(18,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +jD +aL +fy +Dr +JU +oZ +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +YQ +YQ +YQ +vl +YQ +AF +YQ +vK +YQ +YQ +rd +aP +mY +YQ +ZV +Pg +AF +YQ +YQ +Pg +rd +ZV +vK +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +AF +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(19,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +Gk +AC +GD +oZ +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +CN +rF +aP +YQ +YQ +CN +YQ +YQ +aP +CN +YQ +YQ +AF +YQ +YQ +YQ +MW +br +YQ +YQ +YQ +YQ +CN +YQ +cn +YQ +YQ +YQ +CN +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +rd +YQ +YQ +YQ +CN +YQ +kr +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(20,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +iv +Qz +tm +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +Wl +YQ +YQ +YQ +Pg +ZV +YQ +cV +Pg +YQ +YQ +YM +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YQ +YQ +MW +aP +YQ +YQ +YQ +AF +YQ +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +wH +YQ +rd +YQ +YQ +YM +YQ +YQ +YQ +rd +ZV +YQ +rd +MW +Pg +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(21,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +wS +SZ +Hr +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rd +AF +YQ +YQ +YQ +CN +rd +AF +YQ +YQ +YQ +YQ +wH +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Wl +cn +YQ +YQ +YM +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +Pg +YQ +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +wH +YQ +AF +ZV +cn +YQ +YQ +YQ +CN +YQ +AF +aP +ZV +rF +Pv +wH +YQ +YQ +YQ +CN +YQ +aP +Wl +YQ +rd +YQ +AF +YQ +YQ +YQ +Pg +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(22,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +aL +yJ +TD +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Pg +wH +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +Wl +Pg +AF +YQ +YQ +YQ +CN +YQ +aP +YQ +YQ +Pg +Wl +YQ +YQ +ZV +aP +vK +VU +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +vK +wH +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +rd +MW +aP +YM +YQ +XK +YQ +rd +MW +YQ +YQ +Pg +YQ +YQ +YQ +CN +YQ +cn +YQ +YQ +YQ +YQ +vK +YQ +mY +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +ZV +cn +YQ +YQ +vK +AF +ZV +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(23,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +Yp +az +ON +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YM +cn +YQ +YQ +YM +aG +YQ +YQ +MW +rF +YQ +YQ +YQ +aP +rd +cn +YQ +YQ +wH +YQ +rd +YQ +YQ +YQ +CN +YQ +HT +rd +YQ +YQ +YQ +YQ +rd +YQ +MW +YQ +YQ +ZV +ZV +YQ +YM +AF +YQ +aP +YQ +AR +AR +AR +AR +AR +AR +AR +rd +Pg +cn +YQ +YQ +YM +YQ +YQ +YQ +YQ +YQ +CN +YQ +Pg +ZV +rd +kr +YQ +YQ +rd +Pg +YQ +YQ +KJ +Pg +Xh +YQ +YQ +CN +AF +YQ +YQ +YQ +wH +YQ +YQ +YQ +YQ +rd +YQ +aP +YQ +Pg +YQ +YQ +cn +YQ +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(24,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +TD +Ad +jw +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +aP +Wl +rd +aP +Pg +YQ +YQ +Wl +YQ +rd +YQ +rd +YQ +YQ +YQ +YQ +YM +KM +Pg +ZV +AF +YQ +YQ +rd +YQ +YQ +YM +YQ +YQ +YQ +CN +cn +YQ +YQ +YQ +CN +Wl +rd +wH +YQ +MW +YQ +YQ +YQ +YM +ZV +cn +rd +aP +YQ +wH +AF +YQ +YQ +kr +aP +YQ +YQ +Wl +wH +YQ +YQ +YQ +YQ +YQ +CN +ar +YQ +cn +wH +YQ +YQ +YQ +AF +YQ +YQ +rd +YQ +YQ +Dz +ZV +YQ +rd +YQ +cn +Wl +Pg +YQ +kr +YQ +YQ +wH +YQ +YQ +YQ +YQ +CN +YQ +wH +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(25,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +aL +Xs +oZ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rd +YQ +YQ +YQ +CN +kr +YQ +YQ +YQ +CN +YQ +YQ +KJ +YQ +YQ +YQ +CN +Pg +aP +YQ +YQ +CN +rd +kr +vK +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Pg +rd +aP +YQ +kr +YQ +cn +aP +YQ +YQ +YQ +CN +Pg +YQ +YQ +YQ +YQ +Wl +YQ +kr +cn +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +YQ +MW +YQ +MW +rd +Wl +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +vK +YQ +cn +YQ +YQ +YQ +CN +YQ +YQ +YM +MW +YQ +YQ +YQ +CN +rd +YQ +Wl +YQ +rd +Wl +aP +kr +ZV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(26,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +oZ +tH +vz +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +ZV +YQ +YQ +YQ +YQ +YQ +cn +YQ +YQ +YQ +YQ +YQ +YQ +YQ +rd +YQ +YQ +YQ +YQ +YQ +cn +YQ +YQ +YQ +CN +cn +aP +wH +YQ +YQ +YQ +wH +YQ +AF +Pg +YQ +YQ +YQ +YQ +YQ +rd +rd +Wl +YQ +YQ +YQ +CN +YQ +YQ +vK +YQ +YQ +YQ +YQ +ZV +Wl +Pg +VU +YQ +kr +rd +YQ +wH +YQ +vK +YQ +YQ +YQ +MW +YQ +MW +YQ +rF +Dz +YQ +YQ +Wl +YQ +YQ +YM +YQ +YQ +YQ +rd +YQ +YQ +wH +YQ +YQ +YQ +YQ +YQ +ZV +YQ +YQ +YQ +YQ +YQ +AF +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(27,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +ak +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +CN +MW +YQ +YQ +YM +cn +rF +YQ +YQ +YQ +CN +Wl +kr +rd +YQ +AF +YQ +Wl +rd +MW +Pg +aP +YQ +YQ +YQ +YQ +kr +mY +YQ +YQ +YQ +CN +YQ +YQ +YM +YQ +Wl +YQ +CN +YQ +kr +cn +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Fz +Wl +YQ +YQ +YQ +CN +rd +YQ +YQ +aP +YQ +YQ +YQ +YQ +CN +YQ +AF +YQ +rd +Wl +YQ +AF +Pg +Wl +YQ +YQ +rd +YQ +aP +YQ +YQ +pN +YQ +Wl +aP +YQ +YQ +YQ +CN +YQ +AF +YQ +YQ +YM +kr +aP +YQ +YQ +CN +mY +Pg +aP +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(28,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +rd +AF +YQ +YQ +wH +Wl +YQ +wH +YQ +ZV +Pg +vK +YQ +MW +YQ +CN +YQ +YQ +YQ +YM +YQ +AF +YQ +aP +Pg +YQ +YQ +YQ +YQ +YQ +vK +YQ +YQ +YQ +YQ +YQ +YQ +aP +rd +YQ +YQ +YQ +CN +MW +YQ +kr +YQ +Wl +wH +YQ +YQ +YQ +YQ +YQ +rd +YQ +YQ +YQ +CN +cn +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +cn +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +wH +YQ +YQ +YQ +YQ +aP +rd +Wl +YQ +Wl +rF +Pg +wH +YQ +YQ +vK +YQ +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(29,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +io +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Wl +vK +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +Pg +PB +YQ +cn +YQ +YQ +YQ +YQ +wH +Pg +cn +YQ +YQ +YQ +YQ +CN +YQ +rd +MW +YQ +YQ +CN +YQ +Wl +kr +YQ +YQ +YQ +CN +ZV +YQ +YM +YQ +YQ +wH +Pg +vK +YQ +YQ +AF +Wl +rd +YQ +YQ +YQ +CN +AF +cn +YQ +YQ +YQ +YQ +YQ +ZV +YQ +YM +Wl +YQ +YQ +rd +kr +YQ +YQ +AF +ZV +YQ +MW +YQ +MW +cn +rd +YQ +YQ +YQ +rd +YQ +YQ +YM +rd +AF +YQ +YQ +mY +YQ +cn +YQ +AF +YQ +VU +rd +cn +YQ +YQ +Wl +CN +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(30,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +AT +io +JG +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +kr +YQ +YQ +YQ +aP +YQ +cn +YQ +aP +YQ +YM +YQ +YQ +YQ +CN +aP +YQ +rd +YQ +Wl +YQ +kr +YQ +YQ +YQ +Wl +YQ +YM +YQ +YQ +YQ +YQ +AF +YQ +aP +YQ +YQ +YQ +rd +Pg +YQ +YQ +YQ +AF +YQ +aP +YQ +YQ +YQ +CN +ZV +aP +YQ +YQ +cn +YQ +YQ +MW +CN +lF +Wl +YQ +YQ +CN +YQ +rd +YQ +YQ +AF +wH +YQ +aP +YQ +cn +YQ +YQ +YQ +CN +Pg +np +YQ +wH +rd +kr +YQ +AF +YQ +vK +YQ +kr +YQ +YQ +YQ +CN +vK +YQ +YQ +YQ +CN +YQ +MW +YQ +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(31,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +VJ +FR +io +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +cn +YQ +YQ +YQ +CN +Pg +rd +YQ +rd +Wl +YQ +kr +YQ +Wl +cn +wH +YQ +YQ +YM +Wl +YQ +YQ +rd +YQ +YQ +YM +Pg +cn +YQ +Wl +YQ +YQ +YQ +YQ +CN +YQ +cn +YQ +AF +YQ +MW +YQ +YQ +YQ +CN +YQ +kr +YQ +YQ +YQ +YQ +YQ +YM +Wl +YQ +rd +AF +YQ +YQ +YQ +YQ +rd +YQ +YQ +wH +aP +YQ +YQ +YQ +CN +vK +rd +YQ +YM +Pg +YQ +YQ +YQ +rd +YQ +YQ +YQ +YQ +CN +ZV +YQ +YQ +YQ +CN +rd +cn +wH +YQ +YQ +wH +rd +aP +YQ +rd +YQ +ZV +YQ +YQ +YQ +aP +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(32,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +io +Qa +io +FL +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rF +YQ +aP +Wl +rd +YQ +YQ +YM +AF +YQ +YQ +rd +YQ +AF +YQ +mY +mY +YQ +Pg +YQ +YQ +YQ +CN +YQ +aP +YQ +YQ +YQ +AF +YQ +kr +ZV +YQ +Pg +YQ +AF +YQ +YQ +YQ +CN +wH +YQ +YQ +YQ +YQ +cn +YQ +YQ +cn +rd +MW +YQ +YQ +YQ +YQ +YM +aP +ZV +YQ +YQ +YQ +CN +Pg +AF +rd +mY +YQ +YQ +YQ +rd +Wl +ZV +AF +YQ +rd +rd +YQ +Wl +Ka +kr +YQ +YQ +AF +cn +Wl +YQ +YQ +YQ +Pg +YQ +Wl +YQ +YQ +Hy +kr +YQ +YQ +YQ +YQ +AF +YQ +YQ +YQ +CN +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(33,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +sq +io +io +LU +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +np +YQ +ZV +YQ +YQ +wH +YQ +YQ +YQ +CN +MW +aP +YQ +YQ +CN +rd +AF +YQ +YQ +ZV +YQ +cn +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +rd +YQ +Wl +rd +YQ +YQ +KM +YQ +aP +rd +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +YQ +wH +rd +Wl +YQ +YQ +rd +YQ +kr +YQ +YQ +Pg +YQ +YQ +YM +YQ +YQ +kr +YQ +YQ +YQ +CN +Ey +du +uO +YQ +mY +YQ +rd +YQ +Pg +cn +MW +YQ +YQ +aP +CN +YQ +YM +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +pU +PT +Fd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(34,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Zn +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +wH +YQ +YQ +YQ +YQ +YQ +Mp +Mp +Mp +Mp +Mp +Mp +Mp +Mp +YQ +YQ +rd +YQ +YQ +YQ +CN +AF +YQ +MW +YQ +Wl +ZV +cn +YQ +Wl +YQ +YQ +rd +YQ +YQ +YQ +mY +YQ +kr +YQ +YQ +vK +YQ +YQ +YQ +CN +Pg +AF +YQ +YQ +CN +MW +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +MW +YQ +YQ +Lu +io +du +io +jy +YQ +MW +YQ +CN +AF +aP +YQ +YQ +YQ +YQ +YQ +YQ +rd +Pg +Wl +YQ +YQ +YQ +rd +IR +FX +du +Ou +cA +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(35,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +st +st +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +wH +YQ +YQ +YQ +VU +aP +Pg +cn +rd +YQ +rd +Pg +ZV +kr +aP +Mp +BP +Xz +eD +Mp +gK +Eu +Mp +aP +YQ +Wl +YQ +YQ +YQ +YQ +YQ +cn +YQ +YQ +YM +Pg +YQ +YQ +YQ +CN +YQ +YQ +HT +Wl +aP +YQ +AF +Pg +cn +YQ +AF +YQ +YQ +YQ +wH +YQ +YQ +Wo +YQ +AF +YQ +YQ +YQ +YQ +wH +AF +YQ +YQ +YQ +YQ +YQ +YQ +hw +du +io +JQ +du +du +DL +YQ +YQ +YQ +rd +YQ +vK +AF +YQ +kr +ZV +cn +YQ +AF +YQ +cn +rd +YQ +mE +du +Xa +La +uG +QA +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(36,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +st +Ir +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Pg +rd +MW +YQ +Pg +kr +YQ +YQ +rd +kr +YQ +YQ +YQ +Tw +YQ +AF +YQ +Mp +iL +Xz +Xz +VI +Jd +Jd +Mp +YQ +kr +YQ +AF +rd +kr +YQ +YQ +YQ +CN +YQ +YQ +AF +YQ +YQ +YQ +YQ +YQ +YQ +CN +ZV +YQ +wH +vK +Wl +YQ +Wl +YQ +CN +YQ +np +AF +rF +MW +YQ +cn +YQ +YQ +YQ +YM +cn +Xj +Xj +Xj +Xj +Xj +Xj +Xj +YQ +CN +js +du +Lv +io +KO +cn +wH +YQ +YM +YQ +YQ +YQ +CN +aP +Wl +YQ +YQ +aP +CN +vK +MW +Ka +XB +io +FN +uG +QA +pQ +pQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(37,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +LU +st +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +CN +ZV +YQ +YQ +YQ +CN +YQ +cn +YQ +YQ +YQ +YQ +rd +Mp +Xz +Xz +Ye +Mp +Jd +Jd +Mp +cJ +Ka +YQ +Ka +CN +Wl +YQ +YQ +kr +YQ +YQ +YQ +YQ +CN +vK +cn +Wl +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +ZV +YQ +YQ +YQ +CN +YQ +kr +rd +YQ +YQ +YQ +CN +YQ +YQ +Xj +my +Nn +BM +Ih +CA +Xj +YQ +FT +du +io +du +io +se +YQ +YQ +YQ +Pg +YQ +YQ +wH +YQ +wH +cn +YQ +YQ +YQ +Pg +wH +XB +du +io +du +uG +pQ +pQ +AV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(38,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +AT +io +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +cn +rd +Wl +YQ +YQ +vK +YQ +AF +aP +rd +cn +YQ +YQ +CN +Mp +xQ +Gl +Mp +Mp +Jd +ux +vw +io +io +Fr +io +DL +Ka +AF +YQ +aP +cn +YQ +YQ +YQ +Wl +YQ +YQ +YM +YQ +YQ +YQ +CN +YQ +rF +cn +YQ +YQ +YQ +CN +rd +YQ +YQ +YQ +YQ +CN +Wl +YQ +YQ +YQ +YQ +Wl +rd +Xj +LL +Pc +Ih +Ih +Xq +Xj +YQ +YQ +uS +du +io +jh +YQ +YQ +YQ +CN +Wl +YQ +AF +Pg +rd +YQ +YQ +YQ +YM +AF +Ka +XB +io +bp +uG +QA +pQ +pQ +EA +bp +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(39,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +uG +pQ +dF +io +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +aP +YQ +YM +Pg +kr +YQ +YQ +YM +aP +YQ +YQ +Pg +Mp +Et +Mp +Jq +CH +Jd +Jd +Mp +zC +sQ +YQ +LW +Uv +io +DL +YM +Pg +YQ +Wl +YQ +rF +YQ +YQ +YQ +YQ +YQ +YQ +YQ +kr +YQ +wH +rd +YQ +YQ +YQ +YQ +rF +Wl +YQ +YQ +YQ +Pg +YQ +YM +kr +YQ +Pg +YQ +rF +Xj +XZ +yb +Ih +Ih +KC +Xj +YQ +YQ +CN +eC +Uc +rd +YQ +YQ +YQ +MW +YQ +aP +YM +YQ +YQ +YQ +CN +YQ +Pg +mE +du +io +Pp +uG +pQ +pQ +AV +EA +kJ +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(40,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +uG +pQ +pQ +pQ +dF +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +rd +vK +YQ +Mp +Mp +Gl +TR +Dj +Dj +Jd +Mp +YQ +YQ +YQ +CN +Pg +wm +ZV +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +Wl +YQ +YQ +CN +YQ +YQ +YM +MW +YQ +wH +rd +AF +YQ +YQ +vK +YQ +YQ +YQ +CN +ZV +Xj +Cv +Ih +Ih +Ih +ef +Xj +YQ +YQ +YQ +YQ +YQ +CN +YQ +Wl +YQ +YQ +YQ +YQ +HT +YQ +YQ +YQ +YQ +Fd +TG +io +cX +uG +QA +pQ +pQ +EA +FQ +go +NF +jH +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(41,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +uh +pQ +pQ +pQ +Hg +ll +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +AF +wH +YQ +YQ +Wl +hv +wH +vl +YQ +YQ +CN +MW +rd +Mp +Ct +Jd +Jd +Dj +Dj +Jd +IK +YQ +YQ +YQ +YQ +MW +YQ +YQ +YQ +Wl +YQ +mY +AF +cn +YQ +ZV +Wl +YQ +YQ +rd +Pg +AF +YQ +VU +YQ +YQ +YQ +rd +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +Wl +YQ +YQ +YQ +rd +Xj +Rd +Ih +Ih +Ih +Cc +Xj +Pg +YQ +YQ +YQ +kr +YQ +wH +Pg +YQ +YQ +YQ +CN +cn +wH +Wl +PT +zY +Xa +Ou +SW +uG +pQ +pQ +AV +EA +io +io +zP +fX +ZV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(42,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +uG +pQ +pQ +pQ +pQ +Hg +WQ +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +rd +Pg +YQ +YQ +KM +YQ +Pg +YQ +YQ +YQ +ZV +cn +YQ +Mp +rS +Jd +PW +Dj +Dj +Jd +IK +wH +YQ +rd +kr +Wl +YQ +YQ +Tw +rd +wH +YQ +YQ +MW +kr +Pg +YQ +YQ +wH +vK +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +Wl +YQ +YQ +rd +KM +YQ +YQ +YQ +YQ +ZV +YQ +YQ +YM +YQ +Xj +Xj +Xj +mg +Xj +Xj +Xj +YQ +wH +Wl +YQ +YQ +YQ +YQ +YM +wH +YQ +YQ +YQ +YQ +Ka +FX +iG +du +Rp +uG +QA +pQ +pQ +EA +kJ +du +io +Jh +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(43,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +uh +pQ +pQ +pQ +pQ +pQ +dF +ak +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Fz +mY +aP +MW +cn +rd +YQ +YM +rF +AF +YQ +YQ +wH +Mp +im +Jd +lB +Dj +Dj +aA +Mp +YQ +YQ +YM +rd +AF +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YQ +CN +kr +YQ +YQ +rF +YQ +YQ +YQ +YQ +YQ +Pg +is +YQ +cn +YQ +YM +kr +YQ +YQ +YQ +CN +YQ +YQ +Wl +rF +YQ +Kr +du +bw +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +cn +AF +vK +kr +YQ +Ka +io +bp +NU +uG +QA +pQ +pQ +AV +EA +io +io +zP +Gz +YQ +kr +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(44,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +uh +pQ +pQ +pQ +pQ +pQ +Hg +io +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +ZV +YQ +YQ +rd +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YM +Mp +Ct +Jd +Jd +Jd +Jd +Ha +Mp +vK +YQ +YQ +YQ +vK +rd +YQ +YM +Wl +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +Wl +YQ +AF +YQ +YQ +YQ +YM +rd +kr +YQ +YQ +YQ +CN +Pg +rd +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +rQ +du +DL +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +rF +MW +YQ +Wl +rT +XB +io +du +uG +QA +pQ +pQ +AV +EA +bp +du +io +RD +YQ +YQ +wH +aP +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(45,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +VJ +pQ +pQ +pQ +pQ +pQ +pQ +dF +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YM +YQ +YQ +YQ +CN +aP +YQ +YQ +YQ +CN +vK +YQ +aP +Mp +Mp +Mp +IK +IK +Mp +Mp +Mp +Wl +YQ +YQ +YQ +CN +YQ +YQ +YQ +Pg +rF +kr +YQ +YQ +YQ +AF +rF +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +rF +wH +YQ +YQ +YQ +YQ +YQ +YQ +rF +YQ +YQ +YQ +CN +YQ +MW +YQ +YQ +YQ +YQ +OU +du +DL +YQ +CN +wH +Wl +YQ +YM +Pg +Wl +YQ +YQ +Ka +EQ +du +cw +Rp +uG +pQ +pQ +AV +EA +io +du +NF +ie +Pb +vK +rd +YQ +YQ +CN +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(46,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +VJ +pQ +pQ +pQ +pQ +AV +AV +AS +dF +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rF +rd +YQ +YQ +YQ +vK +rd +YQ +YQ +YQ +Pg +YQ +cn +YQ +kr +YQ +rd +YQ +Pg +ZV +YQ +kr +aP +cn +YQ +Wl +rd +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YM +Wl +rd +YQ +YQ +YQ +Pg +YQ +Ka +Ka +Ka +cJ +Ka +Ka +YQ +CN +wH +YQ +YQ +YQ +CN +YQ +rd +YQ +cn +wH +YQ +YQ +YQ +CN +Uv +io +DL +YQ +MW +YQ +YQ +rF +YQ +YQ +YQ +Ka +XB +du +du +Az +uG +QA +pQ +AV +EA +du +mh +cH +RD +LW +YQ +YQ +wH +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(47,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +uh +pQ +pQ +EA +io +io +io +VJ +dF +io +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Pg +cn +AF +vK +ZV +YQ +YQ +rd +AF +YQ +YM +wH +YQ +YQ +MW +YQ +YM +AF +YQ +YQ +YQ +YQ +AF +kr +Pg +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +vK +kr +YQ +YQ +YM +zY +iG +io +du +io +bp +io +xH +Ka +Rm +Wl +YQ +YQ +YQ +Wl +ZV +Wl +Pg +YQ +rd +YQ +YQ +og +OU +du +zA +Pg +YQ +YQ +YQ +CN +YQ +Ka +XB +FN +du +mh +uG +QA +pQ +AV +EA +rm +io +io +yu +JZ +YQ +kr +YQ +YQ +YQ +CN +cn +ZV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(48,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +VJ +AV +EA +io +io +AR +AR +io +VJ +dF +od +io +AR +AR +AR +AR +AR +AR +AR +AR +YQ +CN +rd +Wl +YQ +YQ +Fz +wH +HT +YQ +YQ +VU +aP +YQ +YQ +CN +Pg +YQ +YQ +YQ +YQ +CN +YQ +YM +wH +YQ +YQ +YM +Wl +YQ +YQ +cn +YQ +YQ +YQ +YQ +CN +YQ +YQ +Ka +XB +Ss +cH +uG +QA +QA +dF +Rp +du +io +kJ +lf +YJ +Ka +Ka +YM +YQ +YQ +YQ +CN +YQ +YQ +Xd +Ko +zK +io +io +Mf +YQ +YQ +YQ +Ka +XB +io +du +go +uG +QA +pQ +pQ +EA +kJ +io +Xa +jH +sQ +YQ +wH +YQ +YQ +YQ +YQ +YQ +wH +Wl +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(49,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +io +io +io +AR +AR +AR +AR +io +JK +GN +QA +dF +io +AR +AR +AR +AR +AR +AR +YQ +YQ +wH +YQ +YQ +Pg +YQ +YQ +YQ +YQ +CN +ZV +YQ +YQ +YQ +rd +vK +cn +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +AF +YQ +rd +wH +YQ +YQ +wH +mY +YQ +XB +io +FN +so +uG +pQ +pQ +pQ +pQ +QA +QA +dF +bp +so +mh +io +io +xH +Ka +Ka +Ka +YQ +YQ +YQ +CN +WU +zY +io +io +DL +CN +Ka +XB +Br +io +SW +uG +QA +pQ +pQ +AV +EA +io +io +zP +fX +YQ +YQ +YQ +rd +YQ +YQ +YQ +CN +kr +vK +aP +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(50,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +VJ +pQ +QA +dF +io +AR +AR +AR +AR +AR +YQ +YM +aP +Pv +rd +cn +YQ +YQ +YQ +rd +kr +vl +rd +YQ +AF +wH +YQ +YQ +YM +rd +aP +YQ +AF +Pg +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +ZV +cJ +Ka +rT +XB +io +FQ +uG +QA +pQ +pQ +AV +AV +AV +pQ +pQ +pQ +QA +QA +QA +dF +io +FN +cA +go +ro +Jc +Ka +Ka +Ka +OU +du +io +io +DL +mE +Xo +du +Rp +uG +QA +pQ +pQ +AV +EA +FQ +du +io +yu +kr +rF +YQ +YQ +YQ +CN +YQ +YQ +YQ +rd +MW +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(51,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +VJ +AV +AV +QA +dF +io +io +AR +AR +YQ +PT +Fd +Ka +YQ +YQ +AF +cn +cn +rd +mY +MW +YQ +YQ +YQ +CN +rd +YQ +ZV +YQ +rd +YQ +CN +YQ +YQ +YQ +YQ +ZV +YQ +cn +YQ +Jf +mE +io +io +du +FN +du +uG +pQ +pQ +pQ +EA +ro +Ou +Az +VJ +AV +AV +AV +AV +pQ +pQ +QA +QA +QA +dF +FQ +TT +io +io +io +Jb +du +du +io +GA +cH +TT +uG +QA +pQ +pQ +pQ +EA +cw +kJ +cH +Jh +zC +YQ +YQ +YQ +Pg +YQ +YQ +aP +Wl +YQ +YQ +YQ +YQ +YQ +YQ +CN +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(52,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +VJ +AV +QA +QA +AR +AR +pP +KZ +io +io +xH +aI +YQ +YQ +Wo +YQ +qC +YQ +YQ +YQ +YQ +rF +YQ +YQ +YQ +CN +YQ +Wl +YQ +YQ +YQ +Tw +kr +rT +Ka +Ka +YU +Xa +UB +du +uG +QA +QA +QA +pQ +pQ +EA +io +bp +Pp +sh +ro +io +du +FN +TT +Rp +VJ +AV +pQ +pQ +pQ +pQ +QA +QA +QA +dF +du +NF +Jd +Jd +Jd +Az +NU +uG +pQ +pQ +pQ +AV +EA +io +io +yu +JZ +MW +YQ +YQ +YQ +CN +wH +AF +vK +rd +mY +YQ +YQ +YQ +CN +YQ +YQ +wH +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(53,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +VJ +AV +pQ +pQ +MY +QA +dF +du +Rp +Xa +xH +Ka +rT +YQ +YQ +YQ +CN +rd +Wl +kr +YQ +YQ +YQ +Pg +wH +YQ +YQ +YQ +Ka +Ka +XB +du +io +du +bp +mh +uG +QA +pQ +pQ +AV +AV +AV +EA +io +io +yu +sQ +CN +sQ +wm +sQ +sQ +Jo +io +Br +du +VJ +AV +AV +AV +pQ +pQ +pQ +pQ +QA +QA +Jd +Jd +Jd +QA +QA +pQ +pQ +AV +EA +io +Br +du +yu +YQ +rF +YQ +YQ +YQ +YQ +cn +AF +YQ +YQ +YQ +cn +MW +YQ +aP +YQ +Wl +cn +YQ +AF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(54,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +io +uh +MY +pQ +pQ +pQ +QA +dF +io +du +io +FN +YP +uW +Ka +YQ +cn +YQ +AF +YQ +wH +cn +rd +MW +YQ +YM +XB +io +du +bp +Rp +uG +QA +QA +QA +pQ +AV +AV +EA +Rp +Pp +du +Xo +Az +yu +YQ +YQ +YQ +kr +AF +YQ +YQ +YQ +JZ +nw +io +io +du +bp +io +VJ +AV +AV +AV +pQ +pQ +Jd +Jd +Jd +pQ +pQ +pQ +EA +io +io +FN +Jh +Pb +ZV +cn +YQ +YQ +YM +rF +Wl +VU +rd +YQ +YQ +YQ +CN +YQ +rd +AF +ZV +Pg +kr +rd +rF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(55,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +pP +pQ +AV +AV +pQ +QA +hN +dF +du +kJ +KZ +io +xH +Ka +aI +Ka +Ka +YQ +CN +YQ +ab +Ka +mE +du +io +uG +QA +QA +pQ +pQ +pQ +pQ +EA +KZ +kJ +Ou +NU +yu +sQ +sQ +JZ +Wl +cn +MW +YQ +YQ +CN +cn +YQ +YQ +AF +wH +sQ +sQ +sQ +uS +io +io +io +FN +FQ +zV +AV +Jd +Jd +Jd +AV +AV +EA +kJ +du +yu +fX +YQ +YQ +YQ +CN +YQ +YQ +kr +YQ +YQ +wH +YQ +YQ +YQ +YQ +wH +YQ +YQ +YQ +YM +YQ +aP +YQ +CN +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(56,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +Xj +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +mh +aB +VJ +pQ +pQ +pQ +QA +QA +dF +io +du +du +Ss +mh +io +xH +Ka +Cu +io +FN +aB +Az +uG +pQ +pQ +pQ +AV +AV +EA +du +Br +io +yu +YQ +JZ +YQ +YQ +Pg +vK +kr +YQ +YQ +YQ +YQ +ZV +Pg +YQ +YQ +YM +YQ +YQ +YQ +CN +ZV +sQ +sQ +sQ +DS +px +Ko +yC +Jd +Jd +Jd +nU +FQ +cH +Az +PP +cn +rF +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +rd +CN +rF +Wl +AF +YQ +YQ +YQ +CN +YQ +aP +YQ +YQ +YQ +cn +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(57,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +JF +Ex +JF +Xj +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +io +cw +VJ +AV +pQ +pQ +pQ +pQ +QA +QA +QA +QA +dF +NF +Mc +du +io +FQ +uG +QA +QA +pQ +pQ +pQ +EA +mh +Ou +io +io +PY +wm +RX +YQ +wH +MW +Wl +AF +ZV +YQ +YQ +Vm +CN +MW +Wl +YQ +YQ +CN +YQ +cn +YQ +Pg +rF +YQ +YM +cn +Wl +YQ +Pb +tn +PS +du +io +xH +sQ +JZ +sQ +sQ +YQ +CN +YQ +kr +cn +AF +YQ +YQ +YQ +YQ +YQ +YQ +cn +YQ +YQ +YQ +YQ +YQ +YQ +aP +vK +rd +cn +Pg +kr +wH +Wl +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(58,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +qG +Di +JF +Ij +JF +Ex +JF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Jo +io +bp +mh +VJ +AV +AV +AV +AV +pQ +pQ +pQ +pQ +QA +QA +QA +QA +QA +pQ +pQ +pQ +AV +EA +io +io +FN +yu +sQ +sQ +CN +YQ +wJ +Wl +kr +YQ +YQ +YQ +CN +YQ +Oe +Ko +wj +YQ +YQ +YQ +YQ +rF +MW +YQ +YQ +Wl +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +OU +io +io +du +BZ +rF +Wl +YQ +YQ +YQ +YQ +YQ +CN +rF +MW +YQ +cn +YQ +YQ +YM +Pg +Wl +YQ +YQ +YQ +CN +YQ +kr +YQ +YQ +MW +YQ +YQ +YQ +YQ +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(59,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +CT +JF +JF +JF +Gd +Dj +Ij +JF +Ex +Xj +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +sQ +nw +ro +UB +Pp +TT +FQ +io +VJ +AV +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +AV +EA +FQ +Ss +io +PM +sQ +YQ +YQ +rF +YQ +YQ +YQ +CN +rF +YQ +YQ +YQ +wH +YQ +YM +nJ +YQ +YQ +YQ +CN +kr +wH +YQ +YQ +YQ +Ii +YQ +YQ +YQ +YQ +YQ +rF +YQ +YQ +Pg +Jo +du +io +kI +rd +YQ +kr +rF +YQ +YQ +wH +YQ +YQ +YQ +YQ +CN +rF +YQ +YQ +rd +YQ +YQ +YQ +YQ +YQ +YQ +YQ +cn +YQ +YQ +CN +YQ +YQ +YQ +CN +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(60,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Ex +JF +JF +Dj +Dj +LK +Dj +LK +Dj +Ij +JF +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rd +wH +sQ +sQ +Wh +fX +Ni +io +Br +du +VJ +AV +AV +AV +AV +AV +AV +EA +io +io +io +zP +lr +MW +YQ +YQ +YQ +CN +YQ +YQ +vK +vK +YQ +YM +rF +AF +Pg +YQ +YQ +Wl +YQ +YQ +YQ +YQ +YQ +YQ +YQ +og +YQ +vK +AF +wH +YQ +YQ +YQ +CN +YQ +Wl +YQ +XB +du +yu +YQ +YQ +YQ +CN +YQ +YQ +YM +rd +Wl +YQ +YQ +YQ +YQ +rd +YQ +YQ +YQ +CN +rd +rF +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +AF +YQ +wH +YQ +rF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(61,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +cT +JF +Dj +Dj +Dj +Dj +TM +Dj +TM +Dj +LK +JF +op +AR +Xj +AR +AR +AR +AR +Qp +Qp +TU +Lp +AR +AR +AR +vq +Ka +Ka +aI +PT +Gz +Jo +NF +Pp +du +Az +io +SW +io +FN +Ss +cH +yu +us +Pg +kf +vK +rF +YQ +Wl +YQ +YQ +YQ +td +Wl +YQ +YQ +ZV +MW +YQ +YQ +YQ +YQ +AF +rd +YQ +YQ +vK +YQ +Xd +Ko +RW +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YQ +OU +du +io +DL +CN +YQ +wH +Pg +AF +YQ +ZV +vK +YQ +YQ +pN +YQ +YQ +YM +Wl +YQ +YQ +YQ +YQ +cn +rd +YQ +Wl +jL +kr +YQ +YQ +Wl +ZV +YQ +MW +KM +vK +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(62,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +yr +Dj +Yh +gN +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +JF +JF +Qp +JF +Qp +Qp +Qp +Qp +Qp +Lp +AR +AR +TU +Lp +dC +io +io +du +io +qz +Ka +CC +CC +fX +Wh +CC +CC +CC +CC +Wh +sQ +YQ +Rm +YQ +YQ +YQ +CN +wH +rd +YQ +YQ +rF +YQ +YQ +YQ +CN +YQ +rd +YQ +Wl +Jf +YQ +Ka +YQ +YQ +YQ +rd +YQ +YQ +nJ +YQ +YQ +YQ +YQ +YQ +YQ +Wl +YQ +rF +wH +OU +du +io +DL +YQ +Wl +rd +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +ZV +YQ +YQ +rF +YQ +YQ +YM +Wl +YQ +YQ +CN +oj +YQ +Pu +YQ +mY +KJ +YQ +YQ +YQ +CN +rd +Pg +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(63,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +rv +Dj +OB +wo +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +JF +JF +JF +Qp +JF +Qp +Qp +AR +AR +AR +AR +AR +Lp +TU +st +du +du +io +du +du +io +CY +io +xH +ow +io +du +xL +io +xH +CN +XB +du +DL +YQ +Ka +ZV +AF +YQ +YQ +YQ +CN +cn +MW +YQ +Hk +Pg +YQ +YQ +XB +du +WE +du +lf +YQ +YQ +YQ +YQ +rF +YQ +YQ +YQ +rF +YQ +MW +YQ +YQ +YQ +Ka +Ka +Ka +Jo +du +SD +YQ +YQ +CN +YQ +YQ +YQ +Pg +YQ +wH +YQ +YQ +YQ +YQ +CN +kr +YQ +YQ +MW +Pg +wH +YQ +jL +YQ +YQ +YQ +rd +YQ +YQ +rd +YQ +YQ +YQ +aP +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(64,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +cT +JF +Dj +Dj +Dj +Dj +TM +Dj +TM +Dj +Ij +JF +EO +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +TI +Gz +zC +sQ +sQ +sQ +JZ +hl +du +io +MF +du +xV +du +du +io +rP +du +yu +Wl +rH +io +DL +YM +wJ +YQ +ZV +wH +YQ +kr +Hs +Ko +wj +YQ +XB +du +io +io +io +io +Jc +Ka +Ka +Ka +Ka +YQ +Pg +Ka +Ka +AF +Ka +Ka +Ka +Ll +io +du +du +DL +ue +Ko +wj +YQ +YQ +kr +YQ +YQ +YM +Wl +YQ +cn +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +kr +YQ +AF +YQ +YQ +XC +YQ +YQ +CV +YQ +YQ +rF +AF +cn +kr +mY +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(65,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +Xj +Ex +JF +JF +Dj +Dj +Ij +Dj +Ij +Dj +LK +JF +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Pg +YQ +cn +YQ +aP +YQ +YQ +YQ +KM +rd +bg +sQ +YQ +sQ +CN +sQ +sQ +XR +Pg +sQ +wH +rd +AF +sQ +kr +YQ +rF +YQ +Wl +YQ +YQ +YQ +CN +nJ +rF +OU +io +du +io +io +du +du +io +du +io +io +io +xH +XB +du +io +WE +du +io +io +io +du +io +du +DL +YQ +ur +rF +Wl +MW +YQ +YQ +YQ +rF +YQ +rd +MW +vK +Wl +rd +YQ +YQ +YQ +Wl +ZV +rd +YQ +CN +oj +XC +HC +XC +jL +cn +YQ +YQ +CN +wH +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(66,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +iZ +JF +JF +JF +Gd +Dj +LK +JF +Ex +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +vK +rd +YQ +YQ +CN +YQ +YQ +YM +wH +kr +Wl +YQ +aP +YQ +YQ +Wl +YQ +YQ +rd +rd +Wl +YQ +CN +YQ +Wj +vK +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +cn +YQ +OU +du +io +du +YF +io +gC +io +io +ia +du +du +io +io +io +io +du +Ty +io +du +du +io +ie +sQ +YQ +YQ +YQ +rd +wH +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +kr +YQ +ZV +Pg +AF +rF +YQ +YQ +mY +YQ +vK +YQ +Yd +XC +YQ +wH +YQ +YQ +YQ +YQ +YQ +rd +vK +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(67,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +Vh +qs +JF +LK +JF +Ex +JF +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Wl +YQ +YQ +vl +ZV +Pg +pK +YQ +YQ +MW +YQ +YQ +YQ +CN +rF +YQ +YQ +YQ +CN +YQ +YQ +vK +ZV +MW +YQ +YQ +CN +YQ +YQ +MW +Pg +cn +YQ +YQ +YQ +CN +YQ +IC +du +io +io +du +io +du +yu +YQ +sQ +Jo +du +yu +nD +sQ +sQ +YQ +sQ +sQ +sQ +sQ +YQ +Wl +rF +YQ +YQ +YQ +CN +YQ +YQ +kr +cn +rd +YQ +YQ +YQ +YQ +YQ +YQ +CN +vK +YQ +YQ +YQ +CN +YQ +YQ +MW +YQ +YQ +YQ +CV +YQ +aP +YQ +YQ +YQ +CN +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(68,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Xj +Xj +Xj +JF +Ex +JF +Xj +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +wH +rd +YQ +Xh +YQ +YQ +YQ +YQ +CN +YQ +ZV +cn +wH +YQ +YQ +YQ +MW +YQ +cn +cn +rd +YQ +Wl +cn +YQ +kr +rF +YQ +YQ +YM +YQ +YQ +YQ +mY +YQ +YQ +Jo +io +io +io +io +yu +YQ +rF +Wl +YQ +IF +YQ +cn +Vm +YQ +YQ +CN +rF +YQ +YQ +YQ +CN +cn +YQ +YQ +YQ +YQ +rF +Wl +rd +vK +YQ +YQ +YQ +YM +YQ +YQ +rF +YQ +rd +YQ +YQ +Wl +wH +YQ +YQ +CN +CV +Pu +rd +YQ +YQ +YQ +YQ +YQ +YQ +Wl +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(69,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +rF +YQ +YQ +YQ +YQ +rd +YQ +Wl +YQ +CN +wH +Wl +YQ +YQ +CN +YQ +YQ +YM +vK +YQ +Wl +Wl +YQ +YQ +CN +Wl +YQ +rd +YQ +Pg +rF +OU +du +io +du +yu +Pg +YQ +YQ +YQ +OU +io +xH +Oe +Ko +wj +YQ +YQ +cn +Pg +YQ +YQ +YQ +YQ +YM +Wl +vK +YQ +YM +AF +YQ +YQ +YQ +CN +vK +rd +Wl +rd +YQ +YQ +cn +ZV +MW +HT +rd +aP +vK +YQ +ZV +rd +AF +cn +YQ +YQ +CN +YQ +cn +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(70,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +aP +vK +Pg +YQ +YQ +YQ +cn +Wl +YQ +AF +YQ +CN +YQ +AF +YQ +YQ +AF +YQ +YQ +YQ +Wl +AF +rF +YQ +YQ +YQ +YQ +CN +YQ +vK +rF +YQ +AF +vK +YQ +YQ +Wl +OU +io +io +io +DL +YQ +YQ +CN +YQ +Kr +io +du +bw +nJ +wH +YQ +YQ +YQ +Tw +wH +YQ +YQ +YQ +CN +rF +YQ +YQ +YQ +CN +cn +YQ +YQ +wH +cn +YQ +AF +YQ +YQ +YQ +CN +YQ +YQ +rF +Wl +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +vK +YQ +aP +YQ +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(71,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +AF +kr +YQ +rd +AF +rd +wH +kr +YQ +YQ +aP +YQ +YQ +YQ +vK +Pg +YQ +YQ +YQ +CN +rF +YQ +kr +YQ +YQ +MW +YQ +YQ +YQ +wH +YQ +cn +ZV +Mp +Mp +Jj +Jj +Mp +Mp +YQ +PS +du +io +DL +YQ +YQ +rd +YQ +YQ +Jo +io +KX +YQ +AF +YQ +YQ +YQ +YQ +YM +YQ +YQ +YQ +VP +Pg +YQ +YQ +YQ +YQ +YQ +ZV +Wl +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +AF +YQ +YQ +Pg +YQ +YQ +YM +Wl +YQ +YQ +wH +ZV +AF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(72,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YM +cn +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +Tw +wH +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YQ +CN +Pg +YQ +YQ +YQ +CN +Pg +Wl +YQ +YQ +YQ +jF +Mp +gZ +Jd +Jd +tC +Mp +wj +XB +du +nv +YQ +rF +YQ +qg +qg +yK +yY +yY +qg +qg +Wd +ZV +YQ +YQ +YQ +YQ +Mp +Mp +Mp +Mp +Mp +Mp +Mp +YQ +YQ +YQ +CN +rd +KM +YQ +YQ +YQ +cn +YQ +YQ +YM +YQ +Wl +YQ +YQ +YQ +CN +aP +YQ +YQ +YQ +AF +YQ +YQ +YQ +CN +Pg +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(73,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +rd +YQ +MW +MW +YQ +YQ +YQ +cn +YQ +YQ +Pg +YQ +vK +Wl +YQ +Wl +YQ +Wl +vK +YQ +YQ +YQ +wH +Wl +YQ +YQ +YQ +wH +cn +YQ +YQ +YQ +YQ +YQ +Mp +gZ +Jd +Jd +xr +Mp +XB +io +Ty +io +DL +YM +YQ +qg +pT +nq +PN +zH +qg +zl +Wd +YQ +Wl +YQ +wH +Mp +Gl +TC +cg +RI +Mp +Qc +Mp +Mp +wj +YQ +YQ +YQ +MW +rd +YQ +YQ +YQ +CN +YQ +kr +rF +rd +YQ +YQ +YQ +cn +YQ +YQ +YQ +CN +cn +YQ +YQ +YQ +MW +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(74,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Pg +aP +YQ +YQ +CN +AF +Wl +kr +aP +MW +rd +rd +kr +YQ +YM +rF +YQ +YQ +YQ +YQ +YQ +YM +rd +YQ +mY +YQ +YQ +YQ +YM +YQ +YQ +YQ +CN +Pg +rd +Mp +gZ +Jd +Jd +Jd +Hw +io +du +xH +sQ +YQ +YQ +vK +yK +Eq +eI +PN +yW +qg +zl +Wd +YQ +Oe +Mp +Mp +Mp +Jq +Jd +Jd +Jd +FV +MP +Yt +Mp +Wl +YQ +YQ +YQ +CN +AF +Wl +YQ +rd +rd +YQ +YQ +YQ +YQ +YM +ZV +rd +VU +YQ +YQ +MW +YQ +rF +kr +YQ +cn +YQ +vK +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(75,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Wl +YQ +YQ +YQ +HT +rd +YQ +YQ +AF +YQ +YQ +YM +YQ +rd +YQ +Wl +YQ +YQ +YQ +CN +rd +rF +YQ +YQ +YQ +CN +ZV +YQ +YQ +YQ +YQ +YQ +YQ +MW +YQ +Mp +eK +Jd +Jd +aY +Mp +ne +du +io +DL +YQ +YQ +YQ +qg +pT +nq +PN +zH +qg +zl +Wd +YQ +kr +Mp +Kl +Mp +gv +Jd +Jd +Kw +Mp +MP +iH +Mp +YQ +YQ +YQ +Pg +YQ +kr +YQ +YQ +rF +YQ +YQ +YQ +CN +rd +Pg +YQ +YQ +YQ +CN +YQ +rd +AF +rd +YQ +vK +YQ +Wl +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(76,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +rd +YQ +kr +Wl +YQ +YQ +YQ +CN +rd +YQ +YQ +YQ +YQ +YQ +CN +cn +YQ +YQ +YQ +AF +YQ +YQ +YQ +rF +YQ +Wl +YQ +YQ +YQ +CN +cn +YQ +YQ +wH +Mp +Gl +hy +Jd +Us +Mp +Ka +wF +du +DL +MW +YQ +kr +qg +qg +yK +yY +yY +qg +qg +Wd +wH +YQ +IK +Jd +Sk +Jd +Jd +Jd +sn +Mp +MP +kQ +Mp +rF +cn +AF +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +Wl +rF +YQ +YQ +YQ +YQ +aP +YQ +YM +YQ +YQ +YQ +CN +AF +rF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(77,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +CN +YQ +YQ +aP +YQ +Wl +YQ +ZV +Wl +YQ +YQ +CN +YQ +VU +YQ +rd +YQ +ZV +MW +YQ +YQ +YQ +CN +YQ +AF +Pg +YQ +YQ +YQ +rF +YQ +YQ +YQ +CN +Mp +VL +Jd +Jd +Jd +Hw +io +du +io +xH +YQ +YQ +YQ +YQ +YQ +hw +du +io +zr +AF +YQ +YQ +Pg +Jj +Jd +Gl +Mp +sD +Nx +Mp +Gl +Mp +Mp +Mp +cn +vK +YQ +YQ +YQ +CN +YQ +YQ +YQ +kr +YQ +YQ +YM +YQ +YQ +YQ +CN +YQ +kr +YQ +YQ +YQ +YQ +aP +wH +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(78,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Tv +YQ +ZV +YQ +YQ +YQ +YQ +CN +cn +YQ +kr +YQ +YQ +YQ +YQ +YQ +ZV +vK +YQ +YQ +YM +Wl +YQ +YQ +YQ +YQ +YQ +YQ +CN +cn +MW +Pg +AF +Wl +YQ +YQ +YQ +Mp +VL +Jd +Jd +EL +Mp +Jo +io +du +xH +YM +rF +YQ +YQ +YQ +ow +io +du +DL +YQ +rd +YQ +rF +Mp +Jd +Jd +Jd +Wi +Wi +CH +Jd +dn +XM +Mp +YQ +YM +YQ +YQ +rd +YQ +YQ +YM +rd +MW +YQ +YQ +AF +cn +YQ +YQ +Wl +YQ +YQ +AF +rd +cn +Pg +Wl +YQ +cn +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(79,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +AF +kr +rd +YQ +YQ +YQ +YQ +MW +AF +YQ +YQ +rd +Pg +aP +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +KM +Wl +YQ +YQ +wH +YQ +YQ +YQ +YQ +CN +YQ +YQ +YM +mt +Mp +VL +Jd +Jd +Jq +Mp +QX +Jo +io +du +DL +YQ +YQ +YQ +kr +YQ +uc +io +FP +YQ +YQ +YQ +cn +Mp +Jd +Jd +Bn +Jd +Jd +Jd +Bn +Jd +iR +Mp +YQ +rF +Wl +wH +mY +YQ +YQ +Pg +YQ +YQ +YQ +CN +ZV +rd +vK +AF +YQ +YQ +YQ +YQ +CN +YQ +aP +YQ +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(80,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Wl +mY +YQ +YQ +YQ +cn +ZV +YQ +YM +rd +aP +YQ +YQ +CN +mY +AF +YQ +YQ +YQ +wH +YQ +YQ +Pg +YQ +YQ +YQ +AF +Wl +YQ +kr +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Mp +Mp +Jj +Jj +Mp +Mp +YQ +rF +Jo +io +DL +YQ +Wl +YQ +Vm +tZ +io +yu +YQ +YQ +YQ +CN +YQ +IK +Jd +dn +DU +fW +Jd +dn +ii +fW +Jd +IK +AF +YQ +YQ +kr +YQ +YQ +YQ +CN +YQ +YQ +rF +Wl +wH +YQ +aP +YQ +kr +YQ +cn +YQ +YQ +wH +vK +MW +ZV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(81,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +aP +YQ +YQ +YQ +CN +YQ +Wl +YQ +kr +YQ +YQ +YQ +YQ +cn +YQ +YQ +YQ +MW +rd +YQ +YQ +kr +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +AF +YQ +YQ +YQ +CN +vK +YQ +wH +YQ +YQ +ZV +YQ +YQ +wH +XB +du +DL +Pg +YQ +gU +Ko +Ro +du +xH +YQ +aP +Pg +YQ +AF +IK +Bn +Jd +iR +Jd +Jd +Jd +iR +Jd +Jd +IK +YQ +YQ +YQ +CN +YQ +YQ +rF +YQ +rd +wH +AF +rd +YQ +YQ +YQ +CN +YQ +ZV +rd +Wl +YQ +YQ +CN +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(82,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +MW +YQ +YQ +YQ +YQ +rd +aP +YQ +YQ +wH +Wl +YQ +Wo +ZV +YQ +YQ +YQ +CN +YQ +YQ +YQ +Tw +YQ +YQ +YQ +YQ +Wl +YQ +rF +YQ +YQ +Wl +CN +YQ +cn +YQ +YQ +YQ +YQ +YQ +YQ +YQ +aP +YQ +OU +io +UH +jj +Ka +Ka +Ka +nJ +YU +du +io +xH +ZV +YQ +YQ +YQ +Mp +yX +wZ +Jd +Jd +Ct +Xm +Mx +dW +PW +Jj +vK +YQ +kr +YQ +Wl +rd +YQ +YQ +YQ +CN +cn +YQ +YQ +YQ +YQ +YQ +YQ +bn +aP +YQ +YQ +YQ +Wl +AF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(83,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rd +YQ +YM +aP +rd +YQ +Wl +kr +YQ +YQ +YQ +CN +YQ +YQ +rd +vK +YQ +YQ +YQ +YQ +YQ +YQ +Wl +wH +YQ +YQ +YM +vK +YQ +rx +YQ +Wl +YQ +YQ +wH +rd +Pg +YQ +YQ +YQ +CN +YQ +YQ +YQ +rd +Sc +io +du +io +io +du +io +QB +io +io +du +du +xH +Wl +YQ +DO +Mp +IK +Gl +EP +Mp +Jj +Gl +le +Qr +rt +Mp +Pg +rF +YQ +YQ +cn +AF +YQ +YQ +YQ +YQ +YQ +YQ +CN +rF +AF +Pg +YQ +YQ +AF +YQ +YQ +rd +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(84,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YM +kr +YQ +YQ +YQ +wH +vK +Pg +YQ +YQ +YQ +aP +YQ +YQ +CN +wH +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +YQ +YQ +cn +YQ +YQ +CN +cn +YQ +YQ +YM +YQ +YQ +YQ +YQ +YQ +Vm +cn +YQ +YQ +vK +OU +du +io +du +du +hk +io +DL +Jo +du +io +du +du +xH +Ka +Ka +Ka +ZV +XB +io +St +YQ +Mp +Mp +IK +Mp +Mp +vc +YQ +YQ +Vm +CN +MW +YQ +cn +kr +YQ +kr +vK +Pg +YQ +YQ +YQ +Tw +wH +YQ +YQ +YQ +CN +cn +rF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(85,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Pg +YQ +ZV +AF +YQ +YQ +YQ +CN +YQ +Wl +YM +AF +YQ +YQ +YQ +YQ +YQ +YQ +YQ +kr +YQ +cn +YQ +YQ +YQ +YQ +YQ +CN +tu +YQ +YQ +MW +AF +YQ +YQ +Wl +CN +rF +ZV +YQ +IW +Ko +wj +YQ +kr +YQ +Fd +uc +io +yu +jb +YQ +sQ +wH +vK +sQ +Jo +io +io +du +du +io +io +WE +du +io +xH +uW +Ka +Ka +YQ +kr +YQ +YQ +wH +Oe +Ko +Gu +YQ +YQ +Tw +MW +MW +YQ +Wl +rd +MW +YQ +YQ +rd +YQ +cn +kr +YQ +AU +ZV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(86,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Wl +wH +aP +YQ +YQ +cn +YQ +YQ +YQ +YQ +YQ +YQ +MW +kr +Pg +YQ +aP +YQ +CN +Wl +YQ +YQ +cn +rF +AF +Wl +YQ +YQ +YQ +YQ +rd +YQ +YQ +vK +YQ +YQ +YQ +YQ +YQ +YQ +wH +YQ +nJ +MW +YQ +YQ +OU +du +io +du +DL +YQ +YQ +Wl +YQ +YQ +rF +rd +CR +du +du +mZ +Wa +du +io +io +du +io +du +du +io +Nd +YJ +Ka +uW +YQ +YQ +lJ +YQ +YQ +YQ +wH +YQ +rd +YQ +CN +wH +cn +ZV +YQ +YQ +aP +Wl +YQ +rd +YQ +AF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(87,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +YQ +CN +YQ +YQ +Wl +aP +KM +Ym +cn +YQ +YQ +YM +rF +Wl +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +cn +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +wH +YQ +kr +YQ +YQ +YQ +YQ +YQ +YQ +aP +OU +du +io +yu +Vm +aP +YQ +YQ +YQ +MW +YQ +YQ +YQ +sQ +sQ +YQ +YQ +sQ +sQ +Jo +io +du +hk +io +du +io +du +du +io +lf +YQ +YQ +YQ +kr +aP +fz +YQ +YQ +YQ +YQ +YQ +rF +YQ +YQ +YQ +CN +YQ +YQ +YM +Wl +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(88,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +cn +kr +YQ +YQ +Wl +YQ +YM +wH +kr +YQ +YQ +YQ +CN +YQ +YQ +wH +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +YQ +rF +YQ +YQ +ZV +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +mY +AF +YQ +YQ +YM +YQ +YQ +OU +io +UH +Oe +Ko +wj +kr +YQ +YQ +CV +YQ +YQ +YM +MW +YQ +aP +YQ +YQ +YQ +YQ +sQ +LW +wH +Jo +io +io +io +du +io +io +DL +YM +rd +Mp +Mp +Mp +Mp +Mp +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(89,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +PB +YQ +YQ +Pg +YQ +Wl +YQ +YQ +YQ +AF +YQ +YQ +YQ +mY +AF +Wl +YQ +YQ +CN +YQ +ZV +wH +Pg +YQ +YQ +YQ +ZV +Wl +YQ +kr +YQ +wH +Wl +vK +Hk +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Vm +vK +Wl +YQ +YQ +kw +du +DL +hp +YQ +YQ +YQ +YQ +YQ +Ka +SF +Ka +Ar +YQ +vK +YQ +Vm +YQ +CN +YQ +YQ +YQ +YQ +sQ +sQ +sQ +Jo +du +QC +Ka +Ka +Ka +Mp +Ct +MJ +zI +Mp +cn +YQ +YQ +wH +YQ +kr +AF +YQ +YQ +YQ +CN +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(90,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +CN +MW +aP +YQ +YQ +YQ +CN +YQ +YQ +YM +cn +ZV +pN +YQ +cn +YQ +YQ +YQ +YQ +Aa +YQ +YQ +YQ +YQ +CN +MW +YQ +YQ +YQ +CN +rF +Mp +Mp +Mp +Mp +Mp +IK +Gl +IK +Mp +bf +YQ +YQ +YQ +xU +io +du +DL +ZV +AF +cn +Ka +Ka +EQ +du +du +Ud +io +as +YQ +Oe +Ko +wj +YQ +YQ +YQ +YQ +YM +YQ +YQ +YQ +YM +Jo +du +du +io +du +uj +Jd +Jd +An +Mp +YQ +rd +aP +Wl +YQ +YQ +vK +Wl +YQ +YQ +wH +vK +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(91,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +YQ +YQ +kr +Pg +YQ +YQ +YQ +Wl +MW +wH +aP +Wl +YQ +kr +YQ +YQ +MW +YQ +YQ +YQ +CN +YQ +YQ +YQ +vK +Pg +YQ +YQ +YQ +YQ +ZV +Mp +uZ +Jd +Iw +Wi +Jd +vx +Jd +yM +Mp +AF +YQ +Ol +io +du +io +DL +YQ +cD +ws +io +Kk +io +du +uG +dF +du +io +yy +rd +nJ +YQ +YQ +MW +YQ +YQ +Pg +ZV +YQ +YQ +YQ +OU +io +io +yu +JZ +Mp +fh +Jd +af +Mp +mk +vK +rd +YQ +YQ +YQ +td +YQ +Pg +Bp +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(92,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +rd +AF +YQ +YQ +YQ +cn +rd +YQ +aP +YQ +cn +YQ +YQ +YM +YQ +nm +YQ +CN +YQ +YQ +YQ +YQ +YQ +YM +zx +cn +YQ +YQ +YQ +YM +cn +Pg +Mp +BY +Jd +sS +Wi +Co +dm +tK +Jd +Jj +YQ +YQ +OU +du +io +yu +rd +OU +du +io +du +uG +QA +QA +pQ +pQ +dF +io +du +xH +AF +YQ +YQ +YQ +YQ +YQ +YQ +Vm +cn +YQ +wH +YQ +pm +io +DL +Oe +Mp +Mp +FO +Mp +Mp +YQ +YM +YQ +YQ +YQ +MW +YQ +YQ +YM +rF +Wl +AR +AR +AR +AR +AR +AR +AR +kW +Xj +Xj +AR +kW +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(93,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +CN +YQ +YQ +YQ +CN +Wl +vK +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +aP +YQ +YQ +vK +MW +YQ +YQ +YQ +Wl +YQ +YQ +YQ +CN +YQ +YQ +YQ +rd +Mp +kB +Jd +kz +Wi +Jd +Jt +Jd +Jd +Gl +Ka +Ka +mE +io +io +DL +YQ +hH +du +Ud +uG +pQ +pQ +pQ +pQ +pQ +pQ +dF +io +io +DL +YQ +YQ +YQ +Wl +Mp +Mp +Mp +Mp +Mp +rd +OU +io +du +DL +YQ +Mp +pn +Jd +XV +Mp +YQ +YQ +YQ +YQ +CN +YQ +kr +YQ +rd +ZV +cn +AR +AR +AR +AR +AR +AR +AR +Xj +qa +Ih +ti +qi +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(94,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +aP +YQ +YQ +YQ +YQ +YQ +YQ +aP +AF +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YM +Wl +YQ +YQ +YQ +CN +AF +YQ +YQ +YQ +rd +YQ +Wl +YQ +CN +Mp +fm +Jd +dt +Wi +Jd +Jd +Jd +Jd +vZ +du +io +du +du +io +Mf +YQ +KR +io +uG +pQ +pQ +pQ +pQ +pQ +pQ +pQ +Hg +Kk +io +xH +YQ +YM +YQ +YQ +Mp +zI +MJ +Ct +Mp +Ka +OU +io +io +DL +AF +Mp +Mp +Mp +Mp +Mp +Pg +YQ +YQ +YQ +wH +Wl +YQ +aP +YQ +CN +YQ +AR +AR +AR +AR +AR +AR +AR +AR +ti +Ih +oW +qa +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(95,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +vK +cn +YQ +Wl +kr +YQ +YQ +YM +YQ +dY +YQ +YQ +Wl +wH +YQ +Pg +vK +YQ +YQ +rF +Pg +cn +YQ +YQ +YQ +cn +YQ +wH +YQ +MW +Wl +YQ +YQ +Oe +Mp +Ct +Jd +Mh +Wi +Jd +Jd +Jd +Jd +Gl +oX +sQ +CR +du +io +DL +Kr +du +io +uh +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +dF +io +du +qr +YQ +rd +vK +Mp +wv +Jd +Jd +tS +io +QB +du +UH +YQ +YQ +YQ +YQ +Wl +YQ +MW +YQ +rd +AF +YQ +rF +rd +YQ +YQ +YQ +YQ +AF +yw +ou +AR +AR +AR +AR +AR +Xj +qa +qa +Ih +Ih +kW +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(96,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +mY +YQ +YM +YQ +aP +AF +YQ +rd +Pg +YQ +YQ +YQ +CN +vK +aP +YQ +cn +YQ +YQ +YQ +CN +YQ +YQ +YM +kr +Wl +YQ +YQ +CN +YQ +ZV +Pg +YQ +YM +Mp +Jd +Jd +BB +Jd +Jd +Jd +vx +Jd +IK +wH +YQ +OU +io +io +DL +OU +io +uG +pQ +pQ +pQ +pQ +pQ +YK +pQ +pQ +pQ +pQ +dF +du +xH +CV +YQ +jQ +Mp +af +Jd +gV +Mp +sQ +OU +du +du +YQ +YM +wH +YQ +YQ +YQ +rd +YQ +ZV +YQ +YQ +YQ +CN +YQ +YQ +YM +Wl +Pg +wd +Qp +Qp +AR +AR +AR +AR +Xj +ti +ai +qa +ti +kW +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(97,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Pg +YQ +YQ +Wl +YQ +YQ +cn +YQ +Wl +YQ +YQ +rd +YQ +AF +Wl +YQ +rd +CN +YQ +YQ +wH +YQ +YQ +YQ +YQ +YQ +YQ +Pg +YQ +YQ +YM +YQ +YQ +YQ +Mp +Jd +Jd +Se +Wi +Jd +Co +bZ +tK +Jj +YQ +MW +YQ +uC +du +DL +jJ +du +VJ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +Hg +ot +io +DL +YQ +ZV +Mp +Gl +FO +Mp +Mp +wj +OU +du +UH +YQ +YQ +cn +rd +ZV +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Pg +cn +YQ +YQ +YQ +vK +AR +AR +AR +AR +AR +AR +AR +AR +Ih +WD +Ih +Ih +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(98,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +YQ +wH +YQ +kr +YQ +YQ +MW +YQ +YQ +YQ +kr +YQ +YQ +YQ +YQ +CN +wH +rd +cn +YQ +YQ +YQ +YQ +CN +wH +Mp +Jd +Jd +Gv +at +Jd +Jd +gj +Gn +Mp +YQ +YQ +OU +du +io +MS +Sc +io +Kk +uh +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +Hg +Bh +Vb +DL +kr +YQ +Mp +Ta +Jd +lS +Mp +vK +YQ +uc +du +zr +YQ +Mp +Mp +Mp +Mp +Mp +YQ +YQ +CN +vK +kr +Wl +YQ +MW +YQ +hv +rd +AR +AR +AR +AR +AR +AR +AR +kW +ti +Ih +cK +ti +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(99,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +aP +YM +Wl +YQ +YQ +aP +CN +ZV +YQ +YM +YQ +MW +YQ +YQ +YQ +YQ +AF +YQ +YQ +YQ +CN +YQ +YQ +YQ +PD +Mp +tx +Gl +Mp +Gl +Mp +Jd +Jd +Gl +Mp +wj +aP +OU +du +io +DL +MD +io +io +uh +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +dF +du +HD +YQ +YQ +Mp +Mp +Mp +Mp +Mp +Wl +OU +io +io +xH +rT +Mp +Ct +MJ +zI +Mp +YQ +YQ +wH +YQ +aP +YQ +rd +YQ +YQ +VU +YQ +AR +AR +AR +AR +AR +AR +AR +Xj +Xj +kW +AR +Xj +Xj +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(100,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AF +rd +kr +cn +YQ +YQ +YM +kr +cn +YQ +rF +YQ +YQ +YQ +YQ +Wl +YQ +YQ +rF +YQ +YQ +XC +YQ +YQ +rF +ZV +YQ +YQ +YQ +YQ +kr +Wl +AF +YQ +Mp +Jd +Jd +eN +Mp +by +Jd +Jd +by +Mp +AF +YQ +OU +io +UH +YQ +ow +du +uG +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +EA +io +DL +YQ +YQ +YQ +YQ +aP +YQ +rd +wH +OU +du +io +io +du +Du +Jd +Jd +An +Mp +YQ +cn +rd +YQ +YQ +YQ +CN +YQ +kr +rd +wH +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(101,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +aP +YQ +Wl +YQ +Wl +YQ +YQ +AF +YQ +YQ +YM +rd +AF +YQ +YQ +YQ +CN +rd +yi +HC +XC +YQ +YQ +YQ +CN +YQ +YQ +YM +YQ +YQ +YQ +pC +Mp +QI +Jd +LE +Mp +Jd +vx +vx +Jd +Jj +YQ +cn +OU +io +du +DL +OU +du +VJ +pQ +pQ +pQ +pQ +pQ +YK +pQ +pQ +pQ +pQ +Hg +du +io +bw +YQ +YQ +YQ +CN +YQ +MW +YQ +YQ +OU +io +io +yu +sQ +Mp +vs +Jd +af +Mp +Pd +YQ +YQ +YQ +YQ +YQ +KM +YQ +YQ +YQ +CN +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(102,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +Fz +rd +vK +YQ +YQ +YQ +CN +YQ +Wl +cn +aP +YQ +YQ +AF +Pg +YQ +yQ +XC +YQ +YQ +YQ +YQ +YQ +YQ +cn +mY +MW +YQ +YQ +YQ +Mp +SV +Jd +kn +Gl +xS +kq +Tm +tK +IK +ZV +YQ +OU +du +io +DL +hw +io +Ud +VJ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +EA +io +Hm +YQ +YQ +YQ +YQ +YQ +Pg +YQ +YQ +kr +OU +io +sQ +CN +Oe +Mp +Gl +FO +Mp +Mp +YQ +YQ +YQ +YQ +CN +ZV +kr +rF +YQ +YQ +YQ +Pg +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(103,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +Pg +YQ +YQ +YQ +YQ +aP +YQ +YQ +YQ +YQ +Pg +ZV +YQ +YQ +YQ +CN +YQ +YQ +CV +Ka +Ka +Ka +YQ +kr +YQ +YQ +YQ +CN +Wl +YQ +Wl +AF +rF +Mp +iE +eT +gL +Mp +wV +Ah +Tm +vN +Mp +YQ +YQ +Kr +io +io +DL +YQ +QO +du +io +uh +pQ +pQ +pQ +pQ +pQ +pQ +pQ +Hg +Kk +io +DL +rd +YQ +vK +Mp +Mp +Mp +Mp +Mp +YQ +OU +io +zA +YQ +YQ +Mp +pn +Jd +XV +Mp +Pg +YQ +YQ +MW +mY +YQ +rd +YQ +AF +YQ +cn +YQ +wH +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(104,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Wl +YQ +kr +ZV +rd +wH +Wl +YQ +YQ +rd +MW +YQ +YQ +YQ +YQ +YQ +YQ +mE +io +du +io +PL +YQ +Pg +YQ +rd +YQ +YQ +YQ +YQ +CN +cn +Mp +Mp +Mp +Mp +Mp +Mp +Jj +IK +Mp +Mp +YQ +YM +YQ +uc +du +DL +VU +OU +io +du +VJ +pQ +pQ +pQ +pQ +pQ +pQ +pQ +Hg +du +io +DL +mY +Wl +YQ +Mp +zI +MJ +Ct +Mp +Ka +XB +io +du +DL +MW +Mp +Mp +Mp +Mp +Mp +rd +YQ +rF +cn +aP +YQ +YQ +CN +YQ +Wl +YQ +aP +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(105,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +AF +YQ +YQ +YQ +rd +AF +YQ +YQ +YQ +CN +YQ +mY +kr +rd +oj +YQ +ws +du +du +AT +du +du +yy +YQ +Wl +YQ +MW +YQ +YQ +YQ +YQ +YQ +nJ +vK +YQ +Wl +YQ +YQ +YQ +rd +YQ +nJ +YQ +YQ +OU +io +Vg +YQ +YQ +YQ +iU +du +Kk +uh +pQ +EA +no +VJ +pQ +pQ +EA +io +YE +AF +YQ +YQ +YQ +Mp +wv +Jd +Jd +HI +du +io +du +io +DL +YQ +YQ +YQ +AF +YQ +YQ +YQ +rd +YQ +Wl +YQ +YQ +YQ +YQ +YQ +YQ +CN +vK +ZV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(106,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +CN +aP +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +Wl +vK +YQ +YQ +YQ +OU +io +io +uG +pQ +dF +io +io +HQ +YQ +kr +YQ +YQ +YQ +CN +Wl +YQ +YQ +YQ +CN +rF +YQ +YQ +YQ +YQ +kr +YQ +YQ +YQ +OU +io +du +DL +Pg +vK +MD +io +io +VJ +EA +du +io +du +VJ +EA +Ud +du +DL +YQ +YQ +YQ +El +Mp +af +Jd +bW +Mp +sQ +Jo +io +du +DL +YQ +aP +YQ +YM +YQ +YQ +YQ +YQ +CN +YQ +YQ +rd +Wl +YQ +YQ +YQ +YQ +YQ +cn +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(107,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +ZV +cn +rd +YQ +YQ +rd +YQ +cn +YQ +YQ +YQ +YQ +CN +YQ +YQ +YM +vy +du +uG +pQ +pQ +Hg +du +io +DL +rF +wH +YQ +YQ +YQ +wH +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YM +YQ +YQ +YQ +YQ +aP +OU +du +io +xH +YQ +YQ +jB +Fq +io +du +io +io +io +io +du +du +io +Hm +CV +YQ +YQ +wH +YQ +Mp +Mp +FO +Mp +Mp +wj +Pg +uc +io +MS +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +Pg +wH +rd +YQ +YQ +YQ +CN +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(108,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +wH +YQ +YQ +YM +Pg +aP +YQ +YQ +YQ +YQ +YQ +AF +YQ +YQ +OU +io +uh +pQ +pQ +pQ +dF +du +uv +YQ +YQ +YQ +YQ +cn +YQ +YQ +YQ +CN +cn +YQ +kr +YQ +YQ +rF +YQ +AF +YQ +ZV +YQ +OU +du +io +du +DL +gU +Ko +wj +lr +sQ +nw +du +io +io +KO +sQ +sQ +YQ +CN +YQ +YQ +YQ +YQ +Mp +hU +Jd +lS +Mp +YQ +Yf +du +UH +YQ +rd +Mp +Mp +Mp +Mp +Mp +YQ +cn +YQ +YQ +ZV +YQ +cn +YQ +YM +YQ +YQ +YQ +YQ +AF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(109,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +hv +YQ +vK +YQ +Wl +YQ +YQ +YQ +CN +YQ +Wl +YQ +cn +aP +OU +du +VJ +pQ +pQ +pQ +EA +io +DL +YQ +YQ +YQ +CN +rd +ZV +YQ +YQ +YQ +YQ +YQ +YQ +YQ +wH +YQ +vK +YQ +Pg +YQ +Wl +YQ +Jo +io +yu +Ka +Ka +nJ +cn +YQ +CV +YQ +IC +io +yu +YQ +Wl +YQ +YQ +YQ +YQ +YQ +YM +YQ +Mp +Mp +Mp +Mp +Mp +YQ +OU +io +io +xH +wH +Mp +Ct +MJ +zI +Mp +wH +YQ +rF +YQ +rd +YQ +YQ +AF +ZV +kr +MW +YQ +Pg +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(110,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Wl +MW +YQ +cn +rd +YQ +VU +YQ +Pg +YQ +YQ +Dz +YQ +YQ +OU +du +io +VJ +pQ +Hg +io +du +DL +YQ +YQ +YQ +AF +Wl +YQ +YQ +kr +YQ +YQ +YQ +Tw +YQ +YQ +MW +Vm +cn +YQ +YQ +YQ +YQ +YQ +sQ +hw +io +du +xH +YQ +CN +YQ +MW +XB +io +yx +YQ +vK +YQ +kr +YQ +YQ +YQ +YQ +YQ +YQ +YQ +nJ +rd +ZV +YQ +OU +du +io +du +DL +IO +Jd +Jd +An +Mp +YQ +AF +YQ +YQ +YQ +Tw +cn +aP +YQ +YQ +YQ +YQ +CN +cn +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(111,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rd +YQ +YQ +YQ +CN +YQ +wH +YQ +rd +kr +Wl +YQ +YQ +CN +YQ +Wl +iU +du +io +VJ +EA +du +io +CK +YQ +YQ +YQ +AF +YQ +YQ +YQ +CN +YQ +Wl +YQ +wH +ZV +YQ +Oe +Ko +wj +YQ +YQ +YQ +kr +YQ +YQ +OU +du +io +du +DL +Ka +Ka +XB +du +io +io +xH +YQ +YQ +YQ +YQ +rd +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +rQ +du +io +yu +YQ +Mp +TX +Jd +af +Mp +wj +YQ +YQ +YQ +YQ +MW +YQ +YQ +YM +rd +YQ +YQ +YQ +Wl +mY +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(112,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +kr +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +MW +YQ +YQ +ZV +YQ +YQ +YQ +YQ +QO +du +du +io +io +Hm +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +MW +cY +Wl +YQ +YQ +YQ +CN +YQ +nJ +YQ +YQ +CN +YQ +YQ +Pg +rd +wH +Jo +io +du +WE +du +du +io +io +du +io +du +Nd +rd +wH +YQ +ZV +YQ +MW +YQ +aP +YQ +Ka +Ka +Ka +YQ +XB +io +io +DL +mt +Mp +Mp +FO +Mp +Mp +YQ +YQ +YQ +CN +YQ +kr +YQ +YQ +vK +kr +Wl +YQ +YQ +YQ +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(113,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +ZV +AF +YQ +rd +YQ +YQ +ZV +AF +YQ +YQ +vK +YQ +rd +kr +YQ +YM +wH +YQ +sQ +sQ +uu +sQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Wl +AF +vK +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +MW +YQ +Jo +io +io +hk +io +du +io +yu +CR +io +io +xH +Ka +cn +Ka +Ka +Ka +YQ +Ka +hC +du +io +io +MX +du +io +yu +YQ +YQ +Mp +pn +Jd +XV +Mp +YQ +YQ +YQ +YQ +wH +YQ +YQ +YQ +CN +YQ +YQ +YQ +aP +CN +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(114,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +aP +YQ +kr +Pg +mY +YQ +YQ +YQ +CN +cn +Pg +YQ +YQ +YQ +kr +Pg +rd +rF +YQ +YQ +YQ +YQ +CN +MW +YQ +kr +Wl +YQ +YM +YQ +YQ +YQ +CN +YQ +YQ +YM +YQ +Wl +YQ +mY +rF +Mp +Mp +Mp +Mp +Mp +YQ +Wl +Jo +du +ht +Jo +io +yu +YQ +OU +du +du +io +du +WE +io +io +du +WE +io +io +io +du +io +du +hk +io +DL +YQ +Wl +Mp +Mp +Mp +Mp +Mp +wH +AF +YQ +MW +kf +YQ +YQ +YQ +Pg +cn +YQ +Wl +YQ +YQ +ZV +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(115,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +CN +YQ +YQ +YQ +Wl +YQ +rd +aP +YQ +Wl +rd +YQ +YQ +YQ +CN +Wl +YQ +YQ +AF +YQ +YQ +YQ +YQ +YQ +YM +ZV +YQ +YQ +rd +YQ +YQ +YQ +ZV +AF +YQ +YQ +wH +YQ +YQ +cn +El +Mp +ml +Qt +ww +Mp +ZV +YQ +Tx +io +DL +uX +du +eJ +Wl +YQ +Jo +io +io +io +du +hk +du +io +io +du +du +io +yu +sQ +sQ +YQ +sQ +YQ +YQ +YQ +mY +YQ +nJ +YQ +vK +rd +YQ +YQ +YQ +td +YQ +YQ +cn +rd +YQ +wH +rd +AF +YQ +cV +Pg +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(116,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Wl +YQ +YQ +YQ +CN +cn +ZV +YQ +YQ +YM +AF +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +Wl +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +Pg +YQ +YM +cn +YQ +YQ +YQ +CN +vK +YQ +Pg +YQ +Mp +QE +QE +eR +Mp +Mp +Jj +Mp +Ag +IK +Jj +Ag +Gl +IK +Mp +wj +sQ +sQ +JZ +sQ +YQ +sQ +sQ +sQ +sQ +sQ +sQ +wH +YQ +rd +YQ +YQ +ZV +kr +YQ +wH +YQ +YQ +YQ +CN +cn +aP +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +MW +CN +YQ +YQ +YQ +CN +Wl +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(117,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AF +cn +YQ +YQ +YQ +YQ +YQ +kr +YQ +YQ +YQ +YQ +Wl +YQ +nt +ZV +YQ +YQ +YQ +Wl +YQ +YQ +YQ +YQ +YQ +cn +Pg +YQ +YQ +YQ +AF +YQ +YQ +YQ +YQ +YQ +YQ +YQ +rF +MW +YQ +YQ +Mp +lV +Mp +Mp +Gl +Mp +Xm +CH +Jd +Jd +Jd +Jd +CH +Or +Mp +YQ +rd +YQ +YQ +YQ +og +YQ +rd +YQ +YQ +cn +YQ +Wl +YQ +YQ +YQ +Pg +YQ +YQ +aP +YQ +YQ +YQ +YQ +YQ +YQ +Pg +YQ +rd +YQ +YQ +YQ +YQ +aP +YQ +YQ +YQ +YQ +YQ +YQ +YQ +rF +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(118,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +vK +YQ +MW +AF +YQ +YQ +cn +Wl +YQ +kr +YQ +aP +YQ +YQ +CN +YQ +cn +YQ +YQ +YQ +YQ +CN +YQ +YQ +rd +YQ +YQ +YM +cn +Wl +YQ +YQ +CN +MW +YQ +YQ +YQ +YQ +Wl +wH +Mp +Jd +QE +OA +Ct +Mp +Jd +Jd +Jd +Jd +Jd +Jd +Jd +yF +Jj +AF +YQ +YQ +YM +Oe +Ko +wj +YQ +XC +aP +YQ +YQ +YQ +CN +MW +vK +YQ +rd +YQ +YQ +YQ +Wl +YQ +YQ +YQ +CN +Wl +YQ +YQ +CN +YQ +kr +rd +YQ +Wl +YQ +YQ +YM +wH +YQ +cn +YQ +ZV +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(119,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +hv +rd +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +rF +YQ +Pg +YQ +YQ +YM +rd +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +kr +YQ +YQ +YQ +Pg +YQ +YQ +YQ +CN +ZV +YQ +kr +Mp +hy +eB +uT +uy +yz +Jd +Jd +sR +Ei +Ve +Rn +Jd +yL +IK +YQ +YQ +YQ +YQ +Wl +nJ +YQ +kr +Yb +GU +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Vm +YQ +YQ +CN +wH +YQ +AF +YQ +rd +YQ +YQ +cn +wH +aP +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +aP +YQ +CN +YQ +kr +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(120,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Pg +YQ +YQ +YQ +YQ +YQ +Wl +YQ +YQ +YQ +rd +YQ +YQ +AF +YQ +Wl +YQ +YQ +YQ +CN +YQ +YM +aP +YQ +YQ +YQ +YQ +YQ +CN +MW +YQ +rd +kr +YQ +YQ +Wl +YQ +YQ +YQ +YQ +Mp +Jd +QE +wq +Jd +Gl +Jd +Jd +VK +XY +QE +Jv +Jd +Bq +IK +aP +YQ +wH +YQ +YQ +ZV +YQ +YQ +XC +YQ +YQ +YQ +Pg +YQ +rd +YQ +mt +Ko +wj +YQ +YQ +MW +YQ +YQ +cn +YQ +ZV +rd +YQ +YQ +mY +Wl +ZV +YQ +YQ +YQ +rF +kr +YQ +YQ +YQ +YQ +vK +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(121,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +rd +YQ +YQ +Wo +rd +MW +YQ +Wl +Pg +cn +YQ +YQ +YQ +CN +cn +cn +YQ +YQ +YQ +YQ +YQ +YQ +Pg +YQ +kr +YQ +YQ +YQ +YQ +vK +YQ +YQ +YQ +CN +YQ +cn +YQ +kr +YQ +jF +Mp +Mp +Jd +BB +Jd +Mp +KY +Jd +mu +QE +QE +yS +Jd +KY +Mp +YQ +Pg +mY +YQ +cn +YQ +rd +YQ +wH +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +nJ +rd +YQ +YQ +Wl +YQ +CN +YQ +YQ +YQ +CN +Wl +YQ +MW +CN +YQ +Pg +cn +rd +YQ +YQ +rd +YQ +YQ +Wl +rd +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(122,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +CN +vK +YQ +YQ +YQ +YQ +CN +AF +ZV +YQ +YQ +Wl +YQ +YQ +YQ +CN +cn +YQ +kr +YQ +YQ +YQ +CN +KM +cn +YQ +YQ +YQ +CN +VU +YQ +YQ +YQ +YQ +fH +rF +YQ +MW +AF +YQ +Mp +Mp +Mp +Mp +Mp +Mp +IK +IK +Mp +Mp +IK +Jj +Mp +Mp +mk +rd +YQ +YQ +ZV +YQ +vK +YQ +YQ +cn +YQ +YQ +YQ +MW +YQ +YQ +YQ +YQ +YM +Wl +aP +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +YQ +aP +YM +vK +MW +YQ +YQ +CN +YQ +MW +YQ +CN +AF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(123,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +vK +YQ +YQ +cn +YQ +kr +YQ +YQ +YQ +YQ +YQ +YQ +YM +cn +vK +YQ +YQ +YQ +AF +vK +aP +YQ +VU +YQ +YQ +YQ +AF +mY +ZV +YQ +YQ +YQ +YQ +AF +aP +YQ +YQ +YQ +YQ +YQ +vK +cn +aP +YQ +nJ +YQ +CN +YQ +Pg +YQ +YQ +xD +YQ +cn +YQ +nJ +YQ +YQ +YQ +YQ +YQ +CN +YQ +kr +YQ +AF +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +CN +YQ +kr +YQ +cn +YQ +YQ +YM +wH +YQ +Sh +wH +wH +YQ +kr +YQ +Wl +YQ +YQ +YQ +cn +ZV +YQ +YQ +YQ +rF +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(124,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +Wl +ZV +YQ +YQ +AF +YQ +cn +rd +YQ +aP +YQ +AF +YQ +kr +MW +rd +Wl +YQ +YQ +cn +Wl +YQ +rd +YQ +YQ +YQ +cn +vK +YQ +wH +MW +ZV +YQ +rd +YQ +YQ +YQ +CN +rd +YQ +Pg +YQ +YQ +wH +YQ +AF +YQ +YQ +CN +YQ +kr +YQ +MW +YQ +YQ +CN +YQ +YQ +YQ +YQ +MW +YQ +rd +aP +YQ +YQ +YQ +YQ +wH +aP +YQ +YQ +YQ +wH +YQ +rd +vK +ZV +Wl +YQ +aP +vK +VU +rd +YQ +YM +YQ +YQ +rd +YQ +CN +YQ +rF +wH +rd +YQ +Pg +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(125,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rF +rd +EV +YQ +YQ +YQ +YQ +CN +Wl +YQ +YQ +YQ +YQ +YQ +Tw +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +YQ +YQ +hv +rd +YQ +YQ +YQ +CN +YQ +kr +YQ +YQ +cn +YQ +YQ +YQ +YM +cn +ZV +rd +cn +YQ +YQ +YQ +wH +aP +YQ +rd +AF +YQ +YQ +cn +vK +wH +rd +YQ +YQ +Wl +YQ +rd +YQ +YQ +Wl +rd +YQ +ZV +YQ +rd +Wl +YQ +YQ +YQ +CN +YQ +YQ +YQ +KM +Pg +AF +ZV +YQ +YQ +Xu +YQ +YQ +YQ +Pg +Wl +kr +YQ +YQ +aP +CN +rd +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(126,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Wl +YQ +Pg +cn +YQ +YQ +YQ +YQ +YQ +CN +wH +YQ +YQ +aP +YQ +YQ +YQ +CN +YQ +YQ +YQ +wH +MW +YQ +YQ +YQ +YQ +YQ +Wl +Pg +YQ +YQ +YQ +YQ +cn +YQ +Pg +ZV +YQ +mY +wH +YQ +AF +YQ +kr +YQ +Wl +MW +YQ +kr +YQ +YQ +YQ +YQ +wH +YQ +Wl +rF +AF +kr +YQ +YQ +YQ +CN +YQ +YQ +YQ +CN +AF +YQ +YQ +YQ +CN +YQ +YM +Pg +YQ +YQ +YQ +YQ +YQ +YQ +Oz +YQ +YQ +MW +CN +rd +aP +YQ +YQ +AF +YQ +YQ +YM +YQ +YQ +cn +wH +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(127,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +CN +rd +KM +kr +YQ +YQ +YQ +YQ +YQ +YQ +mY +AF +YQ +YQ +YQ +ZV +YQ +kr +cn +YQ +Pg +Wl +YQ +kr +ZV +rd +YQ +AF +Wl +YQ +kr +YQ +PB +YQ +Wl +YQ +YQ +YQ +CN +aP +YQ +YQ +YQ +YQ +CN +YQ +YQ +ZV +AF +YQ +aP +YQ +CN +Pg +YQ +rd +YQ +cn +YQ +YQ +Pg +YQ +YQ +YQ +cn +ZV +YQ +aP +YQ +YQ +YQ +YQ +Pg +AF +MW +kr +wH +YQ +YQ +YQ +YQ +YQ +YQ +YQ +Wl +YQ +YQ +YQ +YQ +CN +YQ +wH +rd +YQ +YQ +YQ +Wl +vK +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(128,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +Wl +YQ +YQ +YQ +rd +YQ +YQ +YQ +YQ +CN +cn +YQ +Wl +YQ +kr +YQ +AF +YQ +YQ +YQ +YQ +CN +YQ +YQ +MW +YQ +YQ +YQ +CN +YQ +YQ +YQ +YQ +YQ +hv +YQ +MW +rF +YQ +vK +Wl +YQ +YQ +KM +YQ +YQ +YQ +CN +rF +YQ +YQ +YQ +YQ +YQ +YQ +YQ +CN +YQ +AF +rd +YQ +wH +kr +YQ +YQ +mY +vl +Pg +YQ +YQ +aP +CN +cn +YQ +YQ +YQ +CN +AF +YQ +YQ +YQ +CN +YQ +Pg +YQ +wH +YQ +AF +YQ +YQ +aP +cn +YQ +YQ +MW +CN +YQ +rF +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(129,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rd +wH +ZV +mY +YQ +YQ +YQ +CN +Wl +YQ +YQ +YQ +MW +vK +YQ +YQ +rd +YQ +wH +kf +rd +YQ +aP +Wl +YQ +YQ +YQ +CN +Wl +YQ +vK +YQ +YQ +YM +wH +YQ +YQ +YQ +AF +YQ +YQ +rd +YQ +YQ +Pg +AF +vK +rd +YQ +wH +Pg +rd +YQ +YQ +YM +AF +YQ +YQ +YQ +wH +YQ +YQ +YQ +CN +Wl +aP +YQ +YQ +CN +VU +dY +HT +YQ +aP +YQ +Wl +YQ +YQ +YQ +YQ +rd +YQ +MW +YQ +Wl +YQ +YQ +YQ +Oz +YQ +YQ +vK +YQ +YQ +YM +Wl +YQ +YQ +rd +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(130,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +kr +MW +rd +YQ +vK +YQ +YQ +YM +Pg +kr +YQ +YQ +YQ +YQ +CN +Pg +YQ +YQ +YQ +CN +Pg +rd +YQ +YQ +cn +YQ +YQ +rd +YQ +YQ +YQ +MW +YQ +YQ +YQ +cn +YQ +YQ +YM +YQ +YQ +YQ +CN +YQ +aP +YQ +aP +cn +YQ +Wl +YQ +YQ +vK +YQ +kr +cn +aP +MW +YQ +YQ +YQ +rF +ZV +PB +YQ +YQ +YQ +vK +YQ +rd +wH +cn +kr +YQ +aP +YQ +rd +kf +YQ +Wl +YQ +cn +YQ +YQ +YQ +YQ +YQ +Wl +YQ +YQ +CN +YQ +YQ +AF +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(131,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +CN +YQ +Xh +Pg +YQ +aP +YQ +YQ +YQ +YQ +ZV +rd +YQ +YQ +YQ +rd +YQ +YQ +YQ +vK +HT +kr +YQ +AF +wH +YQ +kr +YQ +YQ +YQ +CN +rd +aP +YQ +YQ +CN +YQ +YQ +Pg +YQ +YQ +YQ +ZV +MW +YQ +YQ +YM +YQ +kr +YQ +YQ +YQ +CN +ZV +YQ +Wl +YQ +YQ +YQ +YM +cn +rd +YQ +vK +YQ +YQ +YM +aP +YQ +YQ +CN +ZV +YQ +YQ +YQ +CN +ZV +YQ +YQ +YQ +CN +YQ +YQ +YM +wH +YQ +Ak +YQ +cn +YQ +YQ +wH +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(132,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +YQ +YQ +YQ +CN +cn +wH +YQ +YQ +YQ +CN +wH +YQ +YQ +aP +YM +YQ +kr +AF +cn +YQ +YQ +YQ +YQ +YQ +CN +YQ +AF +YQ +YQ +YQ +YQ +YQ +kr +YQ +rd +wH +ZV +aP +vK +kr +wH +YQ +YQ +YQ +AF +Pg +YQ +YQ +YQ +YQ +rd +YQ +cn +YQ +YQ +YQ +CN +AF +YQ +YQ +kr +YQ +YQ +CN +wH +AF +YQ +YQ +YQ +YQ +Wl +wG +YQ +YQ +YQ +wH +YQ +YQ +YQ +YQ +kr +vK +aP +rd +YQ +YQ +YQ +rd +Pg +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(133,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +Pg +vl +YQ +YQ +YQ +YQ +YQ +rd +AF +YQ +YQ +YQ +YQ +kr +YQ +Wl +YQ +cn +MW +ZV +YQ +YQ +YQ +CN +YQ +YQ +MW +YQ +YQ +aP +YQ +YQ +YM +YQ +cn +Pg +YQ +Wl +YQ +AF +YQ +cn +YQ +YQ +YQ +CN +rd +YQ +YQ +YQ +CN +rF +wH +MW +Pg +YQ +YQ +YQ +YQ +Wl +mY +aP +YQ +YQ +YQ +YQ +YQ +cn +Pg +YQ +YQ +YM +YQ +AF +rd +AR +AR +AR +AR +AR +AR +Pg +YQ +mY +Wl +YQ +YQ +CN +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(134,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +CN +vK +YQ +YQ +YQ +CN +YQ +Pg +YQ +aP +AF +YQ +YQ +AR +AR +AR +AR +AR +YQ +Pg +YQ +YQ +EV +cn +YQ +YQ +YQ +CN +ZV +YQ +Wl +YQ +AF +YQ +AR +AR +AR +AR +AR +AR +rF +YQ +YQ +YQ +YQ +Wl +YQ +YQ +YQ +YQ +YQ +YQ +YM +YQ +aP +rd +YQ +YQ +YQ +CN +YQ +YQ +YM +MW +YQ +YQ +YQ +CN +wH +rd +Pg +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(135,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +cn +cn +Pv +YQ +YQ +Wl +YM +vK +cn +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +vK +YQ +kr +YQ +YQ +YQ +YQ +cn +rd +Pg +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +ZV +rF +wH +cn +mY +Pv +YQ +YQ +YQ +YQ +AF +vK +YQ +YQ +YQ +KM +AF +YQ +Pg +rd +YQ +YQ +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(136,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +wH +rd +YQ +AF +ZV +YQ +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +rd +Wl +YQ +wH +mY +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +YQ +CN +cn +YQ +kr +YQ +wH +Wl +YQ +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(137,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +ZV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +YQ +YQ +YQ +ZV +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(138,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(139,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(140,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(141,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(142,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(143,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(144,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(145,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(146,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(147,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(148,1,1) = {" +bG +bG +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +AR +bG +bG +"} +(149,1,1) = {" +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +"} +(150,1,1) = {" +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +bG +"} + diff --git a/_maps/RandomZLevels/away_mission/research.dmm b/_maps/RandomZLevels/away_mission/research.dmm index 4710d9829b..f1c0f989df 100644 --- a/_maps/RandomZLevels/away_mission/research.dmm +++ b/_maps/RandomZLevels/away_mission/research.dmm @@ -5371,7 +5371,7 @@ /area/awaymission/research/interior/dorm) "kS" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/plasteel, /area/awaymission/research/interior/dorm) "kT" = ( diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 213211fc42..bf5b4f7d49 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -13,7 +13,7 @@ #include "map_files\BoxStation\BoxStation.dmm" #include "map_files\LambdaStation\lambda.dmm" - #ifdef TRAVISBUILDING + #ifdef CIBUILDING #include "templates.dm" #endif #endif diff --git a/_maps/boxstation.json b/_maps/boxstation.json index 143fcae5bc..3c71c654fa 100644 --- a/_maps/boxstation.json +++ b/_maps/boxstation.json @@ -1,11 +1,11 @@ -{ - "map_name": "Box Station", - "map_path": "map_files/BoxStation", - "map_file": "BoxStation.dmm", - "shuttles": { - "cargo": "cargo_box", - "ferry": "ferry_fancy", - "whiteship": "whiteship_box", - "emergency": "emergency_box" - } -} +{ + "map_name": "Box Station", + "map_path": "map_files/BoxStation", + "map_file": "BoxStation.dmm", + "shuttles": { + "cargo": "cargo_box", + "ferry": "ferry_fancy", + "whiteship": "whiteship_box", + "emergency": "emergency_box" + } +} diff --git a/_maps/cogstation.dm b/_maps/cogstation.dm index 5c01aaec46..96ef15a5b8 100644 --- a/_maps/cogstation.dm +++ b/_maps/cogstation.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/cogstation.json" \ No newline at end of file +#define FORCE_MAP "_maps/cogstation.json" diff --git a/_maps/kilostation.dm b/_maps/kilostation.dm index d784be6e8f..5970c0d49e 100644 --- a/_maps/kilostation.dm +++ b/_maps/kilostation.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/kilostation.json" \ No newline at end of file +#define FORCE_MAP "_maps/kilostation.json" diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index ce5539cee7..f7245ef535 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -69,35 +69,18 @@ /turf/closed/wall/r_wall, /area/security/prison) "aaj" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/closed/wall/r_wall, -/area/security/prison) -"aak" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/prison) -"aal" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/security/prison) "aam" = ( /obj/structure/cable{ icon_state = "0-2" }, -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/prison) @@ -115,11 +98,17 @@ /obj/structure/sign/warning/electricshock{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/grass, /area/security/prison) "aap" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/carrot, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/grass, /area/security/prison) "aaq" = ( @@ -140,17 +129,29 @@ /obj/structure/sink{ pixel_y = 20 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/prison) "aar" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/glowshroom, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/grass, /area/security/prison) "aas" = ( /obj/structure/sign/warning/electricshock{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/prison) "aat" = ( @@ -350,7 +351,7 @@ /area/security/prison) "aaV" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/plasteel, /area/security/prison) "aaW" = ( @@ -1491,6 +1492,10 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/fore) +"adu" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/wood, +/area/library) "adw" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -2977,14 +2982,14 @@ /turf/open/floor/plating, /area/security/main) "afS" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Brig EVA Storage"; - req_access_txt = "3" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Brig EVA Storage"; + req_access_txt = "1" + }, /turf/open/floor/plasteel/dark, /area/security/brig) "afT" = ( @@ -4817,7 +4822,7 @@ pixel_x = -32 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "aiQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -5084,7 +5089,7 @@ pixel_x = -32 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "ajw" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -5662,6 +5667,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/security/brig) "akw" = ( @@ -5841,10 +5849,13 @@ /area/science/xenobiology) "akQ" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/closed/wall, -/area/security/brig) +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "akR" = ( /obj/machinery/camera{ c_tag = "Security Office"; @@ -6104,7 +6115,7 @@ "alq" = ( /obj/machinery/door/airlock/security/glass{ name = "Evidence Storage"; - req_access_txt = "4" + req_one_access_txt = "4;1" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -6138,25 +6149,11 @@ /turf/open/floor/plasteel, /area/security/brig) "alt" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, /area/security/brig) @@ -6176,16 +6173,11 @@ /area/ai_monitored/nuke_storage) "alv" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/door/poddoor/preopen{ id = "Secure Gate"; name = "brig shutters" }, +/obj/structure/cable, /turf/open/floor/plating, /area/security/brig) "alw" = ( @@ -6268,6 +6260,9 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/security/brig) "alB" = ( @@ -6304,7 +6299,9 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "alF" = ( -/obj/machinery/atmospherics/components/unary/tank/air, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "alG" = ( @@ -6566,9 +6563,6 @@ /turf/open/floor/engine, /area/science/xenobiology) "amm" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/structure/cable{ icon_state = "0-4" }, @@ -6603,6 +6597,9 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "amq" = ( @@ -6655,9 +6652,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/security/brig) @@ -6698,28 +6692,21 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "amD" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, +/obj/item/trash/sosjerky, /turf/open/floor/plating, /area/maintenance/port/fore) "amE" = ( -/obj/structure/bed, -/obj/effect/landmark/xeno_spawn, -/obj/item/bedsheet, +/obj/item/electronics/airalarm, +/obj/item/circuitboard/machine/seed_extractor, +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, /turf/open/floor/plating, /area/maintenance/port/fore) "amF" = ( -/obj/machinery/computer/slot_machine{ - balance = 15; - money = 500 - }, -/obj/item/coin/iron, -/obj/item/coin/diamond, -/obj/item/coin/diamond, -/obj/item/coin/diamond, +/obj/machinery/atmospherics/components/unary/tank/air, /turf/open/floor/plating, /area/maintenance/port/fore) "amG" = ( @@ -6764,6 +6751,12 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/security/brig) "amJ" = ( @@ -6854,25 +6847,15 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"amR" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/brig) "amS" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/turf/closed/wall/r_wall, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, /area/security/brig) "amT" = ( /obj/structure/cable{ @@ -6996,8 +6979,10 @@ /turf/open/floor/plating, /area/maintenance/solars/port/fore) "anj" = ( -/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ - dir = 8 +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -7008,23 +6993,25 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "anl" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 9 - }, +/obj/structure/bed, +/obj/effect/landmark/xeno_spawn, +/obj/item/bedsheet, /turf/open/floor/plating, /area/maintenance/port/fore) "anm" = ( -/obj/item/trash/sosjerky, +/obj/machinery/computer/slot_machine{ + balance = 15; + money = 500 + }, +/obj/item/coin/iron, +/obj/item/coin/diamond, +/obj/item/coin/diamond, +/obj/item/coin/diamond, /turf/open/floor/plating, /area/maintenance/port/fore) "ann" = ( -/obj/item/electronics/airalarm, -/obj/item/circuitboard/machine/seed_extractor, -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port/fore) "ano" = ( @@ -7197,16 +7184,21 @@ /turf/open/floor/plating, /area/maintenance/solars/port/fore) "anJ" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "anK" = ( -/obj/effect/decal/cleanable/egg_smudge, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, /turf/open/floor/plating, /area/maintenance/port/fore) "anL" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/vomit, +/obj/structure/chair{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "anM" = ( @@ -7263,9 +7255,11 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plating, /area/security/brig) "anQ" = ( @@ -7273,9 +7267,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/plasteel, /area/security/brig) "anR" = ( @@ -7409,8 +7400,8 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aok" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 6 +/obj/structure/chair{ + dir = 1 }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -7431,8 +7422,10 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aoo" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/monkey_recycler, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/chair{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "aop" = ( @@ -7504,14 +7497,13 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/structure/cable, /obj/machinery/door/poddoor/preopen{ id = "Secure Gate"; name = "brig shutters" }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "0-8" }, /turf/open/floor/plating, /area/security/brig) @@ -7693,21 +7685,21 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aoR" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 }, +/obj/machinery/meter, /turf/open/floor/plating, /area/maintenance/port/fore) "aoS" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/plating, /area/maintenance/port/fore) "aoT" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -7715,17 +7707,13 @@ /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 9 }, -/obj/structure/bed, -/obj/effect/landmark/xeno_spawn, /turf/open/floor/plating, /area/maintenance/port/fore) "aoV" = ( /turf/open/space, /area/space) "aoW" = ( -/obj/structure/table, -/obj/item/stamp, -/obj/item/poster/random_official, +/obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port/fore) "aoX" = ( @@ -7749,13 +7737,13 @@ /area/security/brig) "aoZ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/machinery/door/poddoor/preopen{ id = "Secure Brig Control"; name = "brig shutters" }, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/open/floor/plating, /area/security/warden) "apa" = ( @@ -7774,6 +7762,9 @@ /area/science/xenobiology) "apc" = ( /obj/structure/chair/office/dark, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apd" = ( @@ -7927,6 +7918,12 @@ pixel_x = 6; pixel_y = 3 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apw" = ( @@ -8046,6 +8043,12 @@ pixel_y = -24; req_access_txt = "2" }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apI" = ( @@ -8069,31 +8072,37 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "apL" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/machinery/power/apc{ + areastring = "/area/maintenance/port/fore"; + dir = 1; + name = "Port Bow Maintenance APC"; + pixel_x = -1; + pixel_y = 26 }, -/turf/open/floor/plasteel, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, /area/maintenance/port/fore) "apM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/closed/wall, /area/maintenance/port/fore) "apN" = ( /turf/open/floor/plating, /area/construction/mining/aux_base) "apO" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 }, -/turf/open/floor/plating, +/turf/closed/wall, /area/maintenance/port/fore) "apP" = ( -/obj/effect/spawner/structure/window, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, /turf/open/floor/plating, /area/maintenance/port/fore) "apQ" = ( @@ -8121,9 +8130,6 @@ req_access_txt = "63" }, /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, @@ -8146,14 +8152,19 @@ /turf/open/floor/plating, /area/maintenance/fore) "apT" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Cell Interior Shutters"; + name = "brig shutters" + }, +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-8" }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "0-4" }, -/turf/closed/wall/r_wall, -/area/security/warden) +/turf/open/floor/plating, +/area/security/brig) "apU" = ( /turf/open/floor/plating, /area/security/vacantoffice/b) @@ -8169,20 +8180,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"apX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Brig Control"; - name = "brig shutters" - }, -/turf/open/floor/plating, -/area/security/warden) "apY" = ( /obj/machinery/light/small{ dir = 1 @@ -8394,13 +8391,11 @@ /area/crew_quarters/fitness/pool) "aqt" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/machinery/door/poddoor/preopen{ id = "Secure Brig Control"; name = "brig shutters" }, +/obj/structure/cable, /turf/open/floor/plating, /area/security/warden) "aqu" = ( @@ -8550,23 +8545,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/fore) -"aqK" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) -"aqL" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aqM" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 10 - }, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/maintenance/port/fore) "aqN" = ( /obj/structure/closet/secure_closet/warden, /obj/structure/sign/poster/official/ion_rifle{ @@ -8587,23 +8565,20 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "aqO" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plating, /area/maintenance/port/fore) "aqP" = ( -/obj/machinery/power/apc{ - areastring = "/area/maintenance/port/fore"; - dir = 1; - name = "Port Bow Maintenance APC"; - pixel_x = -1; - pixel_y = 26 +/obj/structure/cable{ + icon_state = "1-8" }, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "4-8" }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -8866,6 +8841,9 @@ c_tag = "Brig Control"; dir = 1 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "arz" = ( @@ -8921,30 +8899,18 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"arF" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 5 - }, -/turf/closed/wall, -/area/maintenance/port/fore) "arG" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, -/turf/closed/wall, +/obj/effect/decal/cleanable/glass, +/obj/structure/table_frame, +/turf/open/floor/plating, /area/maintenance/port/fore) "arH" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, /area/maintenance/port/fore) "arI" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 @@ -8952,11 +8918,8 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "arJ" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/door/airlock/maintenance/abandoned{ + req_access_txt = "12" }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 @@ -8964,44 +8927,38 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "arK" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 9 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, /area/maintenance/port/fore) "arL" = ( -/obj/structure/cable{ - icon_state = "1-8" +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, -/turf/open/floor/plating, /area/maintenance/port/fore) "arM" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/plating, /area/maintenance/port/fore) "arN" = ( -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" }, /turf/open/floor/plating, /area/maintenance/port/fore) "arO" = ( -/obj/item/clothing/gloves/color/rainbow, -/obj/item/clothing/head/soft/rainbow, -/obj/item/clothing/shoes/sneakers/rainbow, -/obj/item/clothing/under/color/rainbow, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/maintenance/port/fore) "arP" = ( @@ -9102,12 +9059,15 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "asc" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plating, /area/maintenance/port/fore) "asd" = ( @@ -9117,11 +9077,9 @@ /turf/closed/wall, /area/crew_quarters/dorms) "ase" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 + icon_state = "1-2" }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -9164,26 +9122,17 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "ash" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/components/trinary/filter{ dir = 4 }, /turf/open/floor/plating, /area/maintenance/port/fore) "asi" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -9437,7 +9386,7 @@ /obj/item/storage/box/masks, /obj/structure/table, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "asM" = ( /obj/structure/table, /obj/item/crowbar, @@ -9446,8 +9395,11 @@ /obj/structure/sign/warning/nosmoking{ pixel_y = 30 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "asN" = ( /obj/machinery/airalarm{ dir = 4; @@ -9456,8 +9408,9 @@ /turf/open/floor/carpet, /area/crew_quarters/dorms) "asO" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, /area/maintenance/port/fore) "asP" = ( /obj/structure/chair/stool, @@ -9502,6 +9455,9 @@ name = "Medbay"; req_access_txt = "5" }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "asV" = ( @@ -9529,6 +9485,9 @@ name = "Medbay"; req_access_txt = "5" }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "asY" = ( @@ -9622,10 +9581,10 @@ /turf/open/floor/wood, /area/crew_quarters/dorms) "atn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 }, -/turf/closed/wall, +/turf/open/floor/plating, /area/maintenance/port/fore) "atp" = ( /obj/machinery/door/airlock/external{ @@ -9634,10 +9593,11 @@ /turf/open/floor/plating, /area/construction/mining/aux_base) "atq" = ( +/obj/item/wrench, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/closed/wall, +/turf/open/floor/plating, /area/maintenance/port/fore) "atr" = ( /obj/structure/cable{ @@ -9754,14 +9714,18 @@ /turf/open/floor/plating, /area/security/vacantoffice/b) "atL" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plating, /area/maintenance/port/fore) "atM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" }, -/turf/closed/wall, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "atN" = ( /obj/structure/cable{ @@ -9777,25 +9741,24 @@ /turf/closed/wall, /area/maintenance/port/fore) "atP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/light/small{ + dir = 1 }, -/turf/closed/wall, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "atS" = ( /turf/closed/wall, /area/space/nearstation) "atU" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, /turf/open/floor/plating, /area/maintenance/port/fore) "atW" = ( /obj/structure/chair/stool, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "atY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -10099,50 +10062,43 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "auV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plating, /area/maintenance/port/fore) "auX" = ( -/obj/structure/mirror{ - icon_state = "mirror_broke"; - pixel_y = 28 +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/obj/machinery/iv_drip, /turf/open/floor/plating, /area/maintenance/port/fore) "auY" = ( -/obj/structure/mirror{ - icon_state = "mirror_broke"; - pixel_y = 28 +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 }, -/obj/item/shard{ - icon_state = "medium" - }, -/obj/item/circuitboard/computer/operating, -/turf/open/floor/plating, +/turf/closed/wall, /area/maintenance/port/fore) "auZ" = ( -/obj/structure/frame/computer, +/obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/port/fore) "ava" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/chair, -/obj/item/reagent_containers/blood/random, +/obj/structure/table/glass, +/obj/item/storage/bag/trash, /turf/open/floor/plating, /area/maintenance/port/fore) "avb" = ( -/turf/open/floor/plasteel/airless{ - icon_state = "damaged3" - }, -/area/space/nearstation) +/obj/structure/bookcase/random/reference, +/turf/open/floor/wood, +/area/maintenance/port/fore) "avc" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, /area/maintenance/port/fore) "avg" = ( /obj/machinery/door/airlock{ @@ -10462,7 +10418,8 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avS" = ( -/obj/item/wrench, +/obj/structure/reagent_dispensers/watertank, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) "avT" = ( @@ -10478,38 +10435,31 @@ /turf/open/space, /area/space/nearstation) "avU" = ( -/obj/item/paper/crumpled, -/turf/open/floor/plasteel/airless{ - icon_state = "damaged2" +/obj/structure/chair/comfy/plywood{ + dir = 8 }, -/area/space/nearstation) +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/port/fore) "avV" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/turf/open/floor/plating, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/burger/ghost, +/turf/open/floor/wood, /area/maintenance/port/fore) "avW" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, -/turf/open/floor/plating, /area/maintenance/port/fore) "avX" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/chair/stool, +/obj/structure/closet/firecloset, /turf/open/floor/plating, /area/maintenance/port/fore) "avY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, +/obj/effect/turf_decal, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "avZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -11016,18 +10966,26 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "axe" = ( -/obj/machinery/sleeper{ - dir = 4 +/obj/structure/mirror{ + icon_state = "mirror_broke"; + pixel_y = 28 }, +/obj/machinery/iv_drip, /turf/open/floor/plating, /area/maintenance/port/fore) "axf" = ( -/obj/effect/landmark/blobstart, +/obj/structure/frame/computer, /turf/open/floor/plating, /area/maintenance/port/fore) "axg" = ( -/obj/structure/table/glass, -/obj/item/storage/bag/trash, +/obj/structure/mirror{ + icon_state = "mirror_broke"; + pixel_y = 28 + }, +/obj/item/shard{ + icon_state = "medium" + }, +/obj/item/circuitboard/computer/operating, /turf/open/floor/plating, /area/maintenance/port/fore) "axh" = ( @@ -11045,17 +11003,17 @@ }, /area/hallway/secondary/entry) "axi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/chair, +/obj/item/reagent_containers/blood/random, /turf/open/floor/plating, /area/maintenance/port/fore) "axj" = ( -/obj/machinery/door/airlock/maintenance/abandoned{ - name = "Firefighting equipment"; - req_access_txt = "12" - }, -/turf/open/floor/plating, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, /area/maintenance/port/fore) "axk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -11064,30 +11022,20 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "axl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, /area/maintenance/port/fore) "axn" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/structure/closet/crate/coffin, /turf/open/floor/plating, /area/maintenance/port/fore) -"axo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) "axp" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "axq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -11239,10 +11187,12 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "axK" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/structure/sign/plaques/kiddie/library{ + pixel_y = 29 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken4" }, -/turf/closed/wall, /area/maintenance/port/fore) "axL" = ( /obj/machinery/holopad, @@ -11420,21 +11370,21 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "ays" = ( -/obj/structure/closet/wardrobe/white, -/obj/item/clothing/shoes/jackboots, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka, -/turf/open/floor/plating, +/obj/structure/bookcase/random/fiction, +/turf/open/floor/wood, /area/maintenance/port/fore) "ayt" = ( -/obj/structure/table/glass, -/obj/item/hemostat, -/turf/open/floor/plating, +/obj/structure/bookcase/random/adult, +/turf/open/floor/wood, /area/maintenance/port/fore) "ayu" = ( -/obj/structure/table/glass, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/reagent_containers/blood/random, +/obj/structure/table/optable{ + name = "Robotics Operating Table" + }, +/obj/item/surgical_drapes, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "ayv" = ( @@ -11455,8 +11405,18 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "ayx" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/paper{ + icon_state = "paper_onfire"; + name = "Burning Note"; + text = "I sign here with my last breath to sell my soul to curse you all..." + }, +/obj/item/pen/fountain{ + pixel_x = 5; + pixel_y = 1 + }, +/turf/open/floor/wood, /area/maintenance/port/fore) "ayy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -11474,10 +11434,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"ayC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/maintenance/fore) "ayD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel/dark, @@ -11851,10 +11807,8 @@ /turf/closed/wall, /area/hydroponics/garden) "azG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall, +/obj/item/ectoplasm, +/turf/open/floor/wood, /area/maintenance/port/fore) "azH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -12272,10 +12226,11 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) "aAW" = ( @@ -13040,22 +12995,35 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, /area/chapel/main) "aCP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/turf/open/floor/plasteel/dark, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/poppy{ + pixel_y = 5 + }, +/obj/item/reagent_containers/food/snacks/grown/harebell{ + pixel_y = 5 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aCQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/hydroponics/soil, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 3 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/grass, /area/chapel/main) "aCR" = ( /turf/closed/wall, @@ -13072,8 +13040,9 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "aCW" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/sleeper{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "aCX" = ( @@ -13580,7 +13549,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aEi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -13600,35 +13569,24 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aEl" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aEm" = ( -/obj/machinery/door/window{ - dir = 8; - name = "Mass Driver"; - req_access_txt = "22" +/obj/structure/bookcase, +/obj/machinery/camera{ + c_tag = "Chapel North" }, -/obj/machinery/mass_driver{ - dir = 4; - id = "chapelgun"; - name = "Holy Driver" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aEn" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "Chapel Launcher Door" +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aEz" = ( /obj/machinery/power/apc{ @@ -13647,13 +13605,10 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 2; - sortType = 18 - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aEB" = ( @@ -14022,16 +13977,10 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aFA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/computer/pod/old{ - density = 0; - icon = 'icons/obj/airlock_machines.dmi'; - icon_state = "airlock_control_standby"; - id = "chapelgun"; - name = "Mass Driver Controller"; - pixel_x = 24 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aFB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -14079,7 +14028,6 @@ /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) "aFJ" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -14290,10 +14238,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/fore) -"aGh" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/maintenance/fore) "aGi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, @@ -14666,7 +14610,7 @@ departmentType = 2; pixel_y = 30 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aGV" = ( /obj/structure/disposalpipe/segment{ @@ -14701,7 +14645,7 @@ /obj/machinery/airalarm{ pixel_y = 25 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aGZ" = ( /obj/machinery/door/airlock/security{ @@ -14752,7 +14696,7 @@ pixel_y = 25 }, /obj/machinery/vending/wardrobe/chap_wardrobe, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aHg" = ( /obj/machinery/light_switch{ @@ -14761,7 +14705,7 @@ /obj/machinery/camera{ c_tag = "Chapel Office" }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aHh" = ( /obj/structure/cable{ @@ -14773,9 +14717,9 @@ /turf/open/floor/plasteel, /area/gateway) "aHi" = ( -/obj/structure/closet/crate/coffin, -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/door/morgue{ + name = "Confession Booth (Chaplain)"; + req_access_txt = "22" }, /turf/open/floor/plasteel/dark, /area/chapel/office) @@ -14792,42 +14736,47 @@ /turf/open/floor/plasteel, /area/gateway) "aHk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aHl" = ( -/obj/structure/closet/crate/coffin, -/obj/machinery/door/window/eastleft{ - name = "Coffin Storage"; - req_access_txt = "22" +/obj/structure/chair/comfy/plywood, +/obj/machinery/light/floor, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1480; + name = "Confessional Intercom"; + pixel_x = 25 }, +/obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plasteel/dark, /area/chapel/office) "aHm" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/lattice, +/turf/closed/wall, /area/chapel/main) "aHn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/mass_driver{ + dir = 4; + id = "chapelgun"; + name = "Holy Driver" }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"aHo" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/food/snacks/grown/poppy, -/obj/item/reagent_containers/food/snacks/grown/harebell, -/turf/open/floor/plasteel/chapel{ - dir = 4 +/obj/machinery/door/window{ + dir = 8; + name = "Mass Driver"; + req_access_txt = "22" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/area/chapel/main) -"aHq" = ( -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/chapel/main) "aHu" = ( @@ -15327,9 +15276,14 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "aIz" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/grimy, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/table/wood, +/obj/item/storage/crayons{ + pixel_y = 8 + }, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aIB" = ( /obj/structure/bodycontainer/crematorium{ @@ -15342,20 +15296,16 @@ /area/chapel/office) "aIC" = ( /obj/effect/landmark/start/chaplain, -/obj/structure/chair, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aID" = ( -/obj/structure/closet/crate/coffin, -/obj/structure/window/reinforced{ +/obj/structure/chair/comfy/plywood, +/obj/structure/disposalpipe/segment{ dir = 4 }, +/turf/open/floor/carpet, +/area/chapel/office) +"aID" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plasteel/dark, /area/chapel/office) -"aIE" = ( -/obj/structure/table/glass, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) "aIH" = ( /obj/structure/table, /obj/item/storage/box/lights/mixed, @@ -15377,7 +15327,7 @@ /area/construction/mining/aux_base) "aII" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aIJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -15819,7 +15769,7 @@ /obj/structure/plasticflaps/opaque, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aJL" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; @@ -15832,15 +15782,14 @@ /area/hydroponics) "aJM" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp{ - pixel_y = 10 - }, /obj/structure/disposalpipe/segment, -/obj/item/nullrod, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/obj/item/flashlight/lamp{ + pixel_y = 15 + }, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aJO" = ( /obj/structure/table, @@ -15874,39 +15823,44 @@ /area/library) "aJT" = ( /obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/storage/crayons, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/obj/item/paper_bin{ + pixel_y = 4 + }, +/obj/item/pen/fountain{ + pixel_y = 4 + }, +/turf/open/floor/carpet, /area/chapel/office) "aJU" = ( /obj/structure/table/wood, -/obj/item/pen, -/obj/item/reagent_containers/food/drinks/bottle/holywater, +/obj/item/reagent_containers/food/drinks/bottle/holywater{ + pixel_x = 9; + pixel_y = 4 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/obj/item/nullrod{ + pixel_x = -15; + pixel_y = 3 + }, +/turf/open/floor/carpet, /area/chapel/office) "aJV" = ( -/obj/structure/closet/crate/coffin, -/obj/machinery/door/window/eastleft{ - dir = 8; - name = "Coffin Storage"; - req_access_txt = "22" +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +/turf/open/floor/plating, +/area/chapel/main) "aJW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aJX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -15965,10 +15919,10 @@ /turf/open/floor/plasteel, /area/gateway) "aKe" = ( -/obj/structure/table/glass, -/turf/open/floor/plasteel/chapel{ +/obj/structure/chair/wood/normal{ dir = 4 }, +/turf/open/floor/carpet, /area/chapel/main) "aKf" = ( /obj/structure/cable{ @@ -16114,7 +16068,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aKD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -16238,7 +16192,7 @@ "aKT" = ( /obj/structure/closet/secure_closet/freezer/meat, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aKU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, @@ -16253,7 +16207,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aKW" = ( /obj/machinery/light_switch{ pixel_y = 28 @@ -16297,7 +16251,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aLb" = ( /obj/structure/disposalpipe/segment{ @@ -16316,7 +16270,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aLd" = ( /obj/structure/table, @@ -16335,13 +16289,13 @@ /turf/open/floor/plasteel, /area/hydroponics) "aLe" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aLf" = ( /obj/machinery/airalarm{ @@ -16427,10 +16381,9 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aLt" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/turf/open/floor/wood{ + icon_state = "wood-broken" }, -/turf/closed/wall, /area/maintenance/port/fore) "aLu" = ( /obj/machinery/door/airlock/engineering{ @@ -16722,13 +16675,13 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aMl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aMm" = ( /obj/machinery/firealarm{ pixel_y = 24 @@ -16836,7 +16789,7 @@ "aMD" = ( /obj/machinery/icecream_vat, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aME" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -16848,7 +16801,7 @@ /area/hydroponics) "aMF" = ( /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aMG" = ( /obj/structure/closet/crate/hydroponics, /obj/item/shovel/spade, @@ -16866,13 +16819,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/structure/chair/wood/wings{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/chapel/main) "aMM" = ( -/obj/machinery/camera{ - c_tag = "Chapel North" - }, -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aMN" = ( /obj/machinery/chem_master/condimaster, @@ -16937,7 +16891,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aMX" = ( -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aMY" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, @@ -17142,7 +17096,7 @@ name = "Pete" }, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aNL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -17153,7 +17107,7 @@ dir = 8 }, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aNN" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -17174,7 +17128,7 @@ }, /obj/machinery/vending/wardrobe/chef_wardrobe, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aNP" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood, @@ -17227,28 +17181,24 @@ /turf/open/floor/wood, /area/library) "aNW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Chapel Office"; +/turf/open/floor/wood/wood_large, +/area/chapel/main) +"aNX" = ( +/obj/structure/closet/crate/coffin, +/obj/machinery/door/window/eastright{ + dir = 8; + name = "Coffin Storage"; req_access_txt = "22" }, /turf/open/floor/plasteel/dark, -/area/chapel/office) -"aNX" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1480; - name = "Confessional Intercom"; - pixel_x = 25 - }, -/obj/structure/chair, -/turf/open/floor/plasteel/dark, /area/chapel/main) "aNY" = ( -/obj/machinery/door/morgue{ - name = "Confession Booth (Chaplain)"; - req_access_txt = "22" +/obj/machinery/door/poddoor{ + id = "chapelgun"; + name = "Chapel Launcher Door" }, -/turf/open/floor/plasteel/dark, +/obj/structure/fans/tiny, +/turf/open/floor/plating, /area/chapel/main) "aNZ" = ( /obj/structure/chair, @@ -17562,7 +17512,7 @@ "aOI" = ( /obj/structure/kitchenspike, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aOJ" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -17584,14 +17534,14 @@ dir = 8 }, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aON" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aOO" = ( /obj/machinery/door/airlock{ name = "Bar Storage"; @@ -17628,7 +17578,7 @@ "aOT" = ( /obj/machinery/gibber, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "aOU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -17729,7 +17679,12 @@ }, /area/chapel/main) "aPo" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/closet/crate/coffin, +/obj/machinery/door/window/eastleft{ + dir = 8; + name = "Coffin Storage"; + req_access_txt = "22" + }, /turf/open/floor/plasteel/dark, /area/chapel/main) "aPp" = ( @@ -18135,7 +18090,11 @@ /area/chapel/main) "aQw" = ( /obj/structure/table/wood, -/turf/open/floor/plasteel/dark, +/obj/item/trash/candle{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/floor/carpet, /area/chapel/main) "aQx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -18148,22 +18107,17 @@ }, /area/chapel/main) "aQz" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1480; - name = "Confessional Intercom"; - pixel_x = 25 - }, -/obj/structure/chair{ - dir = 1 +/obj/structure/closet/crate/coffin, +/obj/structure/window/reinforced{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/chapel/main) "aQA" = ( -/obj/machinery/door/morgue{ - name = "Confession Booth" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aQB" = ( /obj/effect/turf_decal/tile/red{ @@ -19161,24 +19115,32 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aTf" = ( -/obj/structure/chair/stool, +/obj/structure/chair/pew/right{ + dir = 1 + }, /turf/open/floor/plasteel/chapel, /area/chapel/main) "aTg" = ( -/obj/structure/chair/stool, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 8 }, /area/chapel/main) "aTh" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/pew/right{ + dir = 1 + }, /turf/open/floor/plasteel/chapel, /area/chapel/main) "aTi" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/landmark/start/assistant, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 8 }, @@ -19246,11 +19208,11 @@ "aTs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, -/area/security/vacantoffice) +/area/vacant_room/office) "aTt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/security/vacantoffice) +/area/vacant_room/office) "aTu" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -19561,11 +19523,11 @@ dir = 8 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -19666,7 +19628,7 @@ dir = 4 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUz" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/airalarm{ @@ -19679,7 +19641,7 @@ /obj/structure/table/wood, /obj/item/flashlight/lamp, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUB" = ( /obj/structure/bookcase/random/adult, /turf/open/floor/wood, @@ -19709,28 +19671,36 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aUH" = ( -/obj/structure/chair/stool, /obj/effect/landmark/start/assistant, +/obj/structure/chair/pew/right{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 4 }, /area/chapel/main) "aUI" = ( -/obj/structure/chair/stool, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 1 }, /area/chapel/main) "aUJ" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/pew/right{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 4 }, /area/chapel/main) "aUK" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 1 }, @@ -19757,19 +19727,19 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUO" = ( /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUQ" = ( /obj/structure/table/wood, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUR" = ( /obj/structure/table/wood, /obj/item/pen/red, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUS" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -19795,7 +19765,7 @@ /obj/structure/table/wood, /obj/item/flashlight/lamp/green, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aUX" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -20257,8 +20227,10 @@ /turf/open/floor/wood, /area/library) "aVU" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 8 }, @@ -20347,7 +20319,7 @@ dir = 4 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aWg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -20364,7 +20336,7 @@ dir = 8 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aWj" = ( /obj/structure/grille, /obj/structure/window{ @@ -20395,7 +20367,7 @@ pixel_x = -28 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aWn" = ( /obj/structure/closet/wardrobe/black, /obj/item/clothing/shoes/jackboots, @@ -20430,19 +20402,19 @@ dir = 8 }, /turf/open/floor/carpet, -/area/security/vacantoffice) +/area/vacant_room/office) "aWs" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /turf/open/floor/carpet, -/area/security/vacantoffice) +/area/vacant_room/office) "aWt" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aWu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -21137,7 +21109,7 @@ /area/security/detectives_office) "aXL" = ( /turf/open/floor/carpet, -/area/security/vacantoffice) +/area/vacant_room/office) "aXM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21157,7 +21129,7 @@ }, /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aXP" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -21221,7 +21193,7 @@ dir = 4 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aXY" = ( /obj/structure/chair/office/dark, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -21229,13 +21201,13 @@ dir = 4 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aXZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/carpet, -/area/security/vacantoffice) +/area/vacant_room/office) "aYb" = ( /obj/structure/cable{ icon_state = "4-8" @@ -21274,7 +21246,7 @@ dir = 4 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aYe" = ( /obj/machinery/light_switch{ pixel_y = 28 @@ -21740,7 +21712,7 @@ /obj/item/folder/blue, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "aZo" = ( /obj/structure/sink{ dir = 4; @@ -22049,13 +22021,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) -"bag" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "bah" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -30 @@ -22263,7 +22228,7 @@ /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "baI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -22276,7 +22241,7 @@ pixel_y = -29 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "baK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -22622,7 +22587,7 @@ /area/hallway/secondary/exit) "bbI" = ( /obj/machinery/power/apc{ - areastring = "/area/security/vacantoffice"; + areastring = "/area/vacant_room/office"; dir = 8; name = "Vacant Office APC"; pixel_x = -24 @@ -23066,14 +23031,10 @@ /turf/open/floor/carpet, /area/bridge/meeting_room) "bdb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white/side, /area/hallway/primary/starboard) "bdc" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 - }, -/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard) "bdd" = ( @@ -23142,13 +23103,13 @@ /area/crew_quarters/heads/captain) "bdl" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/structure/cable{ icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bdm" = ( @@ -23189,11 +23150,20 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bdr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) "bds" = ( /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 4"; @@ -23371,13 +23341,9 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/locker) "bdN" = ( -/obj/machinery/door/airlock/medical{ - name = "Morgue"; - req_access_txt = "6" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/surgery) "bdO" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -23690,8 +23656,13 @@ }, /area/hallway/primary/starboard) "bez" = ( +/obj/machinery/power/apc{ + areastring = "/area/hallway/primary/starboard"; + name = "Starboard Primary Hallway APC"; + pixel_y = -24 + }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "0-4" }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -23906,7 +23877,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "beY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -23918,14 +23889,15 @@ /turf/closed/wall, /area/maintenance/disposal) "bfb" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 +/obj/machinery/computer/pod/old{ + density = 0; + icon = 'icons/obj/airlock_machines.dmi'; + icon_state = "airlock_control_standby"; + id = "chapelgun"; + name = "Mass Driver Controller"; + pixel_x = 24 }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, +/turf/open/floor/wood/wood_large, /area/chapel/main) "bfc" = ( /obj/machinery/power/apc{ @@ -24132,11 +24104,11 @@ "bfG" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bfH" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bfI" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -24166,18 +24138,9 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "bfO" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"bfP" = ( -/obj/machinery/power/apc{ - areastring = "/area/hallway/primary/starboard"; - name = "Starboard Primary Hallway APC"; - pixel_y = -24 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/paramedic) "bfQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -24362,22 +24325,22 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/structure/cable{ + icon_state = "0-2" + }, /obj/machinery/power/apc{ areastring = "/area/science/robotics/mechbay"; dir = 4; name = "Mech Bay APC"; pixel_x = 26 }, -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) "bgp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bgq" = ( /obj/structure/cable{ icon_state = "4-8" @@ -24553,7 +24516,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bgS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -24666,7 +24629,7 @@ "bhe" = ( /obj/structure/chair, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bhg" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -24740,25 +24703,9 @@ /turf/open/floor/plasteel, /area/security/checkpoint/medical) "bhm" = ( -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"bhn" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"bho" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"bhp" = ( /obj/machinery/power/apc{ areastring = "/area/medical/morgue"; dir = 1; @@ -24770,18 +24717,50 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) -"bhq" = ( +"bhn" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 + }, +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"bho" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel/dark, /area/medical/morgue) -"bhr" = ( -/obj/machinery/door/airlock{ - name = "Starboard Emergency Storage" +"bhp" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/plating, -/area/storage/emergency/starboard) +/obj/machinery/power/apc{ + areastring = "/area/medical/paramedic"; + dir = 8; + name = "Paramedic's Office APC"; + pixel_x = -26 + }, +/obj/machinery/computer/crew{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) +"bhq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/landmark/start/paramedic, +/obj/structure/chair/stool, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) +"bhr" = ( +/turf/closed/wall, +/area/crew_quarters/kitchen/backroom) "bhs" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel, @@ -24872,7 +24851,7 @@ /area/science/robotics/lab) "bhA" = ( /turf/closed/wall, -/area/science/research) +/area/science) "bhB" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/research{ @@ -24880,7 +24859,7 @@ req_access_txt = "47" }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bhC" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd"; @@ -24888,7 +24867,7 @@ }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/science/lab) +/area/science/research) "bhD" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/southright{ @@ -24900,7 +24879,7 @@ name = "research lab shutters" }, /turf/open/floor/plating, -/area/science/lab) +/area/science/research) "bhE" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -24910,7 +24889,7 @@ /obj/item/stack/sheet/metal/fifty, /obj/item/clothing/glasses/welding, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bhF" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -24925,7 +24904,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bhG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -25039,13 +25018,13 @@ "bhU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bhV" = ( /obj/structure/disposalpipe/segment{ dir = 6 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bhW" = ( /obj/machinery/door/poddoor/shutters{ id = "qm_warehouse"; @@ -25092,7 +25071,7 @@ pixel_x = 29 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bic" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -25253,7 +25232,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "biu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, @@ -25308,22 +25287,32 @@ /turf/open/floor/plating, /area/quartermaster/storage) "biB" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/item/cigbutt{ + pixel_x = 10; + pixel_y = 17 + }, +/obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel/dark, -/area/medical/morgue) +/area/medical/paramedic) "biC" = ( -/turf/open/floor/plating, -/area/storage/emergency/starboard) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/crew_quarters/kitchen/backroom) "biD" = ( -/obj/item/storage/box/lights/mixed, +/obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/storage/emergency/starboard) "biE" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/structure/reagent_dispensers/watertank, /obj/item/extinguisher, /turf/open/floor/plating, /area/storage/emergency/starboard) @@ -25449,7 +25438,7 @@ dir = 9 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "biS" = ( /obj/machinery/camera{ c_tag = "Research Division Access" @@ -25462,7 +25451,7 @@ dir = 5 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "biT" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -25480,7 +25469,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "biV" = ( /obj/structure/chair/stool, /obj/effect/landmark/start/scientist, @@ -25491,10 +25480,10 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "biW" = ( /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "biX" = ( /obj/machinery/camera{ c_tag = "Research and Development"; @@ -25512,7 +25501,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "biY" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -25885,7 +25874,7 @@ /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bjT" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/blue, @@ -25893,14 +25882,14 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bjU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bjV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -25910,7 +25899,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bjX" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -25944,38 +25933,36 @@ dir = 10 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bka" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bkb" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/flashlight/lamp{ + pixel_x = -2; + pixel_y = 11 + }, +/obj/item/folder/white, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) +"bkd" = ( /obj/machinery/camera{ c_tag = "Medbay Morgue"; dir = 8; network = list("ss13","medbay") }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, +/obj/machinery/suit_storage_unit/paramedic, /turf/open/floor/plasteel/dark, -/area/medical/morgue) -"bkc" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/storage/emergency/starboard) -"bkd" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/storage/emergency/starboard) -"bkf" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/storage/emergency/starboard) +/area/medical/paramedic) "bkh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit, @@ -25996,7 +25983,7 @@ pixel_x = 24 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bkj" = ( /obj/structure/closet/emcloset, /obj/machinery/airalarm{ @@ -26061,7 +26048,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bkr" = ( /obj/machinery/shower{ dir = 8 @@ -26073,7 +26060,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bks" = ( /obj/machinery/requests_console{ department = "Science"; @@ -26083,7 +26070,7 @@ receive_ore_updates = 1 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bkt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -26101,7 +26088,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bkw" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ @@ -26254,8 +26241,14 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -24 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "bkR" = ( @@ -26268,8 +26261,9 @@ /obj/machinery/light_switch{ pixel_y = -25 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" }, /turf/open/floor/plasteel/dark, /area/medical/morgue) @@ -26292,21 +26286,11 @@ /turf/open/floor/plating, /area/maintenance/central) "bkU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/white/corner{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/area/hallway/primary/starboard) "bkV" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -26370,6 +26354,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/airlock/maintenance{ + name = "Morgue Maintenance"; + req_access_txt = "6" + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "blb" = ( @@ -26419,21 +26407,11 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "blg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, -/obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance"; - req_access_txt = "6" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "blh" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/eastright{ @@ -26465,7 +26443,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bll" = ( /obj/structure/table/reinforced, /obj/item/folder/white, @@ -26491,26 +26469,12 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "blo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/storage/emergency/starboard"; - dir = 1; - name = "Starboard Emergency Storage APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "blp" = ( /obj/machinery/power/apc{ areastring = "/area/security/checkpoint/medical"; @@ -26545,8 +26509,13 @@ /turf/open/floor/plating, /area/maintenance/department/medical/morgue) "blr" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Medbay Morgue"; + dir = 6; + network = list("ss13","medbay") }, /turf/open/floor/plasteel/dark, /area/medical/morgue) @@ -26699,31 +26668,31 @@ dir = 6 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "blI" = ( /obj/machinery/rnd/destructive_analyzer, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, -/area/science/lab) +/area/science/research) "blJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/plasteel, -/area/science/lab) +/area/science/research) "blK" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, -/area/science/lab) +/area/science/research) "blL" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "blM" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/start/cyborg, @@ -26752,7 +26721,6 @@ /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 }, -/obj/item/cigbutt, /turf/open/floor/plating, /area/maintenance/starboard) "blS" = ( @@ -26791,7 +26759,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "blY" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -26806,7 +26774,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bma" = ( /obj/structure/table/glass, /obj/item/stock_parts/manipulator, @@ -26825,7 +26793,7 @@ pixel_x = 24 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bmb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -27091,7 +27059,7 @@ pixel_x = -24 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bmK" = ( /obj/structure/table/reinforced, /turf/open/floor/plasteel/white, @@ -27162,13 +27130,11 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bmR" = ( -/obj/structure/table, -/obj/item/paper/guides/jobs/medical/morgue{ - pixel_x = 5; - pixel_y = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bmS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -27196,15 +27162,15 @@ /turf/open/floor/plasteel/dark, /area/medical/morgue) "bmW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, /turf/closed/wall, /area/medical/morgue) "bmX" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/medical/genetics) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bmY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -27247,7 +27213,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bng" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -27256,13 +27222,13 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bnh" = ( /obj/structure/cable{ icon_state = "4-8" }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bni" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -27310,7 +27276,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bnl" = ( /obj/item/stack/sheet/glass, /obj/structure/table/glass, @@ -27327,7 +27293,7 @@ }, /obj/item/stock_parts/scanning_module, /obj/machinery/power/apc{ - areastring = "/area/science/lab"; + areastring = "/area/science/research"; dir = 4; name = "Research Lab APC"; pixel_x = 26 @@ -27336,38 +27302,38 @@ icon_state = "0-8" }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bnm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, -/area/science/research) +/area/science) "bnn" = ( /obj/machinery/computer/rdconsole/core{ dir = 4 }, /turf/open/floor/plasteel, -/area/science/lab) +/area/science/research) "bno" = ( /obj/item/reagent_containers/glass/beaker/sulphuric, /obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/plasteel, -/area/science/lab) +/area/science/research) "bnp" = ( /turf/open/floor/plasteel, -/area/science/lab) +/area/science/research) "bnq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/closed/wall, -/area/science/lab) +/area/science/research) "bnr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, -/area/science/lab) +/area/science/research) "bns" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -27881,7 +27847,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/science/research) +/area/science) "box" = ( /turf/closed/wall, /area/science/robotics/lab) @@ -27894,7 +27860,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/science/research) +/area/science) "boz" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/poddoor/preopen{ @@ -27903,16 +27869,16 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/science/research) +/area/science) "boA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "boB" = ( /turf/closed/wall, -/area/science/lab) +/area/science/research) "boC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -27995,7 +27961,7 @@ /area/science/robotics/lab) "boM" = ( /turf/open/floor/plasteel/white/corner, -/area/science/research) +/area/science) "boN" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -28005,18 +27971,18 @@ "boO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white/side, -/area/science/research) +/area/science) "boP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "boQ" = ( /obj/structure/table, /obj/machinery/cell_charger, /obj/item/stock_parts/cell/high/plus, /obj/item/stock_parts/cell/high/plus, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "boR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -28199,7 +28165,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bpp" = ( /obj/machinery/door/window/eastright{ base_state = "left"; @@ -28210,7 +28176,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/science/lab) +/area/science/research) "bpq" = ( /obj/machinery/light_switch{ pixel_y = -23 @@ -28219,7 +28185,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bpr" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -28229,7 +28195,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/science/lab) +/area/science/research) "bps" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -28488,7 +28454,7 @@ /turf/open/floor/plasteel/white/corner{ dir = 8 }, -/area/science/research) +/area/science) "bpY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -28503,7 +28469,7 @@ /obj/item/disk/design_disk, /obj/item/disk/design_disk, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bqa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -28537,10 +28503,11 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bqg" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bqh" = ( @@ -28581,7 +28548,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, -/area/science/lab) +/area/science/research) "bql" = ( /obj/machinery/conveyor{ dir = 4; @@ -28874,6 +28841,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bqY" = ( @@ -28986,7 +28956,7 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "brn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28996,7 +28966,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bro" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29007,7 +28977,7 @@ /turf/open/floor/plasteel/white/side{ dir = 10 }, -/area/science/research) +/area/science) "brp" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -29017,7 +28987,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "brq" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/button/door{ @@ -29058,7 +29028,7 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bru" = ( /obj/machinery/firealarm{ pixel_y = 24 @@ -29105,7 +29075,7 @@ }, /obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/science/lab) +/area/science/research) "bry" = ( /obj/machinery/door/airlock/maintenance{ name = "Experimentation Lab Maintenance"; @@ -29181,18 +29151,16 @@ /turf/open/floor/plating, /area/maintenance/starboard) "brH" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, +/obj/item/cigbutt/cigarbutt, /turf/open/floor/plating, /area/maintenance/starboard) "brI" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "brJ" = ( @@ -29527,17 +29495,17 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bsA" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bsC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bsD" = ( /obj/structure/cable{ icon_state = "1-4" @@ -29546,7 +29514,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bsE" = ( /obj/structure/cable{ icon_state = "4-8" @@ -29668,11 +29636,11 @@ /turf/open/floor/plasteel/white, /area/science/robotics/lab) "bsU" = ( -/obj/structure/table/optable{ - name = "Robotics Operating Table" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, -/obj/item/surgical_drapes, -/turf/open/floor/plating, +/mob/living/simple_animal/hostile/retaliate/ghost, +/turf/open/floor/wood, /area/maintenance/port/fore) "bsV" = ( /obj/structure/cable{ @@ -29693,7 +29661,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bsY" = ( /obj/structure/chair/office/dark{ dir = 4 @@ -29709,7 +29677,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bta" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29721,7 +29689,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "btb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29733,7 +29701,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "btc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -29754,7 +29722,7 @@ /turf/open/floor/plasteel/white/side{ dir = 6 }, -/area/science/research) +/area/science) "btf" = ( /obj/machinery/requests_console{ department = "Medbay"; @@ -29765,10 +29733,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"btg" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) "bth" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -29777,7 +29741,7 @@ icon_state = "plant-16" }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bti" = ( /obj/structure/closet/wardrobe/grey, /obj/item/clothing/head/beret/black, @@ -29823,7 +29787,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/science/research) +/area/science) "bto" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -29840,15 +29804,17 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "btp" = ( +/obj/item/cigbutt, /turf/open/floor/plating, /area/maintenance/starboard) "btq" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Space Loop Out" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/plating, /area/maintenance/starboard) "btr" = ( /obj/machinery/camera{ @@ -29921,7 +29887,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "btx" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/poddoor/preopen{ @@ -29933,7 +29899,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/science/research) +/area/science) "bty" = ( /obj/structure/chair{ dir = 8 @@ -29956,7 +29922,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "btB" = ( /obj/machinery/computer/bounty{ dir = 4 @@ -30089,7 +30055,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "btQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -30097,7 +30063,7 @@ /turf/open/floor/plasteel/white/side{ dir = 10 }, -/area/science/research) +/area/science) "btR" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -30111,7 +30077,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "btT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30126,7 +30092,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "btV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30140,7 +30106,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "btX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30265,7 +30231,7 @@ /turf/open/floor/plasteel/white/side{ dir = 8 }, -/area/medical/sleeper) +/area/medical/medbay/central) "bul" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -30291,7 +30257,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bup" = ( /obj/machinery/light, /obj/structure/cable{ @@ -30301,7 +30267,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "buq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -30329,7 +30295,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "but" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30482,7 +30448,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "buI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -30569,7 +30535,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "buU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30587,7 +30553,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/science/research) +/area/science) "buV" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -30645,7 +30611,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bvc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30658,13 +30624,13 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bvd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall, -/area/medical/sleeper) +/area/medical/surgery) "bve" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30679,7 +30645,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bvf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -30688,7 +30654,7 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bvg" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -30698,23 +30664,16 @@ }, /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel/white, -/area/science/research) -"bvh" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/medical/sleeper) +/area/science) "bvi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/medical/sleeper) -"bvj" = ( -/turf/closed/wall, -/area/medical/sleeper) +/area/medical/surgery) "bvk" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "bvl" = ( /obj/machinery/door/airlock/medical/glass{ name = "Surgery Observation" @@ -30722,11 +30681,11 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bvm" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bvn" = ( /obj/machinery/button/door{ desc = "A remote control switch for the genetics doors."; @@ -30814,7 +30773,7 @@ /area/medical/genetics) "bvx" = ( /turf/closed/wall/r_wall, -/area/science/research) +/area/science) "bvy" = ( /obj/machinery/camera{ c_tag = "Genetics Research"; @@ -30875,7 +30834,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bvE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -30883,7 +30842,7 @@ /turf/open/floor/plasteel/white/side{ dir = 6 }, -/area/science/research) +/area/science) "bvF" = ( /obj/machinery/requests_console{ department = "Cargo Bay"; @@ -30920,7 +30879,7 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bvI" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -30971,15 +30930,13 @@ /turf/open/floor/plasteel/white, /area/science/explab) "bvQ" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/starboard) "bvR" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, +/obj/effect/decal/cleanable/oil, /turf/open/floor/plating, /area/maintenance/starboard) "bvS" = ( @@ -31221,11 +31178,11 @@ c_tag = "Surgery Observation"; network = list("ss13","medbay") }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bwx" = ( /obj/machinery/door/window/eastleft{ name = "Medical Delivery"; @@ -31244,18 +31201,20 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bwD" = ( /obj/machinery/sleeper{ dir = 8 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bwE" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bwF" = ( /obj/structure/table/glass, /obj/item/reagent_containers/glass/beaker/cryoxadone{ @@ -31267,20 +31226,20 @@ pixel_y = 1 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bwG" = ( /obj/structure/sign/warning/nosmoking, /turf/closed/wall, -/area/medical/sleeper) +/area/medical/medbay/central) "bwH" = ( /obj/structure/table, /obj/machinery/cell_charger, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bwI" = ( /obj/machinery/atmospherics/components/unary/cryo_cell, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bwJ" = ( /obj/structure/table/glass, /obj/machinery/camera{ @@ -31290,7 +31249,7 @@ /obj/item/reagent_containers/glass/beaker/cryoxadone, /obj/item/reagent_containers/glass/beaker/cryoxadone, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bwK" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -31358,7 +31317,7 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bwQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -31471,31 +31430,27 @@ /area/security/checkpoint/supply) "bwZ" = ( /obj/structure/chair, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bxa" = ( /obj/structure/chair, /obj/structure/sign/warning/nosmoking{ pixel_x = -28 }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bxb" = ( /obj/structure/chair, /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 + dir = 4 }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bxc" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bxd" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31507,7 +31462,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bxe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31520,7 +31475,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bxf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31534,7 +31489,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bxg" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -31632,11 +31587,12 @@ /turf/open/floor/plasteel/white, /area/science/explab) "bxt" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible, /obj/structure/cable{ icon_state = "2-4" }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bxu" = ( @@ -31754,7 +31710,7 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bxG" = ( /obj/machinery/door/airlock/command{ name = "Head of Personnel"; @@ -31823,13 +31779,13 @@ pixel_x = -28 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bxO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bxP" = ( /obj/structure/cable{ icon_state = "2-8" @@ -31844,34 +31800,34 @@ /area/crew_quarters/heads/hor) "bxQ" = ( /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bxR" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bxS" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bxT" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bxU" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 10 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bxV" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bxW" = ( /obj/machinery/door/airlock/command/glass{ name = "Research Director"; @@ -32400,37 +32356,41 @@ dir = 4 }, /obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/medical/sleeper) +/area/medical/surgery) "byZ" = ( /obj/structure/disposalpipe/segment{ dir = 6 }, /obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/medical/sleeper) +/area/medical/surgery) "bza" = ( /obj/structure/chair, /obj/machinery/airalarm{ pixel_y = 23 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bzb" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/medical/sleeper) +/turf/closed/wall, +/area/medical/surgery) "bzc" = ( /obj/machinery/door/airlock/medical/glass{ name = "Recovery Room" }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bzd" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -32453,14 +32413,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) -"bzf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bzg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -32472,19 +32425,19 @@ dir = 6 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bzi" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bzj" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 1 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bzk" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -32640,14 +32593,14 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bzB" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bzC" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -32678,7 +32631,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bzF" = ( /obj/machinery/firealarm{ dir = 8; @@ -32696,17 +32649,19 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bzH" = ( -/obj/structure/table, -/obj/item/hemostat, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/side, -/area/medical/sleeper) +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/medical/surgery) "bzI" = ( /obj/structure/disposalpipe/segment, +/obj/machinery/light/small{ + dir = 8 + }, /obj/structure/table, -/obj/item/surgicaldrill, +/obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/surgery) "bzJ" = ( /obj/machinery/computer/mecha{ dir = 8 @@ -32717,14 +32672,9 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "bzK" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/closed/wall, +/area/medical/surgery) "bzL" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, @@ -32782,12 +32732,13 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "bzS" = ( -/obj/structure/table, -/obj/item/cautery{ - pixel_x = 4 +/obj/machinery/light/small{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/computer/operating, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/surgery) "bzT" = ( /obj/structure/chair/office/dark, /obj/effect/landmark/start/quartermaster, @@ -32800,15 +32751,15 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bzV" = ( /obj/machinery/vending/wardrobe/medi_wardrobe, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bzW" = ( /obj/structure/closet/l3closet, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bzX" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -32826,7 +32777,7 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bAa" = ( /obj/machinery/door/firedoor/heavy, /obj/structure/cable{ @@ -32834,7 +32785,7 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bAb" = ( /obj/structure/chair/office/dark{ dir = 8 @@ -32925,8 +32876,11 @@ /area/hallway/primary/central) "bAl" = ( /obj/structure/chair, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, -/area/medical/sleeper) +/area/medical/surgery) "bAm" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -32987,11 +32941,11 @@ network = list("ss13","medbay") }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bAr" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bAs" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1; @@ -33004,18 +32958,18 @@ }, /obj/machinery/light, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bAt" = ( /obj/structure/table/reinforced, /obj/item/wrench/medical, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bAu" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 1 }, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bAv" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1; @@ -33023,7 +32977,7 @@ }, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/medbay/central) "bAw" = ( /turf/open/floor/plating, /area/maintenance/aft) @@ -33247,29 +33201,21 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/janitor) -"bAW" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) "bAX" = ( /obj/structure/disposalpipe/segment, -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/structure/curtain{ + pixel_y = -32 }, /turf/open/floor/plasteel/white/side{ dir = 4 }, -/area/medical/sleeper) +/area/medical/surgery) "bAY" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/structure/curtain{ + pixel_y = -32 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "bAZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -33281,24 +33227,19 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bBb" = ( -/obj/effect/landmark/start/medical_doctor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/atmos) "bBc" = ( -/obj/structure/table, -/obj/item/surgical_drapes, -/obj/item/razor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/curtain{ + pixel_y = -32 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/optable, /turf/open/floor/plasteel/white/side{ dir = 8 }, -/area/medical/sleeper) +/area/medical/surgery) "bBd" = ( /obj/structure/table, /obj/structure/bedsheetbin{ @@ -33306,22 +33247,19 @@ }, /obj/item/clothing/suit/straight_jacket, /obj/item/clothing/mask/muzzle, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bBe" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bBf" = ( /obj/structure/filingcabinet, /obj/structure/reagent_dispensers/peppertank{ @@ -33578,7 +33516,7 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bBE" = ( /obj/structure/cable{ icon_state = "1-8" @@ -33588,7 +33526,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bBF" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/item/storage/firstaid/toxin, @@ -34026,44 +33964,45 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/maintenance{ - name = "Surgery Maintenance"; - req_access_txt = "45" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/closed/wall, +/area/medical/surgery) "bCC" = ( /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/bloodbankgen, +/obj/machinery/camera{ + c_tag = "Medbay Recovery Room"; + dir = 6; + network = list("ss13","medbay") }, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "bCD" = ( -/obj/structure/table, -/obj/item/retractor, +/obj/machinery/computer/operating, /turf/open/floor/plasteel/white/side, -/area/medical/sleeper) +/area/medical/surgery) "bCE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "bCF" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/power/apc{ + areastring = "/area/medical/surgery"; + dir = 8; + name = "Treatment Center APC"; + pixel_x = -24 + }, +/obj/structure/cable{ + icon_state = "0-2" }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "bCG" = ( /obj/structure/table, /obj/item/folder/white, @@ -34071,28 +34010,27 @@ /obj/item/soap/nanotrasen, /obj/item/gun/syringe/dart, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bCH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "bCJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "bCK" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bCL" = ( /obj/structure/closet/secure_closet/medical3, /obj/machinery/camera{ @@ -34100,19 +34038,19 @@ network = list("ss13","medbay") }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bCM" = ( /obj/structure/closet/secure_closet/medical3, /obj/machinery/airalarm{ pixel_y = 24 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bCN" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bCO" = ( /obj/structure/table, /obj/item/storage/box/bodybags{ @@ -34122,17 +34060,7 @@ /obj/item/storage/box/rxglasses, /obj/item/hand_labeler, /turf/open/floor/plasteel/white, -/area/medical/sleeper) -"bCP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/medical/sleeper) -"bCQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/sleeper) +/area/medical/medbay/central) "bCR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -34147,19 +34075,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) -"bCT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/vehicle/ridden/wheelchair{ + dir = 8 }, -/obj/machinery/bloodbankgen, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bCU" = ( /obj/item/radio/intercom{ frequency = 1485; @@ -34247,7 +34171,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bDe" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, @@ -34319,7 +34243,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bDm" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -34329,13 +34253,13 @@ dir = 10 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bDn" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bDo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -34383,16 +34307,6 @@ }, /turf/closed/wall, /area/maintenance/port/aft) -"bDu" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/aft) "bDv" = ( /obj/structure/table, /obj/item/flashlight{ @@ -34438,43 +34352,41 @@ /area/storage/tech) "bDA" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/power/apc{ - areastring = "/area/medical/sleeper"; - dir = 4; - name = "Treatment Center APC"; - pixel_x = 26 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "bDB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel/white/side{ dir = 4 }, -/area/medical/sleeper) +/area/medical/surgery) "bDC" = ( -/obj/machinery/computer/operating{ - dir = 1 +/obj/effect/landmark/start/medical_doctor, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "bDD" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bDE" = ( /obj/machinery/vending/wallmed{ pixel_x = 28 @@ -34484,9 +34396,14 @@ dir = 8; network = list("ss13","medbay") }, -/obj/machinery/iv_drip, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/vehicle/ridden/wheelchair{ + dir = 8 + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bDF" = ( /obj/machinery/door/poddoor/preopen{ id = "medpriv4"; @@ -34581,9 +34498,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"bDR" = ( -/turf/open/floor/plasteel/white, -/area/medical/sleeper) "bDS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -34599,7 +34513,7 @@ "bDT" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bDU" = ( /obj/machinery/door/airlock/command/glass{ name = "Chief Medical Officer"; @@ -34635,7 +34549,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bDY" = ( /obj/structure/cable{ icon_state = "4-8" @@ -34644,18 +34558,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/science/storage) -"bDZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) "bEa" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bEb" = ( /obj/structure/cable{ icon_state = "4-8" @@ -34682,7 +34590,7 @@ req_access_txt = "5" }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bEe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -34702,7 +34610,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bEg" = ( /obj/structure/cable{ icon_state = "4-8" @@ -34807,7 +34715,7 @@ /area/science/storage) "bEq" = ( /obj/machinery/power/apc{ - areastring = "/area/science/research"; + areastring = "/area/science"; dir = 8; name = "Misc Research APC"; pixel_x = -25 @@ -34818,7 +34726,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bEr" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -34826,14 +34734,14 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bEs" = ( /turf/closed/wall, /area/science/mixing) "bEt" = ( /obj/machinery/vending/coffee, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bEu" = ( /obj/structure/closet/bombcloset, /obj/machinery/light{ @@ -34886,7 +34794,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bEA" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/light{ @@ -34999,7 +34907,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel, -/area/science/mixing) +/area/science) "bEO" = ( /obj/structure/sign/warning/securearea{ pixel_x = -32 @@ -35011,7 +34919,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/science/mixing) +/area/science) "bEP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -35204,13 +35112,11 @@ /turf/open/floor/plating, /area/maintenance/aft) "bFm" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 6 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/closed/wall, +/area/medical/medbay/central) "bFn" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -35222,15 +35128,40 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bFp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/light/small{ + dir = 1 }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bFp" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/APlus, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/OPlus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/reagent_containers/blood/OMinus, +/obj/item/reagent_containers/blood/BPlus{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/reagent_containers/blood/BMinus{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/reagent_containers/blood/AMinus, +/obj/item/reagent_containers/blood, +/obj/item/reagent_containers/blood, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "bFq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/yellow, @@ -35252,27 +35183,25 @@ /area/maintenance/aft) "bFt" = ( /obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/item/reagent_containers/glass/beaker/synthflesh, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "bFu" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/medical/sleeper) +/turf/closed/wall, +/area/medical/surgery) "bFv" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "bFw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -35283,20 +35212,28 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -28 + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bFx" = ( /obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/machinery/limbgrower, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "bFy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bFz" = ( /obj/machinery/airalarm{ dir = 1; @@ -35305,10 +35242,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/white/side{ dir = 1 }, -/area/medical/sleeper) +/area/medical/surgery) "bFA" = ( /obj/structure/sink{ dir = 4; @@ -35321,11 +35261,11 @@ pixel_x = 30 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bFB" = ( /obj/structure/closet/secure_closet/medical2, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/surgery) "bFC" = ( /obj/structure/table/wood/poker, /obj/item/clothing/mask/cigarette/cigar{ @@ -35364,8 +35304,11 @@ /area/crew_quarters/heads/cmo) "bFF" = ( /obj/machinery/light, +/obj/structure/chair{ + dir = 1 + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bFG" = ( /obj/structure/chair{ dir = 1 @@ -35405,17 +35348,15 @@ /turf/open/floor/engine, /area/science/storage) "bFJ" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 +/obj/structure/chair{ + dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bFK" = ( /obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bFL" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -35488,18 +35429,18 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bFR" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bFS" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bFT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -35779,26 +35720,20 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/mixing) -"bGH" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) +/area/science) "bGI" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Surgery Maintenance"; + req_access_txt = "45" }, -/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/aft) "bGJ" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /turf/open/floor/plating, /area/maintenance/aft) @@ -35813,14 +35748,14 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/mixing) +/area/science) "bGL" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, -/area/science/mixing) +/area/science) "bGM" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -35871,9 +35806,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/closed/wall, +/area/medical/medbay/central) "bGR" = ( /obj/structure/table, /obj/item/storage/belt/medical{ @@ -35888,7 +35822,7 @@ /obj/item/clothing/neck/stethoscope, /obj/item/gun/syringe/dart, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bGT" = ( /obj/structure/table, /obj/item/folder/white, @@ -35924,9 +35858,11 @@ /area/medical/medbay/central) "bGW" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/closed/wall, +/area/medical/medbay/central) "bGX" = ( /obj/machinery/light{ dir = 8 @@ -35977,7 +35913,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bHd" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36008,7 +35944,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bHh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -36073,7 +36009,9 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/aft) "bHq" = ( @@ -36102,7 +36040,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, -/area/science/mixing) +/area/science) "bHt" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, @@ -36218,7 +36156,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bHL" = ( /obj/machinery/camera{ c_tag = "Research Division South"; @@ -36228,13 +36166,13 @@ /turf/open/floor/plasteel/white/side{ dir = 9 }, -/area/science/research) +/area/science) "bHM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bHN" = ( /obj/machinery/requests_console{ department = "Tech storage"; @@ -36292,6 +36230,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/landmark/event_spawn, /obj/structure/grille/broken, /turf/open/floor/plating, /area/maintenance/aft) @@ -36307,11 +36246,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"bHW" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/maintenance/aft) "bHX" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -36343,19 +36277,15 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bIc" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/iv_drip, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/firealarm{ dir = 1; - pixel_y = -24 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/sleeper) -"bId" = ( -/obj/machinery/vending/wallmed{ - pixel_y = -28 + pixel_y = -23 }, /obj/machinery/camera{ c_tag = "Surgery Operating"; @@ -36363,9 +36293,20 @@ network = list("ss13","medbay"); pixel_x = 22 }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/medical/surgery) +"bId" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/iv_drip, /obj/machinery/light, +/obj/machinery/vending/wallmed{ + pixel_y = -28 + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "bIe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/status_display/evac{ @@ -36450,7 +36391,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bIj" = ( /obj/structure/table, /obj/machinery/light, @@ -36462,7 +36403,7 @@ /obj/item/stack/packageWrap, /obj/item/stack/packageWrap, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bIk" = ( /obj/structure/table, /obj/item/storage/firstaid/fire{ @@ -36480,7 +36421,7 @@ req_access_txt = "5" }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bIl" = ( /obj/structure/table, /obj/item/storage/firstaid/toxin{ @@ -36498,12 +36439,12 @@ req_access_txt = "5" }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bIm" = ( /obj/machinery/light, /obj/machinery/rnd/production/techfab/department/medical, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bIn" = ( /obj/structure/table, /obj/item/storage/firstaid/brute{ @@ -36522,7 +36463,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "bIo" = ( /obj/structure/bed, /obj/item/bedsheet/medical, @@ -36656,7 +36597,7 @@ /turf/open/floor/plasteel/white/side{ dir = 5 }, -/area/science/research) +/area/science) "bIE" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -36666,7 +36607,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bIF" = ( /obj/structure/cable{ icon_state = "1-2" @@ -36934,7 +36875,7 @@ /turf/open/floor/plasteel/white/side{ dir = 1 }, -/area/science/research) +/area/science) "bJp" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -36967,7 +36908,7 @@ /turf/open/floor/plasteel/white/side{ dir = 1 }, -/area/science/research) +/area/science) "bJs" = ( /obj/structure/cable{ icon_state = "4-8" @@ -37006,8 +36947,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plating, /area/maintenance/aft) @@ -37040,8 +36981,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plating, /area/maintenance/aft) @@ -37061,12 +37003,14 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bJA" = ( -/obj/effect/landmark/blobstart, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/closed/wall, +/area/medical/medbay/central) "bJB" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /turf/open/floor/plasteel, @@ -37076,13 +37020,13 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/medical/sleeper) +/area/medical/medbay/central) "bJD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/closed/wall/r_wall, -/area/medical/sleeper) +/area/medical/medbay/central) "bJE" = ( /turf/closed/wall/r_wall, /area/medical/medbay/central) @@ -37189,7 +37133,7 @@ "bJT" = ( /obj/machinery/vending/cigarette, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "bJU" = ( /obj/machinery/vending/wardrobe/science_wardrobe, /turf/open/floor/plasteel/white, @@ -37283,13 +37227,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/science/mixing) +/area/science) "bKc" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, -/area/science/mixing) +/area/science) "bKd" = ( /obj/machinery/camera{ c_tag = "Toxins Launch Room Access"; @@ -37300,7 +37244,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/mixing) +/area/science) "bKe" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -37341,8 +37285,9 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bKk" = ( -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, +/obj/item/stack/ore/silver{ + amount = 2 + }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -37562,33 +37507,21 @@ /area/maintenance/aft) "bKK" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/medical/medbay/central"; - dir = 4; - name = "Medbay APC"; - pixel_x = 24 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/aft) "bKL" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/machinery/power/apc{ + areastring = "/area/medical/medbay/central"; + dir = 1; + name = "Medbay Central APC"; + pixel_y = 24 }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "0-2" }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "bKM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -37798,7 +37731,7 @@ "bLh" = ( /obj/structure/sign/warning/fire, /turf/closed/wall, -/area/science/research) +/area/science) "bLi" = ( /obj/structure/sign/warning/nosmoking{ pixel_x = -32 @@ -38029,10 +37962,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"bLP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/atmos) "bLQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/closed/wall/r_wall, @@ -38254,7 +38183,7 @@ "bMs" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/science/research) +/area/science) "bMt" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -38397,7 +38326,9 @@ /obj/machinery/firealarm{ pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bMQ" = ( @@ -38457,11 +38388,9 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bNb" = ( -/obj/item/airlock_painter, -/obj/structure/lattice, -/obj/structure/closet, -/turf/open/space, -/area/space/nearstation) +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/wood, +/area/maintenance/port/fore) "bNc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -38663,8 +38592,8 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bNC" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/plating, +/obj/machinery/vending/cigarette, +/turf/open/floor/wood, /area/maintenance/starboard/aft) "bND" = ( /obj/structure/chair{ @@ -38868,10 +38797,11 @@ /turf/closed/wall/r_wall, /area/engine/atmos) "bOi" = ( -/turf/open/floor/plasteel/airless{ - icon_state = "damaged5" +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood{ + icon_state = "wood-broken4" }, -/area/space/nearstation) +/area/maintenance/port/fore) "bOj" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -39007,7 +38937,7 @@ /turf/open/floor/plasteel/white/side{ dir = 1 }, -/area/science/research) +/area/science) "bOB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -39605,8 +39535,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bPP" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, +/turf/open/floor/wood, /area/maintenance/starboard/aft) "bPQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -41756,6 +41685,9 @@ /obj/item/clothing/gloves/color/black, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bVX" = ( @@ -42662,16 +42594,20 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bYr" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, /area/maintenance/starboard/aft) "bYs" = ( -/obj/structure/closet/crate, -/obj/item/clothing/under/color/lightpurple, -/obj/item/stack/spacecash/c200, +/obj/machinery/vending/boozeomat, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) "bYt" = ( @@ -42935,6 +42871,9 @@ /area/science/circuit) "bZi" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bZj" = ( @@ -43304,13 +43243,23 @@ /turf/open/floor/plasteel, /area/science/misc_lab) "cac" = ( -/obj/structure/chair/stool, -/turf/open/floor/plating, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/wood, /area/maintenance/starboard/aft) "cad" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, /area/maintenance/starboard/aft) "cae" = ( /turf/open/floor/plating{ @@ -43743,18 +43692,12 @@ }, /area/maintenance/starboard/aft) "cbh" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/item/folder/white, -/obj/item/pen, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/turf/closed/wall/rust, +/area/science/mixing) "cbi" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, +/obj/structure/barricade/wooden, +/obj/structure/girder, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cbj" = ( @@ -44476,14 +44419,17 @@ /turf/closed/wall, /area/maintenance/starboard/aft) "ccV" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "ccW" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "ccX" = ( @@ -44647,9 +44593,7 @@ /area/engine/break_room) "cdu" = ( /obj/structure/closet/emcloset, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cdv" = ( @@ -44811,8 +44755,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "cdV" = ( -/obj/structure/table, -/turf/open/floor/plating, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/turf/open/floor/wood, /area/maintenance/starboard/aft) "cdW" = ( /obj/machinery/power/apc{ @@ -44834,7 +44780,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "cdZ" = ( /obj/machinery/telecomms/processor/preset_two, /turf/open/floor/plasteel/dark/telecomms, @@ -45152,8 +45098,8 @@ /area/maintenance/starboard/aft) "ceT" = ( /obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +/obj/structure/sign/poster/ripped{ + pixel_y = 32 }, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -45183,7 +45129,7 @@ }, /obj/machinery/holopad, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "ceY" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -45332,7 +45278,7 @@ /area/maintenance/aft) "cfq" = ( /obj/structure/mopbucket, -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/maintenance/aft) "cfr" = ( @@ -45372,11 +45318,8 @@ /turf/closed/wall/r_wall, /area/science/misc_lab) "cfv" = ( -/obj/machinery/door/airlock/maintenance/abandoned{ - name = "Firefighting equipment"; - req_access_txt = "12" - }, -/turf/open/floor/plating, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) "cfw" = ( /turf/closed/wall/r_wall, @@ -45530,7 +45473,11 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, +/turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cfW" = ( /obj/structure/cable{ @@ -45760,11 +45707,8 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cgy" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/chair/stool, -/turf/open/floor/plating, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) "cgz" = ( /obj/structure/cable, @@ -46016,11 +45960,8 @@ /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "che" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "Atmospherics External Airlock"; +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; req_access_txt = "24" }, /turf/open/floor/plating, @@ -46078,6 +46019,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/reagent_dispensers/fueltank, +/obj/item/storage/toolbox/emergency, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "chm" = ( @@ -46255,8 +46198,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "chH" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, +/turf/open/floor/light/colour_cycle/dancefloor_b, /area/maintenance/starboard/aft) "chI" = ( /obj/structure/cable{ @@ -46404,7 +46346,6 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/structure/reagent_dispensers/fueltank, /obj/structure/extinguisher_cabinet{ pixel_x = -5; pixel_y = 30 @@ -46412,6 +46353,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/reagent_dispensers/fueltank/high, /turf/open/floor/plasteel, /area/engine/engineering) "cig" = ( @@ -46571,7 +46513,6 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "ciF" = ( @@ -46877,8 +46818,6 @@ /turf/open/floor/plasteel, /area/construction) "cjp" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/item/storage/toolbox/emergency, /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 }, @@ -48858,10 +48797,16 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "cpG" = ( -/obj/structure/table/optable, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/surgery) "cpI" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -49391,9 +49336,12 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "csT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/landmark/xmastree, -/turf/open/floor/plasteel/dark, +/obj/structure/table/glass, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/storage/book/bible{ + pixel_y = -1 + }, +/turf/open/floor/wood/wood_large, /area/chapel/main) "csU" = ( /obj/structure/transit_tube/station/reverse, @@ -50612,7 +50560,7 @@ start_active = 1 }, /turf/open/space, -/area/space/nearstation) +/area/ai_monitored/turret_protected/aisat) "cvG" = ( /obj/machinery/porta_turret/ai{ dir = 4; @@ -50659,7 +50607,7 @@ start_active = 1 }, /turf/open/space, -/area/space/nearstation) +/area/ai_monitored/turret_protected/aisat) "cvL" = ( /obj/structure/sign/warning/securearea{ pixel_x = 32 @@ -51054,6 +51002,10 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"cwS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) "cwT" = ( /obj/machinery/camera{ c_tag = "Arrivals Escape Pod 2"; @@ -51191,15 +51143,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit) -"cyt" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 4" - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "cyu" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -51210,12 +51153,17 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "cyC" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" +/obj/machinery/door/airlock/maintenance/abandoned{ + name = "abandoned library"; + req_access_txt = "12" }, -/turf/open/floor/plating, +/obj/structure/barricade/wooden{ + name = "wooden barricade (CLOSED)" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/rust, /area/maintenance/port/fore) "cyD" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -51348,7 +51296,7 @@ /area/maintenance/disposal/incinerator) "czK" = ( /turf/closed/wall, -/area/security/vacantoffice) +/area/vacant_room/office) "czN" = ( /obj/docking_port/stationary/random{ dir = 4; @@ -51671,7 +51619,7 @@ start_active = 1 }, /turf/open/space, -/area/space/nearstation) +/area/ai_monitored/turret_protected/aisat) "cAV" = ( /obj/structure/cable{ icon_state = "1-2" @@ -51706,7 +51654,7 @@ start_active = 1 }, /turf/open/space, -/area/space/nearstation) +/area/ai_monitored/turret_protected/aisat) "cAY" = ( /obj/structure/cable{ icon_state = "4-8" @@ -51766,7 +51714,7 @@ start_active = 1 }, /turf/open/space, -/area/space/nearstation) +/area/ai_monitored/turret_protected/aisat) "cBg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/landmark/event_spawn, @@ -51809,6 +51757,10 @@ /area/hallway/secondary/exit) "cBm" = ( /obj/effect/landmark/event_spawn, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/machinery/light, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "cBn" = ( @@ -51880,7 +51832,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/white, -/area/science/research) +/area/science) "cBy" = ( /obj/machinery/door/airlock{ name = "Custodial Closet"; @@ -51923,13 +51875,12 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/aft) "cBE" = ( @@ -52022,14 +51973,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cBZ" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/turf/open/floor/plasteel/grimy, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/carpet, /area/chapel/office) "cCb" = ( /obj/structure/table, @@ -52093,33 +52041,20 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "cCp" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood/AMinus, -/obj/item/reagent_containers/blood/BMinus{ - pixel_x = -4; - pixel_y = 4 +/obj/machinery/light_switch{ + pixel_y = -25 }, -/obj/item/reagent_containers/blood/BPlus{ - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/reagent_containers/blood/OMinus, -/obj/item/reagent_containers/blood/OPlus{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/APlus, -/obj/item/reagent_containers/blood/random, /turf/open/floor/plasteel, -/area/medical/sleeper) +/area/medical/surgery) "cCq" = ( /obj/machinery/deepfryer, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"cCs" = ( +/obj/structure/closet/emcloset, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) "cCt" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance{ @@ -52204,7 +52139,7 @@ /area/space/nearstation) "cCS" = ( /obj/structure/lattice, -/turf/closed/wall/r_wall, +/turf/closed/wall, /area/engine/atmos) "cCT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -52238,6 +52173,12 @@ /obj/machinery/vending/engivend, /turf/open/floor/plasteel, /area/engine/engineering) +"cDs" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/fore) "cDB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52305,6 +52246,12 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) +"cGf" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "cGz" = ( /obj/structure/table/wood, /obj/item/instrument/violin, @@ -52654,9 +52601,6 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/plasteel, /area/security/brig) "cLS" = ( @@ -52756,6 +52700,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cNS" = ( @@ -52768,15 +52715,19 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cNT" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/obj/machinery/meter, /turf/open/floor/plating, /area/maintenance/starboard) "cNU" = ( @@ -52865,6 +52816,9 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/security/prison) +"cPb" = ( +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "cPn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/freezer, @@ -53247,27 +53201,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"cTL" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cTM" = ( -/obj/machinery/power/apc{ - areastring = "/area/maintenance/department/medical/morgue"; - dir = 4; - name = "Morgue Maintenance APC"; - pixel_x = 26 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "cTO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53332,6 +53265,14 @@ /obj/machinery/vending/coffee, /turf/open/floor/wood, /area/bridge/meeting_room) +"cVw" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/tower, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cVK" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, @@ -53350,6 +53291,10 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) +"dal" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating, +/area/maintenance/port/fore) "daq" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 1 @@ -53386,6 +53331,33 @@ /obj/machinery/meter, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"dcX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ddI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ddM" = ( +/obj/structure/sign/poster/official/the_owl{ + pixel_x = 32 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/starboard/aft) "dev" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -53448,15 +53420,17 @@ dir = 4 }, /obj/machinery/suit_storage_unit/atmos, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/plasteel, /area/engine/atmos) +"dkM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "dly" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -53467,6 +53441,22 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"dmX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/chapel/main) +"dnW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "dqb" = ( /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) @@ -53485,6 +53475,14 @@ icon_state = "carpetsymbol" }, /area/crew_quarters/theatre) +"dsJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table/glass, +/obj/item/toy/figure/chaplain{ + pixel_y = -9 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "dtx" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53511,11 +53509,23 @@ }, /turf/closed/wall, /area/science/circuit) +"dxF" = ( +/obj/machinery/gear_painter, +/turf/open/floor/wood, +/area/maintenance/bar) "dyE" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-4" }, -/turf/open/floor/plasteel, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/security/brig) "dyS" = ( /obj/effect/turf_decal/tile/green{ @@ -53550,8 +53560,18 @@ /turf/open/floor/plasteel, /area/engine/atmos) "dBm" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, +/obj/machinery/light/floor, +/obj/structure/table, +/obj/item/clothing/glasses/sunglasses/reagent, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -5; + pixel_y = 13 + }, +/obj/item/storage/fancy/cigarettes/cigpack_uplift{ + pixel_x = 10; + pixel_y = 7 + }, +/turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) "dCr" = ( /obj/structure/pool/Rboard, @@ -53565,9 +53585,6 @@ /turf/open/space, /area/space/nearstation) "dCV" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -53576,6 +53593,10 @@ }, /turf/open/floor/plasteel, /area/security/range) +"dEh" = ( +/obj/machinery/jukebox/disco/indestructible, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/maintenance/starboard/aft) "dEX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/requests_console{ @@ -53589,6 +53610,16 @@ "dFX" = ( /turf/closed/wall, /area/crew_quarters/fitness/pool) +"dHp" = ( +/mob/living/simple_animal/bot/secbot/grievous/toy, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) +"dIu" = ( +/obj/structure/chair/sofa{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "dJL" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53699,6 +53730,22 @@ dir = 4 }, /area/crew_quarters/fitness/pool) +"ecp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"edj" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "edA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -53734,6 +53781,18 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"eiB" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "eiZ" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/purple/visible{ @@ -53757,6 +53816,21 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/security/execution/transfer) +"enJ" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"enS" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"eoD" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "epD" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/machinery/light{ @@ -53835,12 +53909,25 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness) +"ewN" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/watermelon, +/obj/item/seeds/cannabis, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "exP" = ( /obj/item/kirbyplants{ icon_state = "plant-14" }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"eyq" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/turf/open/floor/plating, +/area/maintenance/port/fore) "eyM" = ( /obj/machinery/mineral/ore_redemption{ input_dir = 2; @@ -53882,6 +53969,17 @@ /obj/machinery/vending/cola/space_up, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"eCm" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/atmos) "eCr" = ( /obj/structure/closet{ name = "Suit Closet" @@ -53914,6 +54012,14 @@ }, /turf/closed/wall/r_wall, /area/engine/gravity_generator) +"eDz" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/aft) "eEe" = ( /obj/machinery/door/airlock{ name = "Theatre Backstage"; @@ -53972,6 +54078,10 @@ "eQb" = ( /turf/open/floor/carpet, /area/crew_quarters/dorms) +"eRr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "eRz" = ( /obj/structure/lattice, /obj/structure/grille, @@ -53981,6 +54091,12 @@ /obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/carpet, /area/crew_quarters/dorms) +"eUy" = ( +/obj/machinery/door/airlock{ + name = "Starboard Emergency Storage" + }, +/turf/open/floor/plating, +/area/storage/emergency/starboard) "eUW" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -54024,11 +54140,30 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"eXL" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"eZa" = ( +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "fbp" = ( /obj/structure/tank_dispenser, /obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/science/storage) +"fcd" = ( +/obj/structure/chair/sofa/right{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/port/fore) "fcn" = ( /obj/structure/lattice, /turf/closed/wall/r_wall, @@ -54080,6 +54215,16 @@ dir = 4 }, /area/crew_quarters/theatre) +"fhu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/clothing/under/costume/owl, +/obj/item/clothing/suit/toggle/owlwings, +/obj/item/clothing/mask/gas/owl_mask, +/turf/open/floor/plating, +/area/maintenance/port/fore) "fiy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -54097,6 +54242,16 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"fkW" = ( +/obj/structure/cable/white, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "flc" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -54112,6 +54267,20 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"flP" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/carrot, +/obj/item/seeds/cannabis/white, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"fmJ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "fne" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -54232,6 +54401,10 @@ }, /turf/open/floor/plasteel, /area/security/range) +"fsQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "fty" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/orange/visible, @@ -54250,6 +54423,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"fvk" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/medical/medbay/central) "fvY" = ( /obj/machinery/computer/cryopod{ pixel_y = 26 @@ -54272,6 +54449,28 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"fxk" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/door/window/northright, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/blood/innards, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "fxx" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -54372,10 +54571,25 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engine/atmos) +"fLN" = ( +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/structure/table/wood/poker, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "fMp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/security/courtroom) +"fNN" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "fOA" = ( /obj/machinery/door/airlock{ name = "Theatre Backstage"; @@ -54446,6 +54660,11 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"gaF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/paramedic) "gbd" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -54478,9 +54697,16 @@ /turf/open/floor/plating, /area/security/prison) "gbT" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, +/obj/item/storage/box/lights/mixed, +/obj/machinery/power/apc{ + areastring = "/area/storage/emergency/starboard"; + dir = 1; + name = "Starboard Emergency Storage APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) "gcF" = ( @@ -54492,6 +54718,15 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"geg" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/table, +/obj/item/trash/plate, +/obj/item/reagent_containers/food/snacks/egg/yellow, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gfC" = ( /obj/effect/turf_decal/tile/red, /obj/structure/chair{ @@ -54505,6 +54740,15 @@ }, /turf/open/floor/carpet, /area/crew_quarters/cryopod) +"gfQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "ghD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, @@ -54567,11 +54811,10 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness) "gsM" = ( -/obj/machinery/door/airlock/maintenance/abandoned{ - req_access_txt = "12" - }, +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "gvX" = ( /turf/open/floor/plasteel/yellowsiding, /area/crew_quarters/fitness/pool) @@ -54657,6 +54900,14 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"gDZ" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) +"gGK" = ( +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "gIU" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -54667,6 +54918,31 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"gJN" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"gKl" = ( +/obj/structure/cable/white, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"gKo" = ( +/obj/structure/table/glass, +/obj/item/restraints/handcuffs/cable/zipties, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"gKG" = ( +/obj/structure/bedsheetbin/towel, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "gLz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54677,14 +54953,15 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"gLG" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gLH" = ( -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, +/obj/structure/closet/wardrobe/white, +/obj/item/clothing/shoes/jackboots, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka, /turf/open/floor/plating, /area/maintenance/port/fore) "gMl" = ( @@ -54717,11 +54994,11 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating, /area/security/brig) "gOZ" = ( @@ -54730,6 +55007,12 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness) +"gQr" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "gas to sauna" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "gQX" = ( /obj/machinery/button/door{ id = "LockerShitter4"; @@ -54753,6 +55036,11 @@ }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/toilet/locker) +"gRV" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/starboard/aft) "gRZ" = ( /obj/structure/bookcase{ name = "Forbidden Knowledge" @@ -54789,13 +55077,30 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"gYo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gZG" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/reagent_containers/glass/beaker/synthflesh, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white/side{ dir = 8 }, -/area/medical/sleeper) +/area/medical/surgery) "haM" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -54813,6 +55118,20 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"hbi" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/glowshroom, +/obj/item/seeds/cannabis/ultimate, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/starboard/aft) "hcb" = ( /turf/open/floor/carpet, /area/crew_quarters/theatre) @@ -54835,17 +55154,33 @@ /area/engine/atmos) "hgO" = ( /obj/structure/table, -/obj/item/storage/box/dice{ +/obj/item/storage/dice{ pixel_x = 4; pixel_y = 4 }, /obj/item/reagent_containers/food/snacks/cherrycupcake, /turf/open/floor/wood, /area/crew_quarters/bar) +"hho" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/port/fore) "hiV" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/department/electrical) +"hke" = ( +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "hlT" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -54863,6 +55198,12 @@ }, /turf/closed/wall, /area/crew_quarters/dorms) +"hnc" = ( +/obj/structure/chair/pew/left{ + dir = 4 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "hnU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -54895,6 +55236,10 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"htu" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plating, +/area/maintenance/port/fore) "hxn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/green/visible, @@ -54917,6 +55262,11 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"hCn" = ( +/obj/structure/closet/firecloset, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) "hGH" = ( /obj/machinery/door/airlock{ desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; @@ -54947,6 +55297,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"hMs" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "hOv" = ( /obj/structure/table/wood/fancy, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -55020,6 +55376,21 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"hTt" = ( +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/directional, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"hUJ" = ( +/obj/structure/reagent_dispensers/beerkeg, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "hWd" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -55027,6 +55398,15 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"hYd" = ( +/obj/machinery/door/airlock/medical{ + name = "Morgue"; + req_access_txt = "6" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "ibK" = ( /turf/open/floor/plasteel, /area/security/processing) @@ -55044,6 +55424,19 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, /area/security/range) +"ifJ" = ( +/obj/machinery/biogenerator, +/obj/structure/sign/poster/contraband/have_a_puff{ + pixel_y = -32 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ihR" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "iiW" = ( /turf/open/floor/wood, /area/maintenance/bar) @@ -55061,6 +55454,10 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"ijO" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "ikk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55076,6 +55473,14 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"iky" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "imk" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -55087,6 +55492,14 @@ /obj/structure/falsewall, /turf/open/floor/plating, /area/maintenance/bar) +"imZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/maintenance/starboard/aft) "inq" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -55118,9 +55531,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) -"ipA" = ( -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) "iql" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -55177,6 +55587,27 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"ivJ" = ( +/obj/structure/curtain{ + pixel_y = -32 + }, +/obj/structure/table/optable, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"ixd" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) +"iyG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "izg" = ( /obj/item/cigbutt/cigarbutt, /turf/open/floor/plating, @@ -55213,6 +55644,31 @@ }, /turf/closed/wall/r_wall, /area/engine/gravity_generator) +"iIs" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/gibs/ipc/limb, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) +"iII" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/closet, +/obj/item/clothing/head/bowler, +/obj/item/clothing/neck/tie/red, +/obj/item/clothing/mask/cigarette/pipe, +/obj/item/clothing/mask/fakemoustache, +/turf/open/floor/plating, +/area/maintenance/port/fore) "iIS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -55221,6 +55677,10 @@ /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/engine/atmos) +"iKV" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plating, +/area/engine/atmos) "iLJ" = ( /obj/item/reagent_containers/glass/bucket, /mob/living/simple_animal/pet/bumbles, @@ -55248,7 +55708,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) "iPX" = ( /obj/structure/table, /obj/machinery/reagentgrinder{ @@ -55259,6 +55719,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/fore) +"iQc" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "iRj" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -55268,6 +55733,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"iRV" = ( +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) "iTq" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -55283,6 +55753,21 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"iUp" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) +"iVH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/medical/surgery) "iVJ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -55306,6 +55791,18 @@ /obj/item/coin/silver, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"iWK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) "iYE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55321,6 +55818,14 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"jaG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/port/fore) "jaH" = ( /obj/structure/door_assembly/door_assembly_mai, /obj/item/electronics/airlock, @@ -55342,6 +55847,27 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"jbp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/flashlight, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"jbr" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/port/fore) +"jbK" = ( +/obj/item/stack/sheet/glass{ + amount = 20; + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/stack/sheet/metal/fifty, +/obj/structure/rack, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) "jdj" = ( /obj/docking_port/stationary/random{ dir = 4; @@ -55350,10 +55876,33 @@ }, /turf/open/space, /area/space) +"jdE" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/vending/wallmed{ + pixel_y = -28 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "jex" = ( -/obj/machinery/smartfridge/organ/preloaded, -/turf/closed/wall, -/area/medical/sleeper) +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/surgery) "jez" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, @@ -55382,6 +55931,10 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall, /area/engine/engineering) +"jiT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "jjC" = ( /obj/structure/table/wood, /obj/item/toy/cards/deck, @@ -55413,6 +55966,12 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"jon" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "gas to sauna" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "jqv" = ( /obj/structure/chair/wood/normal{ dir = 1 @@ -55425,6 +55984,15 @@ /obj/item/beacon, /turf/open/floor/plasteel/white, /area/science/circuit) +"jsO" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/glowshroom, +/obj/item/seeds/corn, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "jtj" = ( /obj/machinery/space_heater, /obj/effect/turf_decal/stripes/line{ @@ -55432,6 +56000,11 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"juy" = ( +/obj/structure/mopbucket, +/obj/item/mop, +/turf/open/floor/plating, +/area/maintenance/port/fore) "juG" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -55448,6 +56021,10 @@ /obj/structure/closet/athletic_mixed, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"jwH" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hydroponics) "jxF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55537,6 +56114,10 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"jDZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/maintenance/port/fore) "jEc" = ( /obj/machinery/vr_sleeper{ dir = 8 @@ -55552,12 +56133,27 @@ dir = 1 }, /area/crew_quarters/fitness) +"jFB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/fore) "jFH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"jGw" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/aft) "jGI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55594,6 +56190,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "jIj" = ( @@ -55608,6 +56207,20 @@ }, /turf/open/space, /area/solar/starboard/fore) +"jIy" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"jIW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/maintenance/port/fore) "jJF" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable{ @@ -55641,6 +56254,11 @@ }, /turf/open/space, /area/space) +"jLJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small, +/turf/open/floor/wood, +/area/maintenance/port/fore) "jLT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -55673,6 +56291,13 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"jUV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/maintenance/port/fore) "jVl" = ( /obj/structure/cable{ icon_state = "4-8" @@ -55717,15 +56342,15 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/security/brig) "kcx" = ( @@ -55733,6 +56358,17 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/space/basic, /area/space/nearstation) +"kdF" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/closet/crate/coffin, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "kdO" = ( /obj/machinery/pool/controller, /turf/open/floor/plasteel/yellowsiding, @@ -55774,12 +56410,20 @@ }, /turf/open/floor/plating, /area/storage/tech) +"kfS" = ( +/turf/closed/wall/rust, +/area/maintenance/starboard/aft) "kfX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/closed/wall/r_wall, /area/engine/engine_smes) +"kgk" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard) "kgr" = ( /obj/machinery/light/small{ brightness = 3; @@ -55812,11 +56456,38 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) -"kls" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +"kil" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"kiW" = ( +/obj/machinery/button/door{ + id = "Sauna"; + name = "Sauna Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) +"kiY" = ( +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay 4" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"klN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/fore) "kmw" = ( /obj/structure/chair/comfy/black{ dir = 1 @@ -55862,6 +56533,19 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"kqo" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/chair/pew{ + dir = 4 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) +"kqy" = ( +/obj/machinery/gear_painter, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "kqI" = ( /obj/structure/window, /turf/open/floor/wood, @@ -55901,6 +56585,10 @@ }, /turf/open/floor/plasteel, /area/security/range) +"kuL" = ( +/obj/item/trash/candy, +/turf/open/floor/plating, +/area/maintenance/port/fore) "kvl" = ( /obj/structure/grille, /turf/closed/wall/r_wall, @@ -55916,6 +56604,12 @@ }, /turf/open/floor/wood, /area/bridge/meeting_room) +"kwY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/maintenance/port/fore) "kxf" = ( /obj/machinery/vr_sleeper{ dir = 4 @@ -55953,7 +56647,10 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "kAJ" = ( -/obj/machinery/portable_atmospherics/pump, +/obj/structure/table/wood/poker, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/dropper, /turf/open/floor/plating, /area/maintenance/starboard/aft) "kAO" = ( @@ -56036,6 +56733,14 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"kIN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/wood/normal, +/obj/machinery/light/small/broken{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/maintenance/starboard/aft) "kJE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -56062,6 +56767,10 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"kOL" = ( +/obj/structure/table/glass, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "kPd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ @@ -56076,14 +56785,25 @@ /obj/structure/disposalpipe/junction/flip, /turf/open/floor/plasteel, /area/hallway/primary/central) -"kQk" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +"kQa" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Paramedic's Office"; + req_access_txt = "5;6;12;64" }, -/obj/item/storage/toolbox/electrical, /turf/open/floor/plating, +/area/medical/paramedic) +"kQe" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/fancy/cigarettes/dromedaryco, +/obj/item/storage/fancy/cigarettes/dromedaryco{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kQk" = ( +/turf/closed/wall, /area/maintenance/department/medical/morgue) "kQz" = ( /obj/structure/cable{ @@ -56119,6 +56839,25 @@ /obj/machinery/chem_master/condimaster, /turf/open/floor/plating, /area/maintenance/fore) +"kVj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Paramedic's Office"; + req_access_txt = "5;6;12;64" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "kWp" = ( /obj/structure/shuttle/engine/heater{ dir = 1 @@ -56149,15 +56888,31 @@ /turf/open/floor/plasteel, /area/security/brig) "laq" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/structure/cable{ icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/range) +"laN" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/storage/emergency/starboard) +"leE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/human/body, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "lfV" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56229,6 +56984,25 @@ icon_state = "wood-broken6" }, /area/maintenance/bar) +"lqO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 18 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"lre" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck/syndicate{ + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "lsk" = ( /obj/machinery/vending/kink, /turf/open/floor/plasteel, @@ -56261,6 +57035,12 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"lzk" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/turf/closed/wall, +/area/maintenance/port/fore) "lzt" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/stripes/line, @@ -56280,6 +57060,15 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"lBd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/chair, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) "lBz" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -56327,12 +57116,27 @@ }, /turf/closed/wall, /area/maintenance/disposal/incinerator) +"lLf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/fore) "lMg" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/plasteel, /area/science/circuit) +"lNB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/xmastree{ + pixel_x = 14 + }, +/turf/open/floor/carpet, +/area/chapel/main) "lNH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -56369,12 +57173,25 @@ }, /turf/open/floor/carpet, /area/crew_quarters/theatre) +"lUP" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "lUS" = ( /obj/structure/table/wood/fancy/black, /obj/machinery/light/small, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/carpet, /area/crew_quarters/dorms) +"lXy" = ( +/obj/machinery/light, +/obj/item/light/tube/broken, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "lZl" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -56385,7 +57202,7 @@ /area/maintenance/starboard/aft) "lZn" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; + id_tag = null; name = "Brig Infirmary"; req_access_txt = "2" }, @@ -56408,6 +57225,13 @@ }, /turf/closed/wall, /area/crew_quarters/fitness/pool) +"lZN" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Sauna"; + name = "Sauna" + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "maT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -56552,6 +57376,17 @@ icon_state = "wood-broken5" }, /area/maintenance/bar) +"mqo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) "mqZ" = ( /obj/item/reagent_containers/glass/beaker, /turf/open/floor/plating, @@ -56560,6 +57395,17 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/wood, /area/maintenance/bar) +"mtU" = ( +/obj/structure/sign/departments/holy, +/turf/closed/wall, +/area/chapel/main) +"mug" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "mvt" = ( /obj/machinery/airalarm{ dir = 1; @@ -56567,6 +57413,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"mwS" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/port/fore) "mxn" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Three" @@ -56582,6 +57433,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/crew_quarters/theatre) +"mzv" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth" + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "mzB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/window, @@ -56596,6 +57453,29 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"mDZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/slime/limb, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) +"mFo" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) "mGw" = ( /obj/machinery/door/airlock/security{ name = "Labor Shuttle"; @@ -56608,6 +57488,26 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/range) +"mHA" = ( +/obj/item/reagent_containers/food/snacks/grown/banana, +/obj/item/reagent_containers/food/snacks/grown/banana, +/obj/item/reagent_containers/food/snacks/grown/wheat, +/obj/item/reagent_containers/food/snacks/grown/watermelon, +/obj/item/reagent_containers/food/snacks/grown/watermelon, +/obj/item/reagent_containers/food/snacks/grown/watermelon, +/obj/item/reagent_containers/food/snacks/grown/citrus/orange, +/obj/item/reagent_containers/food/snacks/grown/grapes, +/obj/item/reagent_containers/food/snacks/grown/cocoapod, +/obj/structure/rack, +/obj/item/seeds/wheat, +/obj/item/seeds/watermelon, +/obj/item/seeds/watermelon, +/obj/item/seeds/grape, +/obj/item/seeds/glowshroom, +/obj/item/seeds/cannabis/rainbow, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "mHU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/light_construct{ @@ -56631,6 +57531,12 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) +"mLS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/aft) "mNi" = ( /obj/machinery/light_switch{ pixel_x = -20 @@ -56742,9 +57648,24 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"mZx" = ( +/obj/structure/table/glass, +/obj/item/storage/box/matches{ + pixel_x = 4; + pixel_y = -8 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "naI" = ( /turf/open/space, /area/space/station_ruins) +"nbr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/port/fore) "nbT" = ( /obj/structure/cable{ icon_state = "0-8" @@ -56834,6 +57755,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/fore) +"nnM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/starboard/aft) +"noa" = ( +/obj/machinery/door/airlock/maintenance/abandoned, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "noy" = ( /obj/structure/sign/poster/contraband/smoke{ desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. "; @@ -56847,6 +57779,29 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) +"noL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"noT" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/starboard/aft) +"nsf" = ( +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nss" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -56861,6 +57816,12 @@ "nsA" = ( /turf/closed/wall, /area/crew_quarters/abandoned_gambling_den) +"ntt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "nuw" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -56884,6 +57845,17 @@ }, /turf/open/floor/plating, /area/construction) +"nyi" = ( +/turf/closed/wall, +/area/medical/paramedic) +"nzB" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/grass, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nzR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -56891,12 +57863,10 @@ /turf/closed/wall, /area/maintenance/disposal/incinerator) "nBI" = ( -/obj/item/cigbutt/cigarbutt, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/chair{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/plating, +/turf/closed/wall, /area/maintenance/port/fore) "nEj" = ( /obj/effect/spawner/structure/window/reinforced, @@ -56905,6 +57875,9 @@ }, /turf/open/floor/plating, /area/security/processing) +"nEu" = ( +/turf/closed/wall, +/area/medical/surgery) "nFj" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -56930,6 +57903,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"nJP" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "nJQ" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/dark/visible, @@ -56969,10 +57949,13 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "nRG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/wood, /area/maintenance/starboard/aft) "nSt" = ( /obj/effect/turf_decal/tile/neutral{ @@ -57007,6 +57990,11 @@ }, /turf/open/floor/plasteel, /area/hydroponics) +"nXg" = ( +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/fore) "nYe" = ( /obj/structure/safe, /obj/item/clothing/head/bearpelt, @@ -57027,6 +58015,16 @@ /obj/item/gun/ballistic/revolver/nagant, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) +"nYK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/wood/poker, +/obj/item/clothing/glasses/sunglasses/big, +/obj/item/stack/spacecash/c10{ + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/maintenance/starboard/aft) "nYT" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible{ @@ -57104,6 +58102,10 @@ /obj/machinery/vending/kink, /turf/open/floor/plating, /area/maintenance/bar) +"ofj" = ( +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/surgery) "ofU" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -57154,6 +58156,21 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"olh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/gibs/human/core, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "olr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, @@ -57221,6 +58238,13 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"ouf" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/closet/secure_closet/paramedic, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "ouQ" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -57231,9 +58255,6 @@ /area/hallway/primary/central) "ovv" = ( /obj/structure/table, -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -57305,6 +58326,22 @@ }, /turf/open/floor/carpet, /area/crew_quarters/dorms) +"oBQ" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Space Loop In" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"oCF" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "oDm" = ( /obj/machinery/gulag_teleporter, /turf/open/floor/plasteel, @@ -57348,6 +58385,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) +"oJV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "oKh" = ( /obj/structure/chair/wood/normal{ dir = 8 @@ -57363,12 +58407,26 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"oMT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "oNz" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"oQP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/grimy, +/area/maintenance/starboard/aft) +"oQY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/medical/medbay/central) "oSl" = ( /obj/machinery/door/airlock/security{ name = "Firing Range"; @@ -57413,6 +58471,11 @@ }, /turf/closed/wall/r_wall, /area/engine/atmos) +"oYQ" = ( +/obj/structure/chair/stool, +/mob/living/simple_animal/bot/medbot, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "oZl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/closet/wardrobe/pjs, @@ -57422,6 +58485,37 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"paJ" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"pbC" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/aft) +"pcK" = ( +/mob/living/simple_animal/bot/cleanbot{ + name = "C.L.E.A.N." + }, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) +"pcQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "pem" = ( /obj/machinery/button/door{ desc = "Bolts the doors to the Private Study."; @@ -57448,6 +58542,17 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/fore) +"pkg" = ( +/turf/open/floor/plating, +/area/storage/emergency/starboard) +"pkq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/fore) "pkF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/extinguisher_cabinet{ @@ -57456,6 +58561,21 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) +"pkS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "plC" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -57477,9 +58597,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -57504,6 +58621,13 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"ppw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/fore) "pqe" = ( /obj/structure/chair/sofa, /obj/structure/window{ @@ -57516,8 +58640,22 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"pqR" = ( +/obj/structure/chair/pew/right{ + dir = 4 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) +"psf" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/sign/poster/official/the_owl{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "psk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -57531,8 +58669,11 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/airlock/vault, /obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/vault{ + name = "Vault Door"; + req_access_txt = "53" + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "puh" = ( @@ -57549,6 +58690,14 @@ dir = 1 }, /area/crew_quarters/fitness) +"pvJ" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "pzk" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -57580,9 +58729,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -57590,7 +58736,10 @@ dir = 4 }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" }, /turf/open/floor/plasteel, /area/security/brig) @@ -57614,6 +58763,21 @@ /obj/item/target/syndicate, /turf/open/floor/plating, /area/security/range) +"pDG" = ( +/obj/structure/closet, +/obj/item/clothing/glasses/science, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"pFY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/kirbyplants{ + icon_state = "plant-06" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "pHl" = ( /obj/structure/table, /obj/item/storage/box/beakers{ @@ -57639,7 +58803,7 @@ pixel_x = 30 }, /turf/open/floor/plasteel/white, -/area/medical/sleeper) +/area/medical/medbay/central) "pHO" = ( /obj/effect/turf_decal/tile/blue, /obj/structure/sign/poster/contraband/fun_police{ @@ -57665,6 +58829,9 @@ }, /turf/open/floor/wood, /area/library) +"pKV" = ( +/turf/closed/wall/r_wall, +/area/science/research) "pLn" = ( /obj/machinery/conveyor/inverted{ dir = 5; @@ -57672,6 +58839,14 @@ }, /turf/open/floor/plating, /area/maintenance/disposal) +"pMQ" = ( +/obj/structure/window/reinforced, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) "pPi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -57700,9 +58875,6 @@ /turf/open/floor/plating, /area/crew_quarters/fitness) "pQr" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 8 @@ -57715,6 +58887,12 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"pRj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/maintenance/port/fore) "pRs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -57750,6 +58928,30 @@ }, /turf/open/floor/plating, /area/engine/atmos) +"pVi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/maintenance/port/fore) +"pXG" = ( +/obj/structure/table/wood, +/obj/item/candle{ + pixel_x = 5; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/chapel/main) +"pYQ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/glass/bucket, +/obj/structure/sign/poster/official/hydro_ad{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "qaY" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -57828,11 +59030,49 @@ }, /turf/closed/wall, /area/quartermaster/miningdock) +"qjo" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"qkn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) +"qkC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qll" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/port/fore) +"qlY" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/aft) "qmn" = ( /obj/machinery/computer/libraryconsole/bookmanagement, /obj/structure/table, /turf/open/floor/plasteel, /area/security/prison) +"qnC" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "qqs" = ( /obj/structure/mirror{ pixel_y = 32 @@ -57842,6 +59082,23 @@ }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/toilet) +"qtw" = ( +/obj/machinery/door/airlock/external{ + dir = 2; + name = "Port Docking Bay 4" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"qtH" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "qus" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -57877,12 +59134,46 @@ /obj/structure/lattice, /turf/closed/wall/r_wall, /area/crew_quarters/heads/captain) +"qCR" = ( +/obj/structure/musician/piano, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/dark, +/area/chapel/main) +"qEB" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/berry, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"qFf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) +"qGw" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "qIw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/carpet, /area/crew_quarters/cryopod) +"qIO" = ( +/turf/open/floor/plating/rust, +/area/maintenance/starboard/aft) "qJr" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -57895,6 +59186,12 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"qLy" = ( +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "qLR" = ( /obj/structure/mirror{ pixel_y = 32 @@ -57907,6 +59204,25 @@ }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) +"qMv" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/door/window/eastleft, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "qOc" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -57927,6 +59243,23 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) +"qSf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"qSF" = ( +/obj/item/seeds/bee_balm/honey_balm, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "qTG" = ( /obj/machinery/light{ dir = 8 @@ -57938,7 +59271,14 @@ icon_state = "plant-22" }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) +"qUh" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Chapel Office"; + req_access_txt = "22" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "qVP" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -57956,6 +59296,33 @@ /obj/structure/chair/sofa/left, /turf/open/floor/plasteel, /area/security/prison) +"qXJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"qZD" = ( +/obj/effect/decal/cleanable/egg_smudge, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"raH" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"rba" = ( +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "rcD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58019,6 +59386,16 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) +"rgW" = ( +/obj/structure/cable/white, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "rhX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -58042,9 +59419,16 @@ /turf/open/floor/plasteel, /area/engine/atmos) "rmX" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/plating, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/item/light/bulb/broken, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, /area/maintenance/starboard/aft) "rnt" = ( /obj/structure/chair/comfy/black{ @@ -58115,6 +59499,12 @@ /obj/item/clothing/under/dress/sundress, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"rsp" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "rtl" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -58171,6 +59561,14 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"rxF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table/glass, +/obj/item/storage/book/bible{ + pixel_y = 17 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "ryr" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -58198,9 +59596,6 @@ /area/maintenance/bar) "rCl" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, @@ -58221,6 +59616,12 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"rGo" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "rGq" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -58238,23 +59639,10 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"rJv" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/turf/open/floor/plating, -/area/security/brig) "rJw" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating/airless, +/obj/structure/table/glass, +/obj/item/hemostat, +/turf/open/floor/plating, /area/maintenance/port/fore) "rKP" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -58299,6 +59687,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/fore) +"rSf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "rTo" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -58321,6 +59723,25 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"rUe" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/medbay/central) +"rVy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "rVN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -58333,6 +59754,22 @@ dir = 1 }, /area/engine/atmos) +"rWg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "rXl" = ( /obj/structure/chair/office/light, /obj/machinery/firealarm{ @@ -58344,6 +59781,26 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"rYa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"rZQ" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space/basic, +/area/space) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -58382,9 +59839,6 @@ }, /area/crew_quarters/fitness) "seP" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/structure/cable{ icon_state = "0-8" }, @@ -58427,6 +59881,15 @@ /obj/structure/closet/crate, /turf/open/floor/plasteel, /area/engine/atmos) +"spR" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/chair/pew{ + dir = 8 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "sqg" = ( /obj/structure/table/wood, /obj/item/clothing/under/misc/pj/red, @@ -58443,6 +59906,9 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) +"srk" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) "srG" = ( /obj/machinery/airalarm{ dir = 1; @@ -58512,11 +59978,31 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"sAH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "sAM" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" }, /area/maintenance/bar) +"sCa" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/monkey_recycler, +/turf/open/floor/plating, +/area/maintenance/port/fore) "sEi" = ( /obj/machinery/vr_sleeper{ dir = 4 @@ -58574,6 +60060,19 @@ }, /turf/open/floor/plasteel, /area/hydroponics) +"sJw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/computer/shuttle/mining/common{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Arrivals Bay Mining Dock"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "sJx" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -58593,6 +60092,11 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"sKL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/aft) "sLa" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -58626,6 +60130,14 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"sMG" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/starboard/aft) "sNK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/structure/cable{ @@ -58638,6 +60150,9 @@ dir = 4 }, /obj/machinery/door/airlock/maintenance/abandoned, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "sOA" = ( @@ -58663,6 +60178,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/engine/engine_smes) +"sRd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/port/fore) "sRH" = ( /obj/machinery/autolathe/secure{ name = "public autolathe" @@ -58677,6 +60197,14 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/circuit) +"sVD" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/box/matches{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "sWR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -58722,6 +60250,18 @@ /obj/structure/filingcabinet/employment, /turf/open/floor/wood, /area/crew_quarters/heads/captain) +"thg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "thB" = ( /obj/structure/sign/warning/securearea{ pixel_y = -32 @@ -58781,12 +60321,36 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"tqG" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "trb" = ( /obj/machinery/light{ dir = 4 }, /turf/open/floor/plasteel, /area/security/courtroom) +"tsq" = ( +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 9 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ttd" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "ttL" = ( /obj/structure/sign/poster/contraband/random{ pixel_y = 32 @@ -58810,6 +60374,13 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"twE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "tyX" = ( /obj/structure/cable{ icon_state = "4-8" @@ -58835,9 +60406,9 @@ /area/crew_quarters/fitness/pool) "tAH" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) "tCa" = ( /obj/structure/table/wood, /obj/item/instrument/guitar{ @@ -58859,7 +60430,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "tEK" = ( /obj/structure/cable{ icon_state = "4-8" @@ -58873,6 +60444,15 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"tEL" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) "tHh" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/red, @@ -58885,6 +60465,33 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"tHy" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/item/kirbyplants{ + icon_state = "applebush" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"tIE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "tJi" = ( /obj/machinery/airalarm{ dir = 4; @@ -58949,7 +60556,13 @@ "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) +/area/crew_quarters/kitchen/backroom) +"tNl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "tNF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -58983,6 +60596,12 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"tSm" = ( +/obj/item/kirbyplants{ + icon_state = "plant-18" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "tSo" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -58990,12 +60609,41 @@ }, /turf/open/space/basic, /area/space/nearstation) +"tTc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tTw" = ( +/obj/structure/girder, +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tVE" = ( +/obj/item/chair/wood{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/port/fore) "tWj" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /turf/open/floor/wood, /area/crew_quarters/theatre) +"tXs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/port/fore) "tXL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -59009,6 +60657,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"tZu" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "uaw" = ( /obj/machinery/power/apc{ areastring = "/area/maintenance/bar"; @@ -59089,6 +60743,14 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"ugq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/fore) "ugu" = ( /obj/structure/cable{ icon_state = "1-4" @@ -59102,6 +60764,20 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"uhq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/gibs/human/lizard/body, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "ujv" = ( /obj/structure/sign/departments/restroom, /turf/closed/wall, @@ -59156,6 +60832,14 @@ }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) +"uqu" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/cultivator, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "usE" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/structure/rack, @@ -59191,18 +60875,52 @@ /obj/structure/mineral_door/wood, /turf/open/floor/wood, /area/maintenance/bar) +"uwN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/stool/bar, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "uxY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/disposalpipe/junction, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, /obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 26 + }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"uys" = ( +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uzm" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/aft) "uzs" = ( /turf/open/floor/plasteel/yellowsiding{ dir = 4 @@ -59225,6 +60943,20 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"uBf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"uBr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "uCo" = ( /obj/structure/chair{ dir = 1 @@ -59270,6 +61002,13 @@ }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) +"uFV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "uFZ" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -59339,7 +61078,6 @@ /area/science/circuit) "uOJ" = ( /obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/vault, /obj/structure/cable{ icon_state = "1-2" }, @@ -59353,6 +61091,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/airlock/vault{ + name = "Vault Door"; + req_access_txt = "53" + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "uQR" = ( @@ -59379,6 +61121,11 @@ /obj/machinery/power/terminal, /turf/closed/wall/r_wall, /area/engine/gravity_generator) +"uRn" = ( +/obj/structure/chair/stool, +/mob/living/simple_animal/opossum, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "uRS" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -59404,6 +61151,16 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/fore) +"uUP" = ( +/obj/structure/cable/white, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "uVS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -59418,6 +61175,9 @@ /area/maintenance/starboard/aft) "uXt" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "vae" = ( @@ -59468,6 +61228,11 @@ }, /turf/open/floor/plating, /area/security/range) +"vdo" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "vdu" = ( /obj/structure/table/wood, /obj/machinery/airalarm{ @@ -59475,7 +61240,7 @@ pixel_y = -22 }, /turf/open/floor/wood, -/area/security/vacantoffice) +/area/vacant_room/office) "veS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -59575,6 +61340,19 @@ /obj/item/clothing/under/misc/pj/blue, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"vqE" = ( +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/obj/machinery/light/floor, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1480; + name = "Confessional Intercom"; + pixel_x = -25 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "vqP" = ( /obj/structure/bed/dogbed{ desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off."; @@ -59583,11 +61361,22 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/fore) +"vsr" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/starboard/aft) "vsM" = ( /obj/machinery/power/apc/auto_name/south, /obj/structure/cable, /turf/open/floor/carpet, /area/crew_quarters/cryopod) +"vsO" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/maintenance/starboard/aft) "vsT" = ( /obj/structure/closet/crate, /obj/item/book/manual/wiki/telescience, @@ -59616,13 +61405,17 @@ /turf/open/floor/wood, /area/library) "vxh" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/plating, /area/maintenance/starboard/aft) +"vxz" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plating, +/area/storage/emergency/starboard) "vxX" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -59638,13 +61431,13 @@ /area/crew_quarters/dorms) "vyK" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/machinery/door/poddoor/preopen{ id = "Secure Gate"; name = "brig shutters" }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating, /area/security/brig) "vzp" = ( @@ -59760,6 +61553,15 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/cryopod) +"vHo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/engine/atmos) "vHz" = ( /obj/structure/chair{ dir = 8 @@ -59930,7 +61732,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/lobby) "wcB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -59972,6 +61774,14 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) +"wjd" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table, +/obj/item/gps/mining{ + gpstag = "MINE_PUB" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "wje" = ( /obj/structure/rack, /obj/item/instrument/banjo, @@ -59980,9 +61790,36 @@ /obj/item/instrument/recorder, /turf/open/floor/plating, /area/maintenance/fore) +"wkc" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "wkN" = ( /turf/closed/wall, /area/science/circuit) +"wlg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"wly" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "wlI" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/showroomfloor, @@ -60041,6 +61878,14 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"wqW" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/starboard) "wrp" = ( /obj/machinery/light{ dir = 8 @@ -60050,6 +61895,16 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"wuO" = ( +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/costume, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "wvg" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -60099,6 +61954,16 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"wJA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "wKe" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -60156,14 +62021,22 @@ /obj/item/hand_labeler, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"wVg" = ( +/obj/item/kirbyplants/random, +/obj/item/storage/firstaid/regular{ + pixel_y = 5 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/starboard/aft) +"wVN" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "wWi" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "Atmospherics External Airlock"; - req_access_txt = "24" - }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) "wWT" = ( @@ -60230,6 +62103,12 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) +"xbi" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) "xbn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -60245,6 +62124,19 @@ }, /turf/open/space, /area/space/nearstation) +"xcz" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/onion, +/obj/structure/sign/poster/contraband/ambrosia_vulgaris{ + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "xgk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60257,6 +62149,10 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"xgs" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "xgC" = ( /obj/structure/cable{ icon_state = "0-4" @@ -60490,6 +62386,25 @@ /obj/machinery/vending/wardrobe/curator_wardrobe, /turf/open/floor/carpet, /area/library) +"xES" = ( +/obj/structure/table/glass, +/obj/item/storage/fancy/candle_box{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/storage/fancy/candle_box{ + pixel_x = 1; + pixel_y = 4 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) +"xFM" = ( +/obj/item/clothing/gloves/color/rainbow, +/obj/item/clothing/head/soft/rainbow, +/obj/item/clothing/shoes/sneakers/rainbow, +/obj/item/clothing/under/color/rainbow, +/turf/open/floor/plating, +/area/maintenance/port/fore) "xGQ" = ( /obj/structure/sign/plaques/golden{ pixel_y = 32 @@ -60506,9 +62421,8 @@ /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "xIa" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, /area/maintenance/starboard/aft) "xJC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -60573,6 +62487,12 @@ /obj/item/instrument/trombone, /turf/open/floor/wood, /area/crew_quarters/theatre) +"xRa" = ( +/obj/item/kirbyplants{ + icon_state = "plant-20" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "xSW" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -60658,6 +62578,13 @@ }, /turf/open/floor/plating, /area/security/processing) +"xWs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/maintenance/starboard/aft) "xXi" = ( /obj/machinery/vending/clothing, /turf/open/floor/plasteel, @@ -60683,6 +62610,13 @@ }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) +"yaW" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/seeds/ambrosia, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "ycd" = ( /obj/structure/toilet/secret/low_loot{ dir = 4 @@ -60723,10 +62657,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "yds" = ( -/obj/effect/decal/cleanable/vomit, -/obj/structure/chair{ - dir = 1 - }, +/obj/structure/table, +/obj/item/stamp, +/obj/item/poster/random_official, /turf/open/floor/plating, /area/maintenance/port/fore) "ydD" = ( @@ -60744,6 +62677,12 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/primary/central) +"ygb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/wood/wood_diagonal, +/area/maintenance/port/fore) "yhx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -67571,7 +69510,7 @@ aaa aaa aaa aaa -aaa +gDl aaa aaa aaa @@ -68080,10 +70019,10 @@ aaa aaa aaa aaa +rZQ aaa aaa -aaa -aae +aoV aaa aaa aaa @@ -68335,11 +70274,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +aaf +awW +kiY +awW +aaf aaa aaa aaa @@ -68592,11 +70531,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +aaf +awW +auP +awW +aaf aaa aaa aaa @@ -68849,11 +70788,11 @@ aaa aaa aaa aaa -aoV -aaa -aaa -aaa -aaa +arB +awW +qtw +awW +arB aaa aaa aaa @@ -69106,12 +71045,12 @@ aaa aaa aaa aaa -aoV -aaa -aaa -aaa -aaa -aoV +arB +tHy +ayl +sJw +arB +aaf aaa aaa aaa @@ -69363,12 +71302,12 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aoV +awW +lBd +ayl +rsp +awW +aaf aaa aaa aaa @@ -69620,15 +71559,15 @@ aaa aaa aaa aaa +awW +lBd +ayl +wjd +awW aaf aaa aaa aaa -aaf -kls -aaa -aaa -aaa aaa aaa aaa @@ -69878,9 +71817,9 @@ aaa aaa aaa arB -arB -arB -arB +mqo +ayn +pFY aAC aaf aaa @@ -70135,7 +72074,7 @@ aaa aaa aaa arB -awZ +iWK ayk awW aAD @@ -70396,7 +72335,7 @@ awZ ayl beK auP -cyt +cyu cyd aaa aaa @@ -73441,15 +75380,15 @@ aaa aaa aaa aaa -aaa -aaa aaf aaf aaf aaf alU +avS atJ amC +amC aKf bEJ axb @@ -73697,16 +75636,16 @@ aaa aaa aaa aaa -aae -aaa aaa aag alU alU alU alU -aCW +rGo amC +aKY +aoW asK alU alU @@ -73955,13 +75894,13 @@ aaa aaa aaa aaa -aaa -aaa aag -cyC +arN amC amC -gLH +auX +arM +ase ase avq aum @@ -74212,20 +76151,20 @@ aaa aaa aaa aaa -aaa -aaa gJi alU alU alU alU -asc -atn -aLt -aue -aue +aqO +alU +alU +kwY +qll aue aue +ayy +ayy aAe aBJ aCs @@ -74470,19 +76409,19 @@ aaa aaa aaa aaa -aaa -aaa alU -apL -aqK +atM +atW +alU +aqO alU -asc -atq aon -amC -axe -ays +aAY +aCW +gLH alU +hho +aKY auT aBI aCY @@ -74726,20 +76665,20 @@ aaa aaa aaa aaa -aaa -aaf alU alU -apM -aqL +atP +auV alU -asc +aqO +alU +axe atq -auX -avS amC amC alU +pvJ +mwS auT aBI aDc @@ -74982,21 +76921,21 @@ aaf aaf aaf aaf -aaa -aaa -aaa +aaf alU -aoS +arO amC aom ank -asc -atq -auZ -bsU +aqO +alU axf +ayu +auZ amC alU +gJN +amC auT aBI aDf @@ -75240,20 +77179,20 @@ aaa aaa aaa aaa -aaa -aaa alU +ash +atU aoR apO -aqM -arF -asc -atq -auY -amC -amC -ayt +aqO alU +axg +aAY +amC +rJw +alU +cGf +aKY aAw aBl aCZ @@ -75496,20 +77435,20 @@ aaf aaf aaf aaf -aaa -aaa -aaa +aaf alU +atn +amC aoT -amC +auY aqO -arG -asc -atq +alU +axi +aAY ava +gKo +alU amC -axg -ayu azF azF azF @@ -75754,19 +77693,19 @@ aaa aaa aaa aaa -aaa -aaa alU alU alU alU -arG -ash -atq -alU +auY +aqO +alU +alU +nBI alU alU alU +amC azF aAP aAP @@ -76011,14 +77950,14 @@ aaa aaa aaa aaa -aaa -aaa -aaf -aaa +gXs ali -aoX -arI -asi +aok +aKY +anJ +asc +aol +aol atr atN atN @@ -76268,18 +78207,18 @@ aaf aaf aaf aaa -aaa -aaa -aaf -aaa +gXs ali +aok amC +anJ +asi +arH +cCs +ann +ann +hCn arH -atP -auV -auV -auV -axK ayh azi aAx @@ -76527,16 +78466,16 @@ alR alR alR alR -alU -alU -alU +apL +pkq +wlg aqP -arJ alU -avb -aaH -bOi -atO +alU +alU +alU +alU +juy asK azF aAT @@ -76785,15 +78724,15 @@ amy ang alR aoj -amC -apP -amC -arH +kuL +anJ +tXs alU -aaH +axj +ayx bNb -aaf -atO +asO +alU asK azF aAS @@ -77042,15 +78981,15 @@ amA ani anI aol -aol -aol -aol -arL +jUV +arI +atL alU +axl avU avb bOi -atO +alU asK azF aAU @@ -77298,17 +79237,17 @@ alS amz anh anH +oCF amC -aok anJ aFJ -arK alU +axK +azG +aLt +jLJ alU -ali -alU -atO -asK +thg azF aAP aAP @@ -77555,16 +79494,16 @@ alR alR alR alR -amC -aom -apP -amC -arN -amC -amC -amC -amC -axi +alU +alU +arJ +alU +alU +ays +asO +bsU +tVE +alU asK azF azF @@ -77808,20 +79747,20 @@ aaf aaa aaa aaa -aaa alU +amF alF -anj -anJ +aoS +apM +enS aoU +aoW alU -amC -arM -alU +ayt avc -asO +pVi avV -atO +alU ayw atN aAV @@ -78065,22 +80004,22 @@ aaf aaf aaf aaf -gXs alU -alF -anl +amF +aoU amC alU -alU -amC -alU -alU apP +arK +amC alU alU -atP -auV -axK +alU +cyC +alU +pRj +cwS +cwS aAN aBL aDd @@ -78322,22 +80261,22 @@ aaf aaa aaa aaa -aaa alU alU ank alU alU -alU +aoW amC -amC -amC -arN -alU avW +axn +alU +nXg +jaG +alU +rYa amC -ayx -atO +sRd aAL aBQ aDb @@ -78579,22 +80518,22 @@ aaS aaa aaa aaa -aaa alU +anj amD -anm -amC -amC -ali amC alU -asO -atL -alU -avX -axf +arG +amC +arK +axn +alU +aoW +ntt +alU +fhu +amC amC -atO aAY aBQ aDl @@ -78836,23 +80775,23 @@ aaS aaf aaf aaf -gXs alU amC +arK amC +ank amC +arL amC -ali +aoW +dal +arK +noL +arH +psf +arK amC -alU -alU -alU -alU -alU -axj -alU -atO -aAY +klN aBQ aDk aDo @@ -79093,23 +81032,23 @@ aaS aaa aaa aaa -aaa alU +anl amE -ann -amC amC alU -amC +qjo alU -arN -atU alU -atU +alU +alU +alU +alU +alU +ntt amC -atJ -atO -aAY +avW +gYo aBQ aDn aDo @@ -79350,23 +81289,23 @@ aaa aaa aaa aaa -aaa alU alU alU -ank -alU -alU -amC -amC -amC amC alU -avc +alU +alU +avX amC -atJ -atO -aAY +arK +amC +amC +jFB +ppw +enJ +amC +iII aBQ aDm aDo @@ -79607,22 +81546,22 @@ aaa aaa aaa aaa -aaa alU -amF +anm alU amC alU +xFM alU -alU -alU +gLG +raH +jon +atU amC +uBf +amC +aKY amC -alU -atM -axl -auV -azG aAY aBQ aDp @@ -79864,21 +81803,21 @@ aaa aaa aaa aaa -aaa alU alU alU +ank +alU +alU +alU +alU +jbr +alU +alU amC -alU -aaH -rJw -arO -amC -amC -avc -atO +ntt axk -ayy +jbp ayy aAO aBN @@ -80122,20 +82061,20 @@ aaa aaa aaa aaa -aaa -aaa ali +aok +qZD anK -ali -aaf +geg alU -rJw -alU -atW -atW -atO -axn +pqR +kqo +hnc alU +amC +ntt +aAY +amC aoX atJ aBQ @@ -80379,19 +82318,19 @@ aaa aaa aaa aaa -aaa -aaa ali +aok +amC aKY -ali -aaf -aoV -aaf +cDs alU -ali -ali -atO -axo +fmJ +ygb +kiW +alU +amC +ntt +nbr ayz ayz ayz @@ -80629,27 +82568,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa ali ali +alU +alU +ali +alU +alU +alU +rGo amC +amC +amC +lZN +cPb +ygb +cPb +lZN +amC +jIW +ddI alU -alU -alU -aaf -aoV -aae -aaH -avY -axo -arP fgG rqW aGD @@ -80883,30 +82822,30 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aae aaa aaa ali -yds +anL +avY +tZu amC aon -aoW -arP -aqQ -aqQ -aqQ -aqQ -avZ -axo -arP +yds +alU +amC +amC +amC +htu +alU +edj +ygb +gKG +alU +amC +ntt +ugq +alU rPU fne aGr @@ -81143,27 +83082,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa ali +amC +avY aKY amC amC amC -gsM -aqR -aqR -aGh -aqR -awb -axo -arP +ank +amC +fcd +dIu +qLy +alU +tqG +spR +qGw +alU +aFJ +ntt +aAY +alU aCh pIf kCo @@ -81400,27 +83339,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa ali -nBI -anL aoo +avY +amC +gsM +sCa aoX -arP -arP -arP -arP -arP -avZ +alU +ali +ali +ali +ali +alU +alU +lzk +alU +alU +alU +atO axp -ayC +aue azH eEe aGv @@ -81657,21 +83596,21 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ali ali ali alU alU -arP -aqR +ali +alU +alU +alU +aaa +aaa +aaa +eyq +jDZ +gQr +xbi wje rQJ uUi @@ -82709,7 +84648,7 @@ ayD nez ngV xPY -aOH +pMQ hcb hcb syJ @@ -82966,7 +84905,7 @@ ayE ayE ayE ayE -ayE +lLf ayE ayE ayE @@ -83223,7 +85162,7 @@ ayH ayH ayH ayH -ayH +lqO ayH aFV ayH @@ -84570,7 +86509,7 @@ oKh oKh iiW iiW -iiW +dxF izv nfm bCq @@ -86262,7 +88201,7 @@ aaa aaa aag aaa -aak +aam aap saX aaD @@ -86519,7 +88458,7 @@ aaa aaa aag aaf -aaj +aai aao aax aaC @@ -86545,7 +88484,7 @@ alz cZe alg plS -dyE +afM pQr aou aqC @@ -86776,7 +88715,7 @@ aaa aaa aag aaa -aal +aam aar uGI aaF @@ -87033,7 +88972,7 @@ aaa aaa aag aaf -aaj +aai aaq dyS aaE @@ -87058,10 +88997,10 @@ agj agM sAk akp -akQ +agj amB amn -amS +aiX anz anz aov @@ -87290,8 +89229,8 @@ aaa aaa aag aaa -aal -aat +aam +aaj aat aat aat @@ -87318,7 +89257,7 @@ akM amm gyr anM -rJv +xal aqC anz aox @@ -87547,7 +89486,7 @@ aaa aaa aag aaf -aaj +aai aas aat aat @@ -87570,12 +89509,12 @@ akU afM lBz alA -ene -alg +alt +amS kbm -dyE +afM cKC -seP +dyE aqC anR aow @@ -87805,7 +89744,7 @@ aaa aag aaa aam -aav +akQ aav aav aav @@ -87832,7 +89771,7 @@ akT gNE gLz anB -amR +seP aqC anz aov @@ -88086,10 +90025,10 @@ fxx ako ene amj -akQ +agj amB amn -amS +aiX anz anz aov @@ -88346,7 +90285,7 @@ amk amm gyr mos -rJv +xal aqC anz aov @@ -88599,11 +90538,11 @@ akF aiy akv uXt -alg +amS pAK -dyE +afM anQ -seP +dyE aqC anz aov @@ -88860,7 +90799,7 @@ akT amx any arD -amR +seP aqC anz aov @@ -89114,10 +91053,10 @@ ajc akz ene als -akQ -amB +agj +apT amn -amS +aiX aqD anz aov @@ -89371,7 +91310,7 @@ ajc akz ene alg -alt +alw amp aot apR @@ -89630,7 +91569,7 @@ itD alg vyK amI -alg +amS alv aqE anS @@ -90145,7 +92084,7 @@ agn agn amN aoZ -apT +agn anw anz cXU @@ -90402,7 +92341,7 @@ akY alE amU apH -apX +aqt aqC anz gfC @@ -92516,7 +94455,7 @@ aXf bCv bDP bCv -bAw +pbC bHV bJw bKC @@ -92773,11 +94712,11 @@ bBy bzs bDO bFl -bGH +bWe bHU bJv -bKB -bLK +mFo +bBb bVW bOd iql @@ -93031,10 +94970,10 @@ bCz bDQ bFn bGJ -bHX +sKL bJy -bKE -bLP +iUp +bLK bMP bIG bJB @@ -93272,9 +95211,9 @@ aZV aZV aZV aZV -bmx -bmx -bmx +aZV +aZV +aZV bqH bqH btM @@ -93285,10 +95224,10 @@ aJq bHt bBz bzs -bzs +bof bFm bGI -bHW +bof cBD bKD bLO @@ -93542,10 +95481,10 @@ bwu kPj bBB eBX -bzs +bof bFp -bGJ -bHX +uFV +fvk bJA bKG bLK @@ -93799,9 +95738,9 @@ aJq bAj aJq aKG -bzs +bof bFo -bDu +bDA bFt bGQ bHp @@ -94056,7 +95995,7 @@ byX aXh bmE bCA -bzs +bof bCC bDA bFx @@ -94308,15 +96247,15 @@ asT asV bof bwv -bvj -bvj -bvj -bvj -bvj -bvj +nEu +nEu +nEu +nEu +nEu +nEu bCB -bCP -bvj +iVH +nEu bvd bKH bLK @@ -94565,7 +96504,7 @@ asU asX bof bwx -bvj +nEu bwB bxa byZ @@ -94826,8 +96765,8 @@ bvi bww bwZ byY -bzH -bAW +bCD +ivJ bCE bFv bFz @@ -95083,8 +97022,8 @@ bvl bwE bxc bzb -bzK -bBb +nEu +nEu cpG bDC bId @@ -95336,16 +97275,16 @@ bqS brY bwz asG -bvj +nEu bza bxb -bvh -bCD +bdN +iRV bAY bCH -bDR +gfQ bIc -bvd +bzK bKH bLK bMW @@ -95593,10 +97532,10 @@ bqV bEe bhh bBL -bvj +nEu asM bAl -bvh +bzH bzS bBc bCJ @@ -95848,17 +97787,17 @@ bfF bfF bqU bsq -bvj -bvj -bvj -bvj -bvj -bvj -bvj -bvd +bof +bof +nEu +nEu +nEu +nEu +nEu +nEu bFu jex -bvj +ofj bvd bKH bLK @@ -96097,7 +98036,7 @@ bet bfH aiP wbE -bhh +ihR wbE bmJ bof @@ -96105,18 +98044,18 @@ bpu bqP bsy bEe -bvh +rUe ajv bxN bze asL -bvh +rUe bCG bBd bFw bDD bFJ -bvd +oQY bKH bzs bRK @@ -96138,9 +98077,9 @@ cCI cCJ cCI cCP -bLK +bMK chg -bLK +bMK aaf aoV aoV @@ -96356,24 +98295,24 @@ bhe bit bjS tCd -bli +eRr boe bli bpN bqX -bEe -btg -bDR -bDR -bDR -bDR +dcX +fNN +twE +twE +twE +twE bzc -bDR -bDZ +twE +bpP bCK bFy bFF -bvd +oQY bKH bzs fjU @@ -96585,7 +98524,7 @@ awB att azh fHG -fHG +kqy kxf ufD alP @@ -96610,7 +98549,7 @@ aYV bet bfG bhe -bhh +ihR bjU blk blk @@ -96619,18 +98558,18 @@ biu bpO bqY bss -btg +bfJ buk bvm bDT buk -bvh +rUe bzU bBe bCS bDE bFK -bvd +oQY bKH bzs fjU @@ -96653,11 +98592,11 @@ cdD bOh cCQ cCS -wWi +chg cCS -aaa -aaa -aaa +bMK +bMK +bMK gXs aaa aaa @@ -96867,7 +98806,7 @@ aYV bet bfG bhe -bhh +ihR bjV blj bmK @@ -96876,17 +98815,17 @@ bog bhh bsx bsr -bvh +rUe bwD -bDR -bDR +bhh +bhh bAq -bvj -bCQ +bof +bog bDW -bCP -bvj -bvj +bKR +bof +bof bJC bKH bzs @@ -96910,11 +98849,11 @@ cbH bOh cCG tAH -dCt -fty -dCt -dCt -dCt +iKV +vHo +iKV +iKV +eCm fty dCt dCt @@ -97123,8 +99062,8 @@ aYV bdo beu bvk -biu -biu +jiT +jiT bjT blm bmL @@ -97133,15 +99072,15 @@ bpw ium bsx btX -bvj +bof bwG bxR bxR -bvj -bvj +bof +bof bzW -bDZ -bCT +bqQ +bCR bGR bIj bJC @@ -97166,12 +99105,12 @@ ccD cbH bOh aaf -aaa -aaa -aaa -aaa -aaa -aoV +bMK +chg +bMK +bMK +bMK +bMK aaf aoV aoV @@ -97374,14 +99313,14 @@ aSZ aQc qaY acN -bag +aKR aJC aYV aYV bet -bfJ -bhh -bhh +qnC +ihR +ihR bgQ bll bhh @@ -97390,16 +99329,16 @@ bpv bhh bsx btV -bvh +rUe bwF bxQ bxQ bAr -bvj +bof bzV -bDZ -bzf -bDR +bqQ +boo +bhh bIi bJC bKH @@ -97423,9 +99362,9 @@ bOh bOh bOh xcl -caJ -ciC -gXs +wWi +kil +cCS gXs tSo kcx @@ -97638,25 +99577,25 @@ aYV bet bfH qTV -bhh -bhg +ihR +uBr bln bmM boj bof bhh -bsx +qkC btV -bvj +bof bwI bxT bxQ bAt -bvj +bof bCM -bDZ -bDR -bDR +bqQ +eZa +bhh bIl bJC bKH @@ -97901,19 +99840,19 @@ bfK bfK bfK bof -bhh -bsx +bKL +brf btV -bvh +rUe bwH bxS bzh bAs -bvj +bof bCL bxO -bDR -bDR +bhh +bhh bIk bJC bKH @@ -98161,19 +100100,19 @@ apI bwz brg btZ -bvj +bof bwI bxV bzj bAv -bvj +bof bCO -bDR -bDR -bDR +bhh +bhh +bhh bIn bJC -bKL +bUZ bLT bLT bLT @@ -98418,12 +100357,12 @@ bpx bpP brf bhh -bvh +rUe bwJ bxU bzi bAu -bvj +bof bCN bEa pHl @@ -98647,16 +100586,16 @@ aaf alP aGL aIe -aJI -aJI -aJI -aJI -aJI +bhr +bhr +bhr +bhr +bhr aJI aRC aSK aVz -aVz +ijO aVz aYL aJI @@ -98675,13 +100614,13 @@ bnH bqQ bsx bhh -bvj -bvj +bof +bof bxR bxR -bvj -bvj -bCQ +bof +bof +bog bEd bof bof @@ -98904,7 +100843,7 @@ aaa alP aGN aIh -aJI +bhr aKT aMD aNM @@ -99183,7 +101122,7 @@ bhn biz biz biz -bmR +hMs bfL bol bqQ @@ -99418,7 +101357,7 @@ aaa alP aGL aHY -aQj +biC iNn aMk aNK @@ -99437,9 +101376,9 @@ bdp cBm bfL bhm -bhm -bhm -bhm +tNl +ttd +dkM bkP bmV boc @@ -99690,13 +101629,13 @@ aVz qus bbz aYV -bdp +blg bdc -bfL +hYd beY -bhm -bhm -bhm +oJV +qSf +wJA bkR bfL boo @@ -99932,9 +101871,9 @@ vpY alP aGJ avI -aJI -aJI -aJI +bhr +bhr +bhr aNO aOT aJI @@ -99947,13 +101886,13 @@ aYM aJI bbA aYV -bdr +bdp bdb -bdN +bfL blr bho -bho -bho +ecp +eiB bkQ bmW bom @@ -100191,9 +102130,9 @@ aGJ avI aJL aKX -aJI -aJI -aJI +bhr +bhr +bhr aJI aRH aVz @@ -100202,15 +102141,15 @@ aVH aXn aYN aJI -bbz -aYV +bkU aYV +bdp bey bfL -bhm -biz -biz -biz +bfL +kVj +bfL +bfL bla bmY boq @@ -100461,15 +102400,15 @@ aJI aJI aJI bcq +blo bcq -bcq -bfL +bfO bhp biB -biB -cTL -bkU -bmX +ouf +nyi +cTO +bmZ bpE bpE bpE @@ -100718,14 +102657,14 @@ aiJ bal bam aYV -aYV -aYV -bfL +bmR +bmX +gaF bhq -bhm +rWg bkb -cTM -bla +nyi +cTO bmZ bpH bra @@ -100977,12 +102916,12 @@ bbB aYV aYV aYV -bfL -bfL -bfL -bfL -bfL -blg +kQa +tIE +dnW +jdE +nyi +cTO bmZ bpG bqZ @@ -101227,18 +103166,18 @@ fzd fFA fFA aVK -aRJ +jwH aRJ aRJ bbB aYV aYV aYV -bfO -bfS -biD +nyi +nyi +nyi bkd -bfS +nyi cTO bmZ bpJ @@ -101490,13 +103429,13 @@ cBg bam aYV aYV -aYV -aYV -bhr -biC -bkc +beE bfS -blo +biD +bfS +kQk +kQk +cTO bmZ bpI brb @@ -101748,11 +103687,11 @@ ssB aYV aYV aYV -beE -bfS +eUy +pkg biE -bkf -bfS +kQk +tEL cTO bmZ bpL @@ -102005,11 +103944,11 @@ ikm aYV aYV bez -bfP -bfS -bfS -bfS bfS +vxz +laN +kQk +jbK cTO bmZ bpK @@ -102262,12 +104201,12 @@ ikm aYV bci beB -bfS -bfS kQk -ipA +kQk +kQk +kQk gbT -cTO +bdr bmZ bon bon @@ -104567,7 +106506,7 @@ aIt aPd aIt aPb -aIt +adu aXu aYW bat @@ -106617,7 +108556,7 @@ cBZ aJT aLc aFw -aFz +tSm aFz aFz aRR @@ -106627,7 +108566,7 @@ aFz aRS aXW baz -aCR +mtU bcx aXq aYV @@ -106873,7 +108812,7 @@ aGY aII aJW aMX -aNW +qUh aFz aPl aQv @@ -106883,7 +108822,7 @@ aUI aTg aRS aZf -aFz +xRa bbF aYV aXq @@ -107127,8 +109066,8 @@ aCM aEg aFw aHi -aHi -aJV +aFw +aFw aFw aFw aFz @@ -107385,29 +109324,29 @@ aEi aFw aHl aID -aID -aFw -aMM -aFz +vqE +aCR +qCR aFz +aRS aQw aRS aRS aRS aRS aRS -aZf +lNB aRS bbF aYV aXq aYV bga -bgc -bgc -bgc -bgc -bgc +pKV +pKV +pKV +pKV +pKV boB boB boB @@ -107639,15 +109578,15 @@ aAz asB aCO aEh -aFz -aHk -aFz -aFz -aTe +aCR +aCR +aCR +mzv +aCR aML aFz -aFz -aQw +aRS +pXG cdl aRS aRS @@ -107896,11 +109835,11 @@ aAA asB aCQ aEk -aFB -aHn -aFB -csT -aFB +fsQ +dsJ +rxF +fsQ +qkn aLr aFB aPn @@ -108152,12 +110091,12 @@ awO awO asB aCP -aEj +aMM aFA -aHm -aEj -aEj -aEj +aMM +aMM +aMM +aMM aEj aEj aPm @@ -108168,7 +110107,7 @@ aUJ aTh aXz aZg -aFz +xRa bbF aYV bdv @@ -108408,18 +110347,18 @@ ayj azx aAB asB -aCR aEm -aCR -aPl -aQv -aPl -aQv -aCR -aNY -aCR +aNW aQA -aCR +aNW +aNW +aNW +aNW +aFz +aFz +aFz +aFz +aFz aTj aFz aVV @@ -108430,8 +110369,8 @@ aCR kYk bdx vHT -bgc -bgc +pKV +pKV biX bhV bka @@ -108665,14 +110604,14 @@ asB asB asB asB -aCR +aHk +aNW bfb -aCR -aHo -aIE aKe -aIE -aCR +aKe +aKe +aNW +kdF aNX aPo aQz @@ -108687,7 +110626,7 @@ aCR bcy bdw beG -bgc +pKV bhE biW bkv @@ -108921,14 +110860,14 @@ atS aaf aaf aaf -atS +asB aCR aEn aCR -aHq -aHq -aHq -aHq +aKe +aKe +aKe +aNW aCR aCR aCR @@ -108944,7 +110883,7 @@ bbG aTk bdy beI -bgc +pKV bhF biW bib @@ -109178,14 +111117,14 @@ atS aoV aoV aaf -atS -aaf -aaa -aaf -aaa -aaa -aaa -aaa +gXs +aHm +aHn +dmX +aNW +aNW +aNW +aNW aMZ aNZ aPp @@ -109201,15 +111140,15 @@ aPq aPq bdy beH -bgc -bgc -bgc -bgc -bgc -bgc -bgc +pKV +pKV +pKV +pKV +pKV +pKV +pKV bpp -bgc +pKV brr bsE bvK @@ -109435,14 +111374,14 @@ aaH aoV aoV aaf -atS -aaf -aaa -aaf -aaa -aaa -aaa -aaf +gXs +aHm +aJV +dmX +csT +kOL +mZx +xES aMZ aOb aPr @@ -109692,14 +111631,14 @@ aaH aoV aoV aoV -atS -aaf -aaa -aaf -aaa -aaa -aaa -aaf +gXs +aHm +aNY +aCR +dmX +dmX +dmX +dmX aMZ aOa aVX @@ -109949,7 +111888,7 @@ atS aoV aoV aoV -atS +gXs aaf aaa aaf @@ -111301,9 +113240,9 @@ cNW cNW clt cNW +wVN cNW -cNW -cNW +cQw cjD cjD cjD @@ -111541,30 +113480,30 @@ bLk bEs bNC nRG -cbf -cbf -cbf -cbf -cbf -cbf -cbf +kIN +nYK +xWs +uwN +lre +oQP +oQP bYr -cbf -clr +fLN +cNW cad cbi -cNW +iyG ccW -cdV +cNW clt cNW -cgy -ccV +cfv cNW -aaa -aaa -aaf -aaf +mug +hUJ +ixd +cNW +ktS aaf aaf aaf @@ -111796,31 +113735,31 @@ bIU bKe bLj bEs -bNB +cdV cac bPP -cNW -cNW -cNW -cNW -cNW -cNW -cNW +cOe +gRV +gDZ +eoD +sVD +kQe +imZ kAJ -clt -cac -cbh cNW +rSf +cNW +wly ccV -cOe -clt -cfv -cBL -cOe +noa +clu +cNW +xgs +srk +srk +srk +oYQ cNW -aaf -aaa -aaa aaa aaf aaa @@ -112032,14 +113971,14 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs +jIy +nJP +jIy +nJP +gXs bky -btp +kgk brH bvQ bxt @@ -112056,29 +113995,29 @@ bEs rmX xIa vxh -cNW -aaa -aaa -aaf -aaa -aaf -cNW +cOe +bPP +bPP +bPP +vsO +iQc +sMG bYs -nRG -ciJ -cbf -cbf -cbf -cbf +ccU +nnM +cNW +wuO +pDG +cNW ceT cNW -dBm +gGK chH +dEh +srk +gGK cNW -aaf -aaf -aaa -aaf +ktS aaf aaf aaf @@ -112290,15 +114229,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +qtH +eXL +qXJ +eXL +vdo bZi bqg -brG -brG +oBQ +wqW cNR brG brG @@ -112310,31 +114249,31 @@ rNc bEs bLm bEs -cOT -cOT -cOT -cNW -aaa -aaa -aaf -aaa -aaf +jGw +hke +fkW +fkW +fkW +fkW +uUP +noT cNW cNW -cOT -cOT -cOT +cNW +cNW +tTw +cNW cNW cNW cNW cPH cNW +gGK +pcK +srk +dHp +uRn cNW -cNW -cNW -aaf -aaf -aaa aaa aaf aaa @@ -112547,18 +114486,18 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +eXL +vdo +vdo +vdo +vdo bZi btq brI bvR cNS byx -brI +wkc bky bky bEs @@ -112566,32 +114505,32 @@ bGc bGc bEs bLl -bEs -aaf -aaa -aaa -aaf -aaa -aaa -aaf -aaa -aaa -aag -aaf -aaa -aaa -aaa -aaf -aaf +cbh +eDz +fxk +iIs +qFf +pcQ +leE +hTt +vsr +cNW +hbi +uqu +yaW +iky +cNW +mHA +ifJ cNW ceU cNW -aaa -aaa -aaa -aaf -aaa -aaa +cgy +gGK +gGK +uRn +dBm +cNW aaa aaf aaa @@ -112808,7 +114747,7 @@ aaa aaa aaa aaa -aaa +gXs bky bky bky @@ -112823,33 +114762,33 @@ gXs gXs aaf aaa -aaf -gXs -aaa -aaa -aaf -aaa -aaa -aaf -aaa -aaa -aag -aaf -aaa -aaa -aaa -aaa -aaf +cNW +bPP +tsq +pkS +olh +cOe +rVy +hTt +cOe +wVN +pYQ +mLS +qIO +qSF +lUP +tTc +vxh cNW cOe cNW -aaf -aaf -aaf -aaf -aaf -aaf -aaf +cNW +cNW +cNW +cNW +cNW +cNW +ktS aaf aaf aaf @@ -113080,30 +115019,30 @@ aaa aaa aaf aaa -aaf -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaa -aaf -aaf -aaa -aaa -aaa -aaa -aaf +cOT +bPP +uys +qFf +sAH +uzm +uhq +hTt +lXy +kfS +ewN +qEB +nzB +xcz +cVw +jsO +flP cNW cPI cNW -aaf +gXs aaa aaa -aaf +gXs aaa aaa aaa @@ -113337,24 +115276,24 @@ aaa aaa aaf aaa -aaf -aaa -aaa -aaa -aag -aaa -aaa -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaa -gXs -aag +cOT +bPP +uys +mDZ +oMT +qFf +qFf +hTt +qIO +cNW +cNW +cNW +cNW +cNW +cNW +cNW +cNW +cNW aag aag gXs @@ -113594,19 +115533,19 @@ aaa aaa aaf aaa -aaf +cNW +bPP +nsf +rgW +rgW +gKl +qMv +rba +cae +cOT aaa aaa aaa -aag -aaa -aaa -aaa -aaa -aaa -aaf -aaa -aaa aaa aaa aaa @@ -113851,19 +115790,19 @@ aaa aaa aaf aaa -aaf +cNW +qlY +paJ +bPP +bPP +bPP +bPP +ddM +wVg +cOT aaa aaa aaa -aag -aaa -aaa -aaa -aaa -aaa -aaf -aaa -aaa aaa aaa aaa @@ -114108,16 +116047,16 @@ aaa aaa aaf aaa -aaf -aaa -aaa -aaa -aag -aaa -aaa -aaa -aaa -aaa +cNW +cNW +cNW +cOT +cOT +cOT +cOT +cNW +cNW +cNW aaa aaa aaa @@ -114365,11 +116304,11 @@ aaa aaa aaf aaa -aaf +gXs aaa aaa aaa -aag +gXs aaa aaa aaa @@ -114626,7 +116565,7 @@ aaf aaa aaa aaa -aag +aaa aaa aaa aaa @@ -114883,7 +116822,7 @@ aaf aaa aaa aaa -aaf +aaa aaa aaa aaa diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index 9b260f0133..e41f6c7d89 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -3,11 +3,17 @@ /turf/open/space/basic, /area/space) "aab" = ( -/obj/structure/sign/poster/official/anniversary_vintage_reprint, -/turf/closed/wall/r_wall, -/area/science/research{ - name = "Research Sector" - }) +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/arcade"; + name = "Arcade APC"; + pixel_y = -26 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) "aac" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 6 @@ -662,6 +668,9 @@ }, /turf/open/floor/plating/airless, /area/router/aux) +"abF" = ( +/turf/closed/wall, +/area/crew_quarters/arcade) "abG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -699,6 +708,10 @@ /obj/item/paper/fluff/cogstation/cluwne, /turf/open/floor/plating, /area/crew_quarters/theatre/clown) +"abJ" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/closed/wall, +/area/crew_quarters/arcade) "abK" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -802,6 +815,10 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"abZ" = ( +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "aca" = ( /obj/machinery/conveyor/auto{ dir = 5; @@ -840,6 +857,10 @@ }, /turf/open/floor/plating/airless, /area/router/aux) +"acf" = ( +/obj/machinery/computer/arcade/minesweeper, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "acg" = ( /obj/machinery/light{ dir = 8; @@ -861,10 +882,9 @@ }, /area/hallway/secondary/entry) "aci" = ( -/turf/closed/wall, -/area/medical{ - name = "Medical Booth" - }) +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "acj" = ( /obj/machinery/conveyor/auto{ dir = 4; @@ -1020,6 +1040,21 @@ /obj/structure/rack, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) +"acz" = ( +/obj/structure/closet/crate, +/obj/item/gun/ballistic/shotgun/toy/unrestricted, +/obj/item/gun/ballistic/shotgun/toy/unrestricted, +/obj/item/toy/gun, +/obj/item/toy/sword, +/obj/item/toy/sword, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) +"acA" = ( +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "acB" = ( /obj/machinery/conveyor{ dir = 6; @@ -1101,11 +1136,11 @@ /turf/open/floor/plating/airless, /area/router/aux) "acK" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical{ - name = "Medical Booth" - }) +/obj/structure/sign/poster/official/foam_force_ad{ + pixel_y = 32 + }, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "acL" = ( /obj/machinery/door/poddoor{ id = "executionspaceblast" @@ -1250,6 +1285,10 @@ }, /turf/closed/wall/r_wall, /area/security/brig) +"adc" = ( +/obj/structure/chair/stool, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "add" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 6 @@ -1479,6 +1518,11 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/stairs/medium, /area/security/brig) +"adL" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "adM" = ( /turf/closed/wall, /area/crew_quarters/observatory) @@ -1512,36 +1556,13 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "adR" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 +/obj/structure/chair/stool, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/storage/box/beakers, -/obj/item/hand_labeler, -/obj/item/folder/white{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stamp/denied{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/stamp, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "adS" = ( /turf/closed/wall, /area/construction) @@ -1664,11 +1685,11 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aej" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/turf/open/floor/plating/airless, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "aek" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -1881,10 +1902,9 @@ /turf/open/floor/plating, /area/maintenance/fore) "aeI" = ( -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "aeJ" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, @@ -2453,11 +2473,11 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/observatory) "agc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "agd" = ( /obj/structure/fans/tiny/invisible, /obj/docking_port/stationary{ @@ -2641,11 +2661,18 @@ /turf/open/floor/plating, /area/maintenance/fore) "agC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/sign/poster/official/soft_cap_pop_art{ + pixel_x = -32 + }, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "agD" = ( /obj/machinery/seed_extractor, /obj/effect/decal/cleanable/dirt, @@ -2761,15 +2788,15 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/observatory) "agT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/suit_storage_unit/engine, -/obj/machinery/light/small{ +/obj/machinery/vr_sleeper{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "agU" = ( /obj/structure/table, /obj/effect/turf_decal/tile/yellow{ @@ -3616,7 +3643,7 @@ lootcount = 2; name = "2maintenance loot spawner" }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/construction) "ajb" = ( @@ -4401,8 +4428,11 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "akN" = ( -/turf/open/space/basic, -/area/router/aux) +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "akO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4549,7 +4579,7 @@ /turf/open/floor/plasteel, /area/security/processing) "alk" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/construction/secondary) "all" = ( @@ -4853,10 +4883,15 @@ /turf/open/floor/plating, /area/construction/secondary) "alZ" = ( -/turf/closed/wall/r_wall, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/machinery/camera{ + c_tag = "Arcade"; + dir = 4 + }, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "ama" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -5347,36 +5382,15 @@ /turf/open/floor/plating, /area/construction/secondary) "ang" = ( -/turf/closed/wall/r_wall, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "anh" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/structure/sign/poster/official/nanomichi_ad{ + pixel_x = 32 }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/paper_bin, -/obj/item/pen, -/obj/item/clothing/glasses/regular, -/obj/machinery/door/window/northright{ - name = "Medical Booth Desk"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "ani" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/red, @@ -5447,10 +5461,9 @@ }, /area/chapel/main) "anq" = ( -/turf/closed/wall, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/machinery/vending/snack/random, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "anr" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/supplymain/visible{ @@ -5571,13 +5584,9 @@ /turf/open/floor/plasteel/dark/corner, /area/hallway/secondary/entry) "anE" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/vending/games, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "anF" = ( /obj/machinery/smartfridge, /turf/closed/wall, @@ -5603,11 +5612,20 @@ /turf/open/floor/plating, /area/security/checkpoint) "anI" = ( -/obj/machinery/computer/arcade/orion_trail, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/storage/emergency"; + dir = 1; + name = "Emergency Storage APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/storage/emergency) "anJ" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red, @@ -5648,11 +5666,9 @@ /turf/closed/wall/r_wall, /area/security/detectives_office) "anL" = ( -/obj/machinery/computer/arcade/minesweeper, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/arcade) "anM" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/tile/yellow{ @@ -5695,11 +5711,12 @@ /turf/open/floor/plasteel, /area/storage/tools) "anP" = ( -/obj/machinery/computer/arcade, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ name = "Arcade" - }) + }, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "anQ" = ( /obj/structure/chair{ dir = 4 @@ -5744,10 +5761,13 @@ /turf/open/floor/plasteel, /area/storage/tools) "anT" = ( -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ name = "Arcade" - }) + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/arcade, +/area/crew_quarters/arcade) "anU" = ( /turf/closed/wall/r_wall, /area/security/brig) @@ -5829,18 +5849,11 @@ /turf/open/floor/carpet/purple, /area/crew_quarters/dorms/purple) "aof" = ( -/obj/structure/sign/poster/official/foam_force_ad{ - pixel_y = 32 - }, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) "aog" = ( -/turf/open/floor/grass, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/turf/closed/wall, +/area/crew_quarters/fitness/cogpool) "aoh" = ( /obj/machinery/light_switch{ pixel_y = -24 @@ -5991,12 +6004,12 @@ c_tag = "Security Checkpoint"; pixel_x = 22 }, -/obj/machinery/newscaster/security_unit{ - pixel_y = 32 - }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/airalarm{ + pixel_y = 23 + }, /turf/open/floor/plasteel, /area/security/checkpoint) "aoz" = ( @@ -6021,12 +6034,15 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/door/firedoor, /obj/item/flashlight/lamp, /obj/machinery/door/window/westright{ name = "Security Checkpoint"; req_access_txt = "1" }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, /turf/open/floor/plasteel, /area/security/checkpoint) "aoB" = ( @@ -6127,11 +6143,9 @@ /turf/closed/wall/r_wall, /area/router/service) "aoL" = ( -/obj/structure/chair/stool, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "aoM" = ( /obj/structure/closet/crate, /obj/item/stock_parts/matter_bin, @@ -6233,12 +6247,17 @@ /turf/open/floor/plating, /area/router/service) "aoU" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/assistant, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Pool" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/white/side, +/area/crew_quarters/fitness/cogpool) "aoV" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -6322,11 +6341,16 @@ /turf/open/floor/plasteel, /area/security/brig) "apd" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Pool" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white/side, +/area/crew_quarters/fitness/cogpool) "ape" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -6376,13 +6400,9 @@ /turf/open/floor/wood, /area/crew_quarters/fitness) "apm" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "apn" = ( /obj/structure/cable{ icon_state = "4-8" @@ -6463,35 +6483,27 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/fitness) "apy" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/machinery/pool/controller, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "apz" = ( -/obj/machinery/vr_sleeper{ - dir = 8 +/obj/structure/table, +/obj/item/toy/beach_ball{ + pixel_y = 12 }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" +/obj/item/clothing/glasses/sunglasses{ + pixel_y = 4 }, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "apA" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/closed/wall, /area/crew_quarters/dorms/purple) "apB" = ( -/obj/structure/flora/tree/jungle/small, -/turf/open/floor/grass, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/structure/chair/comfy/teal, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "apC" = ( /turf/closed/wall/r_wall, /area/hydroponics) @@ -6520,14 +6532,15 @@ /turf/open/floor/plasteel, /area/hydroponics) "apG" = ( -/mob/living/simple_animal/chicken{ - name = "Featherbottom"; - real_name = "Featherbottom" +/obj/structure/table, +/obj/item/clothing/glasses/sunglasses{ + pixel_y = 4 }, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "apH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6709,11 +6722,16 @@ /turf/open/floor/plating, /area/construction/secondary) "aqc" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/wall/r_wall, -/area/medical{ - name = "Medical Booth" - }) +/obj/structure/chair/comfy/teal, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aqd" = ( /obj/structure/chair/sofa/right, /obj/machinery/camera{ @@ -6793,10 +6811,17 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aqn" = ( -/turf/closed/wall/r_wall, -/area/medical{ - name = "Medical Booth" - }) +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/kirbyplants{ + icon_state = "plant-02" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aqo" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -6982,32 +7007,26 @@ /turf/open/floor/plating, /area/hallway/secondary/service) "aqO" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engineering EVA"; - req_access_txt = "11" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aqP" = ( -/obj/structure/chair/stool, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aqQ" = ( /turf/closed/wall/r_wall, /area/crew_quarters/kitchen/backroom) @@ -7020,29 +7039,32 @@ /turf/open/floor/plating, /area/crew_quarters/theatre/clown) "aqS" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/light_switch{ - pixel_x = -24 +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aqT" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/fitness/cogpool) "aqU" = ( -/turf/closed/wall/r_wall, -/area/engine/storage{ - name = "Canister Storage" - }) +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aqV" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ @@ -7336,13 +7358,9 @@ /turf/open/floor/carpet/blue, /area/crew_quarters/dorms/blue) "arB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "arC" = ( /obj/structure/sign/warning/fire{ desc = "A sign that states the labeled room's number."; @@ -7376,14 +7394,11 @@ /turf/closed/wall/r_wall, /area/maintenance/starboard/central) "arF" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "hot loop to space" +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "arG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -7449,34 +7464,48 @@ /turf/open/floor/plating, /area/router/service) "arN" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ +/obj/machinery/light{ dir = 4; - name = "gas to sauna" + light_color = "#e8eaff" }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "arO" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/closed/wall, +/area/medical/clinic) "arP" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/clinic) "arQ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/storage/box/beakers, +/obj/item/hand_labeler, +/obj/item/folder/white{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/stamp/denied{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/stamp, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "arR" = ( /obj/structure/cable{ icon_state = "1-2" @@ -7525,22 +7554,29 @@ /turf/open/floor/carpet/purple, /area/crew_quarters/dorms/purple) "arV" = ( -/obj/machinery/vr_sleeper{ +/obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/structure/sign/poster/official/soft_cap_pop_art{ - pixel_x = -32 +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/clothing/glasses/regular, +/obj/machinery/door/window/northright{ + name = "Medical Booth Desk"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "arW" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -7551,27 +7587,19 @@ /turf/open/floor/plasteel, /area/tcommsat/computer) "arX" = ( -/obj/machinery/computer/med_data{ - dir = 4 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medical Booth"; + req_access_txt = "5" }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/medical/clinic) "arY" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/r_wall, +/area/medical/clinic) "arZ" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 @@ -7580,13 +7608,17 @@ /turf/open/floor/carpet/purple, /area/crew_quarters/dorms/purple) "asa" = ( -/obj/machinery/computer/arcade, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "asb" = ( /obj/machinery/airalarm{ dir = 1; @@ -7662,13 +7694,11 @@ /turf/open/floor/carpet/blue, /area/crew_quarters/dorms/blue) "asi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/pool/filter{ + pixel_y = 16 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) "asj" = ( /obj/effect/turf_decal/tile/red, /obj/structure/disposalpipe/segment{ @@ -7795,16 +7825,8 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "ast" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" - }, -/turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) "asu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7812,31 +7834,25 @@ /turf/closed/wall/rust, /area/maintenance/disposal) "asv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/structure/pool/ladder{ + dir = 2; + pixel_y = 24 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) "asw" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "asx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "asy" = ( /obj/effect/landmark/start/assistant, /obj/machinery/holopad, @@ -7861,31 +7877,41 @@ /turf/open/floor/plating, /area/router/service) "asB" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/closed/wall/r_wall, +/area/medical/clinic) "asC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/visible{ +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/stack/medical/gauze, +/obj/item/reagent_containers/blood, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "asD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/computer/med_data{ dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "asE" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -7909,11 +7935,18 @@ /turf/open/floor/plasteel, /area/security/processing) "asG" = ( -/obj/structure/sign/warning/nosmoking/circle, -/turf/closed/wall/r_wall, -/area/engine/storage{ - name = "Canister Storage" - }) +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "asH" = ( /obj/machinery/camera{ c_tag = "Port Bow Solar Maintenance"; @@ -7931,47 +7964,52 @@ /turf/open/floor/plating, /area/maintenance/solars/port) "asI" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/portable_atmospherics/canister/toxins, -/turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "asJ" = ( /turf/closed/wall, /area/crew_quarters/toilet) "asK" = ( -/obj/machinery/vr_sleeper{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "asL" = ( /turf/closed/wall, /area/security/brig) "asM" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/storage{ - name = "Canister Storage" - }) -"asN" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 +/obj/machinery/light_switch{ + pixel_x = 24 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"asN" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "asO" = ( /obj/structure/cable{ icon_state = "1-2" @@ -7998,16 +8036,17 @@ /turf/open/floor/plasteel, /area/router/service) "asR" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "asS" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "asT" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -8019,16 +8058,19 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "asU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Router"; - req_access_txt = "11" +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "asV" = ( /obj/machinery/atmospherics/pipe/manifold/orange/hidden, /turf/open/floor/plasteel, @@ -8079,14 +8121,9 @@ /turf/open/floor/plasteel, /area/security/main) "atb" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/pool/drain, +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) "atc" = ( /turf/closed/wall, /area/security/main) @@ -8535,7 +8572,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/item/toy/cards/deck, /turf/open/floor/plasteel, /area/crew_quarters/bar) @@ -8712,22 +8749,16 @@ /turf/open/floor/carpet/purple, /area/crew_quarters/dorms/purple) "auC" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/pool/Lboard, +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) "auD" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/pool/Rboard, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "auE" = ( /obj/structure/bed, /obj/item/clothing/glasses/sunglasses/blindfold, @@ -8795,16 +8826,8 @@ /turf/open/floor/plasteel, /area/crew_quarters/lounge) "auN" = ( -/obj/machinery/light_switch{ - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "auO" = ( /obj/structure/closet/crate/freezer, /turf/open/floor/plating, @@ -8827,23 +8850,23 @@ /turf/open/floor/plasteel, /area/crew_quarters/lounge) "auR" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/power/apc{ - areastring = "/area/engine/secure_construction"; - dir = 1; - name = "Engineering Construction Area APC"; +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/machinery/airalarm{ pixel_y = 24 }, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/turf/open/floor/plasteel/white, +/area/medical/clinic) "auS" = ( /obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, /turf/open/floor/plasteel, @@ -8894,16 +8917,24 @@ /turf/open/floor/plasteel/stairs/right, /area/router/service) "auY" = ( -/obj/machinery/firealarm{ +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; pixel_y = 26 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/sleep_console{ + dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plasteel/white, +/area/medical/clinic) "auZ" = ( /obj/structure/disposalpipe/junction/flip, /obj/structure/cable{ @@ -8926,14 +8957,13 @@ /turf/closed/wall, /area/hallway/secondary/civilian) "avc" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/structure/cable{ - icon_state = "2-8" +/obj/vehicle/ridden/wheelchair, +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "avd" = ( /obj/structure/sign/warning{ name = "\improper COLD TEMPERATURES"; @@ -9015,14 +9045,11 @@ /turf/open/floor/plasteel, /area/hydroponics) "avl" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "avm" = ( /turf/closed/wall/r_wall, /area/hallway/secondary/civilian) @@ -9115,16 +9142,8 @@ /turf/open/floor/plating, /area/space/nearstation) "avw" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/structure/sign/poster/official/wtf_is_co2{ - pixel_x = 32 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/turf/open/floor/plasteel/white, +/area/medical/clinic) "avx" = ( /obj/structure/table, /obj/item/hand_labeler, @@ -9160,14 +9179,17 @@ /turf/open/floor/plasteel, /area/router/service) "avA" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/table/optable, +/obj/machinery/light_switch{ + pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "avB" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/stripes/line{ @@ -9176,13 +9198,21 @@ /turf/open/floor/plasteel, /area/router/service) "avC" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "avD" = ( /obj/structure/rack, /obj/item/clothing/suit/space/fragile, @@ -9195,14 +9225,14 @@ /turf/open/floor/plasteel, /area/router/service) "avE" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "generator to hot loop" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "avF" = ( /obj/structure/cable{ icon_state = "4-8" @@ -9217,23 +9247,13 @@ /turf/closed/wall, /area/security/prison) "avH" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/obj/machinery/meter, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "avI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "avJ" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -9243,16 +9263,20 @@ /turf/open/floor/plasteel, /area/security/main) "avK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "avL" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -9292,10 +9316,19 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "avQ" = ( -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/clinic"; + dir = 8; + name = "Medical Booth APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) "avR" = ( /obj/machinery/washing_machine, /obj/machinery/light/small{ @@ -9317,24 +9350,31 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "avU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 6 +/obj/machinery/door/airlock/maintenance{ + name = "Pool Maintenance"; + req_one_access_txt = "12" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "avV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "avW" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 @@ -9366,15 +9406,20 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/service) "awa" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/visible, -/obj/machinery/meter, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "awb" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, @@ -9403,13 +9448,17 @@ /turf/open/floor/plating, /area/maintenance/solars/port) "awe" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "awf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -9524,13 +9573,17 @@ /turf/open/floor/plating, /area/maintenance/solars/port) "aws" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/closed/wall/r_wall, -/area/engine/storage{ - name = "Canister Storage" - }) +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "awt" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/red, @@ -9543,12 +9596,15 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/door/firedoor, /obj/item/folder/red, /obj/machinery/door/window/westleft{ name = "Security Checkpoint"; req_access_txt = "1" }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, /turf/open/floor/plasteel, /area/security/checkpoint) "awu" = ( @@ -9595,12 +9651,14 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/barbershop) "awA" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "awB" = ( /obj/machinery/microwave, /obj/effect/turf_decal/tile/bar{ @@ -9815,25 +9873,17 @@ /turf/open/floor/plasteel, /area/storage/tools) "awW" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "cold loop to space" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "awX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "awY" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -9930,17 +9980,16 @@ /turf/open/floor/plating, /area/maintenance/solars/port) "axg" = ( -/obj/machinery/light_switch{ - pixel_x = -24 +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/machinery/camera{ - c_tag = "Arcade"; - dir = 4 +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/turf/open/floor/plasteel/white, +/area/medical/clinic) "axh" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 @@ -10058,13 +10107,16 @@ /turf/open/floor/plasteel, /area/hydroponics) "axt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/gloves/color/latex, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "axu" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -10253,13 +10305,14 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "axM" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "axN" = ( /obj/machinery/light_switch{ pixel_y = 24 @@ -10300,21 +10353,28 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "axQ" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/stripes/line{ +/turf/closed/wall/r_wall, +/area/hydroponics/garden) +"axR" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) -"axR" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/item/surgical_drapes, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 16 + }, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/surgicaldrill, +/obj/item/cautery, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "axS" = ( /obj/structure/closet/crate, /obj/item/storage/box/lights/mixed, @@ -10343,10 +10403,18 @@ /turf/open/floor/plasteel, /area/hydroponics/lobby) "axV" = ( -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/machinery/disposal/bin{ + name = "Corpse Delivery" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "axW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -10388,16 +10456,19 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "ayb" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/clinic) "ayc" = ( /obj/structure/kitchenspike, /turf/open/floor/plasteel/freezer, @@ -10466,21 +10537,20 @@ /turf/open/floor/plasteel, /area/security/prison) "ayn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/turf/open/floor/plating, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) -"ayo" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/closed/wall, +/area/medical/clinic) +"ayo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "ayp" = ( /obj/machinery/firealarm{ dir = 4; @@ -10670,11 +10740,8 @@ /turf/closed/wall/r_wall, /area/maintenance/solars/port) "ayK" = ( -/obj/structure/flora/tree/jungle/small, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/turf/open/floor/grass, +/area/hydroponics/garden) "ayL" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 @@ -10811,18 +10878,9 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "ayY" = ( -/obj/machinery/vending/medical, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/hydroponics/garden) "ayZ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ @@ -10899,24 +10957,22 @@ /turf/open/floor/plasteel, /area/security/brig) "azg" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) -"azh" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"azh" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/grass, +/area/hydroponics/garden) "azi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -10997,20 +11053,14 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "azo" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/area/crew_quarters/fitness/cogpool) "azp" = ( /obj/machinery/light_switch{ pixel_y = -24 @@ -11158,16 +11208,11 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "azE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 4 +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "azF" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ @@ -11572,17 +11617,11 @@ /turf/open/floor/plating, /area/maintenance/fore) "aAy" = ( -/obj/machinery/atmospherics/components/binary/circulator{ - dir = 4 +/obj/item/kirbyplants{ + icon_state = "plant-14" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aAz" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -12234,17 +12273,20 @@ /turf/open/floor/plating, /area/maintenance/fore) "aBM" = ( -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/abandoned_gambling_den"; - name = "Arcade APC"; - pixel_y = -26 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/fore) +/obj/machinery/camera{ + c_tag = "Pool"; + dir = 1 + }, +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/toy/poolnoodle/red, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aBN" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -12485,11 +12527,16 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/fitness) "aCq" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/closed/wall, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/toy/poolnoodle/blue, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aCr" = ( /obj/structure/cable{ icon_state = "2-4" @@ -12854,12 +12901,16 @@ /turf/open/floor/plasteel, /area/hydroponics/lobby) "aCZ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electricshock, -/turf/open/floor/plating, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/closet/athletic_mixed, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/toy/poolnoodle/yellow, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) "aDa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -13083,19 +13134,13 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aDx" = ( -/obj/structure/closet/crate, -/obj/item/gun/ballistic/shotgun/toy/unrestricted, -/obj/item/gun/ballistic/shotgun/toy/unrestricted, -/obj/item/toy/gun, -/obj/item/toy/sword, -/obj/item/toy/sword, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Pool External Maintenance"; + req_access_txt = "12" }, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "aDy" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -13754,7 +13799,7 @@ pixel_x = -32 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aES" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -13808,7 +13853,7 @@ pixel_y = 32 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aEY" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/bot, @@ -13817,22 +13862,10 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aEZ" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/central"; - dir = 1; - name = "Emergency Storage APC"; - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/storage/emergency/generic) +/turf/closed/wall/mineral/wood, +/area/crew_quarters/fitness/cogpool) "aFa" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -13852,7 +13885,7 @@ pixel_y = 24 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aFb" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -13865,21 +13898,18 @@ icon_state = "1-8" }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aFc" = ( -/obj/structure/table, -/obj/item/clothing/suit/toggle/owlwings, -/obj/item/clothing/under/costume/owl, -/obj/item/clothing/mask/gas/owl_mask, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/structure/mineral_door/woodrustic{ + name = "Sauna" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) "aFd" = ( /obj/machinery/space_heater, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aFe" = ( /obj/machinery/photocopier, /turf/open/floor/plasteel{ @@ -14226,11 +14256,12 @@ /turf/open/floor/plating, /area/crew_quarters/barbershop) "aFN" = ( -/obj/structure/flora/junglebush/b, +/mob/living/simple_animal/chicken{ + name = "Featherbottom"; + real_name = "Featherbottom" + }, /turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/area/hydroponics/garden) "aFO" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -14242,7 +14273,7 @@ pixel_x = -24 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aFP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -14261,14 +14292,14 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aFR" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 10 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aFS" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -14276,7 +14307,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aFT" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -14291,17 +14322,8 @@ /turf/open/floor/plasteel, /area/security/brig) "aFU" = ( -/obj/machinery/atmospherics/components/binary/circulator/cold{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aFV" = ( /obj/structure/window/reinforced, /obj/structure/disposaloutlet{ @@ -14318,7 +14340,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aFX" = ( /obj/machinery/computer/security/hos{ dir = 4 @@ -14372,7 +14394,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aGg" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -14420,7 +14442,7 @@ }, /obj/item/extinguisher, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aGk" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -14498,11 +14520,9 @@ /turf/open/floor/plasteel, /area/security/brig) "aGp" = ( -/mob/living/simple_animal/mouse/brown, +/obj/structure/flora/tree/jungle/small, /turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/area/hydroponics/garden) "aGq" = ( /turf/closed/wall/r_wall, /area/bridge) @@ -14642,7 +14662,7 @@ /obj/effect/turf_decal/bot, /obj/item/clothing/glasses/meson, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aGG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -14658,17 +14678,9 @@ /turf/open/floor/plasteel, /area/security/brig) "aGH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Medical Booth"; - req_access_txt = "5" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/medical{ - name = "Medical Booth" - }) +/obj/structure/sign/warning/fire, +/turf/closed/wall/mineral/wood, +/area/crew_quarters/fitness/cogpool) "aGI" = ( /obj/structure/table, /obj/effect/turf_decal/bot, @@ -14735,7 +14747,7 @@ pixel_y = -1 }, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aGJ" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -14850,7 +14862,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aGV" = ( /obj/machinery/light{ dir = 4; @@ -14970,7 +14982,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aHe" = ( /obj/structure/sign/poster/official/bless_this_spess{ pixel_y = -32 @@ -15055,7 +15067,7 @@ /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aHn" = ( /obj/machinery/firealarm{ dir = 8; @@ -15136,7 +15148,7 @@ /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aHx" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -15177,7 +15189,7 @@ }, /obj/item/extinguisher, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aHC" = ( /obj/machinery/vending/cola/random, /obj/effect/turf_decal/bot, @@ -15249,28 +15261,8 @@ }, /area/chapel/main) "aHL" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/stack/medical/gauze, -/obj/item/reagent_containers/blood, -/obj/item/stack/medical/suture, -/obj/item/stack/medical/mesh, -/obj/structure/extinguisher_cabinet{ - pixel_x = -26 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "aHM" = ( /turf/open/floor/plasteel, /area/bridge) @@ -15342,20 +15334,20 @@ /turf/open/floor/plasteel, /area/security/prison) "aHU" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/mineral_door/woodrustic{ - name = "Nature Preserve" +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "aHV" = ( -/obj/structure/flora/junglebush/large, +/obj/structure/table, +/obj/item/clothing/suit/toggle/owlwings, +/obj/item/clothing/under/costume/owl, +/obj/item/clothing/mask/gas/owl_mask, /turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/area/hydroponics/garden) "aHW" = ( /obj/structure/chair/comfy/brown, /obj/effect/landmark/start/head_of_security, @@ -15454,18 +15446,12 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aIf" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/machinery/space_heater, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) "aIg" = ( /obj/structure/chair/office/dark{ dir = 1 @@ -15792,19 +15778,8 @@ /turf/open/floor/plasteel, /area/tcommsat/computer) "aIN" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) "aIO" = ( /obj/structure/sign/directions/medical{ dir = 8; @@ -16248,42 +16223,13 @@ /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "aJD" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/item/storage/belt/medical, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/suit/space/eva/paramedic, -/obj/item/clothing/head/helmet/space/eva/paramedic, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/flora/junglebush/b, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aJE" = ( -/obj/structure/closet/secure_closet/medical2, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/mob/living/simple_animal/mouse/brown, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aJF" = ( /obj/structure/cable{ icon_state = "1-2" @@ -16443,28 +16389,9 @@ /turf/open/floor/plasteel, /area/security/main) "aJV" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/mob/living/simple_animal/butterfly, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aJW" = ( /obj/machinery/cryopod{ dir = 8 @@ -16562,7 +16489,7 @@ "aKf" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/storage/emergency/generic) +/area/storage/emergency) "aKg" = ( /turf/open/floor/plasteel/stairs/right, /area/hallway/secondary/entry) @@ -16593,13 +16520,13 @@ /turf/open/floor/plasteel, /area/security/main) "aKj" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 6 +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/structure/bedsheetbin/towel, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) "aKk" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -16622,7 +16549,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aKn" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -16649,13 +16576,12 @@ /turf/open/floor/plasteel, /area/security/brig) "aKp" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "aKq" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -16687,7 +16613,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/storage/emergency/generic) +/area/storage/emergency) "aKs" = ( /obj/structure/table/wood, /obj/item/trash/plate, @@ -16714,7 +16640,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/storage/emergency/generic) +/area/storage/emergency) "aKv" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -16727,7 +16653,7 @@ /area/bridge) "aKw" = ( /obj/structure/table, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/item/toy/cards/deck, /obj/structure/disposalpipe/segment{ dir = 4 @@ -16757,7 +16683,7 @@ /area/security/brig) "aKz" = ( /turf/closed/wall, -/area/storage/emergency/generic) +/area/storage/emergency) "aKA" = ( /obj/structure/table/wood, /obj/machinery/button/door{ @@ -16971,22 +16897,9 @@ /turf/open/floor/plasteel, /area/bridge) "aKZ" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/mob/living/simple_animal/kiwi, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aLa" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -17180,21 +17093,12 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aLs" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/machinery/meter, +/turf/closed/wall/mineral/wood, +/area/crew_quarters/fitness/cogpool) "aLt" = ( /obj/machinery/light, /obj/structure/disposalpipe/segment{ @@ -17303,16 +17207,12 @@ /turf/open/floor/plasteel/dark, /area/bridge) "aLF" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) "aLG" = ( /obj/structure/cable{ icon_state = "2-8" @@ -17388,11 +17288,12 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aLO" = ( -/obj/item/toy/talking/owl, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) "aLP" = ( /obj/structure/window/reinforced{ dir = 1; @@ -17506,16 +17407,17 @@ /turf/open/floor/carpet, /area/security/courtroom) "aMa" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/chair/stool, +/obj/machinery/camera{ + c_tag = "Pool - Sauna"; + dir = 8; + pixel_y = -22 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) "aMb" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -17628,21 +17530,12 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aMm" = ( -/obj/machinery/computer/med_data, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/effect/turf_decal/delivery, +/obj/structure/mineral_door/woodrustic{ + name = "Nature Preserve" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel, +/area/hydroponics/garden) "aMn" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -17757,13 +17650,11 @@ }, /area/crew_quarters/bar) "aMz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/storage{ - name = "Canister Storage" - }) +/turf/closed/wall/mineral/wood, +/area/crew_quarters/fitness/cogpool) "aMA" = ( /turf/closed/wall, /area/janitor) @@ -17851,15 +17742,20 @@ }, /area/chapel/main) "aMK" = ( -/obj/vehicle/ridden/wheelchair, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/structure/rack, +/obj/item/clothing/suit/space/fragile, +/obj/item/clothing/head/helmet/space/fragile, +/obj/item/tank/internals/air, +/obj/item/flashlight, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/camera{ + c_tag = "Pool Maintenance"; + dir = 8; + pixel_y = -22 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "aML" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -18233,12 +18129,14 @@ /turf/open/floor/plating, /area/maintenance/department/chapel) "aNx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/securearea, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "Pool Exterior Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/crew_quarters/fitness/cogpool) "aNy" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -18306,10 +18204,9 @@ /turf/open/floor/plasteel, /area/tcommsat/server) "aND" = ( -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) "aNE" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 9 @@ -18333,20 +18230,9 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "aNH" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Exterior Engineering Access"; - req_access_txt = "11;13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/flora/junglebush/large, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aNI" = ( /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -18412,13 +18298,8 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aNQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/securearea, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/engine/storage{ - name = "Canister Storage" - }) +/turf/open/floor/plating/airless, +/area/crew_quarters/fitness/cogpool) "aNR" = ( /turf/closed/wall/r_wall, /area/crew_quarters/heads/hop) @@ -18511,20 +18392,26 @@ /turf/open/floor/plating, /area/maintenance/department/eva) "aOc" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) -"aOd" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/closed/wall, +/area/crew_quarters/fitness/cogpool) +"aOd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/crew_quarters/fitness/cogpool) "aOe" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -18571,22 +18458,28 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aOk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced/spawner, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) -"aOl" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) +"aOl" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "aOm" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -18632,14 +18525,17 @@ /turf/open/floor/plasteel, /area/bridge) "aOq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/effect/turf_decal/delivery, -/obj/item/extinguisher, -/obj/structure/window/reinforced/spawner, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) "aOr" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -18711,15 +18607,17 @@ /turf/open/floor/plasteel, /area/security/courtroom) "aOx" = ( -/obj/structure/table/reinforced, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 4 +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8 }, -/obj/item/radio, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/crew_quarters/fitness/cogpool) "aOy" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -18749,13 +18647,14 @@ /turf/closed/wall/r_wall, /area/security/courtroom) "aOC" = ( -/obj/machinery/light/small{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/crew_quarters/fitness/cogpool) "aOD" = ( /obj/machinery/door/airlock{ name = "Catering"; @@ -18767,29 +18666,13 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aOE" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) "aOF" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/item/toy/talking/owl, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aOG" = ( /obj/structure/chair/comfy/teal{ dir = 1 @@ -18820,8 +18703,9 @@ /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) "aOJ" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/fitness/cogpool) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aOK" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -18839,13 +18723,12 @@ /turf/closed/wall, /area/security/brig) "aOM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/mob/living/simple_animal/chicken{ + name = "Kentucky"; + real_name = "Kentucky" }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aON" = ( /obj/machinery/light{ dir = 8 @@ -18872,22 +18755,17 @@ /turf/open/floor/engine, /area/engine/gravity_generator) "aOQ" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "cold loop to generator" +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "aOR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) "aOS" = ( /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -18896,20 +18774,23 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aOT" = ( -/turf/closed/wall, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, /area/crew_quarters/fitness/cogpool) "aOU" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall/rust, /area/crew_quarters/fitness/cogpool) "aOV" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 }, -/turf/open/floor/plasteel/stairs, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plating/airless, +/area/crew_quarters/fitness/cogpool) "aOW" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/bot, @@ -18922,74 +18803,45 @@ /turf/open/floor/plasteel, /area/security/brig) "aOX" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Pool" +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/machinery/door/airlock/external/glass{ + name = "Pool Exterior Access"; + req_access_txt = "13" }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel/white/side, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/space/basic, /area/crew_quarters/fitness/cogpool) "aOY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/structure/window/reinforced/spawner/west, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) "aOZ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, /area/bridge) "aPa" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Pool" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side, -/area/crew_quarters/fitness/cogpool) +/turf/closed/wall/r_wall, +/area/engine/substation) "aPb" = ( /obj/structure/grille, /turf/open/floor/plating, /area/hallway/primary/central) "aPc" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/mob/living/simple_animal/crab/kreb, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden) "aPd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +/obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/area/hydroponics/garden) "aPe" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 26 - }, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/closed/wall/r_wall/rust, +/area/hydroponics/garden) "aPf" = ( /obj/structure/cable{ icon_state = "4-8" @@ -19008,17 +18860,11 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "aPh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/machinery/meter, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/closed/wall/r_wall, +/area/hydroponics/garden) "aPi" = ( /obj/structure/sink{ dir = 4; @@ -19052,13 +18898,11 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aPm" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/closed/wall/r_wall, +/area/hydroponics/garden) "aPn" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -19308,38 +19152,19 @@ }, /area/security/courtroom) "aPN" = ( -/obj/structure/grille, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 9 }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/turf/closed/wall/r_wall/rust, +/area/hydroponics/garden) "aPO" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aPP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) "aPQ" = ( /obj/machinery/light{ dir = 4; @@ -19356,21 +19181,22 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aPR" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating/airless, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/closed/wall/r_wall, +/area/engine/engineering) "aPS" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/door/airlock/external/glass{ + name = "Exterior Engineering Access"; + req_access_txt = "11;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) "aPT" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -19457,37 +19283,30 @@ /turf/open/floor/plasteel, /area/security/brig) "aQc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"aQd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/suit_storage_unit/engine, /obj/machinery/light/small{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) -"aQd" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel, +/area/engine/engineering) "aQe" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32; + pixel_y = 32 }, -/turf/open/floor/plating, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "aQf" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -19529,16 +19348,15 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai) "aQk" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/space_heater{ + anchored = 1 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plasteel, +/area/engine/engineering) "aQl" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 10 @@ -19578,17 +19396,24 @@ /turf/open/floor/plating, /area/security/courtroom) "aQp" = ( -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating/airless, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) "aQq" = ( -/turf/open/floor/plating/airless, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/suit_storage_unit/engine, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "aQr" = ( /obj/structure/grille, /obj/structure/disposalpipe/segment{ @@ -19603,31 +19428,31 @@ /turf/open/floor/plating, /area/crew_quarters/lounge/jazz) "aQs" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/components/binary/valve/digital{ +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aQt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) -"aQt" = ( -/obj/machinery/pool/controller, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel, +/area/engine/engineering) "aQu" = ( -/obj/structure/table, -/obj/item/toy/beach_ball{ - pixel_y = 12 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 }, -/obj/item/clothing/glasses/sunglasses{ - pixel_y = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/closed/wall/r_wall, +/area/engine/engineering) "aQv" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -19642,16 +19467,20 @@ /turf/open/floor/plasteel, /area/security/main) "aQx" = ( -/obj/machinery/camera{ - c_tag = "Engine Room - Port Bow" +/obj/machinery/door/airlock/engineering{ + name = "Engineering EVA"; + req_access_txt = "11" }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, +/area/engine/engineering) "aQy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19662,9 +19491,14 @@ /turf/closed/wall, /area/chapel/main) "aQz" = ( -/obj/structure/chair/comfy/teal, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Router"; + req_access_txt = "11" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering) "aQA" = ( /obj/structure/chair/stool, /obj/structure/disposalpipe/segment{ @@ -19674,24 +19508,21 @@ /turf/open/floor/plasteel, /area/security/prison) "aQB" = ( -/obj/structure/table, -/obj/item/clothing/glasses/sunglasses{ - pixel_y = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) -"aQC" = ( -/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/door/airlock/engineering{ + name = "Engineering Router"; + req_access_txt = "11" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aQC" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) "aQD" = ( /obj/structure/cable{ icon_state = "1-2" @@ -19726,16 +19557,14 @@ /turf/open/floor/plasteel, /area/security/brig) "aQI" = ( -/obj/structure/chair/comfy/teal, -/obj/machinery/light{ - dir = 1; - light_color = "#cee5d2" +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/light_switch{ + pixel_x = -24 }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) "aQJ" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -19778,38 +19607,23 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aQP" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/kirbyplants{ - icon_state = "plant-02" - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel, +/area/engine/engineering) "aQQ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) "aQR" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/engineering) "aQS" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -19822,22 +19636,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "aQT" = ( -/obj/machinery/door/airlock/engineering{ - name = "Thermo-Electric Generator"; - req_one_access_txt = "10;24" - }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/plasteel, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/engine/engineering) "aQU" = ( /obj/machinery/light_switch{ pixel_x = 24 @@ -19859,15 +19663,14 @@ /turf/closed/wall/r_wall, /area/crew_quarters/heads/captain) "aQX" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/machinery/camera{ + c_tag = "Engine Room - Port Bow" }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/engineering) "aQY" = ( /obj/structure/window/plasma/reinforced{ dir = 4 @@ -19921,11 +19724,12 @@ }, /area/hallway/primary/central) "aRc" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "gas to sauna" }, -/turf/closed/wall, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/engineering) "aRd" = ( /obj/machinery/light, /obj/structure/disposalpipe/segment{ @@ -19989,26 +19793,11 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aRj" = ( -/obj/machinery/light{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/radio/intercom{ - name = "Station Intercom (Common)"; - pixel_y = 26 - }, -/obj/machinery/sleep_console{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/closed/wall/r_wall, +/area/engine/substation) "aRk" = ( /obj/structure/disposalpipe/junction/yjunction, /obj/structure/cable{ @@ -20056,14 +19845,13 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "aRp" = ( -/obj/structure/sign/warning/fire, -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/meter, +/turf/open/floor/plating, +/area/engine/engineering) "aRq" = ( /obj/structure/grille, /obj/structure/disposalpipe/segment, @@ -20075,14 +19863,10 @@ /turf/open/floor/plating, /area/maintenance/department/eva) "aRr" = ( -/mob/living/simple_animal/chicken{ - name = "Kentucky"; - real_name = "Kentucky" - }, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) "aRs" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20127,11 +19911,9 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "aRx" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/engine/secure_construction) "aRy" = ( /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload_foyer) @@ -20149,19 +19931,8 @@ /turf/open/floor/plasteel, /area/crew_quarters/lounge) "aRA" = ( -/obj/structure/table/optable, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/reagent_containers/blood/random, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/closed/wall/r_wall, +/area/engine/secure_construction) "aRB" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -20195,37 +19966,18 @@ /turf/closed/wall/r_wall/rust, /area/engine/gravity_generator) "aRE" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) -"aRF" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/closed/wall/r_wall, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/area/engine/secure_construction) +"aRF" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/engine/substation) "aRG" = ( -/obj/machinery/power/generator, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) "aRH" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/blobstart, @@ -20243,11 +19995,9 @@ /turf/open/floor/plating, /area/maintenance/port/central) "aRJ" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/engine/engineering) "aRK" = ( /obj/structure/sign/departments/holy{ pixel_y = -32 @@ -20265,11 +20015,11 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aRL" = ( -/mob/living/simple_animal/crab/kreb, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "aRM" = ( /turf/open/floor/carpet, /area/crew_quarters/bar) @@ -20325,15 +20075,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aRR" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 }, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/engine/engineering) "aRS" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -20372,20 +20122,11 @@ /turf/open/floor/plasteel, /area/security/main) "aRV" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/engine/engineering) "aRW" = ( /turf/open/floor/plating, /area/maintenance/port/central) @@ -20400,10 +20141,11 @@ /turf/open/space/basic, /area/space/nearstation) "aRY" = ( -/turf/closed/wall/r_wall, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering) "aRZ" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -20419,16 +20161,12 @@ /turf/open/floor/plasteel, /area/bridge) "aSb" = ( -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/engineering) "aSc" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -20464,9 +20202,15 @@ /turf/open/floor/plasteel, /area/chapel/main) "aSf" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/engine/engineering) "aSg" = ( /obj/machinery/power/apc{ name = "Security Maintainance APC"; @@ -20544,10 +20288,11 @@ /turf/open/space/basic, /area/space/nearstation) "aSr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/engine/engineering) "aSs" = ( /obj/machinery/light{ dir = 1; @@ -20602,22 +20347,28 @@ /turf/open/space/basic, /area/space/nearstation) "aSz" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "hot loop to space" }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/engineering) "aSA" = ( -/obj/structure/closet/secure_closet/medical2, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/secure_construction"; + dir = 1; + name = "Engineering Construction Area APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "aSB" = ( /obj/machinery/door/airlock/command{ name = "Bridge"; @@ -20649,50 +20400,35 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "aSE" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) -"aSF" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/surgical_drapes, -/obj/item/scalpel, -/obj/item/circular_saw{ - pixel_y = 16 - }, -/obj/item/hemostat, -/obj/item/retractor, -/obj/item/surgicaldrill, -/obj/item/cautery, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) -"aSG" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) -"aSH" = ( -/obj/structure/disposalpipe/segment{ +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/turf/open/floor/plating, +/area/engine/engineering) +"aSF" = ( +/turf/open/floor/engine, +/area/engine/secure_construction) +"aSG" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aSH" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/engine/engineering) "aSI" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -20717,22 +20453,19 @@ /turf/open/floor/plasteel, /area/security/main) "aSK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) -"aSL" = ( /obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 4 }, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/engine/engineering) +"aSL" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "cold loop to space" + }, +/turf/open/floor/plating, +/area/engine/engineering) "aSM" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -20791,11 +20524,15 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aST" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/area/engine/engineering) "aSU" = ( /obj/structure/reagent_dispensers/beerkeg, /obj/item/radio/intercom{ @@ -20827,18 +20564,12 @@ /turf/open/floor/plasteel, /area/security/prison) "aSY" = ( -/obj/machinery/vending/medical, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/engine, +/area/engine/secure_construction) "aSZ" = ( /obj/structure/chair/stool, /obj/machinery/light, @@ -20876,14 +20607,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aTc" = ( -/obj/machinery/firealarm{ - pixel_y = 26 +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/components/binary/valve/digital/on, /turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/area/engine/engineering) "aTd" = ( /obj/structure/sign/warning{ name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES" @@ -20922,23 +20651,22 @@ /turf/open/floor/plating, /area/tcommsat/computer) "aTi" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering) "aTj" = ( -/obj/machinery/pool/filter{ - pixel_y = 16 +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/pool, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "aTk" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -20957,15 +20685,11 @@ /turf/open/space/basic, /area/space/nearstation) "aTm" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plating, +/area/engine/substation) "aTn" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -21056,15 +20780,30 @@ /turf/open/floor/plasteel, /area/bridge) "aTv" = ( -/turf/open/pool, -/area/crew_quarters/fitness/cogpool) -"aTw" = ( -/obj/structure/pool/ladder{ - dir = 2; - pixel_y = 24 +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/open/pool, -/area/crew_quarters/fitness/cogpool) +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/turf/open/floor/plating, +/area/engine/substation) +"aTw" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/fifteen_k{ + areastring = "/area/engine/substation"; + dir = 1; + name = "Electrical Substation APC"; + pixel_y = 26 + }, +/turf/open/floor/plating, +/area/engine/substation) "aTx" = ( /obj/structure/lattice, /obj/structure/sign/warning{ @@ -21082,11 +20821,12 @@ /turf/open/space/basic, /area/space/nearstation) "aTz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/camera{ + c_tag = "Electrical Substation"; + dir = 1 }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/substation) "aTA" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -21105,12 +20845,16 @@ }, /area/chapel/main) "aTC" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "aTD" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -21223,13 +20967,12 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/camera{ - c_tag = "Thermo-Electric Generator" +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/plating, +/area/engine/engineering) "aTR" = ( /obj/structure/table, /obj/item/paper_bin, @@ -21275,13 +21018,12 @@ /turf/closed/wall, /area/gateway) "aTW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/engine/engineering) "aTX" = ( /obj/machinery/light{ dir = 1; @@ -21295,15 +21037,17 @@ /turf/open/floor/plasteel, /area/security/courtroom) "aTZ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "hot loop to space" +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/terminal{ + dir = 1 }, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/engine/substation) "aUa" = ( /obj/machinery/light_switch{ pixel_x = 24 @@ -21313,14 +21057,11 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aUb" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ +/obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plating, +/area/engine/substation) "aUc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21334,35 +21075,24 @@ /turf/open/floor/plating, /area/maintenance/port/central) "aUd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) -"aUe" = ( -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) -"aUf" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/structure/cable/yellow{ +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/door/airlock/engineering{ + name = "Electrical Substation"; + req_access_txt = "10" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/engine/substation) +"aUe" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/teg) +"aUf" = ( +/turf/closed/wall/r_wall, +/area/engine/teg) "aUg" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -21445,26 +21175,34 @@ /turf/closed/wall/r_wall, /area/crew_quarters/lounge/jazz) "aUr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 10 +/obj/machinery/door/airlock/engineering{ + name = "Thermo-Electric Generator"; + req_one_access_txt = "10;24" }, -/obj/machinery/light_switch{ - pixel_y = -24 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, +/area/engine/teg) "aUs" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel/dark, /area/chapel/office) "aUt" = ( -/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/engine/teg) "aUu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -21694,9 +21432,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aUU" = ( -/obj/machinery/pool/drain, -/turf/open/pool, -/area/crew_quarters/fitness/cogpool) +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/engine/engineering) "aUV" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 10 @@ -21704,9 +21445,14 @@ /turf/open/floor/plasteel, /area/security/courtroom) "aUW" = ( -/obj/structure/pool/Lboard, -/turf/open/pool, -/area/crew_quarters/fitness/cogpool) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/engineering) "aUX" = ( /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, @@ -21735,12 +21481,12 @@ /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aVb" = ( -/obj/structure/pool/Rboard, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "aVc" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -21770,8 +21516,11 @@ /turf/open/floor/plating, /area/maintenance/port/central) "aVf" = ( -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/teg) "aVg" = ( /obj/machinery/computer/cryopod{ pixel_y = 28 @@ -21927,13 +21676,12 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/lounge/jazz) "aVy" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/reagent_dispensers/foamtank, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "aVz" = ( /obj/structure/chair{ dir = 8 @@ -21957,13 +21705,14 @@ /turf/open/floor/circuit/green, /area/crew_quarters/cryopod) "aVB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 +/obj/machinery/light_switch{ + pixel_y = 24 }, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/teg) "aVC" = ( /obj/structure/cable{ icon_state = "4-8" @@ -22154,18 +21903,16 @@ /turf/open/floor/plasteel, /area/gateway) "aVX" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/gloves/color/latex, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank/high, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "aVY" = ( /obj/structure/chair{ dir = 4 @@ -22333,21 +22080,14 @@ /turf/open/floor/plating, /area/hallway/primary/port/fore) "aWs" = ( -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "aWt" = ( /obj/machinery/light/small{ dir = 4 @@ -22477,20 +22217,11 @@ /turf/open/floor/plasteel/checker, /area/ai_monitored/storage/eva) "aWH" = ( -/obj/machinery/disposal/bin{ - name = "Corpse Delivery" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/obj/machinery/light, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/delivery/red, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/open/floor/engine, +/area/engine/secure_construction) "aWI" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/tile/yellow{ @@ -22502,21 +22233,11 @@ /turf/open/floor/plasteel/checker, /area/ai_monitored/storage/eva) "aWJ" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/turf/open/floor/engine, +/area/engine/secure_construction) "aWK" = ( /obj/structure/table, /obj/effect/turf_decal/stripes/line{ @@ -22628,14 +22349,14 @@ }, /area/crew_quarters/lounge/jazz) "aWV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/camera{ + c_tag = "Thermo-Electric Generator" + }, +/turf/open/floor/engine, +/area/engine/teg) "aWW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22649,19 +22370,14 @@ /turf/open/floor/plating, /area/maintenance/central) "aWX" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/delivery, +/obj/machinery/firealarm{ + pixel_y = 26 + }, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "4-8" }, -/obj/machinery/power/apc{ - areastring = "/area/medical"; - dir = 8; - name = "Medical Booth APC"; - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/civilian) +/turf/open/floor/engine, +/area/engine/teg) "aWY" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -22733,14 +22449,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aXh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 6 +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/engine, +/area/engine/teg) "aXi" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/plasteel, @@ -22804,13 +22518,12 @@ /area/ai_monitored/storage/eva) "aXp" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 1 }, -/obj/structure/reagent_dispensers/foamtank, +/obj/effect/turf_decal/stripes/line, +/obj/structure/transit_tube/horizontal, /turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/area/engine/secure_construction) "aXq" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -22924,7 +22637,7 @@ name = "gas to hot loop" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "aXG" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/blue, @@ -22996,24 +22709,16 @@ /turf/open/floor/plasteel, /area/security/brig) "aXP" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Pool Maintenance"; - req_one_access_txt = "12" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/machinery/atmospherics/components/binary/pump/on{ dir = 8 }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/turf/closed/wall/r_wall, +/area/engine/teg) "aXQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/medical{ - name = "Medical Booth" - }) +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal, +/turf/open/floor/plating, +/area/engine/secure_construction) "aXR" = ( /turf/closed/wall, /area/security/courtroom) @@ -23111,20 +22816,12 @@ /turf/open/floor/plasteel, /area/tcommsat/computer) "aYb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "generator to hot loop" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "aYc" = ( /obj/effect/landmark/start/assistant, /turf/open/floor/wood, @@ -23162,32 +22859,22 @@ /turf/open/floor/plasteel, /area/bridge) "aYi" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "aYj" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 9 }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel/dark, +/area/engine/teg) "aYk" = ( /turf/open/floor/circuit/green, /area/ai_monitored/nuke_storage) @@ -23446,30 +23133,17 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "aYL" = ( +/turf/closed/wall/r_wall, +/area/engine/storage) +"aYM" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) -"aYM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/engineering) "aYN" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -23533,7 +23207,25 @@ /area/hallway/primary/port/fore) "aYW" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, +/obj/item/pen/blue, +/obj/machinery/camera{ + c_tag = "Customs - Fore"; + dir = 4 + }, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPFore"; + name = "HoP Fore Desk Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"aYX" = ( +/obj/structure/table/reinforced, /obj/machinery/door/window/northright{ name = "Customs Desk"; req_access_txt = "57" @@ -23542,16 +23234,9 @@ id = "HoPFore"; name = "HoP Fore Desk Shutters" }, -/turf/open/floor/plasteel/dark, -/area/security/checkpoint/customs) -"aYX" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/flashlight/lamp, -/obj/structure/window/reinforced/spawner/north, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "HoPFore"; - name = "HoP Fore Desk Shutters" +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" }, /turf/open/floor/plasteel/dark, /area/security/checkpoint/customs) @@ -23574,14 +23259,11 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai) "aZa" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/engineering) "aZb" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -23592,11 +23274,14 @@ }, /area/maintenance/department/eva) "aZc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel/dark, +/area/engine/teg) "aZd" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -23626,11 +23311,11 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "aZg" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel/dark, +/area/engine/teg) "aZh" = ( /obj/structure/closet/crate, /obj/machinery/light, @@ -23655,19 +23340,19 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/item/caution{ +/obj/item/clothing/suit/caution{ pixel_x = 6; pixel_y = 3 }, -/obj/item/caution{ +/obj/item/clothing/suit/caution{ pixel_x = 6; pixel_y = 3 }, -/obj/item/caution{ +/obj/item/clothing/suit/caution{ pixel_x = 6; pixel_y = 3 }, -/obj/item/caution{ +/obj/item/clothing/suit/caution{ pixel_x = 6; pixel_y = 3 }, @@ -23779,13 +23464,14 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "aZt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, /obj/effect/turf_decal/stripes/line{ - dir = 10 + dir = 1 }, /turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/area/engine/teg) "aZu" = ( /obj/machinery/blackbox_recorder, /obj/effect/turf_decal/bot_white, @@ -24234,14 +23920,14 @@ /turf/open/space/basic, /area/space/nearstation) "ban" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bao" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/stripes/white/full, @@ -24249,27 +23935,14 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "bap" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/firealarm{ + pixel_y = 26 }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, +/obj/effect/decal/cleanable/cobweb, /turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/area/engine/storage) "baq" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, @@ -24523,25 +24196,20 @@ }, /area/lawoffice) "baT" = ( -/obj/machinery/iv_drip, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/manifold/supply/visible, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/teg) "baU" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "cold loop to generator" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "baV" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -24665,14 +24333,8 @@ /turf/closed/wall, /area/hallway/primary/aft) "bbi" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "bbj" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/closed/wall/r_wall, @@ -24750,10 +24412,11 @@ /turf/open/floor/plasteel/dark, /area/lawoffice) "bbt" = ( -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/teg) "bbu" = ( /obj/structure/grille, /obj/structure/cable, @@ -24782,13 +24445,12 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bbx" = ( +/obj/structure/window/reinforced/spawner/east, /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bby" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -24800,14 +24462,10 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bbz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/engine/teg) "bbA" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -24821,23 +24479,21 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bbB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/engine/engineering) "bbC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering) "bbD" = ( /obj/structure/cable{ icon_state = "1-2" @@ -24847,14 +24503,10 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bbE" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/electricshock, +/turf/open/floor/plating, +/area/engine/teg) "bbF" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 6 @@ -24871,11 +24523,10 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bbH" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating, +/area/engine/teg) "bbI" = ( /obj/machinery/light, /turf/open/floor/plasteel, @@ -25008,16 +24659,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bbZ" = ( +/obj/structure/window/reinforced/spawner/west, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 4 }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bca" = ( /turf/open/floor/engine/vacuum, /area/engine/atmos) @@ -25035,11 +24682,14 @@ /turf/closed/wall/r_wall, /area/crew_quarters/lounge/jazz) "bcd" = ( -/obj/item/kirbyplants{ - icon_state = "plant-14" +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/engine, +/area/engine/teg) "bce" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor/auto{ @@ -25176,20 +24826,22 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom/jury) "bcu" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/camera{ - c_tag = "Aft Maintenance - Air Hookup" +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (Common)"; + pixel_x = 28 + }, +/turf/open/floor/engine, +/area/engine/teg) "bcv" = ( -/obj/machinery/atmospherics/components/binary/valve/digital/on, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/engine/teg) "bcw" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -25239,28 +24891,31 @@ /turf/open/floor/plasteel, /area/gateway) "bcD" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bcE" = ( -/obj/machinery/atmospherics/components/binary/valve/digital/on{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) -"bcF" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, /turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/area/engine/engineering) +"bcF" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering) "bcG" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment, @@ -25278,10 +24933,14 @@ /turf/open/floor/plasteel/dark/side, /area/security/courtroom) "bcI" = ( -/turf/closed/wall/r_wall, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel, +/area/engine/storage) "bcJ" = ( /obj/machinery/button/door{ id = "HoPAft"; @@ -25329,17 +24988,15 @@ /turf/open/floor/plasteel, /area/security/courtroom) "bcO" = ( -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/components/binary/circulator{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/teg) "bcP" = ( /obj/structure/cable{ icon_state = "4-8" @@ -25411,15 +25068,15 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload_foyer) "bcZ" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/cable{ icon_state = "0-2" }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload_foyer) "bda" = ( @@ -25445,20 +25102,16 @@ /turf/open/floor/engine/vacuum, /area/science/mixing) "bdd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Pool"; +/obj/machinery/power/generator, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/closet/secure_closet/personal, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "0-2" }, -/obj/item/toy/poolnoodle/red, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "bde" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -25474,16 +25127,15 @@ /turf/open/floor/plating, /area/hallway/primary/central) "bdh" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/atmospherics/components/binary/circulator/cold{ dir = 8 }, -/obj/structure/closet/secure_closet/personal, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/toy/poolnoodle/blue, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/teg) "bdi" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -25506,24 +25158,20 @@ }, /area/hallway/primary/central) "bdk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/area/engine/storage) "bdl" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/closet/athletic_mixed, -/obj/effect/turf_decal/tile/yellow{ +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/light{ dir = 8 }, -/obj/item/toy/poolnoodle/yellow, -/turf/open/floor/plasteel/white, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bdm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -25687,11 +25335,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bdE" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/grass, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "bdF" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -25763,13 +25411,23 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bdL" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/machinery/turretid{ + control_area = "/area/science/server"; + icon_state = "control_stun"; + name = "Computer Core turret control"; + pixel_x = -3; + pixel_y = -23; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bdM" = ( /turf/open/floor/plasteel, /area/quartermaster/office) @@ -25779,16 +25437,25 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bdO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Pool External Maintenance"; - req_access_txt = "12" +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/area/engine/engineering) "bdP" = ( -/turf/closed/wall/mineral/wood, -/area/crew_quarters/fitness/cogpool) +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/teg) "bdQ" = ( /obj/machinery/door/airlock/command{ name = "Bridge"; @@ -25833,11 +25500,20 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bdW" = ( -/obj/structure/mineral_door/woodrustic{ - name = "Sauna" +/obj/structure/table/reinforced, +/obj/item/analyzer, +/obj/item/t_scanner, +/obj/structure/cable{ + icon_state = "0-8" }, -/turf/open/floor/wood, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/power/apc{ + areastring = "/area/engine/teg"; + dir = 4; + name = "Thermo-Electric Generator APC"; + pixel_x = 24 + }, +/turf/open/floor/engine, +/area/engine/teg) "bdX" = ( /obj/structure/table/wood, /obj/item/storage/box/donkpockets, @@ -25847,9 +25523,11 @@ }, /area/chapel/main) "bdY" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/mineral/wood, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/engine, +/area/engine/teg) "bdZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -25906,13 +25584,12 @@ /turf/open/floor/plating/airless, /area/science/test_area) "bei" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/turf/open/floor/engine, +/area/engine/teg) "bej" = ( /turf/open/floor/plasteel, /area/quartermaster/sorting) @@ -25933,14 +25610,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bem" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "hot loop to generator" - }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/effect/turf_decal/delivery, +/obj/item/extinguisher, +/obj/structure/window/reinforced/spawner, /turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/area/engine/teg) "ben" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -25970,25 +25645,24 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "beq" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "generator to cold loop" +/obj/structure/table/reinforced, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 4 }, +/obj/item/radio, /turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/area/engine/teg) "ber" = ( /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bes" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/turf/closed/wall/r_wall, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bet" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -26004,18 +25678,15 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai) "bev" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/item/radio/intercom{ +/obj/machinery/firealarm{ dir = 8; - name = "Station Intercom (Common)"; - pixel_x = 28 + pixel_x = 26 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "bew" = ( /obj/structure/cable{ icon_state = "1-2" @@ -26033,11 +25704,8 @@ /turf/open/floor/plasteel, /area/security/courtroom) "bey" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/closed/wall/r_wall/rust, -/area/crew_quarters/fitness/cogpool) +/turf/closed/wall/r_wall, +/area/science/server/compcore) "bez" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -26106,25 +25774,28 @@ /turf/open/floor/plasteel/dark, /area/lawoffice) "beH" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/machinery/light{ - dir = 4 +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/science/server/compcore) "beI" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4 +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/door/airlock/command{ + name = "Computer Core"; + req_access_txt = "30" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/server/compcore) "beJ" = ( /turf/open/floor/plasteel, /area/hallway/primary/central) @@ -26307,10 +25978,13 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom/jury) "bfh" = ( -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/grille, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/server/compcore) "bfi" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 10 @@ -26318,17 +25992,23 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bfj" = ( -/mob/living/simple_animal/butterfly, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/structure/grille, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/server/compcore) "bfk" = ( -/mob/living/simple_animal/kiwi, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/closed/wall/r_wall, +/area/science/server/compcore) "bfl" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -26350,15 +26030,11 @@ /turf/open/floor/plating, /area/maintenance/department/security) "bfn" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "cold loop to space" - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/window/reinforced/spawner/east, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bfo" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -26438,8 +26114,11 @@ }, /area/gateway) "bfv" = ( -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/stairs, +/area/engine/teg) "bfw" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -26460,13 +26139,11 @@ /turf/open/floor/plasteel/white, /area/gateway) "bfy" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/spawner/lootdrop/maintenance, -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bfz" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/event_spawn, @@ -26524,12 +26201,11 @@ /turf/open/floor/plating, /area/quartermaster/sorting) "bfF" = ( -/obj/machinery/space_heater, -/obj/structure/sign/poster/official/no_erp{ - pixel_y = 32 +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/turf/open/floor/wood, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel/dark, +/area/engine/teg) "bfG" = ( /obj/machinery/conveyor{ dir = 4; @@ -26552,23 +26228,18 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "bfI" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 }, -/obj/machinery/power/apc/highcap/fifteen_k{ - areastring = "/area/engine/storage_shared"; - dir = 1; - name = "Electrical Substation APC"; - pixel_y = 26 - }, -/turf/open/floor/plating, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/turf/open/floor/engine, +/area/engine/teg) "bfJ" = ( -/turf/open/floor/wood, -/area/crew_quarters/fitness/cogpool) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/teg) "bfK" = ( /obj/structure/table/wood, /obj/item/storage/fancy/candle_box{ @@ -26601,13 +26272,23 @@ }, /area/chapel/office) "bfM" = ( -/obj/machinery/light/small{ - dir = 4; - light_color = "#d8b1b1" +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/table, +/obj/machinery/light_switch{ + pixel_x = 24 }, -/obj/structure/bedsheetbin/towel, -/turf/open/floor/wood, -/area/crew_quarters/fitness/cogpool) +/obj/item/clothing/ears/earmuffs, +/obj/item/extinguisher{ + pixel_x = -12; + pixel_y = -2 + }, +/obj/machinery/camera{ + c_tag = "Engineering - Hot Loop"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/engine/teg/hotloop) "bfN" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, @@ -26927,10 +26608,24 @@ /turf/open/floor/plating, /area/quartermaster/warehouse) "bgw" = ( -/turf/open/floor/engine, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Engineering Construction Area"; + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "bgx" = ( /obj/structure/table/glass, /turf/open/floor/plasteel, @@ -27062,12 +26757,11 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "bgJ" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4 }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/turf/closed/wall/r_wall, +/area/engine/teg) "bgK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -27116,19 +26810,19 @@ /area/quartermaster/sorting) "bgP" = ( /obj/item/analyzer, -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/maintenance/disposal) "bgQ" = ( /turf/closed/wall, /area/quartermaster/qm) "bgR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "hot loop to generator" }, -/obj/machinery/meter, -/turf/closed/wall/mineral/wood, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "bgS" = ( /obj/machinery/computer/bounty, /obj/effect/turf_decal/tile/brown{ @@ -27164,9 +26858,6 @@ /turf/open/floor/plating, /area/crew_quarters/heads/hor) "bgY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/status_display, /turf/closed/wall/r_wall, /area/hallway/primary/central) @@ -27180,12 +26871,15 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bha" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/turf/open/floor/wood, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/teg) "bhb" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 1 @@ -27193,12 +26887,11 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bhc" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/turf/open/floor/wood, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "bhd" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -27228,17 +26921,12 @@ /turf/open/floor/plating, /area/quartermaster/office) "bhg" = ( -/obj/structure/chair/stool, -/obj/machinery/camera{ - c_tag = "Pool - Sauna"; - dir = 8; - pixel_y = -22 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plating, +/area/engine/engineering) "bhh" = ( /obj/machinery/status_display, /turf/closed/wall/r_wall, @@ -27265,19 +26953,15 @@ /turf/open/floor/plating, /area/quartermaster/warehouse) "bhl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/closed/wall/mineral/wood, -/area/crew_quarters/fitness/cogpool) +/turf/closed/wall/r_wall, +/area/science/server/compcore) "bhm" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/effect/landmark/event_spawn, +/turf/open/floor/engine, +/area/engine/secure_construction) "bhn" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -27336,23 +27020,23 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "bhs" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/area/engine/secure_construction) "bht" = ( -/obj/structure/grille, /obj/structure/cable, /obj/structure/cable{ icon_state = "0-4" }, +/obj/machinery/power/terminal, +/obj/structure/grille, /obj/structure/window/reinforced/spawner, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai) @@ -27640,16 +27324,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bhZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/conveyor{ - dir = 4; - id = "QMLoad" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) +/turf/closed/wall/r_wall, +/area/science/server/compcore) "bia" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -27730,18 +27409,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bij" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/conveyor{ - dir = 4; - id = "QMLoad" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/storage) +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/closed/wall/r_wall, +/area/science/server/compcore) "bik" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -27755,18 +27428,9 @@ /turf/open/floor/plating, /area/bridge) "bil" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/conveyor{ - dir = 6; - id = "QMLoad" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/science/server/compcore) "bim" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -27855,31 +27519,16 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "biw" = ( -/obj/machinery/computer/cargo{ - dir = 8 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/effect/turf_decal/bot, -/obj/machinery/button/door{ - id = "QMLoadDoor"; - layer = 4; - name = "Cargo Loading Doors"; - pixel_x = 24; - pixel_y = 6 +/obj/structure/window/reinforced/spawner, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 }, -/obj/machinery/button/door{ - id = "QMUnloadDoor"; - layer = 4; - name = "Cargo Unloading Doors"; - pixel_x = 24; - pixel_y = -6 - }, -/obj/machinery/camera{ - c_tag = "Supply - Cargo Bay"; - dir = 8; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) +/turf/open/floor/plasteel/dark, +/area/science/server/compcore) "bix" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -27932,13 +27581,17 @@ /turf/open/floor/plasteel, /area/maintenance/disposal) "biE" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, /obj/structure/cable{ icon_state = "2-8" }, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/science/server/compcore) "biF" = ( /obj/structure/cable{ icon_state = "4-8" @@ -27973,13 +27626,11 @@ }, /area/crew_quarters/heads/hor) "biH" = ( -/obj/machinery/light/small, -/obj/machinery/space_heater, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/science/server/compcore) "biI" = ( /obj/machinery/light{ dir = 4; @@ -28002,6 +27653,9 @@ /area/quartermaster/office) "biK" = ( /obj/structure/closet/firecloset, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, /area/science/mixing) "biL" = ( @@ -28256,17 +27910,14 @@ /turf/open/floor/plating, /area/maintenance/department/eva) "bjq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/conveyor{ - id = "QMLoad" +/obj/structure/cable{ + icon_state = "1-4" }, /turf/open/floor/plating, -/area/quartermaster/storage) +/area/engine/engineering) "bjr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -28325,14 +27976,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/central) "bjx" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/bot, -/obj/item/defibrillator/loaded, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/teg) "bjy" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -28475,20 +28123,11 @@ /turf/open/floor/plasteel, /area/storage/primary) "bjL" = ( -/obj/structure/rack, -/obj/item/clothing/suit/space/fragile, -/obj/item/clothing/head/helmet/space/fragile, -/obj/item/tank/internals/air, -/obj/item/flashlight, -/obj/item/reagent_containers/spray/cleaner, -/obj/machinery/camera{ - c_tag = "Pool Maintenance"; - dir = 8; - pixel_y = -22 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/engine, +/area/engine/teg) "bjM" = ( /obj/machinery/door/airlock/public/glass{ name = "Atmospherics Storage"; @@ -28676,11 +28315,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bkf" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/teg) "bkg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/mineral/stacking_unit_console{ @@ -28753,65 +28392,49 @@ /turf/open/floor/plasteel, /area/science/circuit) "bkp" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "QMLoad" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bkq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/conveyor/inverted{ - dir = 9; - id = "QMLoad" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"bkr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/conveyor{ - dir = 4; - id = "QMLoad" - }, -/obj/machinery/door/poddoor{ - id = "QMLoadDoor"; - name = "Cargo Loading Door" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"bks" = ( -/obj/structure/plasticflaps, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/conveyor{ - dir = 4; - id = "QMLoad" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"bkt" = ( -/obj/effect/turf_decal/stripes/end{ +/obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 4 }, -/obj/machinery/conveyor{ - dir = 4; - id = "QMLoad" +/turf/open/floor/engine, +/area/engine/teg) +"bkq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 }, -/obj/machinery/door/poddoor{ - id = "QMLoadDoor"; - name = "Cargo Loading Door" +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/teg) +"bkr" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "generator to cold loop" + }, +/turf/open/floor/engine, +/area/engine/teg) +"bks" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-8" }, /turf/open/floor/plating, -/area/quartermaster/storage) +/area/engine/engineering) +"bkt" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/photocopier, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bku" = ( /obj/structure/closet, /turf/open/floor/plasteel, @@ -28838,12 +28461,19 @@ }, /area/crew_quarters/heads/hor) "bkz" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bkA" = ( /obj/machinery/light_switch{ pixel_y = -24 @@ -28950,23 +28580,11 @@ /turf/open/floor/plating, /area/storage/primary) "bkJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/airalarm{ + pixel_y = 24 }, /turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/science/server/compcore) "bkK" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -29048,22 +28666,9 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bkT" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/radio/intercom{ - name = "Station Intercom (Common)"; - pixel_x = 26 - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/structure/sign/warning/nosmoking/circle, +/turf/closed/wall/r_wall, +/area/engine/storage) "bkU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29086,14 +28691,8 @@ /turf/open/floor/plating, /area/maintenance/department/eva) "bkW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/external{ - name = "Pool Exterior Access"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel, +/area/science/server/compcore) "bkX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -29262,8 +28861,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "blp" = ( -/turf/closed/wall/r_wall, -/area/hallway/secondary/exit) +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/teg) "blq" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -29331,34 +28934,28 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "blv" = ( -/obj/machinery/computer/operating, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/science/server/compcore) "blw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/server/compcore) +"blx" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/science/server/compcore"; + dir = 1; + name = "Computer Core APC"; + pixel_y = 24 }, /turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) -"blx" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/science/server/compcore) "bly" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29414,9 +29011,16 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "blD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/science/server/compcore) "blE" = ( /obj/machinery/light{ dir = 8 @@ -29616,12 +29220,22 @@ /turf/open/floor/plasteel, /area/security/brig) "blZ" = ( -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "QMUnload" +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 }, /turf/open/floor/plasteel, -/area/quartermaster/storage) +/area/science/server/compcore) "bma" = ( /obj/structure/chair{ dir = 8 @@ -29666,13 +29280,20 @@ }, /area/crew_quarters/heads/hor) "bme" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/engine, +/area/engine/teg) "bmf" = ( -/obj/structure/sign/departments/evac, -/turf/closed/wall/r_wall, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/teg) "bmg" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -29749,11 +29370,9 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bmm" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) "bmn" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -29916,13 +29535,13 @@ /area/gateway) "bmF" = ( /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" }, -/turf/closed/wall, -/area/crew_quarters/fitness/cogpool) +/turf/closed/wall/r_wall, +/area/science/server/compcore) "bmG" = ( /turf/open/floor/engine, /area/gateway) @@ -29965,35 +29584,42 @@ dir = 4 }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-8" }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) -"bmK" = ( -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/plating, +/area/engine/engineering) +"bmK" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/crew_quarters/fitness/cogpool) +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering) "bmL" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/plasteel, /area/hallway/primary/central) "bmM" = ( -/obj/structure/grille, /obj/structure/cable{ icon_state = "0-2" }, /obj/structure/cable{ icon_state = "0-8" }, +/obj/machinery/power/terminal, +/obj/structure/grille, /obj/structure/window/reinforced/spawner, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai) @@ -30071,13 +29697,12 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bmT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 9 +/obj/machinery/light/small, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/engine, +/area/engine/teg) "bmU" = ( /obj/structure/table/wood, /obj/machinery/light{ @@ -30279,34 +29904,15 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "bni" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 }, -/obj/effect/turf_decal/tile/brown{ +/obj/machinery/atmospherics/components/binary/valve/digital{ dir = 4 }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/clipboard, -/obj/item/stamp, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/pen/red, -/obj/item/pen/blue{ - pixel_x = -5; - pixel_y = -3 - }, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) +/turf/open/floor/engine, +/area/engine/teg) "bnj" = ( /obj/structure/sign/warning/securearea{ desc = "A warning sign which reads 'BOMB RANGE"; @@ -30341,24 +29947,18 @@ /turf/closed/wall/r_wall, /area/science/mixing) "bnn" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, -/obj/machinery/door/window/southleft{ - name = "Cargo Desk"; - req_access_txt = "31" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/item/folder, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/turf/open/floor/engine, +/area/engine/teg) "bno" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -30406,14 +30006,21 @@ /turf/closed/wall/r_wall, /area/maintenance/department/eva) "bnt" = ( -/obj/machinery/camera{ - c_tag = "Electrical Substation"; +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/teg/coldloop"; + dir = 4; + name = "Cold Loop APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/engine/teg/coldloop) "bnu" = ( /obj/structure/cable{ icon_state = "1-2" @@ -30444,25 +30051,13 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bny" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/item/paper_bin, -/obj/item/stack/packageWrap, -/obj/item/stack/packageWrap, -/obj/item/pen, -/obj/item/wirecutters, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) +/turf/open/floor/plating, +/area/engine/engineering) "bnz" = ( /obj/effect/turf_decal/plaque{ icon_state = "L5" @@ -30585,9 +30180,16 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bnO" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/door/airlock/engineering/glass{ + name = "Thermo-Electric Generator"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, +/area/engine/teg) "bnP" = ( /obj/effect/turf_decal/plaque{ icon_state = "L11" @@ -30595,11 +30197,18 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bnQ" = ( -/obj/machinery/atmospherics/components/binary/valve/digital/on, -/turf/closed/wall/r_wall, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/engineering) "bnR" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13" @@ -30607,15 +30216,39 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bnS" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/item/radio/off{ + pixel_x = -3; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bnT" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bnU" = ( /obj/structure/rack, /obj/item/clothing/suit/space/fragile, @@ -30659,23 +30292,24 @@ /turf/open/floor/plasteel, /area/security/checkpoint/supply) "bnY" = ( -/obj/structure/flora/ausbushes/sunnybush, -/turf/open/floor/grass, -/area/hallway/secondary/exit) +/obj/structure/sign/warning/fire, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/engine/teg) "bnZ" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/pen/blue, -/obj/machinery/camera{ - c_tag = "Customs - Fore"; - dir = 4 - }, +/obj/item/flashlight/lamp, /obj/structure/window/reinforced/spawner/north, /obj/machinery/door/poddoor/shutters/preopen{ id = "HoPFore"; name = "HoP Fore Desk Shutters" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, /turf/open/floor/plasteel/dark, /area/security/checkpoint/customs) "boa" = ( @@ -30698,24 +30332,22 @@ /area/crew_quarters/heads/chief) "bod" = ( /obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/machinery/camera{ + c_tag = "Customs - Aft"; dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/structure/window/reinforced/spawner, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPAft"; + name = "HoP Aft Desk Shutters" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft{ - name = "Primary Tool Storage Desk"; - req_access_txt = "11" - }, -/obj/item/folder/yellow, -/turf/open/floor/plasteel, -/area/storage/primary) +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) "boe" = ( /obj/machinery/door/airlock/vault{ name = "Vault Door"; @@ -30728,24 +30360,25 @@ /turf/open/floor/plasteel, /area/ai_monitored/nuke_storage) "bof" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/machinery/porta_turret/ai{ + dir = 1; + req_access = list(16) }, -/obj/machinery/door/airlock/external/glass{ - name = "Pool Exterior Access"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/space/basic, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel, +/area/science/server/compcore) "bog" = ( -/obj/machinery/light{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/door/airlock/engineering/glass{ + name = "Thermo-Electric Generator"; + req_one_access_txt = "10;24" }, -/turf/open/floor/grass, -/area/hallway/secondary/exit) +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, +/area/engine/teg) "boh" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -30759,11 +30392,11 @@ /turf/open/floor/plating, /area/maintenance/disposal) "boi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 5 }, -/turf/closed/wall/r_wall, -/area/crew_quarters/fitness/cogpool) +/turf/open/floor/plasteel, +/area/science/server/compcore) "boj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30803,16 +30436,17 @@ /turf/open/floor/plasteel/dark, /area/teleporter) "bom" = ( -/obj/structure/flora/ausbushes/leafybush, -/turf/open/floor/grass, -/area/hallway/secondary/exit) -"bon" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/closed/wall/r_wall, +/area/engine/atmos/aftair) +"bon" = ( +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos/aftair) "boo" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -30829,32 +30463,24 @@ }, /area/hallway/primary/central) "bop" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/door/window/eastleft{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) -"boq" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/obj/structure/cable{ - icon_state = "2-8" +/turf/open/floor/plasteel, +/area/science/server/compcore) +"boq" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, /turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/science/server/compcore) "bor" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance, @@ -30869,11 +30495,31 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "bot" = ( -/obj/structure/disposalpipe/segment, +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/item/storage/box/disks_nanite, +/obj/item/book/manual/wiki/research_and_development{ + pixel_x = 4; + pixel_y = -8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/science/server/compcore) "bou" = ( /obj/effect/turf_decal/plaque{ icon_state = "L2" @@ -30881,60 +30527,41 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bov" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bow" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "QMUnload" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"box" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"boy" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 5 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) +/turf/open/floor/plating, +/area/engine/engineering) +"bow" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"box" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos/aftair) +"boy" = ( +/turf/closed/wall/r_wall, +/area/engine/atmos/aftair) "boz" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating, +/area/engine/atmos/aftair) "boA" = ( /turf/closed/wall, /area/security/detectives_office) "boB" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "QMUnload" +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/plating, -/area/quartermaster/storage) +/area/engine/engineering) "boC" = ( /obj/machinery/light/small{ dir = 4 @@ -30950,46 +30577,40 @@ /turf/open/floor/plating, /area/quartermaster/warehouse) "boD" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "QMUnload" - }, -/obj/machinery/door/poddoor{ - id = "QMUnloadDoor"; - name = "Cargo Unloading Door" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"boE" = ( -/obj/structure/plasticflaps, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "QMUnload" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"boF" = ( -/obj/effect/turf_decal/stripes/end{ +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/conveyor{ - dir = 8; - id = "QMUnload" +/turf/open/floor/plasteel, +/area/engine/engineering) +"boE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/door/poddoor{ - id = "QMUnloadDoor"; - name = "Cargo Unloading Door" +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" }, -/turf/open/floor/plating, -/area/quartermaster/storage) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"boF" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "boG" = ( /obj/machinery/space_heater, /obj/effect/turf_decal/tile/blue{ @@ -31032,8 +30653,11 @@ /turf/open/floor/plating, /area/quartermaster/miningoffice) "boL" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, /area/science/mixing) "boM" = ( /obj/machinery/mineral/ore_redemption{ @@ -31169,28 +30793,24 @@ }, /area/crew_quarters/lounge/jazz) "bpa" = ( -/obj/effect/turf_decal/tile/red{ +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/door/window/westleft{ - name = "Treatment Center"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plating, +/area/engine/engineering) "bpb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "bpc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm{ @@ -31213,48 +30833,66 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bpe" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/structure/disposalpipe/junction{ dir = 4 }, -/obj/machinery/door/window/eastright{ - name = "Operating Theatre"; - req_access_txt = "45" +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plating, +/area/engine/engineering) "bpf" = ( /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bpg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 9 }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/camera{ + c_tag = "Engine Room - Starboard Quarter"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/engineering) "bph" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ dir = 1 }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/multitool{ + pixel_y = 4 + }, +/obj/item/book/manual/wiki/robotics_cyborgs, /turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/science/server/compcore) "bpi" = ( -/obj/structure/flora/junglebush/b, -/turf/open/floor/grass, -/area/hallway/secondary/exit) +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/turf/open/floor/plating, +/area/engine/atmos/aftair) "bpj" = ( -/obj/structure/flora/junglebush, -/turf/open/floor/grass, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/camera{ + c_tag = "Aft Maintenance - Air Hookup" + }, +/turf/open/floor/plating, +/area/engine/atmos/aftair) "bpk" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -31464,33 +31102,40 @@ }, /area/crew_quarters/lounge/jazz) "bpK" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) -"bpL" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/closed/wall/r_wall, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/server/compcore) +"bpL" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bpM" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/science/mixing) "bpN" = ( -/obj/structure/grille, -/obj/machinery/power/terminal, -/obj/structure/cable/yellow{ - icon_state = "0-4" +/obj/effect/turf_decal/tile/green{ + dir = 8 }, -/turf/open/floor/plating, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bpO" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -31523,31 +31168,22 @@ /turf/open/floor/carpet/red, /area/security/brig) "bpT" = ( -/obj/structure/window/reinforced/spawner, -/turf/open/floor/grass, -/area/hallway/secondary/exit) -"bpU" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) -"bpV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/atmos{ - name = "Aft Air Hookup"; - req_access_txt = "12;24" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, +/obj/machinery/atmospherics/components/binary/valve/digital/on, /turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/area/engine/atmos/aftair) +"bpU" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/engine/atmos/aftair) +"bpV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bpW" = ( /obj/structure/cable{ icon_state = "1-2" @@ -31693,16 +31329,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bqp" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/turf/closed/wall/r_wall, +/area/engine/atmos/aftair) "bqq" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/stripes/line, @@ -31730,22 +31361,15 @@ /turf/open/floor/plating, /area/maintenance/aft) "bqt" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/healthanalyzer, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bqu" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -31908,33 +31532,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bqL" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 }, -/obj/machinery/light_switch{ - pixel_x = -24 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/turf/open/floor/plating, +/area/engine/atmos/aftair) "bqM" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 }, -/obj/item/storage/box/dice, -/obj/item/toy/cards/deck, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/turf/open/floor/plating, +/area/engine/atmos/aftair) "bqN" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/yellow{ @@ -31944,21 +31552,28 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bqO" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) -"bqP" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ dir = 1 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/storage/box/disks, +/turf/open/floor/plasteel, +/area/science/server/compcore) +"bqP" = ( +/obj/machinery/camera{ + c_tag = "Engine Room - Port Quarter"; + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/engine/engineering) "bqQ" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -31969,27 +31584,12 @@ /turf/open/floor/plasteel/dark/corner, /area/hallway/secondary/entry) "bqR" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/engine/engineering) "bqS" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plating, +/area/engine/engineering) "bqT" = ( /obj/machinery/computer/crew, /obj/effect/turf_decal/tile/blue{ @@ -32000,16 +31600,12 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "bqU" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/engine/atmos/aftair) "bqV" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -32075,11 +31671,11 @@ /turf/open/floor/plasteel, /area/maintenance/disposal) "brb" = ( -/obj/structure/window/reinforced/spawner, -/turf/open/floor/plasteel/dark, -/area/science/server{ - name = "Computer Core" - }) +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/engineering) "brc" = ( /obj/structure/cable{ icon_state = "1-2" @@ -32245,31 +31841,27 @@ /turf/open/floor/plating, /area/chapel/office) "bru" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "hot loop to space" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plating, +/area/engine/engineering) "brv" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light{ - dir = 1 +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/machinery/power/apc{ + areastring = "/area/engine/atmos/airaft"; + dir = 8; + name = "Aft Air Hookup APC"; + pixel_x = -24 }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/turf/open/floor/plating, +/area/engine/atmos/aftair) "brw" = ( /obj/structure/cable{ icon_state = "4-8" @@ -32296,26 +31888,12 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "brz" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/obj/machinery/power/apc{ - areastring = "/area/science/research"; - name = "Research Sector APC"; - pixel_y = -24 - }, -/obj/structure/cable, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engineering) "brA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32453,26 +32031,21 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "brN" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/turf/open/floor/plating, +/area/engine/atmos/aftair) "brO" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/effect/landmark/start/medical_doctor, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "brP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32717,10 +32290,6 @@ dir = 8; light_color = "#e8eaff" }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, /turf/open/floor/plasteel, /area/hydroponics) "bsl" = ( @@ -32835,9 +32404,12 @@ /turf/open/floor/plasteel/stairs/left, /area/hydroponics) "bsx" = ( -/obj/structure/lattice, -/turf/closed/wall/r_wall, -/area/crew_quarters/fitness/cogpool) +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "bsy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -33037,11 +32609,25 @@ }, /area/chapel/office) "bsX" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/engine, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "bsY" = ( /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, @@ -33124,13 +32710,13 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "btk" = ( -/obj/structure/sign/poster/official/nanomichi_ad{ - pixel_x = 32 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "cold loop to space" }, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/turf/open/floor/plating, +/area/engine/engineering) "btl" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -33326,28 +32912,15 @@ /turf/closed/wall/r_wall, /area/hallway/secondary/civilian) "btK" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Aft Maintenance"; - req_access_txt = "12" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, +/obj/machinery/light/small, +/obj/machinery/space_heater, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plating, -/area/hallway/secondary/exit) +/area/engine/atmos/aftair) "btL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/engine/atmos/aftair) "btM" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -33375,15 +32948,10 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "btO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/plating, +/area/engine/atmos/aftair) "btP" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plating, @@ -33506,8 +33074,8 @@ /turf/closed/wall, /area/maintenance/disposal) "bui" = ( -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit/departure_lounge) "buj" = ( /obj/structure/closet/crate, /turf/open/floor/plating, @@ -33544,11 +33112,9 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai) "buo" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) "bup" = ( /obj/structure/cable{ icon_state = "0-4" @@ -33867,19 +33433,9 @@ /turf/closed/wall, /area/janitor) "bvb" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/engineering{ - name = "Electrical Substation"; - req_access_txt = "10" - }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/obj/structure/sign/departments/evac, +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit/departure_lounge) "bvc" = ( /obj/machinery/computer/cargo/request, /obj/machinery/airalarm{ @@ -34044,16 +33600,24 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/item/kirbyplants{ + icon_state = "plant-20"; + pixel_y = 3 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "bvu" = ( /turf/closed/wall/r_wall, /area/chapel/office) "bvv" = ( -/turf/closed/wall/r_wall/rust, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/engine/engineering) "bvw" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /turf/closed/wall/r_wall, @@ -34233,7 +33797,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "bvU" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/biohazard{ pixel_x = -32 @@ -34277,18 +33841,9 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "bvY" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/engine/engineering) "bvZ" = ( /obj/item/folder, /obj/structure/table/wood/fancy, @@ -34623,17 +34178,15 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bwJ" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/engine/engineering"; + dir = 4; + name = "Engine Room APC"; + pixel_x = 24 }, /turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/engine/engineering) "bwK" = ( /obj/machinery/camera{ c_tag = "Research - Gateway Chamber"; @@ -35340,21 +34893,15 @@ /turf/open/floor/carpet/green, /area/crew_quarters/heads/hop) "bye" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/computer/rdservercontrol{ dir = 1 }, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/light{ dir = 8 }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/photocopier, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/science/server/compcore) "byf" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Telecommunications Mainframe"; @@ -35838,14 +35385,14 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bzq" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/sign/warning/pods{ - pixel_x = -32 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departures" }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bzr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 10 @@ -36046,10 +35593,9 @@ /turf/open/floor/plating, /area/router) "bzN" = ( -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/server/compcore) "bzO" = ( /obj/machinery/conveyor_switch/oneway{ id = "recycler"; @@ -36073,11 +35619,12 @@ /turf/open/floor/plasteel, /area/maintenance/department/chapel) "bzR" = ( -/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/server/compcore) "bzS" = ( /obj/structure/table, /obj/machinery/light/small{ @@ -36123,7 +35670,9 @@ name = "Toxins Launch Room"; req_access_txt = "7;8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/science/mixing) "bzY" = ( @@ -36257,7 +35806,6 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/science/mixing) "bAm" = ( @@ -36390,18 +35938,13 @@ /area/maintenance/disposal) "bAy" = ( /obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" + dir = 1 }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/machinery/holopad, /turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/science/server/compcore) "bAz" = ( /obj/structure/disposalpipe/junction/flip{ dir = 1 @@ -36503,19 +36046,17 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/science/mixing) "bAH" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/computer/nanite_cloud_controller, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/science/server/compcore) "bAI" = ( /obj/machinery/photocopier, /obj/machinery/requests_console{ @@ -36560,14 +36101,9 @@ /turf/open/space/basic, /area/space) "bAM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) "bAN" = ( /obj/structure/rack, /obj/item/clothing/suit/space/fragile, @@ -36599,6 +36135,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "bAQ" = ( @@ -36607,47 +36146,46 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bAR" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Thermo-Electric Generator Room"; - req_access_txt = "10" +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/closed/wall/r_wall, +/area/engine/engineering) "bAS" = ( /turf/closed/wall/r_wall/rust, /area/maintenance/disposal) "bAT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering) "bAU" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "bAV" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/mixing) "bAW" = ( -/obj/structure/sign/poster/official/get_your_legs, -/turf/closed/wall, -/area/hallway/secondary/exit) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departures" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "bAX" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -36666,9 +36204,14 @@ }, /area/crew_quarters/heads/captain) "bAY" = ( -/obj/machinery/status_display, -/turf/closed/wall, -/area/hallway/secondary/exit) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departures" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "bAZ" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 1 @@ -36677,9 +36220,9 @@ /turf/open/floor/carpet, /area/chapel/main) "bBa" = ( -/obj/structure/sign/poster/official/help_others, -/turf/closed/wall, -/area/hallway/secondary/exit) +/obj/machinery/status_display, +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit/departure_lounge) "bBb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -36692,16 +36235,9 @@ }, /area/maintenance/department/chapel) "bBc" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/turf/closed/wall/r_wall, +/area/engine/atmos/aftair) "bBd" = ( /obj/structure/table, /obj/item/reagent_containers/food/snacks/popcorn, @@ -36711,15 +36247,16 @@ /turf/open/floor/wood, /area/crew_quarters/fitness) "bBe" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/atmos{ + name = "Aft Air Hookup"; + req_access_txt = "12;24" }, -/obj/structure/sign/warning/pods{ - pixel_x = 32 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/open/floor/plating, +/area/engine/atmos/aftair) "bBf" = ( /obj/structure/cable{ icon_state = "1-4" @@ -36782,41 +36319,27 @@ /turf/open/floor/plating, /area/hallway/primary/aft) "bBm" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/hallway/secondary/exit) +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall/r_wall, +/area/engine/atmos/aftair) "bBn" = ( -/obj/effect/turf_decal/tile/red{ +/obj/machinery/door/airlock/engineering/glass{ + name = "Thermo-Electric Generator Room"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) -"bBo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/door/airlock/engineering/glass{ - name = "Thermo-Electric Generator"; - req_one_access_txt = "10;24" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/area/engine/engineering) +"bBo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) "bBp" = ( /obj/machinery/conveyor/inverted{ dir = 9; @@ -36867,15 +36390,9 @@ /turf/closed/wall, /area/router) "bBw" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/hallway/secondary/exit) +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/grass, +/area/hallway/secondary/exit/departure_lounge) "bBx" = ( /obj/structure/table, /obj/item/storage/toolbox/electrical, @@ -36956,18 +36473,12 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bBE" = ( -/obj/structure/grille, -/obj/machinery/power/terminal, -/obj/structure/cable/yellow{ - icon_state = "0-8" +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering) "bBF" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -37017,11 +36528,11 @@ /turf/open/floor/plating, /area/quartermaster/warehouse) "bBM" = ( -/obj/effect/turf_decal/tile/red{ +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/open/floor/grass, +/area/hallway/secondary/exit/departure_lounge) "bBN" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ dir = 1 @@ -37029,10 +36540,11 @@ /turf/open/floor/engine, /area/science/mixing) "bBO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 9 + }, /turf/closed/wall/r_wall, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/engine/engineering) "bBP" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -37054,31 +36566,14 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/medbay/central) "bBR" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 1; - name = "Computer Core APC"; - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/engine/engineering) "bBS" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1; - light_color = "#e8eaff" - }, +/obj/effect/turf_decal/delivery, +/obj/machinery/rnd/server, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/server/compcore) "bBT" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -37141,29 +36636,25 @@ /turf/open/floor/plasteel, /area/router/eva) "bBZ" = ( -/turf/closed/wall, -/area/hallway/secondary/exit) +/obj/structure/flora/ausbushes/leafybush, +/turf/open/floor/grass, +/area/hallway/secondary/exit/departure_lounge) "bCa" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) -"bCb" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/machinery/light{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/door/poddoor{ + id = "RDServer"; + name = "RD Server Lockup" + }, +/turf/open/floor/plasteel, +/area/science/server/compcore) +"bCb" = ( +/turf/open/floor/circuit/green, +/area/science/server/compcore) "bCc" = ( /obj/effect/turf_decal/delivery, /obj/structure/cable{ @@ -37373,11 +36864,12 @@ /turf/open/floor/plasteel, /area/storage/primary) "bCA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/green{ dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bCB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposaloutlet, @@ -37532,18 +37024,9 @@ /turf/open/floor/plating/airless, /area/maintenance/disposal) "bCW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/machinery/door/airlock/engineering/glass{ - name = "Thermo-Electric Generator"; - req_one_access_txt = "10;24" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/plasteel, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/disposalpipe/segment, +/turf/open/floor/circuit/green, +/area/science/server/compcore) "bCX" = ( /obj/machinery/rnd/production/circuit_imprinter/department/science, /obj/item/reagent_containers/glass/beaker/sulphuric, @@ -37900,10 +37383,11 @@ /turf/open/floor/plating, /area/hallway/secondary/service) "bDL" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 + dir = 10 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/mixing) "bDM" = ( /obj/structure/table/reinforced, @@ -38184,24 +37668,11 @@ /turf/open/floor/plasteel, /area/security/checkpoint) "bEo" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/turf/closed/wall/r_wall, +/area/engine/engine_smes) "bEp" = ( /turf/closed/wall/r_wall, /area/maintenance/solars/starboard/fore) @@ -38223,20 +37694,13 @@ }, /area/crew_quarters/heads/captain) "bEr" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32; - pixel_y = 32 +/obj/structure/grille, +/obj/machinery/power/terminal, +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plating, +/area/engine/engine_smes) "bEs" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/tile/yellow{ @@ -38312,13 +37776,16 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) "bEz" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/assistant, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/structure/grille, +/obj/machinery/power/terminal, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/engine_smes) "bEA" = ( /obj/structure/cable{ icon_state = "1-2" @@ -38424,17 +37891,11 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "bEK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/machinery/space_heater{ - anchored = 1 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/closed/wall/r_wall, +/area/engine/engine_smes) "bEL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38534,11 +37995,25 @@ /turf/open/floor/carpet/green, /area/crew_quarters/bar) "bES" = ( +/obj/machinery/door/airlock/engineering{ + name = "Hot Loop"; + req_one_access_txt = "10;24" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "bET" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/wood, @@ -38668,19 +38143,14 @@ /turf/open/floor/plasteel, /area/ai_monitored/turret_protected/ai) "bFg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/suit_storage_unit/engine, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/closed/wall/r_wall, +/area/engine/engine_smes) "bFh" = ( /obj/effect/turf_decal/tile/brown, /obj/machinery/light, @@ -38729,12 +38199,7 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bFp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/science/mixing) "bFq" = ( @@ -39330,15 +38795,9 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "bGv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Arcade" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/item/clothing/suit/caution, +/turf/open/floor/plasteel, +/area/science/server/compcore) "bGw" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -39451,6 +38910,18 @@ /obj/item/clothing/gloves/color/grey, /turf/open/floor/plating, /area/maintenance/starboard/central) +"bGK" = ( +/obj/structure/table, +/obj/machinery/button/door{ + id = "RDServer"; + layer = 3.6; + name = "RD Server Lockup Control"; + pixel_x = -24 + }, +/obj/item/circuitboard/machine/rdserver, +/obj/item/disk/tech_disk, +/turf/open/floor/circuit/green, +/area/science/server/compcore) "bGL" = ( /obj/structure/chair{ dir = 1 @@ -39465,10 +38936,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/kirbyplants{ - icon_state = "plant-20"; - pixel_y = 3 - }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/crew_quarters/locker) "bGN" = ( @@ -39492,6 +38960,14 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) +"bGP" = ( +/obj/machinery/computer/robotics{ + dir = 1 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment, +/turf/open/floor/circuit/green, +/area/science/server/compcore) "bGQ" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -39748,11 +39224,14 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "bHt" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bHu" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, @@ -40056,20 +39535,15 @@ /area/medical/chemistry) "bIg" = ( /obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/item/circuitboard/machine/cyborgrecharger, +/obj/item/disk/design_disk, +/obj/machinery/camera/motion{ + c_tag = "Computer Core"; + dir = 1; + network = list("minisat") }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/item/reagent_containers/food/snacks/chips, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/circuit/green, +/area/science/server/compcore) "bIh" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery/white, @@ -40122,26 +39596,12 @@ /turf/open/space/basic, /area/space/nearstation) "bIn" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/power/smes/engineering, +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1; - light_color = "#cee5d2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plating, +/area/engine/engine_smes) "bIo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/evac{ @@ -40361,27 +39821,31 @@ /turf/open/floor/plasteel, /area/medical/chemistry) "bIN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-2" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/obj/machinery/power/apc{ + areastring = "/area/engine/engine_smes"; + dir = 1; + name = "Power Monitoring APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"bIO" = ( +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bIO" = ( -/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engine_smes) "bIP" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -40394,41 +39858,35 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bIQ" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/item/multitool, +/obj/item/multitool{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/t_scanner{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/t_scanner{ + pixel_x = -4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engine_smes) "bIR" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/machinery/computer/monitor, +/obj/machinery/airalarm{ + pixel_y = 24 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable/yellow, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engine_smes) "bIS" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/modular_computer/console/preset/engineering, +/obj/structure/cable/yellow, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engine_smes) "bIT" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supplymain/visible{ @@ -40570,25 +40028,10 @@ /turf/open/floor/plasteel, /area/medical/chemistry) "bJg" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/item/storage/box/rxglasses{ - pixel_x = 2 - }, -/obj/item/pen, -/obj/structure/window/reinforced/spawner/west, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/electricshock, +/turf/open/floor/plating, +/area/engine/engine_smes) "bJh" = ( /obj/structure/sign/warning/biohazard, /obj/structure/disposalpipe/segment{ @@ -40636,26 +40079,15 @@ /turf/open/floor/plasteel/dark, /area/lawoffice) "bJn" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/mask/muzzle, -/obj/item/clothing/mask/muzzle, -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/closed/wall/r_wall, +/area/science/server/compcore) "bJo" = ( -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "bJp" = ( /obj/structure/cable{ icon_state = "1-2" @@ -40663,14 +40095,12 @@ /turf/open/floor/plating, /area/maintenance/aft) "bJq" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/effect/turf_decal/tile/green{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bJr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ dir = 1 @@ -40715,9 +40145,6 @@ /area/space/nearstation) "bJw" = ( /obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/science/mixing) "bJx" = ( @@ -40812,29 +40239,19 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "bJF" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1; - light_color = "#cee5d2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-2" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plating, +/area/science/server/compcore) "bJG" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -32 @@ -40908,11 +40325,14 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "bJR" = ( -/obj/effect/turf_decal/tile/red{ +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bJS" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -40926,9 +40346,7 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bJT" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 10 - }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/white, /area/science/mixing) "bJU" = ( @@ -41168,82 +40586,38 @@ /turf/open/floor/plasteel, /area/router) "bKs" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/closed/wall/r_wall, +/area/science/server/compcore) "bKt" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1; - light_color = "#cee5d2" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 +/turf/closed/wall/r_wall, +/area/engine/engine_smes) +"bKu" = ( +/obj/structure/cable{ + icon_state = "1-4" }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/turf/open/floor/plating, +/area/engine/engine_smes) +"bKv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bKu" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 4 - }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bKv" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engine_smes) "bKw" = ( /obj/structure/window/reinforced/spawner/west, /obj/structure/sign/poster/official/nanotrasen_logo{ @@ -41622,7 +40996,7 @@ dir = 1; pixel_y = -26 }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/item/shovel, /obj/item/stack/tile/plasteel{ pixel_x = 10; @@ -41811,24 +41185,21 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bLG" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/camera{ - c_tag = "Research Aft"; - dir = 1 +/obj/structure/cable{ + icon_state = "1-8" }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 + dir = 5 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engine_smes) "bLH" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -41941,20 +41312,17 @@ /turf/open/floor/plating, /area/quartermaster/warehouse) "bLU" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engine_smes) "bLV" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 5 @@ -42627,6 +41995,19 @@ }, /turf/open/floor/plating, /area/router) +"bNo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "bNp" = ( /obj/machinery/light{ dir = 1 @@ -42793,32 +42174,17 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "bNH" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) +/obj/structure/flora/junglebush/b, +/turf/open/floor/grass, +/area/hallway/secondary/exit/departure_lounge) "bNI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/departments/evac, -/turf/open/floor/plating, -/area/hallway/secondary/exit) +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/hallway/secondary/exit/departure_lounge) "bNJ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/hallway/secondary/exit) +/obj/structure/window/reinforced/spawner, +/turf/open/floor/grass, +/area/hallway/secondary/exit/departure_lounge) "bNK" = ( /obj/machinery/power/solar{ id = "aftstarboard"; @@ -42864,19 +42230,19 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "bNQ" = ( -/obj/effect/turf_decal/tile/red{ +/obj/structure/window/reinforced/spawner, +/obj/item/storage/backpack/snail, +/turf/open/floor/grass, +/area/hallway/secondary/exit/departure_lounge) +"bNR" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ dir = 4 }, /turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) -"bNR" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bNS" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -42910,33 +42276,75 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bNW" = ( -/turf/open/floor/plasteel/stairs/left, -/area/hallway/secondary/exit) -"bNX" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" - }, -/turf/open/floor/plasteel/stairs/right, -/area/hallway/secondary/exit) -"bNY" = ( -/obj/machinery/light{ +/obj/structure/chair{ dir = 8 }, -/turf/open/floor/plasteel/stairs/left, -/area/hallway/secondary/exit) +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) +"bNX" = ( +/obj/structure/window/reinforced/spawner, +/mob/living/simple_animal/kiwi, +/turf/open/floor/grass, +/area/hallway/secondary/exit/departure_lounge) +"bNY" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bNZ" = ( -/turf/open/floor/plasteel/stairs/right, -/area/hallway/secondary/exit) +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/storage/dice, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bOa" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bOb" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, -/area/hallway/secondary/exit) +/obj/machinery/disposal/bin, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bOc" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -42955,12 +42363,16 @@ /turf/open/space/basic, /area/solar/starboard/aft) "bOe" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/external/glass{ - name = "Departures Shuttle Dock" +/obj/effect/turf_decal/tile/green{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bOf" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -42969,32 +42381,46 @@ /turf/open/space/basic, /area/solar/starboard/aft) "bOg" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ dir = 1 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bOh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"bOi" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) +"bOi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "bOj" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/obj/machinery/light{ - dir = 8 +/turf/open/floor/plasteel/white/corner{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bOk" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -43003,17 +42429,34 @@ /turf/open/space/basic, /area/solar/starboard/aft) "bOl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/machinery/computer/arcade, +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bOm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/structure/chair{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bOn" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ @@ -43026,10 +42469,18 @@ /turf/open/floor/plating, /area/crew_quarters/toilet/restrooms) "bOo" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/docking, -/turf/open/floor/plating, -/area/hallway/secondary/exit) +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/paicard, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit/departure_lounge) "bOp" = ( /obj/structure/cable{ icon_state = "2-8" @@ -43119,13 +42570,25 @@ /turf/open/space/basic, /area/space/nearstation) "bOx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Power Monitoring"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/turf/closed/wall/r_wall, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel, +/area/engine/engine_smes) "bOy" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -43143,15 +42606,14 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bOz" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, +/obj/structure/grille, /obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/science/server/compcore) "bOA" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -43200,9 +42662,6 @@ light_color = "#e8eaff" }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, /turf/open/floor/plasteel, /area/science/mixing) "bOF" = ( @@ -43384,18 +42843,23 @@ /area/science/xenobiology) "bOY" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/stack/packageWrap, -/obj/item/hand_labeler, -/obj/machinery/camera{ - c_tag = "Customs - Aft"; - dir = 4 +/obj/item/clipboard, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/stamp, +/obj/machinery/door/window/southright{ + name = "Customs Desk"; + req_access_txt = "57" }, -/obj/structure/window/reinforced/spawner, /obj/machinery/door/poddoor/shutters/preopen{ id = "HoPAft"; name = "HoP Aft Desk Shutters" }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, /turf/open/floor/plasteel/dark, /area/security/checkpoint/customs) "bOZ" = ( @@ -43467,24 +42931,8 @@ /turf/open/floor/engine, /area/science/xenobiology) "bPl" = ( -/obj/structure/chair/sofa/right, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/item/book/manual/wiki/research_and_development, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/closed/wall/r_wall, +/area/engine/engine_smes) "bPm" = ( /obj/structure/cable{ icon_state = "4-8" @@ -43563,24 +43011,9 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bPv" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/multitool, -/obj/item/multitool{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/t_scanner{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/t_scanner{ - pixel_x = -4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/engine/engine_smes) "bPw" = ( /obj/structure/cable{ icon_state = "4-8" @@ -43641,75 +43074,73 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bPD" = ( -/obj/structure/table/glass, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/camera{ - c_tag = "Escape Hall - Fore"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"bPE" = ( -/obj/structure/table/glass, -/obj/item/clipboard, -/obj/item/storage/crayons, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"bPF" = ( -/obj/structure/table/glass, -/obj/item/storage/fancy/cigarettes, -/obj/item/lighter{ - pixel_x = 6 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"bPG" = ( /obj/structure/chair{ dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/cafeteria, +/area/hallway/secondary/exit/departure_lounge) +"bPE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Aft Maintenance"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"bPF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) +"bPG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "bPH" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/machinery/holopad, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bPI" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bPJ" = ( /obj/machinery/atmospherics/pipe/manifold/orange/visible{ dir = 1 @@ -43757,18 +43188,19 @@ /turf/open/floor/plating, /area/maintenance/aft) "bPO" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Quarter Maintenance"; + req_one_access_txt = "12;48" }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white/corner{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) "bPP" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -43807,13 +43239,19 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/morgue) "bPT" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Aft Maintenance"; + req_access_txt = "12" + }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, -/area/hallway/secondary/exit) +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) "bPU" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -43880,9 +43318,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/machinery/camera/motion{ c_tag = "AI Foyer"; network = list("minisat"); @@ -43900,7 +43335,7 @@ dir = 6 }, /turf/open/floor/plasteel, -/area/ai_monitored/turret_protected/ai) +/area/ai_monitored/turret_protected/ai_upload_foyer) "bQc" = ( /obj/structure/bodycontainer/morgue{ dir = 8 @@ -43915,10 +43350,13 @@ /area/medical/morgue) "bQd" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bQe" = ( /obj/structure/lattice, /obj/structure/grille/broken, @@ -43960,9 +43398,6 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, /turf/open/floor/plasteel, /area/ai_monitored/turret_protected/ai_upload_foyer) @@ -43985,44 +43420,30 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bQl" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/power/port_gen/pacman, +/obj/machinery/light, +/obj/machinery/light_switch{ + pixel_y = -24 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/west, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/turf/open/floor/plating, +/area/engine/engine_smes) "bQm" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) -"bQn" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/camera{ + c_tag = "Engineering - Power Monitoring"; dir = 1 }, -/obj/structure/window/reinforced/spawner/west, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"bQn" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "bQo" = ( /obj/structure/disposalpipe/junction/yjunction, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -44057,16 +43478,25 @@ /area/engine/break_room) "bQr" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bQs" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "bQt" = ( /obj/machinery/conveyor/auto{ dir = 5; @@ -44085,21 +43515,8 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bQv" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 24 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/engine/engine_smes) "bQw" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44119,35 +43536,13 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bQy" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "bQz" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "bQA" = ( /obj/item/radio/intercom{ name = "Station Intercom (Common)"; @@ -44160,35 +43555,12 @@ /turf/open/floor/plasteel/dark, /area/lawoffice) "bQB" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/item/weldingtool, -/obj/item/wrench/medical, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/closed/wall, +/area/engine/engine_smes) "bQC" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/west, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/sign/warning/electricshock, +/turf/closed/wall, +/area/engine/engine_smes) "bQD" = ( /obj/machinery/power/apc{ name = "Tech Storage APC"; @@ -44250,29 +43622,18 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bQJ" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Workshop"; + req_access_txt = "11" }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/power/apc{ - name = "Medbay Treatment Center APC"; - pixel_y = -24 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "bQK" = ( /obj/structure/chair/office/dark{ dir = 4 @@ -44320,17 +43681,12 @@ /turf/open/space/basic, /area/space/nearstation) "bQP" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 9 - }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/quartermaster/storage) "bQQ" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -44412,9 +43768,7 @@ /turf/open/floor/plating, /area/router) "bQX" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 - }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, /turf/open/floor/plasteel/white, /area/science/mixing) "bQY" = ( @@ -44428,23 +43782,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bQZ" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/landmark/start/scientist, -/obj/machinery/airalarm{ - pixel_y = 24 - }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/quartermaster/storage) "bRa" = ( /obj/item/cigbutt, /obj/structure/cable{ @@ -44475,22 +43818,11 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "bRd" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/engine/storage"; - dir = 4; - name = "Canister Storage APC"; - pixel_x = 24 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/engine/secure_construction) "bRe" = ( /obj/machinery/computer/security/wooden_tv, /obj/effect/turf_decal/bot, @@ -44664,18 +43996,14 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bRx" = ( -/obj/structure/table, -/obj/item/circuitboard/machine/cyborgrecharger, -/obj/item/disk/design_disk, -/obj/machinery/camera/motion{ - c_tag = "Computer Core"; - dir = 1; - network = list("minisat") +/obj/effect/turf_decal/loading_area{ + dir = 8 }, -/turf/open/floor/circuit/green, -/area/science/server{ - name = "Computer Core" - }) +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "bRy" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -44695,14 +44023,13 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bRA" = ( -/obj/machinery/light{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/engine, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "bRB" = ( /obj/item/radio/intercom{ name = "Station Intercom (Common)"; @@ -44823,35 +44150,39 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bRM" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/stairs/left, -/area/science/research{ - name = "Research Sector" - }) -"bRN" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/stairs/medium, -/area/science/research{ - name = "Research Sector" - }) -"bRO" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/conveyor/inverted{ + dir = 6; + icon_state = "conveyor_map_inverted"; + id = "cargounload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bRN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "cargounload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bRO" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "cargounload" + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/quartermaster/storage) "bRP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -44873,36 +44204,33 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "bRR" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/machinery/conveyor{ + dir = 9; + id = "cargounload" }, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plating, +/area/quartermaster/storage) "bRS" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/poddoor{ + id = "QMUnloadDoor"; + name = "Cargo Unloading Door" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/machinery/conveyor{ + dir = 8; + id = "cargounload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) "bRT" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -44936,9 +44264,6 @@ /area/science/robotics/lab) "bRW" = ( /obj/effect/turf_decal/bot, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/machinery/status_display/ai{ pixel_y = 32 }, @@ -45066,9 +44391,6 @@ /area/science/xenobiology) "bSk" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, @@ -45088,56 +44410,73 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bSm" = ( -/obj/machinery/modular_computer/console/preset/engineering, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) -"bSn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electricshock, -/turf/open/floor/plating, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) -"bSo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) -"bSp" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) -"bSq" = ( +/obj/structure/plasticflaps, /obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 8; + id = "cargounload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bSn" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/door/poddoor{ + id = "QMUnloadDoor"; + name = "Cargo Unloading Door" + }, +/obj/machinery/conveyor{ + dir = 8; + id = "cargounload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bSo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/science/server/compcore) +"bSp" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "cargoload" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bSq" = ( +/obj/machinery/computer/cargo{ dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/bot, +/obj/machinery/camera{ + c_tag = "Supply - Cargo Bay"; + dir = 8; + pixel_y = -22 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/button/door{ + id = "QMLoadDoor"; + layer = 4; + name = "Cargo Loading Doors"; + pixel_x = 24; + pixel_y = -6 + }, +/obj/machinery/button/door{ + id = "QMUnloadDoor"; + layer = 4; + name = "Cargo Unloading Doors"; + pixel_x = 24; + pixel_y = 6 }, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/quartermaster/storage) "bSr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 @@ -45145,18 +44484,12 @@ /turf/open/floor/mineral/titanium/blue, /area/ai_monitored/turret_protected/ai_upload_foyer) "bSs" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, /area/ai_monitored/turret_protected/ai_upload_foyer) "bSt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/light{ dir = 1 }, @@ -45174,24 +44507,24 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/service) "bSv" = ( -/obj/machinery/recharge_station, -/turf/open/floor/plating, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) -"bSw" = ( -/obj/machinery/power/port_gen/pacman, -/obj/machinery/light, -/obj/machinery/light_switch{ - pixel_y = -24 +/obj/effect/turf_decal/delivery, +/obj/structure/noticeboard/rd{ + pixel_y = 28 }, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/turf/open/floor/plating, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) +"bSw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research) "bSx" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible, /turf/open/floor/plasteel, @@ -45358,9 +44691,6 @@ /area/science/lab) "bSO" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, @@ -45881,9 +45211,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/status_display/ai{ pixel_y = 32 }, @@ -45981,9 +45308,6 @@ /obj/machinery/light_switch{ pixel_y = 24 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 }, @@ -46112,9 +45436,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bUx" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "bUy" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -46143,22 +45475,21 @@ /turf/open/floor/plating, /area/maintenance/solars/port) "bUB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/chair{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/machinery/power/apc{ - areastring = "/area/engine/engine_smes"; - dir = 1; - name = "Power Monitoring APC"; +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/airalarm{ pixel_y = 24 }, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/science/research) "bUC" = ( /obj/structure/cable{ icon_state = "1-2" @@ -46395,13 +45726,14 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bUX" = ( -/obj/structure/transit_tube/station/reverse/flipped{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "bUY" = ( /obj/structure/cable{ icon_state = "1-2" @@ -46432,15 +45764,15 @@ /turf/open/floor/plasteel, /area/router) "bVb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/area/engine/secure_construction) "bVc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -46475,17 +45807,19 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bVf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/machinery/camera{ - c_tag = "Engineering - Power Monitoring"; +/obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/item/reagent_containers/food/snacks/chips, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/science/research) "bVg" = ( /obj/machinery/power/emitter, /obj/effect/turf_decal/tile/blue{ @@ -46746,9 +46080,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bVF" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -46802,17 +46133,24 @@ /turf/open/floor/plating, /area/maintenance/starboard/central) "bVL" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/noticeboard/rd{ - pixel_y = 28 - }, -/obj/machinery/light{ +/obj/structure/chair{ dir = 8 }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bVM" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -46820,10 +46158,12 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bVN" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -46874,9 +46214,7 @@ pixel_y = 32 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bVS" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -46889,9 +46227,7 @@ light_color = "#cee5d2" }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bVT" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -46904,9 +46240,7 @@ pixel_y = 24 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bVU" = ( /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -46956,26 +46290,17 @@ /area/engine/atmos) "bVY" = ( /obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/item/flashlight/lamp, +/obj/structure/window/reinforced/spawner, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPAft"; + name = "HoP Aft Desk Shutters" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southright{ - name = "Primary Tool Storage Desk"; - req_access_txt = "11" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/storage/primary) +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) "bVZ" = ( /obj/machinery/power/apc{ name = "Cargo Bay APC"; @@ -46986,16 +46311,16 @@ /area/quartermaster/storage) "bWa" = ( /turf/closed/wall/r_wall, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWb" = ( /obj/structure/closet/l3closet/scientist, /obj/effect/turf_decal/stripes/line, +/obj/machinery/camera{ + c_tag = "Research Entrance"; + network = list("ss13","rd") + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWc" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/stripes/line, @@ -47004,9 +46329,7 @@ light_color = "#cee5d2" }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWd" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/structure/sign/poster/official/wtf_is_co2{ @@ -47106,9 +46429,6 @@ /area/science/mixing) "bWm" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/door/airlock/engineering{ name = "AI SMES Access"; req_one_access_txt = "10;24" @@ -47129,26 +46449,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bWo" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWp" = ( /obj/machinery/atmospherics/miner/n2o, /obj/machinery/portable_atmospherics/canister/nitrous_oxide, @@ -47163,21 +46467,55 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bWr" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera{ - c_tag = "Research Entrance"; - network = list("ss13","rd") +/obj/structure/table/reinforced, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/clipboard, +/obj/item/stamp, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/pen/red, +/obj/item/pen/blue{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/quartermaster/sorting) "bWs" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/door/window/southleft{ + name = "Cargo Desk"; + req_access_txt = "31" + }, +/obj/item/folder, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/quartermaster/sorting) "bWt" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -47192,9 +46530,6 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bWv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, @@ -47208,72 +46543,82 @@ /turf/open/floor/plating, /area/lawoffice) "bWx" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/structure/table/reinforced, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bWy" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bWz" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bWA" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/item/paper_bin, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/pen, +/obj/item/wirecutters, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/quartermaster/sorting) +"bWy" = ( +/obj/machinery/status_display/supply, +/turf/closed/wall/r_wall, +/area/quartermaster/storage) +"bWz" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/storage/toolbox/electrical, +/obj/item/hand_labeler, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bWA" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 1; + freq = 1400; + location = "Bridge" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "bWB" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 }, -/obj/item/extinguisher, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWC" = ( -/obj/machinery/shower{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 1 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWD" = ( /obj/effect/turf_decal/bot, /obj/machinery/navbeacon{ @@ -47343,17 +46688,18 @@ /turf/open/floor/plating, /area/engine/atmos) "bWL" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWM" = ( /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment{ @@ -47373,16 +46719,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bWN" = ( -/obj/structure/grille, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plating, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "bWO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47391,21 +46738,18 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bWP" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/door/airlock/command{ - name = "Computer Core"; - req_access_txt = "30" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/research) "bWQ" = ( /obj/structure/grille, /obj/structure/cable, @@ -47416,11 +46760,20 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "bWR" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/science/research{ - name = "Research Sector" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "bWS" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -47428,66 +46781,127 @@ /turf/closed/wall/r_wall, /area/science/mixing) "bWT" = ( -/obj/structure/chair/sofa/left, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ +/obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWU" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, +/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/structure/disposalpipe/trunk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWV" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bWW" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Research Sector"; + req_one_access_txt = "29;47" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) +"bWW" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) "bWX" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bWY" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall/r_wall, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "bWZ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -47495,25 +46909,35 @@ /turf/closed/wall, /area/hallway/primary/aft) "bXa" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/item/multitool{ - pixel_y = 4 +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Research Sector"; + req_one_access_txt = "29;47" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, -/obj/item/book/manual/wiki/robotics_cyborgs, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/research) "bXb" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -47577,13 +47001,16 @@ /turf/closed/wall/r_wall, /area/science/mixing) "bXh" = ( -/obj/structure/disposalpipe/segment{ +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/light/small, +/obj/effect/turf_decal/loading_area{ dir = 4 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/quartermaster/storage) "bXi" = ( /obj/structure/cable{ icon_state = "1-2" @@ -47602,29 +47029,26 @@ /turf/open/floor/plating, /area/maintenance/aft) "bXk" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ +/obj/effect/turf_decal/stripes/end{ dir = 8 }, -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/turf/open/floor/plating, +/area/quartermaster/storage) "bXl" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 4 +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) "bXm" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, @@ -47646,24 +47070,20 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bXo" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/poddoor{ + id = "QMLoadDoor"; + name = "Cargo Loading Door" }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plating, +/area/quartermaster/storage) "bXp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/disposal/deliveryChute{ @@ -47688,20 +47108,17 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "bXr" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/structure/plasticflaps, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" }, -/obj/machinery/camera{ - c_tag = "Research Fore"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plating, +/area/quartermaster/storage) "bXs" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -47748,37 +47165,32 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "bXx" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" + }, +/obj/machinery/door/poddoor{ + id = "QMLoadDoor"; + name = "Cargo Loading Door" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bXy" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -28 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bXy" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/light, -/obj/item/kirbyplants{ - icon_state = "plant-16" +/obj/machinery/camera{ + c_tag = "Research Fore"; + dir = 4 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bXz" = ( /obj/machinery/power/apc{ name = "Medbay Lobby APC"; @@ -47790,28 +47202,12 @@ /turf/open/floor/plating, /area/maintenance/aft) "bXA" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bXB" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/item/modular_computer/laptop/preset/civilian, +/obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bXC" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -47825,21 +47221,13 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "bXD" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) "bXE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -47892,32 +47280,17 @@ /turf/open/floor/plating, /area/crew_quarters/heads/captain) "bXJ" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, /obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bXK" = ( +/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/light, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/white/full, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bXL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -47955,21 +47328,15 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bXQ" = ( -/obj/structure/closet/l3closet/scientist, /obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bXR" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/atmospherics/miner/carbon_dioxide, @@ -47985,26 +47352,24 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bXT" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, +/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 8 +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bXU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/research{ - name = "Research Sector" - }) +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) "bXV" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -48038,33 +47403,23 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bXZ" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, /obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) +"bYa" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/item/paper_bin, -/obj/item/radio/headset/headset_sci, -/obj/item/radio/headset/headset_sci, +/obj/item/extinguisher, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"bYa" = ( -/obj/effect/turf_decal/tile/purple, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bYb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48078,14 +47433,14 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bYc" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/shower{ + dir = 1 }, -/turf/open/floor/plating, -/area/science/research{ - name = "Research Sector" - }) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research) "bYd" = ( /obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, /turf/open/floor/plasteel, @@ -48129,25 +47484,15 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bYi" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/recharger, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bYj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48161,12 +47506,9 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bYk" = ( -/obj/machinery/vending/wardrobe/science_wardrobe, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/science/research) "bYl" = ( /obj/structure/lattice, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -48207,23 +47549,11 @@ /turf/open/floor/circuit/green, /area/science/robotics/mechbay) "bYr" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/photocopier, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/closed/wall/r_wall, +/area/science/research) "bYs" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -48258,41 +47588,36 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bYu" = ( +/obj/structure/chair/sofa/right, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/item/book/manual/wiki/research_and_development, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bYv" = ( /turf/closed/wall, /area/science/robotics/mechbay) "bYw" = ( +/obj/structure/chair/sofa/left, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 10 - }, +/obj/effect/landmark/start/scientist, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bYx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48321,21 +47646,16 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "bYA" = ( +/obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ - dir = 8 + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/disposalpipe/trunk, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bYB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48379,20 +47699,15 @@ /turf/open/floor/circuit/green, /area/science/robotics/mechbay) "bYG" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/structure/window/reinforced/spawner/west, -/obj/machinery/sleeper{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel, +/area/science/research) "bYH" = ( /obj/structure/sign/poster/contraband/kss13{ pixel_y = -32 @@ -48429,17 +47744,10 @@ /area/medical/medbay/lobby) "bYL" = ( /obj/effect/turf_decal/tile/purple{ - dir = 4 + dir = 1 }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bYM" = ( /obj/machinery/vending/wardrobe/cargo_wardrobe, /obj/effect/turf_decal/delivery, @@ -48504,32 +47812,29 @@ /turf/open/space/basic, /area/solar/starboard/aft) "bYS" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/server{ - name = "Computer Core" - }) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "bYT" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/research) "bYU" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/research) "bYV" = ( /obj/machinery/rnd/destructive_analyzer, /obj/machinery/airalarm{ @@ -48546,85 +47851,82 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bYX" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/sign/poster/official/anniversary_vintage_reprint, +/turf/closed/wall/r_wall, +/area/science/research) "bYY" = ( -/turf/open/floor/circuit/green, -/area/science/server{ - name = "Computer Core" - }) -"bYZ" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/circuit/green, -/area/science/server{ - name = "Computer Core" - }) -"bZa" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/effect/turf_decal/tile/green{ +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research) +"bYZ" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/item/storage/box/disks, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/research) +"bZa" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "bZb" = ( -/obj/structure/table, -/obj/machinery/button/door{ - id = "RDServer"; - layer = 3.6; - name = "RD Server Lockup Control"; - pixel_x = -24 - }, -/obj/item/circuitboard/machine/rdserver, -/obj/item/disk/tech_disk, -/turf/open/floor/circuit/green, -/area/science/server{ - name = "Computer Core" - }) -"bZc" = ( -/obj/machinery/computer/robotics{ - dir = 1 - }, -/obj/machinery/light, /obj/structure/disposalpipe/segment, -/turf/open/floor/circuit/green, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) +"bZc" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research) "bZd" = ( /obj/effect/landmark/blobstart, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/quartermaster/warehouse) "bZe" = ( -/obj/structure/grille, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/plating, -/area/science/server{ - name = "Computer Core" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "bZf" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/structure/cable{ @@ -48853,35 +48155,27 @@ /area/science/xenobiology) "bZE" = ( /obj/effect/turf_decal/tile/purple{ - dir = 4 + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/obj/effect/turf_decal/tile/purple, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bZF" = ( /turf/open/floor/wood, /area/library) "bZG" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/obj/structure/sign/warning/fire{ - pixel_x = -32; - pixel_y = 32 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/research) "bZH" = ( /turf/closed/wall, /area/library) @@ -49452,24 +48746,22 @@ /turf/open/floor/engine, /area/science/explab) "cbf" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/east, -/obj/machinery/sleeper{ +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/obj/item/kirbyplants{ + icon_state = "plant-16" + }, +/turf/open/floor/plasteel, +/area/science/research) "cbg" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/engine, /area/science/storage) "cbh" = ( -/obj/machinery/rnd/experimentor, +/obj/effect/landmark/event_spawn, /turf/open/floor/engine, /area/science/explab) "cbi" = ( @@ -49487,14 +48779,15 @@ /turf/open/floor/plating, /area/crew_quarters/heads/captain) "cbj" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/research) "cbk" = ( /obj/structure/table, /obj/item/paper_bin, @@ -49646,11 +48939,14 @@ /turf/open/floor/plating, /area/ai_monitored/storage/eva) "cbB" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/plasteel, +/area/science/research) "cbC" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/effect/turf_decal/stripes/line{ @@ -49659,18 +48955,28 @@ /turf/open/floor/engine, /area/science/storage) "cbD" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/chair{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/research) "cbE" = ( -/turf/closed/wall/r_wall, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "cbF" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 6 @@ -49721,22 +49027,19 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cbJ" = ( -/obj/structure/table/reinforced, -/obj/item/analyzer, -/obj/item/t_scanner, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 24 + }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" }, -/obj/machinery/power/apc{ - areastring = "/area/engine/supermatter"; - dir = 4; - name = "Thermo-Electric Generator APC"; - pixel_x = 24 - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) "cbK" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -49811,6 +49114,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "cbQ" = ( @@ -49828,6 +49134,20 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/central) +"cbS" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) "cbT" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/visible{ dir = 4 @@ -49859,18 +49179,24 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "cbV" = ( -/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "2-8" }, -/obj/structure/window/reinforced/spawner, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/science/server{ - name = "Computer Core" - }) +/turf/open/floor/plasteel, +/area/science/research) "cbW" = ( /obj/machinery/disposal/deliveryChute{ dir = 8 @@ -49888,19 +49214,15 @@ /turf/open/floor/circuit, /area/bridge) "cbY" = ( -/obj/machinery/light_switch{ - pixel_y = 24 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 10 }, -/turf/open/floor/plasteel/dark, -/area/science/server{ - name = "Computer Core" - }) +/turf/open/floor/plasteel, +/area/science/research) "cbZ" = ( /obj/machinery/computer/slot_machine, /obj/structure/window/reinforced/spawner/west, @@ -50129,11 +49451,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "ccx" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/obj/structure/table/glass, +/obj/item/reagent_containers/food/drinks/coffee, +/obj/item/pen/blue, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "ccy" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor/auto{ @@ -50264,20 +49592,27 @@ }, /turf/open/floor/plating, /area/maintenance/disposal) +"ccJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/research) "ccK" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/obj/structure/table/glass, +/obj/item/storage/toolbox/emergency, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 9 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "ccL" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/rdconsole/experiment{ + dir = 1 }, -/obj/machinery/rnd/bepis, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/science/explab) "ccM" = ( /obj/structure/disposalpipe/segment{ @@ -50371,14 +49706,19 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "ccX" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 4 +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, -/area/quartermaster/storage) +/area/science/research) "ccY" = ( /obj/structure/cable, /obj/effect/landmark/start/librarian, @@ -50430,9 +49770,21 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "cdd" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/hallway/secondary/exit) +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "Escape Hall - Fore"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cde" = ( /obj/machinery/light{ dir = 1 @@ -50441,21 +49793,22 @@ /turf/open/floor/mineral/titanium/blue, /area/hallway/primary/central) "cdf" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/effect/turf_decal/tile/green{ +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/machinery/light{ - dir = 1; - light_color = "#e8eaff" +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/item/paper_bin, +/obj/item/radio/headset/headset_sci, +/obj/item/radio/headset/headset_sci, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/research) "cdg" = ( /obj/structure/cable{ icon_state = "4-8" @@ -50463,13 +49816,8 @@ /turf/open/floor/plasteel, /area/engine/break_room) "cdh" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/turf/closed/wall/r_wall, +/area/crew_quarters/toilet/restrooms) "cdi" = ( /obj/machinery/disposal/deliveryChute, /obj/structure/disposalpipe/trunk{ @@ -50529,14 +49877,15 @@ /turf/open/floor/plasteel, /area/engine/break_room) "cdn" = ( +/obj/structure/table/glass, +/obj/item/clipboard, +/obj/item/storage/crayons, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/hallway/secondary/exit/departure_lounge) "cdo" = ( /obj/structure/grille, /obj/structure/disposalpipe/segment{ @@ -50856,7 +50205,7 @@ /area/router/eng) "cdV" = ( /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cdW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -51054,7 +50403,7 @@ icon_state = "1-2" }, /turf/closed/wall/r_wall/rust, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cer" = ( /obj/structure/window/reinforced/spawner/east, /obj/machinery/mass_driver{ @@ -51078,19 +50427,33 @@ icon_state = "1-2" }, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ceu" = ( -/obj/machinery/vending/snack/random, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/structure/table/glass, +/obj/item/storage/fancy/cigarettes, +/obj/item/lighter{ + pixel_x = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cev" = ( -/obj/machinery/vending/games, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cew" = ( /obj/structure/window/reinforced/spawner/east, /obj/machinery/conveyor/auto{ @@ -51101,92 +50464,63 @@ /turf/open/floor/plating, /area/router/eng) "cex" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cey" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Arcade" +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research) "cez" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/item/storage/firstaid/fire{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/fire{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/fire{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/brute, -/obj/item/clothing/glasses/hud/health, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) "ceA" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/item/storage/firstaid/toxin{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/toxin{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/toxin{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/o2, -/obj/item/storage/firstaid/o2, -/obj/item/storage/firstaid/o2, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) -"ceB" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ +/turf/open/floor/plating, +/area/science/research) +"ceB" = ( +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) "ceC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, @@ -51340,7 +50674,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ceS" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance{ @@ -51426,7 +50760,7 @@ dir = 6 }, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfb" = ( /obj/machinery/light{ dir = 8 @@ -51477,7 +50811,7 @@ dir = 10 }, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfg" = ( /obj/structure/chair{ dir = 8 @@ -51497,39 +50831,71 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "cfh" = ( -/obj/structure/disposalpipe/segment, +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/recharger, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/science/research) "cfi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/hallway/secondary/exit/departure_lounge) "cfj" = ( -/obj/machinery/light, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/hallway/secondary/exit/departure_lounge) "cfk" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Quarter Maintenance"; + req_one_access_txt = "12;48" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) "cfl" = ( -/turf/closed/wall, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/sign/warning/pods{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cfm" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cfn" = ( /obj/structure/cable{ icon_state = "1-2" @@ -51542,13 +50908,13 @@ "cfo" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfp" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 1 }, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfq" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, @@ -51566,7 +50932,7 @@ }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfs" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -51586,72 +50952,49 @@ dir = 4 }, /turf/open/floor/plating, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfv" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/machinery/firealarm{ - pixel_y = 26 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) -"cfw" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Engineering Construction Area"; - dir = 4 - }, -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -28 - }, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) -"cfx" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 - }, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) -"cfy" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/turf/closed/wall/r_wall, +/area/engine/secure_construction) +"cfw" = ( +/obj/machinery/door/airlock/engineering{ + name = "Canister Storage"; + req_one_access_txt = "10;24" }, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "4-8" }, -/obj/machinery/power/terminal{ +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"cfx" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"cfy" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cfz" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -51666,19 +51009,19 @@ dir = 5 }, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfB" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 9 }, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfD" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supplymain/visible{ @@ -51692,13 +51035,13 @@ dir = 9 }, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfF" = ( /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/plating, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfG" = ( /obj/machinery/door/airlock/highsecurity{ name = "Secure Tech Storage"; @@ -51715,7 +51058,7 @@ }, /obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -51727,13 +51070,13 @@ /obj/effect/decal/cleanable/ash, /obj/effect/decal/remains/human, /turf/open/floor/engine/vacuum, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 10 @@ -51742,32 +51085,23 @@ icon_state = "1-2" }, /turf/open/floor/plating, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable{ + icon_state = "2-4" + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/engine/storage) "cfM" = ( /obj/structure/cable{ icon_state = "2-8" @@ -51877,7 +51211,7 @@ /obj/structure/window/plasma/reinforced/spawner, /obj/structure/lattice, /turf/open/space/basic, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cfX" = ( /obj/item/pipe, /obj/structure/cable{ @@ -51897,14 +51231,14 @@ /turf/open/floor/plating, /area/quartermaster/warehouse) "cfZ" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/plasteel/stairs/right, -/area/science/research{ - name = "Research Sector" - }) +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) "cga" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -51925,7 +51259,7 @@ }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgc" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -52008,7 +51342,7 @@ }, /obj/machinery/meter, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgj" = ( /obj/machinery/conveyor/auto{ id = "cargo" @@ -52036,7 +51370,7 @@ name = "atmos mix to burn" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgm" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -52062,7 +51396,7 @@ "cgo" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 10 @@ -52073,7 +51407,7 @@ pixel_y = 24 }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgq" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -52109,8 +51443,8 @@ /area/quartermaster/warehouse) "cgt" = ( /obj/structure/rack, -/obj/item/caution, -/obj/item/caution, +/obj/item/clothing/suit/caution, +/obj/item/clothing/suit/caution, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/quartermaster/warehouse) @@ -52123,7 +51457,7 @@ light_color = "#ffc1c1" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgv" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -52144,7 +51478,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgx" = ( /obj/structure/cable{ icon_state = "1-2" @@ -52192,7 +51526,6 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/structure/cable, /obj/structure/cable{ icon_state = "0-2" }, @@ -52204,7 +51537,7 @@ "cgD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgE" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/light{ @@ -52216,131 +51549,116 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "cgF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/north, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/science/server{ - name = "Computer Core" - }) +/obj/machinery/vending/wardrobe/science_wardrobe, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/research) "cgG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/north, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" }, +/obj/effect/turf_decal/tile/red, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/science/server{ - name = "Computer Core" - }) +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) "cgH" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/sign/poster/official/get_your_legs, +/turf/closed/wall, +/area/hallway/secondary/exit/departure_lounge) "cgI" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) +/obj/machinery/status_display, +/turf/closed/wall, +/area/hallway/secondary/exit/departure_lounge) "cgJ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) +/obj/structure/sign/poster/official/help_others, +/turf/closed/wall, +/area/hallway/secondary/exit/departure_lounge) "cgK" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) -"cgL" = ( -/obj/machinery/computer/rdservercontrol{ +/obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, /obj/machinery/light{ dir = 8 }, -/obj/structure/window/reinforced/spawner, -/turf/open/floor/plasteel/dark, -/area/science/server{ - name = "Computer Core" - }) -"cgM" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/photocopier, +/turf/open/floor/plasteel, +/area/science/research) +"cgL" = ( +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) -"cgN" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/sign/warning/fire{ + pixel_x = -32; + pixel_y = 32 }, -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) -"cgO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) -"cgP" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/closed/wall/r_wall, -/area/science/server{ - name = "Computer Core" - }) -"cgQ" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research) +"cgM" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 }, -/turf/open/floor/plating, -/area/science/server{ - name = "Computer Core" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research) +"cgN" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/exit/departure_lounge) +"cgO" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cgP" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/sign/warning/pods{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cgQ" = ( +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cgR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 6 }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgS" = ( /obj/machinery/atmospherics/components/trinary/mixer{ dir = 4; @@ -52350,7 +51668,7 @@ target_pressure = 4500 }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgT" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -52363,22 +51681,15 @@ name = "manual mix to burn" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cgV" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/hallway/secondary/exit/departure_lounge) "cgW" = ( /obj/docking_port/stationary{ dir = 4; @@ -52432,7 +51743,7 @@ icon_state = "2-4" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chc" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -52476,7 +51787,7 @@ icon_state = "4-8" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plating, @@ -52494,28 +51805,42 @@ icon_state = "1-8" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 10 }, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chl" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) -"chm" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/closed/wall/r_wall/rust, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"chm" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) "chn" = ( /obj/machinery/light{ dir = 8 @@ -52544,22 +51869,22 @@ "chr" = ( /obj/machinery/atmospherics/components/binary/valve/digital, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chs" = ( /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cht" = ( /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 5 }, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chv" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -52593,14 +51918,11 @@ /turf/open/floor/plasteel, /area/engine/atmos) "chy" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 10 }, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chz" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -52611,20 +51933,20 @@ pixel_x = -28 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chA" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chB" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chC" = ( /turf/closed/wall/r_wall/rust, /area/space/nearstation) @@ -52636,13 +51958,13 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chE" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 5 }, /turf/closed/wall/r_wall, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "chF" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 4 @@ -52652,7 +51974,7 @@ /obj/item/pipe_dispenser, /obj/item/wrench, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "chG" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 4 @@ -52662,7 +51984,7 @@ }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "chH" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 1 @@ -52676,7 +51998,7 @@ /obj/machinery/meter, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "chJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52698,32 +52020,24 @@ dir = 4 }, /turf/open/floor/plating, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "chL" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, /turf/open/floor/plasteel, /area/engine/atmos) "chM" = ( /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) "chN" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chO" = ( /obj/structure/table, /obj/machinery/requests_console{ @@ -52849,7 +52163,7 @@ "chX" = ( /obj/structure/sign/warning/nosmoking, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chY" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -52863,14 +52177,14 @@ /obj/item/grenade/chem_grenade/smart_metal_foam, /obj/item/wrench, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "chZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cia" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -52879,13 +52193,13 @@ icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cib" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cic" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -52913,13 +52227,13 @@ }, /obj/item/analyzer, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cie" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/closed/wall/r_wall, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cif" = ( /obj/machinery/light/small{ brightness = 3; @@ -53047,7 +52361,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cis" = ( /obj/structure/sign/warning/vacuum{ pixel_y = -32 @@ -53132,7 +52446,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "ciE" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -53155,13 +52469,18 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "ciG" = ( -/obj/structure/cable/yellow{ +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ icon_state = "1-2" }, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "ciH" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 6 @@ -53171,7 +52490,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "ciI" = ( /turf/closed/wall/r_wall/rust, /area/quartermaster/warehouse) @@ -53331,17 +52650,17 @@ pixel_y = 1 }, /obj/machinery/power/apc{ - areastring = "/area/engine/teg_hot"; + areastring = "/area/engine/teg/hotloop"; dir = 8; name = "Hot Loop APC"; pixel_x = -24 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ciZ" = ( /obj/machinery/atmospherics/components/binary/valve/digital, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cja" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53407,7 +52726,7 @@ dir = 6 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cji" = ( /obj/structure/fans/tiny, /obj/structure/plasticflaps, @@ -53463,22 +52782,22 @@ /turf/closed/wall/rust, /area/maintenance/port/central) "cjr" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "0-2" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/science/server{ - name = "Computer Core" - }) +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "cjs" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cjt" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53495,23 +52814,10 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cju" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/table, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/obj/item/clothing/ears/earmuffs, -/obj/item/extinguisher{ - pixel_x = -12; - pixel_y = -2 - }, -/obj/machinery/camera{ - c_tag = "Engineering - Hot Loop"; - dir = 8; - pixel_y = -22 - }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/hallway/secondary/exit/departure_lounge) "cjv" = ( /obj/structure/chair{ dir = 1 @@ -53558,7 +52864,7 @@ dir = 4; pixel_x = -28 }, -/obj/item/kirbyplants/random, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/quartermaster/office) "cjB" = ( @@ -53638,7 +52944,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cjL" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 4 @@ -53646,7 +52952,7 @@ /obj/machinery/portable_atmospherics/canister, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cjM" = ( /obj/structure/table, /obj/item/storage/box/lights/mixed, @@ -53774,7 +53080,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cjV" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -53821,7 +53127,7 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cjY" = ( /obj/machinery/computer/station_alert{ dir = 4 @@ -53878,21 +53184,17 @@ }, /area/science/robotics/lab) "ckc" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/structure/cable{ - icon_state = "0-4" +/obj/machinery/door/airlock/external{ + name = "Escape Pod" }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/aft/secondary"; - dir = 8; - name = "Aft Air Hookup APC"; - pixel_x = -24 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "ckd" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel/white, @@ -53905,17 +53207,9 @@ /turf/open/floor/wood, /area/library) "ckf" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, +/obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/hallway/secondary/exit/departure_lounge) "ckg" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -53969,7 +53263,7 @@ /area/space/station_ruins) "ckm" = ( /turf/closed/wall/r_wall, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "ckn" = ( /obj/machinery/door/airlock/external/glass{ name = "External Solar Access"; @@ -53981,17 +53275,13 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "cko" = ( -/obj/structure/cable, -/obj/machinery/power/apc{ - areastring = "/area/engine/engineering"; - dir = 4; - name = "Engine Room APC"; - pixel_x = 24 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) "ckp" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -54021,22 +53311,23 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "cks" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel, +/area/science/research) "ckt" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/machinery/airalarm{ @@ -54047,13 +53338,13 @@ icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cku" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ckv" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining/glass{ @@ -54070,36 +53361,38 @@ }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ckx" = ( -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" - }, /obj/structure/disposalpipe/segment{ - dir = 10 + dir = 5 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 10 + dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel, +/area/science/research) "cky" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ckz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/structure/table, /obj/item/pipe_dispenser, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ckA" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ckB" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -54120,7 +53413,7 @@ }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "ckC" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -54135,7 +53428,7 @@ name = "gas to cold loop" }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "ckD" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -54155,21 +53448,14 @@ /turf/open/floor/plasteel, /area/security/checkpoint/supply) "ckF" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/chair, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "0-8" +/turf/open/floor/plasteel/white/corner{ + dir = 4 }, -/obj/machinery/power/apc{ - areastring = "/area/engine/teg_cold"; - dir = 4; - name = "Cold Loop APC"; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/hallway/secondary/exit/departure_lounge) "ckG" = ( /obj/machinery/atmospherics/pipe/manifold/orange/hidden{ dir = 1 @@ -54204,7 +53490,7 @@ dir = 8 }, /turf/closed/wall/r_wall, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "ckK" = ( /obj/structure/closet/secure_closet/miner, /obj/effect/turf_decal/tile/brown{ @@ -54258,34 +53544,41 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "ckP" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -28 +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) "ckQ" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "ckR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54302,55 +53595,82 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "ckT" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) "ckU" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/science/research) "ckV" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) +"ckW" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"ckW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/turf/open/floor/plasteel, +/area/science/research) "ckX" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/structure/cable{ @@ -54406,27 +53726,35 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "cld" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cle" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" }, -/obj/machinery/power/apc{ - areastring = "/area/science/misc_lab"; - dir = 1; - name = "Research Observatory APC"; - pixel_y = 24 +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/turf/open/floor/plasteel, +/area/science/research) +"cle" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research) "clf" = ( /obj/machinery/light/small{ dir = 8 @@ -54438,22 +53766,36 @@ /turf/open/floor/engine, /area/science/xenobiology) "clg" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) "clh" = ( -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) "cli" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -54576,63 +53918,95 @@ }, /area/library) "clx" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/light{ - dir = 8 - }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics Access"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/engine/storage) "cly" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel/grimy, /area/crew_quarters/bar) "clz" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -28 +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) -"clA" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) -"clB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) -"clC" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/science/research"; + name = "Research Sector APC"; + pixel_y = -24 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/science/research) +"clA" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Research Aft"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) +"clB" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research) +"clC" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research) "clD" = ( /obj/machinery/telecomms/server/presets/medical, /turf/open/floor/circuit/telecomms/mainframe, @@ -54650,13 +54024,15 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "clH" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/structure/chair, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/turf/open/floor/plating, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) "clI" = ( /obj/machinery/telecomms/bus/preset_four, /turf/open/floor/circuit/telecomms/mainframe, @@ -54773,36 +54149,17 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "clZ" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Escape Hall - Port"; - dir = 4 +/obj/effect/turf_decal/tile/red{ + dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cma" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 26 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Escape Hall - Starboard"; - dir = 8; - pixel_y = -22 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cmb" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -54856,7 +54213,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cmg" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -54874,7 +54231,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cmh" = ( /obj/structure/sign/warning/radiation, /turf/closed/wall/r_wall, @@ -54954,11 +54311,17 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "cmt" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "cmu" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -54992,33 +54355,17 @@ /turf/open/floor/engine, /area/engine/gravity_generator) "cmy" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Starboard Quarter Maintenance"; - req_one_access_txt = "12;48" +/obj/effect/turf_decal/stripes/line, +/obj/item/crowbar, +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = 32 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit) +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cmz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Starboard Quarter Maintenance"; - req_one_access_txt = "12;48" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cmA" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -55063,7 +54410,7 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cmF" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/mineral/titanium/blue, @@ -55080,7 +54427,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cmH" = ( /obj/structure/plasticflaps, /obj/structure/fans/tiny, @@ -55091,28 +54438,15 @@ /turf/open/floor/plating, /area/quartermaster/sorting) "cmI" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/item/radio/off{ - pixel_x = -3; - pixel_y = 1 +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 }, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/research) "cmJ" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/brown, @@ -55232,26 +54566,26 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "cmT" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/item/folder/red, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/door/window/northright{ - name = "Security Checkpoint"; - req_access_txt = "1" +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" }, /turf/open/floor/plasteel, -/area/security/checkpoint/supply) +/area/engine/workshop) "cmU" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -55268,20 +54602,8 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "cmV" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/closed/wall, +/area/hallway/secondary/exit/departure_lounge) "cmW" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -55301,14 +54623,19 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "cmX" = ( -/obj/machinery/light/small, -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Escape Hall - Port"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cmY" = ( /obj/machinery/door/airlock/engineering{ name = "Hot Loop"; @@ -55326,39 +54653,20 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cmZ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/west, -/obj/machinery/atmospherics/components/unary/cryo_cell{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs, +/area/science/research) "cna" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/east, -/obj/machinery/atmospherics/components/unary/cryo_cell{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/left, +/area/science/research) "cnb" = ( /obj/structure/table/glass, /obj/effect/turf_decal/stripes/line, @@ -55374,31 +54682,29 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cnc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cnd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"cne" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cne" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cnf" = ( -/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cng" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -55417,7 +54723,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cni" = ( /obj/machinery/atmospherics/components/binary/pump{ name = "Port to Fuel Pipe" @@ -55425,18 +54731,13 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cnj" = ( -/obj/machinery/camera{ - c_tag = "Research - Observatory"; - dir = 4 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -28 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/stairs/medium, +/area/science/research) "cnk" = ( /obj/machinery/light, /obj/effect/turf_decal/tile/yellow{ @@ -55488,7 +54789,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cnp" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, @@ -55510,7 +54811,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cns" = ( /obj/machinery/firealarm{ dir = 8; @@ -55522,7 +54823,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cnt" = ( /obj/structure/fans/tiny, /obj/structure/plasticflaps, @@ -55567,22 +54868,14 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cny" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/turf/open/floor/plasteel/stairs/right, +/area/science/research) "cnz" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -55659,19 +54952,26 @@ }, /area/maintenance/port/fore) "cnG" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Shuttle Maintenance Access" +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Escape Hall - Starboard"; + dir = 8; + pixel_y = -22 }, -/obj/structure/fans/tiny, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cnH" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Departures Shuttle Dock" +/obj/structure/chair{ + dir = 4 }, -/obj/structure/fans/tiny, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cnI" = ( /turf/open/floor/plating{ icon_state = "platingdmg3" @@ -55689,7 +54989,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cnL" = ( /obj/structure/closet/crate/science, /obj/item/stack/sheet/metal/ten, @@ -55699,8 +54999,19 @@ /obj/item/target/alien, /obj/item/target, /obj/item/target/clown, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/science/mixing) +"cnM" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research) "cnN" = ( /obj/structure/bookcase/random/fiction, /obj/effect/turf_decal/tile/neutral, @@ -55734,9 +55045,6 @@ /turf/open/space/basic, /area/quartermaster/warehouse) "cnR" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, @@ -55761,7 +55069,8 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "cnT" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/science/mixing) "cnU" = ( @@ -55876,29 +55185,20 @@ }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cog" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=eng2"; + location = "evac" }, -/turf/open/floor/plating, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "coh" = ( -/obj/structure/cable{ - icon_state = "0-4" +/obj/structure/chair{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/turf/open/floor/plating, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "coi" = ( /obj/machinery/light, /obj/structure/disposalpipe/segment{ @@ -55932,7 +55232,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "col" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/yellow{ @@ -55976,38 +55276,28 @@ /turf/open/floor/plating, /area/crew_quarters/heads/chief) "coq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Departures" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "cor" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Departures" +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit/departure_lounge) "cos" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Workshop"; - req_access_txt = "11" +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/science/research) "cot" = ( /obj/machinery/computer/apc_control{ dir = 4 @@ -56069,13 +55359,22 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "coy" = ( -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = -32 +/obj/structure/chair{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hallway/secondary/exit/departure_lounge"; + name = "Escape Shuttle Hallway APC"; + pixel_y = -28 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit/departure_lounge) "coz" = ( /obj/structure/disposalpipe/junction{ dir = 8 @@ -56314,7 +55613,7 @@ }, /obj/machinery/meter, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "coU" = ( /obj/machinery/computer/secure_data{ dir = 1 @@ -56358,42 +55657,27 @@ /turf/open/floor/plating, /area/storage/tech) "coX" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/camera{ - c_tag = "Medbay - Operating Theatre"; - dir = 8; - network = list("ss13","medbay"); - pixel_y = -22 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel, +/area/science/research) "coY" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/item/reagent_containers/glass/beaker/cryoxadone, -/obj/item/reagent_containers/glass/beaker/cryoxadone, -/obj/machinery/camera{ - c_tag = "Medbay - Cryogenics"; - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/reagent_containers/glass/beaker/cryoxadone, -/obj/item/reagent_containers/glass/beaker/cryoxadone, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research) "coZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -56412,7 +55696,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpb" = ( /obj/structure/sink{ dir = 4; @@ -56450,13 +55734,21 @@ /turf/open/floor/engine, /area/science/explab) "cpf" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 5 +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/science/research) "cpg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -56467,47 +55759,59 @@ /turf/open/floor/plasteel/dark, /area/science/explab) "cph" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/science/research) "cpi" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 5 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) -"cpj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/power/apc{ + areastring = "/area/science/robotics/lab"; + dir = 8; + name = "Robotics Lab APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/science/research) +"cpj" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/science/research) "cpk" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 8 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpl" = ( /obj/machinery/newscaster{ pixel_x = 30 @@ -56552,7 +55856,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpp" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor/auto{ @@ -56566,11 +55870,15 @@ /turf/open/floor/plating, /area/quartermaster/sorting) "cpq" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/blue, -/area/crew_quarters/abandoned_gambling_den{ - name = "Arcade" - }) +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research) "cpr" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -56630,15 +55938,14 @@ /turf/open/floor/mineral/titanium/blue, /area/hallway/primary/central) "cpy" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/chair{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit/departure_lounge) "cpz" = ( /turf/closed/wall/r_wall, /area/medical/virology) @@ -56653,7 +55960,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpB" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -56696,7 +56003,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpG" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56759,7 +56066,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cpL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 9 @@ -56769,7 +56076,7 @@ light_color = "#c1caff" }, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cpM" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/bot, @@ -56829,14 +56136,14 @@ /obj/item/electronics/airlock, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpS" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpT" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8 @@ -56844,7 +56151,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -56853,7 +56160,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpV" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -56873,7 +56180,7 @@ light_color = "#c1caff" }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cpW" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56894,13 +56201,13 @@ }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cpZ" = ( /obj/structure/table, /obj/item/tank/internals/air, /obj/item/clothing/mask/gas, /turf/open/floor/plasteel/dark, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cqa" = ( /obj/machinery/autolathe, /obj/effect/turf_decal/delivery, @@ -56909,7 +56216,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqb" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/white, @@ -56920,7 +56227,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqd" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -56950,13 +56257,23 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqf" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/storage/box/rxglasses{ + pixel_x = 2 + }, +/obj/item/pen, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cqg" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -56965,20 +56282,16 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqh" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cqi" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -57011,40 +56324,29 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "cql" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=eng2"; - location = "evac" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"cqm" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +/obj/structure/chair{ dir = 1 }, -/obj/effect/turf_decal/tile/green{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/effect/turf_decal/tile/green{ +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit/departure_lounge) +"cqm" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 26 +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/item/storage/box/disks_nanite, -/obj/item/book/manual/wiki/research_and_development{ - pixel_x = 4; - pixel_y = -8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cqn" = ( /obj/structure/cable{ icon_state = "4-8" @@ -57054,7 +56356,7 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqo" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -57067,7 +56369,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -57079,7 +56381,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering{ @@ -57095,7 +56397,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqr" = ( /obj/machinery/power/apc{ areastring = "/area/maintenance/starboard/central"; @@ -57228,7 +56530,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqB" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/bottle/absinthe, @@ -57243,11 +56545,11 @@ "cqC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqD" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqE" = ( /obj/machinery/conveyor_switch{ id = "EngiCargoConveyer" @@ -57259,7 +56561,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqF" = ( /obj/effect/turf_decal/delivery, /obj/effect/landmark/event_spawn, @@ -57332,12 +56634,12 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqM" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqN" = ( /turf/closed/wall/rust, /area/maintenance/department/security) @@ -57346,16 +56648,23 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cqP" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/mask/muzzle, +/obj/item/clothing/mask/muzzle, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cqQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57376,9 +56685,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqS" = ( -/obj/machinery/computer/rdconsole/experiment{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, /obj/machinery/requests_console{ department = "Science"; @@ -57387,25 +56693,19 @@ pixel_x = -30; receive_ore_updates = 1 }, +/obj/structure/table, +/obj/item/book/manual/wiki/experimentor, /turf/open/floor/plasteel, /area/science/explab) "cqT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"cqU" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) +"cqU" = ( +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit/departure_lounge) "cqV" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, @@ -57493,7 +56793,7 @@ id = "EngiCargoConveyer" }, /turf/open/floor/plating, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "crc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57579,29 +56879,41 @@ /turf/open/floor/plasteel, /area/engine/break_room) "crj" = ( -/obj/structure/chair{ - dir = 1 +/obj/effect/turf_decal/tile/red{ + dir = 4 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/radio/intercom{ - name = "Station Intercom (Common)"; - pixel_y = -29 +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" }, /turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "crk" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/mineral/titanium/blue, /area/hallway/primary/central) "crl" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/storage/belt/medical, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/suit/space/eva/paramedic, +/obj/item/clothing/head/helmet/space/eva/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "crm" = ( /obj/machinery/door/firedoor, /obj/structure/plasticflaps, @@ -57614,7 +56926,7 @@ name = "Engineering Delivery Door" }, /turf/open/floor/plating, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "crn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -57661,20 +56973,20 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "crs" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/item/radio/intercom{ - name = "Station Intercom (Common)"; - pixel_y = -29 - }, -/turf/open/floor/engine, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "crt" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -57708,34 +57020,48 @@ /turf/open/floor/plasteel, /area/engine/break_room) "crv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) -"crw" = ( -/obj/structure/disposalpipe/junction{ +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) -"crx" = ( -/obj/machinery/camera{ - c_tag = "Engine Room - Port Quarter"; +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"crw" = ( +/obj/machinery/computer/med_data, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"crx" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cry" = ( /obj/structure/table, /obj/item/stack/sheet/plasteel{ @@ -57940,13 +57266,10 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "crU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/item/crowbar, -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/departments/evac, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) "crV" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -58208,7 +57531,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "csr" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -58230,7 +57553,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cst" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/decal/cleanable/dirt, @@ -58238,7 +57561,7 @@ dir = 9 }, /turf/open/floor/plasteel, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "csu" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -58341,11 +57664,16 @@ /turf/open/floor/plating, /area/maintenance/department/chapel) "csC" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating/asteroid, -/area/hydroponics/garden{ - name = "Nature Preserve" - }) +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "csD" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/dark, @@ -58448,42 +57776,37 @@ }, /area/crew_quarters/heads/hor) "csO" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/structure/bed/roller, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "csP" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"csQ" = ( +/obj/machinery/iv_drip, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"csQ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "csR" = ( /turf/open/floor/engine, /area/science/storage) "csS" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ +/obj/structure/bed/roller, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "csT" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, @@ -58509,17 +57832,18 @@ }, /area/science/robotics/lab) "csW" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "csX" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "csY" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/white, @@ -58543,18 +57867,12 @@ /turf/open/floor/engine, /area/science/explab) "ctc" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "ctd" = ( /obj/structure/cable{ icon_state = "1-2" @@ -58627,20 +57945,25 @@ /turf/open/floor/plasteel, /area/engine/atmos) "ctl" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/modular_computer/console/preset/engineering, +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/structure/window/reinforced/spawner/north, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, /turf/open/floor/plasteel, /area/engine/workshop) "ctm" = ( @@ -58841,21 +58164,17 @@ /turf/open/floor/plating, /area/medical/virology) "ctE" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/structure/table/reinforced, +/obj/machinery/door/window/southleft{ + name = "Workshop Desk"; + req_access_txt = "11" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/modular_computer/console/preset/engineering, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/window/reinforced/spawner/north, /turf/open/floor/plasteel, /area/engine/workshop) "ctF" = ( @@ -58869,13 +58188,14 @@ /turf/closed/wall, /area/engine/workshop) "ctH" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/hallway/secondary/exit/departure_lounge) "ctI" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -58928,14 +58248,12 @@ /turf/open/floor/engine, /area/science/xenobiology) "ctN" = ( -/obj/machinery/light/small{ - dir = 4; - light_color = "#d8b1b1" +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "ctO" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -58949,15 +58267,15 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "ctP" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "ctQ" = ( /obj/structure/grille, /obj/structure/cable{ @@ -59030,30 +58348,18 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "ctV" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/hallway/secondary/exit"; - name = "Escape Shuttle Hallway APC"; - pixel_y = -28 + dir = 4 }, /turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "ctW" = ( -/obj/machinery/airalarm{ - pixel_y = 24 +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "ctX" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -59068,63 +58374,45 @@ /turf/open/floor/plasteel, /area/engine/workshop) "ctY" = ( -/obj/structure/sign/departments/xenobio{ - pixel_x = -32; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "ctZ" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/sleeper{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cua" = ( -/obj/structure/chair/comfy/black{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/light{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "cub" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/obj/item/defibrillator/loaded, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "cuc" = ( /obj/machinery/door/airlock/virology/glass{ name = "Monkey Pen"; @@ -59172,78 +58460,82 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cuf" = ( -/obj/machinery/light, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/machinery/computer/operating, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "cug" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "cuh" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cui" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cuj" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cuk" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/item/paper/guides/cogstation/letter_med{ + pixel_y = 4 + }, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"cui" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Medbay - Operating Theatre"; + dir = 8; + network = list("ss13","medbay"); + pixel_y = -22 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"cuj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/window/westright{ + name = "Treatment Center"; + req_access_txt = "5" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"cuk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cul" = ( -/obj/structure/chair/comfy/black, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cum" = ( /obj/structure/rack, /obj/item/storage/firstaid/regular{ @@ -59307,30 +58599,32 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cuq" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/machinery/door/window/eastleft{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cur" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "cus" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "cut" = ( /obj/docking_port/stationary{ dir = 2; @@ -59368,11 +58662,10 @@ /turf/open/floor/plasteel, /area/engine/workshop) "cux" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/crew_quarters/fitness/cogpool) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) "cuy" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -59873,41 +59166,22 @@ /area/medical/medbay/central) "cvx" = ( /obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/item/storage/firstaid/regular{ - pixel_x = 2; - pixel_y = 4 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/item/storage/firstaid/regular{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/regular{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/toolbox/emergency, -/obj/item/hypospray/mkii/tricord, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1485; - listening = 0; - name = "Station Intercom (Medical)"; - pixel_y = -30 +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/healthanalyzer, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/medical/medbay/zone2) "cvy" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel/white, @@ -59932,76 +59206,53 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "cvA" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/sign/warning/securearea{ - pixel_x = -32; - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/machinery/door/window/westleft{ + name = "Treatment Center"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cvB" = ( -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment, -/obj/machinery/porta_turret/ai{ - dir = 1; - req_access = list(16) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cvC" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/obj/structure/window/reinforced/spawner, -/turf/open/floor/plasteel/dark, -/area/science/server{ - name = "Computer Core" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cvD" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/rnd/server, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/window/eastright{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cvE" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor{ - id = "RDServer"; - name = "RD Server Lockup" +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/medical/medbay/zone2) "cvF" = ( -/obj/item/caution, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/medical/medbay/zone2) "cvG" = ( /obj/machinery/door/airlock/research/glass{ name = "Xenobiology Lab Access"; @@ -60218,17 +59469,20 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "cvW" = ( -/obj/structure/chair/comfy/black, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/healthanalyzer, +/obj/item/clothing/neck/stethoscope, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cvX" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research{ @@ -60271,34 +59525,38 @@ /area/science/xenobiology) "cvZ" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/clipboard, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/stamp, /obj/machinery/door/window/southright{ - name = "Customs Desk"; - req_access_txt = "57" + name = "Workshop Desk"; + req_access_txt = "11" }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "HoPAft"; - name = "HoP Aft Desk Shutters" +/obj/item/folder/yellow, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" }, -/turf/open/floor/plasteel/dark, -/area/security/checkpoint/customs) +/turf/open/floor/plasteel, +/area/engine/workshop) "cwa" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/flashlight/lamp, -/obj/structure/window/reinforced/spawner, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "HoPAft"; - name = "HoP Aft Desk Shutters" +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/security/checkpoint/customs) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/window/southleft{ + name = "Primary Tool Storage Desk"; + req_access_txt = "11" + }, +/obj/item/folder/yellow, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel, +/area/storage/primary) "cwb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60328,16 +59586,13 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "cwd" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ dir = 1 }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment, -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/area/hallway/secondary/exit/departure_lounge) "cwe" = ( /obj/structure/closet/secure_closet/exile, /turf/open/floor/plasteel/white, @@ -60469,27 +59724,8 @@ /turf/open/floor/plating, /area/medical/virology) "cwq" = ( -/obj/machinery/door/airlock/engineering{ - name = "Hot Loop"; - req_one_access_txt = "10;24" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/turf/open/floor/plasteel/stairs/left, +/area/hallway/secondary/exit/departure_lounge) "cwr" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -60551,12 +59787,11 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cwy" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/transit_tube/horizontal, -/turf/open/floor/plating, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "cwz" = ( /obj/structure/transit_tube/curved{ dir = 8 @@ -60718,18 +59953,12 @@ /turf/open/floor/mineral/titanium/blue, /area/hallway/primary/central) "cwV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/turf/open/floor/plasteel/stairs/right, +/area/hallway/secondary/exit/departure_lounge) "cwW" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -60789,15 +60018,18 @@ /turf/open/space/basic, /area/space/nearstation) "cxd" = ( -/obj/machinery/computer/monitor, -/obj/machinery/airalarm{ - pixel_y = 24 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cxe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60954,21 +60186,11 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "cxs" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/item/storage/toolbox/electrical, -/obj/item/hand_labeler, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cxt" = ( /obj/effect/landmark/start/cargo_technician, /obj/structure/cable{ @@ -61444,6 +60666,7 @@ pixel_y = 24 }, /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/toilet/restrooms"; dir = 4; name = "Restrooms APC"; pixel_x = 24 @@ -61472,28 +60695,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cyt" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/power/apc{ - areastring = "/area/science/robotics/lab"; - dir = 8; - name = "Robotics Lab APC"; - pixel_x = -25 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cyu" = ( /obj/structure/closet/wardrobe/chemistry_white{ anchored = 1 @@ -61596,14 +60802,11 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cyD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Departures" +/obj/machinery/light{ + dir = 8 }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/open/floor/plasteel/stairs/left, +/area/hallway/secondary/exit/departure_lounge) "cyE" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/white, @@ -61636,14 +60839,8 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cyJ" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/turf/open/floor/plasteel/stairs/right, +/area/hallway/secondary/exit/departure_lounge) "cyK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -61746,103 +60943,53 @@ /turf/open/floor/plating, /area/maintenance/aft) "cyV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cyW" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cyX" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/observatory) +"cyY" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cyZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"cza" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"czb" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"czc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external/glass{ + name = "Departures Shuttle Dock" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"cyY" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) -"cyZ" = ( -/obj/machinery/computer/arcade, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) -"cza" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) -"czb" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/item/paicard, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) -"czc" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/cafeteria, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "czd" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61854,15 +61001,8 @@ /turf/open/floor/plating, /area/maintenance/aft) "cze" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/turf/closed/wall/r_wall, +/area/science/observatory) "czf" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -61937,94 +61077,72 @@ /turf/open/floor/plating, /area/maintenance/aft) "czl" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Aft Maintenance"; - req_access_txt = "12" - }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit) -"czm" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"czn" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"czo" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"czp" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"czm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"czq" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/food/drinks/coffee, -/obj/item/pen/blue, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"czr" = ( -/obj/structure/table/glass, -/obj/item/storage/toolbox/emergency, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"czn" = ( +/obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"czs" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/hallway/secondary/exit/departure_lounge) +"czo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"czp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"czq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"czr" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Shuttle Maintenance Access" + }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) +"czs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "czt" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -62076,11 +61194,15 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/morgue) "czy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/area/hallway/secondary/exit/departure_lounge) "czz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -62186,12 +61308,17 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/morgue) "czK" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "czL" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -62696,7 +61823,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, @@ -62876,23 +62003,12 @@ /turf/open/floor/plating, /area/hallway/primary/aft) "cAU" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 5 +/obj/machinery/computer/operating{ + dir = 1 }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/medical/medbay/zone2) "cAV" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 5 @@ -62964,19 +62080,16 @@ /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "cBd" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cBe" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -63038,42 +62151,25 @@ /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "cBk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/obj/effect/landmark/start/station_engineer, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) -"cBl" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Power Monitoring"; - req_access_txt = "10" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"cBl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ dir = 8 }, /turf/open/floor/plasteel, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) +/area/hallway/secondary/exit/departure_lounge) "cBm" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -63126,21 +62222,27 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "cBr" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cBs" = ( -/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/closed/wall/r_wall, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cBt" = ( /obj/structure/closet/l3closet/scientist, /obj/structure/cable{ @@ -63241,13 +62343,14 @@ /turf/open/floor/plating, /area/engine/workshop) "cBC" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 }, -/turf/closed/wall/r_wall, -/area/maintenance/aft/secondary{ - name = "Aft Air Hookup" - }) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cBD" = ( /obj/effect/turf_decal/tile/green, /obj/machinery/atmospherics/pipe/simple/orange/hidden, @@ -63586,25 +62689,10 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "cCd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/sleeper{ - dir = 8 - }, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical{ - name = "Medical Booth" - }) +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "cCe" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -63834,7 +62922,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, /obj/structure/cable{ icon_state = "4-8" @@ -64679,20 +63767,13 @@ }, /area/crew_quarters/heads/hor) "cDX" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/obj/effect/landmark/start/medical_doctor, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cDY" = ( /obj/structure/cable{ icon_state = "4-8" @@ -64753,242 +63834,141 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "cEc" = ( -/obj/effect/turf_decal/bot, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - dir = 1; - freq = 1400; - location = "Bridge" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cEd" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cEe" = ( /obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"cEd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) +"cEe" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) +"cEf" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2) +"cEg" = ( +/obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cEf" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cEg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/medical/medbay/zone2) "cEh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEi" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEj" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cEk" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/research/glass{ - name = "Research Sector"; - req_one_access_txt = "29;47" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/hallway/secondary/exit/departure_lounge) "cEl" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/hallway/secondary/exit/departure_lounge) "cEm" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/atmospherics/components/unary/cryo_cell{ + dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEn" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/machinery/camera{ + c_tag = "Medbay - Cryogenics"; dir = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/research/glass{ - name = "Research Sector"; - req_one_access_txt = "29;47" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEo" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -65033,45 +64013,75 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cEs" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cEt" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/item/weldingtool, +/obj/item/wrench/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"cEt" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/atmospherics/components/unary/cryo_cell{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc{ + name = "Medbay Treatment Center APC"; + pixel_y = -24 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEv" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/red/full, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = -32 + }, +/obj/machinery/disposal/bin{ + name = "Corpse Disposal Unit" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEw" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research/glass{ @@ -65083,18 +64093,40 @@ /turf/open/floor/plasteel/white, /area/science/lab) "cEx" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/item/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency, +/obj/item/hypospray/mkii/tricord, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_y = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEy" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/white, @@ -65112,21 +64144,35 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cEA" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 24 +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/item/storage/firstaid/fire{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute, +/obj/item/clothing/glasses/hud/health, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -65213,21 +64259,31 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cEJ" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/item/storage/firstaid/toxin{ + pixel_x = 2; + pixel_y = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/item/storage/firstaid/toxin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/toxin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/o2, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "cEK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -65241,41 +64297,20 @@ /turf/open/floor/plasteel, /area/science/lab) "cEM" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cEN" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"cEN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/docking, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) "cEO" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -65565,34 +64600,22 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cFl" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/machinery/door/airlock/external/glass{ + name = "Departures Shuttle Dock" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "cFm" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/turf_decal/tile/red{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cFn" = ( /obj/structure/closet/l3closet, /obj/structure/disposalpipe/segment, @@ -65616,23 +64639,24 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cFp" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) -"cFq" = ( -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cFq" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/door/airlock/research{ + name = "Aft Observatory"; + req_access_txt = "47" + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cFr" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -65718,68 +64742,40 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cFw" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/door/airlock/research{ + name = "Aft Observatory"; + req_access_txt = "47" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/door/window/westright{ - name = "Treatment Center"; - req_access_txt = "5" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cFx" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 4 +/obj/machinery/power/apc{ + areastring = "/area/science/observatory"; + dir = 1; + name = "Research Observatory APC"; + pixel_y = 24 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cFy" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cFz" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/healthanalyzer, -/obj/item/clothing/neck/stethoscope, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cFA" = ( /obj/structure/table, /obj/item/storage/box/beakers{ @@ -66194,134 +65190,75 @@ /turf/open/floor/plating, /area/router/air) "cGi" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/machinery/airalarm{ + pixel_y = 24 }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cGj" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/obj/machinery/camera{ + c_tag = "Research - Observatory"; dir = 4 }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cGk" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cGl" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cGm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cGn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cGo" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cGp" = ( +/obj/structure/sign/departments/xenobio{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cGm" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cGn" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/item/radio/intercom{ - name = "Station Intercom (Common)"; - pixel_y = -29 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) -"cGo" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/stairs, -/area/science/research{ - name = "Research Sector" - }) -"cGp" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cGq" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -66369,22 +65306,15 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "cGu" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cGv" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable{ @@ -67024,41 +65954,37 @@ /turf/open/floor/engine, /area/science/explab) "cHK" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cHL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cHM" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cHN" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, /turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/area/science/observatory) +"cHL" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cHM" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cHN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cHO" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 @@ -67908,24 +66834,17 @@ /turf/open/floor/plasteel, /area/engine/workshop) "cJl" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/structure/chair/comfy/black{ + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/camera{ - c_tag = "Engine Room - Starboard Quarter"; - dir = 8; - pixel_y = -22 +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cJm" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -67940,15 +66859,24 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"cJp" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ +"cJo" = ( +/obj/structure/chair/comfy/black{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cJp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cJq" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/visible, /obj/structure/cable{ @@ -67999,32 +66927,27 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cJv" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Router"; - req_access_txt = "11" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cJw" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/sign/warning/securearea{ + pixel_x = -32; + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cJx" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ @@ -68050,28 +66973,29 @@ /area/quartermaster/warehouse) "cJA" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cJB" = ( +/obj/machinery/light, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cJC" = ( /obj/machinery/door/airlock/engineering{ name = "Gravity Generator"; @@ -68113,11 +67037,11 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "cJF" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/closed/wall/r_wall, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "cJG" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -68141,8 +67065,8 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "cJH" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -68154,163 +67078,100 @@ /turf/closed/wall/r_wall, /area/engine/gravity_generator) "cJJ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/obj/machinery/portable_atmospherics/scrubber/huge, +/turf/open/floor/plasteel, +/area/engine/secure_construction) "cJK" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) -"cJL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) -"cJM" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/landmark/start/atmospheric_technician, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cJL" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cJM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/engine/storage) "cJN" = ( -/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cJO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cJP" = ( +/obj/structure/chair/comfy/black, /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) -"cJO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/engine/supermatter{ - name = "Thermo-Electric Generator" - }) -"cJP" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/light/small, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cJQ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/structure/chair/comfy/black, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/science/observatory) "cJR" = ( -/obj/machinery/door/airlock/engineering{ - name = "Canister Storage"; - req_one_access_txt = "10;24" +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light{ + dir = 8 }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/engine/storage) "cJS" = ( /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 4 }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/engine/storage) "cJT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 1 +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/sign/poster/official/wtf_is_co2{ + pixel_x = 32 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/engine/storage) "cJU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/engine/storage) "cJV" = ( /obj/structure/plasticflaps, /obj/machinery/door/poddoor{ @@ -68325,50 +67186,6 @@ /turf/open/floor/plating, /area/quartermaster/sorting) "cJW" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) -"cJX" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) -"cJY" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) -"cJZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) -"cKa" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -68380,10 +67197,28 @@ }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) -"cKb" = ( +/area/engine/storage) +"cJX" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/storage"; + dir = 4; + name = "Canister Storage APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"cJY" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/storage) +"cJZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -68392,27 +67227,24 @@ }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) -"cKc" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Canister Storage"; - req_access_txt = "10" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/area/engine/storage) +"cKa" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/engine/storage{ - name = "Canister Storage" - }) +/area/engine/storage) +"cKb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/storage) +"cKc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/securearea, +/turf/open/floor/plating, +/area/engine/storage) "cKd" = ( /obj/machinery/conveyor{ dir = 8; @@ -68546,57 +67378,46 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/morgue) "cKr" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cKs" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cKt" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cKu" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cKv" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cKs" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, /turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) +/area/science/observatory) +"cKt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cKu" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel/dark, +/area/science/observatory) +"cKv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Canister Storage"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/storage) "cKw" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 4 @@ -68850,11 +67671,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plating, /area/engine/atmos) -"cLc" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plating, -/area/engine/atmos) "cLd" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -69268,15 +68084,21 @@ }, /turf/open/floor/engine/vacuum, /area/engine/atmos) +"cLZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/securearea, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/engine/storage) "cMa" = ( -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" - }, /obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/machinery/atmospherics/components/binary/pump/on{ dir = 4 }, +/obj/machinery/airlock_sensor/incinerator_atmos{ + pixel_x = -8; + pixel_y = 24 + }, /turf/open/floor/engine/vacuum, /area/engine/atmos) "cMb" = ( @@ -69416,17 +68238,22 @@ pixel_x = -40; pixel_y = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 }, +/obj/machinery/button/ignition/incinerator/atmos{ + pixel_x = -24; + pixel_y = -9 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cMw" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release" + }, /turf/open/floor/plasteel, /area/engine/atmos) "cMx" = ( @@ -69544,10 +68371,13 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "cMI" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 }, -/turf/closed/wall/r_wall, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel, /area/engine/atmos) "cMJ" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -69585,10 +68415,8 @@ /turf/open/floor/plating, /area/engine/atmos) "cMO" = ( +/obj/machinery/atmospherics/pipe/layer_manifold, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, /turf/open/floor/plating, /area/engine/atmos) "cMP" = ( @@ -69817,6 +68645,30 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/router/air) +"cNm" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/window/southright{ + name = "Primary Tool Storage Desk"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel, +/area/storage/primary) "cNn" = ( /obj/machinery/conveyor/auto{ dir = 8; @@ -69829,26 +68681,28 @@ /area/engine/workshop) "cNp" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft{ - name = "Workshop Desk"; - req_access_txt = "11" +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/item/paper_bin, -/obj/item/pen, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/workshop) -"cNq" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southright{ - name = "Workshop Desk"; - req_access_txt = "11" +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/folder/red, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/door/window/northright{ + name = "Security Checkpoint"; + req_access_txt = "1" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" }, -/obj/item/folder/yellow, /turf/open/floor/plasteel, -/area/engine/workshop) +/area/security/checkpoint/supply) "cNr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -70003,7 +68857,7 @@ /turf/open/floor/plating{ icon_state = "panelscorched" }, -/area/engine/teg_hot) +/area/engine/teg/hotloop) "cNL" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 8 @@ -70011,7 +68865,7 @@ /turf/open/floor/plating{ icon_state = "panelscorched" }, -/area/engine/teg_cold) +/area/engine/teg/coldloop) "cNM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -70254,10 +69108,6 @@ /obj/structure/table, /turf/open/floor/plating/airless, /area/quartermaster/miningdock/airless/no_grav) -"cOw" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) "cOx" = ( /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment{ @@ -70864,26 +69714,6 @@ /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/space/basic, /area/space/nearstation) -"cPG" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/turretid{ - control_area = "/area/science/server"; - icon_state = "control_stun"; - name = "Computer Core turret control"; - pixel_x = -3; - pixel_y = -23; - req_access_txt = "65" - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) "cPH" = ( /obj/machinery/conveyor_switch{ id = "EngiCargoConveyer" @@ -71738,31 +70568,6 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/central) -"cRc" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/door/airlock/research{ - name = "Aft Observatory"; - req_access_txt = "47" - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) -"cRd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/door/airlock/research{ - name = "Aft Observatory"; - req_access_txt = "47" - }, -/turf/open/floor/plasteel/dark, -/area/science/misc_lab{ - name = "Research Observatory" - }) "cRe" = ( /obj/machinery/computer/upload/ai{ dir = 8 @@ -71863,32 +70668,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) -"cRm" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light, -/obj/effect/turf_decal/stripes/red/full, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/poster/official/cleanliness{ - pixel_y = -32 - }, -/obj/machinery/disposal/bin{ - name = "Corpse Disposal Unit" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) "cRn" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/cable{ @@ -71973,23 +70752,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/medical/morgue) -"cRw" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/item/paper/guides/cogstation/letter_med{ - pixel_y = 4 - }, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) "cVq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72005,6 +70767,13 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engine/atmos) +"dnN" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "dpO" = ( /obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ dir = 4 @@ -72024,6 +70793,14 @@ }, /turf/open/floor/plating, /area/router) +"dSZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/engine/atmos) "dVR" = ( /obj/machinery/atmospherics/pipe/simple/violet/visible, /turf/open/floor/plasteel, @@ -72035,13 +70812,19 @@ }, /turf/open/floor/engine, /area/science/storage) +"ebG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/science/mixing) "eCy" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 }, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ + pixel_x = -25; + pixel_y = 7 + }, /turf/open/floor/plasteel, /area/engine/atmos) "eIh" = ( @@ -72059,6 +70842,10 @@ dir = 1 }, /area/engine/atmos) +"eJy" = ( +/obj/machinery/rnd/experimentor, +/turf/open/floor/engine, +/area/science/explab) "eKM" = ( /obj/machinery/atmospherics/pipe/manifold/supplymain/visible, /turf/open/floor/plasteel, @@ -72141,8 +70928,9 @@ /area/science/mixing) "guK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/lattice, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "gDY" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/cyan/visible, @@ -72213,17 +71001,18 @@ /obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) -"hXk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering{ - name = "Engine Room" - }) "ifC" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/manifold/orange/visible, /turf/open/space/basic, /area/space/nearstation) +"iCa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/science/mixing) "iQY" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ dir = 4 @@ -72249,14 +71038,13 @@ }, /turf/open/space/basic, /area/space/nearstation) -"jMO" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 +"jAv" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) +/turf/open/space/basic, +/area/space/nearstation) "kzb" = ( /obj/machinery/atmospherics/pipe/manifold/orange/hidden{ dir = 4 @@ -72286,15 +71074,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"mkx" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) "mqB" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -72302,6 +71081,10 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"mqE" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) "mxW" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supplymain/visible{ @@ -72309,6 +71092,13 @@ }, /turf/open/space/basic, /area/space/nearstation) +"mDW" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) "mEa" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; @@ -72390,6 +71180,13 @@ /obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel, /area/engine/atmos) +"pMW" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "pZq" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8; @@ -72410,17 +71207,6 @@ /obj/machinery/atmospherics/pipe/simple/supplymain/visible, /turf/open/space/basic, /area/space/nearstation) -"qGi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/closed/wall/r_wall, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) "qHL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/brown/visible{ @@ -72445,22 +71231,6 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/floor/plasteel, /area/engine/atmos) -"rke" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) -"rqk" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/closed/wall/r_wall, -/area/engine/engine_smes{ - name = "Power Monitoring" - }) "rOE" = ( /obj/structure/plasticflaps, /obj/structure/fans/tiny, @@ -72478,8 +71248,8 @@ /turf/open/space/basic, /area/space/nearstation) "rUl" = ( -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -72490,6 +71260,13 @@ }, /turf/open/floor/plating/airless, /area/router/aux) +"stP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/quartermaster/office) "sAm" = ( /obj/structure/plasticflaps, /obj/machinery/door/poddoor{ @@ -72507,6 +71284,10 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel, /area/engine/atmos) +"sSg" = ( +/obj/machinery/rnd/bepis, +/turf/open/floor/engine, +/area/science/explab) "sVC" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -72524,16 +71305,6 @@ }, /turf/open/floor/plating, /area/router) -"tjb" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/engine/engineering{ - name = "Engine Room" - }) "tpQ" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/violet/visible, @@ -72565,8 +71336,8 @@ /turf/open/floor/plasteel, /area/engine/atmos) "tZC" = ( -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -72580,17 +71351,6 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/plasteel/dark, /area/bridge) -"uwK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/secure_construction{ - name = "Engineering Construction Area" - }) "uAY" = ( /obj/structure/table, /obj/item/storage/belt/utility, @@ -72603,6 +71363,14 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"uYy" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating/airless, +/area/space/nearstation) "vcb" = ( /obj/machinery/atmospherics/pipe/simple/brown/visible, /obj/machinery/atmospherics/pipe/simple/green/visible{ @@ -92107,10 +90875,10 @@ bOv bfo blI bfo -bWS -bcw -bcw -bcw +bXg +ebG +ebG +iCa bcy cbu csR @@ -92619,9 +91387,9 @@ boJ fuR bzX bAl -boL +bdf bAG -cnT +bdf boQ cKJ bAP @@ -92874,11 +91642,11 @@ bcy bcy bcy bcy -bcy +bWS bgC bdf boR -bDL +bdf boQ cKJ bAP @@ -92912,10 +91680,10 @@ aaa aaa aaa aaU -cbB -ctY -cvA -cbB +cyX +cGp +cJw +cyX aaU aaU aaU @@ -93131,11 +91899,11 @@ bQe aaU aaU aaU -bcw +boL bdf bdf bpM -bFp +bvj bvj cKK bAU @@ -93169,10 +91937,10 @@ aaa aaa aaa aaU -cbB -cKr -cub -cbB +cyX +cGu +cJA +cyX aaU aaa aaU @@ -93388,7 +92156,7 @@ aye aaU aaU aaU -bcw +bDL cnL bdf bpR @@ -93414,7 +92182,7 @@ cHj cqS cav cav -ccL +ctb caX caX caX @@ -93426,10 +92194,10 @@ aaa aaa aaa aaU -cbB -cKr -cuf -cbB +cyX +cGu +cJB +cyX aaU aaa aaU @@ -93647,8 +92415,8 @@ abp abp bcy biK -bdf -bpR +bFp +cnT bJT bLl cKM @@ -93668,13 +92436,13 @@ aVF caw caA cHk -caP +ccL caT caX -caX +eJy caX cbh -caX +sSg caX cbx cav @@ -93683,10 +92451,10 @@ aaa aaa aaa aaU -cbB -cKr -cub -cbB +cyX +cGu +cJA +cyX aaU aaa aaU @@ -93940,10 +92708,10 @@ aaa aaa aaa aaU -cbB -cKr -cub -cbB +cyX +cGu +cJA +cyX aaU aaa aaU @@ -94197,10 +92965,10 @@ aaa aaa aaa aaU -cbB -cKs -cug -cbB +cyX +cHK +cJK +cyX aaU aaa aaU @@ -94453,12 +93221,12 @@ cav aaa aaa aaU -cbB -cbE -cKt -cuh -cbE -cbB +cyX +cze +cHL +cJL +cze +cyX aaU aaU aaa @@ -94709,14 +93477,14 @@ cav aaU aaU aaU -cbB -cbB -cnj -cKu -cui -clh -cbB -cbB +cyX +cyX +cGj +cHM +cJN +cJv +cyX +cyX aaU aaa aaa @@ -94961,19 +93729,19 @@ cHA cHG cav cav -cbE -cbE -cbE -cbE -cbE -cbE -cle -csW -cKv -cuj -cuq -cus -cbE +cze +cze +cze +cze +cze +cze +cFx +cGk +cHN +cJO +cKr +cKu +cze aaU aaa aaa @@ -95193,20 +93961,20 @@ cDU cDW cDY bgW -bOx +bYr bcy bcw bYs bcw bcy -bYr -cgV -cGi -cGl -cGo -cGp -cGu -cGp +cgK +chm +cks +cld +cmZ +cnM +coY +cnM cGx cGz cHp @@ -95216,21 +93984,21 @@ cHu cHw cHB cHH -cHK -cHM -ckP -ckT -ckT -ckT -ckV -cRc -clg -ctc -cua -cvW -cur -clh -cbB +cyV +cza +czl +czq +czq +czq +cFm +cFq +cFy +cGl +cJl +cJP +cKs +cJv +cyX aaU aaa aaa @@ -95450,16 +94218,16 @@ biA csL cDj cDy -bPl -bXx -bXT bYu -bYA -bYA -bZG -cmV -cGj -cGm +bYY +bZE +cbV +cey +cey +cgL +ciG +ckx +cle bYv bYv cio @@ -95473,21 +94241,21 @@ cHv caG cHC cHI -cHL -cHN -ckQ -ckQ -ckU -ckQ -ckW -cRd -csX -ctP -cuk -cul -cur -clh -cbB +cyW +czb +czm +czm +cEj +czm +cFp +cFw +cFz +cGm +cJo +cJQ +cKs +cJv +cyX aaU aaa aaa @@ -95707,16 +94475,16 @@ biA biA cDj cDy -bWT -bXh -bYa bYw -bYL -bZE -bZE -csP -cGk -cGn +bYZ +bZG +cbY +cez +cfZ +cfZ +cjr +ckP +clg cct bYo ckk @@ -95730,21 +94498,21 @@ bsM cuY bIk bIk -cbB -cbB -cbB -cbB -cbB -cbB -cbB -cbE -ctW -cbD -ctZ -ctZ -cld -cus -cbE +cyX +cyX +cyX +cyX +cyX +cyX +cyX +cze +cGi +cGn +cJp +cJp +cKt +cKu +cze aaU aaa aaa @@ -95964,16 +94732,16 @@ cBt csx cDv bgW -bWU -bXl -bXy +bYA +bZa +cbf bWa -bYc -bXU -bXU +ceA +ccJ +ccJ bWa -bJF -bKv +ckQ +clh bYv bYp bYx @@ -95994,14 +94762,14 @@ aaU aaU aaU aaU -cbB -cbB -ctN -clh -clh -ctN -cbB -cbB +cyX +cyX +cGo +cJv +cJv +cGo +cyX +cyX aaU aaa aaa @@ -96170,11 +94938,11 @@ aUV aYB bbg bcH -bnZ +aYW bqi bIl bcJ -bOY +bod bdr beJ beJ @@ -96221,16 +94989,16 @@ bgW bgW cEb bgW -bWV -bXh -bXA -bXU +bYG +bYZ +cbj +ccJ bpz aaa aaU -bXU -bKs -bKv +ccJ +ckT +clh bYv bYq cPv @@ -96252,12 +95020,12 @@ aaa aaa aaa aaU -cbB -cbE -cbB -cbB -cbE -cbB +cyX +cze +cyX +cyX +cze +cyX aaU aaU aaa @@ -96427,11 +95195,11 @@ bcN aYJ aNL aVJ -aYW +aYX baF bIr bcx -cvZ +bOY bdr beJ beT @@ -96475,19 +95243,19 @@ aVW cDH bbS aUk -bVL -cEc -bXr -bWW -bXh -bXB -bXU +bSv +bWA +bXy +bYL +bYZ +cbB +ccJ bpz aaa aaU -bXU -aJV -brz +ccJ +ckU +clz bYv bTg bYy @@ -96684,11 +95452,11 @@ bcQ aUC aNL aVJ -aYX +bnZ baD bIV bKg -cwa +bVY bdr beJ bfd @@ -96732,19 +95500,19 @@ aWm cDH bcB aTV -bVM -cEd -bWs -bWs -bXh -bXJ -bXU +bSw +bWB +bXA +bXA +bYZ +cbD +ccJ bpz aaa aaU -bXU -bKs -bLG +ccJ +ckT +clA bYv bYv cwb @@ -96989,23 +95757,23 @@ cnu cDI cDT aTV -bQZ -cEd -csO -cEu -bXh -bXK +bUB +bWB +bXB +bYS +bYZ +cbE bWa -bYc -bXU -bXU +ceA +ccJ +ccJ bWa -bKt -bLU -bRM -bRO -bRR -cyt +ckV +clB +cna +cos +cpf +cpi bDT bKd bTi @@ -97246,23 +96014,23 @@ aWm cDH bOt aTV -bIg -cEe -cEs -cEv -cEx -cEA -cEJ -cEM -cEJ -cEJ -cEJ -bKu -bQv -bRN -cEs -bRS -cEN +bVf +bWC +bXD +bYT +bZb +cbJ +ccX +ceB +ccX +ccX +ccX +ckW +clC +cnj +bXD +cph +cpj cEO bIc bRX @@ -97503,23 +96271,23 @@ biP cDH bcC aTV -bIn -bIN -bIO -bIQ -bIR -bIQ -bIQ -bIR -bIQ -bIS -bIQ -bIQ -bQP -cfZ -bWX -bWX -ckf +bVL +bWL +bXJ +bYU +bZc +bYU +bYU +bZc +bYU +cgM +bYU +bYU +cmI +cny +coX +coX +cpq btn bIh bRY @@ -97760,22 +96528,22 @@ aTV bAc brw aTV -bVM -cEf -bWx -aab -bXo -bXQ -bXZ -bYi -bYk +bSw +bWN +bXK +bYX +bZe +cbS +cdf +cfh +cgF bWa bWa -bXU -bXU -bXU -bXU -bXU +ccJ +ccJ +ccJ +ccJ +ccJ bWa bIk bId @@ -98017,9 +96785,9 @@ bfu csu cAS cDV -cDX -cEg -bWx +bVM +bWP +bXK bSE ckR bSE @@ -98275,8 +97043,8 @@ cuQ cpP aTV bVR -cEh -bWy +bWR +bXQ buf bJu bSQ @@ -98531,9 +97299,9 @@ bzz cvM cts aTV -bVM -cEf -bWz +bSw +bWN +bXT bSE bSK bSR @@ -98789,8 +97557,8 @@ cuQ cwe aTV bVS -cEi -cEt +bWT +bXU cEw cEy cEB @@ -99046,8 +97814,8 @@ czf coI aTV bVT -cEj -bWA +bWU +bXZ bSG bSL bSS @@ -99303,7 +98071,7 @@ czz aUk aUk bWa -cEk +bWV bWa bSE bSM @@ -99559,9 +98327,9 @@ bmG cDN bmG aUk -bWr -cEl -bWB +bWb +bWW +bYa bSE bSN bSU @@ -99817,8 +98585,8 @@ cDN bmG aUk bWc -bWo -bWC +bWX +bYc bSE bYV cEC @@ -100073,9 +98841,9 @@ bmG cDN bmG aUk -bWb -cEm -bWL +bWo +bWY +bYi bSE bSP cED @@ -100331,8 +99099,8 @@ cDK aXt bwm bWa -cEn -bWR +bXa +bYk bSH bSG cij @@ -101379,14 +100147,14 @@ bPP bQa cEY cqW -bJg -bQl -bYG -cFw -bpa -bQn -bQC -cmZ +cqf +csO +ctY +cuj +cvA +cxd +cBs +cEm cpz cvs cwg @@ -101636,14 +100404,14 @@ buS bFX cEZ bAs -ayY -baT -baT -cFx -bpb -bqO -bru -coY +cqh +csP +csP +cuk +cvB +cxs +cBC +cEn cpz bMr cwh @@ -101893,14 +100661,14 @@ cPR bFJ cFa cFk -cFl -cFp -cFp -cFy -bbt -bqP -brO -bQB +cqm +csQ +csQ +cul +cvC +cyt +cDX +cEs ctD bMs bMA @@ -102150,14 +100918,14 @@ cPS czD cFb bEl -bJn -bQm -cbf -bop -bpe -bQz -bXD -cna +cqP +csS +ctZ +cuq +cvD +czK +cEc +cEt cvo cvO cwi @@ -102407,14 +101175,14 @@ cPT czE cFc bEl -aJD -bbx -bbZ -boq -bpg -bpg -bAy -bQJ +crl +csW +cua +cur +cvE +cvE +cEd +cEu cpz bMu bMC @@ -102534,7 +101302,7 @@ aaa aaa aaa abp -akN +aaa aTd aaa abp @@ -102664,14 +101432,14 @@ buS cFs cEX bIU -aJE -bbz -bjx -bot -bot -bjx -bAH -cRm +crs +csX +cub +cus +cus +cub +cEe +cEv cpz cvs cwj @@ -102921,14 +101689,14 @@ buS cnz cEZ bJa -aKZ -bbB -blv -czK -bph -bqR -bAM -cvx +crv +ctc +cuf +cux +cvF +cAU +cEf +cEx bMk bMw bMD @@ -103178,14 +101946,14 @@ crg cvR cFd bEl -aMm -bbC -blw -blw -blw -blw -bAT -cez +crw +ctN +cug +cug +cug +cug +cEg +cEA bMl bMv bMv @@ -103435,14 +102203,14 @@ bqz cKH cFe cFk -cFm -cFq -cRw -cFz -bqt -blx -bBn -ceA +crx +ctP +cuh +cvx +cvW +cBd +cEh +cEJ bMl bMw bMv @@ -103615,15 +102383,15 @@ aGe aDM aUK aGe -alZ -alZ -alZ -alZ -aHU -aHU -alZ -alZ -alZ +axQ +axQ +axQ +axQ +aMm +aMm +axQ +axQ +axQ aSt aSt aSt @@ -103657,14 +102425,14 @@ bqX bSt bqX aaU -cgI -cgN -cgN -cgN -cgN +bhl +biH +biH +biH +biH aPg aPg -cgP +bJn aaU aaU aaU @@ -103692,14 +102460,14 @@ crn cxf cFf bEl -aOF -bbE -coX -bbE -bbE -bqS -bQy -ceB +csC +ctW +cui +ctW +ctW +cBk +cEi +cEM bMn bMv bMv @@ -103872,16 +102640,16 @@ aWt aWz aWW aIc -alZ -alZ -aog -aog -axV -axV -aog -aog -alZ -bvv +axQ +axQ +ayK +ayK +aFU +aFU +ayK +ayK +axQ +aPe aUh cjM aVv @@ -103913,15 +102681,15 @@ ajO aRy bSO aRy -bfh -cgJ -bye -cmI -bXa -bfh -bfh -bfh -cgJ +bey +bhZ +bkt +bnS +bph +bey +bey +bey +bhZ aaU aaa aaa @@ -104129,16 +102897,16 @@ aDM aDM aXa bdb -alZ -aog -apB -aFc -bfj -axV -axV -apB -aog -alZ +axQ +ayK +ayY +aHV +aJV +aFU +aFU +ayY +ayK +axQ aUh aUP bCC @@ -104170,15 +102938,15 @@ beu beK bTX bWI -bWN -cbj -cdf -cny -bXk -cgL -cvD -cvF -cgJ +beH +bij +bkz +bnT +bpK +bye +bBS +bGv +bhZ aaU aaa aaa @@ -104386,16 +103154,16 @@ cCf aHG aXb aVC -alZ -aog -apG +axQ +ayK aFN -axV -aLO -axV -aRL -aog -alZ +aJD +aFU +aOF +aFU +aPc +ayK +axQ aUh aUQ aVM @@ -104427,16 +103195,16 @@ ajO aRy bUi aRy -bfh -bfh -cdh +bey +bey +bkJ +bkW +bpL bzN -bYT -bYS -cvE -bYS -cgJ -bfh +bCa +bzN +bhZ +bey aaU aaU aaU @@ -104643,16 +103411,16 @@ bbQ aWA aXd bre -alZ -apB -axV -aGp -axV -csC -axV -axV -apB -alZ +axQ +ayY +aFU +aJE +aFU +aOJ +aFU +aFU +ayY +axQ aSt aSt cho @@ -104684,20 +103452,20 @@ ajO bQb cnR cJt -bfh -brb -bzN -bzN -bYU -cgM -bYY -bZb -cgJ -bfh -bfh -bfh -bfh -bfh +bey +bil +bkW +bkW +bpN +bzR +bCb +bGK +bhZ +bey +bey +bey +bey +bey brs brs bcT @@ -104879,37 +103647,37 @@ auZ aBL bnH axh -anq -anq -anq -anq -anq -anq -anq -anq +abF +abF +abF +abF +abF +abF +abF +abF bID aHu aGr -aOJ -aOT -aOT -aOT -aOU -aOU -aOT -aXP -aOT -aOT -aOJ +aof aog -axV -bfj -axV -axV -axV -axV aog -aSG +aog +aoL +aoL +aog +avU +aog +aog +aof +ayK +aFU +aJV +aFU +aFU +aFU +aFU +ayK +aPh aRh aRq aRq @@ -104941,20 +103709,20 @@ bPU bQi bUU cNC -bWP -cbV -bzR -cvB +beI +biw +blv +bof +bpV +bAy +bCW +bGP +bJF bOz -cwd -bYZ -bZc -cgQ -bZe -bZe -bZe -bZe -cjr +bOz +bOz +bOz +bSo brL brL bVW @@ -105135,38 +103903,38 @@ awc axx ayN aAA -aBM -aCq -aDx -apy -arV -apy -axg -ceu +aab +abJ +acz +aej +agC +aej +alZ anq +abF bID aHu aGr -aOT -aPS -aSb -aTi -aUd -aTi -aWs -aYb -ban -bdd -aOJ aog +apm +aqU +asa +asK +asa +avC +avV +ayo +aBM +aof ayK -bfk -axV -axV -bfj -axV -apB -aSH +aGp +aKZ +aFU +aFU +aJV +aFU +ayY +aPm aSt aSt aTs @@ -105197,21 +103965,21 @@ cRf bPV bQT bVq -cPG -bfh -cbY -cdn -cpf -bYU -cgM -bYY -bRx -cgJ -bfh -bfh -bfh -bfh -bfh +bdL +bey +biE +blw +boi +bpN +bzR +bCb +bIg +bhZ +bey +bey +bey +bey +bey brs brs bcT @@ -105393,37 +104161,37 @@ aeY aBN awN awN -anq -anT -anT -anT -anT -anT -anT -cex +abF +acA +acA +acA +acA +acA +acA +anL bNp aFC aFF -aOU -aQt -aSf -aTj -aTv -aTv -aTv -aYi -baU -bdh -aOJ -bdE -aog -axV -aHV -aRr -axV -aog -aog -aSH +aoL +apy +arB +asi +ast +ast +ast +awa +azg +aCq +aof +azh +ayK +aFU +aNH +aOM +aFU +ayK +ayK +aPm aZz aaU aaU @@ -105455,16 +104223,16 @@ ajO aRy bVC cRh -bfh -bfh -bBR -cqf -bYX -bYS -cvE -bYS -cgJ -bfh +bey +bey +blx +bop +bqt +bzN +bCa +bzN +bhZ +bey aaU aaU aaU @@ -105650,37 +104418,37 @@ aeY aCk aeY aeY -anq -aof -cpq -asa -aoL -anT -anT -cey +abF +acK +aeI +aci +adc +acA +acA +anP bRF aFC aFF -aOU -aQu -aSf -aTv -aTv -aTv -aTv -aYj -ban -bdl -aOJ -alZ -apB -aog -aog -aog -aog -apB -alZ -aSH +aoL +apz +arB +ast +ast +ast +ast +awe +ayo +aCZ +aof +axQ +ayY +ayK +ayK +ayK +ayK +ayY +axQ +aPm aaa aaa aaa @@ -105712,15 +104480,15 @@ bht bcY cyd cRs -cgF bfh +bey +blD +boq +bpK +bAH bBS -cqh -bXk -cvC -cvD -cvF -cgJ +bGv +bhZ aaU aaa aaa @@ -105907,37 +104675,37 @@ akS aCo aor aeY -anI -aoL +abZ +adc +acA +aci +akN +ang +ang anT -asa -bEz -bES -bES -bGv ccg aFC ago -aOT -aQz -aSf -aTw -aTv -aTv -aTv -aYM -bbi -aOT -aOT -aOJ -aOJ -aOJ -bmF -bnT -bnT -aRJ -aRJ -chm +aog +apB +arB +asv +ast +ast +ast +aws +azo +aog +aog +aof +aof +aof +aOc +aOE +aOE +aPd +aPd +aPN aaU aaU aaU @@ -105969,15 +104737,15 @@ bmM bcZ bVF bTS -cgG -bfh -bEo -cqm -bZa -bfh -bfh -bfh -cgJ +bfj +bey +blZ +bot +bqO +bey +bey +bey +bhZ aaU aaa aaa @@ -106164,34 +104932,34 @@ akU aCp aor aeY +acf +adL +acA +acA +acA +acA +acA anL -aoU -anT -anT -anT -anT -anT -cex bRF aFC aFF -aOU -aQB -aSf -aTv -aTv -aUU -aTv -aYj -ban -bdO -bfv -bfv -bfv -bkW -bmJ -bnS -bof +aoL +apG +arB +ast +ast +atb +ast +awe +ayo +aDx +aHL +aHL +aHL +aNx +aOd +aOQ +aOX aQJ aQJ aQJ @@ -106226,15 +104994,15 @@ ajO bdi bWm cjI -cgH -cgN -cgO -cgN -cgN -cgN +bfk +biH +bmF +biH +biH +biH aPg aPg -cgK +bKs aaU aTx ctG @@ -106421,34 +105189,34 @@ akV aqv aor aeY -anP -aqP -apz -asK -apz -btk -cev -anq +aci +adR +agc +agT +agc +anh +anE +abF ccq aFC aFF -aOU -aQI -aSf -aTv -aTv -aTv -aTv -aZa -bbi -aOT -bfy -bgJ -bjL -blD -bmK -boi -bsx +aoL +aqc +arB +ast +ast +ast +ast +awA +azo +aog +aHU +aKp +aMK +aND +aOk +aOR +aOY aaU aaU aaU @@ -106678,33 +105446,33 @@ aeY aeY aeY aeY -anq -anq -anq -anq -anq -anq -anq -anq +abF +abF +abF +abF +abF +abF +abF +abF ccz aHv aFF +aog +aqn +arB +ast +ast +ast +ast +awW +azE +aEZ +aEZ +aLs +aEZ +aof +aOl aOT -aQP -aSf -aTv -aTv -aTv -aTv -aZc -bbH -bdP -bdP -bgR -bdP -aOJ -aPN -bes aaU bQe aye @@ -106946,22 +105714,22 @@ aff cfe aIk aIU -aOX -aQQ -aSf -aTv -aTv -aUW -aTv -aZc -aVf -bdP -bfF -bha -bdP -aOJ -aPN -bes +aoU +aqO +arB +ast +ast +auC +ast +awW +auN +aEZ +aIf +aLF +aEZ +aof +aOl +aOT aaU aye aaU @@ -106997,17 +105765,17 @@ cgD cdV chy chN -bWQ +uYy bWQ cdo aPg aPg cet -bpL -bpL -rqk -bBO -bBO +bEo +bEo +bKt +bPl +bPl ctG ctG cvr @@ -107203,22 +105971,22 @@ ahz bRF aEu aJc -aPa -aQR -aSz -aTz -aTz -aVb -aTz -aZg -aVf -bdW -bfJ -bhc -bdP -aOJ -aPN -bes +apd +aqP +arF +asw +asw +auD +asw +awX +auN +aFc +aIN +aLO +aEZ +aof +aOl +aOT aaU aye aaU @@ -107260,11 +106028,11 @@ ckJ cdV cdV cdV -bpN -bCa -bSp -bSv -cfl +bEr +bIn +bKu +bPv +bQB ctX cuU cwr @@ -107460,22 +106228,22 @@ bGw chQ cAV aJc -aOT -aQX -aSE -aTC -aUe -aVf -aVf -aSE -bcd -bdY -bfM -bhg -bdP -aOJ -aPN -bey +aog +aqS +arN +asx +asM +auN +auN +arN +aAy +aGH +aKj +aMa +aEZ +aof +aOl +aOU aaU aye aaU @@ -107517,11 +106285,11 @@ clY cnx cpK cdV -bBE -bCa -bSp -bSw -cfl +bEz +bIn +bKu +bQl +bQB cuu cuV cwE @@ -107542,9 +106310,9 @@ bum cyU czd czj -blp -blp -bme +bui +bui +buo bxj bxj bxj @@ -107717,22 +106485,22 @@ ahz aAj cAW aJC +aog +aqT +aog +aog +aog +aoL +aoL +aog +aog +aEZ +aEZ +aMz +aEZ +aof +aOl aOT -aRc -aOT -aOT -aOT -aOU -aOU -aOT -aOT -bdP -bdP -bhl -bdP -aOJ -aPN -bes aaU bQe aye @@ -107774,11 +106542,11 @@ cmf cnK cnK cdV -rke -bUB -bSq -bVf -cfm +bEK +bIN +bKv +bQm +bQC cuw cuV cuV @@ -107789,19 +106557,19 @@ bdH cIM coi bZh +cdh bZh -bZh -bZh -bZh +cdh +cdh bsZ bsZ bsZ bxj byU czk -blp -coy -cdd +bui +cgQ +cmz aYp aaa aaa @@ -107987,9 +106755,9 @@ aaU aaU cuA cuy -blD -bcO -bes +aND +aOq +aOT aaU aaa aaa @@ -108031,11 +106799,11 @@ cmg cof cof cpY -cwq -cwV -cAU -cfh -cos +bES +bIO +bLG +bQn +bQJ cuF cva cyp @@ -108056,9 +106824,9 @@ aaU bxj byU czk -blp -ctH -cdd +bui +cgV +cmz csc aaa aaa @@ -108244,9 +107012,9 @@ aaa aaa aaa aaU -aQq -aPR -cux +aNQ +aOx +aOV aaU aaa aaa @@ -108288,17 +107056,17 @@ cmE cok cok cdV -rke -bPv -cBd -cfi -cfm +bEK +bIQ +bLU +bQv +bQC cuH cvb cvd cvd cNa -cNp +ctE ber cIQ cgB @@ -108313,9 +107081,9 @@ aaU bxj byU czk -blp -cqT -cdd +bui +cju +cmz aYp aaa aaa @@ -108501,9 +107269,9 @@ aaa aaa aaa aaU -aQq -aQp -cux +aNQ +aOC +aOV aaU aaa aaa @@ -108539,23 +107307,23 @@ chj aXF chD cid -cju +bfM ckz cmG coT cpL cpZ -qGi -cxd -cBd -cfj -cfl +bFg +bIR +bLU +bQy +bQB cuI cuV cyv cuV cNb -cNq +cvZ beW cIM cgB @@ -108567,15 +107335,15 @@ aaa aaU aaU aaU -blp -btK -czl -blp -cqU -bBZ -bme -bme -bme +bui +bPE +bPT +bui +ckc +cmV +buo +buo +buo aaa aaa aaa @@ -108802,11 +107570,11 @@ cmY cdV cdV cdV -qGi -bSm -cBk -cfk -cfl +bFg +bIS +bNo +bQz +bQB cuJ cvc cyz @@ -108821,19 +107589,19 @@ bzY aaU aaa aaa -blp -bme -bme -blp -btL -czm -bzq bui -clZ buo buo -bme -bme +bui +bPF +bQd +cfl +cfy +cmX +cnH +cnH +buo +buo aaa aaa aaa @@ -109043,27 +107811,27 @@ cer cew ceM ceV -asU -arB -asw -atb -avl -aMa -crv -aOE -aQc -clz -aMa -aQd -cks -crv -crx -aeI -rke -bSn -cBl -bSn -cfl +aQz +aQR +aSb +aTi +aTW +aUW +aZa +bbC +bcF +bdO +aUW +bjq +bmJ +aZa +bqP +aQC +bEK +bJg +bOx +bJg +bQB cuK cuV cyz @@ -109078,28 +107846,28 @@ bBl aaU aaa aaa -bme -bnY -bpT -bqL -btL -czn -czy -bui -bui -bui -bui -bui -bme -bme -bme -bme -bme -bme -bme -cnG -bme -bOo +buo +bBw +bNJ +bNY +bPF +bQr +cfm +cfy +cfy +cfy +cfy +cfy +buo +buo +buo +buo +buo +buo +buo +czr +buo +cEN aaa aaa aaa @@ -109300,27 +108068,27 @@ ces ces ceN ceW -cJv -mkx -cJw -cJN -asR -awe -asS -asS -asS -asS -avC -aQe -ckx -cqP -crl -csQ +aQB +aQT +aSf +aTj +aUe +aXP +aUf +aUf +aUf +aUf +bgJ +blp +bmK +bov +bqR +bAM cqs cqG crt cdm -ctl +cmT cuL cvd cAp @@ -109335,28 +108103,28 @@ bBl aaU aaU aaU -bme -bog -bpT -bqM -btL -czm -bui -cOw -bui -bui -bui -bui -bui -bui -bui -bNW -bOa -bOe -bOi -cnd -bOl -cnH +buo +bBM +bNQ +bNZ +bPF +bQd +cfy +ckf +cfy +cfy +cfy +cfy +cfy +cfy +cfy +cwq +cyY +czc +czn +czs +cEk +cFl aaa aaa aaa @@ -109557,27 +108325,27 @@ cdt cdt ceO ceX -aeI -aQx -asD -asR -asR -avE -avQ -avQ -avQ -avQ -bem -aQe -asR -aSK +aQC +aQX aSr -aeI +aUe +aUe +aYb +bbi +bbi +bbi +bbi +bgR +blp +aUe +bow +bqS +aQC bxz bwP cBn cBH -ctE +ctl cuM cvg cBa @@ -109592,28 +108360,28 @@ bIo aaU cNK aaU -bme -bom -bpT -bqU -btL -czo -bPO -bPT -bQd -bQd -bQr -bJo -bNQ -bNQ -bNQ -bNX +buo +bBZ +bNJ bOa -bOe -bOg -bui -cnf -bme +bPF +bQs +cgG +cko +cnc +cnc +coq +cqU +ctV +ctV +ctV +cwV +cyY +czc +czo +cfy +cma +buo aaa aaa aaa @@ -109814,22 +108582,22 @@ aaU cdt ceP ceK -aeI -arN -arF -asS -auC -avH -axM -axM -axM -axM -aPh -aQk -asS -aSK -aTW -aVB +aQC +aRc +aSz +aUf +aVb +aYi +bbt +bbt +bbt +bbt +bha +bme +aUf +bow +brb +bAR cqu bwR cBx @@ -109849,28 +108617,28 @@ bBl aaU bIm aaU -blp -bme -bme -brv -btL -czp -bAW -bBm bui -bui -bQs -bNH -bme -bme -bme -bme +buo +buo bOb -bme -bOh -cne -bOm -cnH +bPF +bUx +cgH +ckF +cfy +cfy +cor +crj +buo +buo +buo +buo +cyZ +buo +czp +czy +cEl +cFl aaa aaa aaa @@ -110047,10 +108815,10 @@ bka bmV bka bps -ang -ang -ang -ang +aPa +aPa +aPa +aPa cuB aWj aaU @@ -110067,26 +108835,26 @@ aTl qeq bPh guK -hXk -hXk -cJp -hXk -hXk -tjb -asx -asS -auD -awX -axQ -beH -axQ -aZt -avI -beI -asS -aSL -aTZ -aWV +aPP +aPP +aQp +aPP +aPP +aRp +aSE +aUf +aVf +aYj +bbx +bcD +bbx +bes +bhc +bmf +aUf +boB +bru +bAT cqv bwV cBy @@ -110106,28 +108874,28 @@ bzr byT cfc bcT -bmf -bon -bpU -brN -btL -czq -bme -bBm +bvb +bCA +bNR +bOe +bPF +ccx +buo +ckF +cfy +cfy +coy bui -bui -ctV -blp -bme +buo aaU aaU aaU aaU -bme -bme -bme -bme -bme +buo +buo +buo +buo +buo aaa aaa aaa @@ -110304,10 +109072,10 @@ bka bnb boV bpt -aRF -cog -bnt -ang +aRj +aTm +aTz +aPa cuC cuD cuD @@ -110323,27 +109091,27 @@ cuD cuG eUF bsz -aej -agc -agT -bFg -apm -aqS -arP -cph -asS -auN -avK -axR -aAy -aOk -aOR -aPm -aPm -bBo -aTm -aUb -bAR +aPO +aPR +aQd +aQq +aQu +aQI +aRr +aSG +aUf +aVB +aZc +bbz +bcO +bdY +bfn +bjx +bjx +bnO +boD +brz +bBn bnf bwR cBx @@ -110363,18 +109131,18 @@ cyr cyx cyr cyr -cyD -cyJ -cyJ -cyV -cze -czr -bme -bBm -bui -bui -bJq -bme +bzq +bHt +bHt +bOg +bPG +ccK +buo +ckF +cfy +cfy +cpy +buo aaa aaa aaa @@ -110561,10 +109329,10 @@ bms bnd boX bpH -ang -coh -cfy -bvb +aPa +aTv +aTZ +aUd aRu aSv aSy @@ -110581,26 +109349,26 @@ aVK cxa bPr sVC -aNH -bEr -cJA -aqO -anE -anE -anE -aQT -ayb -axt -aCZ -aRG -aOl -aOV -bSo -cmX -aRp -bkJ -aUf -ciG +aPS +aQe +aQs +aQx +aQP +aQP +aQP +aUr +aWs +aZg +bbE +bdd +bei +bfv +bjL +bmT +bnY +boE +brO +bBo bnp cmO cfU @@ -110620,18 +109388,18 @@ cys baN baN baN -coq -box -box -cyW +bAW +bJo +bJo +bOh +bPH +cdd +cgI +clH +cnd +cog cpy -bPD -bAY -bBw -bCA -cql -bJq -bNI +crU aaa aaa aaa @@ -110818,10 +109586,10 @@ bka bno boZ bpJ -apd -bfI -clH -ang +aRF +aTw +aUb +aPa aRX aSw aSM @@ -110837,27 +109605,27 @@ aSu aYU cxb bsz -aej -agC -bEK -cJB -apm -aqT -arQ -cpi -asS -aTQ -avU -ayn -aFU -aOq -aOY aPO -aPO -bCW -bvY -asB -bAR +aQc +aQk +aQt +aQu +aQQ +aRG +aSH +aUf +aWV +aZt +bbH +bdh +bem +bfy +bkf +bkf +bog +boF +bsx +bBn bnq bEW bQF @@ -110877,18 +109645,18 @@ bzI bHn bzI bzI -cor -boy -boy -cyX -btO -bPE -bme -bBm -ccx -bui +bAY bJq -bme +bJq +bOi +bPI +cdn +buo +ckF +cne +cfy +cpy +buo aaa aaa aaa @@ -111075,10 +109843,10 @@ bka bnw bka brA -ang -ang -ang -ang +aPa +aPa +aPa +aPa aaU aaU aaU @@ -111100,21 +109868,21 @@ atF cJC atF atF -arO -asC -asS -auY -azE -ayo -bCb -ayo -bei -avV -aQs -asS -bwJ -bfn -aXh +aRJ +aSK +aUf +aWX +ban +bbZ +bdl +bbZ +bfF +bkp +bni +aUf +bpa +btk +bBE cqw bSx bQG @@ -111134,28 +109902,28 @@ bzU bzV cuo bcT -bnO -boz -bqp -cyY -btL +bBa +bJR +bNW +bOj bPF -bme -bBm -ccx +ceu +buo +ckF +cne +cfy +cql bui -crj -blp -bme +buo aaU aaU aaU aaU -bme -bme -bme -bme -bme +buo +buo +buo +buo +buo aaa aaa aaa @@ -111357,21 +110125,21 @@ ciT cJD cmu atF -arY -awW -asS -avc -awa -clA -aLF -axM -axM -aPP -crs -asS -cpj -aUr -bmT +aRL +aSL +aUf +aXh +baT +bcd +bdP +bbt +bbt +bkq +bnn +aUf +bpb +bvv +bBO cqx bwP bQH @@ -111391,28 +110159,28 @@ bIp aaU bIx aaU -blp -bme -bme -cyZ -btL -bPG -bBa -bBm -ccx bui -bJR -bNJ -bme -bme -bme -bme -bOb -bme -bOi -bOj +buo +buo bOl -cnH +bPF +cev +cgJ +ckF +cne +cfy +cqT +ctH +buo +buo +buo +buo +cyZ +buo +czn +cBl +cEk +cFl cnE aaa aaa @@ -111576,11 +110344,11 @@ aRT cBS cBU cBY -aqn -acK -acK -acK -aqn +asB +arP +arP +arP +asB aaa aaa aVs @@ -111614,21 +110382,21 @@ ciU cJE cJG cJI -cJK -cJL -cJO -asR -aOQ -bev -cbJ -aOx -aPc -beq -aQe -asR -crw +aRR +aST aUt -bpK +aUe +baU +bcu +bdW +beq +bfI +bkr +blp +aUe +bpe +bvY +bBR cqy bEW bQF @@ -111648,28 +110416,28 @@ bQR aaU cNL aaU -bme -bpi -bpT -cza -btL -bPH -bBc -bBM -ccx -bui -bui -bJR -bNR -bNR -bNR -bNY -bOa -bOe -bOg -bui -cnf -bme +buo +bNH +bNX +bOm +bPF +cex +cgN +clZ +cne +cfy +cfy +cqT +cwd +cwd +cwd +cyD +cyY +czc +czo +cfy +cma +buo aaa aaa aaa @@ -111833,11 +110601,11 @@ aXn cBM bDY bEd -aqn -cCd -aRE -aSY -acK +asB +auR +avE +axg +arP aaa aaa aaa @@ -111871,21 +110639,21 @@ cmh cmp atF atF -asi -asi -cJP -asR -awe -clB -asS -asS -aPd -avC -aQe -aRR -cpj -aSr -aeI +aRV +aRV +aTC +aUe +aXP +bcv +aUf +aUf +bfJ +bgJ +blp +bny +bpb +bqS +aQC bQq cqI bQM @@ -111905,28 +110673,28 @@ bIp aaU aaU aaU -bme -bog -bpT -czb -btL -bPI -bUx -bUx -ccK -cOw -bui -bui -bui -bui -bui -bNZ -bOa -bOe -bOh -cnc -bOm -cnH +buo +bBM +bNJ +bOo +bPF +cfi +cgO +cgO +cnf +ckf +cfy +cfy +cfy +cfy +cfy +cyJ +cyY +czc +czp +cBr +cEl +cFl aaa aaa aaa @@ -112088,12 +110856,12 @@ aql aCe aYK aDr -aci -aqn -aqn -aRj -aND -aVX +arO +asB +asB +auY +avw +axt anK anK aHA @@ -112128,21 +110896,21 @@ aus aus cmw atF -asv -asN -cJQ -avA -azh -aOd -aOM -aOC -aPe -clC +aRY +aTc +aTQ +aUU +aYM +bbB +bcE +bdE +bev +bhg +bks +bnQ +bpg +bwJ aQC -aRV -cJl -cko -aeI bpv cqJ cdg @@ -112162,28 +110930,28 @@ bIp aaU aaa aaa -bme -bpj -bpT -czc -cze -czs -czy -bui -bui -bui -bui -bui -bme -bme -bme -bme -bme -bme -bme -cnG -bme -bOo +buo +bNI +bNJ +bPD +bPG +cfj +cfm +cfy +cfy +cfy +cfy +cfy +buo +buo +buo +buo +buo +buo +buo +czr +buo +cEN aaa aaa aaa @@ -112345,12 +111113,12 @@ aka aLU aNE aRd -acK -aHL -aIN -aMK -aOc -aSA +arP +asC +asN +avc +avH +axM aTo aTt aTJ @@ -112385,13 +111153,13 @@ cmi cmq aus atF -aqU -asG -cJR -aws -aqU -aqU -aMz +aYL +bkT +cfw +cJM +aYL +aYL +cKb chE cie cjK @@ -112419,19 +111187,19 @@ bUn aaU aaa aaa -blp -bme -bme -blp -btL -bPH -bBe bui -cma -bHt -bHt -bme -bme +buo +buo +bui +bPF +cex +cgP +cfy +cnG +coh +coh +buo +buo aaa aaa aaa @@ -112602,12 +111370,12 @@ aKf aMb aPl aRf -adR -arX -aKj -aVy -aRx -aSF +arQ +asD +asR +avl +avI +axR aTr arH aVa @@ -112642,13 +111410,13 @@ cmj cmr cmx atF -cfv -asI -cJS -clx -awA -chl -aNx +bap +bdk +cfx +cJR +cJU +cJY +cKc chF cir cjL @@ -112679,15 +111447,15 @@ aaa aaU aaU aaU -blp -cmy -cmz -blp -cqU -blp -bme -bme -bme +bui +bPO +cfk +bui +ckc +bui +buo +buo +buo aaa aaa aaa @@ -112859,12 +111627,12 @@ aKf aMb aPx aLj -anh -azo -aKp -aND -aND -aWH +arV +asG +asS +avw +avw +axV aHx asc aWn @@ -112899,13 +111667,13 @@ cmk cms aus atF -ast -asI -cJT +bcI +bdk +cfL +cJS +cJW cJZ -cKa -cKb -cKc +cKv chG ciD cjU @@ -112924,7 +111692,7 @@ ciL cLr cwQ bPx -bod +cwa beW bXX cIM @@ -112939,9 +111707,9 @@ aaU bxw bza bMQ -blp -cnf -cdd +bui +cma +cmz aYp aaa aaa @@ -113116,12 +111884,12 @@ aKm aMc aPx aRg -aGH -aIf -aLs -aRA -bkT -aWJ +arX +asI +asU +avA +avK +ayb aHz btb aWn @@ -113156,17 +111924,17 @@ aus aus aus atF -asI -asI -cJU -avw -bRd -azg -aNQ +bdk +bdk +chl +cJT +cJX +cKa +cLZ chI ciH cjX -ckF +bnt cns cpo cpT @@ -113181,7 +111949,7 @@ con coo cwR bPy -bVY +cNm bWn bYO cJc @@ -113196,9 +111964,9 @@ bpP cro bza bMQ -blp -ctH -cdd +bui +cgV +cmz csc aaa aaa @@ -113366,19 +112134,19 @@ arv aub azS aBG -aEZ +anI aFS aHd aKr aMf aPy aRi -aqc -aqn -aci -aci -aci -aXQ +arY +asB +arO +arO +arO +ayn aHy bDc aWw @@ -113413,13 +112181,13 @@ atF atF atF atF -aqU -asM -cfL -aqU -aqU -aqU -aqU +aYL +bmm +clx +aYL +aYL +aYL +aYL chK chK ckm @@ -113453,9 +112221,9 @@ bYe bHL bYt bYD -blp -crU -cdd +bui +cmy +cmz aYp aaa aaa @@ -113634,7 +112402,7 @@ aPx aTN avm aVH -aWX +avQ aZF anK aHz @@ -113667,13 +112435,13 @@ bRn qlJ qlJ bcG +aRx +aSA +aVX +bgw +bsX cmt -auR -aYL -cfw -bap -cJW -bcI +aRA bbF bbN bbN @@ -113700,20 +112468,20 @@ bie bZl cqQ bqD -cBr -aRY -bcE -aRY -aRY +bom +boy +bqp +boy +boy btz cOe btB btB btA -blp -blp -blp -blp +bui +bui +bui +bui aaU aaU aaU @@ -113924,13 +112692,13 @@ bsT bRo bRp anr -bcI -bgw -bgw -bgw -bdk -cJX -bcI +aRA +aSF +aSF +aSF +bRd +cwy +aRA bbJ bbF bbN @@ -113957,11 +112725,11 @@ bdH bWO cqR bqE -cBr -aST -bcF -ckc -bnQ +bom +boz +bqL +brv +bBc btA bMQ bta @@ -114181,13 +112949,13 @@ aaa aaa bsz cJx -cJF +aRE +aSY +aWH +bhm bRA -cJJ -bsX -cJM -cJY -bcI +cCd +aRA bbJ bbL bbN @@ -114214,11 +112982,11 @@ cvN bjm bXX bqD -cBs -aTc -bdL -biE -bpV +bon +bpi +bqM +brN +bBe bLZ bNt bta @@ -114438,13 +113206,13 @@ aaa aaa bsz anr -bcI -bgw +aRA +aSF +aWJ +aSF bUX -bgw -uwK -bhm -bcI +cJF +aRA bbL bbN bbN @@ -114471,11 +113239,11 @@ bdI cNx bXX bqD -cBr -bcu -csS -biH -bnQ +bom +bpj +bqU +btK +bBc btB bNV bta @@ -114695,13 +113463,13 @@ aaa aaa bsz anr -bcI +aRA +aVy aXp -bVb -cfx bhs -bmm -bcI +bVb +cJJ +aRA aaU aaa aaa @@ -114728,11 +113496,11 @@ cIC bjm bXX bqD -cBC -bcv -bdL -bkf -bWY +box +bpT +bqM +btL +bBm btC bPm bta @@ -114952,13 +113720,13 @@ aaa aaa bsz anr -bcI -bcI -cwy -bcI -jMO -bcI -bcI +aRA +aRA +aXQ +aRA +cfv +aRA +aRA aaU aaa aaa @@ -114985,11 +113753,11 @@ bBU bnN crc buw -aRY -bcD -bcF -bkz -bnQ +boy +bpU +bqL +btO +bBc btD bPm bxH @@ -115242,11 +114010,11 @@ bgf bez cxB bhf -aRY -aRY -aRY -aRY -aRY +boy +boy +boy +boy +boy btz bPn btE @@ -115498,7 +114266,7 @@ ckq bgf beB cxC -bgq +stP cjA biy bjN @@ -118577,14 +117345,14 @@ cgn cje blb blR -bni +bWr bcA bdM bdM cNA bhb ciE -cmT +cNp cnB csh cHV @@ -118834,7 +117602,7 @@ chd cki ctt blS -bnn +bWs bcA bdM bdM @@ -119091,7 +117859,7 @@ bjo bkk ctx blV -bny +bWx bdK bma bfR @@ -119348,7 +118116,7 @@ bgT bgT ctA bgV -bgV +bWy bgT bgV boM @@ -119605,7 +118373,7 @@ cgE bkl ctB blW -cxs +bWz bos bgV boN @@ -120098,7 +118866,7 @@ bNE cww cpO bYP -cRg +cMI cMH cww cMb @@ -120114,7 +118882,7 @@ bAv bPW cBz bUM -ccX +bQP chf ckO ckO @@ -120371,13 +119139,13 @@ bff bfC bff bfC -bij +bQZ bhK bkn cnw bkn bhK -bov +bXh bgV boI boW @@ -120628,13 +119396,13 @@ aaU aaa aaU bgT -bhZ +bkn bhK bkn bkn bkn bhK -bow +bXk bgT boP boY @@ -120875,7 +119643,7 @@ chn eCy chL cMv -cMI +cMJ anr aaa aaa @@ -120885,13 +119653,13 @@ aaU aaU aaU bgV -bhZ +bRx bhK -bkp +bRO bhK -blZ +bSp bhK -boB +bXl bgV boI boI @@ -121132,7 +119900,7 @@ chp chx chM gDY -jiZ +mqE anr aaa aaa @@ -121142,13 +119910,13 @@ aaU aaa aaU bgT -bil -bjq -bkq +bRM +bRN +bRR bld -biw +bSq bld -boB +bXl bgV aaU boI @@ -121386,7 +120154,7 @@ uVD mqB dpO tZC -qWY +cwB rUl cMw cfs @@ -121401,11 +120169,11 @@ aaU bgT bgT bjr -bkr +bRS ble xxP bnC -boD +bXo bgT aaa aaa @@ -121658,11 +120426,11 @@ aaU aaa aaa bgT -bks +bSm blg bgT cgm -boE +bXr bgT aaa aaa @@ -121900,8 +120668,8 @@ sRD nAF cgz cJH -cwB -cMl +qWY +cJH cMx cMJ cxc @@ -121915,11 +120683,11 @@ aaU aaa aaa bgT -bkt +bSn blh bgT blh -boF +bXx bgT aaa aaa @@ -122617,7 +121385,7 @@ amV aqI aqB aGO -auy +pMW aqB aqI amV @@ -122664,7 +121432,7 @@ bSb cKS cKY bQO -cLc +cMO eIh bYd tXV @@ -122674,7 +121442,7 @@ cwB cMc cMm cMy -cML +dSZ cLa cKY cLu @@ -123692,7 +122460,7 @@ bTH cKU cKY cLa -cLc +cMO fgS car cwB @@ -123702,7 +122470,7 @@ cwB cMg cMq cMB -cML +dSZ cMQ cKY cLw @@ -124473,8 +123241,8 @@ cLs cLs cMs cME -cMN -aaU +mDW +dnN bZR caJ bpq @@ -124720,7 +123488,7 @@ bTK cKW cKY bQV -cLc +cMO cLk ctk prx @@ -124731,7 +123499,7 @@ prx iQY cMF cMO -cMS +jAv cMT cLy blM diff --git a/_maps/map_files/CogStation/job_changes.dm b/_maps/map_files/CogStation/job_changes.dm index 8b1e3e9172..347f98a829 100644 --- a/_maps/map_files/CogStation/job_changes.dm +++ b/_maps/map_files/CogStation/job_changes.dm @@ -26,4 +26,4 @@ ..() MAP_JOB_CHECK access += ACCESS_MAINT_TUNNELS - minimal_access += ACCESS_MAINT_TUNNELS \ No newline at end of file + minimal_access += ACCESS_MAINT_TUNNELS diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 17253e2665..4e2b009c79 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -660,6 +660,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "abr" = ( @@ -1308,6 +1309,45 @@ /obj/item/toy/poolnoodle/blue, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/pool) +"acy" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "cargounload" + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"acz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"acA" = ( +/obj/machinery/conveyor{ + dir = 9; + id = "cargounload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"acB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "acF" = ( /obj/docking_port/stationary{ dir = 2; @@ -1484,9 +1524,6 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /obj/machinery/camera{ c_tag = "Arrivals Dock - Fore"; dir = 8; @@ -1495,6 +1532,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "acX" = ( @@ -3495,9 +3535,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ajL" = ( @@ -3783,6 +3821,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "akn" = ( @@ -12556,15 +12597,11 @@ /area/engine/atmospherics_engine) "aAb" = ( /turf/closed/wall, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aAc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aAd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -12921,18 +12958,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aAH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "cargounload" - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "aAI" = ( /obj/structure/cable/white, /obj/structure/cable/white{ @@ -13138,9 +13163,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBh" = ( /obj/item/kirbyplants/random, /obj/machinery/light/small{ @@ -13149,25 +13172,19 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBi" = ( /obj/structure/table, /obj/item/clothing/suit/apron/overalls, /obj/item/cultivator, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBj" = ( /obj/machinery/biogenerator, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBk" = ( /obj/structure/table, /obj/item/reagent_containers/food/snacks/grown/wheat, @@ -13182,18 +13199,14 @@ pixel_y = 4 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBl" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/tea, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBm" = ( /obj/item/kirbyplants/random, /obj/machinery/status_display/evac{ @@ -13201,9 +13214,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBn" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -13213,9 +13224,7 @@ /obj/item/reagent_containers/food/snacks/grown/cherries, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBo" = ( /obj/item/kirbyplants/random, /obj/machinery/light/small{ @@ -13225,18 +13234,14 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBp" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/poppy, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aBq" = ( /obj/structure/cable/white{ icon_state = "2-4" @@ -13639,14 +13644,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aBZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "aCa" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown, @@ -13817,33 +13814,25 @@ /area/engine/atmospherics_engine) "aCv" = ( /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aCw" = ( /obj/effect/turf_decal/delivery, /obj/machinery/hydroponics/soil, /obj/item/seeds/watermelon, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aCx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aCy" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aCz" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -14295,23 +14284,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aDf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock"; - req_access_txt = "31" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "aDg" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -14459,21 +14431,15 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aDy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aDz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aDA" = ( /obj/structure/sink{ dir = 4; @@ -14484,9 +14450,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aDB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -14968,34 +14932,26 @@ icon_state = "2-4" }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aEC" = ( /obj/structure/cable/white{ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aED" = ( /obj/structure/cable/white{ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aEE" = ( /obj/structure/cable/white{ icon_state = "2-8" }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aEG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -15628,18 +15584,14 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFK" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/harebell, /obj/machinery/light/small, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFL" = ( /obj/structure/table, /obj/item/shovel/spade, @@ -15658,9 +15610,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFM" = ( /obj/machinery/status_display/evac{ pixel_y = -32 @@ -15669,34 +15619,26 @@ /obj/machinery/hydroponics/soil, /obj/item/seeds/poppy/geranium, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFN" = ( /obj/structure/table, /obj/item/plant_analyzer, /obj/item/hatchet, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFP" = ( /obj/structure/cable/white{ icon_state = "1-2" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFQ" = ( /obj/structure/table, /obj/item/crowbar, @@ -15704,9 +15646,7 @@ /obj/item/reagent_containers/glass/bucket, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFR" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/tower, @@ -15715,9 +15655,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aFS" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -16707,9 +16645,7 @@ "aHl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aHm" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -16721,9 +16657,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aHn" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -16737,16 +16671,12 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aHo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "aHp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -20351,7 +20281,7 @@ /area/security/prison) "aND" = ( /obj/structure/table, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -21047,7 +20977,7 @@ /area/crew_quarters/bar/atrium) "aOJ" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -33035,6 +32965,10 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/oil, /obj/effect/turf_decal/bot, +/obj/item/stack/ore/silver{ + amount = 2 + }, +/obj/item/stack/ore/iron, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "biu" = ( @@ -47204,13 +47138,9 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "bEx" = ( -/obj/structure/closet/radiation, /obj/machinery/light/small{ dir = 1 }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -48449,7 +48379,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/light/small, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bGg" = ( @@ -49461,7 +49394,7 @@ }, /obj/machinery/door/airlock/security/glass{ name = "Security E.V.A. Storage"; - req_access_txt = "3" + req_access_txt = "1" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49596,7 +49529,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ - dir = 10 + dir = 8 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) @@ -49609,6 +49542,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, +/obj/machinery/light/small{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bHV" = ( @@ -66704,6 +66640,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/library) +"chT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "chV" = ( /obj/machinery/newscaster{ pixel_x = -32 @@ -73373,7 +73316,7 @@ /area/library) "ctL" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = -32 }, @@ -79444,6 +79387,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -81635,12 +81579,12 @@ /turf/open/floor/plasteel, /area/engine/storage) "cHt" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/dirt, /obj/machinery/status_display/ai{ pixel_y = -32 }, /obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/fueltank/high, /turf/open/floor/plasteel, /area/engine/storage) "cHu" = ( @@ -95376,7 +95320,7 @@ /area/medical/medbay/central) "deG" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/structure/sign/poster/official/help_others{ pixel_x = -32 }, @@ -110351,9 +110295,6 @@ /turf/open/floor/plasteel/airless/solarpanel, /area/solar/starboard/aft) "dFz" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, /obj/item/radio/intercom{ name = "Station Intercom"; pixel_x = -26; @@ -110362,12 +110303,19 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/computer/security/telescreen/toxins{ + dir = 4 + }, +/obj/structure/table/reinforced, /turf/open/floor/plasteel, /area/science/mixing) "dFA" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/structure/chair/office/dark{ + dir = 8 + }, /turf/open/floor/plasteel, /area/science/mixing) "dFB" = ( @@ -110385,25 +110333,28 @@ network = list("ss13","rd") }, /obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) "dFC" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"dFD" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) +"dFD" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Space Loop Out" + }, +/turf/open/floor/plasteel, +/area/science/mixing) "dFE" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/newscaster{ pixel_y = 32 }, @@ -110411,9 +110362,10 @@ dir = 8; pixel_x = 24 }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) "dFF" = ( @@ -111311,20 +111263,16 @@ /turf/open/floor/plating, /area/science/test_area) "dGY" = ( -/obj/structure/table/reinforced, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/computer/security/telescreen/toxins{ - dir = 4 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 }, /turf/open/floor/plasteel, /area/science/mixing) "dGZ" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/science/mixing) "dHa" = ( @@ -111341,9 +111289,6 @@ }, /area/science/mixing) "dHb" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -111353,22 +111298,7 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"dHc" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/mixing) "dHd" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -112069,16 +111999,12 @@ /turf/open/floor/plasteel, /area/science/mixing) "dIk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/science/mixing) "dIl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) "dIm" = ( @@ -112086,14 +112012,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) "dIn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) "dIo" = ( @@ -112104,7 +112028,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) "dIp" = ( @@ -112992,6 +112915,9 @@ dir = 4 }, /obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) "dJM" = ( @@ -113004,6 +112930,9 @@ dir = 4 }, /obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) "dJN" = ( @@ -113012,6 +112941,9 @@ }, /obj/effect/turf_decal/bot, /obj/machinery/suit_storage_unit/rd, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) "dJO" = ( @@ -113024,6 +112956,9 @@ dir = 4 }, /obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) "dJP" = ( @@ -113390,10 +113325,6 @@ /obj/item/clothing/gloves/color/black, /obj/item/storage/box/evidence, /obj/item/taperecorder, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -116810,7 +116741,7 @@ /area/library/abandoned) "dQx" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/carpet, /area/library/abandoned) "dQy" = ( @@ -123040,7 +122971,7 @@ /area/hallway/secondary/exit/departure_lounge) "ecH" = ( /obj/structure/table, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) @@ -125347,9 +125278,13 @@ /obj/item/reagent_containers/glass/bucket, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) +"esD" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "etO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -125474,9 +125409,7 @@ /obj/machinery/hydroponics/soil, /obj/item/seeds/grape, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "faI" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -125497,6 +125430,12 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab) +"fer" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "fhE" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical{ @@ -125609,6 +125548,12 @@ }, /turf/open/floor/engine, /area/science/mixing) +"gfJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "gmj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -125711,14 +125656,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/electrical) -"hdH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/conveyor{ - dir = 9; - id = "cargoload" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) "hic" = ( /obj/structure/table/reinforced, /obj/item/integrated_electronics/analyzer, @@ -125770,6 +125707,14 @@ /obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"hzR" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/obj/item/gps/mining{ + gpstag = "MINE_PUB" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "hAf" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -125815,6 +125760,13 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"hLf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/turf/open/floor/plating, +/area/science/mixing) "hNZ" = ( /obj/structure/chair/office/light{ dir = 8 @@ -125921,6 +125873,21 @@ }, /turf/open/floor/plating, /area/engine/atmos) +"iCO" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Arrivals Dock - Public Mining"; + dir = 8; + name = "arrivals camera" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "iIl" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -126017,6 +125984,13 @@ }, /turf/open/floor/plasteel, /area/maintenance/solars/port/aft) +"iUI" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "jdx" = ( /obj/structure/lattice, /obj/structure/grille, @@ -126034,6 +126008,12 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"jdR" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "jeu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -126261,6 +126241,10 @@ }, /turf/open/space, /area/engine/atmos) +"kmz" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "kqo" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -126395,9 +126379,7 @@ pixel_x = 6 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/hydroponics/garden/abandoned) "loH" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -126627,6 +126609,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"mtj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/turf/open/floor/plating, +/area/science/mixing) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -126687,6 +126676,18 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"mVW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Docking Port" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "mWZ" = ( /obj/machinery/atmospherics/components/binary/pump, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -126698,6 +126699,17 @@ }, /turf/open/floor/engine, /area/science/mixing) +"naC" = ( +/obj/docking_port/stationary{ + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space/basic, +/area/space) "nbi" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall/r_wall, @@ -126722,6 +126734,17 @@ /obj/machinery/vending/kink, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"nMo" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"nNN" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) "nOz" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -126991,6 +127014,13 @@ }, /turf/open/floor/plating, /area/science/research/abandoned) +"pwx" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) "pxR" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -127007,6 +127037,14 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel/white, /area/medical/storage) +"pIl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "pQm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -127106,6 +127144,13 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"qEF" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "qUn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -127313,6 +127358,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"tzM" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space, +/area/space/nearstation) "tCh" = ( /turf/closed/wall, /area/science/misc_lab) @@ -127671,6 +127723,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/circuit) +"wlT" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "wmL" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -127692,6 +127753,15 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) +"wpx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "wum" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 @@ -127776,6 +127846,15 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"xaL" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "xcU" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -127792,6 +127871,13 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"xmL" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) "xok" = ( /obj/machinery/light{ dir = 1 @@ -155157,8 +155243,8 @@ dmy dAt djs dhQ -aad -aaa +atI +jdR aaa aaa aad @@ -155414,8 +155500,8 @@ dAt dBX dDl dhQ -aad -aad +pwx +pwx aad aad abj @@ -155671,8 +155757,8 @@ dhQ dhQ dhQ dhQ -aad -aaa +pwx +esD aaa aaa aad @@ -155926,10 +156012,10 @@ djw fRT dAu caE -aaa -aad -aad -aad +nMo +nNN +xmL +pwx aad aad abj @@ -156183,10 +156269,10 @@ drH dzn cLt caE -aad +pwx drP dEn -dEn +hLf drP dEn drP @@ -156440,7 +156526,7 @@ djA cJT cLx cOj -aaa +esD dEn dFz dGY @@ -156697,7 +156783,7 @@ djA cJS cLu cOj -aad +pwx dEn dFA dGZ @@ -156954,7 +157040,7 @@ djA dzo cLt caE -aaa +esD drP dFB dHa @@ -157211,8 +157297,8 @@ djA dzp cLy cOj -aad -dEn +tzM +mtj dFC dHb dIm @@ -157471,7 +157557,7 @@ cOj aaa dEn dFD -dHc +dHd dIn dJN dEn @@ -159633,13 +159719,13 @@ hZh hZh hZh aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aad +aad +aaO +aaO +abf +aaO +aaO aad aad aad @@ -159890,13 +159976,13 @@ hZh hZh hZh aaa -aaa -aaa -aaa -aaa -aaa -qgU aad +aaa +aaO +qEF +xaL +hzR +aaO aad aaa aaa @@ -160147,13 +160233,13 @@ hZh hZh hZh aaa -aaa -aaa -aaa -aaa -aaa aaO aaO +aaO +abe +abC +gfJ +aaO abf aaO aaO @@ -160403,18 +160489,18 @@ hZh hZh hZh hZh -aaa -aaa -aaa -aaa -aaa -aaa -aaO -abe +naC +mVW +kmz +mVW +acb +fer +aiT +abZ abp abC abC -abZ +abC abC abC acV @@ -160661,19 +160747,19 @@ hZh hZh hZh aaa -aaa -aaa -aaa -aaa -aaa +aaO +aaO aaO vcs +wpx +pIl +wlT abq -abD -abD -abZ -abD -abD +chT +chT +chT +chT +chT acW adr adr @@ -160918,12 +161004,12 @@ hZh hZh hZh aaa -aaa -aaa -aaa -aaa +aad aaa aaO +agk +iCO +iUI aaO abf aaO @@ -161175,14 +161261,14 @@ hZh hZh hZh aaa -aaa -aaa -aaa -aaa -aaa -qgU aad aad +aaO +aaO +abf +aaO +aaO +aad aaa aaa aad @@ -161433,12 +161519,12 @@ hZh hZh aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +aad +aad +aad +aad +aad +aad aad aad aad @@ -171764,7 +171850,7 @@ azy aAG aDb aAG -aAG +acB azy azy aAG @@ -173046,7 +173132,7 @@ axk ayB azE azE -aBZ +acz azE azE azE @@ -173302,9 +173388,9 @@ aoF axl ayC azF -aAH -aCa -aCa +acy +aEf +aEf aEf aEf aCa @@ -173560,8 +173646,8 @@ axm ayD ayD ayD -hdH -azD +acA +aEe aaq azD kam @@ -173818,7 +173904,7 @@ ayE azG aAI aCb -aDf +aFk avW aFk aGD diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index f426ad8e97..1b37eea20c 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -14492,7 +14492,6 @@ /turf/open/floor/plating, /area/maintenance/starboard) "aym" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -14503,6 +14502,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/reagent_dispensers/fueltank/high, /turf/open/floor/plasteel/dark, /area/engine/engineering) "ayn" = ( @@ -19127,7 +19127,7 @@ /area/maintenance/disposal/incinerator) "aFL" = ( /obj/machinery/atmospherics/pipe/layer_manifold, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "aFM" = ( /obj/structure/grille, @@ -19140,7 +19140,7 @@ /area/maintenance/disposal/incinerator) "aFO" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "aFP" = ( /obj/machinery/door/firedoor, @@ -19196,7 +19196,7 @@ "aFU" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/machinery/meter, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "aFV" = ( /obj/structure/cable{ @@ -20074,6 +20074,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, +/obj/effect/spawner/structure/window/reinforced, /turf/closed/wall, /area/engine/atmos) "aHy" = ( @@ -20930,7 +20931,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "aIM" = ( /obj/effect/turf_decal/bot, @@ -20949,13 +20950,14 @@ /turf/closed/wall, /area/maintenance/central) "aIO" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/closed/wall, /area/engine/atmos) "aIP" = ( @@ -21204,7 +21206,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "aJm" = ( /obj/effect/decal/cleanable/dirt, @@ -21443,6 +21445,7 @@ /area/engine/atmos) "aJI" = ( /obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/spawner/structure/window/reinforced, /turf/closed/wall, /area/engine/atmos) "aJJ" = ( @@ -21839,13 +21842,6 @@ dir = 1 }, /area/hallway/primary/fore) -"aKm" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall, -/area/engine/atmos) "aKn" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -27414,10 +27410,8 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating{ icon_state = "platingdmg1" }, @@ -27448,11 +27442,10 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/medbay/central) "aSZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -30536,9 +30529,6 @@ dir = 8 }, /obj/structure/closet/bombcloset, -/obj/machinery/airalarm{ - pixel_y = 24 - }, /turf/open/floor/plasteel/dark, /area/science/mixing) "aXC" = ( @@ -43708,10 +43698,6 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, /mob/living/simple_animal/chicken{ desc = "The arch-nemesis of Kentucky."; name = "Popeye"; @@ -46370,9 +46356,6 @@ "bwK" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/sparsegrass, -/obj/machinery/airalarm{ - pixel_y = 22 - }, /turf/open/floor/grass, /area/chapel/main) "bwL" = ( @@ -48014,8 +47997,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/closet/wardrobe/mixed, /obj/machinery/light/small, +/obj/effect/turf_decal/delivery, +/obj/machinery/gear_painter, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) "bzo" = ( @@ -48138,16 +48122,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/brig) -"bzx" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/closed/wall, -/area/crew_quarters/locker) "bzy" = ( /obj/machinery/light/small{ dir = 8 @@ -48774,7 +48748,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "bAA" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -48784,11 +48757,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/storage/backpack{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/backpack, /obj/machinery/firealarm{ dir = 8; pixel_x = 26 @@ -49405,6 +49373,7 @@ dir = 1; name = "recreation camera" }, +/obj/structure/closet/wardrobe/mixed, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "bBy" = ( @@ -52343,6 +52312,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, /turf/closed/wall, /area/engine/atmos) "bGp" = ( @@ -53445,6 +53415,7 @@ /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, +/obj/effect/spawner/structure/window/reinforced, /turf/closed/wall, /area/engine/atmos) "bIc" = ( @@ -53458,10 +53429,11 @@ }, /area/engine/atmos) "bIe" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible, /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/closed/wall, /area/engine/atmos) "bIf" = ( @@ -54801,11 +54773,6 @@ /area/hallway/secondary/exit/departure_lounge) "bKn" = ( /obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -54814,6 +54781,11 @@ /obj/machinery/airalarm{ pixel_y = 22 }, +/obj/item/storage/backpack{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/backpack, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "bKo" = ( @@ -55429,6 +55401,12 @@ pixel_x = 28; pixel_y = 22 }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pen, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "bLd" = ( @@ -58158,10 +58136,6 @@ icon_state = "plant-02"; pixel_y = 3 }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, /obj/machinery/camera{ c_tag = "Prison Wing Cells"; dir = 4; @@ -60848,6 +60822,11 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/table, +/obj/item/toy/figure/assistant{ + pixel_x = 8; + pixel_y = 6 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bTD" = ( @@ -61025,6 +61004,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 10 }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pen, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bTO" = ( @@ -61263,19 +61248,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen, -/obj/item/toy/figure/assistant{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, +/obj/effect/turf_decal/delivery, +/obj/machinery/gear_painter, /turf/open/floor/plasteel/dark, /area/hallway/secondary/entry) "bUi" = ( @@ -61360,7 +61334,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/space) +/area/security/warden) "bUs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -61570,10 +61544,11 @@ /turf/open/space/basic, /area/space/nearstation) "bUM" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/engine/atmos) "bUN" = ( @@ -63746,9 +63721,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"bYf" = ( -/turf/closed/mineral/random/labormineral, -/area/maintenance/starboard/aft) "bYg" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -67202,7 +67174,6 @@ /area/maintenance/port/aft) "cdS" = ( /obj/structure/sign/warning/securearea, -/obj/item/multitool, /turf/closed/wall/r_wall, /area/security/nuke_storage) "cdT" = ( @@ -67215,10 +67186,6 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /turf/open/floor/plasteel, /area/security/main) "cdU" = ( @@ -71340,7 +71307,8 @@ min_oxy = 5; name = "Lia"; real_name = "Lia"; - response_help = "pets"; + response_help_continuous = "pets"; + response_help_simple = "pet"; turns_per_move = 10 }, /turf/open/floor/plasteel/dark, @@ -73372,6 +73340,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/blobstart, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -75353,7 +75322,7 @@ dir = 4 }, /obj/machinery/airalarm{ - pixel_z = 24 + pixel_y = 22 }, /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, @@ -78587,6 +78556,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, /turf/closed/wall, /area/engine/atmos) "cxU" = ( @@ -80399,7 +80369,7 @@ /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/space, -/area/engine/atmos) +/area/space/nearstation) "cCY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -83283,10 +83253,6 @@ /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 5 }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, /obj/machinery/camera{ c_tag = "Atmospherics Port Tanks"; dir = 4; @@ -84290,7 +84256,9 @@ /area/maintenance/starboard) "cOo" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cOx" = ( @@ -84750,6 +84718,13 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"gwE" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "gxY" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -84856,6 +84831,13 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"iPI" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "iSg" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -84865,6 +84847,13 @@ /mob/living/simple_animal/hostile/retaliate/ghost, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) +"iXU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "iZo" = ( /turf/closed/wall/r_wall/rust, /area/medical/virology) @@ -84932,7 +84921,7 @@ /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 }, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "jOz" = ( /obj/structure/sign/warning/electricshock, @@ -85119,6 +85108,10 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall, /area/maintenance/port/fore) +"kWO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall, +/area/maintenance/starboard) "kXo" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck, @@ -85130,6 +85123,10 @@ icon_state = "wood-broken4" }, /area/maintenance/port/fore) +"lht" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) "llm" = ( /obj/structure/sign/poster/ripped, /turf/closed/wall, @@ -85156,6 +85153,14 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/security/warden) +"lVT" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "mbs" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/item/pickaxe, @@ -85219,6 +85224,12 @@ /obj/effect/decal/cleanable/dirt, /turf/closed/mineral/random/labormineral, /area/space/nearstation) +"nHl" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) "nJw" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -85276,6 +85287,12 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/security/vacantoffice) +"oXQ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "ppP" = ( /turf/open/floor/wood{ icon_state = "wood-broken7" @@ -85311,6 +85328,13 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) +"qlK" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "qvS" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=W CPH"; @@ -85377,6 +85401,13 @@ /mob/living/carbon/monkey, /turf/open/floor/grass, /area/medical/virology) +"rnD" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "ruL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -85384,6 +85415,20 @@ }, /turf/open/floor/plating, /area/security/prison) +"rvN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"rwy" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "rNm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, @@ -85418,12 +85463,28 @@ /obj/structure/sign/warning, /turf/closed/wall/rust, /area/space/nearstation) +"tog" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) "tCi" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/wood{ icon_state = "wood-broken3" }, /area/maintenance/port/fore) +"tJC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Space Loop Out" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard) "uda" = ( /turf/closed/wall/rust, /area/security/warden) @@ -85432,6 +85493,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plating, /area/maintenance/port/fore) +"uhv" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "ukP" = ( /obj/effect/decal/cleanable/dirt, /mob/living/simple_animal/bot/cleanbot{ @@ -85480,6 +85548,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/security/vacantoffice) +"uOT" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "uRM" = ( /turf/open/floor/wood, /area/security/vacantoffice) @@ -85597,6 +85672,14 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/security/prison) +"ygZ" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "ykB" = ( /obj/structure/chair/stool, /turf/open/floor/wood, @@ -108877,7 +108960,7 @@ bss btV aEu bxW -bzx +bIV bKq bKq bKq @@ -112781,9 +112864,9 @@ cvg aMP aFL aIL -aFI +aEh aFW -aFI +aEh cko cko aaa @@ -113040,9 +113123,9 @@ aFO cwc aFO cwA -aFI -aFI -aFI +aEh +aEh +aEh aaa aaa aaa @@ -113554,9 +113637,9 @@ aFU cwd jHJ cwH -aFI -aFI -aFI +aEh +aEh +aEh aaa aaa aaa @@ -113809,9 +113892,9 @@ cFF cFF cFF aJl -aFI -aFI -aFI +aEh +aEh +aEh cko cko aaa @@ -114064,7 +114147,7 @@ cBz aHd aMZ aFc -cFF +aFM acm aaa aaQ @@ -114578,7 +114661,7 @@ cBB aHf bDR aFc -cFF +aFM acm aaa cow @@ -115092,7 +115175,7 @@ cBz aHg aNa aFd -cFF +aFM acm aaa cow @@ -115606,7 +115689,7 @@ cBB aHi bFG aFd -cFF +aFM acm aaa acm @@ -116120,7 +116203,7 @@ cBz aHj aNb aVG -cFF +aFM acm aaa cow @@ -116628,13 +116711,13 @@ cpK cqL cph bwy -aKm +bIe clu cBB aHl bId aFe -cFF +aFM acm aaa aaQ @@ -124323,7 +124406,7 @@ koc dbY dlg bWx -bYf +bPJ ceU cgI cDp @@ -128903,9 +128986,9 @@ ava bkd bkd bkd -avA -avA -bkd +tJC +iXU +kWO bBX bkd cwC @@ -129159,10 +129242,10 @@ avA bkd aeu aeu -aeu -acm -aaa -acm +bkd +rvN +rvN +bkd aaa bkd cwD @@ -129417,8 +129500,8 @@ bkd aeu alm acm -aaQ -aeo +iPI +ygZ aeo acm bkd @@ -129674,9 +129757,9 @@ bkd aeu aeU aaa -acm -aaa -acm +iPI +rwy +uhv aaa acm acK @@ -129930,10 +130013,10 @@ aaa bhq aeu aUz -aaa -aaQ -aaa -acm +oXQ +lVT +rnD +gwE aaa acm aaa @@ -130187,10 +130270,10 @@ aaa akA aeu aeU -aaa +qlK aeo -aaa -acm +rwy +uhv aaa acm aaa @@ -130444,10 +130527,10 @@ aaa cko aeu aeu -aeU -acm -aaa -acK +nHl +tog +lht +uOT acm acK aaa diff --git a/_maps/map_files/LambdaStation/dorms.dmm b/_maps/map_files/LambdaStation/dorms.dmm index e5003965ed..0ed1b0203c 100644 --- a/_maps/map_files/LambdaStation/dorms.dmm +++ b/_maps/map_files/LambdaStation/dorms.dmm @@ -25,6 +25,9 @@ /obj/structure/closet, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) +"ae" = ( +/turf/open/floor/wood, +/area/hydroponics/garden/monastery) "af" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -216,9 +219,6 @@ }, /turf/open/floor/plasteel, /area/gateway) -"ay" = ( -/turf/closed/wall/r_wall, -/area/construction/mining/aux_base) "az" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -386,16 +386,6 @@ "aT" = ( /turf/closed/wall/r_wall, /area/chapel/main) -"aU" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aV" = ( /obj/structure/cable{ icon_state = "4-8" @@ -577,6 +567,13 @@ }, /turf/open/floor/plating, /area/hydroponics/garden/abandoned) +"br" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "bu" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -600,6 +597,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"bv" = ( +/obj/structure/railing, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "bw" = ( /obj/structure/cable{ icon_state = "2-8" @@ -775,6 +776,15 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) +"bN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/central) "bO" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -804,6 +814,15 @@ /obj/machinery/light, /turf/open/floor/carpet, /area/chapel/main) +"bT" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics/garden/monastery) "bU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -926,6 +945,21 @@ /obj/item/clothing/mask/horsehead, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) +"cp" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "cq" = ( /turf/open/space, /area/space) @@ -1006,6 +1040,7 @@ dir = 4 }, /obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass, /turf/open/floor/plasteel, /area/hallway/secondary/service) "cC" = ( @@ -1090,14 +1125,14 @@ icon_state = "L6"; layer = 2.04 }, -/mob/living/simple_animal/bot/medbot{ - auto_patrol = 1; - name = "Dr. Heals" - }, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=dorms9"; location = "dorms8" }, +/mob/living/simple_animal/bot/medbot{ + auto_patrol = 1; + name = "Dr. Heals" + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "cN" = ( @@ -1116,6 +1151,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"cO" = ( +/turf/closed/mineral{ + baseturfs = /turf/open/floor/plating/asteroid; + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + name = "asteroid"; + turf_type = /turf/open/floor/plating/asteroid + }, +/area/space) "cP" = ( /obj/item/kirbyplants/random, /turf/open/floor/plasteel, @@ -1197,6 +1240,14 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) +"db" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/pool) "dc" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, @@ -1226,10 +1277,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"di" = ( -/obj/docking_port/stationary/public_mining_dock, -/turf/open/floor/plating, -/area/construction/mining/aux_base) "dk" = ( /obj/machinery/door/airlock/public/glass{ name = "Public Minning Access" @@ -1303,6 +1350,12 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) +"ds" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "dt" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -1362,6 +1415,10 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) +"dB" = ( +/obj/structure/railing, +/turf/open/floor/plating, +/area/maintenance/central) "dC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -1426,13 +1483,6 @@ }, /turf/open/floor/wood, /area/maintenance/bar) -"dK" = ( -/obj/machinery/door/airlock/external{ - name = "Construction Zone" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/construction/mining/aux_base) "dM" = ( /obj/machinery/vending/autodrobe, /turf/open/floor/wood, @@ -1522,6 +1572,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"ea" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/hydroponics/garden/monastery) "eb" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1954,12 +2008,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/carpet, /area/chapel/office) -"fn" = ( -/obj/machinery/computer/camera_advanced/base_construction{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "fo" = ( /obj/effect/turf_decal/vg_decals/department/sec, /obj/effect/turf_decal/tile/neutral, @@ -2178,10 +2226,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"fR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "fS" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -2378,6 +2422,14 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"go" = ( +/obj/machinery/camera/autoname, +/obj/structure/railing{ + icon_state = "railing"; + dir = 8 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "gp" = ( /obj/effect/turf_decal/vg_decals/department/sci, /obj/effect/turf_decal/tile/neutral, @@ -2427,6 +2479,9 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 4 }, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hydroponics/garden/monastery) "gw" = ( @@ -2486,6 +2541,11 @@ "gI" = ( /turf/open/floor/plating, /area/maintenance/bar) +"gJ" = ( +/obj/structure/closet, +/obj/structure/railing/corner, +/turf/open/floor/plating, +/area/maintenance/central) "gK" = ( /obj/structure/table, /obj/machinery/camera{ @@ -2509,6 +2569,14 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"gO" = ( +/obj/machinery/space_heater, +/obj/structure/railing/corner{ + icon_state = "railing_corner"; + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/central) "gP" = ( /obj/machinery/light/small{ dir = 8; @@ -2560,14 +2628,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/crew_quarters/bar) -"gV" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "gX" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -2754,6 +2814,16 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"hv" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Aux Base Maintenance"; + req_access_txt = "48" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/central) "hw" = ( /obj/structure/chair/stool, /obj/structure/cable{ @@ -2937,13 +3007,6 @@ icon_state = "wood-broken6" }, /area/maintenance/bar) -"hW" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "hX" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -2976,13 +3039,6 @@ /obj/effect/spawner/lootdrop/glowstick, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) -"ic" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "id" = ( /obj/structure/chair/sofa/corp/corner{ dir = 4 @@ -2996,35 +3052,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/cafeteria) -"if" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "aux_base_shutters"; - name = "Public Shutters Control"; - pixel_y = -24; - req_one_access_txt = "32;47;48" - }, -/obj/machinery/camera{ - c_tag = "Auxillary Base Construction"; - dir = 10 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"ig" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "ih" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -3091,30 +3118,10 @@ }, /turf/open/floor/plasteel/grimy, /area/chapel/office) -"iq" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for the Auxillary Mining Base."; - dir = 1; - name = "Auxillary Base Monitor"; - network = list("auxbase"); - pixel_y = -28 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "ir" = ( /obj/item/coin/silver, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) -"is" = ( -/obj/machinery/light, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "it" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/cable{ @@ -3218,17 +3225,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) -"iH" = ( -/obj/machinery/power/apc{ - areastring = "/area/construction/mining/aux_base"; - name = "Auxillary Base Construction APC"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "iI" = ( /obj/structure/table, /obj/item/stack/sheet/plasteel{ @@ -3733,6 +3729,13 @@ }, /turf/open/floor/carpet, /area/chapel/office) +"jO" = ( +/obj/machinery/light/small{ + dir = 8; + pixel_x = 5 + }, +/turf/open/floor/plating, +/area/maintenance/central) "jP" = ( /obj/item/storage/bag/plants/portaseeder, /obj/item/storage/bag/plants/portaseeder, @@ -3860,14 +3863,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"kc" = ( -/obj/machinery/door/poddoor/shutters{ - id = "aux_base_shutters"; - name = "Auxillary Base Shutters" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "kd" = ( /obj/structure/cable{ icon_state = "0-2" @@ -3982,21 +3977,6 @@ /obj/item/organ/heart, /turf/open/floor/carpet, /area/chapel/office) -"kp" = ( -/obj/machinery/door/airlock/engineering{ - name = "Auxillary Base Construction"; - req_one_access_txt = "32;47;48" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "kq" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral{ @@ -4099,24 +4079,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/central) -"kC" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "aux_base_shutters"; - name = "Public Shutters Control"; - pixel_y = 24; - req_one_access_txt = "32;47;48" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "kD" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -4141,24 +4103,6 @@ /obj/machinery/vending/snack/random, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) -"kK" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "kL" = ( /obj/structure/table, /obj/item/extinguisher/mini, @@ -4444,27 +4388,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics/garden/monastery) -"lu" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "lv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -4558,6 +4481,14 @@ icon_state = "wood-broken3" }, /area/maintenance/bar) +"lJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/central) "lK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -4843,6 +4774,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"ms" = ( +/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/central) "mt" = ( /obj/structure/sign/poster/contraband/random{ pixel_x = -32 @@ -4858,6 +4795,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) +"mv" = ( +/obj/machinery/computer/shuttle/mining, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "mw" = ( /obj/structure/lattice/catwalk, /obj/item/stack/cable_coil, @@ -4925,6 +4869,10 @@ /obj/item/toy/cards/deck, /turf/open/floor/wood, /area/maintenance/bar) +"mI" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/central) "mK" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -5349,10 +5297,6 @@ }, /turf/open/floor/carpet, /area/chapel/office) -"nH" = ( -/obj/machinery/camera/autoname, -/turf/open/floor/plasteel, -/area/hydroponics/garden/monastery) "nI" = ( /obj/machinery/door/airlock/maintenance{ req_one_access_txt = "12;5;39;6" @@ -5648,6 +5592,13 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard) +"oy" = ( +/obj/structure/railing{ + icon_state = "railing"; + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) "oA" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -6183,6 +6134,13 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel, /area/hallway/primary/central) +"pS" = ( +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/central) "pT" = ( /obj/structure/cable{ icon_state = "1-2" @@ -6579,6 +6537,9 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"qO" = ( +/turf/open/transparent/openspace, +/area/maintenance/central) "qP" = ( /obj/effect/spawner/lootdrop/glowstick, /turf/open/floor/plating, @@ -6786,6 +6747,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2) +"rC" = ( +/obj/machinery/biogenerator, +/turf/open/floor/wood, +/area/hydroponics/garden/monastery) "rD" = ( /obj/structure/lattice, /turf/open/space/basic, @@ -6815,6 +6780,9 @@ dir = 4; layer = 3.2 }, +/obj/structure/curtain{ + icon_state = "closed" + }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) "rH" = ( @@ -7088,6 +7056,13 @@ }, /turf/open/floor/plasteel, /area/hydroponics) +"sn" = ( +/obj/structure/railing/corner{ + icon_state = "railing_corner"; + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/central) "so" = ( /obj/structure/cable{ icon_state = "1-2" @@ -7103,6 +7078,16 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/cafeteria) +"sq" = ( +/turf/closed/wall, +/area/asteroid/nearstation) +"sr" = ( +/obj/structure/railing/corner{ + icon_state = "railing_corner"; + dir = 4 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "ss" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -7556,6 +7541,14 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"tw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/central) "tx" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13"; @@ -7807,13 +7800,6 @@ /obj/structure/pool/Lboard, /turf/open/pool, /area/crew_quarters/fitness/pool) -"ui" = ( -/obj/machinery/light/floor, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics/garden/monastery) "uj" = ( /turf/open/floor/plasteel, /area/crew_quarters/locker) @@ -7974,6 +7960,10 @@ icon_state = "panelscorched" }, /area/maintenance/department/crew_quarters/dorms) +"uH" = ( +/obj/structure/railing/corner, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "uI" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, @@ -7985,6 +7975,9 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hydroponics/garden/monastery) "uK" = ( @@ -8680,6 +8673,9 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2) +"ww" = ( +/turf/closed/wall, +/area/construction/mining/aux_base) "wx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink{ @@ -9100,6 +9096,10 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/main) +"xN" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/wood, +/area/hydroponics/garden/monastery) "xO" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance"; @@ -9862,9 +9862,6 @@ }, /turf/open/floor/plating, /area/maintenance/central) -"zG" = ( -/turf/closed/wall/r_wall, -/area/asteroid/nearstation) "zH" = ( /obj/machinery/vending/wallmed{ pixel_x = -28 @@ -10126,6 +10123,14 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"An" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/railing/corner, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "Ao" = ( /turf/closed/wall, /area/tcommsat/chamber) @@ -10172,6 +10177,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"Ax" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/turf/open/floor/wood, +/area/hydroponics/garden/monastery) "Ay" = ( /obj/machinery/vending/wardrobe/bar_wardrobe, /turf/open/floor/wood, @@ -10406,10 +10418,6 @@ "Be" = ( /turf/closed/wall, /area/storage/tools) -"Bf" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/hydroponics/garden/monastery) "Bg" = ( /obj/structure/cable{ icon_state = "1-2" @@ -10593,9 +10601,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"BB" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/dorms) "BC" = ( /obj/structure/chair{ dir = 4 @@ -10606,6 +10611,9 @@ /obj/structure/dresser, /turf/open/floor/wood, /area/crew_quarters/dorms) +"BE" = ( +/turf/open/transparent/openspace, +/area/construction/mining/aux_base) "BF" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel, @@ -10671,7 +10679,7 @@ light_color = "#e8eaff" }, /obj/machinery/vending/wardrobe/jani_wardrobe{ - products = list(/obj/item/clothing/under/rank/civilian/janitor = 2, /obj/item/cartridge/janitor = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, /obj/item/caution = 10, /obj/item/holosign_creator = 2, /obj/item/lightreplacer = 2, /obj/item/soap/nanotrasen = 2, /obj/item/storage/bag/trash = 2, /obj/item/clothing/shoes/galoshes = 2, /obj/item/watertank/janitor = 2, /obj/item/storage/belt/janitor = 2) + products = list(/obj/item/clothing/under/rank/civilian/janitor = 2, /obj/item/cartridge/janitor = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, /obj/item/clothing/suit/caution = 10, /obj/item/holosign_creator = 2, /obj/item/lightreplacer = 2, /obj/item/soap/nanotrasen = 2, /obj/item/storage/bag/trash = 2, /obj/item/clothing/shoes/galoshes = 2, /obj/item/watertank/janitor = 2, /obj/item/storage/belt/janitor = 2) }, /turf/open/floor/plating, /area/janitor) @@ -10798,6 +10806,14 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) +"Ci" = ( +/obj/structure/closet/toolcloset, +/obj/machinery/light/small{ + dir = 8; + pixel_x = 5 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "Ck" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -11099,15 +11115,15 @@ /area/crew_quarters/kitchen) "Da" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/lizard{ - name = "Wags-His-Tail"; - real_name = "Wags-His-Tail" - }, /obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, +/mob/living/simple_animal/hostile/lizard{ + name = "Wags-His-Tail"; + real_name = "Wags-His-Tail" + }, /turf/open/floor/plating, /area/janitor) "Dc" = ( @@ -11256,6 +11272,10 @@ /obj/machinery/light, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/cafeteria) +"Dz" = ( +/obj/structure/railing/corner, +/turf/open/floor/plating, +/area/maintenance/central) "DB" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -12018,6 +12038,14 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/main) +"Fi" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "Fk" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -12100,6 +12128,13 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"Fw" = ( +/obj/structure/railing{ + icon_state = "railing"; + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/central) "Fx" = ( /obj/structure/girder, /obj/structure/grille, @@ -12236,6 +12271,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"FP" = ( +/obj/machinery/computer/camera_advanced/base_construction, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "FQ" = ( /obj/item/storage/box/bodybags{ pixel_y = 5 @@ -13156,6 +13195,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/airlock/public/glass, /turf/open/floor/plasteel, /area/hallway/secondary/service) "Il" = ( @@ -13597,7 +13637,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "IX" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -13614,6 +13654,16 @@ }, /turf/open/floor/plasteel, /area/janitor) +"IY" = ( +/obj/structure/railing{ + icon_state = "railing"; + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "IZ" = ( /obj/machinery/light{ dir = 4; @@ -13705,10 +13755,16 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"Jn" = ( +/obj/structure/flora/tree/jungle/small, +/obj/structure/railing, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "Jo" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/crew_quarters/locker) "Jp" = ( @@ -13764,7 +13820,6 @@ /turf/open/floor/carpet, /area/chapel/main) "Jz" = ( -/obj/structure/curtain, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) "JA" = ( @@ -13947,6 +14002,13 @@ /obj/item/hand_labeler, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"JT" = ( +/obj/docking_port/stationary/public_mining_dock{ + icon_state = "pinonfar"; + dir = 2 + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) "JU" = ( /obj/structure/chair/office/dark, /turf/open/floor/carpet/blue, @@ -14136,6 +14198,12 @@ }, /turf/open/floor/plating, /area/maintenance/central) +"Ky" = ( +/obj/machinery/door/airlock/external{ + name = "Construction Zone" + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) "KB" = ( /obj/machinery/door/airlock/maintenance{ name = "Janitor Maintenance"; @@ -14353,6 +14421,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel/white, /area/crew_quarters/kitchen) +"KX" = ( +/obj/structure/railing/corner{ + icon_state = "railing_corner"; + dir = 1 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "KZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -14392,6 +14467,13 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"Le" = ( +/obj/structure/railing{ + icon_state = "railing"; + dir = 5 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "Lf" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 8 @@ -14409,6 +14491,25 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"Lg" = ( +/obj/structure/railing{ + icon_state = "railing"; + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/construction"; + dir = 1; + name = "Auxiliary Construction Zone APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "Lh" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/seed_extractor, @@ -14775,6 +14876,10 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) +"Mb" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "Mc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 @@ -15371,6 +15476,17 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) +"NG" = ( +/obj/structure/railing{ + icon_state = "railing"; + dir = 9 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) +"NH" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) "NI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4 @@ -15937,6 +16053,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel/chapel, /area/chapel/main) +"Pl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) "Pm" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 6 @@ -16238,6 +16359,9 @@ dir = 8; layer = 3.2 }, +/obj/structure/curtain{ + icon_state = "closed" + }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) "PY" = ( @@ -16328,6 +16452,15 @@ }, /turf/open/floor/plasteel/dark, /area/gateway) +"Qj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/central) "Ql" = ( /obj/machinery/light/small/built, /turf/open/floor/plating, @@ -16389,11 +16522,6 @@ /obj/machinery/camera/autoname, /turf/open/floor/plasteel/dark, /area/chapel/main) -"Qw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/hallway/secondary/construction) "Qx" = ( /obj/structure/table, /obj/item/reagent_containers/food/condiment/peppermill{ @@ -16457,9 +16585,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/theatre) -"QE" = ( -/turf/closed/wall/r_wall, -/area/hydroponics/garden/monastery) "QH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/tile/neutral, @@ -16596,6 +16721,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"QT" = ( +/obj/structure/railing{ + icon_state = "railing"; + dir = 8 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "QU" = ( /turf/open/floor/wood, /area/crew_quarters/bar) @@ -16754,10 +16886,21 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) +"Rv" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "Rw" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/gateway) +"Rx" = ( +/obj/structure/railing/corner{ + icon_state = "railing_corner"; + dir = 8 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "Ry" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -16784,6 +16927,13 @@ }, /turf/open/floor/plasteel, /area/gateway) +"RA" = ( +/obj/structure/railing{ + icon_state = "railing"; + dir = 4 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "RB" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 @@ -17002,6 +17152,12 @@ /obj/machinery/camera/autoname, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"Sa" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "Sc" = ( /obj/machinery/cryopod{ dir = 8 @@ -17367,6 +17523,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"Tc" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hydroponics/garden/monastery) "Td" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -17825,7 +17986,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/vg_decals/numbers/two, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "Ui" = ( @@ -17900,6 +18060,14 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) +"Up" = ( +/obj/structure/table, +/obj/item/pipe_dispenser, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) "Ur" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/tile/neutral, @@ -18195,6 +18363,17 @@ /obj/structure/kitchenspike, /turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) +"Vd" = ( +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) +"Vf" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/central) "Vg" = ( /mob/living/simple_animal/hostile/retaliate/goat{ name = "Pete" @@ -18408,6 +18587,15 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"VA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/central) "VB" = ( /obj/structure/window/reinforced{ dir = 4 @@ -18458,8 +18646,8 @@ /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) "VH" = ( -/mob/living/simple_animal/crab/Coffee, /obj/machinery/camera/autoname, +/mob/living/simple_animal/crab/Coffee, /turf/open/floor/plating/beach/sand, /area/crew_quarters/fitness/pool) "VI" = ( @@ -18521,6 +18709,7 @@ pixel_y = 32 }, /obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass, /turf/open/floor/plasteel, /area/hallway/secondary/service) "VR" = ( @@ -18608,10 +18797,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) -"Wa" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) "Wb" = ( /obj/effect/landmark/start/mime, /turf/open/floor/carpet, @@ -19007,9 +19192,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard) -"Xc" = ( -/turf/open/floor/plating/airless, -/area/asteroid/nearstation) "Xd" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/wood, @@ -45997,7 +46179,7 @@ qo qo qo qo -qo +sq qo qo qo @@ -46797,7 +46979,7 @@ Xh qo qo qo -qo +sq qo qo qo @@ -47577,7 +47759,7 @@ qo qo qo qo -qo +sq UX UX UX @@ -47817,7 +47999,7 @@ Xh Xh Xh Xh -qo +sq qo qo qo @@ -48066,7 +48248,7 @@ qo qo qo qo -qo +sq qo qo qo @@ -48609,7 +48791,7 @@ qo qo qo qo -qo +sq Xh Xh Xh @@ -50186,7 +50368,7 @@ lO Fo Fo pW -qo +sq Xh Xh Xh @@ -51709,7 +51891,7 @@ qo FN FN qo -qo +sq UX UX UX @@ -53186,7 +53368,7 @@ fl fl fl fl -KN +fl Xx Xx Xx @@ -53256,7 +53438,7 @@ qo qo qo Xh -Xc +sq qo qo qo @@ -53443,7 +53625,7 @@ Gy BU gk aM -KN +fl Xx Xx Xx @@ -53513,7 +53695,7 @@ qo qo qo qo -gx +qo qo qo qo @@ -53700,7 +53882,7 @@ qS ZG Bs Bs -KN +fl Xx Xx Xx @@ -53957,7 +54139,7 @@ ln SA Bs Bs -KN +fl Xx Xx Xx @@ -54214,42 +54396,42 @@ PO PO PO Bs -KN +fl Xx Xx Xx +cn JV JV JV JV +cn JV JV JV JV +cn +JV +JV +JV +cn +JV +JV +cn +JV +JV +JV +cn JV JV JV JV +cn JV JV JV JV -JV -JV -JV -JV -JV -JV -JV -JV -JV -JV -JV -JV -JV -JV -JV -JV +cn Xx Xx Xx @@ -54471,11 +54653,11 @@ fl fl fl rl -KN -KN -KN -KN -QE +fl +fl +fl +fl +cn Iz Iz OR @@ -54504,7 +54686,7 @@ Iz Iz OR Iz -Iz +Rv Iz JV Xx @@ -54734,11 +54916,11 @@ Bs PW cn Iz +Mb Iz -Iz -Iz -Iz -Iz +Vd +ae +Vd Iz Iz Iz @@ -54748,6 +54930,7 @@ uM Iz Iz Iz +Mb Iz Iz Iz @@ -54755,11 +54938,10 @@ Iz Iz Iz Iz +uM Iz -Iz -Iz -Iz -Iz +Mb +Rv Iz Iz Iz @@ -54989,20 +55171,20 @@ pK pK pK Bs -cn +fN PE uM Iz +Vd +ae +Vd +Iz +Sd Iz Iz Iz Iz -Iz -Iz -Iz -Iz -Iz -Iz +Mb Iz Iz Iz @@ -55016,7 +55198,7 @@ Iz Iz Iz Iz -Iz +Mb Iz uM Yz @@ -55250,12 +55432,9 @@ cn Iz Iz Iz -Iz -Iz -Iz -Iz -Iz -Sd +Vd +ae +Vd Iz Iz Iz @@ -55271,6 +55450,9 @@ Iz Iz Iz Iz +Rv +Iz +Iz Iz Iz Sd @@ -55282,9 +55464,9 @@ Xx Xx Xx Xx -BB -BB -BB +Sz +Sz +Sz sC sC AE @@ -55504,25 +55686,26 @@ Bh pK Bs cn +rC +ae Iz +Vd +ae +Vd Iz -Iz -Iz -Iz -Iz +cn qn Iz Iz Iz Iz Iz -Iz -Iz Sd Iz Iz Iz Iz +Mb Iz Iz Iz @@ -55533,13 +55716,12 @@ Iz Iz Iz Iz -Iz -JV +cn Xx Xx Xx Xx -BB +Sz jf rG WM @@ -55761,16 +55943,16 @@ lG pK Bs cn +xN +ae Iz -Iz -Iz -Sd -Iz -Iz +Vd +ae +Vd Iz pq Iz -Iz +uM Iz Iz pq @@ -55796,7 +55978,7 @@ Xx Xx Xx Xx -BB +Sz KS Jz WM @@ -55806,7 +55988,7 @@ eJ qM FA FA -FA +db FA FA FA @@ -56018,14 +56200,11 @@ lZ pK Bs cn -PE -Iz -Iz -Iz -Iz -Iz -Iz -Iz +Ax +ae +Iz +Iz +ae Iz Iz Iz @@ -56033,6 +56212,9 @@ Iz Iz Iz Iz +ae +ae +ae Iz Iz uM @@ -56051,9 +56233,9 @@ Sd JV Xx Xx -BB -BB -BB +Sz +Sz +Sz ke Sz WM @@ -56275,40 +56457,40 @@ FC pK Bs cn -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -uM -Iz -Iz -Iz -Iz +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae Sd -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae aE JV Xx Xx -BB +Sz IQ zj zj @@ -56544,13 +56726,13 @@ Iz Iz Iz Iz +ae +ae +ae Iz Iz -Iz -Iz -Iz -Iz -Iz +ae +ae Iz Iz Iz @@ -56562,10 +56744,10 @@ Iz Iz Iz Iz -JV +cn Xx Xx -BB +Sz fP FM yg @@ -56798,6 +56980,7 @@ Iz Iz Iz Iz +Mb Iz Iz Iz @@ -56805,11 +56988,10 @@ Iz Iz Iz Iz -Iz -Iz -Iz +ae +ae Sd -Iz +Rv Iz Iz Iz @@ -56822,7 +57004,7 @@ Yz JV Xx Xx -BB +Sz SX zj lo @@ -57053,7 +57235,7 @@ Iz Iz Iz Iz -Iz +Mb Iz Iz Iz @@ -57063,8 +57245,8 @@ uM Iz Iz Iz -pq -Iz +ea +ae Iz Iz Iz @@ -57074,12 +57256,12 @@ Iz Iz Iz Iz -Iz -Iz +Mb +Rv JV Xx Xx -BB +Sz kh zj lo @@ -57318,13 +57500,13 @@ uM Iz Iz Iz +Mb Iz +ae +ae Iz -Iz -Iz -Iz -Iz -Iz +Mb +Rv Iz Iz Iz @@ -57336,7 +57518,7 @@ Iz JV Xx Xx -BB +Sz zj JZ DJ @@ -57562,12 +57744,23 @@ ZX cn Iz Iz -DN +Fi Iz Iz Iz Iz -DN +An +RA +sr +Iz +Iz +ga +Iz +Iz +Iz +Iz +ae +ae Iz Iz Iz @@ -57576,24 +57769,13 @@ ga Iz Iz Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -ga -Iz -Iz -Iz -Iz +Mb Iz Iz JV Xx Xx -BB +Sz BD lc Kt @@ -57816,41 +57998,41 @@ pK ra OA OA -Vh -Vh -Vh -Vh -Vh -Vh +OA +Tl +Tl +Tl +Tl +Tl OA OA OA dV -Iz -Iz -Iz -Bf +Le +RA +RA +cn Iz Iz Iz Iz +ae +ae Iz Iz Iz Iz -Iz -Iz -Bf -Iz -Iz -Iz -Iz -Iz -Iz -JV +cn +RA +RA +RA +RA +RA +RA +cn wq wq -BB +Sz Sz Sz nt @@ -58083,25 +58265,25 @@ vf PH mK wf -ui +mj mj mj uJ mj lt -ui +mj mj CY mj mj -ui +mj mj mj gv mj mj mj -ui +mj mj iy eB @@ -58349,9 +58531,9 @@ gT eE eE Ud -Yh -iV eE +iV +Yh eE eE gT @@ -58600,18 +58782,18 @@ zB zB zB hL -zB +bT zB zB zB zB kN -oe +zB hL +oe zB zB -zB -zB +bT zB zB zB @@ -58853,32 +59035,32 @@ PD Ej aA OA -qn +go +QT +QT +QT +cn Iz Iz Iz Iz Iz -Iz -Iz -Yd pq +Yd fK Iz Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -JV +cn +QT +QT +QT +QT +QT +QT +cn wq wq -BB +Sz Sz Sz te @@ -59114,6 +59296,8 @@ Iz Iz Iz Iz +OR +Iz Iz Iz Iz @@ -59123,9 +59307,7 @@ Yd fK Iz Iz -Iz -Iz -Iz +OR Iz Iz Iz @@ -59135,7 +59317,7 @@ Iz JV Xx Xx -BB +Sz BD JB Ab @@ -59374,14 +59556,14 @@ Iz pq Iz Iz +Sd +Rv Iz Yd Yd fK Iz Iz -Iz -Iz pq Iz Sd @@ -59392,7 +59574,7 @@ Iz JV Xx Xx -BB +Sz zj FM Lb @@ -59630,26 +59812,26 @@ Iz Iz Iz Iz -Sd +Iz +Iz +Iz Iz Yd OX jJ Iz -Iz -Iz Sd Iz Iz Iz Iz -Iz -Iz +Rv +Mb Iz JV Xx Xx -BB +Sz SX zj DP @@ -59885,10 +60067,12 @@ Iz Iz Iz Iz -Iz -Iz -Iz -Iz +Rv +uH +RA +RA +RA +sr Yd Yd Yd @@ -59900,13 +60084,11 @@ Iz Iz Iz Iz -Iz -Iz Yz JV Xx Xx -BB +Sz kh JZ oC @@ -60140,15 +60322,17 @@ vP Tl Iz Iz +Mb Iz Iz -Iz -Iz -Iz -Iz -Yd +bv +aZ +aZ +aZ +Le pq Yd +Yd Iz Iz Iz @@ -60158,12 +60342,10 @@ Iz Iz Iz Iz -Iz -Iz -JV +cn Xx Xx -BB +Sz fP zj zj @@ -60397,22 +60579,22 @@ vP Tl Iz Iz -Iz +Mb Iz pq -Iz -Iz -Bf -Yd +bv +aZ +aZ +aZ aZ Yd -Iz -Iz +Yd +Yd Iz Iz oF Iz -Iz +Mb Iz Iz uM @@ -60420,7 +60602,7 @@ Iz JV Xx Xx -BB +Sz IQ zj zj @@ -60657,14 +60839,14 @@ Iz Iz Iz Iz -Iz -Yz -Bf -nH +bv +aZ +aZ +aZ aZ Yd -Iz -Iz +Tc +Yd Iz Iz Sd @@ -60677,8 +60859,8 @@ aE JV Xx Xx -BB -BB +Sz +Sz ke Sz Sz @@ -60700,7 +60882,7 @@ Dk VI VI VI -VI +cp uC VI VI @@ -60896,7 +61078,7 @@ KG RN YL Rf -oQ +CA yo yo Rk @@ -60914,14 +61096,14 @@ Iz Iz Iz Iz -uM -Iz -Bf -Yd +Jn +aZ +aZ +aZ aZ Yd -Iz -Iz +Yd +Yd Iz Iz Iz @@ -60935,7 +61117,7 @@ JV Xx Xx Xx -BB +Sz KS Jz Sz @@ -61171,14 +61353,14 @@ Iz Iz Sd Iz -Iz -Iz -Iz -Yd +bv +aZ +aZ +aZ +NG pq Yd -Iz -Iz +Yd Iz Iz Iz @@ -61188,11 +61370,11 @@ Iz Iz Iz Iz -JV +cn Xx Xx Xx -BB +Sz yv PX Sz @@ -61428,33 +61610,33 @@ Iz Iz Iz Iz +Rx +QT +QT +QT +KX +Iz +Iz +Iz +Rv Iz Iz Iz Iz Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz -Iz +Mb Iz Yz JV Xx Xx Xx -BB -BB -BB -BB -zG -BB +Sz +Sz +Sz +Sz +sq +Sz Sz Sz kY @@ -61693,7 +61875,7 @@ Sd Iz Iz Iz -Iz +Rv Iz Iz Iz @@ -61709,9 +61891,9 @@ Xx qo qo qo -zG +sq uX -BB +Sz yL lE lE @@ -61966,7 +62148,7 @@ pW pW pW qo -zG +sq uX Vi fp @@ -62197,7 +62379,7 @@ OA Iz Iz Iz -Iz +Mb DN Pa Iz @@ -62223,7 +62405,7 @@ iT xe pW qo -zG +sq uX Vi It @@ -62453,34 +62635,34 @@ vP OA fN cn -QE -JV -JV -JV -JV +cn JV JV JV JV +cn JV JV JV JV +cn JV JV JV JV +cn JV JV JV JV +cn Xx pW ir po pW pW -dw +pW uX Vi YC @@ -62710,7 +62892,7 @@ Wj OA Pu Bs -KN +fl Xx Xx Xx @@ -62737,9 +62919,9 @@ pY Fo YP Fo -dw +pW uX -BB +Sz Sc Sc Sc @@ -62966,10 +63148,10 @@ mg bD Go TJ -Bs -KN -Xx -Xx +gJ +fl +fl +fl Xx Xx Xx @@ -62994,9 +63176,9 @@ pW pW pW Fo -dw -dw -BB +pW +pW +Sz Sz Sz Sz @@ -63185,7 +63367,7 @@ qo qo qo qo -qo +fl fl Bs OA @@ -63223,10 +63405,10 @@ hd vP OA Yt -ZX -KN -Xx -Xx +dB +qO +ms +fl Xx Xx Xx @@ -63442,10 +63624,10 @@ qo qo qo qo -qo fl Bs Bs +mI OA oR lk @@ -63479,11 +63661,11 @@ He hd vP OA -Yt +tw +sn +Fw Bs -KN -Xx -Xx +fl Xx Xx Xx @@ -63696,12 +63878,12 @@ qo FN qo qo -qo fl fl fl fl Bs +Bs tP OA PD @@ -63737,10 +63919,10 @@ uc vP OA Yt -nN -KN -Xx -Xx +Dz +oy +Bs +fl Xx Xx Xx @@ -63953,12 +64135,12 @@ qo FN FN qo -qo fl CH JX fl Bs +fl OA OA Qr @@ -63994,10 +64176,10 @@ hd Fa OA Yt -Bs -KN -Xx -Xx +dB +qO +fl +fl Xx Xx Xx @@ -64210,13 +64392,13 @@ qo FN FN qo -qo fl fv Li rl BW -OA +dB +Wq Wq gp jx @@ -64251,9 +64433,9 @@ jH vP OA Yt -Bs -KN -Xx +dB +qO +fl Xx Xx Xx @@ -64281,7 +64463,7 @@ qo qo qo qo -dw +pW Uk rV pW @@ -64467,13 +64649,13 @@ qo qo FN qo -qo fl kL DQ fl Bs -OA +dB +Wq Wq fo RR @@ -64508,10 +64690,10 @@ MO vP OA Yt -cx -KN -KN -KN +gO +fl +fl +fl qo qo qo @@ -64724,13 +64906,13 @@ FN qo FN qo -qo fl fl fl fl Bs -OA +dB +Wq Wq OG mA @@ -64981,12 +65163,12 @@ qo FN FN qo -qo fl um um fl Bs +fl OA OA Bu @@ -65027,7 +65209,7 @@ PI PI PI PI -PI +lJ PI Of oP @@ -65238,13 +65420,13 @@ FN FN FN qo -qo fl Bs kA rl BW Bs +Bs OA PD lk @@ -65495,12 +65677,12 @@ qo qo qo qo -qo fl fl fl fl PW +PW Bs OA PD @@ -65755,7 +65937,7 @@ qo qo qo qo -qo +fl fl ZX kA @@ -66012,7 +66194,7 @@ qo qo qo qo -qo +fl fl PW Bs @@ -66058,7 +66240,7 @@ Um Rz yr gf -Yt +bN fl qo qo @@ -66260,19 +66442,19 @@ FN qo qo qo -ay -ay -ay -ay -ay -ay -ay -ay -ay -ay -ay -ay -ay +FN +qo +qo +qo +qo +FN +qo +qo +qo +fl +Bs +Bs +fl OA oR lk @@ -66517,19 +66699,19 @@ FN qo qo qo -ay -bb -bb -bb -bb -bb -bb -bb -bb -bb -dt -fn -hW +FN +qo +qo +qo +qo +FN +qo +qo +qo +fl +Bs +Bs +fl OA cJ ij @@ -66773,21 +66955,21 @@ FN qo qo qo +FN qo -ay -bb -bb -bb -bb -bb -bb -bb -bb -bb -dt -fO -Wa -kc +qo +qo +qo +qo +FN +qo +qo +qo +fl +Bs +Bs +fl +OA PG MJ pg @@ -67031,21 +67213,21 @@ qo qo qo qo -ay -bb -bb -bb -bb -bb -bb -bb -bb -bb -dt -fO -ic -kc -aU +qo +FN +FN +qo +FN +qo +qo +qo +qo +fl +Bs +Bs +fl +OA +PD lk pg Gx @@ -67287,22 +67469,22 @@ FN qo qo qo +FN +FN qo -ay -bb -bb -bb -bb -bb -bb -bb -bb -bb -dt -LK -if +FN +FN +qo +qo +qo +qo +qo +fl +PW +Bs +fl OA -kC +PD lk pg rN @@ -67544,23 +67726,23 @@ FN qo qo qo +FN qo -ay -bb -bb -bb -bb -bF -bb -bb -bb -di -dK -fR -ig -kp -kK -lu +qo +qo +qo +FN +qo +qo +qo +qo +fl +Bs +Bs +fl +OA +PD +Fd pg ID OA @@ -67801,22 +67983,22 @@ FN FN qo qo +FN +FN qo -ay -bb -bb -bb -bb -bb -bb -bb -bb -bb -dt -fO -iq +qo +qo +FN +qo +qo +qo +qo +fl +fl +Bs +fl OA -mq +PD Fd pg ew @@ -68058,20 +68240,20 @@ FN qo qo qo +FN qo -ay -bb -bb -bb -bb -bb -bb -bb -bb -bb -dt -gi -is +qo +qo +qo +qo +qo +qo +qo +qo +fl +Bs +mI +fl OA ml Fd @@ -68105,7 +68287,7 @@ PD MW vP OA -qP +pS Bs Bs Bs @@ -68314,21 +68496,21 @@ qo qo FN qo +FN qo qo -ay -bb -bb -bb -bb -bb -bb -bb -bb -bb -dt -gj -iH +qo +FN +qo +qo +qo +qo +qo +qo +fl +Bs +PW +fl OA PD wh @@ -68573,19 +68755,19 @@ FN qo qo qo -ay -bb -bb -bb -bb -bb -bb -bb -bb -bb -dt -gV -iI +qo +qo +FN +FN +qo +FN +qo +qo +qo +fl +Bs +Bs +fl OA TW XN @@ -68604,7 +68786,7 @@ Je YX uw Tl -Av +Pl Ik OA OA @@ -68830,19 +69012,19 @@ qo qo qo qo -ay -ay -ay -ay -ay -ay -ay -ay -ay -ay -ay -ay -ay +qo +ct +ct +ct +ct +ct +ct +ct +ct +ct +Bs +Bs +fl OA PD Fd @@ -68881,7 +69063,7 @@ fl er JX rl -BW +VA fl qo qo @@ -69096,7 +69278,7 @@ fD mh Cu bA -fl +ct oE tT fq @@ -69610,7 +69792,7 @@ Ew du vl lA -fl +ct Yt fl qo @@ -69864,10 +70046,10 @@ hX HB HB wc -Qw +HB vl YT -fl +ct Yt fl qo @@ -70381,7 +70563,7 @@ CO FJ ur fg -fl +ct Yt fl qo @@ -70887,7 +71069,7 @@ YV IB PI Fr -oP +Vf fl jS fl @@ -71153,8 +71335,8 @@ fl fl fl fl -fl -fl +Bs +Bs Yt gw gw @@ -71394,7 +71576,7 @@ yM zh Dv GQ -Jg +NH Sx UV PI @@ -71409,9 +71591,9 @@ gH fl qo qo -qo -qo fl +fl +Bs jk PI oP @@ -71667,13 +71849,13 @@ fl qo qo qo -qo +fl fl Fz -fl +Bs Yt fl -qo +fl fl Yt fl @@ -71929,9 +72111,9 @@ fl fl fl Yt -fl -fl -fl +Bs +jO +Bs Yt fl fl @@ -72188,7 +72370,7 @@ fl fC PI PI -PI +Qj gH fl qo @@ -72445,7 +72627,7 @@ fl fl fl fl -fl +Yt fl fl qo @@ -72700,10 +72882,10 @@ qo qo qo qo -qo -qo -qo -qo +fl +Bs +Yt +fl qo qo qo @@ -72957,10 +73139,10 @@ qo qo qo qo -qo -qo -qo -qo +fl +Bs +Yt +fl qo qo qo @@ -73214,9 +73396,9 @@ FN qo qo qo -qo -qo -qo +fl +Bs +Yt qo qo qo @@ -73472,9 +73654,9 @@ FN qo FN qo -qo -FN -FN +Bs +Yt +fl qo qo qo @@ -73729,9 +73911,9 @@ FN FN qo FN -qo -FN -FN +Bs +Yt +fl FN qo qo @@ -73985,10 +74167,10 @@ qo FN qo qo -FN qo -FN -FN +Bs +Yt +fl FN qo qo @@ -74242,10 +74424,10 @@ FN FN qo FN -FN -FN -FN qo +Bs +Yt +fl qo qo qo @@ -74500,9 +74682,9 @@ qo qo qo qo -qo -FN -qo +Bs +Yt +fl qo qo qo @@ -74756,9 +74938,9 @@ qo FN qo FN -qo -qo -qo +fl +Bs +Yt qo FN qo @@ -75013,10 +75195,10 @@ qo qo qo qo -FN -qo -FN -qo +fl +Bs +Yt +fl FN qo FN @@ -75270,10 +75452,10 @@ qo FN qo qo -FN -qo -qo -qo +fl +Bs +Yt +fl qo qo qo @@ -75284,7 +75466,7 @@ qo FN qo qo -Xh +cO KN DZ KN @@ -75525,23 +75707,23 @@ FN qo FN qo -qo -qo -FN -FN -FN -qo -FN -qo -qo -qo -qo -FN -qo -FN -qo -qo -Xh +ww +ww +ww +ww +hv +ww +ww +ww +ww +ww +ww +ww +ww +ww +ww +ww +ww UX LU UX @@ -75782,23 +75964,23 @@ qo FN qo FN -FN -qo -qo -qo -FN -FN -FN -qo -qo -qo -qo -qo -qo -FN -qo -Xh -Xh +ww +BE +BE +BE +ds +Ci +dt +bb +bb +bb +bb +bb +bb +bb +bb +bb +ww Xh LU Xh @@ -76039,25 +76221,25 @@ qo qo FN FN -qo -qo -qo -FN -qo -qo -qo -qo -qo -FN -qo -qo -FN -qo -qo -Xh -Xh -Xh +ww +Lg +IY +IY +Sa +LK +dt +bb +bb +bb +bb +bb +bb +bb +bb +bb +ww Xh +LU Xh Xh qo @@ -76296,25 +76478,25 @@ FN qo qo qo -qo -qo -qo -qo -qo -qo -FN -qo -qo -qo -qo -FN -qo -qo -qo -Xh -Xh -Xh +ww +ww +ww +gj +fO +fO +dt +bb +bb +bb +bb +bb +bb +bb +bb +bb +ww Xh +LU Xh Xh qo @@ -76555,23 +76737,23 @@ FN qo FN qo -FN -qo -qo -qo -qo -qo -FN -qo -qo -qo -FN -qo -qo -Xh -Xh -Xh +ww +FP +fO +fO +dt +bb +bb +bb +bb +bb +bb +bb +bb +bb +ww Xh +LU Xh Xh qo @@ -76812,23 +76994,23 @@ qo qo qo FN -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -Xh -Xh -Xh +ww +mv +fO +fO +Ky +JT +bb +bb +bb +bF +bb +bb +bb +bb +ww Xh +LU Xh Xh qo @@ -77069,23 +77251,23 @@ qo qo qo FN -FN -qo -FN -qo -FN -qo -qo -qo -FN -FN -qo -qo -qo -Xh -Xh -Xh +ww +gi +fO +fO +dt +bb +bb +bb +bb +bb +bb +bb +bb +bb +ww Xh +LU Xh Xh qo @@ -77326,26 +77508,26 @@ qo qo FN qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -Xh -Xh -Xh -Xh -Xh -Xh -qo +ww +fO +fO +fO +dt +bb +bb +bb +bb +bb +bb +bb +bb +bb +ww +UX +LU +UX +UX +ww qo qo qo @@ -77583,23 +77765,23 @@ qo qo qo qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -Xh -Xh -Xh +ww +br +Up +iI +dt +bb +bb +bb +bb +bb +bb +bb +bb +bb +ww Xh +LU Xh Xh qo @@ -77840,21 +78022,21 @@ Xh qo qo qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -Xh -Xh +ww +ww +ww +ww +ww +bb +bb +bb +bb +bb +bb +bb +bb +bb +ww Xh Xh Xh @@ -78101,17 +78283,17 @@ Xh Xh Xh Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh +ww +ww +ww +ww +ww +ww +ww +ww +ww +ww +ww Xh Xh Xh diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm index fdcc0fa7c1..50e08dfae4 100644 --- a/_maps/map_files/LambdaStation/lambda.dmm +++ b/_maps/map_files/LambdaStation/lambda.dmm @@ -391,8 +391,12 @@ /turf/open/space, /area/solar/port/fore) "abk" = ( -/turf/closed/wall/r_wall, -/area/asteroid/nearstation) +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "abl" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -720,9 +724,6 @@ /obj/machinery/doppler_array/research/science{ dir = 1 }, -/obj/machinery/status_display/ai{ - pixel_y = 32 - }, /obj/item/radio/intercom{ dir = 8; pixel_x = -28 @@ -742,14 +743,17 @@ /turf/open/floor/plasteel, /area/science/mixing) "acf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, /obj/machinery/button/massdriver{ id = "toxinsdriver"; pixel_x = 24; pixel_y = 24 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "acg" = ( @@ -1137,13 +1141,13 @@ /turf/open/floor/plasteel, /area/science/mixing) "adb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, /obj/machinery/airalarm{ dir = 1; pixel_y = -22 }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel, /area/science/mixing) "adc" = ( @@ -1153,13 +1157,9 @@ "add" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) "ade" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, /obj/machinery/light, /turf/open/floor/plasteel, /area/science/mixing) @@ -4424,7 +4424,6 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "ajC" = ( -/obj/effect/turf_decal/stripes/line, /obj/machinery/camera/autoname{ dir = 1 }, @@ -10504,6 +10503,10 @@ "atH" = ( /turf/closed/wall/r_wall, /area/science/server) +"atI" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "atJ" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -11825,8 +11828,8 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/mob/living/simple_animal/hostile/retaliate/bat/secbat, /obj/effect/turf_decal/loading_area/red, +/mob/living/simple_animal/hostile/retaliate/bat/secbat, /turf/open/floor/plasteel/dark, /area/security/brig) "avX" = ( @@ -19824,6 +19827,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/item/stack/ore/silver{ + amount = 2 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "aJC" = ( @@ -20219,6 +20225,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/item/stack/ore/iron, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "aKq" = ( @@ -21222,9 +21229,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) -"aMg" = ( -/turf/closed/wall/r_wall, -/area/quartermaster/miningoffice) "aMh" = ( /turf/closed/wall/r_wall, /area/crew_quarters/heads/captain/private) @@ -23448,11 +23452,14 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "aQy" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Maintenance"; - req_access_txt = "48" +/obj/machinery/door/airlock/engineering{ + name = "Auxillary Base Construction"; + req_one_access_txt = "32;47;48" }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, /area/quartermaster/miningoffice) "aQz" = ( /turf/closed/wall, @@ -23735,12 +23742,6 @@ "aRj" = ( /turf/open/floor/plating, /area/maintenance/department/cargo) -"aRk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "aRl" = ( /obj/structure/cable{ icon_state = "4-8" @@ -23752,10 +23753,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"aRm" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall, -/area/maintenance/department/cargo) "aRn" = ( /obj/structure/cable{ icon_state = "4-8" @@ -24108,12 +24105,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aSm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "aSn" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -24128,15 +24119,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/maintenance/fore) -"aSo" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "aSp" = ( /obj/structure/lattice/catwalk, /turf/open/space, @@ -27268,6 +27250,9 @@ name = "Bridge"; req_access_txt = "19" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/command) "baa" = ( @@ -37337,6 +37322,9 @@ req_access_txt = "19" }, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/secondary/command) "bAH" = ( @@ -37882,6 +37870,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/command) "bCA" = ( @@ -37896,6 +37887,9 @@ name = "Command Hallway"; req_access_txt = "19" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/secondary/command) "bCB" = ( @@ -46902,10 +46896,6 @@ }, /turf/open/floor/plating, /area/maintenance/disposal) -"cat" = ( -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "cau" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -49432,15 +49422,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"chE" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "chG" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -54004,8 +53985,8 @@ pixel_y = -26 }, /obj/structure/cable, -/obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/fueltank/high, /turf/open/floor/plasteel, /area/engine/storage_shared) "cvh" = ( @@ -55016,8 +54997,9 @@ "cxw" = ( /obj/machinery/power/apc{ areastring = "/area/construction"; + dir = 1; name = "Construction Area APC"; - pixel_y = -24 + pixel_y = 24 }, /obj/structure/cable{ icon_state = "0-4" @@ -59865,6 +59847,9 @@ /area/medical/abandoned) "cMq" = ( /obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/central/secondary) "cMr" = ( @@ -63053,6 +63038,19 @@ /obj/item/assembly/flash/handheld, /turf/open/floor/plating, /area/storage/tech) +"cYI" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 3; + height = 5; + icon_state = "pinonfar"; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space/basic, +/area/space) "dcB" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -63507,13 +63505,6 @@ }, /turf/open/floor/plating/airless, /area/engine/engineering) -"dRD" = ( -/obj/machinery/status_display/ai{ - pixel_y = 32 - }, -/obj/machinery/vending/cigarette, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) "dRM" = ( /obj/structure/cable{ icon_state = "1-4" @@ -63660,10 +63651,26 @@ }, /turf/open/space/basic, /area/solar/starboard/aft) +"egV" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "ehl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/paramedic) +"ehs" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "eia" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -63784,6 +63791,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/department/cargo) +"etv" = ( +/obj/machinery/door/airlock/external/glass, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "euD" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Server Room" @@ -64033,6 +64048,12 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"eLb" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "eMH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -64284,6 +64305,9 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"eYV" = ( +/turf/open/floor/plasteel, +/area/maintenance/department/cargo) "eZq" = ( /obj/machinery/gravity_generator/main/station, /obj/effect/turf_decal/bot_white, @@ -64413,10 +64437,6 @@ /obj/structure/chair, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"fqq" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) "fqL" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -64465,6 +64485,9 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"fvD" = ( +/turf/open/floor/plasteel, +/area/science/mixing) "fvI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump{ @@ -64948,6 +64971,10 @@ }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) +"gbW" = ( +/obj/structure/stairs/south, +/turf/open/floor/plasteel, +/area/maintenance/department/cargo) "gcM" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -65485,6 +65512,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"hbf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "hbS" = ( /obj/machinery/button/door{ id = "engstorage"; @@ -65849,11 +65885,9 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "hDs" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/department/medical) "hEj" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -65961,12 +65995,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"hTm" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) "hVb" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 1 @@ -66231,6 +66259,13 @@ icon_state = "platingdmg2" }, /area/maintenance/aft) +"iIs" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "iJd" = ( /obj/structure/table/reinforced, /obj/machinery/light_switch{ @@ -66553,6 +66588,10 @@ }, /turf/open/space/basic, /area/space/nearstation) +"jjQ" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plating, +/area/maintenance/department/medical) "jld" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -66644,6 +66683,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmos) +"jwN" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "jEf" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -67036,12 +67081,16 @@ /turf/open/floor/plating/airless, /area/engine/atmos) "kgv" = ( -/obj/structure/table, -/obj/item/flashlight/lamp/green{ - pixel_y = 3 +/obj/structure/railing{ + dir = 4; + icon_state = "railing" }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) +/obj/structure/railing{ + dir = 8; + icon_state = "railing" + }, +/turf/open/floor/plasteel/stairs/old, +/area/maintenance/department/medical) "khi" = ( /obj/machinery/light{ dir = 4; @@ -67135,6 +67184,11 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) +"krP" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "krZ" = ( /obj/structure/cable{ icon_state = "2-8" @@ -67240,6 +67294,15 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/command) +"kFO" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "kJN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/table, @@ -67431,10 +67494,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"leD" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/hallway/primary/aft) "lfg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -68168,6 +68227,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"mkV" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "mmA" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -68178,6 +68246,20 @@ /obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) +"mnL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/computer/shuttle/mining/common{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Arrivals Dock Public Mining"; + dir = 1; + name = "arrivals camera" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "mqh" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -68436,15 +68518,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/closed/wall, /area/maintenance/disposal/incinerator) -"nab" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "nek" = ( /obj/docking_port/stationary{ dir = 8; @@ -69064,16 +69137,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) -"ohk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "ojZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -69384,6 +69447,11 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"oTI" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "oUp" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/metal/fifty, @@ -69426,6 +69494,16 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) +"oVP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/gps/mining{ + gpstag = "MINE_PUB" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "oXg" = ( /obj/structure/cable{ icon_state = "4-8" @@ -69505,6 +69583,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/maintenance/aft) +"peD" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/cargo) "pgc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -69865,6 +69949,14 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"pPG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "pRv" = ( /obj/machinery/air_sensor{ id_tag = "tox_sensor" @@ -69944,13 +70036,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"pXR" = ( -/obj/machinery/status_display/evac{ - pixel_y = 32 - }, -/obj/machinery/vending/coffee, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) "pXT" = ( /obj/machinery/light{ dir = 4 @@ -70170,8 +70255,11 @@ }, /area/maintenance/department/electrical) "qIN" = ( -/turf/open/floor/carpet, -/area/hallway/primary/aft) +/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/department/medical) "qLB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/closed/wall/r_wall, @@ -70203,6 +70291,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/electrical) +"qPP" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "qSJ" = ( /obj/effect/turf_decal/delivery, /obj/structure/cable{ @@ -70312,6 +70407,17 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"rcP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/department/medical) "rcU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 @@ -70436,6 +70542,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) +"rsU" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "rtC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 @@ -70668,6 +70781,13 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) +"rMw" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/central/secondary) "rNH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -70949,10 +71069,12 @@ /turf/closed/wall, /area/maintenance/starboard/aft) "sHs" = ( -/obj/machinery/vending/snack/random, -/obj/machinery/camera/autoname, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/department/medical) "sJs" = ( /obj/structure/cable{ icon_state = "1-2" @@ -71043,14 +71165,6 @@ }, /turf/open/space, /area/solar/starboard/aft) -"sYf" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) "sYO" = ( /obj/structure/window/reinforced/spawner/north, /obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ @@ -71125,12 +71239,17 @@ /turf/open/floor/carpet, /area/hallway/secondary/entry) "tcW" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light{ - dir = 8 +/obj/structure/stairs/west, +/obj/structure/railing{ + dir = 4; + icon_state = "railing" }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) +/obj/structure/railing{ + dir = 8; + icon_state = "railing" + }, +/turf/open/floor/plating, +/area/maintenance/department/medical) "tdt" = ( /obj/machinery/power/port_gen/pacman, /turf/open/floor/plating, @@ -71621,11 +71740,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"uaS" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/snacks/chips, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) "ubl" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -71638,6 +71752,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/maintenance/aft) +"ucV" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "ufs" = ( /obj/machinery/light/small{ dir = 8 @@ -71756,10 +71876,6 @@ /obj/item/flashlight/lamp, /turf/open/floor/carpet/orange, /area/crew_quarters/heads/chief/private) -"uqr" = ( -/obj/machinery/holopad, -/turf/open/floor/carpet, -/area/hallway/primary/aft) "urx" = ( /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/rock/jungle, @@ -71781,9 +71897,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"usZ" = ( -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) "utp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ @@ -71826,6 +71939,13 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"uyX" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Aux Base Maintenance"; + req_access_txt = "48" + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "uBL" = ( /obj/structure/cable{ icon_state = "4-8" @@ -72709,6 +72829,15 @@ }, /turf/open/space, /area/space/nearstation) +"wgn" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Space Loop In" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "wgU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxins_mixing_output, /turf/open/floor/engine/vacuum, @@ -73013,6 +73142,15 @@ "wPh" = ( /turf/closed/wall, /area/hallway/secondary/entry) +"wPU" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "wQP" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -73132,6 +73270,9 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"xbr" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) "xfQ" = ( /obj/machinery/atmospherics/pipe/manifold/green/visible{ dir = 4 @@ -73292,6 +73433,11 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"xzG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/plating, +/area/science/mixing) "xAN" = ( /turf/closed/wall, /area/maintenance/department/electrical) @@ -73527,10 +73673,6 @@ "ycq" = ( /turf/open/floor/engine/plasma, /area/engine/atmos) -"yeB" = ( -/obj/structure/table, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/aft) "yfq" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -99167,7 +99309,7 @@ aaA aaA aaA abY -aUL +hbf afP afB acw @@ -100444,11 +100586,11 @@ aaA aaA aaA aaA -abk -abk -abk -abk -abk +aaQ +aaQ +aaQ +aaQ +aaQ aaA aaA abY @@ -103651,10 +103793,10 @@ nNI ngo bQW nNI -aav -aav -aab -aab +nNI +xMt +xMt +nNI aab aab aab @@ -103789,8 +103931,8 @@ aAY aAY aAY aAY -aAY -aAY +aaA +aaA abJ acb acF @@ -103906,15 +104048,15 @@ gLI ifC jEO uYv -ohk +uYv +uYv +jEO +jEO +cIu +nNI +xMt +xMt nNI -aab -aav -aab -aab -aab -aab -aab aab aab aab @@ -104035,20 +104177,20 @@ aab aab aab aab -aab -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY +aaa +aaa +aaa +abk +krP +krP +krP +qPP +atI +ucV aAY abK +abK +abJ acc acG adb @@ -104163,16 +104305,16 @@ rEw iiC jMW rEw +rEw +rEw +rEw +rEw cwD -xMt -aab -aav -aab -aab -aab -aab -aab -aab +oTI +cxe +cVf +etv +cYI aab aab aab @@ -104294,19 +104436,19 @@ aab aab aab aaa -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -abK -ace +aaa +rsU +krP +krP +krP +iIs +aac +jwN +atI +xzG +kFO +mkV +eLb acH ajC abJ @@ -104420,15 +104562,15 @@ cvp iqD jto jto -cvI +jto +jto +pPG +oVP +mnL +nNI xMt -aab -aav -aab -aab -aab -aab -aab +xMt +nNI aab aab aab @@ -104551,19 +104693,19 @@ aab aab aab aaa -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY +aac +abk +krP +krP +krP +egV +aac aAY aAY abK -ace +wPU +fvD +fvD acI add adv @@ -104679,10 +104821,10 @@ xMt cWd nNI nNI -aab -aav -aab -aab +nNI +xMt +xMt +nNI aab aab aab @@ -104807,19 +104949,19 @@ aab aab aab aab -aaa -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -aAY -abK +aac +aac +rsU +krP +krP +krP +qPP +atI +atI +atI +xzG +wgn +ehs acf adH ade @@ -104937,7 +105079,7 @@ cJk nNI aab aab -aav +aab aab aab aab @@ -105074,8 +105216,8 @@ aaA aaA aaA aaA -aaA -aaA +abJ +abJ abJ abK abK @@ -105141,7 +105283,7 @@ bpg cDz aSt biL -cMq +rMw biL biL biL @@ -115949,7 +116091,7 @@ cVr cVr cVr cVr -cVt +rcP bDx bDx bDx @@ -116464,12 +116606,12 @@ ctY cxq cza cBF -boU -boU -boU -boU -boU -boU +bDx +bDx +aaA +bDx +aaA +aaA boU bZM ccx @@ -116721,13 +116863,13 @@ cuc cxC cVr cBI -boU +bpw +kgv kgv -hTm tcW -hTm -yeB -bIL +bDx +aaA +boU bZT ccB cgC @@ -116978,13 +117120,13 @@ cud cxD cVr cVt +bqa +bpw +bpw +bRI +bDx +aaA boU -pXR -qIN -qIN -qIN -usZ -bIL luG cdM hST @@ -117235,13 +117377,13 @@ cue cxE cVr cVt -boU +bpw sHs qIN -uqr -leD -usZ -fqq +aaA +aaA +aaA +boU cgY cWO cAj @@ -117492,13 +117634,13 @@ cVr cVr cVr cVt +bpw +bpw +bpw +jjQ +aaA +aaA boU -dRD -qIN -qIN -qIN -usZ -fqq cgY cWO sNh @@ -117749,13 +117891,13 @@ cuS cxS cVr cBK +bhg +biZ +hDs +bDx +aaA +aaA boU -yeB -hDs -sYf -hDs -uaS -bIL mdh cWO cgK @@ -118006,12 +118148,12 @@ cud cxT cVr cVt -boU -boU -boU -boU -boU -boU +bpw +bDx +bDx +aaA +aaA +aaA boU bZX cWO @@ -118263,7 +118405,7 @@ cuc cxC cVr cVt -aaA +bpw aaA aaA aaA @@ -118520,7 +118662,7 @@ ctY cxU cza cBF -aaA +bpw aaA aaA aaA @@ -118779,7 +118921,7 @@ cVr cVt bDx aaA -aco +aaA aaA aaA boU @@ -128253,7 +128395,7 @@ aOD aPv aPF aMe -cat +aRj aRj aRj aRj @@ -128510,7 +128652,7 @@ aNX aNa aPG aMe -cQS +aRj aRj aQz aQz @@ -128767,23 +128909,23 @@ aOa aNa aPH aMe -aRj aQz +uyX aQz aaA -aaR -aaR -aaR -aaR -aaA -aaA -aaA -aaA -aaA -aco aaA aaA aaA +aac +aaa +aaa +aaa +aaa +aac +aaa +aaa +aaa +aaa aab bjw bkJ @@ -129024,25 +129166,25 @@ aNZ aNa cLS aMe -aRj -lQP +eYV +eYV +aQz +aQz +aQz aQz -aaR -aaR -aaR -aaR -aaR aaA -aaA -aco -aaA -aaA -aaA -aaA -cce -aaA -aaa -aaa +xbr +aac +aac +aac +aac +xbr +aac +aac +aac +aac +xbr +aac aac aaa aab @@ -129281,24 +129423,24 @@ aNZ aOO aQp aQy -aRk -aRj +eYV +eYV +peD +eYV +gbW aQz -aaR -aaR -aaR aaA -aaR -aaA -aaA -aaA -aaA -aab -aab -aab aac +aaa +aaa +aaa +aab +aab +aab +aab aab aaa +aac aaa aac aaa @@ -129538,24 +129680,24 @@ aPy aNa aQq aMe -bIH -aRj aQz -aaR +aQz +aQz +aQz +aQz +aQz aaA -aaA -aaA -aaA -aaA -aaA -aab -aab -aaa -aaa -aaa aac -aaa -aaa +aab +aab +aab +aab +aab +aab +aab +aab +aab +aac aaa aac aaa @@ -129795,25 +129937,25 @@ aOb aNa aQq aMe -bIH -aRj -aQz -aaR -aaA -aco aaA aaA aaA aaA -aaa -aaa -aaa -aaa -aaa +aaA +aaA +aaA aac aaa aaa aaa +aab +aab +aab +aab +aab +aaa +aac +aaa aac aaa aab @@ -130046,31 +130188,31 @@ aMd aMd aMd aMd -aMg +aMe aLo aOE aPw aQr aMe -aRj -cQS -aQz -aaR aaA aaA aaA aaA +aaA +aaA +aaA +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac aab -aab -aaa -aaa -aaa -aab -aaa -aac -aac -aac -aac aac aac aav @@ -130303,31 +130445,31 @@ aav aab aab aab -aMg -aMg -aMg -aMg -aMg -aMg -aRj -aRj -aQA -aaR +aMe +aMe +aMe +aMe +aMe +aMe aaA aaA aaA aaA +aaA +aaA +aaA +xbr aaa aaa aaa -aab -aab -aab -aab -aab -aab -aab -aab +aaa +aaa +aaa +aaa +aaa +aaa +xbr +aac aac aab aab @@ -130565,15 +130707,15 @@ aaA aaA aaA aaA -aQA -chE -aSm -aQA +aaA +aaA +aaA +aaA aaA aaA aab aab -aab +aac aaa aaa aaa @@ -130582,8 +130724,8 @@ aab aab aab aab -aab -aab +aaa +aac aaa aac aaa @@ -130822,25 +130964,25 @@ aab aaA aaA aaA -aQA -aRm -aSo -aQA +aaA +aaA +aaA +aaA aaA aab aaa aaa +aac aaa aaa aaa +aab +aab +aab +aab +aab aaa -aab -aab -aab -aab -aab -aab -aab +aac aaa aac aaa @@ -131080,24 +131222,24 @@ aab aab aaA aaA -aQA -aRj -aQA +aaA +aaA +aaA aaA aaa aaa aaa +aac aaa aaa aaa aaa -aab -aab -aab -aab -aab -aab -aab +aaa +aaa +aaa +aaa +aaa +aac aaa aac aaa @@ -131335,12 +131477,16 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaa +aaa aab -aab -aQA -aRj -aQA -aab +aaa +aaa +aaa +aac aaa aaa aaa @@ -131348,13 +131494,9 @@ aaa aaa aaa aaa -aab -aab -aab -aab -aab -aab -aab +aaa +aaa +aac aaa aac aac @@ -131593,10 +131735,6 @@ aaa aaa aaa aaa -aab -aQA -nab -aQA aaa aaa aaa @@ -131605,14 +131743,18 @@ aaa aaa aaa aaa -aab -aab -aab -aab -aab -aaa -aaa -aaa +xbr +aac +aac +aac +aac +xbr +aac +aac +aac +aac +xbr +aac aac aaa aaa @@ -131847,13 +131989,13 @@ aaa aaa aaa aab -aab -aab -aab aaa -aav -acv -aac +aaa +aaa +aaa +aab +aab +aab aaa aaa aaa @@ -132109,7 +132251,7 @@ aab aab aab aaa -aSp +aaa aaa aab aab diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 218044c6c2..c2a0e5c353 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -928,7 +928,7 @@ /area/security/prison) "acb" = ( /obj/structure/table, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/plasteel, /area/security/prison) "acc" = ( @@ -1111,10 +1111,6 @@ /turf/open/floor/plasteel, /area/security/prison) "acx" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, /obj/machinery/cryopod{ dir = 8 }, @@ -4548,7 +4544,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ name = "Security E.V.A. Storage"; - req_access_txt = "3" + req_access_txt = "1" }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -4826,6 +4822,7 @@ /obj/machinery/light{ dir = 4 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "aiU" = ( @@ -12681,7 +12678,7 @@ /turf/open/floor/wood, /area/crew_quarters/dorms) "axL" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -15223,7 +15220,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aCN" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_x = -30 @@ -15231,6 +15227,7 @@ /obj/effect/turf_decal/bot{ dir = 1 }, +/obj/structure/reagent_dispensers/fueltank/high, /turf/open/floor/plasteel{ dir = 1 }, @@ -15807,7 +15804,7 @@ /area/crew_quarters/dorms) "aDZ" = ( /obj/structure/table, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aEa" = ( @@ -21386,7 +21383,7 @@ /area/crew_quarters/locker) "aPI" = ( /obj/structure/table, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aPJ" = ( @@ -23177,6 +23174,9 @@ }, /obj/machinery/light, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/newscaster{ + pixel_y = -32 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTy" = ( @@ -23190,17 +23190,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aTz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aTA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -24164,12 +24153,12 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "aVt" = ( -/obj/item/kirbyplants{ - icon_state = "plant-13" - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/item/kirbyplants{ + icon_state = "plant-20" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aVu" = ( @@ -24941,10 +24930,9 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aWV" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 +/obj/effect/turf_decal/stripes/corner{ + dir = 2 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aWW" = ( @@ -39922,9 +39910,6 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bzU" = ( -/obj/structure/chair/comfy/teal{ - dir = 4 - }, /obj/structure/chair/comfy/black{ dir = 4 }, @@ -40508,10 +40493,9 @@ /area/maintenance/port) "bBr" = ( /obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 + dir = 1; + pixel_y = -22 }, -/obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/library) "bBs" = ( @@ -42546,7 +42530,7 @@ dir = 10 }, /obj/structure/table/wood/poker, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/wood, /area/crew_quarters/bar) "bFt" = ( @@ -45877,10 +45861,6 @@ /area/library) "bML" = ( /obj/machinery/light/small, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /turf/open/floor/wood, /area/library) "bMM" = ( @@ -48922,7 +48902,7 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bTi" = ( -/obj/machinery/vending/wardrobe/atmos_wardrobe, +/obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bTk" = ( @@ -52011,19 +51991,23 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bZV" = ( -/obj/item/storage/toolbox/emergency, -/obj/item/hand_labeler, -/obj/effect/spawner/lootdrop/maintenance, +/obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/maintenance/port/aft) "bZW" = ( -/obj/item/cigbutt, +/obj/item/cigbutt{ + pixel_x = 6; + pixel_y = -6 + }, /obj/structure/disposalpipe/segment{ dir = 6 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/item/storage/toolbox/emergency, +/obj/item/hand_labeler, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) "bZX" = ( @@ -53086,7 +53070,6 @@ }, /area/maintenance/port/aft) "cbG" = ( -/obj/item/storage/box/lights/mixed, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -53179,8 +53162,6 @@ network = list("ss13","medbay") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/reagent_containers/glass/beaker/synthflesh, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -55174,7 +55155,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/bloodbankgen, +/obj/vehicle/ridden/wheelchair, /turf/open/floor/plasteel/dark, /area/medical/sleeper) "cfL" = ( @@ -55716,7 +55697,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port/aft) "cgM" = ( @@ -56422,35 +56402,29 @@ /turf/closed/wall, /area/medical/surgery) "cib" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall, +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/plasteel/white/corner, /area/medical/surgery) "cic" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 + dir = 10 }, -/turf/closed/wall, -/area/medical/surgery) -"cid" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/turf/open/floor/plasteel/white/side{ dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/area/medical/surgery) +"cid" = ( +/obj/structure/curtain{ + icon_state = "closed" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "cie" = ( /obj/machinery/firealarm{ dir = 4; pixel_x = -24 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -57094,56 +57068,65 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cjw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 5 }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"cjx" = ( -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/obj/machinery/light_switch{ + pixel_x = -26 }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"cjy" = ( -/obj/item/cigbutt, -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/vending/wallmed{ + pixel_y = 29 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white/corner, /area/medical/surgery) "cjz" = ( -/obj/structure/chair, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"cjA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/plasteel/white/corner{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"cjA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, /area/medical/surgery) "cjB" = ( -/obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, +/obj/machinery/iv_drip, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/firealarm{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/white/side, /area/medical/surgery) "cjC" = ( -/obj/structure/chair, -/turf/open/floor/plasteel/dark, +/obj/structure/table, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medbay)"; + pixel_y = 22 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/turf/open/floor/plasteel/white/side, /area/medical/surgery) "cjD" = ( -/obj/structure/chair, -/obj/machinery/light/small{ - dir = 1 +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 5 + }, +/obj/machinery/light_switch{ + pixel_x = 28 + }, +/obj/machinery/vending/wallmed{ + pixel_y = 29 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 }, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "cjE" = ( /obj/structure/bed/roller, @@ -57154,9 +57137,6 @@ name = "Station Intercom (Medbay)"; pixel_x = -30 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, /obj/machinery/camera{ c_tag = "Medbay Sleepers"; dir = 4; @@ -57172,12 +57152,7 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "cjF" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/sleeper) "cjG" = ( @@ -57189,7 +57164,6 @@ /area/medical/sleeper) "cjH" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/sleeper) "cjI" = ( @@ -57791,71 +57765,66 @@ /turf/open/floor/plasteel/dark, /area/aisat) "ckU" = ( -/obj/structure/chair, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 +/obj/machinery/computer/operating{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"ckV" = ( -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"ckW" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "ckX" = ( -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white/side{ dir = 8 }, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "ckY" = ( -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 }, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "ckZ" = ( -/obj/structure/disposalpipe/segment, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white/side{ dir = 4 }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Observation" - }, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "cla" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white, /area/medical/surgery) "clb" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, /area/medical/surgery) "clc" = ( -/obj/item/cigbutt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/computer/operating{ dir = 8 }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 28 +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "cld" = ( /obj/machinery/sleeper{ @@ -57895,6 +57864,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel/white, /area/medical/sleeper) "clg" = ( @@ -57975,6 +57945,9 @@ /area/medical/medbay/central) "cln" = ( /obj/effect/turf_decal/tile/blue, +/obj/vehicle/ridden/wheelchair{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "clo" = ( @@ -58442,26 +58415,32 @@ /turf/open/floor/wood, /area/maintenance/port/aft) "cmk" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, +/obj/structure/table/optable, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, /area/medical/surgery) "cml" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, /area/medical/surgery) "cmm" = ( -/obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, /area/medical/surgery) "cmn" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Observation" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, /area/medical/surgery) "cmo" = ( /obj/effect/spawner/structure/window, @@ -58904,78 +58883,30 @@ /turf/open/floor/wood, /area/maintenance/port/aft) "cnm" = ( -/obj/structure/table, -/obj/item/hemostat, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/turf/open/floor/plasteel, -/area/medical/surgery) -"cnn" = ( -/obj/structure/table, -/obj/item/surgicaldrill, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/side, -/area/medical/surgery) -"cno" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/turf/open/floor/plasteel/white/side, +/obj/structure/sign/poster/official/cleanliness, +/turf/closed/wall, /area/medical/surgery) "cnp" = ( -/obj/structure/table, -/obj/item/cautery{ - pixel_x = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/razor{ - pixel_y = 5 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Operating Theatre"; + req_access_txt = "45" }, -/turf/open/floor/plasteel/white/side, +/turf/open/floor/plasteel/white, /area/medical/surgery) "cnq" = ( -/obj/structure/table, -/obj/item/retractor, -/turf/open/floor/plasteel, +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, /area/medical/surgery) "cnr" = ( -/obj/machinery/computer/med_data{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/turf/open/floor/plasteel/white/side, -/area/medical/surgery) -"cns" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side, +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, /area/medical/surgery) "cnt" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1485; - listening = 0; - name = "Station Intercom (Medbay)"; - pixel_x = 30 - }, -/obj/structure/bedsheetbin{ - pixel_x = 2 - }, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/mask/muzzle, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/glasses/sunglasses/blindfold, -/obj/item/clothing/ears/earmuffs, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, -/obj/item/gun/syringe/dart, -/turf/open/floor/plasteel/white/side, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, /area/medical/surgery) "cnu" = ( /obj/machinery/power/apc{ @@ -59638,89 +59569,100 @@ }, /area/maintenance/port/aft) "coy" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, +/obj/structure/chair{ + dir = 1 + }, /obj/machinery/airalarm{ dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 + pixel_x = -23 }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/vomit/old{ + pixel_x = -2; + pixel_y = 7 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coA" = ( -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel/white, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coC" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/surgery"; - dir = 4; - name = "Surgery APC"; - pixel_x = 26 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/table, -/obj/item/surgical_drapes, -/turf/open/floor/plasteel/white/side{ - dir = 8 +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coD" = ( -/obj/structure/bed/roller, -/obj/machinery/light/small{ - dir = 8 +/obj/item/cigbutt{ + pixel_x = -8; + pixel_y = 12 }, -/obj/machinery/iv_drip, -/turf/open/floor/plasteel/white, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/chair{ + dir = 1 }, -/turf/open/floor/plasteel/white, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coF" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/item/trash/popcorn{ + pixel_x = -5; + pixel_y = -4 }, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coG" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/table/optable, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/white/corner{ + dir = 1 }, -/turf/open/floor/plating, /area/medical/surgery) "coH" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/cryo) "coI" = ( @@ -60188,9 +60130,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/disposalpipe/junction/flip{ dir = 8 }, @@ -60198,6 +60137,9 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/science/research) "cpx" = ( @@ -60440,96 +60382,90 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"cpT" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Surgery Maintenance"; - req_access_txt = "45" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"cpU" = ( -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"cpW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"cpX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"cpY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"cpZ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/obj/effect/landmark/start/medical_doctor, -/obj/machinery/holopad, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"cpT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/white, /area/medical/surgery) +"cpW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/medical/surgery) +"cpX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/medical/surgery) +"cpZ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/medical/surgery) "cqa" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/turf/open/floor/plasteel/dark/side{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, /area/medical/surgery) "cqb" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ name = "Surgery Observation" }, /turf/open/floor/plasteel/white, /area/medical/surgery) "cqc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/white, /area/medical/cryo) "cqd" = ( @@ -61006,9 +60942,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -61017,6 +60950,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/research) "cqP" = ( @@ -61166,66 +61103,36 @@ }, /area/maintenance/port/aft) "crj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, /obj/machinery/light_switch{ - pixel_x = -28 + pixel_x = -26 }, -/turf/open/floor/plasteel/white/side{ +/turf/open/floor/plasteel/white/corner, +/area/medical/surgery) +"crl" = ( +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) +"crm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) +"crn" = ( +/obj/machinery/light{ dir = 4 }, +/turf/open/floor/plasteel/white/side, /area/medical/surgery) -"crk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"cro" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"crl" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"crm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"crn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/surgery) -"cro" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "crq" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/machinery/light_switch{ - pixel_x = 26 - }, -/turf/open/floor/plasteel/white, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white/side, /area/medical/surgery) "crr" = ( /obj/machinery/airalarm{ @@ -61554,7 +61461,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/research{ @@ -61566,6 +61472,7 @@ name = "biohazard containment shutters" }, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/storage) "crU" = ( @@ -61670,23 +61577,42 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "csj" = ( -/obj/structure/closet/secure_closet/medical2, /obj/structure/sign/warning/nosmoking{ pixel_x = -28 }, -/turf/open/floor/plasteel, +/obj/machinery/limbgrower, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, /area/medical/surgery) "csk" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, +/obj/machinery/light, +/obj/machinery/bloodbankgen, +/turf/open/floor/plasteel/white, /area/medical/surgery) "csl" = ( -/obj/machinery/light, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/closet/crate/freezer/blood, +/obj/machinery/door/window/northleft{ + name = "Surgery Supplies"; + red_alert_access = 1; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"csm" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/item/reagent_containers/glass/beaker/synthflesh, +/obj/machinery/door/window/northright{ + name = "Surgery Supplies"; + red_alert_access = 1; + req_access_txt = "5" + }, /obj/machinery/camera{ c_tag = "Medbay Surgery"; dir = 1; @@ -61694,72 +61620,38 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"csm" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/surgery) "csn" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1485; - listening = 0; - name = "Station Intercom (Medbay)"; - pixel_y = -30 - }, -/obj/structure/closet/crate/freezer/blood, -/turf/open/floor/plasteel, -/area/medical/surgery) -"cso" = ( -/obj/structure/bed/roller, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/chair/office/light{ + dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"csp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +"cso" = ( +/obj/item/bedsheet/medical{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/bed{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/medical/surgery) +"csp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/surgery) "csq" = ( /obj/structure/bed, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, /obj/item/bedsheet/medical, -/obj/machinery/newscaster{ - pixel_y = -32 +/obj/structure/sign/warning/nosmoking{ + pixel_x = 28 }, -/obj/machinery/camera{ - c_tag = "Medbay Recovery Room"; - dir = 1; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/turf/open/floor/plasteel/white/side{ dir = 8 }, -/turf/open/floor/plasteel/white, /area/medical/surgery) "csr" = ( /obj/machinery/door/airlock/maintenance{ @@ -62256,11 +62148,11 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/storage) "cth" = ( @@ -62326,8 +62218,12 @@ /turf/open/floor/plating, /area/maintenance/aft) "ctr" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, +/obj/structure/bed{ + dir = 1 + }, +/obj/item/bedsheet/medical{ + dir = 1 + }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/airalarm{ dir = 4; @@ -62377,6 +62273,16 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/patients_rooms/room_a) "ctv" = ( @@ -62459,7 +62365,7 @@ "ctD" = ( /obj/structure/sign/directions/evac, /turf/closed/wall, -/area/medical/genetics) +/area/medical/paramedic) "ctE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -62617,24 +62523,21 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, /obj/structure/disposalpipe/segment{ dir = 5 }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/storage) "ctY" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/structure/chair/stool, /obj/structure/disposalpipe/segment{ dir = 10 @@ -62654,10 +62557,6 @@ /area/science/storage) "cua" = ( /obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/storage) @@ -62729,29 +62628,38 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cui" = ( -/obj/structure/closet/crate, -/obj/item/coin/silver, -/obj/item/reagent_containers/spray/weedspray, -/obj/item/paper, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/structure/table/reinforced, +/obj/structure/bedsheetbin{ + pixel_x = 2 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/glasses/sunglasses/blindfold, +/obj/item/clothing/mask/muzzle, +/obj/item/clothing/glasses/eyepatch, +/obj/item/gun/syringe/dart, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/medical/surgery) "cuj" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/cable/yellow{ - icon_state = "0-2" +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_y = -32 }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/port/aft"; - dir = 1; - name = "Port Quarter Maintenance APC"; - pixel_y = 24 +/obj/structure/bed{ + dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/item/bedsheet/medical{ + dir = 1 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/medical/surgery) "cuk" = ( /obj/structure/table, /obj/item/folder/white{ @@ -62937,14 +62845,16 @@ }, /obj/item/folder/white{ pixel_x = 4; - pixel_y = -3 + pixel_y = 4 }, /obj/item/folder/white{ pixel_x = 4; - pixel_y = -3 + pixel_y = 4 }, /obj/item/storage/pill_bottle/mutadone, -/obj/item/storage/pill_bottle/mannitol, +/obj/item/storage/pill_bottle/mannitol{ + pixel_x = 5 + }, /obj/structure/table/glass, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -62982,10 +62892,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -5 + }, /turf/open/floor/plasteel/dark, /area/medical/genetics) "cuw" = ( -/obj/structure/filingcabinet/chestdrawer, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -62995,51 +62907,41 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cux" = ( -/obj/structure/noticeboard{ - desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; - name = "requests board"; - pixel_x = -32; - pixel_y = 32 +/obj/machinery/computer/crew, +/obj/machinery/vending/wallmed{ + pixel_x = -25 }, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cux" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cuy" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "genetics_shutters"; - name = "genetics shutters" +/obj/structure/table/glass, +/obj/item/flashlight/lamp{ + pixel_x = -1; + pixel_y = 11 }, -/turf/open/floor/plating, -/area/medical/genetics) -"cuz" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 +/obj/effect/spawner/lootdrop/cig_packs{ + pixel_x = 5; + pixel_y = -4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cuA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/blue{ @@ -63048,6 +62950,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cuB" = ( @@ -63207,7 +63112,6 @@ /turf/open/floor/plasteel, /area/science/storage) "cuU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -63347,8 +63251,8 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cvn" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 }, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -63529,72 +63433,61 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "cvC" = ( -/obj/machinery/firealarm{ - dir = 4; +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/paramedic"; + dir = 8; + name = "Paramedic Station APC"; pixel_x = -24 }, -/obj/item/storage/box/syringes, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "0-4" }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cvD" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, /obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/geneticist, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, +/obj/item/cigbutt{ + pixel_x = -15; + pixel_y = 14 + }, +/obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cvE" = ( -/obj/structure/table/reinforced, +/obj/structure/table/glass, /obj/item/folder/white{ pixel_x = 4; - pixel_y = -3 + pixel_y = 4 }, -/obj/item/pen, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/eastright{ - dir = 8; - name = "Genetics Desk"; - req_access_txt = "5;9" +/obj/item/pen/blue{ + pixel_x = 5; + pixel_y = 3 }, -/obj/machinery/door/window/southleft{ - dir = 4; - name = "Outer Window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "genetics_shutters"; - name = "genetics shutters" - }, -/turf/open/floor/plating, -/area/medical/genetics) -"cvF" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) +"cvF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/paramedic) "cvG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/extinguisher_cabinet{ @@ -63759,12 +63652,12 @@ /turf/open/floor/plasteel, /area/science/storage) "cvW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, /obj/effect/landmark/blobstart, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel, /area/science/storage) "cvX" = ( @@ -63854,7 +63747,14 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cwj" = ( -/obj/item/cigbutt, +/obj/structure/closet/crate, +/obj/item/coin/silver, +/obj/item/reagent_containers/spray/weedspray, +/obj/item/paper, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "cwm" = ( @@ -63866,12 +63766,10 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cwn" = ( -/obj/structure/rack, -/obj/item/clothing/glasses/sunglasses, -/obj/item/flashlight/pen, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/medical/surgery) "cwo" = ( /obj/machinery/light/small{ dir = 8 @@ -64062,20 +63960,15 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "cwD" = ( -/obj/item/storage/box/disks{ - pixel_x = 2; - pixel_y = 2 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_x = -29 }, /obj/machinery/camera{ - c_tag = "Genetics Desk"; + c_tag = "Paramedics Office"; dir = 4; network = list("ss13","medbay") }, -/obj/structure/table/glass, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -64083,26 +63976,15 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cwE" = ( -/obj/machinery/light{ - dir = 4 - }, /obj/structure/disposalpipe/segment, -/obj/machinery/button/door{ - id = "genetics_shutters"; - name = "genetics shutters control"; - pixel_x = 28; - req_access_txt = "9" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cwF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -64110,6 +63992,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cwG" = ( @@ -64334,11 +64217,28 @@ }, /area/maintenance/port/aft) "cxc" = ( -/obj/item/trash/chips, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/obj/machinery/camera{ + c_tag = "Medbay Recovery Room"; + dir = 1; + network = list("ss13","medbay") + }, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/structure/sign/poster/official/love_ian{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/medical/surgery) "cxd" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/rack, +/obj/item/clothing/glasses/sunglasses, +/obj/item/flashlight/pen, +/obj/effect/spawner/lootdrop/maintenance, /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -64384,6 +64284,16 @@ req_access_txt = "5" }, /obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cxi" = ( @@ -64492,12 +64402,12 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "cxu" = ( @@ -64514,57 +64424,62 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "cxv" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/medical/genetics) -"cxw" = ( -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/stack/packageWrap, -/obj/item/pen, -/obj/item/reagent_containers/spray/cleaner, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cxx" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 }, +/obj/effect/landmark/start/paramedic, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, -/area/medical/genetics) -"cxy" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_x = 28 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, +/area/medical/paramedic) +"cxw" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/paramedic, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cxx" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light, +/obj/structure/closet/secure_closet/paramedic, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cxy" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cxz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cxz" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=10.1-Central-from-Aft"; location = "10-Aft-To-Central" @@ -64572,6 +64487,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cxA" = ( @@ -64581,6 +64502,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cxB" = ( @@ -64711,17 +64635,36 @@ }, /area/maintenance/port/aft) "cxR" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/effect/spawner/lootdrop/maintenance, +/obj/item/trash/chips, /turf/open/floor/plating, /area/maintenance/port/aft) "cxS" = ( -/obj/item/latexballon, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/oil/streak, /turf/open/floor/plating, /area/maintenance/port/aft) "cxT" = ( -/obj/item/clothing/suit/ianshirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/port/aft) "cxU" = ( @@ -64886,6 +64829,7 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/genetics) "cyh" = ( @@ -64893,67 +64837,74 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "cyi" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - id_tag = "AuxGenetics"; - name = "Genetics Lab"; - req_access_txt = "9" +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cyk" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/medical/paramedic) +"cyl" = ( +/turf/closed/wall, +/area/medical/paramedic) +"cym" = ( +/obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cyj" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cyk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cyl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cym" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/research{ id_tag = "AuxGenetics"; name = "Genetics Access"; req_access_txt = "9" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/medical/genetics) "cyn" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -26 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cyo" = ( @@ -65279,13 +65230,6 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "cza" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -65293,65 +65237,66 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "czb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/machinery/camera{ + c_tag = "Genetics Lab"; + dir = 6; + network = list("ss13","medbay") + }, /turf/open/floor/plasteel, /area/medical/genetics) "czc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/machinery/light/small{ + dir = 1 }, /turf/open/floor/plasteel, /area/medical/genetics) "czd" = ( -/obj/machinery/light_switch{ - pixel_x = 23 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel, /area/medical/genetics) "cze" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall, +/obj/machinery/door/airlock/research{ + id_tag = "AuxGenetics"; + name = "Genetics Access"; + req_access_txt = "9" + }, +/turf/open/floor/plasteel, /area/medical/genetics) "czf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = -26 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "czg" = ( @@ -65364,9 +65309,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "czh" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/button/door{ id = "Skynet_launch"; name = "Mech Bay Door Control"; @@ -65375,6 +65317,7 @@ req_one_access_txt = "29" }, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) "czi" = ( @@ -65929,6 +65872,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/medical/genetics) "cAh" = ( @@ -67856,9 +67802,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEd" = ( @@ -67877,28 +67821,21 @@ pixel_y = -3 }, /obj/item/clothing/gloves/color/latex, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEe" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/closed/wall, -/area/medical/morgue) -"cEf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/turf/open/floor/plasteel/dark/side{ + dir = 1 }, +/area/medical/surgery) +"cEf" = ( /turf/closed/wall, /area/hallway/primary/aft) "cEg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -67909,13 +67846,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cEh" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cEi" = ( @@ -68344,12 +68279,18 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEX" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEY" = ( @@ -68358,9 +68299,15 @@ name = "Morgue"; req_access_txt = "6" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "cFa" = ( @@ -68841,6 +68788,9 @@ /area/medical/morgue) "cFY" = ( /obj/structure/closet, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "cFZ" = ( @@ -68849,6 +68799,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cGa" = ( @@ -68962,13 +68915,13 @@ pixel_x = -25; pixel_y = -5 }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/machinery/airalarm/unlocked{ + dir = 1; + pixel_y = -22 + }, /turf/open/floor/plasteel/white, /area/science/mixing) "cGm" = ( @@ -72323,17 +72276,14 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cMo" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/machinery/power/apc{ + areastring = "/area/maintenance/port/aft"; + dir = 1; + name = "Port Quarter Maintenance APC"; + pixel_y = 24 }, /obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 + icon_state = "0-8" }, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -72900,10 +72850,16 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cNg" = ( -/obj/structure/rack, -/obj/item/flashlight, -/obj/effect/spawner/lootdrop/maintenance, -/obj/machinery/light/small, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/cigbutt, /turf/open/floor/plating, /area/maintenance/port/aft) "cNh" = ( @@ -75896,8 +75852,12 @@ /turf/closed/wall/r_wall, /area/science/xenobiology) "cUH" = ( -/obj/structure/table/optable, -/turf/open/floor/plasteel/white, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, /area/medical/surgery) "cUL" = ( /obj/docking_port/stationary/random{ @@ -76185,6 +76145,14 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) +"cYI" = ( +/obj/machinery/camera{ + c_tag = "Research Division Circuitry Lab"; + dir = 1; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) "cYJ" = ( /obj/docking_port/stationary{ dir = 2; @@ -79632,9 +79600,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/structure/sign/poster/contraband/random{ - pixel_y = 32 - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -79847,12 +79812,12 @@ /turf/open/floor/plating, /area/chapel/main) "dka" = ( -/obj/structure/noticeboard{ - dir = 1; - pixel_y = -32 +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 }, -/turf/open/floor/plasteel/white, -/area/science/circuit) +/turf/open/space, +/area/space/nearstation) "dlI" = ( /turf/closed/wall/r_wall, /area/engine/supermatter) @@ -80239,6 +80204,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/power/apc{ + areastring = "/area/medical/surgery"; + name = "Surgery APC"; + pixel_y = -26 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "dwj" = ( @@ -81295,6 +81268,14 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"etb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "etr" = ( /obj/machinery/vr_sleeper, /turf/open/floor/plasteel, @@ -81335,10 +81316,36 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"faU" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) "fdr" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/engine/engineering) +"foN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light, +/obj/machinery/gear_painter, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/locker) +"fpa" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "fpY" = ( /turf/closed/wall, /area/crew_quarters/cryopod) @@ -81437,6 +81444,32 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"gtn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/sign/warning/nosmoking{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/medical/genetics) +"gwW" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "gEk" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -81499,6 +81532,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/security/vacantoffice) +"hny" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/curtain, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) "hyP" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two" @@ -81515,6 +81553,11 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"idz" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -81532,6 +81575,12 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"izh" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) "izu" = ( /obj/machinery/autolathe{ name = "public autolathe" @@ -81674,6 +81723,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"jDS" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "jKK" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -81728,6 +81784,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) +"kgN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/medical/glass{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "krD" = ( /turf/closed/wall, /area/science/circuit) @@ -81780,6 +81845,16 @@ }, /turf/open/floor/plasteel/dark, /area/engine/break_room) +"kHw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/table, +/obj/item/gps{ + gpstag = "MINE_PUB" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "kJW" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -81837,6 +81912,15 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"lcv" = ( +/obj/machinery/door/airlock/external{ + name = "Public Mining Dock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "llb" = ( /obj/structure/table/reinforced, /obj/item/integrated_circuit_printer, @@ -81856,6 +81940,13 @@ /obj/item/multitool, /turf/open/floor/plasteel/white, /area/science/circuit) +"lvm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/shuttle/mining/common{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "lws" = ( /obj/structure/chair/office/dark{ dir = 8 @@ -81875,6 +81966,16 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"lFR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "lGS" = ( /obj/docking_port/stationary/public_mining_dock, /turf/open/floor/plating, @@ -81907,9 +82008,33 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/plasteel, /area/science/robotics/lab) +"lUv" = ( +/obj/structure/noticeboard{ + dir = 1; + pixel_y = -32 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) "lWL" = ( -/obj/machinery/smartfridge/organ/preloaded, -/turf/closed/wall, +/obj/machinery/computer/med_data{ + dir = 8 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medbay)"; + pixel_y = -30 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, /area/medical/surgery) "lWY" = ( /obj/machinery/door/airlock/hatch{ @@ -81960,6 +82085,12 @@ }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) +"mdt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "mjJ" = ( /obj/machinery/nuclearbomb/beer{ pixel_x = 2; @@ -81977,6 +82108,10 @@ }, /turf/open/floor/wood, /area/security/vacantoffice) +"mqC" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/maintenance/port/aft) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -82010,6 +82145,13 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"mIJ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space, +/area/space/nearstation) "mSd" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82023,6 +82165,10 @@ icon_state = "panelscorched" }, /area/maintenance/port/aft) +"nho" = ( +/obj/item/latexballon, +/turf/open/floor/plating, +/area/maintenance/port/aft) "nhy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -82105,6 +82251,13 @@ }, /turf/open/floor/plasteel, /area/construction/storage/wing) +"nKU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/circuit) "nLT" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -82171,6 +82324,12 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"oeQ" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ohj" = ( /obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, @@ -82316,6 +82475,21 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"pAD" = ( +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"pBY" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space, +/area/space) "pCV" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -82325,6 +82499,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"pDn" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "pEv" = ( /obj/machinery/airalarm{ dir = 8; @@ -82397,6 +82578,22 @@ }, /turf/open/floor/wood, /area/security/vacantoffice) +"qaK" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"qee" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "qhe" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -82442,6 +82639,11 @@ "qBq" = ( /turf/closed/wall/mineral/plastitanium, /area/hallway/secondary/entry) +"qEc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/turf/open/floor/plating, +/area/science/circuit) "qJZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -82459,13 +82661,12 @@ /turf/open/floor/plating, /area/crew_quarters/cryopod) "qRM" = ( -/obj/machinery/camera{ - c_tag = "Research Division Circuitry Lab"; - dir = 1; - network = list("ss13","rd") +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 }, -/turf/open/floor/plasteel/white, -/area/science/circuit) +/turf/open/space, +/area/space/nearstation) "qVR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -82501,6 +82702,16 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) +"reM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) "roa" = ( /obj/structure/chair/stool, /obj/machinery/light/small{ @@ -82514,6 +82725,23 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"rta" = ( +/obj/machinery/door/airlock/external{ + dir = 2; + name = "Public Mining Dock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"rvd" = ( +/obj/structure/rack, +/obj/item/flashlight, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/port/aft) "rzX" = ( /obj/structure/chair/office/light{ dir = 1; @@ -82623,6 +82851,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"sos" = ( +/obj/structure/mirror, +/turf/closed/wall, +/area/medical/surgery) +"sqe" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) "stP" = ( /obj/machinery/atmospherics/components/binary/pump{ name = "Port to Fuel Pipe" @@ -82640,6 +82876,17 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) +"sBC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/paramedic) +"sCN" = ( +/obj/item/clothing/suit/ianshirt, +/turf/open/floor/plating, +/area/maintenance/port/aft) "sFv" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82708,6 +82955,13 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"tfs" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) "tre" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -82756,6 +83010,13 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"tID" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Space Loop Out" + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) "tUa" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -82794,6 +83055,19 @@ /obj/machinery/atmospherics/pipe/manifold4w/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) +"ulG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"umv" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "upN" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -82871,6 +83145,13 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"vda" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) "vgd" = ( /obj/item/taperecorder, /obj/item/camera, @@ -82907,6 +83188,14 @@ }, /turf/open/floor/wood, /area/security/vacantoffice) +"vwZ" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general{ + color = "#0000ff" + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/medical/surgery) "vxG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -82935,6 +83224,20 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space) +"vMG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/kirbyplants{ + icon_state = "plant-05" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"vYs" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) "wdu" = ( /obj/structure/grille, /obj/structure/lattice, @@ -83006,6 +83309,13 @@ /obj/effect/turf_decal/stripes/line, /turf/closed/wall, /area/science/circuit) +"wNQ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "wOE" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics External Airlock"; @@ -83135,6 +83445,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"xHA" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Space Loop In" + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) "xIi" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -83161,6 +83478,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/security/vacantoffice) +"xUO" = ( +/turf/open/space, +/area/space/nearstation) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -83186,6 +83506,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"yfk" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "yfW" = ( /obj/structure/cable{ icon_state = "1-2" @@ -83209,9 +83536,12 @@ /turf/open/floor/plasteel, /area/science/circuit) "ykE" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/science/circuit) +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space, +/area/space/nearstation) (1,1,1) = {" oRp @@ -91542,13 +91872,13 @@ aaf aaf aaa aaa +aaf aaa aaa -aaf -aaf -aaf -aaf -aaf +aaa +aaa +aaa +pBY aaa aaa aaa @@ -91799,16 +92129,16 @@ aaa aaa aaa aaa -aaa -aaa -aaf -aaa -aaa -aaa aaf aaf aaf aaf +aaf +aVs +rta +aVs +aaf +aaf aaa aaa aaa @@ -92058,12 +92388,12 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +aaf aaa aaf +aVs +pAD +aVs aaa aaf aaa @@ -92319,7 +92649,7 @@ aRA aRA aRA aVs -aVs +lcv aVs aVs aaf @@ -92576,10 +92906,10 @@ wOY aSH aUb aVt -aWT +mdt +vMG aVs aaf -aaf aaa aaa aaa @@ -92833,9 +93163,9 @@ abu bsk aUc aVu -aWU -aYC -aaa +bvF +lvm +aVs aaf aaa aaa @@ -93090,10 +93420,10 @@ wOY aSI aRA aVv -aWU +bvF +ulG aVs aaf -aaf aaa aaa aaa @@ -93348,8 +93678,8 @@ aRA aRA cZf aWV -aRA -aaa +kHw +aVs aaa aaa aaa @@ -97215,7 +97545,7 @@ blU aiT bEs bHJ -aiT +lFR iSt mcS alK @@ -100599,7 +100929,7 @@ cwi dux dux dux -aaa +dux aaa cBR cCK @@ -100854,10 +101184,10 @@ cuf cvk cwh bXE +bXE dvq dux aaa -aaa cBR cBR cDE @@ -101110,10 +101440,10 @@ chZ chZ cvl cbx +cfD ceu dux -dux -aaf +mqC aaa aaa cBR @@ -101360,7 +101690,7 @@ cia cia cia cia -cpT +cDP cia cia cia @@ -101368,11 +101698,11 @@ ceu dyg dvt bXE +bXE dvE dux aaf aaf -aaf dBN cDG cEJ @@ -101615,21 +101945,21 @@ cia cjw ckU cmk -cnm +cnt coy -cpU +cUH crj csj cia cug dyg +bXE dDw bXE -cNg +rvd dux aaa aaa -aaa cBR cDH cEK @@ -101868,25 +102198,25 @@ bXE cer dux dwb -cib -cjx -ckV +cia +cjC +cla cml -cnn +cnt coz -coz -crk +cUH +crq csk cia cuh cvm cDK -cxc +ceu cxR +oeQ dux aaa aaa -aaa dBN cDI cEL @@ -102125,11 +102455,11 @@ bXE bYJ dux dwe +cia +cjB +cpT cic -cjy -ckW -cmk -cno +cnr coA cUH crl @@ -102138,12 +102468,12 @@ cia ceu ceu dyg +ceu dux dux dux aaa aaa -aaa cBR cDJ cEM @@ -102359,7 +102689,7 @@ bue bwa bxU bzD -bBr +dmD bSx bEw bzE @@ -102382,25 +102712,25 @@ dvt dux dux dwb -cic +cia cjz ckX cmm cnp coB -coB +vwZ crm csm cia -cui +dux cwj -dyg +cNg +ceu dux -cxS +nho dux aaf aaf -aaf cBR cBR cBR @@ -102639,23 +102969,23 @@ cdi dux cdl dwb -cic -cjA -ckY -cmk +cia +cnm +sos +cid cnq coC cpW crn csn -cia -cdl -cMm -cMo +cui dux -cxT +cxS +cNf +fpa +dux +sCN dux -aaa aaa aaa aaf @@ -102896,25 +103226,25 @@ dux dux cfD dwb -cic cia +cib ckZ -cia -cia -cia +cjA +kgN +coB cpX cia lWL cia -ceu +cia dyg +bXE dyw dux -cxS +nho dux aaa aaa -aaa aaf aaa aaa @@ -103153,20 +103483,20 @@ cdj cse cdj cgL -cid +cia cjB -cla -cmk +cro +ckY cnr coD -cpY -cro +cqa +cnt cso +cuj cia -cfD dyj ceu -dux +ceu dux dux dux @@ -103394,7 +103724,7 @@ bGs bHS bzE bLk -bzE +bBr bue bPS bPR @@ -103410,18 +103740,18 @@ cdk ceu cfE dwi -cic +cia cjC clb cmn -cns +cnt coE cpZ -coB +hny csp +cwn csr -duH -dyg +cxT ceu cMm cwm @@ -103667,17 +103997,17 @@ dux dux cfF dwj -cic +cia cjD clc -cmk +coG cnt coF -cqa -crq +cEe +cnt csq +cxc cia -dux diM cwm cNf @@ -103924,20 +104254,20 @@ cdl cev cev cgO -cic cia cia cia cia -coG +cia +cia cqb cia cia cia -cuj -cbx +cia +cMo dDw -bXE +gwW cxU cxU czN @@ -104193,7 +104523,7 @@ csr duH bXE cvn -cwn +dvE cxd cxU cyN @@ -104447,9 +104777,9 @@ coI cqd crs css -dux -dux -dux +cvp +cvp +cvp cxU cxU cxU @@ -108565,7 +108895,7 @@ cvA cwB cxt cyg -cyZ +reM cAd ctA dbr @@ -109077,10 +109407,10 @@ ctA ctA ctA ctA -cxv -cyi ctA ctA +cym +ctA ctA cCi cCW @@ -109330,12 +109660,12 @@ coV cqt cga cKJ -ctB +cyl cuw cvC cwD cxw -cyj +cyl czb cAf cBc @@ -109844,18 +110174,18 @@ coX cnL cga cbC -ctB +cyl cuy cvE -ctB +cxv cxy cyl czd -cAg +gtn ctB cCe cCe -cEe +cCe cEY cCe cCe @@ -110102,11 +110432,11 @@ coY cga csI ctD -cuz cvF -ctB -ctB -cym +sBC +cyl +cyi +cyl cze ctB cBd @@ -110617,18 +110947,18 @@ crG csK ctF car -car +czg car cxA car -czg +car cAi ctF car car -czg -cFb car +cFb +czg car cHO cIF @@ -110874,7 +111204,7 @@ crH csL ctG cgc -cvG +qee chh cxB cyo @@ -110885,7 +111215,7 @@ cCm cpa cEh cFc -chh +umv chh cvG cIG @@ -117295,7 +117625,7 @@ cmQ cok cpy cqQ -cgq +crR cti ctZ cuV @@ -118273,8 +118603,8 @@ aOD aPK aQV aOu -aTz -aUM +aTt +foN aUM aYe dnh @@ -120387,11 +120717,11 @@ kOt gRS oUA cxO -qRM +cxO +cYI krD aaf aaf -aaf anS anS anS @@ -120644,9 +120974,9 @@ oLW gGT wPk dGH -dka +cxO +lUv krD -aaf aaa aaf aaf @@ -120901,12 +121231,12 @@ ocT xkG uTS cxO -ykE +cxO +tfs krD aaa aaa aaa -aaa aaf aaa aaf @@ -121159,9 +121489,9 @@ llb uTS cxO cxO -krD -aaa -aaa +tID +noG +lMJ aaa aaa aaf @@ -121415,13 +121745,13 @@ lsv txj eEe cxO -cxO -krD -aaa -aaa -aaa -aaf -aaf +izh +qaK +qEc +idz +idz +vYs +mIJ aaa anT aaf @@ -121672,13 +122002,13 @@ jyv ohj nnK cxO +xHA cxO krD aaa aaa aaa -aaa -aaf +qRM aaa anT aaf @@ -121929,13 +122259,13 @@ krD noG krD noG +nKU krD krD -aaa -aaa -aaa -aaa -aaf +yfk +idz +idz +vda aaa aqB aaa @@ -122181,18 +122511,18 @@ dvY dvY dvY aaf -aaf -aaf +dka +vYs +idz +idz +idz +jDS aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaf +wNQ +idz +vYs +mIJ aaf anT aaa @@ -122438,18 +122768,18 @@ crc aaf ctl aaa -aaf -aaf +qRM +xUO anT anT anT -aaf -aaf -aaf -lMJ -lMJ -aaf -aaa +ake +ake +ake +pDn +faU +vYs +jDS aaf anT aaf @@ -122695,17 +123025,17 @@ crd ack ack aaf -aaf +ykE +idz +sqe +sqe +idz +idz +idz +idz +etb aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf +ake aaf aaf anT diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 5149033cb4..6f7f211b3e 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -1741,7 +1741,7 @@ pixel_x = 12 }, /obj/machinery/shower{ - pixel_y = 26 + pixel_y = 16 }, /turf/open/floor/plasteel/freezer, /area/security/prison) @@ -4924,11 +4924,11 @@ /obj/effect/turf_decal/stripes/end{ dir = 1 }, -/obj/item/gun/energy/e_gun/hos, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/item/gun/energy/e_gun/hos, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain/private) "ahI" = ( @@ -15268,6 +15268,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) "axG" = ( @@ -19618,9 +19621,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) "aEL" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, /obj/machinery/status_display{ pixel_y = -32 }, @@ -19635,6 +19635,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) "aEM" = ( @@ -22551,7 +22552,7 @@ /area/hallway/primary/starboard) "aJa" = ( /obj/structure/table, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -22871,7 +22872,7 @@ /obj/machinery/requests_console{ department = "Genetics"; name = "Genetics RC"; - pixel_x = 28 + pixel_x = 28 }, /turf/open/floor/plasteel/white, /area/medical/genetics) @@ -24502,10 +24503,6 @@ /obj/effect/turf_decal/loading_area{ dir = 1 }, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, @@ -25146,13 +25143,13 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aNg" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/structure/sign/warning/nosmoking{ pixel_y = -32 }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/structure/reagent_dispensers/fueltank/high, /turf/open/floor/plasteel, /area/engine/engineering) "aNh" = ( @@ -28655,7 +28652,7 @@ "aTf" = ( /obj/structure/table/wood, /obj/item/clipboard, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -39574,10 +39571,21 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit) +"boE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "bpj" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/machinery/camera{ + c_tag = "Toxins Launch Room Access"; + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "bpn" = ( @@ -39586,6 +39594,12 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"bpo" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "bpB" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 10 @@ -40530,6 +40544,9 @@ name = "Starboard Quater Maintenance APC"; pixel_y = -26 }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -40604,10 +40621,6 @@ }, /area/engine/atmos) "bOJ" = ( -/obj/machinery/camera{ - c_tag = "Toxins Launch Room Access"; - dir = 1 - }, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, @@ -41121,6 +41134,12 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/mixing) +"eXV" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "eYe" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/public/glass{ @@ -41233,6 +41252,10 @@ /obj/item/wrench, /turf/open/space, /area/space/nearstation) +"foz" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plasteel, +/area/science/mixing) "fsl" = ( /obj/docking_port/stationary{ dir = 2; @@ -41526,6 +41549,12 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos) +"gZk" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "heQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/navbeacon{ @@ -41580,6 +41609,13 @@ }, /turf/closed/wall/r_wall/rust, /area/engine/atmos) +"hyX" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "hAy" = ( /obj/machinery/power/apc{ areastring = "/area/science/mixing"; @@ -41820,6 +41856,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"iOL" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "iUq" = ( /obj/machinery/status_display, /turf/closed/wall, @@ -42031,6 +42074,13 @@ }, /turf/closed/wall/r_wall/rust, /area/engine/atmos) +"jEK" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "jFP" = ( /turf/open/space/basic, /area/space/station_ruins) @@ -42045,6 +42095,11 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel, /area/science/mixing) +"jIu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/plasteel, +/area/science/mixing) "jLF" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -42065,8 +42120,16 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel, /area/science/mixing) +"jYq" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "kaA" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -42078,6 +42141,12 @@ }, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) +"kcN" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "kit" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/machinery/light/small{ @@ -42096,6 +42165,11 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"kpi" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "kqH" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4; @@ -42107,6 +42181,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/mixing) +"kuK" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/science/mixing) "kwF" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -42209,7 +42287,7 @@ /turf/closed/wall/r_wall/rust, /area/science/storage) "lmq" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/plating, /area/science/storage) "low" = ( @@ -42379,6 +42457,13 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"mdx" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "meo" = ( /turf/closed/wall/r_wall/rust, /area/science/mixing) @@ -42513,10 +42598,27 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"nbT" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Space Loop Out" + }, +/turf/open/floor/plasteel, +/area/science/mixing) "ndg" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"nfS" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/plating, +/area/science/storage) +"ngY" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "nhU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -42708,6 +42810,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"oys" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel, +/area/science/mixing) "oyD" = ( /turf/closed/wall, /area/crew_quarters/toilet/restrooms) @@ -42785,6 +42891,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"oXz" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "pbT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -42976,6 +43088,12 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"pMh" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "pNE" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -44007,6 +44125,13 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) +"sIm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "sIu" = ( /turf/closed/wall/r_wall/rust, /area/engine/gravity_generator) @@ -46249,6 +46374,9 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) "ujg" = ( @@ -46377,6 +46505,19 @@ }, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) +"uDp" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) +"uEu" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "uGq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/red{ @@ -46635,6 +46776,10 @@ dir = 1 }, /area/engine/atmos) +"vKE" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "vMb" = ( /turf/open/floor/engine/n2o, /area/engine/atmos) @@ -46779,6 +46924,13 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel, /area/science/mixing) +"wRY" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "wUF" = ( /obj/machinery/door/airlock/atmos/glass/critical{ heat_proof = 1; @@ -97368,7 +97520,7 @@ meo sVt sVt sVt -aad +iio aad aad aad @@ -97620,13 +97772,13 @@ meo uiT bfq bpj +oys +oys +oys +oys +fjN iio aad -aad -aad -aad -aad -aad aaa aaa aaa @@ -97877,12 +98029,12 @@ sVt kQn lFm fjN -iio -aad -aad -aad -aad -aad +hVE +hVE +hVE +hVE +pMh +kuK aac aaa aaa @@ -98134,15 +98286,15 @@ ucd vZb iiW bOJ -iio -aad -aad -aad -aad -aad -aac -aaa -aaa +foz +nbT +ngY +oXz +bpo +jIu +vKE +kpi +mdx aaa aaa aaa @@ -98386,20 +98538,20 @@ aac aad eGm lmq -lmq +nfS sVt iio upN iio iio iio -aad -aad -aad +iio +sIm +boE +iio aac -aac -aaa -aaa +sdX +jEK aaa aaa aaa @@ -98651,12 +98803,12 @@ uTF gGq iio aad -aad -aad aac -aaa -aaa -aaa +gZk +uDp +uEu +hyX +jEK jFP jFP jFP @@ -98908,12 +99060,12 @@ msG ogL iio aad -aad -aad aac -aaa -aaa -aaa +aac +eXV +wRY +wRY +jEK jFP jFP jFP @@ -99165,12 +99317,12 @@ msG diQ iio aad -aad aac aac -aaa -aaa -aaa +kcN +wRY +wRY +jEK jFP jFP jFP @@ -99424,10 +99576,10 @@ iio aac aac aac -aaa -aaa -aaa -aaa +jEK +wRY +wRY +jEK jFP jFP jFP @@ -99681,10 +99833,10 @@ sdX aac aac aac -aaa -aaa -aaa -aaa +jEK +wRY +wRY +jEK jFP jFP jFP @@ -99938,10 +100090,10 @@ sdX aaa aac aaa -aaa -aaa -aaa -aaa +jEK +wRY +wRY +jEK jFP jFP jFP @@ -100195,10 +100347,10 @@ sdX aaa aaa aaa -aaa -aaa -aaa -aaa +jYq +iOL +jYq +iOL jFP jFP jFP diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 3e79030b78..12c507c2bf 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -511,10 +511,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "abi" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 10 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "abj" = ( @@ -807,6 +807,11 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/fitness/pool) +"abU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/xmastree, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "abV" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel/white, @@ -824,6 +829,13 @@ "abY" = ( /turf/open/floor/plasteel/white, /area/ai_monitored/turret_protected/ai) +"abZ" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/effect/landmark/xmastree, +/turf/open/floor/grass, +/area/hydroponics/garden/monastery) "acc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -2180,7 +2192,7 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "afp" = ( -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/structure/table, /turf/open/floor/plasteel/dark, /area/security/prison) @@ -2325,9 +2337,12 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "afJ" = ( -/obj/effect/landmark/carpspawn, -/turf/open/space/basic, -/area/space/nearstation) +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "afK" = ( /obj/machinery/atmospherics/components/unary/tank/air{ dir = 1 @@ -10645,7 +10660,7 @@ /area/crew_quarters/dorms) "ayo" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/carpet, /area/crew_quarters/dorms) "ayq" = ( @@ -16515,6 +16530,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/airalarm{ + pixel_y = 22 + }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "aMr" = ( @@ -20015,9 +20033,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/bar) "aUQ" = ( @@ -20032,6 +20048,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/hydroponics) "aUR" = ( @@ -20473,8 +20492,16 @@ /turf/closed/wall, /area/janitor) "aVT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + id = "jangarage"; + name = "Custodial Closet Shutters" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, /area/janitor) "aVU" = ( /obj/machinery/door/window/eastright{ @@ -20498,6 +20525,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/janitor) "aVV" = ( @@ -20880,9 +20908,6 @@ /obj/machinery/camera{ c_tag = "Custodial Quarters" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, /obj/machinery/light/small{ dir = 1 }, @@ -20903,6 +20928,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/janitor) "aWO" = ( @@ -20922,6 +20950,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/janitor) "aWP" = ( @@ -22992,9 +23023,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "baW" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/machinery/button/door{ id = "jangarage"; name = "Custodial Closet Shutters Control"; @@ -23002,14 +23030,12 @@ req_access_txt = "26" }, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/central) "baX" = ( /obj/vehicle/ridden/janicart, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/machinery/light{ dir = 8 }, @@ -23022,6 +23048,9 @@ /obj/structure/cable{ icon_state = "2-4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel, /area/janitor) "baY" = ( @@ -23386,6 +23415,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, /turf/open/floor/plasteel, /area/janitor) "bbY" = ( @@ -24591,7 +24623,7 @@ /turf/open/floor/plating, /area/maintenance/department/cargo) "beS" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/maintenance/department/cargo) "beU" = ( @@ -31161,17 +31193,26 @@ "bup" = ( /obj/machinery/rnd/destructive_analyzer, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/lab) "buq" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/lab) "bur" = ( /obj/effect/turf_decal/delivery, /obj/machinery/rnd/production/protolathe/department/science, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/lab) "bus" = ( @@ -31190,6 +31231,9 @@ /obj/machinery/light{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/plasteel/white, /area/science/lab) "but" = ( @@ -31652,6 +31696,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/science/lab) "bvA" = ( @@ -32021,23 +32066,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) -"bwq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bwr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bws" = ( /obj/structure/closet, /obj/item/stack/cable_coil/random, @@ -32377,6 +32405,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/science/lab) "bxh" = ( @@ -32812,9 +32841,6 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bxY" = ( -/obj/machinery/light/small{ - dir = 1 - }, /turf/open/floor/plasteel/white, /area/hallway/secondary/entry) "bxZ" = ( @@ -33064,12 +33090,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "byD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/machinery/door/airlock/research{ name = "R&D Lab"; req_one_access_txt = "7;29;30" @@ -33078,6 +33098,12 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/lab) "byE" = ( @@ -33099,7 +33125,6 @@ /turf/open/floor/plasteel/white, /area/science/lab) "byG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ icon_state = "1-2" }, @@ -33559,6 +33584,9 @@ network = list("monastery"); pixel_x = 28 }, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/hallway/secondary/entry) "bzC" = ( @@ -33924,10 +33952,6 @@ /area/hallway/primary/aft) "bAm" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/hallway/primary/aft) "bAo" = ( @@ -33957,7 +33981,6 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -34077,9 +34100,13 @@ /turf/closed/wall, /area/science/mixing) "bAG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/science/mixing) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/science) "bAH" = ( /obj/structure/disposaloutlet, /obj/structure/disposalpipe/trunk{ @@ -34405,17 +34432,14 @@ name = "RD Office APC"; pixel_x = -25 }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) @@ -34426,8 +34450,8 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) @@ -34435,6 +34459,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBt" = ( @@ -34442,6 +34469,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBu" = ( @@ -34479,6 +34509,9 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBw" = ( @@ -35241,6 +35274,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/crew_quarters/heads/hor) "bCK" = ( @@ -37242,12 +37276,15 @@ req_access_txt = "8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 + dir = 4 }, /turf/open/floor/plating, /area/science/mixing) "bGB" = ( /obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/department/science) "bGD" = ( @@ -37753,13 +37790,13 @@ /turf/open/floor/plasteel, /area/science/mixing) "bHD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) "bHE" = ( @@ -38317,11 +38354,12 @@ /turf/open/floor/plasteel, /area/science/mixing) "bIP" = ( -/obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, /area/maintenance/department/science) "bIQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -38331,11 +38369,9 @@ /area/maintenance/department/science) "bIR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" + dir = 10 }, +/turf/open/floor/plating, /area/maintenance/department/science) "bIT" = ( /obj/structure/window/reinforced{ @@ -39403,7 +39439,7 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -40359,11 +40395,12 @@ /turf/open/floor/engine/vacuum, /area/science/mixing) "bNq" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 +/obj/machinery/door/airlock/maintenance{ + name = "Toxins Launch Maintenance"; + req_access_txt = "8" }, -/turf/open/floor/plating/airless, -/area/science/mixing) +/turf/open/floor/plating, +/area/maintenance/department/science) "bNr" = ( /obj/structure/window/reinforced{ dir = 4 @@ -40798,11 +40835,10 @@ /turf/open/floor/engine/vacuum, /area/science/mixing) "bOu" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 }, -/turf/open/space, +/turf/open/floor/plating/airless, /area/science/mixing) "bOv" = ( /obj/structure/window/reinforced{ @@ -44247,9 +44283,11 @@ /turf/open/floor/engine/co2, /area/engine/atmos) "bWh" = ( -/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/chapel/office) +/area/hallway/primary/aft) "bWi" = ( /obj/structure/flora/ausbushes/leafybush, /obj/structure/flora/ausbushes/reedbush, @@ -46848,7 +46886,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/reagent_dispensers/fueltank, +/obj/structure/reagent_dispensers/fueltank/high, /turf/open/floor/plasteel, /area/engine/engineering) "cdL" = ( @@ -47500,12 +47538,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) -"cgj" = ( -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/grass, -/area/hydroponics/garden/monastery) "cgk" = ( /obj/structure/flora/ausbushes/ywflowers, /obj/structure/flora/ausbushes/sparsegrass, @@ -47602,6 +47634,9 @@ pixel_x = -25; specialfunctions = 4 }, +/obj/machinery/airalarm{ + pixel_y = 22 + }, /turf/open/floor/plasteel/grimy, /area/chapel/main/monastery) "cgM" = ( @@ -47950,6 +47985,9 @@ pixel_x = -25; specialfunctions = 4 }, +/obj/machinery/airalarm{ + pixel_y = 22 + }, /turf/open/floor/plasteel/grimy, /area/chapel/main/monastery) "cip" = ( @@ -51437,6 +51475,10 @@ name = "Coffin Storage"; req_one_access_txt = "22" }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cvu" = ( @@ -52829,6 +52871,9 @@ /turf/closed/wall/r_wall, /area/science/lab) "cCt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/science/lab) "cCB" = ( @@ -53063,6 +53108,9 @@ freq = 1400; location = "Research Division" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/science/lab) "cXW" = ( @@ -53103,6 +53151,16 @@ /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"deJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/gps/mining{ + gpstag = "MINE_PUB" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "dgg" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -53146,10 +53204,6 @@ /area/maintenance/department/security/brig) "dhz" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/chair{ dir = 8; name = "Defense" @@ -53158,9 +53212,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dir" = ( @@ -53955,11 +54006,11 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" }, /turf/open/floor/plasteel, /area/hallway/primary/aft) @@ -54165,11 +54216,10 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "fwr" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/closed/wall, -/area/science/mixing) +/obj/machinery/door/airlock/maintenance/abandoned, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/department/science) "fwI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ @@ -54258,6 +54308,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/mixing) "fBZ" = ( @@ -54461,6 +54512,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"gjv" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Space Loop In" + }, +/turf/open/floor/plating, +/area/maintenance/department/science) "gjN" = ( /obj/item/weldingtool, /obj/effect/spawner/lootdrop/maintenance, @@ -54810,10 +54868,11 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) "gMm" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 + dir = 5 }, -/turf/closed/wall, +/turf/open/floor/plating, /area/science/mixing) "gMO" = ( /obj/structure/plasticflaps/opaque, @@ -55085,6 +55144,13 @@ /obj/item/clothing/glasses/regular, /turf/open/floor/plating, /area/maintenance/department/science) +"hxI" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) "hyh" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 9 @@ -55189,6 +55255,12 @@ /obj/machinery/power/rad_collector/anchored, /turf/open/floor/engine, /area/engine/supermatter) +"hMx" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/science) "hOx" = ( /obj/structure/cable{ icon_state = "2-4" @@ -55450,11 +55522,24 @@ /obj/machinery/processor/slime, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"ilE" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "imE" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "ioj" = ( @@ -55558,6 +55643,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "iyg" = ( @@ -56312,9 +56400,13 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "koz" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "kpK" = ( @@ -56500,12 +56592,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"kIc" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/hallway/secondary/entry) "kIo" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -56607,10 +56693,14 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "kSb" = ( -/obj/structure/lattice, -/obj/structure/grille, -/turf/open/space/basic, -/area/space) +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) "kSF" = ( /obj/structure/cable{ icon_state = "1-4" @@ -56684,6 +56774,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "lcU" = ( @@ -57094,6 +57188,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/science/lab) "meF" = ( @@ -57101,8 +57196,9 @@ /turf/closed/wall/r_wall, /area/engine/supermatter) "mfC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, /area/hallway/primary/aft) @@ -57131,6 +57227,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"mhK" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) "miw" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible, /obj/structure/cable/yellow{ @@ -57383,6 +57484,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"mJp" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "mKc" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, @@ -58304,6 +58412,18 @@ }, /turf/open/floor/plating, /area/quartermaster/miningdock) +"oQm" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space/basic, +/area/space) "oRX" = ( /obj/structure/closet, /turf/open/floor/plating, @@ -58599,6 +58719,15 @@ }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/exit/departure_lounge) +"pqP" = ( +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay 2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "prQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -58661,9 +58790,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/chemistry) -"pyw" = ( -/turf/open/space/basic, -/area/hallway/secondary/entry) "pzF" = ( /mob/living/simple_animal/opossum, /turf/open/floor/wood, @@ -58705,6 +58831,15 @@ }, /turf/open/floor/plasteel/dark, /area/science/explab) +"pEH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "pEL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -59072,6 +59207,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/department/engine) +"qAx" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "qAM" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/item/cigbutt, @@ -59235,6 +59377,15 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"qRm" = ( +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay 2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "qTV" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -59261,6 +59412,7 @@ /area/hallway/secondary/exit/departure_lounge) "qVk" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, +/obj/structure/lattice/catwalk, /turf/open/space/basic, /area/maintenance/disposal/incinerator) "qVP" = ( @@ -59295,6 +59447,10 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "qXq" = ( @@ -59579,12 +59735,10 @@ /turf/open/floor/plating, /area/chapel/asteroid/monastery) "rBh" = ( -/obj/structure/mopbucket, -/obj/item/mop, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/plating, /area/maintenance/department/science) "rEh" = ( /obj/structure/table/glass, @@ -59953,6 +60107,14 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"sIK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "sJp" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/effect/turf_decal/stripes/line, @@ -60153,6 +60315,12 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"tfx" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) "tfP" = ( /obj/item/beacon, /turf/open/floor/engine, @@ -60207,6 +60375,13 @@ /obj/structure/table, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"tlp" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "tlw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -60392,6 +60567,9 @@ id = "research_shutters_2"; name = "research shutters" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/lab) "tLP" = ( @@ -60714,12 +60892,6 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /obj/structure/chair{ dir = 8; name = "Defense" @@ -60839,6 +61011,10 @@ /obj/effect/turf_decal/plaque, /turf/open/floor/plating, /area/maintenance/department/engine) +"uNA" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "uQR" = ( /obj/item/ammo_casing/shotgun/beanbag, /turf/open/floor/plating, @@ -61121,6 +61297,14 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"vzp" = ( +/obj/effect/turf_decal/tile/brown, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/silver{ + amount = 2 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -61387,12 +61571,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"wfG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/crew_quarters/heads/hor) "wfO" = ( /mob/living/simple_animal/hostile/retaliate/poison/snake, /turf/open/floor/plating, @@ -61436,6 +61614,18 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"wjQ" = ( +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "wkZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -61929,6 +62119,11 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"xlg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/turf/open/floor/plating, +/area/maintenance/department/science) "xlA" = ( /obj/machinery/door/airlock/maintenance/abandoned, /turf/open/floor/plating, @@ -62181,6 +62376,13 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/freezer, /area/storage/emergency/port) +"xQk" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) "xSd" = ( /obj/machinery/light/small, /turf/open/floor/plating, @@ -76832,7 +77034,7 @@ aaa bOv bNs bNs -bWh +bQg bQg bQg bQg @@ -79680,7 +79882,7 @@ cuE cgK cgJ cgH -cgj +abZ cvj bWV cfn @@ -80397,7 +80599,7 @@ aaa aaa aaa aaa -pyw +aaa bsl btL aZx @@ -80654,7 +80856,7 @@ aaa aaa aaa aaa -pyw +aaa aZx bcX aZx @@ -81690,7 +81892,7 @@ aaa aaa aaa aaa -aaa +oQm aaa aaa aaa @@ -81946,9 +82148,9 @@ aZx aaa aaa aaa -aaa -aaa -aaa +aZx +pqP +aZx aaa aaa aaa @@ -82203,9 +82405,9 @@ aZx aaa aaa aaa -aaa -aaa -aaa +aZx +bcX +aZx aaa aaa aaa @@ -82457,12 +82659,12 @@ aZx bno bon aZx -aaa -aaa -aaa -aaa -aaa -aaa +aZx +aZx +aZx +aZx +qRm +aZx aaa aaa aht @@ -82712,15 +82914,15 @@ bbQ bcX bdV bnp -bon +baK +pEH +deJ +sIK +wjQ +pEH +bbR aZx aaa -aaa -aaa -aaa -aaa -aaa -aaa aht bBV bDf @@ -82969,15 +83171,15 @@ jzz aZx jzz bnp -bon -aZx -aZx -aZx -aZx -aZx +baK +baK +baK +baK +baK +baK +baK aZx aaa -aht bAI abI abI @@ -83227,14 +83429,14 @@ bbR bbR bnp baK -bbR -bbR -bbR -bbR -bbR +baK +baK +baK +baK +baK +baK +aZx aZx -kIc -kIc bAJ bBX bBX @@ -83489,7 +83691,7 @@ baK baK baK baK -aZx +baK bxY bzz kGe @@ -83746,7 +83948,7 @@ bbT bbT bbT bbT -bwq +bbT bxZ bzA bAK @@ -84003,7 +84205,7 @@ bqS bsm btN bfY -bwr +bfY bya bzB bAL @@ -84039,7 +84241,7 @@ bIZ cbb bDi ccO -bIZ +bva cjm cjm xgh @@ -84299,8 +84501,8 @@ bva bva aht aht -kSb -kSb +fon +fon aht aht mau @@ -86554,7 +86756,7 @@ aXL aYL aZN baW -aKI +afJ aKI beb aKI @@ -86810,8 +87012,8 @@ aVS aXM aVS aVS -aXM -bbW +aVS +aVT bbW aVS aVS @@ -87012,7 +87214,7 @@ aaa aaa aaa aaa -afJ +cFB aby aaa agQ @@ -87319,7 +87521,7 @@ aRJ aSz aSz aUP -aVT +aVS aWN aXO aYM @@ -89331,7 +89533,7 @@ aaa aaa aaa aaa -afJ +cFB aaa aaa abI @@ -94778,7 +94980,7 @@ aYg aZd beB bbq -beB +abU bdx beB bft @@ -94795,12 +94997,12 @@ jcT xje tTl tTl -tTl +bWh gkS tTl tTl tTl -koz +tTl dgg phJ phJ @@ -95052,7 +95254,7 @@ bjm mhn cqi cqi -cqi +koz cqi cqi imE @@ -95571,7 +95773,7 @@ duF bxa byE bBp -wfG +bBp bBp bBp bBp @@ -95824,7 +96026,7 @@ cCl brq byF cCt -byF +kSb bxc nIU bAo @@ -103519,7 +103721,7 @@ bbI bcG bdM beP -bfH +vzp bfH bhv bbI @@ -104000,8 +104202,8 @@ aaY awB abe abi -axw -axw +uNA +qAx axw axw aBX @@ -105349,7 +105551,7 @@ bHy bHy bHy bOs -aht +mZE aaa aaa aaa @@ -105606,7 +105808,7 @@ bCV bCV bCV bOu -bNq +aht aaa aaa aaa @@ -106115,7 +106317,7 @@ bFt bGy bHD fBz -bCV +gMm bCV bCV bCV @@ -106627,17 +106829,17 @@ bwm bAF bAF bGA -bAG -fwr -gMm bAF bAF -aht -aht -abI -abI -abI -abI +bAF +bAF +bAF +uaO +dsz +xQk +hxI +xQk +hxI abI abI abI @@ -106883,18 +107085,18 @@ cDB lWy tSL lWy -cDB +bAG bwm rBh -bwm -aht -aht -aht -aaa -aht -aaa -aaa -aaa +gjv +tfx +xlg +mJp +nqu +mJp +nqu +tlp +ilE aaa aaa aaa @@ -107140,18 +107342,18 @@ cDB hxn uvq bFx -tSL -bwm bIP -bwm -aht -aaa -aht -aaa -aht -aht -aht -aht +bNq +tSL +hMx +tfx +xlg +mhK +wIo +mhK +mhK +mhK +hyh aht aaa aaa @@ -107399,16 +107601,16 @@ obP bFy bGB bwm -bIQ bwm -aht +bwm +rNB bwm bwm rNB bwm rNB bwm -aaa +cdm aby aaa aaa @@ -107654,9 +107856,9 @@ rKL lWy lWy bFz -lWy -xlA bIR +fwr +eMC bwm aht bwm @@ -110715,7 +110917,7 @@ bcQ aaa aaa aaa -abN +bBW aaa aEj aEj @@ -110972,7 +111174,7 @@ bcQ aaa aaa aaa -aaa +cFB aaa aEl bnl diff --git a/_maps/map_files/PubbyStation/job_changes.dm b/_maps/map_files/PubbyStation/job_changes.dm deleted file mode 100644 index 726601725b..0000000000 --- a/_maps/map_files/PubbyStation/job_changes.dm +++ /dev/null @@ -1,20 +0,0 @@ -#define JOB_MODIFICATION_MAP_NAME "PubbyStation" - -/datum/job/hos/New() - ..() - MAP_JOB_CHECK - access += ACCESS_CREMATORIUM - minimal_access += ACCESS_CREMATORIUM - -/datum/job/warden/New() - ..() - MAP_JOB_CHECK - access += ACCESS_CREMATORIUM - minimal_access += ACCESS_CREMATORIUM - -/datum/job/officer/New() - ..() - MAP_JOB_CHECK - access += ACCESS_CREMATORIUM - minimal_access += ACCESS_CREMATORIUM - diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm index 5cf7c43a3e..8b16ce13a8 100644 --- a/_maps/map_files/Snaxi/Snaxi.dmm +++ b/_maps/map_files/Snaxi/Snaxi.dmm @@ -4095,7 +4095,7 @@ /area/engine/supermatter) "aOP" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/plasteel/dark, /area/security/prison) "aPw" = ( @@ -14395,7 +14395,6 @@ /obj/machinery/light{ dir = 1 }, -/obj/structure/reagent_dispensers/fueltank, /obj/machinery/camera{ c_tag = "Engineering Access" }, @@ -14403,6 +14402,7 @@ name = "Station Intercom (General)"; pixel_y = 20 }, +/obj/structure/reagent_dispensers/fueltank/high, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -27914,7 +27914,7 @@ "nIM" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck, -/obj/item/storage/box/dice{ +/obj/item/storage/dice{ pixel_x = 8 }, /obj/structure/sign/poster/contraband/random{ @@ -33380,7 +33380,7 @@ /area/bridge) "qMN" = ( /obj/structure/table, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/plasteel/grimy, /area/crew_quarters/fitness/recreation) "qNB" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 020017c3fe..7506fbdca3 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2927,13 +2927,6 @@ /obj/machinery/capture_the_flag/red, /turf/open/floor/circuit/green/anim, /area/ctf) -"hH" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/computer/slot_machine, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "hI" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -4178,6 +4171,10 @@ "ku" = ( /turf/closed/indestructible/fakeglass, /area/syndicate_mothership) +"kv" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/freezer, +/area/centcom/holding) "kw" = ( /turf/open/floor/plasteel/yellowsiding, /area/centcom/supply) @@ -4505,6 +4502,10 @@ icon_state = "alien15" }, /area/abductor_ship) +"ll" = ( +/obj/machinery/vending/autodrobe, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "ln" = ( /obj/machinery/light, /obj/effect/turf_decal/tile/brown, @@ -4762,11 +4763,15 @@ /turf/open/floor/plasteel/dark, /area/centcom/control) "lS" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "Ninja1"; - name = "Dorm 1" +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/wood, +/obj/item/soap, +/obj/item/soap, +/obj/item/soap, +/obj/item/janiupgrade, +/obj/vehicle/ridden/janicart, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "lT" = ( /obj/machinery/door/airlock/centcom{ @@ -4828,14 +4833,14 @@ }, /area/abductor_ship) "ma" = ( -/obj/machinery/button/door{ - id = "Ninja7"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet" }, -/turf/open/indestructible/hotelwood, +/obj/item/reagent_containers/rag/towel, +/obj/item/reagent_containers/rag/towel, +/obj/item/reagent_containers/rag/towel, +/turf/open/floor/carpet/royalblue, /area/centcom/holding) "mb" = ( /obj/structure/table/reinforced, @@ -6427,6 +6432,23 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/two) +"oV" = ( +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/centcom/holding) +"oW" = ( +/obj/structure/table/wood, +/obj/item/soap, +/obj/item/soap, +/obj/item/soap, +/obj/item/lightreplacer, +/obj/item/lightreplacer, +/obj/item/storage/bag/trash, +/obj/item/storage/bag/trash, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "oX" = ( /obj/structure/bookcase/random, /obj/machinery/light{ @@ -6769,14 +6791,6 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/control) -"px" = ( -/obj/structure/table, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/centcom/holding) "py" = ( /obj/machinery/smartfridge, /turf/closed/indestructible{ @@ -6792,6 +6806,41 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) +"pB" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/chem_master/condimaster{ + desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; + name = "BrewMaster 2199"; + pixel_x = -4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"pG" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "pH" = ( /obj/structure/table/wood, /obj/machinery/recharger, @@ -7289,6 +7338,16 @@ "qE" = ( /turf/closed/indestructible/riveted/uranium, /area/wizard_station) +"qF" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/machinery/washing_machine, +/turf/open/floor/plasteel/white, +/area/centcom/holding) "qI" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/light{ @@ -7296,13 +7355,6 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) -"qP" = ( -/obj/structure/chair/comfy/brown{ - color = "#596479"; - dir = 1 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "qQ" = ( /obj/machinery/door/airlock/centcom{ name = "Administrative Office"; @@ -7397,6 +7449,22 @@ /obj/machinery/vending/coffee, /turf/open/floor/plasteel, /area/syndicate_mothership) +"rg" = ( +/obj/structure/table, +/obj/item/clothing/mask/luchador, +/turf/open/floor/holofloor/wood, +/area/holodeck/rec_center/wrestlingarena) +"rh" = ( +/obj/structure/table/wood, +/obj/item/camera/detective{ + desc = "A polaroid camera with extra capacity for social media marketing."; + name = "Professional camera" + }, +/obj/item/camera_film, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "rk" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law, @@ -7889,10 +7957,6 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) -"sa" = ( -/obj/item/hilbertshotel/ghostdojo, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "sc" = ( /obj/docking_port/stationary{ area_type = /area/syndicate_mothership/control; @@ -7905,12 +7969,11 @@ /turf/open/floor/plating, /area/syndicate_mothership) "sf" = ( -/obj/machinery/vending/wallmed{ - name = "Emergency NanoMed"; - pixel_y = 28; - use_power = 0 +/obj/effect/landmark/holding_facility, +/mob/living/simple_animal/bot/medbot{ + name = "Syndicate Hospitality Drone" }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "si" = ( /obj/structure/table/wood, @@ -7928,6 +7991,12 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership) +"sk" = ( +/obj/machinery/door/airlock/wood{ + name = "Bathroom" + }, +/turf/open/floor/mineral/titanium/blue, +/area/centcom/holding) "sq" = ( /obj/machinery/computer/shuttle/white_ship{ dir = 4 @@ -8341,6 +8410,31 @@ /obj/item/reagent_containers/food/drinks/bottle/vodka, /turf/open/floor/wood, /area/syndicate_mothership) +"ta" = ( +/obj/structure/closet{ + anchored = 1; + desc = "A storage unit for plasmaman internals, courtesy of the Spider Clan."; + icon_state = "emergency"; + name = "Plasmaman emergency closet" + }, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/plasmaman/belt/full, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"tc" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Dorms" + }, +/turf/open/floor/wood, +/area/centcom/holding) "td" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -8427,9 +8521,12 @@ }, /turf/open/floor/plasteel, /area/centcom/ferry) +"tv" = ( +/turf/open/floor/holofloor/wood, +/area/holodeck/rec_center/wrestlingarena) "tx" = ( /obj/structure/table/wood, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /turf/open/floor/plasteel/grimy, /area/centcom/ferry) "ty" = ( @@ -8712,13 +8809,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel, /area/centcom/supplypod) -"tZ" = ( -/obj/structure/chair/wood/normal, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "uc" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -8734,6 +8824,10 @@ /obj/item/storage/crayons, /turf/open/floor/plasteel/freezer, /area/syndicate_mothership) +"ue" = ( +/obj/machinery/autolathe/toy, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "uf" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -8743,12 +8837,14 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/three) +"ug" = ( +/obj/structure/table, +/obj/machinery/dish_drive, +/turf/open/floor/plasteel/cafeteria, +/area/centcom/holding) "uh" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "Ninja2"; - name = "Dorm 2" - }, -/turf/open/floor/wood, +/obj/structure/dresser, +/turf/open/floor/carpet/royalblue, /area/centcom/holding) "uj" = ( /obj/item/clipboard, @@ -9033,6 +9129,16 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/evac) +"uH" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/paperframes/fifty, +/obj/item/stack/sheet/paperframes/fifty, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/box/lights/mixed, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "uJ" = ( /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/riveted, @@ -9318,19 +9424,13 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod) -"vs" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/turf_decal/tile/green{ - dir = 1 +"vp" = ( +/obj/structure/bed, +/obj/item/bedsheet/hos{ + desc = "A fancy red bedsheet."; + name = "red bedsheet" }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/indestructible/hotelwood, +/turf/open/floor/carpet/red, /area/centcom/holding) "vt" = ( /obj/structure/rack, @@ -9348,17 +9448,6 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership) -"vv" = ( -/obj/structure/closet, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/machinery/iv_drip, -/obj/item/roller, -/obj/item/storage/firstaid/regular, -/obj/item/reagent_containers/medspray/synthflesh, -/obj/item/reagent_containers/medspray/synthflesh, -/obj/item/reagent_containers/medspray/synthflesh, -/turf/open/floor/plasteel/white, -/area/centcom/holding) "vw" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -9367,6 +9456,12 @@ /mob/living/simple_animal/hostile/carp/cayenne, /turf/open/floor/plasteel, /area/syndicate_mothership) +"vx" = ( +/obj/structure/sign/barsign{ + pixel_y = 32 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "vy" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -9733,6 +9828,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/three) +"wi" = ( +/obj/effect/landmark/mafia_game_area, +/turf/open/space/basic, +/area/space) +"wj" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "wl" = ( /obj/structure/table/wood, /obj/item/paicard, @@ -9997,6 +10101,13 @@ /obj/item/toy/cards/deck, /turf/open/floor/carpet, /area/wizard_station) +"wU" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Ninja7"; + name = "Dorm 7" + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "wX" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -10005,10 +10116,12 @@ /obj/structure/chair/stool, /turf/open/floor/plasteel, /area/syndicate_mothership) -"wZ" = ( -/obj/structure/bed, -/obj/item/bedsheet/syndie, -/obj/effect/landmark/holding_facility, +"wY" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/easel, +/obj/item/canvas/twentythreeXtwentythree, /turf/open/indestructible/hotelwood, /area/centcom/holding) "xa" = ( @@ -10217,7 +10330,7 @@ /area/wizard_station) "xy" = ( /obj/structure/table/wood/fancy, -/obj/item/storage/box/dice{ +/obj/item/storage/dice{ icon_state = "magicdicebag" }, /turf/open/floor/carpet, @@ -10228,6 +10341,16 @@ /obj/machinery/light, /turf/open/floor/carpet, /area/wizard_station) +"xB" = ( +/obj/machinery/button/door{ + id = "Ninja3"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "xG" = ( /obj/structure/closet/syndicate/personal, /obj/effect/turf_decal/stripes/line{ @@ -10244,13 +10367,18 @@ /obj/item/bedsheet/syndie, /turf/open/floor/plasteel/dark, /area/syndicate_mothership) -"xO" = ( -/obj/structure/curtain, -/obj/machinery/shower, -/obj/structure/window{ - dir = 8 +"xL" = ( +/obj/structure/table/wood/bar, +/obj/structure/mirror{ + pixel_y = 28 }, -/turf/open/floor/mineral/titanium/blue, +/obj/item/lightreplacer, +/obj/item/lightreplacer, +/obj/item/lightreplacer, +/obj/item/storage/bag/trash, +/obj/item/storage/bag/trash, +/obj/item/storage/bag/trash, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "xQ" = ( /obj/effect/turf_decal/delivery, @@ -10375,6 +10503,10 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) +"yf" = ( +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/plasteel/white, +/area/centcom/holding) "yg" = ( /obj/structure/chair, /turf/open/floor/mineral/titanium, @@ -10392,6 +10524,10 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"yl" = ( +/obj/machinery/gear_painter, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "yn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, @@ -10628,13 +10764,6 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) -"yS" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "Ninja7"; - name = "Dorm 7" - }, -/turf/open/floor/wood, -/area/centcom/holding) "yU" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ @@ -10654,13 +10783,23 @@ /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) "yW" = ( -/obj/structure/window/reinforced{ - dir = 1 +/obj/structure/mirror{ + pixel_y = 28 }, -/obj/machinery/light{ - dir = 4 +/obj/structure/sink{ + dir = 1; + pixel_y = 25 }, -/turf/open/floor/grass, +/mob/living/simple_animal/bot/cleanbot, +/turf/open/floor/mineral/titanium/blue, +/area/centcom/holding) +"yX" = ( +/obj/structure/curtain, +/obj/machinery/shower, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, /area/centcom/holding) "yY" = ( /obj/structure/table/wood, @@ -10891,6 +11030,10 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/syndicate_mothership) +"zy" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "zz" = ( /obj/structure/table/wood, /obj/item/storage/box/drinkingglasses, @@ -10948,6 +11091,21 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"zE" = ( +/obj/machinery/plantgenes/seedvault, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/table, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "zF" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -11071,15 +11229,6 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) -"zS" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/freezer, -/area/centcom/holding) -"zT" = ( -/turf/open/indestructible/boss/air, -/area/centcom/holding) "zU" = ( /obj/structure/closet/crate/freezer, /turf/open/floor/plasteel/cafeteria, @@ -11095,13 +11244,6 @@ /obj/item/reagent_containers/food/snacks/carpmeat, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) -"zW" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "Ninja5"; - name = "Dorm 5" - }, -/turf/open/floor/wood, -/area/centcom/holding) "zX" = ( /obj/structure/table, /obj/machinery/light{ @@ -11111,12 +11253,14 @@ /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) "zY" = ( -/obj/item/bedsheet/wiz{ - desc = "A glow in the dark blue bedsheet."; - name = "blue bedsheet" +/obj/machinery/light{ + dir = 8 }, -/obj/structure/bed, -/turf/open/floor/carpet/royalblue, +/obj/structure/musician/piano, +/obj/structure/sign/painting{ + pixel_x = -32 + }, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Aa" = ( /turf/open/floor/mech_bay_recharge_floor, @@ -11356,16 +11500,6 @@ /obj/effect/decal/remains/xeno, /turf/open/floor/grass, /area/wizard_station) -"AC" = ( -/obj/machinery/button/door{ - id = "Ninja5"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "AD" = ( /obj/machinery/door/airlock/centcom{ name = "Leader's Room"; @@ -11373,10 +11507,6 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership) -"AE" = ( -/obj/machinery/vending/coffee, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "AG" = ( /obj/structure/ladder/unbreakable/binary/space, /turf/open/indestructible/airblock, @@ -11595,15 +11725,13 @@ /obj/machinery/mech_bay_recharge_port, /turf/open/floor/plating, /area/syndicate_mothership) -"Bq" = ( -/obj/machinery/sleeper{ - dir = 8 +"Bm" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/sign/painting{ + pixel_x = 32 }, -/turf/open/floor/plasteel/white, -/area/centcom/holding) -"Bs" = ( -/obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Bu" = ( @@ -12458,13 +12586,6 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/evac) -"CQ" = ( -/obj/effect/landmark/holding_facility, -/mob/living/simple_animal/bot/medbot{ - name = "Syndicate Hospitality Drone" - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "CR" = ( /obj/machinery/computer/security{ dir = 8 @@ -12484,8 +12605,37 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/evac) -"CV" = ( -/obj/structure/chair/stool, +"CS" = ( +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"CT" = ( +/obj/structure/bedsheetbin/towel, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/centcom/holding) +"CU" = ( +/obj/structure/closet, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/item/stack/tile/wood{ + amount = 24 + }, +/obj/item/stack/tile/carpet/black/fifty, +/obj/item/stack/tile/carpet/blackred/fifty, +/obj/item/stack/tile/carpet/blue/fifty, +/obj/item/stack/tile/carpet/cyan/fifty, +/obj/item/stack/tile/carpet/fifty, +/obj/item/stack/tile/carpet/green/fifty, +/obj/item/stack/tile/carpet/monochrome/fifty, +/obj/item/stack/tile/carpet/orange/fifty, +/obj/item/stack/tile/carpet/purple/fifty, +/obj/item/stack/tile/carpet/red/fifty, +/obj/item/stack/tile/carpet/royalblack/fifty, +/obj/item/stack/tile/carpet/royalblue/fifty, /turf/open/indestructible/hotelwood, /area/centcom/holding) "CX" = ( @@ -12680,9 +12830,20 @@ /obj/structure/table, /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) -"Dl" = ( -/obj/structure/mineral_door/paperframe, -/turf/open/indestructible/hotelwood, +"Dm" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Ninja2"; + name = "Dorm 2" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"Dn" = ( +/obj/machinery/vending/wallmed{ + name = "Emergency NanoMed"; + pixel_y = 28; + use_power = 0 + }, +/turf/open/floor/plasteel/white, /area/centcom/holding) "Do" = ( /obj/effect/turf_decal/tile/bar, @@ -13277,14 +13438,6 @@ /obj/structure/barricade/wooden, /turf/open/floor/engine/cult, /area/wizard_station) -"ED" = ( -/obj/machinery/vending/boozeomat, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, -/area/centcom/holding) "EE" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/neutral{ @@ -13495,6 +13648,19 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) +"Fb" = ( +/obj/structure/chair/stool, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"Fe" = ( +/turf/closed/indestructible/wood, +/area/centcom/holding) +"Ff" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Cryo" + }, +/turf/open/floor/wood, +/area/centcom/holding) "Fg" = ( /obj/structure/flora/grass/brown, /obj/effect/light_emitter, @@ -13503,9 +13669,9 @@ "Fh" = ( /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) -"Fl" = ( -/obj/structure/bedsheetbin/towel, -/turf/open/floor/plasteel/white, +"Fj" = ( +/obj/structure/closet/crate/bin, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fm" = ( /obj/machinery/shower{ @@ -13973,6 +14139,13 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) +"Gt" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/computer/slot_machine, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Gu" = ( /obj/machinery/door/airlock/silver{ name = "Shower" @@ -14423,24 +14596,7 @@ /turf/open/floor/plasteel/white, /area/tdome/tdomeobserve) "Hj" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/musician/piano, -/obj/structure/sign/painting{ - pixel_x = -32 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"Hk" = ( -/obj/structure/table/wood, -/obj/item/camera/detective{ - desc = "A polaroid camera with extra capacity for social media marketing."; - name = "Professional camera" - }, -/obj/item/camera_film, -/obj/item/paper_bin, -/obj/item/pen/fountain, +/obj/structure/bedsheetbin, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Hm" = ( @@ -14594,6 +14750,13 @@ }, /turf/open/floor/plasteel/white, /area/tdome/tdomeobserve) +"Hy" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Ninja3"; + name = "Dorm 3" + }, +/turf/open/floor/wood, +/area/centcom/holding) "HA" = ( /obj/structure/sink{ dir = 8; @@ -14653,6 +14816,13 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) +"HE" = ( +/obj/structure/dresser, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "HF" = ( /obj/structure/sink{ dir = 4; @@ -15515,11 +15685,8 @@ /turf/open/floor/plasteel, /area/tdome/tdomeadmin) "Jq" = ( -/obj/machinery/camera{ - c_tag = "Arena"; - network = list("thunder"); - pixel_x = 10; - resistance_flags = 64 +/obj/machinery/camera/motion/thunderdome{ + pixel_x = 10 }, /turf/open/floor/circuit/green, /area/tdome/arena) @@ -15785,12 +15952,6 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) -"JV" = ( -/obj/structure/table, -/obj/item/stack/packageWrap, -/obj/item/reagent_containers/glass/beaker, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "JX" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -15846,13 +16007,6 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) -"Kf" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/reagent_containers/rag/towel, -/obj/item/reagent_containers/rag/towel, -/obj/item/reagent_containers/rag/towel, -/turf/open/floor/carpet/red, -/area/centcom/holding) "Kg" = ( /turf/closed/indestructible/fakedoor{ name = "Thunderdome Admin" @@ -15869,16 +16023,6 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeadmin) -"Ki" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet" - }, -/obj/item/reagent_containers/rag/towel, -/obj/item/reagent_containers/rag/towel, -/obj/item/reagent_containers/rag/towel, -/turf/open/floor/carpet/royalblue, -/area/centcom/holding) "Kj" = ( /obj/machinery/door/airlock/external{ name = "Backup Emergency Escape Shuttle" @@ -16299,6 +16443,11 @@ }, /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) +"Ld" = ( +/obj/structure/table, +/obj/item/clothing/mask/luchador/rudos, +/turf/open/floor/holofloor/wood, +/area/holodeck/rec_center/wrestlingarena) "Lh" = ( /obj/machinery/sleeper{ dir = 8 @@ -16311,44 +16460,29 @@ }, /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) -"Lk" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/storage/box/bodybags, -/obj/item/storage/box/bodybags, -/obj/item/storage/box/bodybags, -/turf/open/floor/plasteel/white, -/area/centcom/holding) -"Ll" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/easel, -/obj/item/canvas/twentythreeXtwentythree, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"Lm" = ( -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/centcom/holding) -"Ln" = ( -/obj/structure/toilet{ +"Lj" = ( +/obj/machinery/light{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, /area/centcom/holding) +"Lm" = ( +/obj/structure/table, +/obj/item/clothing/mask/luchador/tecnicos, +/turf/open/floor/holofloor/wood, +/area/holodeck/rec_center/wrestlingarena) "Lp" = ( /obj/structure/chair{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) -"Lr" = ( -/obj/structure/mopbucket, -/obj/item/mop, -/turf/open/indestructible/hotelwood, +"Lq" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Ninja6"; + name = "Dorm 6" + }, +/turf/open/floor/wood, /area/centcom/holding) "Ls" = ( /obj/docking_port/stationary{ @@ -16379,6 +16513,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) +"Ly" = ( +/obj/structure/bed, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "LA" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -16611,6 +16752,14 @@ }, /turf/open/floor/plasteel, /area/tdome/arena) +"Mj" = ( +/obj/item/bedsheet/wiz{ + desc = "A glow in the dark blue bedsheet."; + name = "blue bedsheet" + }, +/obj/structure/bed, +/turf/open/floor/carpet/royalblue, +/area/centcom/holding) "Mk" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -16620,8 +16769,22 @@ "Mm" = ( /turf/open/floor/grass, /area/centcom/holding) -"Ms" = ( -/obj/effect/mob_spawn/human/ghostcafe{ +"Mn" = ( +/obj/machinery/vr_sleeper/hugbox{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"Mq" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ dir = 8 }, /turf/open/indestructible/hotelwood, @@ -16640,6 +16803,16 @@ /obj/item/storage/fancy/donut_box, /turf/open/floor/plasteel, /area/centcom/supplypod) +"Mw" = ( +/obj/machinery/button/door{ + id = "Ninja7"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Mx" = ( /obj/machinery/light{ dir = 4 @@ -16666,13 +16839,10 @@ /turf/open/floor/plating/asteroid/snow/airless, /area/syndicate_mothership) "Mz" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/paperframes/fifty, -/obj/item/stack/sheet/paperframes/fifty, -/obj/item/storage/fancy/candle_box, -/obj/item/storage/fancy/candle_box, -/obj/item/storage/fancy/candle_box, -/obj/item/storage/box/lights/mixed, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, /turf/open/indestructible/hotelwood, /area/centcom/holding) "MB" = ( @@ -16723,11 +16893,8 @@ "MI" = ( /turf/open/floor/plating, /area/syndicate_mothership) -"MJ" = ( -/obj/structure/bed, -/obj/machinery/light/small{ - dir = 1 - }, +"ML" = ( +/obj/structure/table/wood/fancy, /turf/open/indestructible/hotelwood, /area/centcom/holding) "MM" = ( @@ -16740,9 +16907,13 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) -"MR" = ( -/obj/machinery/light{ - dir = 4 +"MQ" = ( +/obj/machinery/button/door{ + id = "Ninja5"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 }, /turf/open/indestructible/hotelwood, /area/centcom/holding) @@ -16758,6 +16929,29 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/two) +"MW" = ( +/obj/structure/mopbucket, +/obj/item/mop, +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "sink"; + pixel_y = 28 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"MX" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/item/storage/box/bodybags, +/obj/item/storage/box/bodybags, +/obj/item/storage/box/bodybags, +/turf/open/floor/plasteel/white, +/area/centcom/holding) +"Na" = ( +/obj/item/paicard, +/obj/structure/table/wood, +/turf/open/floor/engine/cult, +/area/wizard_station) "Nc" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -16775,7 +16969,27 @@ }, /area/centcom/holding) "Nf" = ( -/obj/machinery/autolathe/toy, +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/centcom/holding) +"Ng" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythreeXnineteen, +/obj/item/canvas/twentythreeXnineteen, +/obj/item/canvas/twentythreeXnineteen, +/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/nineteenXnineteen, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Ni" = ( @@ -16804,24 +17018,50 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) -"Nt" = ( -/obj/structure/bedsheetbin/color, +"Nl" = ( +/turf/open/floor/carpet/royalblue, +/area/centcom/holding) +"Nn" = ( +/obj/machinery/vending/hydronutrients, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"Np" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Ninja7"; + name = "Dorm 7" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"Ns" = ( +/obj/structure/mopbucket, +/obj/item/mop, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Nu" = ( /turf/open/floor/wood, /area/syndicate_mothership) +"Nv" = ( +/obj/machinery/vending/boozeomat, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/centcom/holding) "Nw" = ( /obj/machinery/recharge_station, /turf/open/floor/plasteel/white, /area/centcom/holding) -"Nx" = ( -/obj/machinery/processor, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "Nz" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -16831,28 +17071,11 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/two) -"NA" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXnineteen, -/obj/item/canvas/twentythreeXnineteen, -/obj/item/canvas/twentythreeXnineteen, -/obj/item/canvas/nineteenXnineteen, -/obj/item/canvas/nineteenXnineteen, -/obj/item/canvas/nineteenXnineteen, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"NE" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/centcom/holding) +"NB" = ( +/obj/structure/table, +/obj/item/storage/belt/champion/wrestling/holodeck, +/turf/open/floor/holofloor/wood, +/area/holodeck/rec_center/wrestlingarena) "NF" = ( /obj/structure/ladder/unbreakable/binary, /turf/open/indestructible/airblock, @@ -16868,9 +17091,14 @@ }, /turf/open/floor/plasteel, /area/centcom/control) -"NN" = ( -/obj/item/storage/box/bodybags, -/obj/item/storage/box/bodybags, +"NP" = ( +/obj/machinery/button/crematorium{ + id = "crematoriumGhostDojo"; + pixel_x = -25 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"NS" = ( /turf/open/indestructible/hotelwood, /area/centcom/holding) "NT" = ( @@ -16897,11 +17125,10 @@ /obj/machinery/vending/cola/sodie, /turf/open/floor/plasteel, /area/syndicate_mothership) -"NZ" = ( -/obj/structure/table/wood/bar, -/obj/structure/safe/floor, -/obj/item/seeds/cherry/bomb, -/obj/item/key/janitor, +"NX" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Oa" = ( @@ -16930,15 +17157,18 @@ /obj/machinery/deepfryer, /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) -"Of" = ( -/turf/open/floor/carpet/red, -/area/centcom/holding) "Oh" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) +"Oi" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/centcom/holding) "Oj" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ @@ -16952,9 +17182,8 @@ }, /turf/open/floor/plasteel, /area/centcom/control) -"Ol" = ( -/obj/structure/table/wood/fancy, -/turf/open/indestructible/hotelwood, +"Ok" = ( +/turf/open/indestructible/boss/air, /area/centcom/holding) "Om" = ( /obj/effect/turf_decal/tile/brown, @@ -16963,9 +17192,13 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/three) -"On" = ( -/obj/structure/sign/painting{ - pixel_x = 32 +"Oo" = ( +/obj/machinery/button/door{ + id = "Ninja1"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 }, /turf/open/indestructible/hotelwood, /area/centcom/holding) @@ -16983,23 +17216,20 @@ /mob/living/simple_animal/bot/cleanbot, /turf/open/floor/plasteel/white, /area/centcom/holding) +"Oq" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet" + }, +/obj/item/coin/silver, +/obj/item/coin/silver, +/obj/item/coin/silver, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Or" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/two) -"Os" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"Ot" = ( -/obj/machinery/washing_machine, -/turf/open/floor/mineral/titanium/blue, -/area/centcom/holding) "Ou" = ( /turf/closed/indestructible/fakedoor{ name = "Cold Storage" @@ -17009,12 +17239,22 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) -"Ox" = ( -/obj/machinery/door/airlock/wood/glass{ - name = "Cryo" +"Ow" = ( +/obj/machinery/vending/kink{ + extended_inventory = 1 }, /turf/open/floor/wood, /area/centcom/holding) +"Oy" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/structure/curtain, +/turf/open/floor/mineral/titanium/blue, +/area/centcom/holding) "Oz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -17038,17 +17278,14 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod) -"OG" = ( -/obj/structure/dresser, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "OH" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) +"OI" = ( +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel/white, +/area/centcom/holding) "OL" = ( /obj/structure/mineral_door/paperframe{ name = "Dojo" @@ -17066,14 +17303,20 @@ /obj/item/storage/box/handcuffs, /turf/open/floor/mineral/plastitanium/red, /area/centcom/evac) +"OO" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/turf/open/floor/mineral/titanium/blue, +/area/centcom/holding) "OS" = ( /obj/structure/mecha_wreckage/mauler, /turf/open/floor/plasteel/dark, /area/syndicate_mothership) -"OT" = ( -/obj/structure/table, -/turf/open/floor/plasteel/white, -/area/centcom/holding) "OU" = ( /obj/item/clothing/under/costume/jabroni, /obj/item/clothing/under/costume/geisha, @@ -17088,47 +17331,16 @@ }, /turf/open/floor/wood, /area/syndicate_mothership) -"OW" = ( -/obj/structure/bedsheetbin/towel, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/blue, -/area/centcom/holding) "OZ" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plating, /area/syndicate_mothership) -"Pc" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "sink"; - pixel_y = 28 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/item/paper/guides/jobs/hydroponics, -/obj/item/book/manual/hydroponics_pod_people, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Pg" = ( /obj/machinery/light{ dir = 1 }, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) -"Ph" = ( -/obj/structure/closet/crate/bin, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Pl" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -17147,6 +17359,14 @@ }, /turf/open/indestructible/boss/air, /area/centcom/holding) +"Pp" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/plasteel/cafeteria, +/area/centcom/holding) "Pr" = ( /obj/structure/table, /obj/item/book/manual/chef_recipes, @@ -17170,6 +17390,15 @@ /obj/machinery/light/small, /turf/open/floor/wood, /area/syndicate_mothership) +"Px" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/centcom/holding) +"Pz" = ( +/turf/open/floor/plasteel/freezer, +/area/centcom/holding) "PA" = ( /obj/structure/window/reinforced{ dir = 4 @@ -17179,13 +17408,8 @@ "PD" = ( /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) -"PG" = ( -/obj/structure/table/reinforced, -/obj/item/camera, -/turf/open/floor/plasteel, -/area/centcom/supplypod) -"PI" = ( -/obj/machinery/biogenerator, +"PE" = ( +/obj/machinery/vending/hydroseeds, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -17198,6 +17422,28 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) +"PG" = ( +/obj/structure/table/reinforced, +/obj/item/camera, +/turf/open/floor/plasteel, +/area/centcom/supplypod) +"PI" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/item/reagent_containers/glass/beaker/large, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "PJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -17205,17 +17451,16 @@ /turf/open/floor/plating, /area/syndicate_mothership) "PL" = ( -/obj/machinery/autolathe, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"PM" = ( -/obj/machinery/vending/clothing{ - extended_inventory = 1 +/obj/machinery/light{ + dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PO" = ( /obj/machinery/hydroponics/constructable, +/obj/machinery/light{ + dir = 8 + }, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -17234,11 +17479,6 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) -"PQ" = ( -/obj/structure/closet/secure_closet, -/obj/item/coin/silver, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "PS" = ( /obj/machinery/computer/shuttle/syndicate/recall, /obj/effect/turf_decal/tile/bar, @@ -17268,6 +17508,9 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding) "PY" = ( +/obj/structure/closet/secure_closet/hydroponics{ + locked = 0 + }, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -17278,6 +17521,10 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/item/seeds/ambrosia/gaia, +/obj/item/seeds/ambrosia/gaia, +/obj/item/seeds/pumpkin/blumpkin, +/obj/item/seeds/pumpkin/blumpkin, /turf/open/indestructible/hotelwood, /area/centcom/holding) "PZ" = ( @@ -17294,18 +17541,20 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/evac) -"Qc" = ( -/obj/effect/landmark/mafia_game_area, -/turf/open/space/basic, -/area/space) +"Qd" = ( +/obj/structure/table/optable, +/turf/open/floor/plasteel/white, +/area/centcom/holding) "Qe" = ( /turf/open/ai_visible, /area/ai_multicam_room) -"Qi" = ( -/obj/item/paicard, -/obj/structure/table/wood, -/turf/open/floor/engine/cult, -/area/wizard_station) +"Qh" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Ninja1"; + name = "Dorm 1" + }, +/turf/open/floor/wood, +/area/centcom/holding) "Qk" = ( /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/ppflowers, @@ -17313,31 +17562,27 @@ /obj/structure/window/reinforced/fulltile, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Ql" = ( -/obj/machinery/light, -/obj/effect/landmark/holding_facility, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Qm" = ( /obj/singularity/wizard/mapped, /turf/open/indestructible/binary, /area/fabric_of_reality) "Qn" = ( -/obj/machinery/vr_sleeper/hugbox{ - dir = 8 - }, +/obj/machinery/door/airlock/wood, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Qo" = ( /turf/open/floor/mineral/plastitanium/red, /area/centcom/evac) -"Qp" = ( -/obj/structure/bedsheetbin, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Qq" = ( /turf/open/floor/plasteel/freezer, /area/syndicate_mothership) +"Qs" = ( +/obj/structure/table/wood/bar, +/obj/structure/safe/floor, +/obj/item/seeds/cherry/bomb, +/obj/item/key/janitor, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Qt" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/pizzaslice/mushroom, @@ -17347,20 +17592,33 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership) -"Qu" = ( -/obj/machinery/door/airlock/wood/glass{ - name = "Dorms" - }, -/turf/open/floor/wood, -/area/centcom/holding) "Qw" = ( -/turf/open/floor/plasteel/freezer, -/area/centcom/holding) +/obj/structure/table, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing/green, +/obj/item/clothing/gloves/boxing/yellow, +/turf/open/floor/holofloor/wood, +/area/holodeck/rec_center/wrestlingarena) "Qy" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/plasteel/white, +/obj/structure/table/wood/fancy/royalblue, +/turf/open/indestructible/hotelwood, /area/centcom/holding) -"Qz" = ( +"QA" = ( +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/centcom/holding) +"QB" = ( +/obj/machinery/computer/telecrystals/uplinker, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/syndicate_mothership) +"QE" = ( +/turf/open/floor/plasteel, +/area/centcom/supplypod) +"QF" = ( /obj/item/coin/silver, /obj/item/coin/silver, /obj/item/coin/silver, @@ -17379,42 +17637,6 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"QA" = ( -/obj/machinery/deepfryer, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"QB" = ( -/obj/machinery/computer/telecrystals/uplinker, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/syndicate_mothership) -"QC" = ( -/obj/machinery/door/airlock/wood{ - name = "Bathroom" - }, -/turf/open/floor/mineral/titanium/blue, -/area/centcom/holding) -"QE" = ( -/turf/open/floor/plasteel, -/area/centcom/supplypod) -"QF" = ( -/obj/machinery/button/door{ - id = "Ninja3"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"QJ" = ( -/obj/structure/sign/barsign{ - pixel_y = 32 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "QK" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -17426,11 +17648,18 @@ /obj/structure/window/reinforced/fulltile, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"QN" = ( -/obj/machinery/light{ - dir = 4 +"QM" = ( +/obj/effect/mob_spawn/human/ghostcafe{ + dir = 8 }, -/turf/open/floor/mineral/titanium/blue, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"QN" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/reagent_containers/rag/towel, +/obj/item/reagent_containers/rag/towel, +/obj/item/reagent_containers/rag/towel, +/turf/open/floor/carpet/red, /area/centcom/holding) "QP" = ( /obj/machinery/computer/mech_bay_power_console{ @@ -17450,6 +17679,15 @@ /obj/item/storage/box/donkpockets, /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) +"QS" = ( +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "QT" = ( /obj/machinery/chem_dispenser/drinks, /turf/closed/indestructible{ @@ -17501,26 +17739,6 @@ }, /turf/open/floor/grass, /area/centcom/holding) -"Ri" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"Rj" = ( -/obj/machinery/vending/hydroseeds, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Rl" = ( /obj/structure/mirror{ pixel_x = -28 @@ -17535,39 +17753,14 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Ro" = ( -/obj/structure/closet{ - anchored = 1; - desc = "A storage unit for plasmaman internals, courtesy of the Spider Clan."; - icon_state = "emergency"; - name = "Plasmaman emergency closet" - }, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Rq" = ( -/obj/machinery/light{ - dir = 1; - light_color = "#cee5d2" - }, -/turf/open/indestructible/hotelwood, +/obj/machinery/washing_machine, +/turf/open/floor/mineral/titanium/blue, /area/centcom/holding) "Ru" = ( -/obj/structure/fireplace, -/turf/open/floor/carpet/red, -/area/centcom/holding) -"Rv" = ( -/obj/structure/dresser, -/turf/open/floor/carpet/royalblue, +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/plasteel/white, /area/centcom/holding) "Rz" = ( /obj/effect/turf_decal/loading_area, @@ -17583,48 +17776,12 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) -"RK" = ( -/obj/structure/closet/crate/freezer/blood, -/turf/open/floor/plasteel/white, -/area/centcom/holding) -"RL" = ( -/obj/machinery/vending/cola, +"RM" = ( +/obj/structure/chair/comfy/brown{ + color = "#596479" + }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"RN" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/item/reagent_containers/glass/beaker/large, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"RO" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/structure/window{ - dir = 8 - }, -/obj/structure/curtain, -/turf/open/floor/mineral/titanium/blue, -/area/centcom/holding) -"RP" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "Ninja4"; - name = "Dorm 4" - }, -/turf/open/floor/wood, -/area/centcom/holding) "RQ" = ( /obj/item/kirbyplants{ icon_state = "plant-21"; @@ -17647,12 +17804,6 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"RX" = ( -/obj/structure/chair/comfy/brown{ - color = "#596479" - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "RZ" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -17671,6 +17822,9 @@ /turf/open/floor/plasteel/dark, /area/syndicate_mothership) "Sd" = ( +/obj/structure/sign/painting{ + pixel_x = 32 + }, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Sf" = ( @@ -17698,13 +17852,6 @@ /obj/item/toy/nuke, /turf/open/floor/wood, /area/syndicate_mothership) -"Sj" = ( -/obj/machinery/vending/autodrobe{ - extended_inventory = 1 - }, -/obj/machinery/light, -/turf/open/floor/wood, -/area/centcom/holding) "So" = ( /obj/structure/chair/wood/wings{ dir = 4 @@ -17714,21 +17861,15 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Sw" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +"St" = ( +/obj/machinery/shower{ dir = 4 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, +/turf/open/floor/plasteel/freezer, +/area/centcom/holding) +"Sv" = ( +/obj/structure/closet/secure_closet, +/obj/item/coin/silver, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Sy" = ( @@ -17755,6 +17896,13 @@ /obj/item/mop, /turf/open/floor/plasteel/freezer, /area/syndicate_mothership) +"SE" = ( +/obj/structure/chair/wood/normal, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "SF" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -17764,14 +17912,6 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod) -"SG" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "SH" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -17789,6 +17929,13 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/two) +"SM" = ( +/obj/machinery/vending/autodrobe{ + extended_inventory = 1 + }, +/obj/machinery/light, +/turf/open/floor/wood, +/area/centcom/holding) "SN" = ( /obj/structure/mopbucket, /obj/item/mop, @@ -17798,16 +17945,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/space/basic, /area/centcom/supplypod) -"SR" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "Ninja7"; - name = "Dorm 7" +"SU" = ( +/obj/machinery/light{ + dir = 4 }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"ST" = ( -/turf/open/floor/mineral/titanium/blue, -/area/centcom/holding) "SV" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -17817,7 +17960,14 @@ /turf/open/floor/plasteel, /area/syndicate_mothership) "SW" = ( -/obj/machinery/seed_extractor, +/obj/structure/closet/crate/hydroponics, +/obj/item/shovel/spade, +/obj/item/wirecutters, +/obj/item/wrench, +/obj/item/watertank, +/obj/item/cultivator, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -17834,28 +17984,18 @@ /obj/structure/table/wood, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"SZ" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "Ninja3"; - name = "Dorm 3" - }, -/turf/open/floor/wood, -/area/centcom/holding) -"Tc" = ( -/obj/machinery/button/door{ - id = "Ninja2"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/turf/open/indestructible/hotelwood, +"Td" = ( +/obj/structure/fireplace, +/turf/open/floor/carpet/red, /area/centcom/holding) "Tf" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/plasteel/freezer, +/obj/machinery/light, +/obj/effect/landmark/holding_facility, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"Tg" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel/white, /area/centcom/holding) "Tj" = ( /obj/effect/turf_decal/tile/bar, @@ -17875,26 +18015,14 @@ "To" = ( /turf/open/indestructible/airblock, /area/fabric_of_reality) -"Tq" = ( -/obj/structure/table/wood/bar, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/storage/toolbox/mechanical, -/obj/item/stack/sheet/plastic/fifty, -/obj/item/multitool, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Tr" = ( /obj/structure/closet/chefcloset, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) -"Tt" = ( -/obj/structure/toilet{ +"Ts" = ( +/obj/machinery/light{ dir = 4 }, -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, /turf/open/floor/plasteel/white, /area/centcom/holding) "Tu" = ( @@ -17905,38 +18033,6 @@ /obj/structure/window/reinforced/fulltile, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Tw" = ( -/obj/structure/closet{ - anchored = 1; - name = "Plasmaman suits" - }, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"Tx" = ( -/obj/machinery/plantgenes/seedvault, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/table, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Tz" = ( /obj/effect/light_emitter, /turf/open/floor/plating/asteroid/snow/airless, @@ -17951,17 +18047,9 @@ /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) -"TC" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/freezer, -/area/centcom/holding) "TD" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/sign/painting{ - pixel_x = 32 - }, +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole/bookmanagement, /turf/open/indestructible/hotelwood, /area/centcom/holding) "TF" = ( @@ -17973,15 +18061,12 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) -"TG" = ( -/obj/machinery/light{ - dir = 8 +"TJ" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Ninja5"; + name = "Dorm 5" }, -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/white, +/turf/open/floor/wood, /area/centcom/holding) "TM" = ( /mob/living/simple_animal/bot/medbot{ @@ -18008,24 +18093,46 @@ }, /turf/open/floor/plasteel/freezer, /area/syndicate_mothership) -"TY" = ( -/obj/machinery/light{ - dir = 1 +"TS" = ( +/obj/structure/closet{ + anchored = 1; + name = "Plasmaman suits" }, -/obj/item/soap, -/obj/item/soap, -/obj/item/soap, -/obj/item/janiupgrade, -/obj/vehicle/ridden/janicart, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, /turf/open/indestructible/hotelwood, /area/centcom/holding) +"TV" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/reagent_containers/glass/beaker, +/turf/open/floor/plasteel/cafeteria, +/area/centcom/holding) +"TY" = ( +/obj/structure/bedsheetbin/color, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"TZ" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/centcom/holding) "Uc" = ( -/obj/machinery/vending/sustenance, +/obj/structure/bodycontainer/crematorium{ + dir = 4; + id = "crematoriumGhostDojo" + }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Ud" = ( -/turf/closed/indestructible/wood, -/area/centcom/holding) "Ug" = ( /obj/machinery/door/poddoor/shuttledock{ checkdir = 1; @@ -18045,11 +18152,6 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Ui" = ( -/obj/structure/table, -/obj/item/clothing/mask/luchador/tecnicos, -/turf/open/floor/holofloor/wood, -/area/holodeck/rec_center/wrestlingarena) "Uj" = ( /obj/machinery/door/airlock/centcom{ name = "Restroom"; @@ -18058,23 +18160,7 @@ /turf/open/floor/plasteel, /area/syndicate_mothership) "Uk" = ( -/obj/structure/closet/crate, -/obj/item/vending_refill/autodrobe, -/obj/item/vending_refill/autodrobe, -/obj/item/vending_refill/boozeomat, -/obj/item/vending_refill/boozeomat, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/clothing, -/obj/item/vending_refill/coffee, -/obj/item/vending_refill/coffee, -/obj/item/vending_refill/cola, -/obj/item/vending_refill/cola, -/obj/item/vending_refill/wallmed, -/obj/item/vending_refill/wallmed, -/obj/item/vending_refill/snack, -/obj/item/vending_refill/snack, -/turf/open/indestructible/hotelwood, +/turf/open/floor/mineral/titanium/blue, /area/centcom/holding) "Ul" = ( /obj/structure/table, @@ -18083,15 +18169,27 @@ }, /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) -"Um" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/shovel/spade, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/item/watertank, -/obj/item/cultivator, -/obj/item/reagent_containers/glass/bucket, -/obj/item/reagent_containers/glass/bucket, +"Un" = ( +/obj/machinery/door/airlock/centcom{ + name = "Thunderdome"; + req_access_txt = "101" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/tdome/tdomeobserve) +"Uq" = ( +/obj/machinery/button/door{ + id = "Ninja2"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"Ur" = ( +/obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -18104,29 +18202,6 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Un" = ( -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome"; - req_access_txt = "101" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, -/area/tdome/tdomeobserve) -"Uq" = ( -/obj/structure/table/wood, -/obj/item/soap, -/obj/item/soap, -/obj/item/soap, -/obj/item/lightreplacer, -/obj/item/lightreplacer, -/obj/item/storage/bag/trash, -/obj/item/storage/bag/trash, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"Ur" = ( -/turf/open/floor/carpet/royalblue, -/area/centcom/holding) "Uu" = ( /obj/machinery/light{ dir = 8 @@ -18143,30 +18218,19 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/evac) +"Ux" = ( +/obj/structure/table, +/turf/open/floor/plasteel/white, +/area/centcom/holding) "Uy" = ( /obj/structure/flora/bush, /obj/effect/light_emitter, /turf/open/floor/plating/asteroid/snow/airless, /area/syndicate_mothership) -"Uz" = ( -/obj/structure/table, -/obj/machinery/dish_drive, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "UC" = ( /obj/machinery/vending/cola, /turf/open/floor/plasteel, /area/centcom/supplypod) -"UD" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet" - }, -/obj/item/coin/silver, -/obj/item/coin/silver, -/obj/item/coin/silver, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "UE" = ( /obj/structure/chair/stool/bar, /turf/open/indestructible/hotelwood, @@ -18177,6 +18241,13 @@ /obj/effect/light_emitter, /turf/open/floor/plating/asteroid/snow/airless, /area/syndicate_mothership) +"UI" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Ninja4"; + name = "Dorm 4" + }, +/turf/open/floor/wood, +/area/centcom/holding) "UL" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -18187,17 +18258,6 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod) -"UN" = ( -/obj/structure/mirror{ - pixel_y = 28 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = 25 - }, -/mob/living/simple_animal/bot/cleanbot, -/turf/open/floor/mineral/titanium/blue, -/area/centcom/holding) "UO" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security"; @@ -18211,6 +18271,10 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"UP" = ( +/obj/structure/chair/comfy/brown, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "UQ" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -18221,16 +18285,21 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/one) -"US" = ( -/obj/machinery/gibber, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "UT" = ( /obj/structure/chair/wood/wings{ dir = 1 }, /turf/open/indestructible/hotelwood, /area/centcom/holding) +"UU" = ( +/obj/structure/table/wood/bar, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/storage/toolbox/mechanical, +/obj/item/stack/sheet/plastic/fifty, +/obj/item/multitool, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "UV" = ( /obj/machinery/computer/arcade, /turf/open/indestructible/hotelwood, @@ -18292,11 +18361,11 @@ /obj/structure/window/reinforced/tinted, /turf/open/floor/plasteel/freezer, /area/syndicate_mothership) -"Vk" = ( -/obj/structure/table, -/obj/item/storage/belt/champion/wrestling/holodeck, -/turf/open/floor/holofloor/wood, -/area/holodeck/rec_center/wrestlingarena) +"Vn" = ( +/obj/item/storage/box/bodybags, +/obj/item/storage/box/bodybags, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Vt" = ( /obj/item/paper/fluff/stations/centcom/disk_memo, /obj/structure/noticeboard{ @@ -18359,6 +18428,16 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/one) +"VC" = ( +/obj/machinery/button/door{ + id = "Ninja6"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "VF" = ( /obj/structure/rack, /obj/item/nullrod/scythe/vibro{ @@ -18367,11 +18446,16 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"VL" = ( -/obj/machinery/button/crematorium{ - id = "crematoriumGhostDojo"; - pixel_x = -25 - }, +"VH" = ( +/obj/machinery/vending/sustenance, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"VI" = ( +/obj/machinery/autolathe, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"VK" = ( +/obj/machinery/vending/clothing, /turf/open/indestructible/hotelwood, /area/centcom/holding) "VO" = ( @@ -18406,6 +18490,10 @@ /obj/effect/landmark/shuttle_import, /turf/open/space/basic, /area/space) +"VY" = ( +/obj/machinery/vending/cola, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Wb" = ( /obj/machinery/door/window/westleft, /turf/open/indestructible/boss/air, @@ -18423,6 +18511,10 @@ }, /turf/open/floor/plasteel, /area/centcom/evac) +"We" = ( +/obj/machinery/vending/coffee, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Wi" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -18440,58 +18532,38 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) -"Wl" = ( -/obj/machinery/door/airlock/wood, -/turf/open/indestructible/hotelwood, +"Wp" = ( +/obj/machinery/processor, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/centcom/holding) +"Wq" = ( +/obj/machinery/gibber, +/turf/open/floor/plasteel/cafeteria, /area/centcom/holding) "Wr" = ( /turf/open/floor/plasteel/dark, /area/centcom/supplypod) -"Ws" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "Ninja6"; - name = "Dorm 6" +"Wu" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/open/floor/wood, -/area/centcom/holding) -"Ww" = ( -/obj/structure/bodycontainer/crematorium{ - dir = 4; - id = "crematoriumGhostDojo" +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Wx" = ( -/obj/structure/table, -/obj/item/clothing/mask/luchador, -/turf/open/floor/holofloor/wood, -/area/holodeck/rec_center/wrestlingarena) -"Wz" = ( -/obj/structure/table, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/plasteel/white, -/area/centcom/holding) "WC" = ( /obj/structure/table/reinforced, /obj/item/pen, /turf/open/floor/mineral/plastitanium/red, /area/centcom/evac) -"WD" = ( -/obj/structure/mopbucket, -/obj/item/mop, -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "sink"; - pixel_y = 28 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"WE" = ( -/obj/machinery/vending/kink{ - extended_inventory = 1 - }, -/turf/open/floor/wood, -/area/centcom/holding) "WH" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/bottle/whiskey{ @@ -18523,16 +18595,6 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"WN" = ( -/obj/machinery/button/door{ - id = "Ninja6"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "WO" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -18554,27 +18616,44 @@ }, /turf/open/floor/plasteel, /area/centcom/ferry) +"WR" = ( +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/obj/effect/landmark/holding_facility, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "WS" = ( /obj/structure/closet/syndicate/personal, /turf/open/floor/wood, /area/syndicate_mothership) "WV" = ( -/obj/structure/bed, -/obj/item/bedsheet/hos{ - desc = "A fancy red bedsheet."; - name = "red bedsheet" +/obj/machinery/vending/cigarette, +/obj/machinery/light{ + dir = 4 }, -/turf/open/floor/carpet/red, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "WW" = ( /obj/machinery/processor, /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) -"WY" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/light{ - dir = 4 - }, +"Xb" = ( +/obj/structure/closet/crate, +/obj/item/vending_refill/autodrobe, +/obj/item/vending_refill/autodrobe, +/obj/item/vending_refill/boozeomat, +/obj/item/vending_refill/boozeomat, +/obj/item/vending_refill/cigarette, +/obj/item/vending_refill/cigarette, +/obj/item/vending_refill/clothing, +/obj/item/vending_refill/coffee, +/obj/item/vending_refill/coffee, +/obj/item/vending_refill/cola, +/obj/item/vending_refill/cola, +/obj/item/vending_refill/wallmed, +/obj/item/vending_refill/wallmed, +/obj/item/vending_refill/snack, +/obj/item/vending_refill/snack, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Xd" = ( @@ -18584,23 +18663,6 @@ /obj/structure/window/reinforced/fulltile, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Xe" = ( -/obj/machinery/vending/autodrobe, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"Xf" = ( -/obj/structure/table/wood/bar, -/obj/structure/mirror{ - pixel_y = 28 - }, -/obj/item/lightreplacer, -/obj/item/lightreplacer, -/obj/item/lightreplacer, -/obj/item/storage/bag/trash, -/obj/item/storage/bag/trash, -/obj/item/storage/bag/trash, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Xg" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -18613,6 +18675,15 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) +"Xk" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/grass, +/area/centcom/holding) "Xl" = ( /obj/structure/closet/syndicate/personal, /obj/effect/turf_decal/stripes/line{ @@ -18620,9 +18691,14 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/syndicate_mothership) -"Xn" = ( -/obj/structure/bed, -/obj/item/bedsheet/random, +"Xm" = ( +/obj/machinery/button/door{ + id = "Ninja4"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 + }, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Xo" = ( @@ -18646,10 +18722,6 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/four) -"Xs" = ( -/obj/structure/chair/comfy/brown, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Xt" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security"; @@ -18669,10 +18741,6 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/holofloor, /area/holodeck/rec_center/firingrange) -"Xw" = ( -/obj/structure/table/wood/fancy/royalblue, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Xy" = ( /obj/machinery/door/airlock/external{ name = "Ferry Airlock" @@ -18685,16 +18753,6 @@ }, /turf/open/floor/plasteel, /area/centcom/ferry) -"XD" = ( -/obj/machinery/button/door{ - id = "Ninja4"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "XE" = ( /obj/machinery/door/airlock/centcom{ name = "Kitchen"; @@ -18712,25 +18770,8 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"XS" = ( -/obj/structure/closet/secure_closet/hydroponics{ - locked = 0 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/item/seeds/ambrosia/gaia, -/obj/item/seeds/ambrosia/gaia, -/obj/item/seeds/pumpkin/blumpkin, -/obj/item/seeds/pumpkin/blumpkin, -/turf/open/indestructible/hotelwood, +"XN" = ( +/turf/open/floor/carpet/red, /area/centcom/holding) "XT" = ( /obj/structure/table/wood, @@ -18743,6 +18784,12 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/evac) +"XW" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "XX" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/bottle/sake, @@ -18755,14 +18802,8 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) -"Ya" = ( -/obj/machinery/button/door{ - id = "Ninja1"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, +"XZ" = ( +/obj/effect/landmark/holding_facility, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Yc" = ( @@ -18794,30 +18835,14 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) -"Yh" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Yi" = ( /obj/structure/dresser, /turf/open/floor/plasteel/dark, /area/syndicate_mothership) -"Yj" = ( -/obj/structure/table/optable, -/turf/open/floor/plasteel/white, -/area/centcom/holding) "Ym" = ( /obj/machinery/computer/arcade/orion_trail, /turf/open/indestructible/hotelwood, /area/centcom/holding) -"Yo" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "Ys" = ( /obj/structure/table/reinforced, /turf/open/floor/mineral/plastitanium/red, @@ -18839,11 +18864,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) -"Yv" = ( -/obj/structure/table, -/obj/item/clothing/mask/luchador/rudos, -/turf/open/floor/holofloor/wood, -/area/holodeck/rec_center/wrestlingarena) "Yw" = ( /turf/closed/indestructible/fakedoor{ name = "External Access" @@ -18853,9 +18873,23 @@ /obj/machinery/door/airlock/titanium, /turf/open/floor/mineral/titanium, /area/centcom/evac) -"YC" = ( -/turf/open/floor/holofloor/wood, -/area/holodeck/rec_center/wrestlingarena) +"Yz" = ( +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) +"YF" = ( +/obj/machinery/vending/clothing{ + extended_inventory = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"YH" = ( +/obj/item/hilbertshotel/ghostdojo, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "YJ" = ( /obj/item/reagent_containers/food/condiment/enzyme, /obj/item/reagent_containers/food/drinks/shaker, @@ -18864,10 +18898,6 @@ /obj/structure/closet/crate, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) -"YL" = ( -/obj/machinery/vending/clothing, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) "YN" = ( /obj/structure/window/reinforced{ dir = 8 @@ -18875,10 +18905,24 @@ /mob/living/simple_animal/chicken, /turf/open/floor/grass, /area/centcom/holding) -"YO" = ( -/obj/structure/chair/comfy/brown{ +"YP" = ( +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "sink"; + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/green{ dir = 1 }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/paper/guides/jobs/hydroponics, +/obj/item/book/manual/hydroponics_pod_people, /turf/open/indestructible/hotelwood, /area/centcom/holding) "YU" = ( @@ -18929,17 +18973,24 @@ /turf/open/floor/plasteel, /area/centcom/supplypod) "Zl" = ( -/obj/structure/table, -/obj/item/clothing/gloves/boxing, -/obj/item/clothing/gloves/boxing/blue, -/obj/item/clothing/gloves/boxing/green, -/obj/item/clothing/gloves/boxing/yellow, -/turf/open/floor/holofloor/wood, -/area/holodeck/rec_center/wrestlingarena) +/obj/structure/bed/dogbed, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Zr" = ( /obj/machinery/light, /turf/open/floor/plasteel/dark, /area/syndicate_mothership) +"Zv" = ( +/obj/structure/closet, +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/machinery/iv_drip, +/obj/item/roller, +/obj/item/storage/firstaid/regular, +/obj/item/reagent_containers/medspray/synthflesh, +/obj/item/reagent_containers/medspray/synthflesh, +/obj/item/reagent_containers/medspray/synthflesh, +/turf/open/floor/plasteel/white, +/area/centcom/holding) "Zw" = ( /obj/structure/bed, /obj/item/bedsheet/syndie, @@ -18958,20 +19009,6 @@ /obj/effect/landmark/start/nukeop_leader, /turf/open/floor/wood, /area/syndicate_mothership) -"ZB" = ( -/obj/effect/landmark/holding_facility, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"ZE" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/mineral/titanium/blue, -/area/centcom/holding) "ZF" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -19008,26 +19045,6 @@ /turf/open/floor/mineral/plastitanium/red, /area/syndicate_mothership) "ZL" = ( -/obj/structure/closet, -/obj/item/stack/sheet/mineral/wood/fifty, -/obj/item/stack/tile/wood{ - amount = 24 - }, -/obj/item/stack/tile/carpet/black/fifty, -/obj/item/stack/tile/carpet/blackred/fifty, -/obj/item/stack/tile/carpet/blue/fifty, -/obj/item/stack/tile/carpet/cyan/fifty, -/obj/item/stack/tile/carpet/fifty, -/obj/item/stack/tile/carpet/green/fifty, -/obj/item/stack/tile/carpet/monochrome/fifty, -/obj/item/stack/tile/carpet/orange/fifty, -/obj/item/stack/tile/carpet/purple/fifty, -/obj/item/stack/tile/carpet/red/fifty, -/obj/item/stack/tile/carpet/royalblack/fifty, -/obj/item/stack/tile/carpet/royalblue/fifty, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) -"ZN" = ( /obj/machinery/vending/snack, /turf/open/indestructible/hotelwood, /area/centcom/holding) @@ -19044,8 +19061,13 @@ /turf/open/floor/plasteel, /area/centcom/supplypod/loading/two) "ZR" = ( -/obj/structure/bed/dogbed, -/turf/open/indestructible/hotelwood, +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/turf/open/floor/plasteel/white, /area/centcom/holding) "ZT" = ( /mob/living/simple_animal/cow, @@ -19082,27 +19104,6 @@ }, /turf/open/floor/plasteel, /area/centcom/supply) -"ZZ" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/chem_master/condimaster{ - desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; - name = "BrewMaster 2199"; - pixel_x = -4 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding) (1,1,1) = {" aa @@ -26210,7 +26211,7 @@ lI lI lI Ax -Qi +Na qZ qZ Ax @@ -43442,50 +43443,50 @@ aa aa aa Nd -SW -PO -PO -Sw -PO -PO -PO +Mq +Ur +Ur PO +Ur +Ur +Ur +Ur Nd -Tt -Tt -TG +ZR +ZR +qF Op Nd Rm Tn UT yd -Sd -Sd +NS +NS XM NT UV -CV -Sd +Fb +NS Nd -OW -Ln +CT +oV Nd -Lm -Lm -Lm +St +St +St Nd -PQ -Sd -ZR +Sv +NS +Zl Nd -RL -Yo -Uq +VY +PL +oW Nd -VL -Ww -NN +NP +Uc +Vn Nd aa aa @@ -43699,49 +43700,49 @@ aa aa aa Nd -Pc -PY -PY -PY -PY -PY -PY -PY +YP +Wu +Wu +Wu +Wu +Wu +Wu +Wu Nd ZW ZW ZW ZW Za -Sd -Sd -Sd +NS +NS +NS Tu -Sd -Sd +NS +NS Tn NT RQ -Sd -Sd +NS +NS Nd -UN -ST +yW +Uk Nd -zS -Qw -TC +Oi +Pz +kv Nd -MJ -Sd -Sd +Ly +NS +NS Nd -AE -Sd -Ph +We +NS +Fj Nd Gs -Sd +NS HH Nd aa @@ -43947,59 +43948,59 @@ aa aa aa aa -Ud -Ud -Ud -Ud -Ud +Fe +Fe +Fe +Fe +Fe aa aa aa Nd -ZZ -PY -PY -PY -PY -PY -PY -RN +pB +Wu +Wu +Wu +Wu +Wu +Wu +PI Nd SB ZW ZW ZW Nd -Sd -Sd -Sd -Sd -Sd -Sd +NS +NS +NS +NS +NS +NS GY NT UV -CV -Sd +Fb +NS Nd -Ot -ST +Rq +Uk Nd -Tf -Qw -Tf +Px +Pz +Px Nd -ma -Sd -Sd -Nd -ZN -Sd -Sd +Mw +NS +NS Nd ZL -Sd -Lr +NS +yl +Nd +CU +NS +Ns Nd aa aa @@ -44204,58 +44205,58 @@ aa aa aa aa -Ud -Uc -ZB -ZB -Ud +Fe +VH +XZ +XZ +Fe aa aa aa Nd -PI -PY -PY -PY -PY -PY -PY -Rj +pG +Wu +Wu +Wu +Wu +Wu +Wu +PE Nd SB -NE -Fl +Ts +OI Nw Nd -Sd -Sd -Sd -Ph -Sd +NS +NS +NS +Fj +NS Tu Vu Nd -hH -Sd -Sd +Gt +NS +NS Nd Nd -Wl +Qn Nd Nd -Wl +Qn Nd Nd Nd -yS +Np Nd Nd -WD -Sd +MW +NS HH Nd Nd -Ox +Ff Nd Nd aa @@ -44461,59 +44462,59 @@ aa aa aa aa -Ud -ZB -CQ -Ql -Ud +Fe +XZ +sf +Tf +Fe aa aa aa Nd -Tx +zE +Wu +Wu +Wu +SW PY -PY -PY -Um -XS -PY -vs +Wu +Nn Nd Nd Nd Nd Nd Nd -Sd -Sd +NS +NS XM QL -Sd -Sd +NS +NS XM NT PX -CV -Sd +Fb +NS NT -Sd -Sd -Sd -Sd -Sd -Sd +NS +NS +NS +NS +NS +NS Nd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -WE +NS +NS +NS +NS +NS +NS +NS +NS +NS +NS +Ow Nd aa aa @@ -44718,11 +44719,11 @@ aa aa aa aa -Ud -wZ -ZB -Qn -Ud +Fe +WR +XZ +Mn +Fe aa aa aa @@ -44736,41 +44737,41 @@ Nd py Nd Nd -Yh -Sd -Yo -Sd -Wl -Sd -Sd +XW +NS +PL +NS +Qn +NS +NS Tn Tu -Sd -Sd +NS +NS Tn NT Zh -Sd -Sd -Dl -Sd -Sd -Sd -Sd -Sd -Sd -Qu -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sj +NS +NS +zy +NS +NS +NS +NS +NS +NS +tc +NS +NS +NS +NS +NS +NS +NS +NS +NS +NS +SM Nd aa aa @@ -44975,59 +44976,59 @@ aa aa aa aa -Ud -Ud -Ud -Ud -Ud +Fe +Fe +Fe +Fe +Fe aa aa aa Nd -Lr -Sd -Yo -Sd -Sd -Sd -Sd -Sd -Sd -Sd +Ns +NS +PL +NS +NS +NS +NS +NS +NS +NS Nd Nd Nd Nd Gs -Sd +NS GY Tu -Sd -Sd +NS +NS GY NT Ym -CV -Sd +Fb +NS NT -Sd -MR -Sd -Sd -MR -Sd +NS +SU +NS +NS +SU +NS Nd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -Sd -PM +NS +NS +NS +NS +NS +NS +NS +NS +NS +NS +YF Nd aa aa @@ -45241,31 +45242,31 @@ aa aa aa Nd -Tq -Sd +UU +NS MG YN Nd -US +Wq Fh Fh zV Nd Nd -Hj +zY Fa KT -Sd -Sd -Sd -Sd -Sd -Sd +NS +NS +NS +NS +NS +NS HH Nd -Sd -Sd -Sd +NS +NS +NS Nd Nd Nd @@ -45278,8 +45279,8 @@ Nd Nd Nd Nd -Rq -Sd +Mz +NS HH Nd Nd @@ -45498,31 +45499,31 @@ aa aa aa Nd -ZL -Sd +CU +NS Rh Mm Nd -Nx +Wp Fh Fh Yu Nd -AE -CV -Sd -Ll -CV -Sd -Sd -Sd -Sd -Sd -Sd +We +Fb +NS +wY +Fb +NS +NS +NS +NS +NS +NS Re -Sd -Sd -Sd +NS +NS +NS NT vt YV @@ -45531,17 +45532,17 @@ OU RS VF Nd -UD -tZ +Oq +SE SY Nd -Sd -Sd -Sd +NS +NS +NS Nd SY -Os -UD +QS +Oq Nd aa aa @@ -45755,9 +45756,9 @@ aa aa aa Nd -ZN -Sd -yW +ZL +NS +Xk ZT Nd Pr @@ -45765,40 +45766,40 @@ Fh Fh QW Nd -QJ -Sd -Sd -NA -Sd -Sd -Sd -Sd -Sd -Sd -Sd +vx +NS +NS +Ng +NS +NS +NS +NS +NS +NS +NS Nd Gs Zx -Sd +NS OL -Sd -Sd -Sd -Sd -Sd -Sd +NS +NS +NS +NS +NS +NS Nd -Sd -Sd -Sd -lS -Sd -Sd -Sd -RP -Sd -Sd -Sd +NS +NS +NS +Qh +NS +NS +NS +UI +NS +NS +NS Nd aa aa @@ -46022,40 +46023,40 @@ Fh Fh Vv Nd -Sd -Sd -Sd +NS +NS +NS FW -Sd -Sd -Sd -Sd -Sd -Sd -Sd +NS +NS +NS +NS +NS +NS +NS Re -Sd -Sd -Sd +NS +NS +NS NT So XM -Sd +NS XM XM -Sd +NS Nd -Xn -Sd -Ya +wj +NS +Oo Nd -Sd -Sd -Sd +NS +NS +NS Nd -XD -Sd -Xn +Xm +NS +wj Nd aa aa @@ -46269,46 +46270,46 @@ aa aa aa Nd -NZ -Sd -Yo +Qs +NS PL +VI Nd -SG +Pp Fh Fh Fh -Wl +Qn +NS +Bm Sd -TD -On FX -Sd -Sd -Sd -Sd -Sd -Sd +NS +NS +NS +NS +NS +NS HH Nd WM -Sd -Sd +NS +NS NT Nj Po Wb Po ZU -Sd +NS Nd Nd Nd Nd Nd -Sd -Sd -Sd +NS +NS +NS Nd Nd Nd @@ -46526,50 +46527,50 @@ aa aa aa Nd -OG -Sd -Sd -Tq +HE +NS +NS +UU Nd zX Fh Fh -JV +TV Nd -Dl +zy Nd Nd Nd Gs -Sd +NS XM Tu -Sd -Sd +NS +NS XM NT -Sd -Sd -Sd +NS +NS +NS NT YU -zT -zT -zT +Ok +Ok +Ok MM -Sd +NS Nd -UD -tZ +Oq +SE SY Nd -Sd -Sd -Sd +NS +NS +NS Nd SY -Os -UD +QS +Oq Nd aa aa @@ -46783,50 +46784,50 @@ aa aa aa Nd -Xf -Sd -Sd -Nf +xL +NS +NS +ue Nd QA Fh Fh -Uz -ED -Sd -Yo +ug +Nv +NS +PL Yf UE -Sd -Sd +NS +NS Tn Xd -Sd -Sd +NS +NS Tn NT -Sd -Sd -Sd +NS +NS +NS NT YU -zT -zT -zT +Ok +Ok +Ok MM TM Nd -Sd -Sd -Sd -uh -Sd -Sd -Sd -zW -Sd -Sd -Sd +NS +NS +NS +Dm +NS +NS +NS +TJ +NS +NS +NS Nd aa aa @@ -47040,50 +47041,50 @@ aa aa aa Nd -YL -Sd -Sd -Uk +VK +NS +NS +Xb Nd Xo Fh Fh Fh py -Sd -Sd +NS +NS SY UE -Sd -Sd +NS +NS GY Tu -Sd -Sd +NS +NS GY NT -Sd -Sd -Sd +NS +NS +NS NT YU -zT -zT -zT +Ok +Ok +Ok MM -Sd +NS Nd -Xn -Sd -Tc +wj +NS +Uq Nd -Sd -Sd -Sd +NS +NS +NS Nd -AC -Sd -Xn +MQ +NS +wj Nd aa aa @@ -47297,45 +47298,45 @@ aa aa aa Nd -Xe -Sd -Sd -ZL +ll +NS +NS +CU Nd TB Fh Fh Fh BV -Sd -Sd +NS +NS XT UE -Sd -Sd -Sd -Ph -Sd +NS +NS +NS +Fj +NS Qk Vu Nd Gs -Sd -Sd +NS +NS NT Mt PA Ra PA Pl -Sd +NS Nd Nd Nd Nd Nd -Rq -Sd +Mz +NS HH Nd Nd @@ -47554,50 +47555,50 @@ aa aa aa Nd -TY -Sd -Sd -Sd +lS +NS +NS +NS Nd Vz Fh Fh YJ QT -Sd -Sd +NS +NS SY UE -Sd -Sd -Sd -Sd -Sd -Sd +NS +NS +NS +NS +NS +NS XM NT -Sd -Sd -Sd +NS +NS +NS NT Ye GY -Sd +NS GY GY -Sd +NS Nd -Xs -Ol -YO +UP +ML +NX Nd -Sd -Sd -Sd +NS +NS +NS Nd -RX -Xw -qP +RM +Qy +Yz Nd aa aa @@ -47811,49 +47812,49 @@ aa aa aa Nd -Bs -Ri -Sd -Sd +TD +CS +NS +NS XL Fh Fh Fh Fh XL -Sd -Sd +NS +NS XX UE -Sd -Sd -Sd +NS +NS +NS Tu -Sd -Sd +NS +NS Tn NT -Sd -Sd -Sd +NS +NS +NS OL -Sd -Sd -Sd -Sd -Sd -Sd +NS +NS +NS +NS +NS +NS Nd Gs -Sd -Sd -SZ -Sd -Sd -Sd -Ws -Sd -Sd +NS +NS +Hy +NS +NS +NS +Lq +NS +NS HH Nd aa @@ -48068,50 +48069,50 @@ aa aa aa Nd -Hk -Sd -MR -Mz +rh +NS +SU +uH Nd SN pV pV Tr Nd -WY -Ph +WV +Fj Nd Nd Rm Tn UT Hm -Sd -Sd +NS +NS GY NT -Tw -Ms -Ro +TS +QM +ta NT vt Mx -Sd -Sd +NS +NS Uh tW Nd -Ru -Of -QF +Td +XN +xB Nd -Sd -Sd -Sd +NS +NS +NS Nd -WN -Ur -Ki +VC +Nl +ma Nd aa aa @@ -48353,22 +48354,22 @@ Nd Nd Nd Nd -Sd -Sd +NS +NS Nd Nd Nd -Kf -WV -Sd +QN +vp +NS Nd -sa -Sd -Sd +YH +NS +NS Nd -Sd -zY -Rv +NS +Mj +uh Nd aa aa @@ -48608,22 +48609,22 @@ aa aa aa Nd -vv +Zv VA ZW ZW -px -Lk +Nf +MX Nd Nd Nd -QC +sk Nd Nd -SR +wU Nd Nd -QC +sk Nd Nd Nd @@ -48865,24 +48866,24 @@ aa aa aa Nd -sf +Dn ZW ZW ZW ZW -OT +Ux Nd -Ln -ST -ST +oV +Uk +Uk Nd -Qp -Sd -Nt +Hj +NS +TY Nd -ST -ST -Ln +Uk +Uk +oV Nd aa aa @@ -49122,24 +49123,24 @@ aa aa aa Nd -Bq -RK -Qy -Yj +TZ +yf +Tg +Qd ZW -Wz +Ru Nd -xO -QN -ZE +yX +Lj +OO Nd -Qp -Qz -Nt +Hj +QF +TY Nd -ZE -QN -RO +OO +Lj +Oy Nd aa aa @@ -58969,7 +58970,7 @@ aa aa aa aa -Qc +wi aa aa aa @@ -72327,16 +72328,16 @@ aa aa aa bj -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC +tv +tv +tv +tv +tv +tv +tv +tv +tv +tv fx aa aa @@ -72584,16 +72585,16 @@ aa aa aa bj -Vk -YC -YC -YC -YC -YC -YC -YC -YC -Vk +NB +tv +tv +tv +tv +tv +tv +tv +tv +NB fx aa aa @@ -72841,16 +72842,16 @@ aa aa aa bj -Vk -YC -YC -YC -YC -YC -YC -YC -YC -Vk +NB +tv +tv +tv +tv +tv +tv +tv +tv +NB fx aa aa @@ -73098,16 +73099,16 @@ aa aa aa bj -Vk -YC -YC -YC -YC -YC -YC -YC -YC -Vk +NB +tv +tv +tv +tv +tv +tv +tv +tv +NB fx aa aa @@ -73355,16 +73356,16 @@ aa aa aa bj -YC -YC -Wx -YC -Yv -Ui -YC -Zl -YC -YC +tv +tv +rg +tv +Ld +Lm +tv +Qw +tv +tv fx aa aa diff --git a/_maps/multiz_debug.dm b/_maps/multiz_debug.dm index 0521fef59d..ca286934b9 100644 --- a/_maps/multiz_debug.dm +++ b/_maps/multiz_debug.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/multiz_debug.json" \ No newline at end of file +#define FORCE_MAP "_maps/multiz_debug.json" diff --git a/_maps/pubbystation.json b/_maps/pubbystation.json index f99cca57c5..acf49b773b 100644 --- a/_maps/pubbystation.json +++ b/_maps/pubbystation.json @@ -7,5 +7,10 @@ "whiteship": "whiteship_pubby", "ferry": "ferry_fancy", "cargo": "cargo_box" - } + }, + "job_access_add": { + "/datum/job/hos": [27], + "/datum/job/officer": [27], + "/datum/job/detective": [27] + } } diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json index f9333c65a2..ca2cc3d379 100644 --- a/_maps/runtimestation.json +++ b/_maps/runtimestation.json @@ -1,8 +1,8 @@ -{ - "map_name": "Runtime Station", - "map_path": "map_files/debug", - "map_file": "runtimestation.dmm", - "shuttles": { - "cargo": "cargo_delta" - } -} +{ + "map_name": "Runtime Station", + "map_path": "map_files/debug", + "map_file": "runtimestation.dmm", + "shuttles": { + "cargo": "cargo_delta" + } +} diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index c7d331e368..da5205fe66 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -307,7 +307,7 @@ "D" = ( /obj/structure/table/reinforced, /obj/item/folder, -/obj/item/storage/box/dice, +/obj/item/storage/dice, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/shuttle/arrival) diff --git a/_maps/shuttles/arrival_omega.dmm b/_maps/shuttles/arrival_omega.dmm index 9285a4a716..47673e98b7 100644 --- a/_maps/shuttles/arrival_omega.dmm +++ b/_maps/shuttles/arrival_omega.dmm @@ -237,7 +237,7 @@ /area/shuttle/arrival) "C" = ( /obj/structure/table/reinforced, -/obj/item/storage/box/dice{ +/obj/item/storage/dice{ pixel_x = -2; pixel_y = 8 }, diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm new file mode 100644 index 0000000000..51a14594fb --- /dev/null +++ b/_maps/shuttles/emergency_nature.dmm @@ -0,0 +1,2042 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"as" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"au" = ( +/obj/structure/sink/puddle, +/turf/open/floor/grass, +/area/shuttle/escape) +"ay" = ( +/obj/structure/flora/ausbushes/leafybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"aA" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"aJ" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"bd" = ( +/obj/structure/flora/rock/pile/largejungle, +/turf/open/floor/grass, +/area/shuttle/escape) +"bg" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/item/storage/toolbox/electrical, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/shuttle/escape) +"bS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/lights/mixed{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/item/storage/box/matches{ + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"cm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/shuttle/escape) +"cL" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 3 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"cR" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"cZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/computer/emergency_shuttle, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"dj" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 3 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -31 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"dP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"dT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/shuttle/escape) +"eq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/shuttle/escape) +"ev" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"ex" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/structure/flora/ausbushes/leafybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"eB" = ( +/obj/item/rack_parts, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"eS" = ( +/obj/effect/turf_decal/trimline/red/filled/end{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"eY" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency{ + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"fD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/computer/security, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"fG" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/genericbush, +/turf/open/floor/grass, +/area/shuttle/escape) +"fJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/computer/communications, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"fT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/door/window/westleft{ + name = "Infirmary" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"gg" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_y = 27 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"gj" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/plating, +/area/shuttle/escape) +"gl" = ( +/obj/structure/flora/junglebush/large, +/turf/open/floor/grass, +/area/shuttle/escape) +"gu" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"gx" = ( +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"gI" = ( +/obj/item/shovel, +/turf/open/floor/grass, +/area/shuttle/escape) +"gM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"gR" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, +/area/shuttle/escape) +"ht" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"hC" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"hJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/storage/box/monkeycubes{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = -6; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"ib" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"it" = ( +/mob/living/carbon/monkey, +/obj/structure/flora/grass/jungle/b{ + icon_state = "bushb3" + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"iD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs{ + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"iF" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/shuttle/escape) +"iO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/shuttle/escape) +"iV" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"jO" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/stockparts{ + pixel_y = 7 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/shuttle/escape) +"jX" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"jZ" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"ke" = ( +/obj/item/shovel/spade, +/turf/open/floor/grass, +/area/shuttle/escape) +"ku" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"lo" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/flora/ausbushes/leafybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"lH" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"lN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/grille/broken, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/shuttle/escape) +"lS" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"lT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/cigbutt{ + pixel_x = 8 + }, +/obj/machinery/recharger, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"lV" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/food/snacks/soup/monkeysdelight{ + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"me" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"mq" = ( +/mob/living/carbon/monkey, +/obj/machinery/light/floor, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"mw" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/item/reagent_containers/food/snacks/grown/banana, +/turf/open/floor/grass, +/area/shuttle/escape) +"nA" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"nD" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"nQ" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"og" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"os" = ( +/obj/effect/turf_decal/trimline/green/filled/end{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/window/westleft{ + name = "Nature pen" + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"oE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"qD" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"rg" = ( +/obj/item/clothing/glasses/welding{ + pixel_x = 3; + pixel_y = 8 + }, +/obj/item/weldingtool/largetank{ + pixel_x = -3 + }, +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"rI" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"sm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/shuttle/escape) +"su" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/table/optable, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"sF" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 5 + }, +/obj/structure/rack, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"sN" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"sV" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/corner, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"tL" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"uc" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"ui" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"ur" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"uI" = ( +/obj/structure/flora/rock/jungle{ + icon_state = "rock3" + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"vt" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs{ + pixel_y = 7 + }, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"vx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"vP" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"vW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/structure/table/reinforced, +/obj/item/storage/box/handcuffs{ + pixel_y = 5 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"wg" = ( +/obj/effect/turf_decal/trimline/green/filled/end{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/window/northleft, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"wX" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"xA" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"xZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/tank_dispenser/oxygen{ + layer = 2.7; + pixel_x = -1; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"yt" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"yI" = ( +/obj/item/reagent_containers/food/snacks/grown/banana, +/turf/open/floor/grass, +/area/shuttle/escape) +"yR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"yZ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/structure/sign/poster/official/pda_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"zf" = ( +/obj/structure/flora/ausbushes/pointybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"zr" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"zs" = ( +/obj/machinery/light/floor, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"zD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"zE" = ( +/obj/machinery/door/airlock/security{ + name = "Brig"; + req_access_txt = "63; 42" + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Ai" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"Aw" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/status_display/evac{ + dir = 8; + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"AM" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/shuttle/escape) +"Bm" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Cockpit"; + req_access_txt = "19" + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Bo" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"Bt" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"Bv" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"BA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/table/glass, +/obj/item/defibrillator/loaded{ + pixel_y = 5 + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"BG" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"BM" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/shuttle/escape) +"Cb" = ( +/obj/structure/flora/rock/jungle{ + icon_state = "bushc2" + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"Co" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"CA" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"CE" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/shuttle/escape) +"CQ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/vending/cola/space_up, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Db" = ( +/obj/structure/sign/poster/official/help_others, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"DD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/mob/living/simple_animal/bot/medbot{ + name = "\improper emergency medibot"; + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"DQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"EI" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/vending/snack/green, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Fo" = ( +/obj/item/cultivator, +/mob/living/simple_animal/hostile/lizard, +/turf/open/floor/grass, +/area/shuttle/escape) +"Fp" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"Gf" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"GO" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/table/glass, +/obj/item/storage/box/monkeycubes{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/reagent_containers/food/snacks/cube/monkey{ + pixel_x = 5 + }, +/obj/item/paicard{ + pixel_x = -6; + pixel_y = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"GV" = ( +/obj/structure/shuttle/engine/huge, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"He" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "floorscorched1" + }, +/area/shuttle/escape) +"Hi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/shuttle/escape) +"Hq" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/grass, +/area/shuttle/escape) +"HV" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Ia" = ( +/mob/living/carbon/monkey, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"Io" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Iw" = ( +/obj/item/reagent_containers/glass/bucket, +/mob/living/simple_animal/hostile/retaliate/frog, +/turf/open/floor/grass, +/area/shuttle/escape) +"Iz" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"IB" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"Jw" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"JD" = ( +/obj/effect/turf_decal/trimline/blue/filled/end{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/storage/firstaid/brute{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = -3 + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"JR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Ka" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"Kv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/tools{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"Kx" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 3 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"KT" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Lm" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/flora/ausbushes/pointybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"LG" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/corner, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"LO" = ( +/obj/structure/flora/rock/jungle{ + icon_state = "grassa4" + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"LW" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"LY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) +"MJ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/flora/ausbushes/leafybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"MS" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Nu" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/item/hatchet, +/turf/open/floor/grass, +/area/shuttle/escape) +"Ob" = ( +/obj/effect/turf_decal/trimline/green/filled/end, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/window/southleft{ + name = "Nature pen" + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"OS" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 3 + }, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Ps" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/shuttle/escape) +"PG" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"PP" = ( +/obj/structure/flora/ausbushes/genericbush, +/turf/open/floor/grass, +/area/shuttle/escape) +"QC" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"QM" = ( +/obj/item/bodypart, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/shuttle/escape) +"QO" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"QZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/chair, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ + pixel_x = 30 + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"Ru" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/machinery/vending/hydroseeds, +/turf/open/floor/grass, +/area/shuttle/escape) +"Sl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"Sr" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/structure/table/glass, +/obj/item/clothing/suit/monkeysuit{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/clothing/mask/gas/monkeymask{ + pixel_x = 5; + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"SS" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"ST" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass, +/area/shuttle/escape) +"Ti" = ( +/obj/structure/flora/rock/jungle{ + icon_state = "busha3" + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"Ts" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, +/area/shuttle/escape) +"TH" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"TK" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/item/hatchet, +/turf/open/floor/grass, +/area/shuttle/escape) +"TT" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"Um" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"Uy" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/item/reagent_containers/food/snacks/grown/banana, +/turf/open/floor/grass, +/area/shuttle/escape) +"UE" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/machinery/vending/hydronutrients, +/turf/open/floor/grass, +/area/shuttle/escape) +"UO" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Vu" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/shuttle/escape) +"Vv" = ( +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/shuttle/escape) +"VI" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/escape) +"VM" = ( +/obj/structure/flora/tree/jungle, +/turf/open/floor/grass, +/area/shuttle/escape) +"VU" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/escape) +"Wa" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Wr" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/structure/flora/ausbushes/reedbush, +/turf/open/floor/grass, +/area/shuttle/escape) +"Wz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/shuttle/escape) +"WE" = ( +/turf/template_noop, +/area/template_noop) +"WH" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"WL" = ( +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Xm" = ( +/obj/structure/flora/rock, +/turf/open/floor/grass, +/area/shuttle/escape) +"XK" = ( +/turf/open/floor/grass, +/area/shuttle/escape) +"XY" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/shuttle/escape) +"Ym" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/flora/rock/pile, +/turf/open/floor/grass, +/area/shuttle/escape) +"Yp" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Yu" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"YH" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/shuttle/escape) +"YP" = ( +/obj/effect/turf_decal/trimline/green/filled/end{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/eastleft{ + name = "Nature pen" + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"YW" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 3 + }, +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Zd" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 3 + }, +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"Zg" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Zl" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass, +/area/shuttle/escape) +"Zm" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/grass, +/area/shuttle/escape) +"Zt" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"ZD" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) +"ZL" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/banana, +/turf/open/floor/grass, +/area/shuttle/escape) +"ZT" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) + +(1,1,1) = {" +WE +WE +WE +WE +WE +WE +WE +WE +WE +VU +SS +Yu +Yp +Yu +Yu +Yu +Yu +Yu +SS +Yu +SS +Yu +Yu +Yu +Yu +Yu +Yu +VU +WE +WE +WE +"} +(2,1,1) = {" +WE +WE +WE +WE +WE +WE +WE +WE +VU +Yu +nA +UO +yt +ZT +UO +GO +UO +ZT +yt +UO +zr +Yu +Yu +lH +eB +lN +bS +Yu +VU +WE +WE +"} +(3,1,1) = {" +WE +WE +WE +WE +WE +WE +WE +VU +Yu +me +Io +Wa +Wa +Wa +Wa +ev +Wa +Wa +Wa +Wa +Bv +zr +Yu +Yu +rg +iV +jO +Jw +gx +gx +GV +"} +(4,1,1) = {" +WE +WE +VU +VI +VI +VI +VU +Yu +nA +Io +MS +VI +VI +VI +VI +YP +VI +VI +VI +VI +KT +Bv +zr +Yu +Yu +eq +bg +Jw +gx +gx +gx +"} +(5,1,1) = {" +WE +VU +Yu +jX +tL +vt +Yu +CA +Io +MS +VI +VI +YH +iF +xA +Gf +lo +Gf +Zm +VI +VI +KT +Bv +BG +Yu +Kv +DQ +Jw +gx +gx +gx +"} +(6,1,1) = {" +VU +Yu +ht +jZ +WL +vP +zE +HV +Zt +VI +VI +Wr +Vv +Ti +Fo +PP +Xm +ZL +LO +mw +VI +VI +HV +Zd +Yu +IB +iO +Jw +gu +WE +WE +"} +(7,1,1) = {" +VI +eS +hC +lS +lS +vW +Yu +Co +Zt +VI +Ru +zs +Bt +qD +Bo +aJ +fG +CE +Vv +zs +uc +VI +HV +Kx +Yu +dP +dT +Jw +gu +WE +WE +"} +(8,1,1) = {" +Yu +Yu +VI +VI +ui +Yu +Db +Co +Zt +VI +Ym +XK +au +XK +VM +Hq +QC +XK +BM +Bt +Ka +VI +HV +YW +Yu +LY +sm +Jw +gu +WE +WE +"} +(9,1,1) = {" +VI +eY +hJ +lT +ur +xZ +Yu +CQ +Zt +VI +Ts +WH +XK +XK +Ps +gl +Bt +it +AM +gI +TT +VI +HV +Zd +Yu +Um +DQ +Jw +gx +gx +GV +"} +(10,1,1) = {" +VI +fD +LW +WL +WL +Zg +Bm +HV +LG +Ob +Uy +Xm +Vv +Fp +qD +zs +XK +XK +PP +Bt +ST +wg +PG +cL +gj +Um +cm +Jw +gx +gx +gx +"} +(11,1,1) = {" +VI +cZ +LW +WL +WL +Zg +VI +EI +Zt +VI +Lm +as +XK +VM +Iw +au +XK +bd +Bt +XK +Nu +VI +HV +Zd +Yu +Um +Hi +Jw +gx +gx +gx +"} +(12,1,1) = {" +VI +fJ +LW +WL +WL +Zg +VI +Co +Zt +VI +Vu +nD +qD +PP +Bt +yI +QC +Bt +XK +uI +gR +VI +HV +OS +Yu +Um +Wz +Jw +gu +WE +WE +"} +(13,1,1) = {" +VI +gM +ku +WL +WL +wX +Yu +gg +Zt +VI +UE +zs +zf +ke +zf +ay +XK +ay +AM +mq +ex +VI +HV +dj +Yu +QM +DQ +Jw +gu +WE +WE +"} +(14,1,1) = {" +VU +Yu +iD +og +WL +Zg +ui +Co +Zt +VI +VI +TK +Cb +Bt +qD +BM +Bo +Ia +XK +Ai +VI +VI +HV +Zd +Yu +zD +vx +Jw +gu +WE +WE +"} +(15,1,1) = {" +WE +VU +Yu +oE +JR +yR +Yu +TH +sN +zr +VI +VI +Zl +QO +MJ +QO +ib +MJ +Ai +VI +VI +nA +sV +aA +Yu +DD +fT +Jw +gx +gx +GV +"} +(16,1,1) = {" +WE +WE +VU +Yu +Yu +Yu +VU +Yu +KT +sN +zr +VI +VI +VI +VI +os +VI +VI +VI +VI +nA +sV +MS +Yu +Yu +XY +sF +Jw +gx +gx +gx +"} +(17,1,1) = {" +WE +WE +WE +WE +WE +WE +WE +VU +Yu +cR +sN +yt +yt +yt +yt +nQ +yt +yt +yt +yt +sV +yZ +Yu +Yu +BA +He +Sl +Jw +gx +gx +gx +"} +(18,1,1) = {" +WE +WE +WE +WE +WE +WE +WE +WE +VU +Yu +lV +rI +ZD +rI +rI +Aw +rI +rI +ZD +rI +Sr +Yu +Yu +JD +QZ +Iz +su +Yu +VU +WE +WE +"} +(19,1,1) = {" +WE +WE +WE +WE +WE +WE +WE +WE +WE +VU +Yu +VI +VI +VI +VI +Yu +VI +VI +VI +VI +Yu +Yu +Yu +Yu +Yu +Yu +Yu +VU +WE +WE +WE +"} diff --git a/_maps/shuttles/mining_common_kilo.dmm b/_maps/shuttles/mining_common_kilo.dmm new file mode 100644 index 0000000000..111944d08c --- /dev/null +++ b/_maps/shuttles/mining_common_kilo.dmm @@ -0,0 +1,180 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/mining) +"b" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/mining) +"c" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/mining) +"d" = ( +/obj/machinery/computer/shuttle/mining/common, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/mining) +"e" = ( +/obj/structure/table, +/obj/item/radio, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/mining) +"f" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/mining) +"g" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/mining) +"h" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/mining) +"i" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/mineral/titanium, +/area/shuttle/mining) +"j" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/mining) +"k" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/mining) +"l" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/mining) +"m" = ( +/obj/machinery/door/airlock/titanium{ + name = "Lavaland Shuttle Airlock" + }, +/obj/docking_port/mobile{ + dir = 8; + dwidth = 3; + height = 5; + id = "mining_shuttle_common"; + name = "lavaland shuttle"; + port_direction = 4; + width = 7 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/mining) +"n" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/mining) +"o" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/delivery, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/mining) +"p" = ( +/obj/effect/spawner/structure/window/shuttle, +/obj/structure/shuttle/engine/heater, +/turf/open/floor/plating, +/area/shuttle/mining) +"q" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/mining) +"r" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/mineral/titanium, +/area/shuttle/mining) +"s" = ( +/obj/structure/shuttle/engine/propulsion/burst, +/turf/open/floor/plating/airless, +/area/shuttle/mining) + +(1,1,1) = {" +a +a +b +i +b +a +a +"} +(2,1,1) = {" +a +c +f +j +n +o +r +"} +(3,1,1) = {" +b +d +g +k +n +p +s +"} +(4,1,1) = {" +a +e +h +l +n +q +r +"} +(5,1,1) = {" +a +a +b +m +b +a +a +"} diff --git a/_maps/shuttles/mining_common_meta.dmm b/_maps/shuttles/mining_common_meta.dmm new file mode 100644 index 0000000000..c47d3b806f --- /dev/null +++ b/_maps/shuttles/mining_common_meta.dmm @@ -0,0 +1,124 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/mining) +"b" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/mining) +"c" = ( +/obj/structure/table, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"d" = ( +/obj/machinery/computer/shuttle/mining/common, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"e" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) +"f" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"g" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) +"h" = ( +/obj/machinery/door/airlock/titanium{ + name = "Lavaland Shuttle Airlock" + }, +/obj/docking_port/mobile{ + dir = 8; + dwidth = 3; + height = 5; + id = "mining_shuttle_common"; + name = "lavaland shuttle"; + port_direction = 4; + width = 7 + }, +/turf/open/floor/plating, +/area/shuttle/mining) +"i" = ( +/obj/structure/closet/crate, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"j" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/mining) +"k" = ( +/obj/structure/ore_box, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"l" = ( +/obj/structure/shuttle/engine/propulsion/burst, +/turf/open/floor/plating/airless, +/area/shuttle/mining) +"Q" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) + +(1,1,1) = {" +a +a +b +a +b +a +a +"} +(2,1,1) = {" +a +c +e +g +f +i +a +"} +(3,1,1) = {" +b +d +Q +e +f +j +l +"} +(4,1,1) = {" +a +c +e +e +f +k +a +"} +(5,1,1) = {" +a +a +b +h +b +a +a +"} diff --git a/_maps/shuttles/snow_taxi.dmm b/_maps/shuttles/snow_taxi.dmm index 55259fa1fe..bc6b8761e0 100644 --- a/_maps/shuttles/snow_taxi.dmm +++ b/_maps/shuttles/snow_taxi.dmm @@ -39,6 +39,7 @@ name = "Mining Shuttle Airlock" }, /obj/docking_port/mobile{ + callTime = 5; dwidth = 3; height = 4; id = "snow_taxi"; diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 3ac1d18ac4..c892bab447 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -1560,6 +1560,7 @@ /area/shuttle/abandoned/bridge) "cc" = ( /obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, diff --git a/_maps/templates/hilbertshotel.dmm b/_maps/templates/hilbertshotel.dmm index 4e4d8f8267..5654e0428f 100644 --- a/_maps/templates/hilbertshotel.dmm +++ b/_maps/templates/hilbertshotel.dmm @@ -7,7 +7,7 @@ /area/hilbertshotel) "c" = ( /obj/machinery/jukebox{ - req_access = null + req_one_access = null }, /turf/open/indestructible/hotelwood, /area/hilbertshotel) @@ -72,7 +72,7 @@ /turf/open/indestructible/hotelwood, /area/hilbertshotel) "n" = ( -/obj/effect/landmark/xmastree, +/obj/effect/landmark/xmastree/hilbert, /turf/open/indestructible/hotelwood, /area/hilbertshotel) "o" = ( diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index c9decee834..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: '{build}' -skip_branch_with_pr: true -shallow_clone: true -branches: - except: - - ___TGS3TempBranch - - ___TGSTempBranch -cache: - - C:\byond\ -> dependencies.sh -build_script: - - ps: tools/appveyor/build.ps1 - - ps: "$deployPath = $env:APPVEYOR_BUILD_FOLDER + '/deploy'; bash tools/deploy.sh $deployPath" - - ps: "[System.IO.Compression.ZipFile]::CreateFromDirectory($env:APPVEYOR_BUILD_FOLDER + '/deploy', $env:APPVEYOR_BUILD_FOLDER + '/deploy.zip')" -artifacts: - - path: deploy.zip diff --git a/bot/nudge.py b/bot/nudge.py index b1e6058cc0..6c551ab0d2 100644 --- a/bot/nudge.py +++ b/bot/nudge.py @@ -1,25 +1,25 @@ -#!/usr/bin/env python3 -from config import * -import sys -import pickle -import socket - - -def pack(): - ip = sys.argv[1] - try: - data = sys.argv[2:] - except: - data = "NO DATA SPECIFIED" - - nudge(pickle.dumps({"ip": ip, "data": data})) - - -def nudge(data): - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(("localhost", 45678)) - s.send(data) - s.close() - -if __name__ == "__main__" and len(sys.argv) > 1: - pack() +#!/usr/bin/env python3 +from config import * +import sys +import pickle +import socket + + +def pack(): + ip = sys.argv[1] + try: + data = sys.argv[2:] + except: + data = "NO DATA SPECIFIED" + + nudge(pickle.dumps({"ip": ip, "data": data})) + + +def nudge(data): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect(("localhost", 45678)) + s.send(data) + s.close() + +if __name__ == "__main__" and len(sys.argv) > 1: + pack() diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 62438ac7c1..a5f2c5d0f6 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -171,6 +171,7 @@ #define ORGAN_SLOT_HEART_AID "heartdrive" #define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop" #define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" +#define ORGAN_SLOT_BRAIN_ROBOT_RADSHIELDING "brain_robot_radshielding" #define ORGAN_SLOT_TAIL "tail" #define ORGAN_SLOT_PENIS "penis" #define ORGAN_SLOT_WOMB "womb" diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index bad64846d6..cad75fbfe4 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -22,49 +22,45 @@ #define START_PROCESSING(Processor, Datum) if (!(Datum.datum_flags & DF_ISPROCESSING)) {Datum.datum_flags |= DF_ISPROCESSING;Processor.processing += Datum} #define STOP_PROCESSING(Processor, Datum) Datum.datum_flags &= ~DF_ISPROCESSING;Processor.processing -= Datum;Processor.currentrun -= Datum -//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) +//! SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) -//subsystem does not initialize. -#define SS_NO_INIT (1<<0) +/// subsystem does not initialize. +#define SS_NO_INIT 1 -//subsystem does not fire. -// (like can_fire = 0, but keeps it from getting added to the processing subsystems list) -// (Requires a MC restart to change) -#define SS_NO_FIRE (1<<1) +/** subsystem does not fire. */ +/// (like can_fire = 0, but keeps it from getting added to the processing subsystems list) +/// (Requires a MC restart to change) +#define SS_NO_FIRE 2 -//subsystem only runs on spare cpu (after all non-background subsystems have ran that tick) -// SS_BACKGROUND has its own priority bracket -#define SS_BACKGROUND (1<<2) +/** Subsystem only runs on spare cpu (after all non-background subsystems have ran that tick) */ +/// SS_BACKGROUND has its own priority bracket, this overrides SS_TICKER's priority bump +#define SS_BACKGROUND 4 -//subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background)) -#define SS_NO_TICK_CHECK (1<<3) +/// subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background)) +#define SS_NO_TICK_CHECK 8 -//Treat wait as a tick count, not DS, run every wait ticks. -// (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems) -// (implies all runlevels because of how it works) -// (overrides SS_BACKGROUND) -// This is designed for basically anything that works as a mini-mc (like SStimer) -#define SS_TICKER (1<<4) +/** Treat wait as a tick count, not DS, run every wait ticks. */ +/// (also forces it to run first in the tick (unless SS_BACKGROUND)) +/// (implies all runlevels because of how it works) +/// This is designed for basically anything that works as a mini-mc (like SStimer) +#define SS_TICKER 16 -//keep the subsystem's timing on point by firing early if it fired late last fire because of lag -// ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds. -#define SS_KEEP_TIMING (1<<5) +/** keep the subsystem's timing on point by firing early if it fired late last fire because of lag */ +/// ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds. +#define SS_KEEP_TIMING 32 -//Calculate its next fire after its fired. -// (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be) -// This flag overrides SS_KEEP_TIMING -#define SS_POST_FIRE_TIMING (1<<6) +/** Calculate its next fire after its fired. */ +/// (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be) +/// This flag overrides SS_KEEP_TIMING +#define SS_POST_FIRE_TIMING 64 -/// Show in stat() by default even if SS_NO_FIRE -#define SS_ALWAYS_SHOW_STAT (1<<7) - -//SUBSYSTEM STATES -#define SS_IDLE 0 //aint doing shit. -#define SS_QUEUED 1 //queued to run -#define SS_RUNNING 2 //actively running -#define SS_PAUSED 3 //paused by mc_tick_check -#define SS_SLEEPING 4 //fire() slept. -#define SS_PAUSING 5 //in the middle of pausing +//! SUBSYSTEM STATES +#define SS_IDLE 0 /// ain't doing shit. +#define SS_QUEUED 1 /// queued to run +#define SS_RUNNING 2 /// actively running +#define SS_PAUSED 3 /// paused by mc_tick_check +#define SS_SLEEPING 4 /// fire() slept. +#define SS_PAUSING 5 /// in the middle of pausing #define SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/##X);\ /datum/controller/subsystem/##X/New(){\ diff --git a/code/__DEFINES/_extools.dm b/code/__DEFINES/_extools.dm index 4513243aae..e01e09a3d3 100644 --- a/code/__DEFINES/_extools.dm +++ b/code/__DEFINES/_extools.dm @@ -1 +1,38 @@ -#define EXTOOLS (world.system_type == MS_WINDOWS ? "byond-extools.dll" : "libbyond-extools.so") +// _extools_api.dm - DM API for extools extension library +// (blatently stolen from rust_g) +// +// To configure, create a `extools.config.dm` and set what you care about from +// the following options: +// +// #define EXTOOLS "path/to/extools" +// Override the .dll/.so detection logic with a fixed path or with detection +// logic of your own. + +#ifndef EXTOOLS +// Default automatic EXTOOLS detection. +// On Windows, looks in the standard places for `byond-extools.dll`. +// On Linux, looks in the standard places for`libbyond-extools.so`. + +/* This comment bypasses grep checks */ /var/__extools + +/proc/__detect_extools() + if (world.system_type == UNIX) + if (fexists("./libbyond-extools.so")) + // No need for LD_LIBRARY_PATH badness. + return __extools = "./libbyond-extools.so" + else + // It's not in the current directory, so try others + return __extools = "libbyond-extools.so" + else + return __extools = "byond-extools.dll" + +#define EXTOOLS (__extools || __detect_extools()) +#endif + +#ifndef UNIT_TESTS // use default logging as extools is broken on travis +#define EXTOOLS_LOGGING // rust_g is used as a fallback if this is undefined +#endif + +/proc/extools_log_write() + +/proc/extools_finalize_logging() diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm index a1d8006dbd..f12e3618f7 100644 --- a/code/__DEFINES/_flags/_flags.dm +++ b/code/__DEFINES/_flags/_flags.dm @@ -162,3 +162,20 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL);\ else if(!HAS_TRAIT(x, TRAIT_KEEP_TOGETHER))\ x.appearance_flags &= ~KEEP_TOGETHER + +//dir macros +///Returns true if the dir is diagonal, false otherwise +#define ISDIAGONALDIR(d) (d&(d-1)) +///True if the dir is north or south, false therwise +#define NSCOMPONENT(d) (d&(NORTH|SOUTH)) +///True if the dir is east/west, false otherwise +#define EWCOMPONENT(d) (d&(EAST|WEST)) +///Flips the dir for north/south directions +#define NSDIRFLIP(d) (d^(NORTH|SOUTH)) +///Flips the dir for east/west directions +#define EWDIRFLIP(d) (d^(EAST|WEST)) +///Turns the dir by 180 degrees +#define DIRFLIP(d) turn(d, 180) + +/// 33554431 (2^24 - 1) is the maximum value our bitflags can reach. +#define MAX_BITFLAG_DIGITS 8 diff --git a/code/__DEFINES/_flags/item_flags.dm b/code/__DEFINES/_flags/item_flags.dm index 26e764c45b..7da71e22cb 100644 --- a/code/__DEFINES/_flags/item_flags.dm +++ b/code/__DEFINES/_flags/item_flags.dm @@ -22,12 +22,10 @@ #define SURGICAL_TOOL (1<<10) ///Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. #define NO_UNIFORM_REQUIRED (1<<11) -///Damage when attacking people is not affected by combat mode. -#define NO_COMBAT_MODE_FORCE_MODIFIER (1<<12) /// This item can be used to parry. Only a basic check used to determine if we should proceed with parry chain at all. -#define ITEM_CAN_PARRY (1<<13) +#define ITEM_CAN_PARRY (1<<12) /// This item can be used in the directional blocking system. Only a basic check used to determine if we should proceed with directional block handling at all. -#define ITEM_CAN_BLOCK (1<<14) +#define ITEM_CAN_BLOCK (1<<13) // Flags for the clothing_flags var on /obj/item/clothing diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm index a936a5cef5..ce1e126f12 100644 --- a/code/__DEFINES/_flags/obj_flags.dm +++ b/code/__DEFINES/_flags/obj_flags.dm @@ -9,8 +9,11 @@ #define UNIQUE_RENAME (1<<6) //can you customize the description/name of the thing? #define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. #define FROZEN (1<<8) -#define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check. -#define BLOCK_Z_FALL (1<<10) +#define BLOCK_Z_OUT_DOWN (1<<9) // Should this object block z falling from loc? +#define BLOCK_Z_OUT_UP (1<<10) // Should this object block z uprise from loc? +#define BLOCK_Z_IN_DOWN (1<<11) // Should this object block z falling from above? +#define BLOCK_Z_IN_UP (1<<12) // Should this object block z uprise from below? +#define SHOVABLE_ONTO (1<<13) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check. /// Integrity defines for clothing (not flags but close enough) #define CLOTHING_PRISTINE 0 // We have no damage on the clothing @@ -18,3 +21,6 @@ #define CLOTHING_SHREDDED 2 // The clothing is useless and cannot be equipped unless repaired first // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support + +/// Flags for the pod_flags var on /obj/structure/closet/supplypod +#define FIRST_SOUNDS (1<<0) // If it shouldn't play sounds the first time it lands, used for reverse mode diff --git a/code/__DEFINES/_protect.dm b/code/__DEFINES/_protect.dm index fd27d2fbe9..5dbbd2d513 100644 --- a/code/__DEFINES/_protect.dm +++ b/code/__DEFINES/_protect.dm @@ -7,4 +7,4 @@ }\ ##Path/CanProcCall(procname){\ return FALSE;\ -} \ No newline at end of file +} diff --git a/code/__DEFINES/_readme.dm b/code/__DEFINES/_readme.dm index 42ad52286f..8bf6ada647 100644 --- a/code/__DEFINES/_readme.dm +++ b/code/__DEFINES/_readme.dm @@ -11,4 +11,4 @@ and most importantly, how to undo your changes if you screw it up. - Sayu -*/ \ No newline at end of file +*/ diff --git a/code/__DEFINES/actionspeed_modifiers.dm b/code/__DEFINES/actionspeed_modifiers.dm new file mode 100644 index 0000000000..40fbd3fe26 --- /dev/null +++ b/code/__DEFINES/actionspeed_modifiers.dm @@ -0,0 +1,2 @@ +//ids +#define ACTIONSPEED_ID_SANITY "sanity_component" diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 97f07acc05..f6293454ee 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -35,8 +35,9 @@ #define R_SPAWN (1<<12) #define R_AUTOLOGIN (1<<13) #define R_DBRANKS (1<<14) +#define R_SENSITIVE (1<<15) -#define R_DEFAULT R_AUTOLOGIN +#define R_DEFAULT R_AUTOLOGIN | R_SENSITIVE #define R_EVERYTHING ALL //the sum of all other rank permissions, used for +EVERYTHING @@ -90,3 +91,6 @@ #define SPAM_TRIGGER_WARNING 5 //Number of identical messages required before the spam-prevention will warn you to stfu #define SPAM_TRIGGER_AUTOMUTE 10 //Number of identical messages required before the spam-prevention will automute you + +#define STICKYBAN_DB_CACHE_TIME 10 SECONDS +#define STICKYBAN_ROGUE_CHECK_TIME 5 diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index a3e5423753..e71243994d 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -63,9 +63,17 @@ #define CONTRACT_UPLINK_PAGE_CONTRACTS "CONTRACTS" #define CONTRACT_UPLINK_PAGE_HUB "HUB" +//Lingblood stuff +#define LINGBLOOD_DETECTION_THRESHOLD 1 +#define LINGBLOOD_EXPLOSION_MULT 2 +#define LINGBLOOD_EXPLOSION_THRESHOLD (LINGBLOOD_DETECTION_THRESHOLD * LINGBLOOD_EXPLOSION_MULT) //Hey, important to note here: the explosion threshold is explicitly more than, rather than more than or equal to. This stops a single loud ability from triggering the explosion threshold. ///Heretics -- +GLOBAL_LIST_EMPTY(living_heart_cache) //A list of all living hearts in existance, for us to iterate through. + + #define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic)) +#define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster)) #define PATH_SIDE "Side" diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index dad2a38afd..7bb124fe0f 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -115,7 +115,7 @@ #define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8. #define LOW_PRESSURE_DAMAGE 8 //The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). -#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this +#define COLD_SLOWDOWN_FACTOR 35 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this //PIPES //Atmos pipe limits diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index bba5b5c5ed..ac5272057a 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -13,27 +13,43 @@ #define STYLE_GONDOLA 13 #define STYLE_SEETHROUGH 14 -#define POD_ICON_STATE 1 -#define POD_NAME 2 -#define POD_DESC 3 +#define POD_SHAPE 1 +#define POD_BASE 2 +#define POD_DOOR 3 +#define POD_DECAL 4 +#define POD_GLOW 5 +#define POD_RUBBLE_TYPE 6 +#define POD_NAME 7 +#define POD_DESC 8 -#define POD_STYLES list(\ - list("supplypod", "supply pod", "A Nanotrasen supply drop pod."),\ - list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ - list("centcompod", "\improper Centcom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to Centcom after delivery."),\ - list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ - list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."),\ - list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ - list("missilepod", "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list("smissilepod", "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list("boxpod", "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ - list("honkpod", "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ - list("fruitpod", "\improper Orange", "An angry orange."),\ - list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ - list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency."),\ - list("", "", "")\ -) +#define RUBBLE_NONE 1 +#define RUBBLE_NORMAL 2 +#define RUBBLE_WIDE 3 +#define RUBBLE_THIN 4 +#define POD_SHAPE_NORML 1 +#define POD_SHAPE_OTHER 2 + +#define SUPPLYPOD_X_OFFSET -16 + +GLOBAL_LIST_EMPTY(supplypod_loading_bays) + +GLOBAL_LIST_INIT(podstyles, list(\ + list(POD_SHAPE_NORML, "pod", TRUE, "default", "yellow", RUBBLE_NORMAL, "supply pod", "A Nanotrasen supply drop pod."),\ + list(POD_SHAPE_NORML, "advpod", TRUE, "bluespace", "blue", RUBBLE_NORMAL, "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ + list(POD_SHAPE_NORML, "advpod", TRUE, "centcom", "blue", RUBBLE_NORMAL, "\improper CentCom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery."),\ + list(POD_SHAPE_NORML, "darkpod", TRUE, "syndicate", "red", RUBBLE_NORMAL, "blood-red supply pod", "An intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ + list(POD_SHAPE_NORML, "darkpod", TRUE, "deathsquad", "blue", RUBBLE_NORMAL, "\improper Deathsquad drop pod", "A Nanotrasen drop pod. This one has been marked the markings of Nanotrasen's elite strike team."),\ + list(POD_SHAPE_NORML, "pod", TRUE, "cultist", "red", RUBBLE_NORMAL, "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ + list(POD_SHAPE_OTHER, "missile", FALSE, FALSE, FALSE, RUBBLE_THIN, "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list(POD_SHAPE_OTHER, "smissile", FALSE, FALSE, FALSE, RUBBLE_THIN, "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list(POD_SHAPE_OTHER, "box", TRUE, FALSE, FALSE, RUBBLE_WIDE, "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ + list(POD_SHAPE_NORML, "clownpod", TRUE, "clown", "green", RUBBLE_NORMAL, "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ + list(POD_SHAPE_OTHER, "orange", TRUE, FALSE, FALSE, RUBBLE_NONE, "\improper Orange", "An angry orange."),\ + list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ + list(POD_SHAPE_OTHER, "gondola", FALSE, FALSE, FALSE, RUBBLE_NONE, "gondola", "The silent walker. This one seems to be part of a delivery agency."),\ + list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, FALSE, FALSE, "rl_click", "give_po")\ +)) #define PACK_GOODY_NONE 0 #define PACK_GOODY_PUBLIC 1 //can be bought by both privates and cargo -#define PACK_GOODY_PRIVATE 2 //can be bought only by privates \ No newline at end of file +#define PACK_GOODY_PRIVATE 2 //can be bought only by privates diff --git a/code/__DEFINES/cinematics.dm b/code/__DEFINES/cinematics.dm index aa19ffb4cf..6d85c45f1b 100644 --- a/code/__DEFINES/cinematics.dm +++ b/code/__DEFINES/cinematics.dm @@ -10,4 +10,4 @@ #define CINEMATIC_NUKE_NO_CORE 10 #define CINEMATIC_NUKE_FAR 11 #define CINEMATIC_NUKE_CLOWNOP 12 -#define CINEMATIC_CULT_NUKE 13 \ No newline at end of file +#define CINEMATIC_CULT_NUKE 13 diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 0bdf27452b..541b50e9bd 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -106,5 +106,25 @@ //belly sound pref things #define NORMIE_HEARCHECK 4 +//icon states for the default eyes and for a state for no eye +#define DEFAULT_EYES_TYPE "normal" +#define DEFAULT_LEFT_EYE_STATE "normal_left_eye" +#define DEFAULT_RIGHT_EYE_STATE "normal_right_eye" +#define DEFAULT_NO_EYE_STATE "no_eye" + //special species definitions #define MINIMUM_MUTANT_COLOR "#202020" //this is how dark players mutant parts and skin can be + +//defines for different matrix sections +#define MATRIX_RED "red" +#define MATRIX_GREEN "green" +#define MATRIX_BLUE "blue" +#define MATRIX_RED_GREEN "red_green" +#define MATRIX_RED_BLUE "red_blue" +#define MATRIX_GREEN_BLUE "green_blue" +#define MATRIX_ALL "red_green_blue" +#define MATRIX_NONE "none" + +//defines for the two colour schemes, advanced and old +#define OLD_CHARACTER_COLORING "old_color_system" +#define ADVANCED_CHARACTER_COLORING "advanced_color_system" diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 5f4317060d..dbca36aab4 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -96,4 +96,4 @@ GLOBAL_LIST_EMPTY(all_clockwork_rites) //a list containing all clockwork rites. #define ARK_SCREAM_COOLDOWN 300 //This much time has to pass between instances of the Ark taking damage before it will "scream" again -#define PRISM_DELAY_DURATION 1200 //how long prolonging prisms delay the shuttle for; defaults to 2 minutes \ No newline at end of file +#define PRISM_DELAY_DURATION 1200 //how long prolonging prisms delay the shuttle for; defaults to 2 minutes diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 2273d34c82..fb461acfa4 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -1,54 +1,54 @@ // This is eventually for wjohn to add more color standardization stuff like I keep asking him >:( -#define COLOR_INPUT_DISABLED "#F0F0F0" -#define COLOR_INPUT_ENABLED "#D3B5B5" -#define COLOR_FLOORTILE_GRAY "#8D8B8B" -#define COLOR_ALMOST_BLACK "#333333" -#define COLOR_BLACK "#000000" -#define COLOR_RED "#FF0000" -#define COLOR_RED_LIGHT "#FF3333" -#define COLOR_MAROON "#800000" -#define COLOR_YELLOW "#FFFF00" -#define COLOR_OLIVE "#808000" -#define COLOR_LIME "#32CD32" -#define COLOR_GREEN "#008000" -#define COLOR_CYAN "#00FFFF" -#define COLOR_TEAL "#008080" -#define COLOR_BLUE "#0000FF" -#define COLOR_BLUE_LIGHT "#33CCFF" -#define COLOR_NAVY "#000080" -#define COLOR_PINK "#FFC0CB" -#define COLOR_MAGENTA "#FF00FF" -#define COLOR_PURPLE "#800080" -#define COLOR_ORANGE "#FF9900" -#define COLOR_BEIGE "#CEB689" -#define COLOR_BLUE_GRAY "#75A2BB" -#define COLOR_BROWN "#BA9F6D" -#define COLOR_DARK_BROWN "#997C4F" -#define COLOR_DARK_ORANGE "#C3630C" -#define COLOR_GREEN_GRAY "#99BB76" -#define COLOR_RED_GRAY "#B4696A" -#define COLOR_PALE_BLUE_GRAY "#98C5DF" -#define COLOR_PALE_GREEN_GRAY "#B7D993" -#define COLOR_PALE_ORANGE "#FFC066" -#define COLOR_PALE_RED_GRAY "#D59998" -#define COLOR_PALE_PURPLE_GRAY "#CBB1CA" -#define COLOR_PURPLE_GRAY "#AE8CA8" +#define COLOR_INPUT_DISABLED "#F0F0F0" +#define COLOR_INPUT_ENABLED "#D3B5B5" +#define COLOR_FLOORTILE_GRAY "#8D8B8B" +#define COLOR_ALMOST_BLACK "#333333" +#define COLOR_BLACK "#000000" +#define COLOR_RED "#FF0000" +#define COLOR_RED_LIGHT "#FF3333" +#define COLOR_MAROON "#800000" +#define COLOR_YELLOW "#FFFF00" +#define COLOR_OLIVE "#808000" +#define COLOR_LIME "#32CD32" +#define COLOR_GREEN "#008000" +#define COLOR_CYAN "#00FFFF" +#define COLOR_TEAL "#008080" +#define COLOR_BLUE "#0000FF" +#define COLOR_BLUE_LIGHT "#33CCFF" +#define COLOR_NAVY "#000080" +#define COLOR_PINK "#FFC0CB" +#define COLOR_MAGENTA "#FF00FF" +#define COLOR_PURPLE "#800080" +#define COLOR_ORANGE "#FF9900" +#define COLOR_BEIGE "#CEB689" +#define COLOR_BLUE_GRAY "#75A2BB" +#define COLOR_BROWN "#BA9F6D" +#define COLOR_DARK_BROWN "#997C4F" +#define COLOR_DARK_ORANGE "#C3630C" +#define COLOR_GREEN_GRAY "#99BB76" +#define COLOR_RED_GRAY "#B4696A" +#define COLOR_PALE_BLUE_GRAY "#98C5DF" +#define COLOR_PALE_GREEN_GRAY "#B7D993" +#define COLOR_PALE_ORANGE "#FFC066" +#define COLOR_PALE_RED_GRAY "#D59998" +#define COLOR_PALE_PURPLE_GRAY "#CBB1CA" +#define COLOR_PURPLE_GRAY "#AE8CA8" -//Color defines used by the assembly detailer. -#define COLOR_ASSEMBLY_BLACK "#545454" -#define COLOR_ASSEMBLY_BGRAY "#9497AB" -#define COLOR_ASSEMBLY_WHITE "#E2E2E2" -#define COLOR_ASSEMBLY_RED "#CC4242" -#define COLOR_ASSEMBLY_ORANGE "#E39751" -#define COLOR_ASSEMBLY_BEIGE "#AF9366" -#define COLOR_ASSEMBLY_BROWN "#97670E" -#define COLOR_ASSEMBLY_GOLD "#AA9100" -#define COLOR_ASSEMBLY_YELLOW "#CECA2B" -#define COLOR_ASSEMBLY_GURKHA "#999875" -#define COLOR_ASSEMBLY_LGREEN "#789876" -#define COLOR_ASSEMBLY_GREEN "#44843C" -#define COLOR_ASSEMBLY_LBLUE "#5D99BE" -#define COLOR_ASSEMBLY_BLUE "#38559E" -#define COLOR_ASSEMBLY_PURPLE "#6F6192" -#define COLOR_ASSEMBLY_PINK "#ff4adc" +// Color defines used by the assembly detailer. +#define COLOR_ASSEMBLY_BLACK "#545454" +#define COLOR_ASSEMBLY_BGRAY "#9497AB" +#define COLOR_ASSEMBLY_WHITE "#E2E2E2" +#define COLOR_ASSEMBLY_RED "#CC4242" +#define COLOR_ASSEMBLY_ORANGE "#E39751" +#define COLOR_ASSEMBLY_BEIGE "#AF9366" +#define COLOR_ASSEMBLY_BROWN "#97670E" +#define COLOR_ASSEMBLY_GOLD "#AA9100" +#define COLOR_ASSEMBLY_YELLOW "#CECA2B" +#define COLOR_ASSEMBLY_GURKHA "#999875" +#define COLOR_ASSEMBLY_LGREEN "#789876" +#define COLOR_ASSEMBLY_GREEN "#44843C" +#define COLOR_ASSEMBLY_LBLUE "#5D99BE" +#define COLOR_ASSEMBLY_BLUE "#38559E" +#define COLOR_ASSEMBLY_PURPLE "#6F6192" +#define COLOR_ASSEMBLY_PINK "#ff4adc" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index eff5d9eca9..d12fe77448 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -11,6 +11,12 @@ #define STAMINA "stamina" #define BRAIN "brain" +//Toxins damage 'typeflag' - is this normal toxins damage or does it have to do with systems corruption (ROBOTIC_ORGANISM species trait) + +#define TOX_DEFAULT 1 //For normal toxins damage / healing (toxins, etc), adjustToxLoss() defaults to this +#define TOX_SYSCORRUPT 2 //For toxins damage causing adverse effects to robotic organisms, up to and including fatal corruption, or healing that damage +#define TOX_OMNI 3 //For tox damage / healing that affects both organics and robotic organisms. Used by very few things, e.g. aheals / by default setToxLoss() + //bitflag damage defines used for suicide_act #define BRUTELOSS (1<<0) #define FIRELOSS (1<<1) @@ -34,6 +40,8 @@ #define COMBAT_FLAGS_DEFAULT (COMBAT_FLAG_PARRY_CAPABLE | COMBAT_FLAG_BLOCK_CAPABLE) /// Default combat flags for everyone else (so literally everyone but humans). #define COMBAT_FLAGS_SPRINT_EXEMPT (COMBAT_FLAG_SPRINT_ACTIVE | COMBAT_FLAG_SPRINT_TOGGLED | COMBAT_FLAG_SPRINT_FORCED | COMBAT_FLAG_PARRY_CAPABLE | COMBAT_FLAG_BLOCK_CAPABLE) +/// Default combat flags for those in stamina combat system +#define COMBAT_FLAGS_STAMINA_COMBAT (COMBAT_FLAG_PARRY_CAPABLE | COMBAT_FLAG_BLOCK_CAPABLE | COMBAT_FLAG_STAMINA_BUFFER) /// The user wants sprint mode on #define COMBAT_FLAG_SPRINT_TOGGLED (1<<0) @@ -47,8 +55,8 @@ #define COMBAT_FLAG_RESISTING_REST (1<<4) /// Intentionally resting #define COMBAT_FLAG_INTENTIONALLY_RESTING (1<<5) -/// Currently stamcritted but not as violently -#define COMBAT_FLAG_SOFT_STAMCRIT (1<<6) +/// This mob requires stamina buffer to do things that require stamina buffer. Not having this exempts the mob from stamina combat. +#define COMBAT_FLAG_STAMINA_BUFFER (1<<6) /// Force sprint mode on at all times, overrides everything including sprint disable traits. #define COMBAT_FLAG_SPRINT_FORCED (1<<7) /// This mob is capable of using the active parrying system. @@ -64,26 +72,19 @@ // Helpers for getting someone's stamcrit state. Cast to living. #define NOT_STAMCRIT 0 -#define SOFT_STAMCRIT 1 -#define HARD_STAMCRIT 2 +#define HARD_STAMCRIT 1 // Stamcrit check helpers #define IS_STAMCRIT(mob) (CHECK_STAMCRIT(mob) != NOT_STAMCRIT) -#define CHECK_STAMCRIT(mob) ((mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)? HARD_STAMCRIT : ((mob.combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)? SOFT_STAMCRIT : NOT_STAMCRIT)) +#define CHECK_STAMCRIT(mob) (mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) //stamina stuff -///Threshold over which attacks start being hindered. -#define STAMINA_NEAR_SOFTCRIT 90 -///softcrit for stamina damage. prevents standing up, some actions that cost stamina, etc, but doesn't force a rest or stop movement -#define STAMINA_SOFTCRIT 100 -///sanity cap to prevent stamina actions (that are still performable) from sending you into crit. -#define STAMINA_NEAR_CRIT 130 -///crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit +/// crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit #define STAMINA_CRIT 140 -///same as STAMINA_SOFTCRIT except for the more traditional health calculations -#define STAMINA_SOFTCRIT_TRADITIONAL 0 -///ditto, but for STAMINA_CRIT -#define STAMINA_CRIT_TRADITIONAL -40 +/// Threshold for leaving stamina critical +#define STAMINA_CRIT_REMOVAL_THRESHOLD 100 +/// Threshold under for which you are unable to draw from stamina health to replace stamina buffer +#define STAMINA_NO_OVERDRAW_THRESHOLD 100 #define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob @@ -252,36 +253,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( //We will round to this value in damage calculations. #define DAMAGE_PRECISION 0.01 -//items total mass, used to calculate their attacks' stamina costs. If not defined, the cost will be (w_class * 1.25) -#define TOTAL_MASS_TINY_ITEM 1.25 -#define TOTAL_MASS_SMALL_ITEM 2.5 -#define TOTAL_MASS_NORMAL_ITEM 3.75 -#define TOTAL_MASS_BULKY_ITEM 5 -#define TOTAL_MASS_HUGE_ITEM 6.25 -#define TOTAL_MASS_GIGANTIC_ITEM 7.5 - -#define TOTAL_MASS_HAND_REPLACEMENT 5 //standard punching stamina cost. most hand replacements are huge items anyway. -#define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds. -#define TOTAL_MASS_TOY_SWORD 1.5 - -//stamina cost defines. -#define STAM_COST_ATTACK_OBJ_MULT 1.2 -#define STAM_COST_ATTACK_MOB_MULT 1 -#define STAM_COST_BATON_MOB_MULT 1 -#define STAM_COST_NO_COMBAT_MULT 1.25 -#define STAM_COST_W_CLASS_MULT 1.25 -#define STAM_COST_THROW_MULT 2 -#define STAM_COST_THROW_MOB 2.5 //multiplied by (mob size + 1)^2. - -///Multiplier of the (STAMINA_NEAR_CRIT - user current stamina loss) : (STAMINA_NEAR_CRIT - STAMINA_SOFTCRIT) ratio used in damage penalties when stam soft-critted. -#define STAM_CRIT_ITEM_ATTACK_PENALTY 0.66 -/// changeNext_move penalty multiplier of the above. -#define STAM_CRIT_ITEM_ATTACK_DELAY 1.75 -/// Damage penalty when fighting prone. -#define LYING_DAMAGE_PENALTY 0.7 -/// Added delay when firing guns stam-softcritted. Summed with a hardset CLICK_CD_RANGE delay, similar to STAM_CRIT_DAMAGE_DELAY otherwise. -#define STAM_CRIT_GUN_DELAY 2.75 - //stamina recovery defines. Blocked if combat mode is on. #define STAM_RECOVERY_STAM_CRIT -7.5 #define STAM_RECOVERY_RESTING -6 diff --git a/code/__DEFINES/combat/stamina_combat.dm b/code/__DEFINES/combat/stamina_combat.dm new file mode 100644 index 0000000000..351009f27f --- /dev/null +++ b/code/__DEFINES/combat/stamina_combat.dm @@ -0,0 +1,35 @@ +// Stamina Buffer + +// Standard amounts for stamina usage + +// Multipliers +/// Base stamina cost for an item of a certain w_class without total_mass set. +#define STAM_COST_W_CLASS_MULT 1.25 + +// Flat amounts +/// Usage for eyestabbing with a screwdriver +#define STAMINA_COST_ITEM_EYESTAB 7.5 +/// Usage for shoving yourself off the ground instantly +#define STAMINA_COST_SHOVE_UP 15 + +//items total mass, used to calculate their attacks' stamina costs. If not defined, the cost will be (w_class * 1.25) +#define TOTAL_MASS_TINY_ITEM 1.25 +#define TOTAL_MASS_SMALL_ITEM 2.5 +#define TOTAL_MASS_NORMAL_ITEM 3.75 +#define TOTAL_MASS_BULKY_ITEM 5 +#define TOTAL_MASS_HUGE_ITEM 6.25 +#define TOTAL_MASS_GIGANTIC_ITEM 7.5 + +#define TOTAL_MASS_HAND_REPLACEMENT 5 //standard punching stamina cost. most hand replacements are huge items anyway. +#define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds. +#define TOTAL_MASS_TOY_SWORD 1.5 + +//stamina cost defines. +#define STAM_COST_ATTACK_OBJ_MULT 0.75 +#define STAM_COST_ATTACK_MOB_MULT 1 +#define STAM_COST_BATON_MOB_MULT 0.85 +#define STAM_COST_THROW_MULT 0.75 +#define STAM_COST_THROW_MOB 1.25 //multiplied by (mob size + 1)^2. + +/// Damage penalty when fighting prone. +#define LYING_DAMAGE_PENALTY 0.7 diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm index 20c1df2ec7..0428a16828 100644 --- a/code/__DEFINES/configuration.dm +++ b/code/__DEFINES/configuration.dm @@ -3,6 +3,8 @@ #define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y) /// Gets the datum of the object, for when editing a const define. #define CONFIG_GET_ENTRY(X) global.config.GetEntryDatum(/datum/config_entry/##X) +/// Caches an entry in the proc +#define CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(X, varname) var/static/datum/config_entry/##X/entrycache_##varname;if(!entrycache_##varname){entrycache_##varname=CONFIG_GET_ENTRY(##X);};var/##varname=entrycache_##varname.config_entry_value #define CONFIG_MAPS_FILE "maps.txt" diff --git a/code/__DEFINES/contracts.dm b/code/__DEFINES/contracts.dm index b600a5fdc0..c6e23394ba 100644 --- a/code/__DEFINES/contracts.dm +++ b/code/__DEFINES/contracts.dm @@ -41,4 +41,4 @@ #define BANISH_FUNERAL_GARB "funeral" #define LORE 1 -#define LAW 2 \ No newline at end of file +#define LAW 2 diff --git a/code/__DEFINES/cult.dm b/code/__DEFINES/cult.dm index 198291f0ae..9940391673 100644 --- a/code/__DEFINES/cult.dm +++ b/code/__DEFINES/cult.dm @@ -20,4 +20,4 @@ #define DEFAULT_TOOLTIP "6:-29,5:-2" //misc #define SOULS_TO_REVIVE 3 -#define BLOODCULT_EYE "f00" \ No newline at end of file +#define BLOODCULT_EYE "f00" diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 2dbd4874d9..719a795824 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -82,4 +82,4 @@ /// combat mode is active. #define COMBAT_MODE_ACTIVE (1<<1) /// combat mode is not active -#define COMBAT_MODE_INACTIVE (1<<2) \ No newline at end of file +#define COMBAT_MODE_INACTIVE (1<<2) diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm index b13530cdf7..ba2b9a704a 100644 --- a/code/__DEFINES/dcs/helpers.dm +++ b/code/__DEFINES/dcs/helpers.dm @@ -6,11 +6,18 @@ #define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) +/// Signifies that this proc is used to handle signals. +/// Every proc you pass to RegisterSignal must have this. +#define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE) + +/// Signifies that this proc is used to handle signals, but also sleeps. +/// Do not use this for new work. +#define SIGNAL_HANDLER_DOES_SLEEP + /// A wrapper for _AddElement that allows us to pretend we're using normal named arguments #define AddElement(arguments...) _AddElement(list(##arguments)) - /// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments #define RemoveElement(arguments...) _RemoveElement(list(##arguments)) /// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments -#define AddComponent(arguments...) _AddComponent(list(##arguments)) \ No newline at end of file +#define AddComponent(arguments...) _AddComponent(list(##arguments)) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index cf669b905a..42199174e7 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -85,7 +85,7 @@ #define COMSIG_ATOM_EMP_ACT "atom_emp_act" ///from base of atom/fire_act(): (exposed_temperature, exposed_volume) #define COMSIG_ATOM_FIRE_ACT "atom_fire_act" -///from base of atom/bullet_act(): (/obj/projectile, def_zone) +///from base of atom/bullet_act(): (/obj/item/projectile, def_zone) #define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" ///from base of atom/blob_act(): (/obj/structure/blob) #define COMSIG_ATOM_BLOB_ACT "atom_blob_act" @@ -136,11 +136,15 @@ #define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) #define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. +///////////////// + //This signal return value bitflags can be found in __DEFINES/misc.dm #define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) - -///////////////// +/// Called from orbit component: (atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) +#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin" +/// Called from orbit component: (atom/movable/orbiter, refreshing) +#define COMSIG_ATOM_ORBIT_END "atom_orbit_end" #define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) #define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) @@ -286,7 +290,7 @@ #define COMSIG_LIVING_ACTIVE_BLOCK_START "active_block_start" //from base of mob/living/keybind_start_active_blocking(): (obj/item/blocking_item, list/backup_items) #define COMPONENT_PREVENT_BLOCK_START 1 -#define COMSIG_LIVING_ACTIVE_PARRY_START "active_parry_start" //from base of mob/living/initiate_parry_sequence(): (parrying_method, datum/parrying_item_mob_or_art, list/backup_items) +#define COMSIG_LIVING_ACTIVE_PARRY_START "active_parry_start" //from base of mob/living/initiate_parry_sequence(): (parrying_method, datum/parrying_item_mob_or_art, list/backup_items, list/override) #define COMPONENT_PREVENT_PARRY_START 1 //ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! @@ -381,6 +385,8 @@ #define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]: // Uncovered information #define COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION 1 +///from [/obj/structure/closet/supplypod/proc/endlaunch]: +#define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom" // /obj/item/grenade signals #define COMSIG_GRENADE_PRIME "grenade_prime" //called in /obj/item/gun/process_fire (user, target, params, zone_override) @@ -488,6 +494,17 @@ #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites #define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component +/// Checks if a nanite component is able to be controlled by console +#define COMSIG_NANITE_CHECK_CONSOLE_LOCK "is_console_locked" +/// Checks if a nanite component is able to be interfaced with by a host with innate nanite control +#define COMSIG_NANITE_CHECK_HOST_LOCK "is_host_locked" +/// Checks if a nanite component is able to be overwritten by viral replica +#define COMSIG_NANITE_CHECK_VIRAL_PREVENTION "is_virus_locked" + #define NANITE_CHANGES_LOCKED 1 +// Internal signals that programs register to and respond with to not require for loops +#define COMSIG_NANITE_INTERNAL_CONSOLE_LOCK_CHECK "naniteiconsolelocked" +#define COMSIG_NANITE_INTERNAL_HOST_LOCK_CHECK "naniteihostlocked" +#define COMSIG_NANITE_INTERNAL_VIRAL_PREVENTION_CHECK "naniteiviruslocked" // /datum/component/storage signals #define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. @@ -523,3 +540,10 @@ #define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) #define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) #define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) + +// /datum/element/ventcrawling signals +#define COMSIG_HANDLE_VENTCRAWL "handle_ventcrawl" //when atom with ventcrawling element attempts to ventcrawl +#define COMSIG_CHECK_VENTCRAWL "check_ventcrawl" //to check an atom's ventcrawling element tier (if applicable) +// twitch plays +/// Returns direction: (wipe_votes) +#define COMSIG_TWITCH_PLAYS_MOVEMENT_DATA "twitch_plays_movement_data" diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm index da8a76e71e..6a15834ed8 100644 --- a/code/__DEFINES/dynamic.dm +++ b/code/__DEFINES/dynamic.dm @@ -1,7 +1,7 @@ #define CURRENT_LIVING_PLAYERS 1 #define CURRENT_LIVING_ANTAGS 2 #define CURRENT_DEAD_PLAYERS 3 -#define CURRENT_OBSERVERS 4 +#define CURRENT_OBSERVERS 4 #define NO_ASSASSIN (1<<0) #define WAROPS_ALWAYS_ALLOWED (1<<1) @@ -9,9 +9,11 @@ #define FORCE_IF_WON (1<<3) #define USE_PREV_ROUND_WEIGHTS (1<<4) -#define ONLY_RULESET (1<<0) -#define HIGHLANDER_RULESET (1<<1) -#define TRAITOR_RULESET (1<<2) -#define MINOR_RULESET (1<<3) +#define ONLY_RULESET (1<<0) +#define HIGHLANDER_RULESET (1<<1) +#define TRAITOR_RULESET (1<<2) +#define MINOR_RULESET (1<<3) +#define FAKE_ANTAG_RULESET (1<<4) +#define ALWAYS_MAX_WEIGHT_RULESET (1<<5) #define RULESET_STOP_PROCESSING 1 diff --git a/code/__DEFINES/exports.dm b/code/__DEFINES/exports.dm index 9e0caf417f..6c8b00de52 100644 --- a/code/__DEFINES/exports.dm +++ b/code/__DEFINES/exports.dm @@ -1,4 +1,4 @@ #define EXPORT_CARGO 1 #define EXPORT_EMAG 2 #define EXPORT_CONTRABAND 4 -#define EXPORT_PIRATE 8 \ No newline at end of file +#define EXPORT_PIRATE 8 diff --git a/code/__DEFINES/fantasy_affixes.dm b/code/__DEFINES/fantasy_affixes.dm index 709d414d11..20db49bebe 100644 --- a/code/__DEFINES/fantasy_affixes.dm +++ b/code/__DEFINES/fantasy_affixes.dm @@ -2,4 +2,4 @@ #define AFFIX_SUFFIX (1 << 1) #define AFFIX_GOOD (1 << 0) -#define AFFIX_EVIL (1 << 1) \ No newline at end of file +#define AFFIX_EVIL (1 << 1) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 66f741b2c7..ff68f18408 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isplatingturf(A) (istype(A, /turf/open/floor/plating)) -#define istransparentturf(A) (istype(A, /turf/open/transparent)) +#define istransparentturf(A) (istype(A, /turf/open/transparent)||istype(A, /turf/open/space/transparent)) //Mobs #define isliving(A) (istype(A, /mob/living)) @@ -86,6 +86,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isinsect(A) (is_species(A, /datum/species/insect)) #define isxenoperson(A) (is_species(A, /datum/species/xeno)) #define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime)) +#define isarachnid(A) (is_species(A, /datum/species/arachnid)) //more carbon mobs #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) @@ -124,7 +125,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isbot(A) (istype(A, /mob/living/simple_animal/bot)) -#define isshade(A) (istype(A, /mob/living/simple_animal/shade)) +#define isshade(A) (istype(A, /mob/living/simple_animal/hostile/construct/shade)) #define ismouse(A) (istype(A, /mob/living/simple_animal/mouse)) @@ -187,6 +188,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define islandmine(A) (istype(A, /obj/effect/mine)) +#define issupplypod(A) (istype(A, /obj/structure/closet/supplypod)) + #define isammocasing(A) (istype(A, /obj/item/ammo_casing)) #define isidcard(I) (istype(I, /obj/item/card/id)) @@ -235,3 +238,5 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) #define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) + +#define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index add4a8e277..798ea478c2 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -24,3 +24,4 @@ #define LANGUAGE_STONER "stoner" #define LANGUAGE_VASSAL "vassal" #define LANGUAGE_VOICECHANGE "voicechange" +#define LANGUAGE_MULTILINGUAL "multilingual" diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm index 9188efacfd..8ab33689d3 100644 --- a/code/__DEFINES/layers_planes.dm +++ b/code/__DEFINES/layers_planes.dm @@ -37,7 +37,9 @@ #define FIELD_OF_VISION_VISUAL_RENDER_TARGET "FIELD_OF_VISION_VISUAL_PLANE" #define CHAT_PLANE -1 //We don't want heard messages to be hidden by FoV. -#define CHAT_LAYER 12.1 //Legacy, it doesn't matter that much because we are displayed above the game plane anyway. + +#define CHAT_LAYER 12.0001 // Do not insert layers between these two values +#define CHAT_LAYER_MAX 12.9999 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals #define BLACKNESS_PLANE_RENDER_TARGET "BLACKNESS_PLANE" diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 767894050d..973457692e 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -55,6 +55,9 @@ //donator items #define LOADOUT_CATEGORY_DONATOR "Donator" +//unlockable items +#define LOADOUT_CATEGORY_UNLOCKABLE "Unlockable" + //how many prosthetics can we have #define MAXIMUM_LOADOUT_PROSTHETICS 2 @@ -66,4 +69,16 @@ #define LOADOUT_LIMB_PROSTHETIC "Prosthetic" #define LOADOUT_LIMB_AMPUTATED "Amputated" -#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though \ No newline at end of file +#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though + +//loadout saving/loading specific defines +#define MAXIMUM_LOADOUT_SAVES 5 +#define LOADOUT_ITEM "loadout_item" +#define LOADOUT_COLOR "loadout_color" +#define LOADOUT_CUSTOM_NAME "loadout_custom_name" +#define LOADOUT_CUSTOM_DESCRIPTION "loadout_custom_description" + +//loadout item flags +#define LOADOUT_CAN_NAME (1<<0) //renaming items +#define LOADOUT_CAN_DESCRIPTION (1<<1) //adding a custom description to items +#define LOADOUT_CAN_COLOR_POLYCHROMIC (1<<2) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index df5b7d9f11..762df42472 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -120,4 +120,4 @@ #define CLONEPOD_GET_MIND 1 #define CLONEPOD_POLL_MIND 2 -#define CLONEPOD_NO_MIND 3 \ No newline at end of file +#define CLONEPOD_NO_MIND 3 diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index c5c2dd58c2..854b6c9dcf 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -20,11 +20,6 @@ Multi-Z stations are supported and multi-Z mining and away missions would require only minor tweaks. */ -// helpers for modifying jobs, used in various job_changes.dm files -#define MAP_JOB_CHECK if(SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) { return; } -#define MAP_JOB_CHECK_BASE if(SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) { return ..(); } -#define MAP_REMOVE_JOB(jobpath) /datum/job/##jobpath/map_check() { return (SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) && ..() } - #define SPACERUIN_MAP_EDGE_PAD 15 // traits diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm index 72e827a7c8..a28bd6ebf8 100644 --- a/code/__DEFINES/materials.dm +++ b/code/__DEFINES/materials.dm @@ -12,4 +12,4 @@ #define MATERIAL_ADD_PREFIX (1<<1) #define MATERIAL_AFFECT_STATISTICS (1<<2) -#define MATERIAL_SOURCE(mat) "[mat.name]_material" \ No newline at end of file +#define MATERIAL_SOURCE(mat) "[mat.name]_material" diff --git a/code/__DEFINES/medal.dm b/code/__DEFINES/medal.dm index 89fc098e3d..e723c7504e 100644 --- a/code/__DEFINES/medal.dm +++ b/code/__DEFINES/medal.dm @@ -26,4 +26,4 @@ //Misc medals #define MEDAL_METEOR "Your Life Before Your Eyes" #define MEDAL_PULSE "Jackpot" -#define MEDAL_TIMEWASTE "Overextended The Joke" \ No newline at end of file +#define MEDAL_TIMEWASTE "Overextended The Joke" diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm index b166b9d21a..71913cac5b 100644 --- a/code/__DEFINES/melee.dm +++ b/code/__DEFINES/melee.dm @@ -8,4 +8,4 @@ #define MARTIALART_KRAVMAGA "krav maga" #define MARTIALART_CQC "CQC" #define MARTIALART_PLASMAFIST "plasma fist" -#define MARTIALART_RISINGBASS "rising bass" \ No newline at end of file +#define MARTIALART_RISINGBASS "rising bass" diff --git a/code/__DEFINES/menu.dm b/code/__DEFINES/menu.dm index 2730adf87c..60a7a2379c 100644 --- a/code/__DEFINES/menu.dm +++ b/code/__DEFINES/menu.dm @@ -1,3 +1,3 @@ #define CHECKBOX_NONE 0 #define CHECKBOX_GROUP 1 -#define CHECKBOX_TOGGLE 2 \ No newline at end of file +#define CHECKBOX_TOGGLE 2 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 0704947dda..30162594d6 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -159,6 +159,7 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define BLOOD_COLOR_LIZARD "#db004D" #define BLOOD_COLOR_UNIVERSAL "#db3300" #define BLOOD_COLOR_BUG "#a37c0f" +#define BLOOD_COLOR_PLANT "#3d610e" //suit sensors: sensor_mode defines diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 586fce3e0c..8e7cf8763b 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -1,17 +1,17 @@ /*ALL MOB-RELATED DEFINES THAT DON'T BELONG IN ANOTHER FILE GO HERE*/ -//Misc mob defines +// Misc mob defines -//Ready states at roundstart for mob/dead/new_player +// Ready states at roundstart for mob/dead/new_player #define PLAYER_NOT_READY 0 #define PLAYER_READY_TO_PLAY 1 #define PLAYER_READY_TO_OBSERVE 2 -//movement intent defines for the m_intent var +// movement intent defines for the m_intent var #define MOVE_INTENT_WALK "walk" #define MOVE_INTENT_RUN "run" -//Blood levels +// Blood levels #define BLOOD_VOLUME_MAX_LETHAL 2150 #define BLOOD_VOLUME_EXCESS 2100 #define BLOOD_VOLUME_MAXIMUM 2000 @@ -22,39 +22,46 @@ #define BLOOD_VOLUME_BAD 224 #define BLOOD_VOLUME_SURVIVE 122 -//Sizes of mobs, used by mob/living/var/mob_size +// Sizes of mobs, used by mob/living/var/mob_size #define MOB_SIZE_TINY 0 #define MOB_SIZE_SMALL 1 #define MOB_SIZE_HUMAN 2 #define MOB_SIZE_LARGE 3 -//Ventcrawling defines +// Ventcrawling defines #define VENTCRAWLER_NONE 0 #define VENTCRAWLER_NUDE 1 #define VENTCRAWLER_ALWAYS 2 -//Bloodcrawling defines +// Bloodcrawling defines #define BLOODCRAWL 1 #define BLOODCRAWL_EAT 2 -//Mob bio-types flags -#define MOB_ORGANIC (1 << 0) +// Mob bio-types flags +#define MOB_ORGANIC (1 << 0) #define MOB_MINERAL (1 << 1) -#define MOB_ROBOTIC (1 << 2) +#define MOB_ROBOTIC (1 << 2) #define MOB_UNDEAD (1 << 3) -#define MOB_HUMANOID (1 << 4) -#define MOB_BUG (1 << 5) +#define MOB_HUMANOID (1 << 4) +#define MOB_BUG (1 << 5) #define MOB_BEAST (1 << 6) -#define MOB_EPIC (1 << 7) //megafauna +#define MOB_EPIC (1 << 7) // Megafauna #define MOB_REPTILE (1 << 8) #define MOB_SPIRIT (1 << 9) +/// Mobs that otherwise support nanites +#define MOB_NANITES (1 << 10) -//Organ defines for carbon mobs +// Organ defines for carbon mobs #define ORGAN_ORGANIC 1 #define ORGAN_ROBOTIC 2 #define BODYPART_ORGANIC 1 #define BODYPART_ROBOTIC 2 +#define BODYPART_HYBRID 3 +#define BODYPART_NANITES 4 + +#define HYBRID_BODYPART_DAMAGE_THRESHHOLD 25 //How much damage has to be suffered until the damage threshhold counts as passed +#define HYBRID_BODYPART_THESHHOLD_MINDAMAGE 10 //Which damage value this limb cannot be healed out of via easy nonsurgical means if the threshhold has been passed, state resets if damage value goes below mindamage. #define BODYPART_NOT_DISABLED 0 #define BODYPART_DISABLED_DAMAGE 1 @@ -66,194 +73,194 @@ #define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' #define MONKEY_BODYPART "monkey" -#define ALIEN_BODYPART "alien" -#define LARVA_BODYPART "larva" -#define DEVIL_BODYPART "devil" +#define ALIEN_BODYPART "alien" +#define LARVA_BODYPART "larva" +#define DEVIL_BODYPART "devil" /*see __DEFINES/inventory.dm for bodypart bitflag defines*/ // Health/damage defines for carbon mobs #define HUMAN_MAX_OXYLOSS 3 #define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30) -#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point -#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point -#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire +#define HEAT_DAMAGE_LEVEL_1 2 // Amount of damage applied when your body temperature just passes the 360.15k safety point +#define HEAT_DAMAGE_LEVEL_2 3 // Amount of damage applied when your body temperature passes the 400K point +#define HEAT_DAMAGE_LEVEL_3 8 // Amount of damage applied when your body temperature passes the 460K point and you are on fire -#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point -#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point -#define COLD_DAMAGE_LEVEL_3 3 //Amount of damage applied when your body temperature passes the 120K point +#define COLD_DAMAGE_LEVEL_1 0.5 // Amount of damage applied when your body temperature just passes the 260.15k safety point +#define COLD_DAMAGE_LEVEL_2 1.5 // Amount of damage applied when your body temperature passes the 200K point +#define COLD_DAMAGE_LEVEL_3 3 // Amount of damage applied when your body temperature passes the 120K point -//Note that gas heat damage is only applied once every FOUR ticks. -#define HEAT_GAS_DAMAGE_LEVEL_1 2 //Amount of damage applied when the current breath's temperature just passes the 360.15k safety point -#define HEAT_GAS_DAMAGE_LEVEL_2 4 //Amount of damage applied when the current breath's temperature passes the 400K point -#define HEAT_GAS_DAMAGE_LEVEL_3 8 //Amount of damage applied when the current breath's temperature passes the 1000K point +// Note that gas heat damage is only applied once every FOUR ticks. +#define HEAT_GAS_DAMAGE_LEVEL_1 2 // Amount of damage applied when the current breath's temperature just passes the 360.15k safety point +#define HEAT_GAS_DAMAGE_LEVEL_2 4 // Amount of damage applied when the current breath's temperature passes the 400K point +#define HEAT_GAS_DAMAGE_LEVEL_3 8 // Amount of damage applied when the current breath's temperature passes the 1000K point -#define COLD_GAS_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when the current breath's temperature just passes the 260.15k safety point -#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point -#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point +#define COLD_GAS_DAMAGE_LEVEL_1 0.5 // Amount of damage applied when the current breath's temperature just passes the 260.15k safety point +#define COLD_GAS_DAMAGE_LEVEL_2 1.5 // Amount of damage applied when the current breath's temperature passes the 200K point +#define COLD_GAS_DAMAGE_LEVEL_3 3 // Amount of damage applied when the current breath's temperature passes the 120K point -//Brain Damage defines -#define BRAIN_DAMAGE_MILD 20 +// Brain Damage defines +#define BRAIN_DAMAGE_MILD 20 #define BRAIN_DAMAGE_SEVERE 100 -#define BRAIN_DAMAGE_DEATH 200 +#define BRAIN_DAMAGE_DEATH 200 #define BRAIN_TRAUMA_MILD /datum/brain_trauma/mild #define BRAIN_TRAUMA_SEVERE /datum/brain_trauma/severe #define BRAIN_TRAUMA_SPECIAL /datum/brain_trauma/special #define BRAIN_TRAUMA_MAGIC /datum/brain_trauma/magic -#define TRAUMA_RESILIENCE_BASIC 1 //Curable with chems -#define TRAUMA_RESILIENCE_SURGERY 2 //Curable with brain surgery -#define TRAUMA_RESILIENCE_LOBOTOMY 3 //Curable with lobotomy -#define TRAUMA_RESILIENCE_WOUND 4 //Curable by healing the head wound -#define TRAUMA_RESILIENCE_MAGIC 5 //Curable only with magic -#define TRAUMA_RESILIENCE_ABSOLUTE 6 //This is here to stay +#define TRAUMA_RESILIENCE_BASIC 1 // Curable with chems +#define TRAUMA_RESILIENCE_SURGERY 2 // Curable with brain surgery +#define TRAUMA_RESILIENCE_LOBOTOMY 3 // Curable with lobotomy +#define TRAUMA_RESILIENCE_WOUND 4 // Curable by healing the head wound +#define TRAUMA_RESILIENCE_MAGIC 5 // Curable only with magic +#define TRAUMA_RESILIENCE_ABSOLUTE 6 // This is here to stay -//Limit of traumas for each resilience tier -#define TRAUMA_LIMIT_BASIC 3 -#define TRAUMA_LIMIT_SURGERY 2 -#define TRAUMA_LIMIT_WOUND 2 +// Limit of traumas for each resilience tier +#define TRAUMA_LIMIT_BASIC 3 +#define TRAUMA_LIMIT_SURGERY 2 +#define TRAUMA_LIMIT_WOUND 2 #define TRAUMA_LIMIT_LOBOTOMY 3 -#define TRAUMA_LIMIT_MAGIC 3 +#define TRAUMA_LIMIT_MAGIC 3 #define TRAUMA_LIMIT_ABSOLUTE INFINITY #define BRAIN_DAMAGE_INTEGRITY_MULTIPLIER 0.5 -//Surgery Defines +// Surgery Defines #define BIOWARE_GENERIC "generic" #define BIOWARE_NERVES "nerves" #define BIOWARE_CIRCULATION "circulation" #define BIOWARE_LIGAMENTS "ligaments" -//Health hud screws for carbon mobs -#define SCREWYHUD_NONE 0 -#define SCREWYHUD_CRIT 1 -#define SCREWYHUD_DEAD 2 +// Health hud screws for carbon mobs +#define SCREWYHUD_NONE 0 +#define SCREWYHUD_CRIT 1 +#define SCREWYHUD_DEAD 2 #define SCREWYHUD_HEALTHY 3 -//Threshold levels for beauty for humans +// Threshold levels for beauty for humans #define BEAUTY_LEVEL_HORRID -66 -#define BEAUTY_LEVEL_BAD -33 -#define BEAUTY_LEVEL_DECENT 33 -#define BEAUTY_LEVEL_GOOD 66 -#define BEAUTY_LEVEL_GREAT 100 +#define BEAUTY_LEVEL_BAD -33 +#define BEAUTY_LEVEL_DECENT 33 +#define BEAUTY_LEVEL_GOOD 66 +#define BEAUTY_LEVEL_GREAT 100 -//Moods levels for humans -#define MOOD_LEVEL_HAPPY4 15 -#define MOOD_LEVEL_HAPPY3 10 -#define MOOD_LEVEL_HAPPY2 6 -#define MOOD_LEVEL_HAPPY1 2 -#define MOOD_LEVEL_NEUTRAL 0 -#define MOOD_LEVEL_SAD1 -3 -#define MOOD_LEVEL_SAD2 -12 -#define MOOD_LEVEL_SAD3 -18 -#define MOOD_LEVEL_SAD4 -25 +// Moods levels for humans +#define MOOD_LEVEL_HAPPY4 15 +#define MOOD_LEVEL_HAPPY3 10 +#define MOOD_LEVEL_HAPPY2 6 +#define MOOD_LEVEL_HAPPY1 2 +#define MOOD_LEVEL_NEUTRAL 0 +#define MOOD_LEVEL_SAD1 -3 +#define MOOD_LEVEL_SAD2 -12 +#define MOOD_LEVEL_SAD3 -18 +#define MOOD_LEVEL_SAD4 -25 -//Sanity levels for humans -#define SANITY_AMAZING 150 -#define SANITY_GREAT 125 -#define SANITY_NEUTRAL 100 +// Sanity levels for humans +#define SANITY_AMAZING 150 +#define SANITY_GREAT 125 +#define SANITY_NEUTRAL 100 #define SANITY_DISTURBED 75 -#define SANITY_UNSTABLE 50 -#define SANITY_CRAZY 25 -#define SANITY_INSANE 0 +#define SANITY_UNSTABLE 50 +#define SANITY_CRAZY 25 +#define SANITY_INSANE 0 -//Nutrition levels for humans -#define NUTRITION_LEVEL_FAT 600 -#define NUTRITION_LEVEL_FULL 550 +// Nutrition levels for humans +#define NUTRITION_LEVEL_FAT 600 +#define NUTRITION_LEVEL_FULL 550 #define NUTRITION_LEVEL_WELL_FED 450 -#define NUTRITION_LEVEL_FED 350 -#define NUTRITION_LEVEL_HUNGRY 250 +#define NUTRITION_LEVEL_FED 350 +#define NUTRITION_LEVEL_HUNGRY 250 #define NUTRITION_LEVEL_STARVING 150 #define NUTRITION_LEVEL_START_MIN 250 #define NUTRITION_LEVEL_START_MAX 400 -//Disgust levels for humans -#define DISGUST_LEVEL_MAXEDOUT 150 -#define DISGUST_LEVEL_DISGUSTED 75 -#define DISGUST_LEVEL_VERYGROSS 50 -#define DISGUST_LEVEL_GROSS 25 +// Disgust levels for humans +#define DISGUST_LEVEL_MAXEDOUT 150 +#define DISGUST_LEVEL_DISGUSTED 75 +#define DISGUST_LEVEL_VERYGROSS 50 +#define DISGUST_LEVEL_GROSS 25 -//Charge levels for Ethereals -#define ETHEREAL_CHARGE_NONE 0 -#define ETHEREAL_CHARGE_LOWPOWER 20 -#define ETHEREAL_CHARGE_NORMAL 50 +// Charge levels for Ethereals +#define ETHEREAL_CHARGE_NONE 0 +#define ETHEREAL_CHARGE_LOWPOWER 20 +#define ETHEREAL_CHARGE_NORMAL 50 #define ETHEREAL_CHARGE_ALMOSTFULL 75 -#define ETHEREAL_CHARGE_FULL 100 -#define ETHEREAL_CHARGE_OVERLOAD 125 +#define ETHEREAL_CHARGE_FULL 100 +#define ETHEREAL_CHARGE_OVERLOAD 125 #define ETHEREAL_CHARGE_DANGEROUS 150 -//Slime evolution threshold. Controls how fast slimes can split/grow +// Slime evolution threshold. Controls how fast slimes can split/grow #define SLIME_EVOLUTION_THRESHOLD 10 -//Slime extract crossing. Controls how many extracts is required to feed to a slime to core-cross. +// Slime extract crossing. Controls how many extracts is required to feed to a slime to core-cross. #define SLIME_EXTRACT_CROSSING_REQUIRED 10 -//Slime commands defines -#define SLIME_FRIENDSHIP_FOLLOW 3 //Min friendship to order it to follow -#define SLIME_FRIENDSHIP_STOPEAT 5 //Min friendship to order it to stop eating someone -#define SLIME_FRIENDSHIP_STOPEAT_NOANGRY 7 //Min friendship to order it to stop eating someone without it losing friendship -#define SLIME_FRIENDSHIP_STOPCHASE 4 //Min friendship to order it to stop chasing someone (their target) -#define SLIME_FRIENDSHIP_STOPCHASE_NOANGRY 6 //Min friendship to order it to stop chasing someone (their target) without it losing friendship -#define SLIME_FRIENDSHIP_STAY 3 //Min friendship to order it to stay -#define SLIME_FRIENDSHIP_ATTACK 8 //Min friendship to order it to attack +// Slime commands defines +#define SLIME_FRIENDSHIP_FOLLOW 3 // Min friendship to order it to follow +#define SLIME_FRIENDSHIP_STOPEAT 5 // Min friendship to order it to stop eating someone +#define SLIME_FRIENDSHIP_STOPEAT_NOANGRY 7 // Min friendship to order it to stop eating someone without it losing friendship +#define SLIME_FRIENDSHIP_STOPCHASE 4 // Min friendship to order it to stop chasing someone (their target) +#define SLIME_FRIENDSHIP_STOPCHASE_NOANGRY 6 // Min friendship to order it to stop chasing someone (their target) without it losing friendship +#define SLIME_FRIENDSHIP_STAY 3 // Min friendship to order it to stay +#define SLIME_FRIENDSHIP_ATTACK 8 // Min friendship to order it to attack -//Sentience types, to prevent things like sentience potions from giving bosses sentience -#define SENTIENCE_ORGANIC 1 +// Sentience types, to prevent things like sentience potions from giving bosses sentience +#define SENTIENCE_ORGANIC 1 #define SENTIENCE_ARTIFICIAL 2 -// #define SENTIENCE_OTHER 3 unused -#define SENTIENCE_MINEBOT 4 -#define SENTIENCE_BOSS 5 +//#define SENTIENCE_OTHER 3 // Unused +#define SENTIENCE_MINEBOT 4 +#define SENTIENCE_BOSS 5 -//Mob AI Status +// Mob AI Status -//Hostile simple animals -//If you add a new status, be sure to add a list for it to the simple_animals global in _globalvars/lists/mobs.dm +// Hostile simple animals +// If you add a new status, be sure to add a list for it to the simple_animals global in _globalvars/lists/mobs.dm #define AI_ON 1 #define AI_IDLE 2 #define AI_OFF 3 #define AI_Z_OFF 4 -//determines if a mob can smash through it -#define ENVIRONMENT_SMASH_NONE 0 -#define ENVIRONMENT_SMASH_STRUCTURES (1<<0) //crates, lockers, ect -#define ENVIRONMENT_SMASH_WALLS (1<<1) //walls -#define ENVIRONMENT_SMASH_RWALLS (1<<2) //rwalls +// determines if a mob can smash through it +#define ENVIRONMENT_SMASH_NONE 0 +#define ENVIRONMENT_SMASH_STRUCTURES (1<<0) // crates, lockers, ect +#define ENVIRONMENT_SMASH_WALLS (1<<1) // walls +#define ENVIRONMENT_SMASH_RWALLS (1<<2) // rwalls -#define NO_SLIP_WHEN_WALKING (1<<0) -#define SLIDE (1<<1) -#define GALOSHES_DONT_HELP (1<<2) -#define FLYING_DOESNT_HELP (1<<3) -#define SLIDE_ICE (1<<4) -#define SLIP_WHEN_CRAWLING (1<<5) //clown planet ruin amongst others -#define SLIP_WHEN_JOGGING (1<<6) //slips prevented by walking are also dodged if the mob is nor sprinting or fatigued... unless this flag is on. +#define NO_SLIP_WHEN_WALKING (1<<0) +#define SLIDE (1<<1) +#define GALOSHES_DONT_HELP (1<<2) +#define FLYING_DOESNT_HELP (1<<3) +#define SLIDE_ICE (1<<4) +#define SLIP_WHEN_CRAWLING (1<<5) // clown planet ruin amongst others +#define SLIP_WHEN_JOGGING (1<<6) // slips prevented by walking are also dodged if the mob is nor sprinting or fatigued... unless this flag is on. #define MAX_CHICKENS 50 -///Flags used by the flags parameter of electrocute act. +// /Flags used by the flags parameter of electrocute act. -///Makes it so that the shock doesn't take gloves into account. -#define SHOCK_NOGLOVES (1 << 0) -///Used when the shock is from a tesla bolt. -#define SHOCK_TESLA (1 << 1) -///Used when an illusion shocks something. Makes the shock deal stamina damage and not trigger certain secondary effects. -#define SHOCK_ILLUSION (1 << 2) -///The shock doesn't stun. -#define SHOCK_NOSTUN (1 << 3) +// /Makes it so that the shock doesn't take gloves into account. +#define SHOCK_NOGLOVES (1 << 0) +// /Used when the shock is from a tesla bolt. +#define SHOCK_TESLA (1 << 1) +// /Used when an illusion shocks something. Makes the shock deal stamina damage and not trigger certain secondary effects. +#define SHOCK_ILLUSION (1 << 2) +// /The shock doesn't stun. +#define SHOCK_NOSTUN (1 << 3) -#define INCORPOREAL_MOVE_BASIC 1 -#define INCORPOREAL_MOVE_SHADOW 2 // leaves a trail of shadows -#define INCORPOREAL_MOVE_JAUNT 3 // is blocked by holy water/salt +#define INCORPOREAL_MOVE_BASIC 1 +#define INCORPOREAL_MOVE_SHADOW 2 // leaves a trail of shadows +#define INCORPOREAL_MOVE_JAUNT 3 // is blocked by holy water/salt -//Secbot and ED209 judgement criteria bitflag values +// Secbot and ED209 judgement criteria bitflag values #define JUDGE_EMAGGED (1<<0) #define JUDGE_IDCHECK (1<<1) #define JUDGE_WEAPONCHECK (1<<2) #define JUDGE_RECORDCHECK (1<<3) -//ED209's ignore monkeys +// ED209's ignore monkeys #define JUDGE_IGNOREMONKEYS (1<<4) #define MEGAFAUNA_DEFAULT_RECOVERY_TIME 5 @@ -262,45 +269,45 @@ // Offsets defines -#define OFFSET_UNIFORM "uniform" -#define OFFSET_ID "id" -#define OFFSET_GLOVES "gloves" -#define OFFSET_GLASSES "glasses" -#define OFFSET_EARS "ears" -#define OFFSET_SHOES "shoes" -#define OFFSET_S_STORE "s_store" -#define OFFSET_FACEMASK "mask" -#define OFFSET_HEAD "head" -#define OFFSET_EYES "eyes" -#define OFFSET_LIPS "lips" -#define OFFSET_BELT "belt" -#define OFFSET_BACK "back" -#define OFFSET_SUIT "suit" -#define OFFSET_NECK "neck" -#define OFFSET_HAIR "hair" -#define OFFSET_FHAIR "fhair" -#define OFFSET_MUTPARTS "mutantparts" +#define OFFSET_UNIFORM "uniform" +#define OFFSET_ID "id" +#define OFFSET_GLOVES "gloves" +#define OFFSET_GLASSES "glasses" +#define OFFSET_EARS "ears" +#define OFFSET_SHOES "shoes" +#define OFFSET_S_STORE "s_store" +#define OFFSET_FACEMASK "mask" +#define OFFSET_HEAD "head" +#define OFFSET_EYES "eyes" +#define OFFSET_LIPS "lips" +#define OFFSET_BELT "belt" +#define OFFSET_BACK "back" +#define OFFSET_SUIT "suit" +#define OFFSET_NECK "neck" +#define OFFSET_HAIR "hair" +#define OFFSET_FHAIR "fhair" +#define OFFSET_MUTPARTS "mutantparts" -//MINOR TWEAKS/MISC -#define AGE_MIN 18 //youngest a character can be //CITADEL EDIT - 17 --> 18 -#define AGE_MAX 85 //oldest a character can be -#define WIZARD_AGE_MIN 30 //youngest a wizard can be -#define APPRENTICE_AGE_MIN 29 //youngest an apprentice can be -#define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up -#define SHOES_SPEED_SLIGHT SHOES_SLOWDOWN - 1 // slightest speed boost to movement -#define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets -#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you +// MINOR TWEAKS/MISC +#define AGE_MIN 18 // youngest a character can be // CITADEL EDIT - 17 --> 18 +#define AGE_MAX 85 // oldest a character can be +#define WIZARD_AGE_MIN 30 // youngest a wizard can be +#define APPRENTICE_AGE_MIN 29 // youngest an apprentice can be +#define SHOES_SLOWDOWN 0 // How much shoes slow you down by default. Negative values speed you up +#define SHOES_SPEED_SLIGHT SHOES_SLOWDOWN - 1 // slightest speed boost to movement +#define POCKET_STRIP_DELAY 40 // time taken (in deciseconds) to search somebody's pockets +#define DOOR_CRUSH_DAMAGE 15 // the amount of damage that airlocks deal when they crush you -#define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases -#define ETHEREAL_CHARGE_FACTOR 0.08 //factor at which ethereal's charge decreases -#define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default. +#define HUNGER_FACTOR 0.1 // factor at which mob nutrition decreases +#define ETHEREAL_CHARGE_FACTOR 0.08 // factor at which ethereal's charge decreases +#define REAGENTS_METABOLISM 0.4 // How many units of reagent are consumed per tick, by default. #define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism // Roundstart trait system -#define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart +#define MAX_QUIRKS 6 // The maximum amount of quirks one character can have at roundstart -#define MAX_REVIVE_FIRE_DAMAGE 180 +#define MAX_REVIVE_FIRE_DAMAGE 180 #define MAX_REVIVE_BRUTE_DAMAGE 180 // AI Toggles @@ -308,28 +315,28 @@ #define AI_VOX // Comment out if you don't want VOX to be enabled and have players download the voice sounds. // /obj/item/bodypart on_mob_life() retval flag -#define BODYPART_LIFE_UPDATE_HEALTH (1<<0) +#define BODYPART_LIFE_UPDATE_HEALTH (1<<0) #define HUMAN_FIRE_STACK_ICON_NUM 3 #define TYPING_INDICATOR_TIMEOUT 20 MINUTES -#define GRAB_PIXEL_SHIFT_PASSIVE 6 -#define GRAB_PIXEL_SHIFT_AGGRESSIVE 12 -#define GRAB_PIXEL_SHIFT_NECK 16 +#define GRAB_PIXEL_SHIFT_PASSIVE 6 +#define GRAB_PIXEL_SHIFT_AGGRESSIVE 12 +#define GRAB_PIXEL_SHIFT_NECK 16 #define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return; #define INTERACTING_WITH(X, Y) (Y in X.do_afters) -/// Field of vision defines. +// / Field of vision defines. #define FOV_90_DEGREES 90 #define FOV_180_DEGREES 180 #define FOV_270_DEGREES 270 -/// How far away you can be to make eye contact with someone while examining +// / How far away you can be to make eye contact with someone while examining #define EYE_CONTACT_RANGE 5 -/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine() +// / If you examine the same atom twice in this timeframe, we call examine_more() instead of examine() #define EXAMINE_MORE_TIME 1 SECONDS -#define SILENCE_RANGED_MESSAGE (1<<0) +#define SILENCE_RANGED_MESSAGE (1<<0) diff --git a/code/__DEFINES/mobs/innate_abilities.dm b/code/__DEFINES/mobs/innate_abilities.dm new file mode 100644 index 0000000000..d2d3dbbc67 --- /dev/null +++ b/code/__DEFINES/mobs/innate_abilities.dm @@ -0,0 +1,29 @@ +// helpers + +// sources +/// Species +#define ABILITY_SOURCE_SPECIES "species" +/// Changeling +#define ABILITY_SOURCE_CHANGELING "changeling" + +// abilities +/// Full customization and transformation of mutantparts/hair/sprite accessories/etc - excludes name by default +#define INNATE_ABILITY_HUMANOID_CUSTOMIZATION "humanoid_customization" +/// Slime blobform +#define INNATE_ABILITY_SLIME_BLOBFORM "slime_blobform" +/// limb regrowth +#define INNATE_ABILITY_LIMB_REGROWTH "limb_regrowth" + +/// ability properties +// customization/body change +/// is this silent? +#define PROPERTY_CUSTOMIZATION_SILENT "silent" +// blobform +/// Blobform color +#define PROPERTY_BLOBFORM_COLOR "color" +// limb regrwoth +/// limb regrowth usage type +#define PROPERTY_LIMB_REGROWTH_USAGE_TYPE "cost" + /// blood + #define REGROWTH_USES_BLOOD "blood" + diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm new file mode 100644 index 0000000000..5bf7de8647 --- /dev/null +++ b/code/__DEFINES/movement.dm @@ -0,0 +1,26 @@ +/// The minimum for glide_size to be clamped to. +#define MIN_GLIDE_SIZE 1 +/// The maximum for glide_size to be clamped to. +/// This shouldn't be higher than the icon size, and generally you shouldn't be changing this, but it's here just in case. +#define MAX_GLIDE_SIZE 32 + +/// Compensating for time dialation +GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) + +///Broken down, here's what this does: +/// divides the world icon_size (32) by delay divided by ticklag to get the number of pixels something should be moving each tick. +/// The division result is given a min value of 1 to prevent obscenely slow glide sizes from being set +/// Then that's multiplied by the global glide size multiplier. 1.25 by default feels pretty close to spot on. This is just to try to get byond to behave. +/// The whole result is then clamped to within the range above. +/// Not very readable but it works +#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((32 / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) + +/// Enables smooth movement +// #define SMOOTH_MOVEMENT + +/// Set appearance flags in vars +#ifdef SMOOTH_MOVEMENT + #define SET_APPEARANCE_FLAGS(_flags) appearance_flags = (_flags | LONG_GLIDE) +#else + #define SET_APPEARANCE_FLAGS(_flags) appearance_flags = _flags +#endif diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 84eed5483a..cd13510366 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -40,6 +40,16 @@ #define PARALLAX_LOW 2 #define PARALLAX_DISABLE 3 //this option must be the highest number +#define PIXEL_SCALING_AUTO 0 +#define PIXEL_SCALING_1X 1 +#define PIXEL_SCALING_1_2X 1.5 +#define PIXEL_SCALING_2X 2 +#define PIXEL_SCALING_3X 3 + +#define SCALING_METHOD_NORMAL "normal" +#define SCALING_METHOD_DISTORT "distort" +#define SCALING_METHOD_BLUR "blur" + #define PARALLAX_DELAY_DEFAULT world.tick_lag #define PARALLAX_DELAY_MED 1 #define PARALLAX_DELAY_LOW 2 @@ -68,7 +78,9 @@ #define EXP_TYPE_ADMIN "Admin" //Flags in the players table in the db -#define DB_FLAG_EXEMPT 1 +#define DB_FLAG_EXEMPT (1<<0) +#define DB_FLAG_AGE_CONFIRMATION_INCOMPLETE (1<<1) +#define DB_FLAG_AGE_CONFIRMATION_COMPLETE (1<<2) #define DEFAULT_CYBORG_NAME "Default Cyborg Name" diff --git a/code/__DEFINES/radiation.dm b/code/__DEFINES/radiation.dm index ece997a7fc..01612f2c05 100644 --- a/code/__DEFINES/radiation.dm +++ b/code/__DEFINES/radiation.dm @@ -18,6 +18,8 @@ Ask ninjanomnom if they're around #define RAD_BURN_THRESHOLD 1000 // Applied radiation must be over this to burn #define RAD_MOB_SAFE 500 // How much stored radiation in a mob with no ill effects +#define RAD_DEFAULT_ROBOT_SAFE 250 // Like above, except for robotic carbons. Far more susceptible to corruption from radiation. +#define RAD_UPGRADED_ROBOT_SAFE 750 // If the robot has been upgraded via an implant, their radiation threshold is raised to be somewhat above that of organics. #define RAD_MOB_HAIRLOSS 800 // How much stored radiation to check for hair loss diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index a0fded3798..dda9cfd430 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -69,8 +69,8 @@ //Checks to determine borg availability depending on the server's config. These are defines in the interest of reducing copypasta #define BORG_SEC_AVAILABLE (!CONFIG_GET(flag/disable_secborg) && GLOB.security_level >= CONFIG_GET(number/minimum_secborg_alert)) -//silicon_priviledges flags -#define PRIVILEDGES_SILICON (1<<0) -#define PRIVILEDGES_PAI (1<<1) -#define PRIVILEDGES_BOT (1<<2) -#define PRIVILEDGES_DRONE (1<<3) +//silicon_privileges flags +#define PRIVILEGES_SILICON (1<<0) +#define PRIVILEGES_PAI (1<<1) +#define PRIVILEGES_BOT (1<<2) +#define PRIVILEGES_DRONE (1<<3) diff --git a/code/__DEFINES/rockpaperscissors.dm b/code/__DEFINES/rockpaperscissors.dm index 77ba81938d..fa185063b4 100644 --- a/code/__DEFINES/rockpaperscissors.dm +++ b/code/__DEFINES/rockpaperscissors.dm @@ -4,4 +4,4 @@ #define ROCKPAPERSCISSORS_LOSE "lose" #define ROCKPAPERSCISSORS_WIN "win" #define ROCKPAPERSCISSORS_TIE "tie" -#define ROCKPAPERSCISSORS_NOT_DECIDED "not_decided" \ No newline at end of file +#define ROCKPAPERSCISSORS_NOT_DECIDED "not_decided" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index d7487eb54b..605b3f6485 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -40,6 +40,7 @@ //#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now #define ROLE_GHOSTCAFE "ghostcafe" #define ROLE_MINOR_ANTAG "minorantag" +#define ROLE_RESPAWN "respawnsystem" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough //(in game days played) to play that role diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index 20e7975ec4..988acd3dae 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -1,19 +1,76 @@ // rust_g.dm - DM API for rust_g extension library -#define RUST_G "rust_g" +// +// To configure, create a `rust_g.config.dm` and set what you care about from +// the following options: +// +// #define RUST_G "path/to/rust_g" +// Override the .dll/.so detection logic with a fixed path or with detection +// logic of your own. +// +// #define RUSTG_OVERRIDE_BUILTINS +// Enable replacement rust-g functions for certain builtins. Off by default. -#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" -#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" -#define RUSTG_JOB_ERROR "JOB PANICKED" +#ifndef RUST_G +// Default automatic RUST_G detection. +// On Windows, looks in the standard places for `rust_g.dll`. +// On Linux, looks in `.`, `$LD_LIBRARY_PATH`, and `~/.byond/bin` for either of +// `librust_g.so` (preferred) or `rust_g` (old). + +/* This comment bypasses grep checks */ /var/__rust_g + +/proc/__detect_rust_g() + if (world.system_type == UNIX) + if (fexists("./librust_g.so")) + // No need for LD_LIBRARY_PATH badness. + return __rust_g = "./librust_g.so" + else if (fexists("./rust_g")) + // Old dumb filename. + return __rust_g = "./rust_g" + else if (fexists("[world.GetConfig("env", "HOME")]/.byond/bin/rust_g")) + // Old dumb filename in `~/.byond/bin`. + return __rust_g = "rust_g" + else + // It's not in the current directory, so try others + return __rust_g = "librust_g.so" + else + return __rust_g = "rust_g" + +#define RUST_G (__rust_g || __detect_rust_g()) +#endif + +/** + * This proc generates a cellular automata noise grid which can be used in procedural generation methods. + * + * Returns a single string that goes row by row, with values of 1 representing an alive cell, and a value of 0 representing a dead cell. + * + * Arguments: + * * percentage: The chance of a turf starting closed + * * smoothing_iterations: The amount of iterations the cellular automata simulates before returning the results + * * birth_limit: If the number of neighboring cells is higher than this amount, a cell is born + * * death_limit: If the number of neighboring cells is lower than this amount, a cell dies + * * width: The width of the grid. + * * height: The height of the grid. + */ +#define rustg_cnoise_generate(percentage, smoothing_iterations, birth_limit, death_limit, width, height) \ + call(RUST_G, "cnoise_generate")(percentage, smoothing_iterations, birth_limit, death_limit, width, height) #define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname) #define rustg_dmi_create_png(path, width, height, data) call(RUST_G, "dmi_create_png")(path, width, height, data) +#define rustg_dmi_resize_png(path, width, height, resizetype) call(RUST_G, "dmi_resize_png")(path, width, height, resizetype) + +#define rustg_file_read(fname) call(RUST_G, "file_read")(fname) +#define rustg_file_exists(fname) call(RUST_G, "file_exists")(fname) +#define rustg_file_write(text, fname) call(RUST_G, "file_write")(text, fname) +#define rustg_file_append(text, fname) call(RUST_G, "file_append")(text, fname) + +#ifdef RUSTG_OVERRIDE_BUILTINS + #define file2text(fname) rustg_file_read("[fname]") + #define text2file(text, fname) rustg_file_append(text, "[fname]") +#endif #define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev) #define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev) -#define rustg_log_write(fname, text, format) call(RUST_G, "log_write")(fname, text, format) -/proc/rustg_log_close_all() return call(RUST_G, "log_close_all")() - #define RUSTG_HTTP_METHOD_GET "get" #define RUSTG_HTTP_METHOD_PUT "put" #define RUSTG_HTTP_METHOD_DELETE "delete" @@ -23,3 +80,22 @@ #define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers) #define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers) #define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id) + +#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" +#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" +#define RUSTG_JOB_ERROR "JOB PANICKED" + +#define rustg_json_is_valid(text) (call(RUST_G, "json_is_valid")(text) == "true") + +#define rustg_log_write(fname, text, format) call(RUST_G, "log_write")(fname, text, format) +/proc/rustg_log_close_all() return call(RUST_G, "log_close_all")() + +#define rustg_noise_get_at_coordinates(seed, x, y) call(RUST_G, "noise_get_at_coordinates")(seed, x, y) + +#define rustg_sql_connect_pool(options) call(RUST_G, "sql_connect_pool")(options) +#define rustg_sql_query_async(handle, query, params) call(RUST_G, "sql_query_async")(handle, query, params) +#define rustg_sql_query_blocking(handle, query, params) call(RUST_G, "sql_query_blocking")(handle, query, params) +#define rustg_sql_connected(handle) call(RUST_G, "sql_connected")(handle) +#define rustg_sql_disconnect_pool(handle) call(RUST_G, "sql_disconnect_pool")(handle) +#define rustg_sql_check_query(job_id) call(RUST_G, "sql_check_query")("[job_id]") + diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 5775e128f8..57484ae85b 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -76,8 +76,14 @@ #define LINGHIVE_LINK 3 //whether the emote is visible or audible. +// Requires sight #define EMOTE_VISIBLE 1 +// Requires hearing #define EMOTE_AUDIBLE 2 +// Requires sight or hearing +#define EMOTE_BOTH 3 +// Always able to be seen +#define EMOTE_OMNI 4 //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam #define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen? @@ -89,4 +95,4 @@ // Audio/Visual Flags. Used to determine what sense are required to notice a message. #define MSG_VISUAL (1<<0) -#define MSG_AUDIBLE (1<<1) \ No newline at end of file +#define MSG_AUDIBLE (1<<1) diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 80983b34be..a188bf8363 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -31,6 +31,11 @@ #define EARLY_LAUNCHED 2 #define ENDGAME_TRANSIT 3 +//positive value = cannot puchase +#define SHUTTLEPURCHASE_PURCHASABLE 0 //station can buy a shuttle +#define SHUTTLEPURCHASE_PURCHASED 1 //station has already bought a shuttle, so cannot +#define SHUTTLEPURCHASE_FORCED 2 //station was given a new shuttle through events or other shenanigans + // Ripples, effects that signal a shuttle's arrival #define SHUTTLE_RIPPLE_TIME 100 diff --git a/code/__DEFINES/skills/defines.dm b/code/__DEFINES/skills/defines.dm index 47aaeeb1dc..a0b34895df 100644 --- a/code/__DEFINES/skills/defines.dm +++ b/code/__DEFINES/skills/defines.dm @@ -40,7 +40,6 @@ #define SKILL_TRAIN_ATTACK_OBJ "train_attack_obj" #define SKILL_STAMINA_COST "stamina_cost" //Influences the stamina cost from weapon usage. #define SKILL_THROW_STAM_COST "throw_stam_cost" -#define SKILL_COMBAT_MODE "combat_mode" //The user must have combat mode on. #define SKILL_SANITY "sanity" //Is the skill affected by (in)sanity. #define SKILL_INTELLIGENCE "intelligence" //Is the skill affected by brain damage? diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 73781154c5..1098a07b39 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -3,6 +3,7 @@ #define CHANNEL_ADMIN 1023 #define CHANNEL_VOX 1022 #define CHANNEL_JUKEBOX 1021 + #define CHANNEL_JUKEBOX_START 1016 //The gap between this and CHANNEL_JUKEBOX determines the amount of free jukebox channels. This currently allows 6 jukebox channels to exist. #define CHANNEL_JUSTICAR_ARK 1015 #define CHANNEL_HEARTBEAT 1014 //sound channel for heartbeats @@ -15,6 +16,17 @@ #define CHANNEL_DIGEST 1009 #define CHANNEL_PREYLOOP 1008 +///Default range of a sound. +#define SOUND_RANGE 17 +///default extra range for sounds considered to be quieter +#define SHORT_RANGE_SOUND_EXTRARANGE -9 +///The range deducted from sound range for things that are considered silent / sneaky +#define SILENCED_SOUND_EXTRARANGE -11 +///Percentage of sound's range where no falloff is applied +#define SOUND_DEFAULT_FALLOFF_DISTANCE 1 //For a normal sound this would be 1 tile of no falloff +///The default exponent of sound falloff +#define SOUND_FALLOFF_EXPONENT 6 + //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED @@ -23,6 +35,7 @@ #define MAX_INSTRUMENT_CHANNELS (128 * 6) #define SOUND_MINIMUM_PRESSURE 10 +/// remove #define FALLOFF_SOUNDS 1 @@ -53,7 +66,8 @@ #define MINING list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\ 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\ 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\ - 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg', 'sound/ambience/ambilava.ogg') + 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg',\ + 'sound/ambience/ambilava.ogg') #define MEDICAL list('sound/ambience/ambinice.ogg') @@ -80,3 +94,55 @@ 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + + +#define INTERACTION_SOUND_RANGE_MODIFIER -3 +#define EQUIP_SOUND_VOLUME 30 +#define PICKUP_SOUND_VOLUME 15 +#define DROP_SOUND_VOLUME 20 +#define YEET_SOUND_VOLUME 90 + + +//default byond sound environments +#define SOUND_ENVIRONMENT_NONE -1 +#define SOUND_ENVIRONMENT_GENERIC 0 +#define SOUND_ENVIRONMENT_PADDED_CELL 1 +#define SOUND_ENVIRONMENT_ROOM 2 +#define SOUND_ENVIRONMENT_BATHROOM 3 +#define SOUND_ENVIRONMENT_LIVINGROOM 4 +#define SOUND_ENVIRONMENT_STONEROOM 5 +#define SOUND_ENVIRONMENT_AUDITORIUM 6 +#define SOUND_ENVIRONMENT_CONCERT_HALL 7 +#define SOUND_ENVIRONMENT_CAVE 8 +#define SOUND_ENVIRONMENT_ARENA 9 +#define SOUND_ENVIRONMENT_HANGAR 10 +#define SOUND_ENVIRONMENT_CARPETED_HALLWAY 11 +#define SOUND_ENVIRONMENT_HALLWAY 12 +#define SOUND_ENVIRONMENT_STONE_CORRIDOR 13 +#define SOUND_ENVIRONMENT_ALLEY 14 +#define SOUND_ENVIRONMENT_FOREST 15 +#define SOUND_ENVIRONMENT_CITY 16 +#define SOUND_ENVIRONMENT_MOUNTAINS 17 +#define SOUND_ENVIRONMENT_QUARRY 18 +#define SOUND_ENVIRONMENT_PLAIN 19 +#define SOUND_ENVIRONMENT_PARKING_LOT 20 +#define SOUND_ENVIRONMENT_SEWER_PIPE 21 +#define SOUND_ENVIRONMENT_UNDERWATER 22 +#define SOUND_ENVIRONMENT_DRUGGED 23 +#define SOUND_ENVIRONMENT_DIZZY 24 +#define SOUND_ENVIRONMENT_PSYCHOTIC 25 +//If we ever make custom ones add them here + +//"sound areas": easy way of keeping different types of areas consistent. +#define SOUND_AREA_STANDARD_STATION SOUND_ENVIRONMENT_PARKING_LOT +#define SOUND_AREA_LARGE_ENCLOSED SOUND_ENVIRONMENT_QUARRY +#define SOUND_AREA_SMALL_ENCLOSED SOUND_ENVIRONMENT_BATHROOM +#define SOUND_AREA_TUNNEL_ENCLOSED SOUND_ENVIRONMENT_STONEROOM +#define SOUND_AREA_LARGE_SOFTFLOOR SOUND_ENVIRONMENT_CARPETED_HALLWAY +#define SOUND_AREA_MEDIUM_SOFTFLOOR SOUND_ENVIRONMENT_LIVINGROOM +#define SOUND_AREA_SMALL_SOFTFLOOR SOUND_ENVIRONMENT_ROOM +#define SOUND_AREA_ASTEROID SOUND_ENVIRONMENT_CAVE +#define SOUND_AREA_SPACE SOUND_ENVIRONMENT_UNDERWATER +#define SOUND_AREA_LAVALAND SOUND_ENVIRONMENT_MOUNTAINS +#define SOUND_AREA_ICEMOON SOUND_ENVIRONMENT_CAVE +#define SOUND_AREA_WOODFLOOR SOUND_ENVIRONMENT_CITY diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index e21f3dc1c1..087fa5e6e6 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -29,5 +29,5 @@ #endif /world/proc/enable_debugger() - if (fexists(EXTOOLS)) - call(EXTOOLS, "debug_initialize")() + if (fexists(EXTOOLS)) + call(EXTOOLS, "debug_initialize")() diff --git a/code/__DEFINES/species.dm b/code/__DEFINES/species.dm new file mode 100644 index 0000000000..74ca459fa1 --- /dev/null +++ b/code/__DEFINES/species.dm @@ -0,0 +1,55 @@ + +// Species ID Defines --------------------------- + +#define SPECIES_ABDUCTOR "abductor" +#define SPECIES_ANDROID "android" +#define SPECIES_ANGEL "angel" +#define SPECIES_MAMMAL "mammal" + #define SPECIES_MAMMAL_SYNTHETIC "mammal_synthetic" +#define SPECIES_ARACHNID "arachnid" +#define SPECIES_INSECT "insect" +#define SPECIES_DULLAHAN "dullahan" +#define SPECIES_DWARF "dwarf" +#define SPECIES_ETHEREAL "ethereal" +#define SPECIES_FELINID "felinid" +#define SPECIES_FLY "fly" +#define SPECIES_GOLEM "golem" +#define SPECIES_HUMAN "human" +#define SPECIES_IPC "ipc" +#define SPECIES_JELLY "jelly" + #define SPECIES_SLIME "slime" + #define SPECIES_SLIME_HYBRID "slimeperson" + #define SPECIES_SLIME_LUMI "slimelumi" + #define SPECIES_STARGAZER "stargazer" +#define SPECIES_LIZARD "lizard" + #define SPECIES_ASHWALKER "ashlizard" +#define SPECIES_MUSHROOM "mush" +#define SPECIES_PLASMAMAN "plasmaman" +#define SPECIES_POD "pod" + #define SPECIES_POD_WEAK "podweak" +#define SPECIES_SHADOW "shadow" + #define SPECIES_NIGHTMARE "nightmare" +#define SPECIES_SKELETON "skeleton" + #define SPECIES_SKELETON_SPACE "spaceskeleton" +#define SPECIES_SYNTH_LIZARD "synthliz" +#define SPECIES_SYNTH "synth" + #define SPECIES_SYNTH_MIL "military_synth" +#define SPECIES_VAMPIRE "vampire" + #define SPECIES_VAMPIRE_WEAK "vampire_roundstart" +#define SPECIES_XENOHYBRID "xeno" +#define SPECIES_ZOMBIE "zombie" + +// Species Category Defines --------------------- + +#define SPECIES_CATEGORY_ALIEN "alien" +#define SPECIES_CATEGORY_BASIC "human" +#define SPECIES_CATEGORY_FURRY "furry" // Weird Category, but okay. +#define SPECIES_CATEGORY_GOLEM "golem" +#define SPECIES_CATEGORY_INSECT "insect" +#define SPECIES_CATEGORY_PLANT "plant" +#define SPECIES_CATEGORY_ROBOT "robotic" +#define SPECIES_CATEGORY_JELLY "jelly" +#define SPECIES_CATEGORY_LIZARD "lizard" +#define SPECIES_CATEGORY_SHADOW "shadow" +#define SPECIES_CATEGORY_SKELETON "skeleton" +#define SPECIES_CATEGORY_UNDEAD "undead" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index d6db35e68d..e2ace84156 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -40,6 +40,9 @@ #define STATUS_EFFECT_DETERMINED /datum/status_effect/determined //currently in a combat high from being seriously wounded +#define STATUS_EFFECT_MANTRA /datum/status_effect/mantra // a toggled self buff that makes you stronger and more resilient, but drains stamina over time +#define STATUS_EFFECT_ASURA /datum/status_effect/asura // like a weaker version of mantra, drains HP instead of stamina and has no armor + ///////////// // DEBUFFS // ///////////// @@ -102,10 +105,6 @@ #define STATUS_EFFECT_FAKE_VIRUS /datum/status_effect/fake_virus //gives you fluff messages for cough, sneeze, headache, etc but without an actual virus -#define STATUS_EFFECT_BREASTS_ENLARGEMENT /datum/status_effect/chem/breast_enlarger //Applied slowdown due to the ominous bulk. - -#define STATUS_EFFECT_PENIS_ENLARGEMENT /datum/status_effect/chem/penis_enlarger //More applied slowdown, just like the above. - #define STATUS_EFFECT_NO_COMBAT_MODE /datum/status_effect/no_combat_mode //Wont allow combat mode and will disable it #define STATUS_EFFECT_MESMERIZE /datum/status_effect/mesmerize //Just reskinned no_combat_mode diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 9deddd4b46..e84f6eb50b 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -1,40 +1,90 @@ -//Update this whenever the db schema changes -//make sure you add an update to the schema_version stable in the db changelog +//! Defines for subsystems and overlays +//! +//! Lots of important stuff in here, make sure you have your brain switched on +//! when editing this file + +//! ## DB defines +/** + * DB major schema version + * + * Update this whenever the db schema changes + * + * make sure you add an update to the schema_version stable in the db changelog + */ #define DB_MAJOR_VERSION 4 + +/** + * DB minor schema version + * + * Update this whenever the db schema changes + * + * make sure you add an update to the schema_version stable in the db changelog + */ #define DB_MINOR_VERSION 7 -//Timing subsystem -//Don't run if there is an identical unique timer active -//if the arguments to addtimer are the same as an existing timer, it doesn't create a new timer, and returns the id of the existing timer +//! ## Timing subsystem +/** + * Don't run if there is an identical unique timer active + * + * if the arguments to addtimer are the same as an existing timer, it doesn't create a new timer, + * and returns the id of the existing timer + */ #define TIMER_UNIQUE (1<<0) -//For unique timers: Replace the old timer rather then not start this one + +///For unique timers: Replace the old timer rather then not start this one #define TIMER_OVERRIDE (1<<1) -//Timing should be based on how timing progresses on clients, not the sever. -// tracking this is more expensive, -// should only be used in conjuction with things that have to progress client side, such as animate() or sound() + +/** + * Timing should be based on how timing progresses on clients, not the server. + * + * Tracking this is more expensive, + * should only be used in conjuction with things that have to progress client side, such as + * animate() or sound() + */ #define TIMER_CLIENT_TIME (1<<2) -//Timer can be stopped using deltimer() + +///Timer can be stopped using deltimer() #define TIMER_STOPPABLE (1<<3) -//To be used with TIMER_UNIQUE -//prevents distinguishing identical timers with the wait variable + +///prevents distinguishing identical timers with the wait variable +/// +///To be used with TIMER_UNIQUE #define TIMER_NO_HASH_WAIT (1<<4) -//Loops the timer repeatedly until qdeleted -//In most cases you want a subsystem instead + +///Loops the timer repeatedly until qdeleted +/// +///In most cases you want a subsystem instead, so don't use this unless you have a good reason #define TIMER_LOOP (1<<5) -#define TIMER_NO_INVOKE_WARNING 600 //number of byond ticks that are allowed to pass before the timer subsystem thinks it hung on something - +///Empty ID define #define TIMER_ID_NULL -1 -#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize -#define INITIALIZATION_INNEW_MAPLOAD 2 //New should call Initialize(TRUE) -#define INITIALIZATION_INNEW_REGULAR 1 //New should call Initialize(FALSE) +//! ## Initialization subsystem -#define INITIALIZE_HINT_NORMAL 0 //Nothing happens -#define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize -#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom +///New should not call Initialize +#define INITIALIZATION_INSSATOMS 0 +///New should call Initialize(TRUE) +#define INITIALIZATION_INNEW_MAPLOAD 2 +///New should call Initialize(FALSE) +#define INITIALIZATION_INNEW_REGULAR 1 -//type and all subtypes should always call Initialize in New() +//! ### Initialization hints + +///Nothing happens +#define INITIALIZE_HINT_NORMAL 0 +/** + * call LateInitialize at the end of all atom Initalization + * + * The item will be added to the late_loaders list, this is iterated over after + * initalization of subsystems is complete and calls LateInitalize on the atom + * see [this file for the LateIntialize proc](atom.html#proc/LateInitialize) + */ +#define INITIALIZE_HINT_LATELOAD 1 + +///Call qdel on the atom after intialization +#define INITIALIZE_HINT_QDEL 2 + +///type and all subtypes should always immediately call Initialize in New() #define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ ..();\ if(!(flags_1 & INITIALIZED_1)) {\ @@ -47,35 +97,40 @@ // Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. -#define INIT_ORDER_PROFILER 100 -#define INIT_ORDER_FAIL2TOPIC 99 -#define INIT_ORDER_TITLE 98 -#define INIT_ORDER_GARBAGE 95 -#define INIT_ORDER_DBCORE 94 -#define INIT_ORDER_STATPANELS 93 -#define INIT_ORDER_BLACKBOX 92 -#define INIT_ORDER_SERVER_MAINT 91 -#define INIT_ORDER_INPUT 90 -#define INIT_ORDER_SOUNDS 85 +#define INIT_ORDER_PROFILER 102 +#define INIT_ORDER_FAIL2TOPIC 101 +#define INIT_ORDER_TITLE 100 +#define INIT_ORDER_GARBAGE 99 +#define INIT_ORDER_DBCORE 95 +#define INIT_ORDER_BLACKBOX 94 +#define INIT_ORDER_SERVER_MAINT 93 +#define INIT_ORDER_INPUT 85 +#define INIT_ORDER_SOUNDS 83 +#define INIT_ORDER_INSTRUMENTS 82 #define INIT_ORDER_VIS 80 +// #define INIT_ORDER_ACHIEVEMENTS 77 #define INIT_ORDER_RESEARCH 75 #define INIT_ORDER_EVENTS 70 #define INIT_ORDER_JOBS 65 #define INIT_ORDER_QUIRKS 60 #define INIT_ORDER_TICKER 55 -#define INIT_ORDER_INSTRUMENTS 53 +// #define INIT_ORDER_TCG 55 #define INIT_ORDER_MAPPING 50 -#define INIT_ORDER_ECONOMY 45 -#define INIT_ORDER_NETWORKS 40 +#define INIT_ORDER_TIMETRACK 47 +#define INIT_ORDER_NETWORKS 45 +#define INIT_ORDER_ECONOMY 40 #define INIT_ORDER_HOLODECK 35 +// #define INIT_ORDER_OUTPUTS 35 #define INIT_ORDER_ATOMS 30 #define INIT_ORDER_LANGUAGE 25 #define INIT_ORDER_MACHINES 20 #define INIT_ORDER_CIRCUIT 15 +// #define INIT_ORDER_SKILLS 15 #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_AIR -1 #define INIT_ORDER_AIR_TURFS -2 +#define INIT_ORDER_PERSISTENCE -2 //before assets because some assets take data from SSPersistence #define INIT_ORDER_MINIMAP -3 #define INIT_ORDER_ASSETS -4 #define INIT_ORDER_ICON_SMOOTHING -5 @@ -86,7 +141,9 @@ #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_MINOR_MAPPING -40 #define INIT_ORDER_PATH -50 -#define INIT_ORDER_PERSISTENCE -95 +// #define INIT_ORDER_DISCORD -60 +// #define INIT_ORDER_EXPLOSIONS -69 +#define INIT_ORDER_STATPANELS -98 #define INIT_ORDER_DEMO -99 // o avoid a bunch of changes related to initialization being written, do this last #define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. @@ -102,6 +159,7 @@ #define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_WET_FLOORS 20 #define FIRE_PRIORITY_AIR 20 +#define FIRE_PRIORITY_NPC 20 #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_SPACEDRIFT 30 @@ -116,7 +174,6 @@ #define FIRE_PRIORITY_AIR_TURFS 40 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 -#define FIRE_PRIORITY_NPC 80 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_PROJECTILES 200 @@ -124,7 +181,10 @@ #define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #define FIRE_PRIORITY_STATPANEL 390 #define FIRE_PRIORITY_CHAT 400 +#define FIRE_PRIORITY_RUNECHAT 410 #define FIRE_PRIORITY_OVERLAYS 500 +// #define FIRE_PRIORITY_EXPLOSIONS 666 +#define FIRE_PRIORITY_TIMER 700 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. // SS runlevels @@ -137,6 +197,37 @@ #define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) + + +//! ## Overlays subsystem + +///Compile all the overlays for an atom from the cache lists +// |= on overlays is not actually guaranteed to not add same appearances but we're optimistically using it anyway. +#define COMPILE_OVERLAYS(A)\ + do {\ + var/list/ad = A.add_overlays;\ + var/list/rm = A.remove_overlays;\ + if(LAZYLEN(rm)){\ + A.overlays -= rm;\ + rm.Cut();\ + }\ + if(LAZYLEN(ad)){\ + A.overlays |= ad;\ + ad.Cut();\ + }\ + A.flags_1 &= ~OVERLAY_QUEUED_1;\ + } while(FALSE) + + +/** + Create a new timer and add it to the queue. + * Arguments: + * * callback the callback to call on timer finish + * * wait deciseconds to run the timer for + * * flags flags for this timer, see: code\__DEFINES\subsystems.dm +*/ +#define addtimer(args...) _addtimer(args, file = __FILE__, line = __LINE__) + // SSair run section #define SSAIR_PIPENETS 1 #define SSAIR_ATMOSMACHINERY 2 @@ -147,19 +238,3 @@ #define SSAIR_REBUILD_PIPENETS 7 #define SSAIR_EQUALIZE 8 #define SSAIR_ACTIVETURFS 9 - -// |= on overlays is not actually guaranteed to not add same appearances but we're optimistically using it anyway. -#define COMPILE_OVERLAYS(A)\ - if (TRUE) {\ - var/list/ad = A.add_overlays;\ - var/list/rm = A.remove_overlays;\ - if(LAZYLEN(rm)){\ - A.overlays -= rm;\ - A.remove_overlays = null;\ - }\ - if(LAZYLEN(ad)){\ - A.overlays |= ad;\ - A.add_overlays = null;\ - }\ - A.flags_1 &= ~OVERLAY_QUEUED_1;\ - } diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 7c0811ec59..3225f14d8c 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "5.2.1" +#define TGS_DMAPI_VERSION "5.2.10" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -67,7 +67,7 @@ #define TGS_EVENT_REPO_CHECKOUT 1 /// When the repository performs a fetch operation. No parameters #define TGS_EVENT_REPO_FETCH 2 -/// When the repository merges a pull request. Parameters: PR Number, PR Sha, (Nullable) Comment made by TGS user +/// When the repository test merges. Parameters: PR Number, PR Sha, (Nullable) Comment made by TGS user #define TGS_EVENT_REPO_MERGE_PULL_REQUEST 3 /// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path #define TGS_EVENT_REPO_PRE_SYNCHRONIZE 4 @@ -95,6 +95,8 @@ #define TGS_EVENT_WATCHDOG_SHUTDOWN 15 /// Before the watchdog detaches for a TGS update/restart. No parameters. #define TGS_EVENT_WATCHDOG_DETACH 16 +// We don't actually implement this value as the DMAPI can never receive it +// #define TGS_EVENT_WATCHDOG_LAUNCH 17 // OTHER ENUMS @@ -115,21 +117,22 @@ //REQUIRED HOOKS /** - * Call this somewhere in [/world/proc/New] that is always run. This function may sleep! - * - * * event_handler - Optional user defined [/datum/tgs_event_handler]. - * * minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated. Can be one of [TGS_SECURITY_ULTRASAFE], [TGS_SECURITY_SAFE], or [TGS_SECURITY_TRUSTED]. - */ + * Call this somewhere in [/world/proc/New] that is always run. This function may sleep! + * + * * event_handler - Optional user defined [/datum/tgs_event_handler]. + * * minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated. Can be one of [TGS_SECURITY_ULTRASAFE], [TGS_SECURITY_SAFE], or [TGS_SECURITY_TRUSTED]. + */ /world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) return /** - * Call this when your initializations are complete and your game is ready to play before any player interactions happen. - * - * This may use [/world/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running. - * Before this point, note that any static files or directories may be in use by another server. Your code should account for this. - * This function should not be called before ..() in [/world/proc/New]. - */ + * Call this when your initializations are complete and your game is ready to play before any player interactions happen. + * + * This may use [/world/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running. + * Afterwards, consider explicitly setting it to what you want to avoid this BYOND bug: http://www.byond.com/forum/post/2575184 + * Before this point, note that any static files or directories may be in use by another server. Your code should account for this. + * This function should not be called before ..() in [/world/proc/New]. + */ /world/proc/TgsInitializationComplete() return @@ -137,8 +140,8 @@ #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return /** - * Call this at the beginning of [world/proc/Reboot]. - */ + * Call this at the beginning of [world/proc/Reboot]. + */ /world/proc/TgsReboot() return @@ -172,36 +175,36 @@ var/deprefixed_parameter /** - * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] contains wildcards. - */ + * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] contains wildcards. + */ /datum/tgs_version/proc/Wildcard() return /** - * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] equals some other version. - * - * other_version - The [/datum/tgs_version] to compare against. - */ + * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] equals some other version. + * + * other_version - The [/datum/tgs_version] to compare against. + */ /datum/tgs_version/proc/Equals(datum/tgs_version/other_version) return /// Represents a merge of a GitHub pull request. /datum/tgs_revision_information/test_merge - /// The pull request number. + /// The test merge number. var/number - /// The pull request title when it was merged. + /// The test merge source's title when it was merged. var/title - /// The pull request body when it was merged. + /// The test merge source's body when it was merged. var/body - /// The GitHub username of the pull request's author. + /// The Username of the test merge source's author. var/author - /// An http URL to the pull request. + /// An http URL to the test merge source. var/url - /// The SHA of the pull request when that was merged. + /// The SHA of the test merge when that was merged. var/pull_request_commit - /// ISO 8601 timestamp of when the pull request was merged. + /// ISO 8601 timestamp of when the test merge was created on TGS. var/time_merged - /// (Nullable) Comment left by the TGS user who initiated the merge.. + /// Optional comment left by the TGS user who initiated the merge. var/comment /// Represents a connected chat channel. @@ -231,10 +234,10 @@ var/datum/tgs_chat_channel/channel /** - * User definable callback for handling TGS events. - * - * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each - */ + * User definable callback for handling TGS events. + * + * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each + */ /datum/tgs_event_handler/proc/HandleEvent(event_code, ...) set waitfor = FALSE return @@ -249,11 +252,11 @@ var/admin_only = FALSE /** - * Process command activation. Should return a string to respond to the issuer with. - * - * sender - The [/datum/tgs_chat_user] who issued the command. - * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. - */ + * Process command activation. Should return a string to respond to the issuer with. + * + * sender - The [/datum/tgs_chat_user] who issued the command. + * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. + */ /datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params) CRASH("[type] has no implementation for Run()") @@ -268,48 +271,48 @@ return /** - * Returns [TRUE] if DreamDaemon was launched under TGS, the API matches, and was properly initialized. [FALSE] will be returned otherwise. - */ + * Returns [TRUE] if DreamDaemon was launched under TGS, the API matches, and was properly initialized. [FALSE] will be returned otherwise. + */ /world/proc/TgsAvailable() return // No function below this succeeds if it TgsAvailable() returns FALSE or if TgsNew() has yet to be called. /** - * Forces a hard reboot of DreamDaemon by ending the process. - * - * Unlike del(world) clients will try to reconnect. - * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again - */ + * Forces a hard reboot of DreamDaemon by ending the process. + * + * Unlike del(world) clients will try to reconnect. + * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again + */ /world/proc/TgsEndProcess() return /** - * Send a message to connected chats. - * - * message - The string to send. - * admin_only: If [TRUE], message will be sent to admin connected chats. Vice-versa applies. - */ + * Send a message to connected chats. + * + * message - The string to send. + * admin_only: If [TRUE], message will be sent to admin connected chats. Vice-versa applies. + */ /world/proc/TgsTargetedChatBroadcast(message, admin_only = FALSE) return /** - * Send a private message to a specific user. - * - * message - The string to send. - * user: The [/datum/tgs_chat_user] to PM. - */ + * Send a private message to a specific user. + * + * message - The string to send. + * user: The [/datum/tgs_chat_user] to PM. + */ /world/proc/TgsChatPrivateMessage(message, datum/tgs_chat_user/user) return // The following functions will sleep if a call to TgsNew() is sleeping /** - * Send a message to connected chats that are flagged as game-related in TGS. - * - * message - The string to send. - * channels - Optional list of [/datum/tgs_chat_channel]s to restrict the message to. - */ + * Send a message to connected chats that are flagged as game-related in TGS. + * + * message - The string to send. + * channels - Optional list of [/datum/tgs_chat_channel]s to restrict the message to. + */ /world/proc/TgsChatBroadcast(message, list/channels = null) return diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm index 467058f27a..f594b735b6 100644 --- a/code/__DEFINES/tgui.dm +++ b/code/__DEFINES/tgui.dm @@ -32,4 +32,4 @@ url_encode(json_encode(list( \ "type" = type, \ "payload" = payload, \ - )))) \ No newline at end of file + )))) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index f054f163b5..8e0886a30d 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -118,6 +118,8 @@ #define TRAIT_NOLIMBDISABLE "no_limb_disable" #define TRAIT_EASYLIMBDISABLE "easy_limb_disable" #define TRAIT_TOXINLOVER "toxinlover" +#define TRAIT_ROBOTIC_ORGANISM "robotic_organism" +#define TRAIT_ROBOT_RADSHIELDING "robot_radshielding" #define TRAIT_NOBREATH "no_breath" #define TRAIT_ANTIMAGIC "anti_magic" #define TRAIT_HOLY "holy" @@ -164,6 +166,7 @@ #define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events #define TRAIT_PUGILIST "pugilist" //This guy punches people for a living #define TRAIT_KI_VAMPIRE "ki-vampire" //when someone with this trait rolls maximum damage on a punch and stuns the target, they regain some stamina and do clone damage +#define TRAIT_MAULER "mauler" // this guy punches the shit out of people to hurt them, not to drain their stamina #define TRAIT_PASSTABLE "passtable" #define TRAIT_GIANT "giant" #define TRAIT_DWARF "dwarf" @@ -188,12 +191,14 @@ #define TRAIT_MUSICIAN "musician" #define TRAIT_PERMABONER "permanent_arousal" #define TRAIT_NEVERBONER "never_aroused" +#define TRAIT_NYMPHO "nymphomaniac" #define TRAIT_MASO "masochism" #define TRAIT_HIGH_BLOOD "high_blood" #define TRAIT_PARA "paraplegic" #define TRAIT_EMPATH "empath" #define TRAIT_FRIENDLY "friendly" #define TRAIT_SNOB "snob" +#define TRAIT_MULTILINGUAL "multilingual" #define TRAIT_CULT_EYES "cult_eyes" #define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. @@ -202,11 +207,18 @@ #define TRAIT_THERMAL_VISION "thermal_vision" #define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_NO_INTERNALS "no-internals" -#define TRAIT_NO_ALCOHOL "alcohol_intolerance" +#define TRAIT_TOXIC_ALCOHOL "alcohol_intolerance" #define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing. #define TRAIT_FAST_PUMP "fast_pump" #define TRAIT_NO_PROCESS_FOOD "no-process-food" // You don't get benefits from nutriment, nor nutrition from reagent consumables #define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good... +#define TRAIT_NO_STAMINA_BUFFER_REGENERATION "block_stamina_buffer_regen" /// Prevents stamina buffer regeneration +#define TRAIT_NO_STAMINA_REGENERATION "block_stamina_regen" /// Prevents stamina regeneration +#define TRAIT_ARMOR_BROKEN "armor_broken" //acts as if you are wearing no clothing when taking damage, does not affect non-clothing sources of protection +/// forces update_density to make us not dense +#define TRAIT_LIVING_NO_DENSITY "living_no_density" +/// forces us to not render our overlays +#define TRAIT_HUMAN_NO_RENDER "human_no_render" // mobility flag traits // IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it) @@ -219,6 +231,8 @@ #define TRAIT_MOBILITY_NOPICKUP "mobility_nopickup" /// Disallow item use #define TRAIT_MOBILITY_NOUSE "mobility_nouse" +///Disallow resting/unresting +#define TRAIT_MOBILITY_NOREST "mobility_norest" #define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking @@ -241,6 +255,7 @@ // item traits #define TRAIT_NODROP "nodrop" +#define TRAIT_SPOOKY_THROW "spooky_throw" // common trait sources #define TRAIT_GENERIC "generic" @@ -301,6 +316,7 @@ #define LOCKED_HELMET_TRAIT "locked-helmet" #define NINJA_SUIT_TRAIT "ninja-suit" #define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" +#define ROBOT_RADSHIELDING_IMPLANT_TRAIT "robot-radshielding-implant" #define MARTIAL_ARTIST_TRAIT "martial_artist" #define SLEEPING_CARP_TRAIT "sleeping_carp" #define RISING_BASS_TRAIT "rising_bass" @@ -311,8 +327,11 @@ #define CLOWNOP_TRAIT "clown-op" #define MEGAFAUNA_TRAIT "megafauna" #define DEATHSQUAD_TRAIT "deathsquad" +#define SLIMEPUDDLE_TRAIT "slimepuddle" +#define CORRUPTED_SYSTEM "corrupted-system" /// This trait is added by the active directional block system. #define ACTIVE_BLOCK_TRAIT "active_block" /// This trait is added by the parry system. #define ACTIVE_PARRY_TRAIT "active_parry" #define STICKY_NODROP "sticky-nodrop" //sticky nodrop sounds like a bad soundcloud rapper's name +#define TRAIT_SACRIFICED "sacrificed" //Makes sure that people cant be cult sacrificed twice. diff --git a/code/__DEFINES/turf_flags.dm b/code/__DEFINES/turf_flags.dm index 8604a92c01..881a535a40 100644 --- a/code/__DEFINES/turf_flags.dm +++ b/code/__DEFINES/turf_flags.dm @@ -3,4 +3,4 @@ #define CHANGETURF_FORCEOP 4 #define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE #define CHANGETURF_INHERIT_AIR 16 // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR -#define CHANGETURF_RECALC_ADJACENT 32 //Immediately recalc adjacent atmos turfs instead of queuing. \ No newline at end of file +#define CHANGETURF_RECALC_ADJACENT 32 //Immediately recalc adjacent atmos turfs instead of queuing. diff --git a/code/__DEFINES/vehicles.dm b/code/__DEFINES/vehicles.dm index 0bcc14d0d7..48383546b9 100644 --- a/code/__DEFINES/vehicles.dm +++ b/code/__DEFINES/vehicles.dm @@ -6,4 +6,4 @@ //Car trait flags -#define CAN_KIDNAP 1 \ No newline at end of file +#define CAN_KIDNAP 1 diff --git a/code/__DEFINES/vote.dm b/code/__DEFINES/vote.dm index 175cce3dc4..88e70b884e 100644 --- a/code/__DEFINES/vote.dm +++ b/code/__DEFINES/vote.dm @@ -1,9 +1,9 @@ -#define PLURALITY_VOTING 0 -#define APPROVAL_VOTING 1 -#define SCHULZE_VOTING 2 -#define SCORE_VOTING 3 -#define MAJORITY_JUDGEMENT_VOTING 4 -#define INSTANT_RUNOFF_VOTING 5 +#define PLURALITY_VOTING "PLURALITY" +#define APPROVAL_VOTING "APPROVAL" +#define SCHULZE_VOTING "SCHULZE" +#define SCORE_VOTING "SCORE" +#define HIGHEST_MEDIAN_VOTING "HIGHEST_MEDIAN" +#define INSTANT_RUNOFF_VOTING "IRV" #define SHOW_RESULTS (1<<0) #define SHOW_VOTES (1<<1) @@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(vote_type_names,list(\ "IRV (single winner ranked choice)" = INSTANT_RUNOFF_VOTING,\ "Schulze (ranked choice, higher result=better)" = SCHULZE_VOTING,\ "Raw Score (returns results from 0 to 1, winner is 1)" = SCORE_VOTING,\ -"Majority Judgement (single-winner score voting)" = MAJORITY_JUDGEMENT_VOTING,\ +"Highest Median (single-winner score voting)" = HIGHEST_MEDIAN_VOTING,\ )) GLOBAL_LIST_INIT(display_vote_settings, list(\ @@ -26,4 +26,4 @@ GLOBAL_LIST_INIT(display_vote_settings, list(\ "Ongoing Votes" = SHOW_VOTES, "Winner" = SHOW_WINNER, "Abstainers" = SHOW_ABSTENTION -)) \ No newline at end of file +)) diff --git a/code/__HELPERS/_extools_api.dm b/code/__HELPERS/_extools_api.dm deleted file mode 100644 index af348dc939..0000000000 --- a/code/__HELPERS/_extools_api.dm +++ /dev/null @@ -1,5 +0,0 @@ -#define EXTOOLS_LOGGING // rust_g is used as a fallback if this is undefined - -/proc/extools_log_write() - -/proc/extools_finalize_logging() diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 3efb50ef65..a554397c41 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -37,7 +37,7 @@ * TYPECONT: The typepath of the contents of the list * COMPARE: The object to compare against, usualy the same as INPUT * COMPARISON: The variable on the objects to compare - * COMPTYPE: How the current bin item to compare against COMPARE is fetched. By key or value. + * COMPTYPE: How should the values be compared? Either COMPARE_KEY or COMPARE_VALUE. */ #define BINARY_INSERT(INPUT, LIST, TYPECONT, COMPARE, COMPARISON, COMPTYPE) \ do {\ @@ -49,7 +49,7 @@ var/__BIN_LEFT = 1;\ var/__BIN_RIGHT = __BIN_CTTL;\ var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ - var/##TYPECONT/__BIN_ITEM;\ + var ##TYPECONT/__BIN_ITEM;\ while(__BIN_LEFT < __BIN_RIGHT) {\ __BIN_ITEM = COMPTYPE;\ if(__BIN_ITEM.##COMPARISON <= COMPARE.##COMPARISON) {\ @@ -66,25 +66,54 @@ } while(FALSE) //Returns a list in plain english as a string -/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) - var/total = input.len - if (!total) - return nothing_text - else if (total == 1) - return "[input[1]]" - else if (total == 2) - return "[input[1]][and_text][input[2]]" - else - var/output = "" - var/index = 1 - while (index < total) - if (index == total - 1) - comma_text = final_comma_text +/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "") + var/total = length(input) + switch(total) + if (0) + return "[nothing_text]" + if (1) + return "[input[1]]" + if (2) + return "[input[1]][and_text][input[2]]" + else + var/output = "" + var/index = 1 + while (index < total) + if (index == total - 1) + comma_text = final_comma_text - output += "[input[index]][comma_text]" - index++ + output += "[input[index]][comma_text]" + index++ - return "[output][and_text][input[index]]" + return "[output][and_text][input[index]]" + +/** + * English_list but associative supporting. Higher overhead. + */ +/proc/english_list_assoc(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "") + var/total = length(input) + switch(total) + if (0) + return "[nothing_text]" + if (1) + var/assoc = input[input[1]] == null? "" : " = [input[input[1]]]" + return "[input[1]][assoc]" + if (2) + var/assoc = input[input[1]] == null? "" : " = [input[input[1]]]" + var/assoc2 = input[input[2]] == null? "" : " = [input[input[2]]]" + return "[input[1]][assoc][and_text][input[2]][assoc2]" + else + var/output = "" + var/index = 1 + var/assoc + while (index < total) + if (index == total - 1) + comma_text = final_comma_text + assoc = input[input[index]] == null? "" : " = [input[input[index]]]" + output += "[input[index]][assoc][comma_text]" + ++index + assoc = input[input[index]] == null? "" : " = [input[input[index]]]" + return "[output][and_text][input[index]]" //Returns list element or null. Should prevent "index out of bounds" error. /proc/listgetindex(list/L, index) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 583427cab7..8464e373d5 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -32,7 +32,7 @@ #define testing(msg) #endif -#ifdef UNIT_TESTS +#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM) /proc/log_test(text) WRITE_LOG(GLOB.test_log, text) SEND_TEXT(world.log, text) @@ -86,10 +86,6 @@ if (CONFIG_GET(flag/log_attack)) WRITE_LOG(GLOB.world_attack_log, "ATTACK: [text]") -/proc/log_wounded(text) - if (CONFIG_GET(flag/log_attack)) - WRITE_LOG(GLOB.world_attack_log, "WOUND: [text]") - /proc/log_manifest(ckey, datum/mind/mind,mob/body, latejoin = FALSE) if (CONFIG_GET(flag/log_manifest)) WRITE_LOG(GLOB.world_manifest_log, "[ckey] \\ [body.real_name] \\ [mind.assigned_role] \\ [mind.special_role ? mind.special_role : "NONE"] \\ [latejoin ? "LATEJOIN":"ROUNDSTART"]") @@ -195,6 +191,10 @@ /proc/log_mapping(text) WRITE_LOG(GLOB.world_map_error_log, text) +/proc/log_perf(list/perf_info) + . = "[perf_info.Join(",")]\n" + WRITE_LOG_NO_FORMAT(GLOB.perf_log, .) + /proc/log_reagent(text) WRITE_LOG(GLOB.reagent_log, text) @@ -231,10 +231,10 @@ src_object = window.locked_by.src_object // Insert src_object info if(src_object) - entry += "\nUsing: [src_object.type] [REF(src_object)]" + entry += "Using: [src_object.type] [REF(src_object)]" // Insert message if(message) - entry += "\n[message]" + entry += "[message]" WRITE_LOG(GLOB.tgui_log, entry) /* Close open log handles. This should be called as late as possible, and no logging should hapen after. */ diff --git a/code/__HELPERS/custom_holoforms.dm b/code/__HELPERS/custom_holoforms.dm index 0e97314f1f..2733a97e14 100644 --- a/code/__HELPERS/custom_holoforms.dm +++ b/code/__HELPERS/custom_holoforms.dm @@ -46,6 +46,33 @@ I = getPAIHologramIcon(I) return I +//Prompts this client for custom holoform parameters. +/proc/user_interface_custom_holoform(client/C) + var/datum/preferences/target_prefs = C.prefs + if(target_prefs.path) + var/list/characters = list() + var/savefile/S = new /savefile(target_prefs.path) + if(S) + var/name + var/max_save_slots = C.prefs.max_save_slots + for(var/i=1, i<=max_save_slots, i++) + S.cd = "/character[i]" + S["real_name"] >> name + if(name) + characters[name] = i + var/chosen_name = input(C, "Which character do you wish to use as your appearance.") as anything in characters + if(chosen_name) + if(C.prefs.last_custom_holoform > world.time - CUSTOM_HOLOFORM_DELAY) + to_chat(C.mob, "You are attempting to set your custom holoform too fast!") + return + target_prefs = new(C) + if(!target_prefs.load_character(characters[chosen_name], TRUE)) + target_prefs = C.prefs + + ASSERT(target_prefs) + //In the future, maybe add custom path allowances a la admin create outfit but for now.. + return generate_custom_holoform_from_prefs(target_prefs, null, null, TRUE, TRUE) + //Errors go to user. /proc/generate_custom_holoform_from_prefs_safe(datum/preferences/prefs, mob/user) if(user) @@ -53,10 +80,3 @@ to_chat(user, "You are attempting to set your custom holoform too fast!") return return generate_custom_holoform_from_prefs(prefs, null, null, TRUE, TRUE) - -//Prompts this client for custom holoform parameters. -/proc/user_interface_custom_holoform(client/C) - var/datum/preferences/target_prefs = C.prefs - ASSERT(target_prefs) - //In the future, maybe add custom path allowances a la admin create outfit but for now.. - return generate_custom_holoform_from_prefs_safe(target_prefs, C.mob) diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm index 30d40f3867..c65cd80394 100644 --- a/code/__HELPERS/do_after.dm +++ b/code/__HELPERS/do_after.dm @@ -38,11 +38,11 @@ return FALSE if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc)) return FALSE + if(!(do_after_flags & DO_AFTER_NO_COEFFICIENT) && living_user) + delay *= living_user.cached_multiplicative_actions_slowdown var/starttime = world.time var/endtime = world.time + delay var/obj/item/initially_held_item = mob_redirect?.get_active_held_item() - if(!(do_after_flags & DO_AFTER_NO_COEFFICIENT) && living_user) - delay *= living_user.do_after_coefficent() var/atom/movable/AM_user = ismovable(user) && user var/drifting = AM_user?.Process_Spacemove(NONE) && AM_user.inertia_dir var/initial_dx = targetturf.x - userturf.x @@ -245,7 +245,7 @@ if(holding) holdingnull = 0 //Users hand started holding something, check to see if it's still holding that - delay *= user.do_after_coefficent() + delay *= user.cached_multiplicative_actions_slowdown var/datum/progressbar/progbar if (progress) @@ -300,10 +300,6 @@ LAZYREMOVE(user.do_afters, target) LAZYREMOVE(target.targeted_by, user) -/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1 - . = 1 - return - /proc/do_after_mob(mob/user, var/list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks) if(!user || !targets) return 0 @@ -326,6 +322,8 @@ if(progress) progbar = new(user, time, targets[1]) + time *= user.cached_multiplicative_actions_slowdown + var/endtime = world.time + time var/starttime = world.time . = 1 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 1119ef44ed..b8c009ff4f 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -32,6 +32,9 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_wings, GLOB.insect_wings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_fluff, GLOB.insect_fluffs_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_legs, GLOB.arachnid_legs_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_spinneret, GLOB.arachnid_spinneret_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_mandibles, GLOB.arachnid_mandibles_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/deco_wings, GLOB.deco_wings_list) //CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 4723577fad..1d37f639bf 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1186,6 +1186,8 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico SSassets.transport.register_asset(key, I) for (var/thing2 in targets) SSassets.transport.send_assets(thing2, key) + if(sourceonly) + return SSassets.transport.get_asset_url(key) return "" @@ -1233,3 +1235,18 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico var/icon/I = getFlatIcon(thing) return icon2html(I, target, sourceonly = sourceonly) +/* Gives the result RGB of a RGB string after a matrix transformation. No alpha. + * Input: rr, rg, rb, gr, gg, gb, br, bg, bb, cr, cg, cb + * Output: RGB string + */ +/proc/RGBMatrixTransform(list/color, list/cm) + ASSERT(cm.len >= 9) + if(cm.len < 12) // fill in the rest + for(var/i in 1 to (12 - cm.len)) + cm += 0 + if(!islist(color)) + color = ReadRGB(color) + color[1] = color[1] * cm[1] + color[2] * cm[2] + color[3] * cm[3] + cm[10] * 255 + color[2] = color[1] * cm[4] + color[2] * cm[5] + color[3] * cm[6] + cm[11] * 255 + color[3] = color[1] * cm[7] + color[2] * cm[8] + color[3] * cm[9] + cm[12] * 255 + return rgb(color[1], color[2], color[3]) diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index d96ec76a7c..59fbb4ffc0 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -176,4 +176,10 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro offset = (y-1)*4 for(x in 1 to 4) output[offset+x] = round(A[offset+1]*B[x] + A[offset+2]*B[x+4] + A[offset+3]*B[x+8] + A[offset+4]*B[x+12]+(y==5?B[x+16]:0), 0.001) - return output \ No newline at end of file + return output + +/** + * Assembles a color matrix, defaulting to identity + */ +/proc/rgb_construct_color_matrix(rr = 1, rg, rb, gr, gg = 1, gb, br, bg, bb = 1, cr, cg, cb) + return list(rr, rg, rb, gr, gg, gb, br, bg, bb, cr, cg, cb) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 52e26b67e7..513437e57e 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -76,6 +76,12 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_fluff, GLOB.insect_fluffs_list) if(!GLOB.insect_markings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_markings, GLOB.insect_markings_list) + if(!GLOB.arachnid_legs_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_legs, GLOB.arachnid_legs_list) + if(!GLOB.arachnid_spinneret_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_spinneret, GLOB.arachnid_spinneret_list) + if(!GLOB.arachnid_mandibles_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_mandibles, GLOB.arachnid_mandibles_list) //CIT CHANGES - genitals and such if(!GLOB.cock_shapes_list.len) @@ -177,6 +183,9 @@ "insect_wings" = pick(GLOB.insect_wings_list), "insect_fluff" = "None", "insect_markings" = pick(GLOB.insect_markings_list), + "arachnid_legs" = pick(GLOB.arachnid_legs_list), + "arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list), + "arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list), "taur" = "None", "mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None", "mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None", @@ -278,6 +287,13 @@ if(!findname(.)) break +/proc/random_unique_arachnid_name(attempts_to_find_unique_name=10) + for(var/i in 1 to attempts_to_find_unique_name) + . = capitalize(pick(GLOB.arachnid_first)) + " " + capitalize(pick(GLOB.arachnid_last)) + + if(!findname(.)) + break + #define SKINTONE2HEX(skin_tone) GLOB.skin_tones[skin_tone] || skin_tone /proc/random_skin_tone() diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index e1848b21a2..8ff610e68c 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -16,22 +16,9 @@ /proc/moth_name() return "[pick(GLOB.moth_first)] [pick(GLOB.moth_last)]" -/proc/church_name() - var/static/church_name - if (church_name) - return church_name +/proc/arachnid_name() + return "[pick(GLOB.arachnid_first)] [pick(GLOB.arachnid_last)]" - var/name = "" - - name += pick("Holy", "United", "First", "Second", "Last") - - if (prob(20)) - name += " Space" - - name += " " + pick("Church", "Cathedral", "Body", "Worshippers", "Movement", "Witnesses") - name += " of [religion_name()]" - - return name GLOBAL_VAR(command_name) /proc/command_name() @@ -49,17 +36,6 @@ GLOBAL_VAR(command_name) return name -/proc/religion_name() - var/static/religion_name - if (religion_name) - return religion_name - - var/name = "" - - name += pick("bee", "science", "edu", "captain", "assistant", "monkey", "alien", "space", "unit", "sprocket", "gadget", "bomb", "revolution", "beyond", "station", "goon", "robot", "ivor", "hobnob") - name += pick("ism", "ia", "ology", "istism", "ites", "ick", "ian", "ity") - - return capitalize(name) /proc/station_name() if(!GLOB.station_name) diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index d06912b701..374e89f715 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -10,7 +10,7 @@ announcement += "

[html_encode(title)]

" else if(type == "Captain") announcement += "

Captain Announces

" - GLOB.news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null) + GLOB.news_network.SubmitArticle(html_encode(text), "Captain's Announcement", "Station Announcements", null) else if(!sender_override) diff --git a/code/__HELPERS/radiation.dm b/code/__HELPERS/radiation.dm index 1570eededb..d527d0ac51 100644 --- a/code/__HELPERS/radiation.dm +++ b/code/__HELPERS/radiation.dm @@ -12,15 +12,17 @@ )) var/list/processing_list = list(location) . = list() - while(processing_list.len) - var/atom/thing = processing_list[1] - processing_list -= thing + var/i = 0 + var/lim = 1 + while(i < lim) + var/atom/thing = processing_list[++i] if(ignored_things[thing.type]) continue . += thing if((thing.rad_flags & RAD_PROTECT_CONTENTS) || (SEND_SIGNAL(thing, COMSIG_ATOM_RAD_PROBE) & COMPONENT_BLOCK_RADIATION)) continue processing_list += thing.contents + lim = processing_list.len /proc/radiation_pulse(atom/source, intensity, range_modifier, log=FALSE, can_contaminate=TRUE) if(!SSradiation.can_fire) diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index 50c866b30b..de225b3b53 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -94,4 +94,4 @@ chosen_id = input(user, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent) if("I'm feeling lucky") chosen_id = pick(subtypesof(/datum/reagent)) - return chosen_id \ No newline at end of file + return chosen_id diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index e4a2e6521a..a860a8cd3f 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -238,8 +238,11 @@ CHECK_TICK SSdbcore.SetRoundEnd() //Collects persistence features - if(mode.allow_persistence_save) - SSpersistence.CollectData() + if(mode.station_was_nuked) + SSpersistence.station_was_destroyed = TRUE + if(!mode.allow_persistence_save) + SSpersistence.station_persistence_save_disabled = TRUE + SSpersistence.CollectData() //stop collecting feedback during grifftime SSblackbox.Seal() diff --git a/code/__HELPERS/shell.dm b/code/__HELPERS/shell.dm index 3438f38b85..303036b341 100644 --- a/code/__HELPERS/shell.dm +++ b/code/__HELPERS/shell.dm @@ -13,6 +13,7 @@ var/err_file = "" var/static/list/interpreters = list("[MS_WINDOWS]" = "cmd /c", "[UNIX]" = "sh -c") var/interpreter = interpreters["[world.system_type]"] + log_subsystem("SHELL", "Executing command [command]") if(interpreter) for(var/seo_id in shelleo_ids) if(!shelleo_ids[seo_id]) @@ -36,6 +37,7 @@ else CRASH("Operating System: [world.system_type] not supported") // If you encounter this error, you are encouraged to update this proc with support for the new operating system . = list(errorcode, stdout, stderr) + log_subsystem("SHELL", "Finished execution: [errorcode], [stdout], [stderr]") #undef SHELLEO_NAME #undef SHELLEO_ERR #undef SHELLEO_OUT diff --git a/code/__HELPERS/sorts/InsertSort.dm b/code/__HELPERS/sorts/InsertSort.dm index 962709527e..4c8c207abe 100644 --- a/code/__HELPERS/sorts/InsertSort.dm +++ b/code/__HELPERS/sorts/InsertSort.dm @@ -16,4 +16,4 @@ SI.associative = associative SI.binarySort(fromIndex, toIndex, fromIndex) - return L \ No newline at end of file + return L diff --git a/code/__HELPERS/sorts/MergeSort.dm b/code/__HELPERS/sorts/MergeSort.dm index 39d3799725..9c85f37f7c 100644 --- a/code/__HELPERS/sorts/MergeSort.dm +++ b/code/__HELPERS/sorts/MergeSort.dm @@ -16,4 +16,4 @@ SI.associative = associative SI.mergeSort(fromIndex, toIndex) - return L \ No newline at end of file + return L diff --git a/code/__HELPERS/sorts/TimSort.dm b/code/__HELPERS/sorts/TimSort.dm index d709044dc0..7191d1ee55 100644 --- a/code/__HELPERS/sorts/TimSort.dm +++ b/code/__HELPERS/sorts/TimSort.dm @@ -17,4 +17,4 @@ SI.associative = associative SI.timSort(fromIndex, toIndex) - return L \ No newline at end of file + return L diff --git a/code/__HELPERS/text_vr.dm b/code/__HELPERS/text_vr.dm index 3c1e1eff12..cde9b1931f 100644 --- a/code/__HELPERS/text_vr.dm +++ b/code/__HELPERS/text_vr.dm @@ -29,4 +29,4 @@ GLOBAL_LIST_EMPTY(whitelisted_species_list) /proc/log_looc(text) if (CONFIG_GET(flag/log_ooc)) - WRITE_FILE(GLOB.world_game_log, "\[[TIME_STAMP("hh:mm:ss", FALSE)]]LOOC: [text]") \ No newline at end of file + WRITE_FILE(GLOB.world_game_log, "\[[TIME_STAMP("hh:mm:ss", FALSE)]]LOOC: [text]") diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index bbbf99c9de..87187a4c3d 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -78,21 +78,21 @@ //Turns a direction into text /proc/dir2text(direction) switch(direction) - if(1) + if(NORTH) return "north" - if(2) + if(SOUTH) return "south" - if(4) + if(EAST) return "east" - if(8) + if(WEST) return "west" - if(5) + if(NORTHEAST) return "northeast" - if(6) + if(SOUTHEAST) return "southeast" - if(9) + if(NORTHWEST) return "northwest" - if(10) + if(SOUTHWEST) return "southwest" else return @@ -101,21 +101,21 @@ /proc/text2dir(direction) switch(uppertext(direction)) if("NORTH") - return 1 + return NORTH if("SOUTH") - return 2 + return SOUTH if("EAST") - return 4 + return EAST if("WEST") - return 8 + return WEST if("NORTHEAST") - return 5 + return NORTHEAST if("NORTHWEST") - return 9 + return NORTHWEST if("SOUTHEAST") - return 6 + return SOUTHEAST if("SOUTHWEST") - return 10 + return SOUTHWEST else return @@ -225,6 +225,8 @@ . += "[seperator]AUTOLOGIN" if(rights & R_DBRANKS) . += "[seperator]DBRANKS" + if(rights & R_SENSITIVE) + . += "[seperator]SENSITIVE" if(!.) . = "NONE" return . diff --git a/code/__HELPERS/typelists.dm b/code/__HELPERS/typelists.dm index f271b9204d..3519eb60f3 100644 --- a/code/__HELPERS/typelists.dm +++ b/code/__HELPERS/typelists.dm @@ -40,4 +40,4 @@ GLOBAL_LIST_EMPTY(typelistkeys) for (var/saving in savings) to_chat(world, "Savings for [saving]: [savings[saving]] lists, [saveditems[saving]] items") -#endif \ No newline at end of file +#endif diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 92bd726641..71bbfe64fe 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -263,7 +263,7 @@ Turf and target are separate in case you want to teleport some distance from a t return . //Returns a list of all items of interest with their name -/proc/getpois(mobs_only=0,skip_mindless=0) +/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE) var/list/mobs = sortmobs() var/list/namecounts = list() var/list/pois = list() @@ -271,13 +271,13 @@ Turf and target are separate in case you want to teleport some distance from a t if(skip_mindless && (!M.mind && !M.ckey)) if(!isbot(M) && !iscameramob(M) && !ismegafauna(M)) continue - if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins + if(M.client?.holder?.fakekey && isobserver(M)) continue var/name = avoid_assoc_duplicate_keys(M.name, namecounts) if(M.real_name && M.real_name != M.name) name += " \[[M.real_name]\]" - if(M.stat == DEAD) + if(M.stat == DEAD && specify_dead_role) if(isobserver(M)) name += " \[ghost\]" else @@ -457,21 +457,23 @@ Turf and target are separate in case you want to teleport some distance from a t /atom/proc/GetAllContents(var/T) var/list/processing_list = list(src) + var/i = 0 + var/lim = 1 if(T) . = list() - var/i = 0 - while(i < length(processing_list)) + while(i < lim) var/atom/A = processing_list[++i] //Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed //This is also why we don't need to check against assembled as we go along processing_list += A.contents + lim = processing_list.len if(istype(A,T)) . += A else - var/i = 0 - while(i < length(processing_list)) + while(i < lim) var/atom/A = processing_list[++i] processing_list += A.contents + lim = processing_list.len return processing_list /atom/proc/GetAllContentsIgnoring(list/ignore_typecache) @@ -480,10 +482,12 @@ Turf and target are separate in case you want to teleport some distance from a t var/list/processing = list(src) . = list() var/i = 0 - while(i < length(processing)) + var/lim = 1 + while(i < lim) var/atom/A = processing[++i] if(!ignore_typecache[A.type]) processing += A.contents + lim = processing.len . += A @@ -1066,7 +1070,7 @@ B --><-- A return closest_atom -proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) if (value == FALSE) //nothing should be calling us with a number, so this is safe value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text if (isnull(value)) @@ -1198,7 +1202,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) //Version of view() which ignores darkness, because BYOND doesn't have it (I actually suggested it but it was tagged redundant, BUT HEARERS IS A T- /rant). -/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) +/proc/dview(range = world.view, center, invis_flags = 0) if(!center) return @@ -1218,6 +1222,10 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) var/ready_to_die = FALSE /mob/dview/Initialize() //Properly prevents this mob from gaining huds or joining any global lists + SHOULD_CALL_PARENT(FALSE) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 return INITIALIZE_HINT_NORMAL /mob/dview/Destroy(force = FALSE) diff --git a/code/__HELPERS/vector.dm b/code/__HELPERS/vector.dm index 80295bde0e..9033868e6f 100644 --- a/code/__HELPERS/vector.dm +++ b/code/__HELPERS/vector.dm @@ -54,4 +54,4 @@ return locate(T.x + V.x, T.y + V.y, z) /proc/atoms2vector(var/atom/A, var/atom/B) - return new /datum/vector((B.x - A.x), (B.y - A.y)) // Vector from A -> B \ No newline at end of file + return new /datum/vector((B.x - A.x), (B.y - A.y)) // Vector from A -> B diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm index 48e68be20f..1c92971802 100644 --- a/code/__HELPERS/view.dm +++ b/code/__HELPERS/view.dm @@ -2,7 +2,7 @@ var/viewX var/viewY if(isnum(view)) - var/totalviewrange = 1 + 2 * view + var/totalviewrange = (view < 0 ? -1 : 1) + 2 * view viewX = totalviewrange viewY = totalviewrange else diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 0e0bd4ffaa..64b4129024 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -46,11 +46,11 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 513 -#define MIN_COMPILER_BUILD 1508 +#define MIN_COMPILER_BUILD 1514 #if DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. -#error You need version 513.1508 or higher +#error You need version 513.1514 or higher #endif //Additional code for the above flags. @@ -62,10 +62,14 @@ #define FIND_REF_NO_CHECK_TICK #endif -#ifdef TRAVISBUILDING +#ifdef CIBUILDING #define UNIT_TESTS #endif -#ifdef TRAVISTESTING +#ifdef CITESTING #define TESTING #endif + +// A reasonable number of maximum overlays an object needs +// If you think you need more, rethink it +#define MAX_ATOM_OVERLAYS 100 diff --git a/code/_globalvars/admin.dm b/code/_globalvars/admin.dm new file mode 100644 index 0000000000..81037ff3dd --- /dev/null +++ b/code/_globalvars/admin.dm @@ -0,0 +1,12 @@ +GLOBAL_LIST_EMPTY(stickybanadminexemptions) //stores a list of ckeys exempted from a stickyban (workaround for a bug) +GLOBAL_LIST_EMPTY(stickybanadmintexts) //stores the entire stickyban list temporarily +GLOBAL_VAR(stickbanadminexemptiontimerid) //stores the timerid of the callback that restores all stickybans after an admin joins + +// /proc/init_smites() //todo: add on the second wave +// var/list/smites = list() +// for (var/_smite_path in subtypesof(/datum/smite)) +// var/datum/smite/smite_path = _smite_path +// smites[initial(smite_path.name)] = smite_path +// return smites + +// GLOBAL_LIST_INIT_TYPED(smites, /datum/smite, init_smites()) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 85f5e4fd9b..3fc275d436 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -67,7 +67,8 @@ GLOBAL_LIST_INIT(bitfields, list( "SOUNDS" = R_SOUNDS, "SPAWN" = R_SPAWN, "AUTOLOGIN" = R_AUTOLOGIN, - "DBRANKS" = R_DBRANKS + "DBRANKS" = R_DBRANKS, + "SENSITIVE" = R_SENSITIVE ), "interaction_flags_atom" = list( "INTERACT_ATOM_REQUIRES_ANCHORED" = INTERACT_ATOM_REQUIRES_ANCHORED, @@ -252,7 +253,6 @@ GLOBAL_LIST_INIT(bitfields, list( "COMBAT_FLAG_SPRINT_ACTIVE" = COMBAT_FLAG_SPRINT_ACTIVE, "COMBAT_FLAG_ATTEMPTING_CRAWL" = COMBAT_FLAG_ATTEMPTING_CRAWL, "COMBAT_FLAG_HARD_STAMCRIT" = COMBAT_FLAG_HARD_STAMCRIT, - "COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT, "COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING, "COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST, "COMBAT_FLAG_SPRINT_FORCED" = COMBAT_FLAG_SPRINT_FORCED diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index ab1379956d..8ac15fd4af 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -38,6 +38,9 @@ GLOBAL_LIST_EMPTY(r_wings_list) GLOBAL_LIST_EMPTY(insect_wings_list) GLOBAL_LIST_EMPTY(insect_fluffs_list) GLOBAL_LIST_EMPTY(insect_markings_list) +GLOBAL_LIST_EMPTY(arachnid_legs_list) +GLOBAL_LIST_EMPTY(arachnid_spinneret_list) +GLOBAL_LIST_EMPTY(arachnid_mandibles_list) GLOBAL_LIST_EMPTY(caps_list) //a way to index the right bodypart list given the type of bodypart @@ -60,6 +63,9 @@ GLOBAL_LIST_INIT(mutant_reference_list, list( "insect_wings" = GLOB.insect_wings_list, "insect_fluff" = GLOB.insect_fluffs_list, "insect_markings" = GLOB.insect_markings_list, + "arachnid_legs" = GLOB.arachnid_legs_list, + "arachnid_spinneret" = GLOB.arachnid_spinneret_list, + "arachnid_mandibles" = GLOB.arachnid_mandibles_list, "caps" = GLOB.caps_list, "ipc_screen" = GLOB.ipc_screens_list, "ipc_antenna" = GLOB.ipc_antennas_list, @@ -267,9 +273,9 @@ GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARC GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt")) -GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles")) - -GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc)) +//LANGUAGE CHARACTER CUSTOMIZATION +GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles", "caws", "gekkers", "clucks")) +GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc, "xeno tongue" = /obj/item/organ/tongue/alien)) /proc/get_roundstart_languages() var/list/languages = subtypesof(/datum/language) @@ -282,19 +288,58 @@ GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/o GLOBAL_LIST_INIT(roundstart_languages, get_roundstart_languages()) +//SPECIES BODYPART LISTS //locked parts are those that your picked species requires to have //unlocked parts are those that anyone can choose on customisation regardless //parts not in unlocked, but in all, are thus locked -GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns")) +GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns")) GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff")) + //parts in either of the above two lists that require a second option that allows them to be coloured GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color")) //body ids that have greyscale sprites -GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","lum","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic")) +GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","slimelumi","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic")) //body ids that have prosthetic sprites GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon")) +//FAMILY HEIRLOOM LIST +//this works by using the first number for the species as a probability to choose one of the items in the following list for their family heirloom +//if the probability fails, or the species simply isn't in the list, then it defaults to the next global list, which has its own list of items for each job +//the first item in the list is for if your job isn't in that list + +//species-heirloom list (we categorise them by the species id var) +GLOBAL_LIST_INIT(species_heirlooms, list( + "dwarf" = list(25, list(/obj/item/reagent_containers/food/drinks/dwarf_mug)), //example: 25% chance for dwarves to get a dwarf mug as their heirloom (normal container but has manly dorf icon) + "insect" = list(25, list(/obj/item/flashlight/lantern/heirloom_moth)), + "ipc" = list(25, list(/obj/item/stock_parts/cell/family)), //gives a broken powercell for flavor text! + "synthliz" = list(25, list(/obj/item/stock_parts/cell/family)), //they're also robots + "slimeperson" = list(25, list(/obj/item/toy/plush/slimeplushie)), + "lizard" = list(25, list(/obj/item/toy/plush/lizardplushie)), + )) + +//job-heirloom list +GLOBAL_LIST_INIT(job_heirlooms, list( + "NO_JOB" = list(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20), + "Clown" = list(/obj/item/paint/anycolor, /obj/item/bikehorn/golden), + "Mime" = list(/obj/item/paint/anycolor, /obj/item/toy/dummy), + "Cook" = list(/obj/item/kitchen/knife/scimitar), + "Botanist" = list(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie), + "Medical Doctor" = list(/obj/item/healthanalyzer), + "Paramedic" = list(/obj/item/lighter), //..why? + "Station Engineer" = list(/obj/item/wirecutters/brass/family, /obj/item/crowbar/brass/family, /obj/item/screwdriver/brass/family, /obj/item/wrench/brass/family), //brass tools but without the tool speed modifier + "Atmospheric Technician" = list(/obj/item/extinguisher/mini/family), + "Lawyer" = list(/obj/item/storage/briefcase/lawyer/family), + "Janitor" = list(/obj/item/mop), + "Scientist" = list(/obj/item/toy/plush/slimeplushie), + "Assistant" = list(/obj/item/clothing/gloves/cut/family), + "Chaplain" = list(/obj/item/camera/spooky/family), + "Head of Personnel" = list(/obj/item/pinpointer/ian) + )) + //body ids that have non-gendered bodyparts GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem")) + +//list of eye types, corresponding to a respective left and right icon state for the set of eyes +GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "cyclops")) diff --git a/code/_globalvars/lists/loadout_categories.dm b/code/_globalvars/lists/loadout_categories.dm index 0f0ac52214..4a61a94dc7 100644 --- a/code/_globalvars/lists/loadout_categories.dm +++ b/code/_globalvars/lists/loadout_categories.dm @@ -9,5 +9,6 @@ GLOBAL_LIST_INIT(loadout_categories, list( LOADOUT_CATEGORY_SHOES = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_GLOVES = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_GLASSES = LOADOUT_SUBCATEGORIES_NONE, - LOADOUT_CATEGORY_DONATOR = LOADOUT_SUBCATEGORIES_NONE + LOADOUT_CATEGORY_DONATOR = LOADOUT_SUBCATEGORIES_NONE, + LOADOUT_CATEGORY_UNLOCKABLE = LOADOUT_SUBCATEGORIES_NONE )) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 14a1924e76..b41b7356a8 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/effect/spawner/lootdrop/welder_tools = 3, /obj/effect/spawner/lootdrop/low_tools = 5, /obj/item/relic = 3, - /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 2, + /obj/item/weaponcrafting/receiver = 2, /obj/item/clothing/head/cone = 2, /obj/item/grenade/smokebomb = 2, /obj/item/geiger_counter = 3, @@ -131,4 +131,4 @@ GLOBAL_LIST_INIT(ratking_coins, list(//Coins: Used by the regal rat mob when spa /obj/item/coin/iron, /obj/item/coin/silver, /obj/item/coin/plastic, - /obj/item/coin/titanium)) \ No newline at end of file + /obj/item/coin/titanium)) diff --git a/code/_globalvars/lists/medals.dm b/code/_globalvars/lists/medals.dm index 0d7903ef7e..91521694ef 100755 --- a/code/_globalvars/lists/medals.dm +++ b/code/_globalvars/lists/medals.dm @@ -1 +1 @@ -GLOBAL_LIST_EMPTY(commendations) \ No newline at end of file +GLOBAL_LIST_EMPTY(commendations) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 134f9d9cbe..64bac1f9af 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -40,6 +40,7 @@ GLOBAL_LIST_EMPTY(sentient_disease_instances) GLOBAL_LIST_EMPTY(latejoin_ai_cores) GLOBAL_LIST_EMPTY(mob_config_movespeed_type_lookup) +GLOBAL_LIST_EMPTY(mob_config_movespeed_type_lookup_floating) GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes. @@ -47,14 +48,22 @@ GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traito // NOTE: This is entirely based on the fact that byond typesof/subtypesof gets longer/deeper paths before shallower ones. // If that ever breaks this entire proc breaks. var/list/mob_types = typesof(/mob) - var/list/entry_value = CONFIG_GET(keyed_list/multiplicative_movespeed) + var/list/mob_types_floating = typesof(/mob) + var/list/entry_value = CONFIG_GET(keyed_list/multiplicative_movespeed/normal) + var/list/entry_value_floating = CONFIG_GET(keyed_list/multiplicative_movespeed/floating) var/list/configured_types = list() + var/list/configured_types_floating = list() for(var/path in entry_value) var/value = entry_value[path] if(isnull(value)) continue // associative list sets for elements that already exist preserve order mob_types[path] = value + for(var/path in entry_value_floating) + var/value = entry_value_floating[path] + if(isnull(value)) + continue + mob_types_floating[path] = value // now go back up through it to set everything, making absolute sure that base paths are overridden by child paths all the way down the path tree. for(var/i in length(mob_types) to 1 step -1) var/path = mob_types[i] @@ -63,7 +72,14 @@ GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traito // we're going from bottom to top so it should be safe to do this without further checks.. for(var/subpath in typesof(path)) configured_types[subpath] = mob_types[path] + for(var/i in length(mob_types_floating) to 1 step -1) + var/path = mob_types_floating[i] + if(isnull(mob_types_floating[path])) + continue + for(var/subpath in typesof(path)) + configured_types_floating[subpath] = mob_types_floating[path] GLOB.mob_config_movespeed_type_lookup = configured_types + GLOB.mob_config_movespeed_type_lookup_floating = configured_types_floating if(update_mobs) update_mob_config_movespeeds() diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index b80fcf0bbf..1148e92dd5 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -16,6 +16,8 @@ GLOBAL_LIST_INIT(carp_names, world.file2list("strings/names/carp.txt")) GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt")) GLOBAL_LIST_INIT(moth_first, world.file2list("strings/names/moth_first.txt")) GLOBAL_LIST_INIT(moth_last, world.file2list("strings/names/moth_last.txt")) +GLOBAL_LIST_INIT(arachnid_first, world.file2list("strings/names/arachnid_first.txt")) +GLOBAL_LIST_INIT(arachnid_last, world.file2list("strings/names/arachnid_last.txt")) GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt")) GLOBAL_LIST_INIT(ethereal_names, world.file2list("strings/names/ethereal.txt")) GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt")) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 706a5ed955..9abc37c7e4 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -43,5 +43,4 @@ GLOBAL_LIST_EMPTY(ai_status_displays) GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert -//list of everyone playing rock paper scissors -GLOBAL_LIST_EMPTY(rockpaperscissors_players) +GLOBAL_LIST_EMPTY(rockpaperscissors_players) // List of everyone playing rock paper scissors diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index e9f98f836e..78d802dbbf 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -8,6 +8,8 @@ GLOBAL_VAR(world_qdel_log) GLOBAL_PROTECT(world_qdel_log) GLOBAL_VAR(world_attack_log) GLOBAL_PROTECT(world_attack_log) +// GLOBAL_VAR(world_econ_log) +// GLOBAL_PROTECT(world_econ_log) GLOBAL_VAR(world_href_log) GLOBAL_PROTECT(world_href_log) GLOBAL_VAR(round_id) @@ -26,22 +28,28 @@ GLOBAL_VAR(query_debug_log) GLOBAL_PROTECT(query_debug_log) GLOBAL_VAR(world_job_debug_log) GLOBAL_PROTECT(world_job_debug_log) +// GLOBAL_VAR(world_mecha_log) +// GLOBAL_PROTECT(world_mecha_log) GLOBAL_VAR(world_virus_log) GLOBAL_PROTECT(world_virus_log) GLOBAL_VAR(world_asset_log) GLOBAL_PROTECT(world_asset_log) +// GLOBAL_VAR(world_cloning_log) +// GLOBAL_PROTECT(world_cloning_log) GLOBAL_VAR(world_map_error_log) GLOBAL_PROTECT(world_map_error_log) GLOBAL_VAR(world_paper_log) GLOBAL_PROTECT(world_paper_log) -GLOBAL_VAR(subsystem_log) -GLOBAL_PROTECT(subsystem_log) -GLOBAL_VAR(reagent_log) -GLOBAL_PROTECT(reagent_log) -GLOBAL_VAR(world_crafting_log) -GLOBAL_PROTECT(world_crafting_log) -GLOBAL_VAR(click_log) -GLOBAL_PROTECT(click_log) +GLOBAL_VAR(tgui_log) +GLOBAL_PROTECT(tgui_log) +GLOBAL_VAR(world_shuttle_log) +GLOBAL_PROTECT(world_shuttle_log) + +GLOBAL_VAR(perf_log) +GLOBAL_PROTECT(perf_log) + +// GLOBAL_VAR(demo_log) +// GLOBAL_PROTECT(demo_log) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) @@ -51,10 +59,7 @@ GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] GLOBAL_PROTECT(lastsignalers) GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was GLOBAL_PROTECT(lawchanges) -GLOBAL_VAR(tgui_log) -GLOBAL_PROTECT(tgui_log) -GLOBAL_VAR(world_shuttle_log) -GLOBAL_PROTECT(world_shuttle_log) + GLOBAL_LIST_EMPTY(combatlog) GLOBAL_PROTECT(combatlog) GLOBAL_LIST_EMPTY(IClog) @@ -75,3 +80,13 @@ GLOBAL_PROTECT(picture_logging_id) GLOBAL_VAR(picture_logging_prefix) GLOBAL_PROTECT(picture_logging_prefix) ///// + +//// cit logging +GLOBAL_VAR(subsystem_log) +GLOBAL_PROTECT(subsystem_log) +GLOBAL_VAR(reagent_log) +GLOBAL_PROTECT(reagent_log) +GLOBAL_VAR(world_crafting_log) +GLOBAL_PROTECT(world_crafting_log) +GLOBAL_VAR(click_log) +GLOBAL_PROTECT(click_log) diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 605b20a4f3..f376ba50d7 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -13,6 +13,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NEARSIGHT" = TRAIT_NEARSIGHT, "TRAIT_FAT" = TRAIT_FAT, "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_SACRIFICED" = TRAIT_SACRIFICED, "TRAIT_NOCLONE" = TRAIT_NOCLONE, "TRAIT_CLUMSY" = TRAIT_CLUMSY, "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, @@ -51,6 +52,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, "TRAIT_EASYLIMBDISABLE" = TRAIT_EASYLIMBDISABLE, "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, + "TRAIT_ROBOTIC_ORGANISM" = TRAIT_ROBOTIC_ORGANISM, + "TRAIT_ROBOT_RADSHIELDING" = TRAIT_ROBOT_RADSHIELDING, "TRAIT_NOBREATH" = TRAIT_NOBREATH, "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, "TRAIT_HOLY" = TRAIT_HOLY, @@ -101,7 +104,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_AUTO_CATCH_ITEM" = TRAIT_AUTO_CATCH_ITEM, "TRAIT_FREESPRINT" = TRAIT_FREESPRINT, "TRAIT_NO_INTERNALS" = TRAIT_NO_INTERNALS, - "TRAIT_NO_ALCOHOL" = TRAIT_NO_ALCOHOL, + "TRAIT_TOXIC_ALCOHOL" = TRAIT_TOXIC_ALCOHOL, "TRAIT_MUTATION_STASIS" = TRAIT_MUTATION_STASIS, "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, @@ -127,7 +130,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( ), /obj/item = list( "TRAIT_NODROP" = TRAIT_NODROP, - "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT + "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT, + "TRAIT_SPOOKY_THROW" = TRAIT_SPOOKY_THROW ) )) diff --git a/code/_js/menus.dm b/code/_js/menus.dm index da56850b07..fc7c3a4266 100644 --- a/code/_js/menus.dm +++ b/code/_js/menus.dm @@ -34,4 +34,4 @@ function dropdowns() { } } } -"} \ No newline at end of file +"} diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 2e52fa5bd7..935fbce301 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -24,7 +24,7 @@ * Common mob click code */ /mob/proc/CommonClickOn(atom/A, params) - SHOULD_NOT_SLEEP(TRUE) + //SHOULD_NOT_SLEEP(TRUE) if(mob_transforming) return if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON) @@ -34,7 +34,7 @@ FlushCurrentAction() else DiscardCurrentAction() - + /* Standard mob ClickOn() Handles exceptions: Buildmode, middle click, modified clicks, mech actions @@ -49,7 +49,6 @@ * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed */ /mob/proc/ClickOn(atom/A, params) - SHOULD_NOT_SLEEP(TRUE) if(check_click_intercept(params,A)) return diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 5bd9632355..81d8593d4e 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -220,7 +220,7 @@ /obj/screen/alert/shiver name = "Shivering" - desc = "You're shivering! Get somewhere warmer and take off any insulating clothing like a space suit." + desc = "You're shivering! Get somewhere warmer and take off any insulating clothing like a space suit." /obj/screen/alert/lowpressure name = "Low Pressure" @@ -306,6 +306,39 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(CHECK_MOBILITY(L, MOBILITY_MOVE)) return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt. +/obj/screen/alert/give // information set when the give alert is made + icon_state = "default" + var/mob/living/carbon/giver + var/obj/item/receiving + +/** + * Handles assigning most of the variables for the alert that pops up when an item is offered + * + * Handles setting the name, description and icon of the alert and tracking the person giving + * and the item being offered, also registers a signal that removes the alert from anyone who moves away from the giver + * Arguments: + * * taker - The person receiving the alert + * * giver - The person giving the alert and item + * * receiving - The item being given by the giver + */ +/obj/screen/alert/give/proc/setup(mob/living/carbon/taker, mob/living/carbon/giver, obj/item/receiving) + name = "[giver] is offering [receiving]" + desc = "[giver] is offering [receiving]. Click this alert to take it." + icon_state = "template" + cut_overlays() + add_overlay(receiving) + src.receiving = receiving + src.giver = giver + RegisterSignal(taker, COMSIG_MOVABLE_MOVED, .proc/removeAlert) + +/obj/screen/alert/give/proc/removeAlert() + to_chat(usr, "You moved out of range of [giver]!") + usr.clear_alert("[giver]") + +/obj/screen/alert/give/Click(location, control, params) + . = ..() + var/mob/living/carbon/C = usr + C.take(giver, receiving) //ALIENS diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index d82f3e7cf5..076c949f8e 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -149,6 +149,15 @@ /obj/screen/fullscreen/color_vision/blue color = "#0000ff" +/obj/screen/fullscreen/cinematic_backdrop + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "flash" + plane = SPLASHSCREEN_PLANE + layer = SPLASHSCREEN_LAYER - 1 + color = "#000000" + show_when_dead = TRUE + /obj/screen/fullscreen/lighting_backdrop icon = 'icons/mob/screen_gen.dmi' icon_state = "flash" diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 04141becf2..841a3e8303 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -118,27 +118,7 @@ action_intent.hud = src static_inventory += action_intent - using = new /obj/screen/mov_intent - using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon - using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") - using.screen_loc = ui_movi - using.hud = src - static_inventory += using - - //CITADEL CHANGES - sprint button - using = new /obj/screen/sprintbutton - using.icon = tg_ui_icon_to_cit_ui(ui_style) - using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint") - using.screen_loc = ui_movi - using.hud = src - static_inventory += using - //END OF CITADEL CHANGES - - //same as above but buffer. - sprint_buffer = new /obj/screen/sprint_buffer - sprint_buffer.screen_loc = ui_sprintbufferloc - sprint_buffer.hud = src - static_inventory += sprint_buffer + assert_move_intent_ui(owner, TRUE) // clickdelay clickdelay = new @@ -393,6 +373,51 @@ update_locked_slots() +/datum/hud/human/proc/assert_move_intent_ui(mob/living/carbon/human/owner = mymob, on_new = FALSE) + var/obj/screen/using + // delete old ones + var/list/obj/screen/victims = list() + victims += locate(/obj/screen/mov_intent) in static_inventory + victims += locate(/obj/screen/sprintbutton) in static_inventory + victims += locate(/obj/screen/sprint_buffer) in static_inventory + if(victims) + static_inventory -= victims + if(mymob?.client) + mymob.client.screen -= victims + QDEL_LIST(victims) + + // make new ones + // walk/run + using = new /obj/screen/mov_intent + using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon + using.screen_loc = ui_movi + using.hud = src + using.update_icon() + static_inventory += using + if(!on_new) + owner?.client?.screen += using + + if(!CONFIG_GET(flag/sprint_enabled)) + return + + // sprint button + using = new /obj/screen/sprintbutton + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint") + using.screen_loc = ui_movi + using.hud = src + static_inventory += using + if(!on_new) + owner?.client?.screen += using + + // same as above but buffer. + sprint_buffer = new /obj/screen/sprint_buffer + sprint_buffer.screen_loc = ui_sprintbufferloc + sprint_buffer.hud = src + static_inventory += sprint_buffer + if(!on_new) + owner?.client?.screen += using + /datum/hud/human/update_locked_slots() if(!mymob) return diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index 777ebb0718..2ecfe80ab5 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -1,30 +1,11 @@ -/client - /** - * Assoc list with all the active maps - when a screen obj is added to - * a map, it's put in here as well. - * - * Format: list( = list(/obj/screen)) - */ - var/list/screen_maps = list() - /** * A screen object, which acts as a container for turfs and other things * you want to show on the map, which you usually attach to "vis_contents". */ -/obj/screen - /** - * Map name assigned to this object. - * Automatically set by /client/proc/add_obj_to_map. - */ - var/assigned_map - /** - * Mark this object as garbage-collectible after you clean the map - * it was registered on. - * - * This could probably be changed to be a proc, for conditional removal. - * But for now, this works. - */ - var/del_on_map_removal = TRUE +/obj/screen/map_view + // Map view has to be on the lowest plane to enable proper lighting + layer = GAME_PLANE + plane = GAME_PLANE /** * A generic background object. diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index f71ced7a9d..ae11613885 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -87,4 +87,4 @@ S.screen_loc = screen_l - screen += S \ No newline at end of file + screen += S diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 9050bcb5f0..5d48f430d7 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -10,6 +10,8 @@ C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_1(null, C.view) C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_2(null, C.view) C.parallax_layers_cached += new /obj/screen/parallax_layer/planet(null, C.view) + if(SSparallax.random_layer) + C.parallax_layers_cached += new SSparallax.random_layer C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -52,12 +54,12 @@ switch(C.prefs.parallax) if (PARALLAX_INSANE) C.parallax_throttle = FALSE - C.parallax_layers_max = 4 + C.parallax_layers_max = 5 return TRUE if (PARALLAX_MED) C.parallax_throttle = PARALLAX_DELAY_MED - C.parallax_layers_max = 2 + C.parallax_layers_max = 3 return TRUE if (PARALLAX_LOW) @@ -68,8 +70,9 @@ if (PARALLAX_DISABLE) return FALSE + //This is high parallax. C.parallax_throttle = PARALLAX_DELAY_DEFAULT - C.parallax_layers_max = 3 + C.parallax_layers_max = 4 return TRUE /datum/hud/proc/update_parallax_pref(mob/viewmob) @@ -219,15 +222,14 @@ L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]" /atom/movable/proc/update_parallax_contents() - set waitfor = FALSE if(length(client_mobs_in_contents)) for(var/thing in client_mobs_in_contents) var/mob/M = thing - if(M && M.client && M.hud_used && length(M.client.parallax_layers)) + if(M?.client && M.hud_used && length(M.client.parallax_layers)) M.hud_used.update_parallax() /mob/proc/update_parallax_teleport() //used for arrivals shuttle - if(client && client.eye && hud_used && length(client.parallax_layers)) + if(client?.eye && hud_used && length(client.parallax_layers)) var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) @@ -287,6 +289,21 @@ speed = 1.4 layer = 3 +/obj/screen/parallax_layer/random + blend_mode = BLEND_OVERLAY + speed = 3 + layer = 3 + +/obj/screen/parallax_layer/random/space_gas + icon_state = "space_gas" + +/obj/screen/parallax_layer/random/space_gas/Initialize(mapload, view) + . = ..() + src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) + +/obj/screen/parallax_layer/random/asteroids + icon_state = "asteroids" + /obj/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY @@ -295,11 +312,11 @@ layer = 30 /obj/screen/parallax_layer/planet/update_status(mob/M) - var/turf/T = get_turf(M) - if(is_station_level(T.z)) - invisibility = 0 - else - invisibility = INVISIBILITY_ABSTRACT + var/client/C = M.client + var/turf/posobj = get_turf(C.eye) + if(!posobj) + return + invisibility = is_station_level(posobj.z) ? 0 : INVISIBILITY_ABSTRACT /obj/screen/parallax_layer/planet/update_o() - return //Shit wont move + return //Shit won't move diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 7a8b0a1121..f5b8991e20 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -28,8 +28,6 @@ . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) -/obj/screen/plane_master/openspace/backdrop(mob/mymob) - filters = list() filters += filter(type = "drop_shadow", color = "#04080FAA", size = -10) filters += filter(type = "drop_shadow", color = "#04080FAA", size = -15) filters += filter(type = "drop_shadow", color = "#04080FAA", size = -20) @@ -93,13 +91,6 @@ else remove_filter("ambient_occlusion") -//Reserved to chat messages, so they are still displayed above the field of vision masking. -/obj/screen/plane_master/chat_messages - name = "chat messages plane master" - plane = CHAT_PLANE - appearance_flags = PLANE_MASTER - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - ///Contains all shadow cone masks, whose image overrides are displayed only to their respective owners. /obj/screen/plane_master/field_of_vision name = "field of vision mask plane master" @@ -135,10 +126,14 @@ blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT +/obj/screen/plane_master/lighting/backdrop(mob/mymob) + mymob.overlay_fullscreen("lighting_backdrop_lit", /obj/screen/fullscreen/lighting_backdrop/lit) + mymob.overlay_fullscreen("lighting_backdrop_unlit", /obj/screen/fullscreen/lighting_backdrop/unlit) + /obj/screen/plane_master/lighting/Initialize() . = ..() - filters += filter(type="alpha", render_source=EMISSIVE_RENDER_TARGET, flags=MASK_INVERSE) - filters += filter(type="alpha", render_source=EMISSIVE_UNBLOCKABLE_RENDER_TARGET, flags=MASK_INVERSE) + filters += filter(type="alpha", render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE) + filters += filter(type="alpha", render_source = EMISSIVE_UNBLOCKABLE_RENDER_TARGET, flags = MASK_INVERSE) /** * Things placed on this mask the lighting plane. Doesn't render directly. @@ -186,7 +181,6 @@ render_target = EMISSIVE_BLOCKER_RENDER_TARGET ///Contains space parallax - /obj/screen/plane_master/parallax name = "parallax plane master" plane = PLANE_SPACE_PARALLAX @@ -197,12 +191,16 @@ name = "parallax whitifier plane master" plane = PLANE_SPACE -/obj/screen/plane_master/lighting/backdrop(mob/mymob) - mymob.overlay_fullscreen("lighting_backdrop_lit", /obj/screen/fullscreen/lighting_backdrop/lit) - mymob.overlay_fullscreen("lighting_backdrop_unlit", /obj/screen/fullscreen/lighting_backdrop/unlit) - /obj/screen/plane_master/camera_static name = "camera static plane master" plane = CAMERA_STATIC_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY + + +//Reserved to chat messages, so they are still displayed above the field of vision masking. +/obj/screen/plane_master/chat_messages + name = "runechat plane master" + plane = CHAT_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_OVERLAY diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 1ead41d513..929e01c6d9 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -318,4 +318,4 @@ GLOBAL_LIST_EMPTY(radial_menus) if(istype(custom_check)) if(!custom_check.Invoke()) return - return answer \ No newline at end of file + return answer diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 126cc18907..64515260ec 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -12,9 +12,27 @@ layer = HUD_LAYER plane = HUD_PLANE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + animate_movement = SLIDE_STEPS + speech_span = SPAN_ROBOT + vis_flags = VIS_INHERIT_PLANE appearance_flags = APPEARANCE_UI - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/datum/hud/hud = null // A reference to the owner HUD, if any. + /// A reference to the object in the slot. Grabs or items, generally. + var/obj/master = null + /// A reference to the owner HUD, if any. + var/datum/hud/hud = null + /** + * Map name assigned to this object. + * Automatically set by /client/proc/add_obj_to_map. + */ + var/assigned_map + /** + * Mark this object as garbage-collectible after you clean the map + * it was registered on. + * + * This could probably be changed to be a proc, for conditional removal. + * But for now, this works. + */ + var/del_on_map_removal = TRUE /obj/screen/take_damage() return @@ -47,7 +65,17 @@ name = "swap hand" /obj/screen/swap_hand/Click() - usr.swap_hand() + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + // if(world.time <= usr.next_move) + // return 1 + + if(usr.incapacitated()) + return 1 + + if(ismob(usr)) + var/mob/M = usr + M.swap_hand() return 1 /obj/screen/craft @@ -83,17 +111,27 @@ H.open_language_menu(usr) /obj/screen/inventory - var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. - var/icon_empty // Icon when empty. For now used only by humans. - var/icon_full // Icon when contains an item. For now used only by humans. + /// The identifier for the slot. It has nothing to do with ID cards. + var/slot_id + /// Icon when empty. For now used only by humans. + var/icon_empty + /// Icon when contains an item. For now used only by humans. + var/icon_full + /// The overlay when hovering over with an item in your hand var/list/object_overlays = list() layer = HUD_LAYER plane = HUD_PLANE /obj/screen/inventory/Click(location, control, params) - if(hud?.mymob && (hud.mymob != usr)) - return - // just redirect clicks + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + // if(world.time <= usr.next_move) + // return TRUE + + if(usr.incapacitated()) // ignore_stasis = TRUE + return TRUE + if(ismecha(usr.loc)) // stops inventory actions in a mech + return TRUE if(hud?.mymob && slot_id) var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) @@ -137,12 +175,13 @@ var/image/item_overlay = image(holding) item_overlay.alpha = 92 - if(!user.can_equip(holding, slot_id, TRUE, TRUE, TRUE)) + if(!user.can_equip(holding, slot_id, TRUE)) item_overlay.color = "#FF0000" else item_overlay.color = "#00ff00" - object_overlays += item_overlay + cut_overlay(object_overlays) + // object_overlay = item_overlay add_overlay(object_overlays) /obj/screen/inventory/hand @@ -174,10 +213,17 @@ /obj/screen/inventory/hand/Click(location, control, params) - if(hud?.mymob && (hud.mymob != usr)) - return - var/mob/user = hud.mymob - // just redirect clicks + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + var/mob/user = hud?.mymob + if(usr != user) + return TRUE + // if(world.time <= user.next_move) + // return TRUE + if(user.incapacitated()) + return TRUE + if (ismecha(user.loc)) // stops inventory actions in a mech + return TRUE if(user.active_hand_index == held_index) var/obj/item/I = user.get_active_held_item() @@ -305,6 +351,10 @@ icon = 'icons/mob/screen_midnight.dmi' icon_state = "running" +/obj/screen/mov_intent/Initialize(mapload) + . = ..() + update_icon() + /obj/screen/mov_intent/Click() toggle(usr) @@ -313,7 +363,7 @@ if(MOVE_INTENT_WALK) icon_state = "walking" if(MOVE_INTENT_RUN) - icon_state = "running" + icon_state = CONFIG_GET(flag/sprint_enabled)? "running" : "running_nosprint" /obj/screen/mov_intent/proc/toggle(mob/user) if(isobserver(user)) diff --git a/code/_onclick/hud/screen_objects/stamina.dm b/code/_onclick/hud/screen_objects/stamina.dm index 5484014f8f..98a387d32d 100644 --- a/code/_onclick/hud/screen_objects/stamina.dm +++ b/code/_onclick/hud/screen_objects/stamina.dm @@ -11,7 +11,9 @@ /obj/screen/staminas/Click(location,control,params) if(isliving(usr)) var/mob/living/L = usr - to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
Your stamina buffer can take [L.stambuffer] stamina loss, and recharges at no cost.
Your stamina buffer is [(L.stambuffer*(100/L.stambuffer))-(L.bufferedstam*(100/L.stambuffer))]% full.
") + CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/buffer_max, buffer_max) + to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
\ +
Your stamina buffer is [round((L.stamina_buffer / buffer_max) * 100, 0.1)]% full.
") /obj/screen/staminas/update_icon_state() var/mob/living/carbon/user = hud?.mymob @@ -24,6 +26,19 @@ else icon_state = "stamina[clamp(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]" +/obj/screen/staminas/update_overlays() + . = ..() + var/mob/living/carbon/user = hud?.mymob + if(!user) + return + var/percent = user.getStaminaLoss() / STAMINA_CRIT + if((user.stat == DEAD) || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2)) + . += list("stamina_alert3") + else if(percent >= 0.85) + . += list("stamina_alert2") + else if(percent >= 0.7) + . += list("stamina_alert1") + //stam buffer /obj/screen/staminabuffer icon = 'modular_citadel/icons/ui/screen_gen.dmi' @@ -33,29 +48,33 @@ layer = ABOVE_HUD_LAYER + 0.1 mouse_opacity = 0 -/obj/screen/staminabuffer/update_icon_state() +/obj/screen/staminabuffer/proc/mark_dirty() + if(update_to_mob()) + START_PROCESSING(SShuds, src) + +/obj/screen/staminabuffer/process() + if(!update_to_mob()) + return PROCESS_KILL + +/obj/screen/staminabuffer/Destroy() + STOP_PROCESSING(SShuds, src) + return ..() + +/obj/screen/staminabuffer/proc/update_to_mob() var/mob/living/carbon/user = hud?.mymob - if(!user) - return + user.UpdateStaminaBuffer(FALSE) + CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/buffer_max, buffer_max) + if(!user?.client) + return FALSE if(user.stat == DEAD || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2)) - icon_state = "stambuffer7" - else if(user.hal_screwyhud == 5) icon_state = "stambuffer0" + return FALSE + else if(user.hal_screwyhud == 5) + icon_state = "stambuffer29" + return FALSE + else if(user.stamina_buffer >= buffer_max) + icon_state = "stambuffer29" + return FALSE else - switch(user.bufferedstam / user.stambuffer) - if(0.95 to INFINITY) - icon_state = "stambuffer7" - if(0.9 to 0.95) - icon_state = "stambuffer6" - if(0.8 to 0.9) - icon_state = "stambuffer5" - if(0.6 to 0.8) - icon_state = "stambuffer4" - if(0.4 to 0.6) - icon_state = "stambuffer3" - if(0.2 to 0.4) - icon_state = "stambuffer2" - if(0.05 to 0.2) - icon_state = "stambuffer1" - else - icon_state = "stambuffer0" + icon_state = "stambuffer[FLOOR((user.stamina_buffer / buffer_max) * 29, 1)]" + return TRUE diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 9e88476513..7a614da07b 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -86,6 +86,9 @@ to_chat(user, "You don't want to harm other living beings!") return + if(!UseStaminaBufferStandard(user, STAM_COST_ATTACK_MOB_MULT, null, TRUE)) + return DISCARD_LAST_ACTION + if(!force) playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1) else if(hitsound) @@ -100,10 +103,6 @@ log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) - var/weight = getweight(user, STAM_COST_ATTACK_MOB_MULT) //CIT CHANGE - makes attacking things cause stamina loss - if(weight) - user.adjustStaminaLossBuffered(weight) - // CIT SCREENSHAKE if(force >= 15) shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) @@ -120,31 +119,21 @@ if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) return if(item_flags & NOBLUDGEON) - return + return DISCARD_LAST_ACTION + if(!UseStaminaBufferStandard(user, STAM_COST_ATTACK_OBJ_MULT, warn = TRUE)) + return DISCARD_LAST_ACTION user.do_attack_animation(O) O.attacked_by(src, user) - var/weight = getweight(user, STAM_COST_ATTACK_OBJ_MULT) - if(weight) - user.adjustStaminaLossBuffered(weight)//CIT CHANGE - makes attacking things cause stamina loss /atom/movable/proc/attacked_by() return /obj/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) var/totitemdamage = I.force * damage_multiplier - var/bad_trait - - var/stamloss = user.getStaminaLoss() - if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do. - var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY - totitemdamage *= 1 - penalty - - if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - bad_trait = SKILL_COMBAT_MODE //blacklist combat skills. if(I.used_skills && user.mind) if(totitemdamage) - totitemdamage = user.mind.item_action_skills_mod(I, totitemdamage, I.skill_difficulty, SKILL_ATTACK_OBJ, bad_trait) + totitemdamage = user.mind.item_action_skills_mod(I, totitemdamage, I.skill_difficulty, SKILL_ATTACK_OBJ) for(var/skill in I.used_skills) if(!(SKILL_TRAIN_ATTACK_OBJ in I.used_skills[skill])) continue @@ -187,28 +176,15 @@ if(!.) return - var/stamloss = user.getStaminaLoss() var/stam_mobility_mult = 1 - if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do. - var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY - stam_mobility_mult -= penalty if(stam_mobility_mult > LYING_DAMAGE_PENALTY && !CHECK_MOBILITY(user, MOBILITY_STAND)) //damage penalty for fighting prone, doesn't stack with the above. stam_mobility_mult = LYING_DAMAGE_PENALTY . *= stam_mobility_mult - var/bad_trait - if(!(I.item_flags & NO_COMBAT_MODE_FORCE_MODIFIER)) - if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - bad_trait = SKILL_COMBAT_MODE //blacklist combat skills. - if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) - . *= 0.8 - else if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - . *= 1.2 - if(!user.mind || !I.used_skills) return if(.) - . = user.mind.item_action_skills_mod(I, ., I.skill_difficulty, SKILL_ATTACK_MOB, bad_trait) + . = user.mind.item_action_skills_mod(I, ., I.skill_difficulty, SKILL_ATTACK_MOB) for(var/skill in I.used_skills) if(!(SKILL_TRAIN_ATTACK_MOB in I.used_skills[skill])) continue @@ -263,21 +239,23 @@ . = (total_mass || w_class * STAM_COST_W_CLASS_MULT) * multiplier if(!user) return - var/bad_trait - if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - . *= STAM_COST_NO_COMBAT_MULT - bad_trait = SKILL_COMBAT_MODE if(used_skills && user.mind) - . = user.mind.item_action_skills_mod(src, ., skill_difficulty, trait, bad_trait, FALSE) - var/total_health = user.getStaminaLoss() - . = clamp(., 0, STAMINA_NEAR_CRIT - total_health) + . = user.mind.item_action_skills_mod(src, ., skill_difficulty, trait, null, FALSE) + +/** + * Uses the amount of stamina required for a standard hit + */ +/obj/item/proc/UseStaminaBufferStandard(mob/living/user, multiplier = 1, trait = SKILL_STAMINA_COST, warn = TRUE) + ASSERT(user) + var/cost = getweight(user, multiplier, trait) + return user.UseStaminaBuffer(cost, warn) /// How long this staggers for. 0 and negatives supported. /obj/item/proc/melee_stagger_duration(force_override) if(!isnull(stagger_force)) return stagger_force /// totally not an untested, arbitrary equation. - return clamp((1.5 + (w_class/7.5)) * ((force_override || force) / 2), 0, 10 SECONDS) + return clamp((1.5 + (w_class/5)) * ((force_override || force) / 1.5), 0, 10 SECONDS) /obj/item/proc/do_stagger_action(mob/living/target, mob/living/user, force_override) if(!CHECK_BITFIELD(target.status_flags, CANSTAGGER)) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 975c6e62d4..073f50d8c5 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -36,7 +36,7 @@ return . | A.attack_hand(src, intent, .) /atom/proc/attack_hand(mob/user, act_intent = user.a_intent, attackchain_flags) - SHOULD_NOT_SLEEP(TRUE) + //SHOULD_NOT_SLEEP(TRUE) if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND)) add_fingerprint(user) if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND) diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 3782d8be94..19fef28597 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -3,7 +3,7 @@ name = "Initializing..." var/target -INITIALIZE_IMMEDIATE(/obj/effect/statclick) //it's new, but rebranded. +INITIALIZE_IMMEDIATE(/obj/effect/statclick) /obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical . = ..() @@ -33,14 +33,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) //it's new, but rebranded. usr.client.debug_variables(target) message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].") -/obj/effect/statclick/misc_subsystems/Click() - if(!usr.client.holder) - return - var/subsystem = input(usr, "Debug which subsystem?", "Debug nonprocessing subsystem") as null|anything in (Master.subsystems - Master.statworthy_subsystems) - if(!subsystem) - return - usr.client.debug_variables(subsystem) - message_admins("Admin [key_name_admin(usr)] is debugging the [subsystem] subsystem.") // Debug verbs. /client/proc/restart_controller(controller in list("Master", "Failsafe")) diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 259082a6ba..ea5c861cd4 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -27,7 +27,10 @@ /datum/config_entry/New() if(type == abstract_type) CRASH("Abstract config entry [type] instatiated!") - name = lowertext(type2top(type)) + if(!name) + name = lowertext(type2top(type)) + else + name = lowertext(name) if(islist(config_entry_value)) var/list/L = config_entry_value default = L.Copy() diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 3ea4d0a870..9d5110daf5 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -388,15 +388,26 @@ Example config: var/list/probabilities = Get(/datum/config_entry/keyed_list/storyteller_weight) var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) var/list/min_player_counts = Get(/datum/config_entry/keyed_list/storyteller_min_players) + var/list/storyteller_min_chaos = Get(/datum/config_entry/keyed_list/storyteller_min_chaos) + var/list/storyteller_max_chaos = Get(/datum/config_entry/keyed_list/storyteller_max_chaos) for(var/T in storyteller_cache) var/datum/dynamic_storyteller/S = T var/config_tag = initial(S.config_tag) + if(!config_tag) + continue var/probability = (config_tag in probabilities) ? probabilities[config_tag] : initial(S.weight) var/min_players = (config_tag in min_player_counts) ? min_player_counts[config_tag] : initial(S.min_players) if(probability <= 0) continue if(length(GLOB.player_list) < min_players) continue + if(!Get(/datum/config_entry/flag/no_storyteller_threat_removal)) + var/min_chaos = (probabilities in storyteller_min_chaos) ? storyteller_min_chaos[config_tag] : initial(S.min_chaos) + var/max_chaos = (probabilities in storyteller_max_chaos) ? storyteller_max_chaos[config_tag] : initial(S.max_chaos) + if(SSpersistence.average_dynamic_threat < min_chaos) + continue + if(SSpersistence.average_dynamic_threat > max_chaos) + continue if(SSpersistence.saved_storytellers.len == repeated_mode_adjust.len) var/name = initial(S.name) var/recent_round = min(SSpersistence.saved_storytellers.Find(name),3) diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm index 44d9a041a6..935164352e 100644 --- a/code/controllers/configuration/entries/dynamic.dm +++ b/code/controllers/configuration/entries/dynamic.dm @@ -1,5 +1,7 @@ /datum/config_entry/flag/dynamic_voting +/datum/config_entry/flag/no_storyteller_threat_removal + /datum/config_entry/number/dynamic_high_pop_limit config_entry_value = 55 min_val = 1 @@ -67,6 +69,9 @@ /datum/config_entry/number/dynamic_third_rule_high_pop_requirement config_entry_value = 70 +/datum/config_entry/number/dynamic_threat_baseline + config_entry_value = 50 + /datum/config_entry/number_list/dynamic_hijack_requirements /datum/config_entry/number/dynamic_hijack_high_population_requirement @@ -74,7 +79,7 @@ /datum/config_entry/number/dynamic_hijack_cost config_entry_value = 5 - + /datum/config_entry/number/dynamic_glorious_death_cost config_entry_value = 5 @@ -96,3 +101,11 @@ /datum/config_entry/keyed_list/storyteller_min_players key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/storyteller_min_chaos + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/storyteller_max_chaos + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 8f55293820..4034722417 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -230,14 +230,7 @@ /datum/config_entry/keyed_list/multiplicative_movespeed key_mode = KEY_MODE_TYPE value_mode = VALUE_MODE_NUM - config_entry_value = list( //DEFAULTS - /mob/living/simple_animal = 1, - /mob/living/silicon/pai = 1, - /mob/living/carbon/alien/humanoid/sentinel = 0.25, - /mob/living/carbon/alien/humanoid/drone = 0.5, - /mob/living/carbon/alien/humanoid/royal/praetorian = 1, - /mob/living/carbon/alien/humanoid/royal/queen = 3 - ) + abstract_type = /datum/config_entry/keyed_list/multiplicative_movespeed /datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() . = ..() @@ -249,6 +242,26 @@ if(. && (var_name == NAMEOF(src, config_entry_value))) update_config_movespeed_type_lookup(TRUE) +/datum/config_entry/keyed_list/multiplicative_movespeed/normal + name = "multiplicative_movespeed" + config_entry_value = list( //DEFAULTS + /mob/living/simple_animal = 1, + /mob/living/silicon/pai = 1, + /mob/living/carbon/alien/humanoid/sentinel = 0.25, + /mob/living/carbon/alien/humanoid/drone = 0.5, + /mob/living/carbon/alien/humanoid/royal/praetorian = 1, + /mob/living/carbon/alien/humanoid/royal/queen = 3 + ) + +/datum/config_entry/keyed_list/multiplicative_movespeed/floating + name = "multiplicative_movespeed_floating" + config_entry_value = list( + /mob/living = 0, + /mob/living/carbon/alien/humanoid = 0, + /mob/living/carbon/alien/humanoid/royal/praetorian = 0, + /mob/living/carbon/alien/humanoid/royal/queen = 2 + ) + /datum/config_entry/number/movedelay //Used for modifying movement speed for mobs. abstract_type = /datum/config_entry/number/movedelay integer = FALSE @@ -277,9 +290,26 @@ var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/walk) M.sync() +/datum/config_entry/flag/sprint_enabled + config_entry_value = TRUE + +/datum/config_entry/flag/sprint_enabled/ValidateAndSet(str_val) + . = ..() + for(var/datum/hud/human/H) + H.assert_move_intent_ui() + if(!config_entry_value) // disabled + for(var/mob/living/L in world) + L.disable_intentional_sprint_mode() + /datum/config_entry/number/movedelay/sprint_speed_increase config_entry_value = 1 +/datum/config_entry/number/movedelay/sprint_max_tiles_increase + config_entry_value = 5 + +/datum/config_entry/number/movedelay/sprint_absolute_max_tiles + config_entry_value = 13 + /datum/config_entry/number/movedelay/sprint_buffer_max config_entry_value = 24 @@ -291,7 +321,7 @@ /////////////////////////////////////////////////Outdated move delay /datum/config_entry/number/outdated_movedelay - deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed + deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed/normal abstract_type = /datum/config_entry/number/outdated_movedelay var/movedelay_type @@ -465,6 +495,8 @@ /datum/config_entry/flag/modetier_voting +/datum/config_entry/flag/must_be_readied_to_vote_gamemode + /datum/config_entry/number/dropped_modes config_entry_value = 3 @@ -490,21 +522,21 @@ //Body size configs, the feature will be disabled if both min and max have the same value. /datum/config_entry/number/body_size_min - config_entry_value = RESIZE_DEFAULT_SIZE + config_entry_value = 0.9 min_val = 0.1 //to avoid issues with zeros and negative values. max_val = RESIZE_DEFAULT_SIZE integer = FALSE /datum/config_entry/number/body_size_max - config_entry_value = RESIZE_DEFAULT_SIZE + config_entry_value = 1.25 min_val = RESIZE_DEFAULT_SIZE integer = FALSE -//Pun-Pun movement slowdown given to characters with a body size smaller than this value, +//Penalties given to characters with a body size smaller than this value, //to compensate for their smaller hitbox. //To disable, just make sure the value is lower than 'body_size_min' -/datum/config_entry/number/threshold_body_size_slowdown - config_entry_value = RESIZE_DEFAULT_SIZE * 0.85 +/datum/config_entry/number/threshold_body_size_penalty + config_entry_value = RESIZE_DEFAULT_SIZE min_val = 0 max_val = RESIZE_DEFAULT_SIZE integer = FALSE @@ -512,8 +544,8 @@ //multiplicative slowdown multiplier. See 'dna.update_body_size' for the operation. //doesn't apply to floating or crawling mobs /datum/config_entry/number/body_size_slowdown_multiplier - config_entry_value = 0.25 - min_val = 0.1 //To encourage folks to disable the slowdown through the above config instead. + config_entry_value = 0 + min_val = 0 integer = FALSE //Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. @@ -547,3 +579,20 @@ config_entry_value = 0.333 min_val = 0 integer = FALSE + +/// Amount of dirtyness tiles need to spawn dirt. +/datum/config_entry/number/turf_dirt_threshold + config_entry_value = 100 + min_val = 1 + integer = TRUE + +/// Alpha dirt starts at +/datum/config_entry/number/dirt_alpha_starting + config_entry_value = 127 + max_val = 255 + min_val = 0 + integer = TRUE + +/// Dirtyness multiplier for making turfs dirty +/datum/config_entry/number/turf_dirty_multiplier + config_entry_value = 1 diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 273ac7fd3e..4d985c7234 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -26,50 +26,6 @@ /datum/config_entry/flag/hub // if the game appears on the hub or not -/datum/config_entry/flag/log_ooc // log OOC channel - -/datum/config_entry/flag/log_access // log login/logout - -/datum/config_entry/flag/log_say // log client say - -/datum/config_entry/flag/log_admin // log admin actions - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/log_prayer // log prayers - -/datum/config_entry/flag/log_law // log lawchanges - -/datum/config_entry/flag/log_game // log game events - -/datum/config_entry/flag/log_virus // log virology data - -/datum/config_entry/flag/log_vote // log voting - -/datum/config_entry/flag/log_craft // log crafting - -/datum/config_entry/flag/log_whisper // log client whisper - -/datum/config_entry/flag/log_attack // log attack messages - -/datum/config_entry/flag/log_emote // log emotes - -/datum/config_entry/flag/log_adminchat // log admin chat messages - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/log_shuttle // log shuttle related actions, ie shuttle computers, shuttle manipulator, emergency console - -/datum/config_entry/flag/log_pda // log pda messages - -/datum/config_entry/flag/log_telecomms // log telecomms messages - -/datum/config_entry/flag/log_twitter // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. - -/datum/config_entry/flag/log_world_topic // log all world.Topic() calls - -/datum/config_entry/flag/log_manifest // log crew manifest to seperate file - -/datum/config_entry/flag/log_job_debug // log roundstart divide occupations debug information to a file - /datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour /datum/config_entry/flag/allow_vote_restart // allow votes to restart @@ -172,8 +128,6 @@ /datum/config_entry/string/hostedby -/datum/config_entry/flag/norespawn - /datum/config_entry/flag/guest_jobban /datum/config_entry/flag/usewhitelist @@ -290,7 +244,7 @@ /datum/config_entry/flag/tgstyle_maprotation /datum/config_entry/string/map_vote_type - config_entry_value = "SCORE" + config_entry_value = APPROVAL_VOTING /datum/config_entry/number/maprotatechancedelta config_entry_value = 0.75 @@ -327,6 +281,9 @@ /datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account min_val = 0 +/datum/config_entry/flag/age_verification //are we using the automated age verification which asks users if they're 18+? + config_entry_value = TRUE + /datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? /datum/config_entry/flag/check_randomizer @@ -468,9 +425,8 @@ /datum/config_entry/string/default_view config_entry_value = "15x15" -/datum/config_entry/flag/log_pictures - -/datum/config_entry/flag/picture_logging_camera +/datum/config_entry/string/default_view_square + config_entry_value = "15x15" /datum/config_entry/number/max_bunker_days config_entry_value = 7 diff --git a/code/controllers/configuration/entries/logging.dm b/code/controllers/configuration/entries/logging.dm new file mode 100644 index 0000000000..1cb47d6ab7 --- /dev/null +++ b/code/controllers/configuration/entries/logging.dm @@ -0,0 +1,70 @@ +/datum/config_entry/flag/log_ooc // log OOC channel + config_entry_value = TRUE + +/datum/config_entry/flag/log_access // log login/logout + config_entry_value = TRUE + +/datum/config_entry/flag/log_say // log client say + config_entry_value = TRUE + +/datum/config_entry/flag/log_admin // log admin actions + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/log_prayer // log prayers + config_entry_value = TRUE + +/datum/config_entry/flag/log_law // log lawchanges + config_entry_value = TRUE + +/datum/config_entry/flag/log_game // log game events + config_entry_value = TRUE + +/datum/config_entry/flag/log_virus // log virology data + config_entry_value = TRUE + +/datum/config_entry/flag/log_vote // log voting + config_entry_value = TRUE + +/datum/config_entry/flag/log_craft // log crafting + config_entry_value = TRUE + +/datum/config_entry/flag/log_whisper // log client whisper + config_entry_value = TRUE + +/datum/config_entry/flag/log_attack // log attack messages + config_entry_value = TRUE + +/datum/config_entry/flag/log_emote // log emotes + config_entry_value = TRUE + +/datum/config_entry/flag/log_adminchat // log admin chat messages + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/log_shuttle // log shuttle related actions, ie shuttle computers, shuttle manipulator, emergency console + config_entry_value = TRUE + +/datum/config_entry/flag/log_pda // log pda messages + config_entry_value = TRUE + +/datum/config_entry/flag/log_telecomms // log telecomms messages + config_entry_value = TRUE + +/datum/config_entry/flag/log_twitter // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. + config_entry_value = TRUE + +/datum/config_entry/flag/log_world_topic // log all world.Topic() calls + config_entry_value = TRUE + +/datum/config_entry/flag/log_manifest // log crew manifest to seperate file + config_entry_value = TRUE + +/datum/config_entry/flag/log_job_debug // log roundstart divide occupations debug information to a file + config_entry_value = TRUE + +/datum/config_entry/flag/log_pictures + +/datum/config_entry/flag/picture_logging_camera + +/// forces log_href for tgui +/datum/config_entry/flag/emergency_tgui_logging + config_entry_value = FALSE diff --git a/code/controllers/configuration/entries/persistence.dm b/code/controllers/configuration/entries/persistence.dm new file mode 100644 index 0000000000..2444034b86 --- /dev/null +++ b/code/controllers/configuration/entries/persistence.dm @@ -0,0 +1,20 @@ +/// Whether or not to use the persistence system for cleanable objects +/datum/config_entry/flag/persistent_debris + config_entry_value = FALSE + +/// Whether or not to nuke all roundstart debris that isn't due to persistence if the above is true +/datum/config_entry/flag/persistent_debris_only + config_entry_value = TRUE + +/// Max amount of objects to store, total +/datum/config_entry/number/persistent_debris_global_max + config_entry_value = 10000 + integer = TRUE + +/// Max amount of objects to store per type +/datum/config_entry/number/persistent_debris_type_max + config_entry_value = 2000 + integer = TRUE + +/// Wipe dirty stuff on nuke +/datum/config_entry/flag/persistent_debris_wipe_on_nuke diff --git a/code/controllers/configuration/entries/respawns.dm b/code/controllers/configuration/entries/respawns.dm new file mode 100644 index 0000000000..40c7d248a4 --- /dev/null +++ b/code/controllers/configuration/entries/respawns.dm @@ -0,0 +1,47 @@ +/// Allows usage of respawn system +/datum/config_entry/flag/respawns_enabled + config_entry_value = FALSE + +/// Minutes before allowing respawns. +/datum/config_entry/number/respawn_delay + config_entry_value = 15.0 + integer = FALSE + +/// Minutes before allowing respawn, if user cryo'd. +/datum/config_entry/number/respawn_delay_cryo + config_entry_value = 5.0 + integer = FALSE + +/// Allows respawning as non-assistant. Overrides all others of this type. +/datum/config_entry/flag/allow_non_assistant_respawn + config_entry_value = FALSE + +/// Allows respawning as a combat role, defined as security/head. +/datum/config_entry/flag/allow_combat_role_respawn + config_entry_value = FALSE + +/// Allows respawning as the same character as a previous life +/datum/config_entry/flag/allow_same_character_respawn + config_entry_value = FALSE + +/// Observing penalizes for respawns, not just joining. +/datum/config_entry/flag/respawn_penalty_includes_observe + config_entry_value = FALSE + +/// Minutes from roundstart before someone can respawn +/datum/config_entry/number/respawn_minimum_delay_roundstart + config_entry_value = 30.0 + integer = FALSE + +/// Gamemode config tags that are banned from respawning +/datum/config_entry/keyed_list/respawn_chaos_gamemodes + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/respawn_chaos_gamemodes/ValidateListEntry(key_name, key_value) + . = ..() + return . && (key_name in config.modes) + +/datum/config_entry/keyed_list/respawn_chaos_gamemodes/preprocess_key(key) + . = ..() + return lowertext(key) diff --git a/code/controllers/configuration/entries/stamina_combat.dm b/code/controllers/configuration/entries/stamina_combat.dm new file mode 100644 index 0000000000..65580899f1 --- /dev/null +++ b/code/controllers/configuration/entries/stamina_combat.dm @@ -0,0 +1,35 @@ +/datum/config_entry/number/stamina_combat + integer = FALSE + abstract_type = /datum/config_entry/number/stamina_combat + +/// Maximum stamina buffer +/datum/config_entry/number/stamina_combat/buffer_max + config_entry_value = 25 + +/// Seconds until percent_regeneration_out_of_combat kicks in +/datum/config_entry/number/stamina_combat/out_of_combat_timer + config_entry_value = 15 + +/// Base regeneration per second +/datum/config_entry/number/stamina_combat/base_regeneration + config_entry_value = 0.5 + +/// Combat mode regeneration per second +/datum/config_entry/number/stamina_combat/combat_regeneration + config_entry_value = 5 + +/// After out_of_combat_timer elapses, additionally regenerate this percent of total stamina per second. Unaffected by combat mode. +/datum/config_entry/number/stamina_combat/percent_regeneration_out_of_combat + config_entry_value = 30 + +/// Seconds after an action for which your regeneration is penalized +/datum/config_entry/number/stamina_combat/post_action_penalty_delay + config_entry_value = 5 + +/// Factor to multiply by for penalizing post-action-stamina-regen +/datum/config_entry/number/stamina_combat/post_action_penalty_factor + config_entry_value = 0.25 + +/// Factor to multiply by for stamina usage past buffer into health +/datum/config_entry/number/stamina_combat/overdraw_penalty_factor + config_entry_value = 1.5 diff --git a/code/controllers/configuration_citadel.dm b/code/controllers/configuration_citadel.dm index a1e70c9e7e..1c4efebb42 100644 --- a/code/controllers/configuration_citadel.dm +++ b/code/controllers/configuration_citadel.dm @@ -5,4 +5,4 @@ var/discord_url = "hfdksjhfa.com" var/discord_password var/announce_watchlist = 0 - var/announce_adminhelps = 0 \ No newline at end of file + var/announce_adminhelps = 0 diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index 22f047a297..a15056e442 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -1,7 +1,7 @@ /** - * Failsafe - * - * Pretty much pokes the MC to make sure it's still alive. + * Failsafe + * + * Pretty much pokes the MC to make sure it's still alive. **/ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) @@ -97,4 +97,4 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) /datum/controller/failsafe/stat_entry(msg) msg = "Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])" - return msg \ No newline at end of file + return msg diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 1b5c7e5e83..59ac68960c 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -1,10 +1,10 @@ - /** - * StonedMC - * - * Designed to properly split up a given tick among subsystems - * Note: if you read parts of this code and think "why is it doing it that way" - * Odds are, there is a reason - * +/** + * StonedMC + * + * Designed to properly split up a given tick among subsystems + * Note: if you read parts of this code and think "why is it doing it that way" + * Odds are, there is a reason + * **/ //This is the ABSOLUTE ONLY THING that should init globally like this @@ -28,8 +28,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // List of subsystems to process(). var/list/subsystems - /// List of subsystems to include in the MC stat panel. - var/list/statworthy_subsystems // Vars for keeping track of tick drift. var/init_timeofday @@ -41,7 +39,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new ///Only run ticker subsystems for the next n ticks. var/skip_ticks = 0 - var/make_runtime = 0 + var/make_runtime = FALSE var/initializations_finished_with_no_players_logged_in //I wonder what this could be? @@ -67,9 +65,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new //used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits var/static/current_ticklimit = TICK_LIMIT_RUNNING - /// Statclick for misc subsystems - var/obj/effect/statclick/misc_subsystems/misc_statclick - /datum/controller/master/New() if(!config) config = new @@ -96,11 +91,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new _subsystems += new I Master = src - // We want to see all subsystems during init. - statworthy_subsystems = subsystems.Copy() - - misc_statclick = new(null, "Debug") - if(!GLOB) new /datum/controller/global_vars @@ -217,7 +207,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // Sort subsystems by display setting for easy access. sortTim(subsystems, /proc/cmp_subsystem_display) // Set world options. - world.fps = CONFIG_GET(number/fps) + world.change_fps(CONFIG_GET(number/fps)) var/initialized_tod = REALTIMEOFDAY if(tgs_prime) @@ -271,14 +261,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/list/tickersubsystems = list() var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel var/timer = world.time - statworthy_subsystems = list() for (var/thing in subsystems) var/datum/controller/subsystem/SS = thing if (SS.flags & SS_NO_FIRE) - if(SS.flags & SS_ALWAYS_SHOW_STAT) - statworthy_subsystems += SS continue - statworthy_subsystems += SS SS.queued_time = 0 SS.queue_next = null SS.queue_prev = null diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index e49da32557..12798f3863 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -23,7 +23,7 @@ var/priority = FIRE_PRIORITY_DEFAULT /// [Subsystem Flags][SS_NO_INIT] to control binary behavior. Flags must be set at compile time or before preinit finishes to take full effect. (You can also restart the mc to force them to process again) - var/flags = 0 + var/flags = NONE /// This var is set to TRUE after the subsystem has been initialized. var/initialized = FALSE @@ -114,7 +114,7 @@ //previously, this would have been named 'process()' but that name is used everywhere for different things! //fire() seems more suitable. This is the procedure that gets called every 'wait' deciseconds. //Sleeping in here prevents future fires until returned. -/datum/controller/subsystem/proc/fire(resumed = 0) +/datum/controller/subsystem/proc/fire(resumed = FALSE) flags |= SS_NO_FIRE CRASH("Subsystem [src]([type]) does not fire() but did not set the SS_NO_FIRE flag. Please add the SS_NO_FIRE flag to any subsystem that doesn't fire so it doesn't get added to the processing list and waste cpu.") diff --git a/code/controllers/subsystem/adjacent_air.dm b/code/controllers/subsystem/adjacent_air.dm index ccbf8ffc65..e93db07775 100644 --- a/code/controllers/subsystem/adjacent_air.dm +++ b/code/controllers/subsystem/adjacent_air.dm @@ -33,4 +33,4 @@ SUBSYSTEM_DEF(adjacent_air) if(MC_TICK_CHECK) break else - CHECK_TICK \ No newline at end of file + CHECK_TICK diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index f777c967ae..3c58c90452 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -241,7 +241,8 @@ SUBSYSTEM_DEF(air) return /datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0) - return process_turf_equalize_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag) + if(process_turf_equalize_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)) + pause() /* //cache for sanic speed var/fire_count = times_fired @@ -260,7 +261,8 @@ SUBSYSTEM_DEF(air) */ /datum/controller/subsystem/air/proc/process_active_turfs(resumed = 0) - return process_active_turfs_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag) + if(process_active_turfs_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)) + pause() /* //cache for sanic speed var/fire_count = times_fired @@ -278,7 +280,8 @@ SUBSYSTEM_DEF(air) */ /datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0) - return process_excited_groups_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag) + if(process_excited_groups_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)) + pause() /* if (!resumed) src.currentrun = excited_groups.Copy() diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index 4f02d32ad0..4b43f98290 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(assets) switch (CONFIG_GET(string/asset_transport)) if ("webroot") newtransporttype = /datum/asset_transport/webroot - + if (newtransporttype == transport.type) return diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index b9a4785f49..02aad6dec3 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -10,33 +10,37 @@ SUBSYSTEM_DEF(atoms) var/old_initialized - var/list/late_loaders + var/list/late_loaders = list() var/list/BadInitializeCalls = list() + initialized = INITIALIZATION_INSSATOMS + /datum/controller/subsystem/atoms/Initialize(timeofday) GLOB.fire_overlay.appearance_flags = RESET_COLOR - setupGenetics() + setupGenetics() //to set the mutations' sequence + initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() + initialized = INITIALIZATION_INNEW_REGULAR return ..() /datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) if(initialized == INITIALIZATION_INSSATOMS) return + old_initialized = initialized initialized = INITIALIZATION_INNEW_MAPLOAD - LAZYINITLIST(late_loaders) - var/count var/list/mapload_arg = list(TRUE) + if(atoms) count = atoms.len - for(var/I in atoms) - var/atom/A = I + for(var/I in 1 to count) + var/atom/A = atoms[I] if(!(A.flags_1 & INITIALIZED_1)) - InitAtom(I, mapload_arg) + InitAtom(A, mapload_arg) CHECK_TICK else count = 0 @@ -49,15 +53,16 @@ SUBSYSTEM_DEF(atoms) testing("Initialized [count] atoms") pass(count) - initialized = INITIALIZATION_INNEW_REGULAR + initialized = old_initialized if(late_loaders.len) - for(var/I in late_loaders) - var/atom/A = I + for(var/I in 1 to late_loaders.len) + var/atom/A = late_loaders[I] A.LateInitialize() testing("Late initialized [late_loaders.len] atoms") late_loaders.Cut() +/// Init this specific atom /datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) var/the_type = A.type if(QDELING(A)) @@ -150,8 +155,3 @@ SUBSYSTEM_DEF(atoms) var/initlog = InitLog() if(initlog) text2file(initlog, "[GLOB.log_directory]/initialize.log") - -#undef BAD_INIT_QDEL_BEFORE -#undef BAD_INIT_DIDNT_INIT -#undef BAD_INIT_SLEPT -#undef BAD_INIT_NO_HINT diff --git a/code/controllers/subsystem/autotransfer.dm b/code/controllers/subsystem/autotransfer.dm index ece203abba..0afa07939e 100644 --- a/code/controllers/subsystem/autotransfer.dm +++ b/code/controllers/subsystem/autotransfer.dm @@ -37,4 +37,4 @@ SUBSYSTEM_DEF(autotransfer) else SSshuttle.autoEnd() -#undef NO_MAXVOTES_CAP \ No newline at end of file +#undef NO_MAXVOTES_CAP diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index dc1f246e3d..bacccefc61 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -14,12 +14,14 @@ SUBSYSTEM_DEF(blackbox) "explosion" = 2, "time_dilation_current" = 3, "science_techweb_unlock" = 2, - "round_end_stats" = 2) //associative list of any feedback variables that have had their format changed since creation and their current version, remember to update this + "round_end_stats" = 2, + "testmerged_prs" = 2) //associative list of any feedback variables that have had their format changed since creation and their current version, remember to update this /datum/controller/subsystem/blackbox/Initialize() triggertime = world.time record_feedback("amount", "random_seed", Master.random_seed) record_feedback("amount", "dm_version", DM_VERSION) + record_feedback("amount", "dm_build", DM_BUILD) record_feedback("amount", "byond_version", world.byond_version) record_feedback("amount", "byond_build", world.byond_build) . = ..() @@ -39,10 +41,7 @@ SUBSYSTEM_DEF(blackbox) if(!SSdbcore.Connect()) return - var/playercount = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - playercount += 1 + var/playercount = LAZYLEN(GLOB.player_list) var/admincount = GLOB.admins.len var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port, round_id) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]')") query_record_playercount.Execute() @@ -88,18 +87,24 @@ SUBSYSTEM_DEF(blackbox) if (!SSdbcore.Connect()) return + // var/list/special_columns = list( + // "datetime" = "NOW()" + // ) var/list/sqlrowlist = list() - for (var/datum/feedback_variable/FV in feedback) - var/sqlversion = 1 - if(FV.key in versions) - sqlversion = versions[FV.key] - sqlrowlist += list(list("datetime" = "Now()", "round_id" = GLOB.round_id, "key_name" = "'[sanitizeSQL(FV.key)]'", "key_type" = "'[FV.key_type]'", "version" = "[sqlversion]", "json" = "'[sanitizeSQL(json_encode(FV.json))]'")) + sqlrowlist += list(list( + "datetime" = "Now()", //legacy + "round_id" = GLOB.round_id, + "key_name" = sanitizeSQL(FV.key), + "key_type" = FV.key_type, + "version" = versions[FV.key] || 1, + "json" = sanitizeSQL(json_encode(FV.json)) + )) if (!length(sqlrowlist)) return - SSdbcore.MassInsert(format_table_name("feedback"), sqlrowlist, ignore_errors = TRUE, delayed = TRUE) + SSdbcore.MassInsert(format_table_name("feedback"), sqlrowlist, ignore_errors = TRUE, delayed = TRUE)//, special_columns = special_columns) /datum/controller/subsystem/blackbox/proc/Seal() if(sealed) @@ -169,7 +174,7 @@ feedback data can be recorded in 5 formats: "tally" used to track the number of occurances of multiple related values i.e. how many times each type of gun is fired further calls to the same key will: - add or subtract from the saved value of the data key if it already exists + add or subtract from the saved value of the data key if it already exists append the key and it's value if it doesn't exist calls: SSblackbox.record_feedback("tally", "example", 1, "sample data") SSblackbox.record_feedback("tally", "example", 4, "sample data") @@ -181,7 +186,7 @@ feedback data can be recorded in 5 formats: the final element in the data list is used as the tracking key, all prior elements are used for nesting all data list elements must be strings further calls to the same key will: - add or subtract from the saved value of the data key if it already exists in the same multi-dimensional position + add or subtract from the saved value of the data key if it already exists in the same multi-dimensional position append the key and it's value if it doesn't exist calls: SSblackbox.record_feedback("nested tally", "example", 1, list("fruit", "orange", "apricot")) SSblackbox.record_feedback("nested tally", "example", 2, list("fruit", "orange", "orange")) @@ -270,6 +275,18 @@ Versioning /datum/feedback_variable/New(new_key, new_key_type) key = new_key key_type = new_key_type +/* +/datum/controller/subsystem/blackbox/proc/LogAhelp(ticket, action, message, recipient, sender) + if(!SSdbcore.Connect()) + return + + var/datum/db_query/query_log_ahelp = SSdbcore.NewQuery({" + INSERT INTO [format_table_name("ticket")] (ticket, action, message, recipient, sender, server_ip, server_port, round_id, timestamp) + VALUES (:ticket, :action, :message, :recipient, :sender, INET_ATON(:server_ip), :server_port, :round_id, :time) + "}, list("ticket" = ticket, "action" = action, "message" = message, "recipient" = recipient, "sender" = sender, "server_ip" = world.internet_address || "0", "server_port" = world.port, "round_id" = GLOB.round_id, "time" = SQLtime())) + query_log_ahelp.Execute() + qdel(query_log_ahelp) +*/ /datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L) set waitfor = FALSE diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index f2e9da704f..0e4f8ecad2 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -1,4 +1,4 @@ -/** +/*! * Copyright (c) 2020 Aleksej Komarov * SPDX-License-Identifier: MIT */ diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 4eff4fbf1d..c779c9f26d 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -177,6 +177,25 @@ SUBSYSTEM_DEF(dbcore) return FALSE return new /datum/DBQuery(sql_query, connection) +/datum/controller/subsystem/dbcore/proc/QuerySelect(list/querys, warn = FALSE, qdel = FALSE) + if (!islist(querys)) + if (!istype(querys, /datum/DBQuery)) + CRASH("Invalid query passed to QuerySelect: [querys]") + querys = list(querys) + + for (var/thing in querys) + var/datum/DBQuery/query = thing + if (warn) + INVOKE_ASYNC(query, /datum/DBQuery.proc/warn_execute) + else + INVOKE_ASYNC(query, /datum/DBQuery.proc/Execute) + + for (var/thing in querys) + var/datum/DBQuery/query = thing + UNTIL(!query.in_progress) + if (qdel) + qdel(query) + /* Takes a list of rows (each row being an associated list of column => value) and inserts them via a single mass query. Rows missing columns present in other rows will resolve to SQL NULL @@ -361,5 +380,5 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table //strip sensitive stuff if(findtext(message, ": CreateConnection(")) message = "CreateConnection CENSORED" - + log_sql("BSQL_DEBUG: [message]") diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 3243a8d8c8..6be5a4bdfa 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -1,6 +1,7 @@ PROCESSING_SUBSYSTEM_DEF(dcs) name = "Datum Component System" flags = SS_NO_INIT + wait = 1 SECONDS var/list/elements_by_type = list() diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 078d122aa6..47b00d1125 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -60,9 +60,9 @@ SUBSYSTEM_DEF(economy) secmedsrv_payout() // Payout based on crew safety, health, and mood. civ_payout() // Payout based on ??? Profit car_payout() // Cargo's natural gain in the cash moneys. - for(var/A in bank_accounts) - var/datum/bank_account/B = A - B.payday(1) + for(var/account in bank_accounts) + var/datum/bank_account/bank_account = account + bank_account.payday(1) /datum/controller/subsystem/economy/proc/get_dep_account(dep_id) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 2e4e728191..3660770596 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(events) return ..() -/datum/controller/subsystem/events/fire(resumed = 0) +/datum/controller/subsystem/events/fire(resumed = FALSE) if(!resumed) checkEvent() //only check these if we aren't resuming a paused fire src.currentrun = running.Copy() @@ -37,7 +37,7 @@ SUBSYSTEM_DEF(events) var/datum/thing = currentrun[currentrun.len] currentrun.len-- if(thing) - thing.process() + thing.process(wait * 0.1) else running.Remove(thing) if (MC_TICK_CHECK) @@ -91,16 +91,16 @@ SUBSYSTEM_DEF(events) if(. == EVENT_CANT_RUN)//we couldn't run this event for some reason, set its max_occurrences to 0 E.max_occurrences = 0 else if(. == EVENT_READY) - E.random = TRUE - E.runEvent(TRUE) + E.runEvent(random = TRUE) //allows a client to trigger an event //aka Badmin Central // > Not in modules/admin // REEEEEEEEE +// Why the heck is this here! Took me so damn long to find! /client/proc/forceEvent() set name = "Trigger Event" - set category = "Fun" + set category = "Admin.Events" if(!holder ||!check_rights(R_FUN)) return diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm index 3251285ade..f81c23d186 100644 --- a/code/controllers/subsystem/fire_burning.dm +++ b/code/controllers/subsystem/fire_burning.dm @@ -18,6 +18,7 @@ SUBSYSTEM_DEF(fire_burning) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun + var/delta_time = wait * 0.1 while(currentrun.len) var/obj/O = currentrun[currentrun.len] @@ -28,10 +29,12 @@ SUBSYSTEM_DEF(fire_burning) return continue - if(O.resistance_flags & ON_FIRE) - O.take_damage(20, BURN, "fire", 0) - else - processing -= O + + if(O.resistance_flags & ON_FIRE) //in case an object is extinguished while still in currentrun + if(!(O.resistance_flags & FIRE_PROOF)) + O.take_damage(10 * delta_time, BURN, "fire", 0) + else + O.extinguish() if (MC_TICK_CHECK) return diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 51d56545b6..2d2fac1d13 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -1,3 +1,26 @@ +/*! +## Debugging GC issues + +In order to debug `qdel()` failures, there are several tools available. +To enable these tools, define `TESTING` in [_compile_options.dm](https://github.com/tgstation/-tg-station/blob/master/code/_compile_options.dm). + +First is a verb called "Find References", which lists **every** refererence to an object in the world. This allows you to track down any indirect or obfuscated references that you might have missed. + +Complementing this is another verb, "qdel() then Find References". +This does exactly what you'd expect; it calls `qdel()` on the object and then it finds all references remaining. +This is great, because it means that `Destroy()` will have been called before it starts to find references, +so the only references you'll find will be the ones preventing the object from `qdel()`ing gracefully. + +If you have a datum or something you are not destroying directly (say via the singulo), +the next tool is `QDEL_HINT_FINDREFERENCE`. You can return this in `Destroy()` (where you would normally `return ..()`), +to print a list of references once it enters the GC queue. + +Finally is a verb, "Show qdel() Log", which shows the deletion log that the garbage subsystem keeps. This is helpful if you are having race conditions or need to review the order of deletions. + +Note that for any of these tools to work `TESTING` must be defined. +By using these methods of finding references, you can make your life far, far easier when dealing with `qdel()` failures. +*/ + SUBSYSTEM_DEF(garbage) name = "Garbage" priority = FIRE_PRIORITY_GARBAGE @@ -6,7 +29,7 @@ SUBSYSTEM_DEF(garbage) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY init_order = INIT_ORDER_GARBAGE - var/list/collection_timeout = list(15 SECONDS, 30 SECONDS) // deciseconds to wait before moving something up in the queue to the next level + var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level //Stat tracking var/delslasttick = 0 // number of del()'s we've done this tick @@ -24,10 +47,8 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues - #ifdef LEGACY_REFERENCE_TRACKING var/list/reference_find_on_fail = list() - var/list/reference_find_on_fail_types = list() #endif @@ -99,6 +120,9 @@ SUBSYSTEM_DEF(garbage) state = SS_RUNNING break + + + /datum/controller/subsystem/garbage/proc/HandleQueue(level = GC_QUEUE_CHECK) if (level == GC_QUEUE_CHECK) delslasttick = 0 @@ -115,18 +139,22 @@ SUBSYSTEM_DEF(garbage) lastlevel = level - for (var/refID in queue) - if (!refID) + //We do this rather then for(var/refID in queue) because that sort of for loop copies the whole list. + //Normally this isn't expensive, but the gc queue can grow to 40k items, and that gets costly/causes overrun. + for (var/i in 1 to length(queue)) + var/list/L = queue[i] + if (length(L) < 2) count++ if (MC_TICK_CHECK) return continue - var/GCd_at_time = queue[refID] + var/GCd_at_time = L[1] if(GCd_at_time > cut_off_time) break // Everything else is newer, skip them count++ + var/refID = L[2] var/datum/D D = locate(refID) @@ -135,7 +163,7 @@ SUBSYSTEM_DEF(garbage) ++totalgcs pass_counts[level]++ #ifdef LEGACY_REFERENCE_TRACKING - reference_find_on_fail -= refID //It's deleted we don't care anymore. + reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) return @@ -149,10 +177,10 @@ SUBSYSTEM_DEF(garbage) D.find_references() #elif defined(LEGACY_REFERENCE_TRACKING) if(reference_find_on_fail[refID]) - D.find_references() + D.find_references_legacy() #ifdef GC_FAILURE_HARD_LOOKUP else - D.find_references() + D.find_references_legacy() #endif reference_find_on_fail -= refID #endif @@ -186,27 +214,6 @@ SUBSYSTEM_DEF(garbage) queue.Cut(1,count+1) count = 0 -/datum/controller/subsystem/garbage/proc/Queue(datum/D, level = GC_QUEUE_CHECK) - if (isnull(D)) - return - if (level > GC_QUEUE_COUNT) - HardDelete(D) - return - var/gctime = world.time - var/refid = "\ref[D]" - -#ifdef LEGACY_REFERENCE_TRACKING - if(reference_find_on_fail_types[D.type]) - reference_find_on_fail["\ref[D]"] = TRUE -#endif - - D.gc_destroyed = gctime - var/list/queue = queues[level] - if (queue[refid]) - queue -= refid // Removing any previous references that were GC'd so that the current object will be at the end of the list. - - queue[refid] = gctime - #ifdef LEGACY_REFERENCE_TRACKING /datum/controller/subsystem/garbage/proc/add_type_to_findref(type) if(!ispath(type)) @@ -222,6 +229,24 @@ SUBSYSTEM_DEF(garbage) reference_find_on_fail_types = list() #endif +/datum/controller/subsystem/garbage/proc/Queue(datum/D, level = GC_QUEUE_CHECK) + if (isnull(D)) + return + if (level > GC_QUEUE_COUNT) + HardDelete(D) + return + var/gctime = world.time + var/refid = "\ref[D]" + +#ifdef LEGACY_REFERENCE_TRACKING + if(reference_find_on_fail_types[D.type]) + SSgarbage.reference_find_on_fail[REF(D)] = TRUE +#endif + + D.gc_destroyed = gctime + var/list/queue = queues[level] + queue[++queue.len] = list(gctime, refid) // not += for byond reasons + //this is mainly to separate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/D) var/time = world.timeofday @@ -274,8 +299,10 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" -// Should be treated as a replacement for the 'del' keyword. -// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. + +/// Should be treated as a replacement for the 'del' keyword. +/// +/// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. /proc/qdel(datum/D, force=FALSE, ...) if(!istype(D)) del(D) @@ -330,9 +357,10 @@ SUBSYSTEM_DEF(garbage) #ifdef LEGACY_REFERENCE_TRACKING if (QDEL_HINT_FINDREFERENCE) //qdel will, if LEGACY_REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) + D.find_references_legacy() if (QDEL_HINT_IFFAIL_FINDREFERENCE) SSgarbage.Queue(D) - SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE + SSgarbage.reference_find_on_fail[REF(D)] = TRUE #endif else #ifdef TESTING diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm index 03b7931d82..ccdaa555a2 100644 --- a/code/controllers/subsystem/idlenpcpool.dm +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -33,8 +33,9 @@ SUBSYSTEM_DEF(idlenpcpool) while(currentrun.len) var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len - if (!SA) + if (QDELETED(SA)) GLOB.simple_animals[AI_IDLE] -= SA + log_world("Found a null in simple_animals list!") continue if(!SA.ckey) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 32936af9e9..28505c70f8 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -6,6 +6,12 @@ SUBSYSTEM_DEF(input) priority = FIRE_PRIORITY_INPUT runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + /// KEEP THIS UP TO DATE! + var/static/list/all_macrosets = list( + SKIN_MACROSET_HOTKEYS, + SKIN_MACROSET_CLASSIC_HOTKEYS, + SKIN_MACROSET_CLASSIC_INPUT + ) /// Classic mode input focused macro set. Manually set because we can't define ANY or ANY+UP for classic. var/static/list/macroset_classic_input /// Classic mode map focused macro set. Manually set because it needs to be clientside and go to macroset_classic_input. @@ -51,11 +57,6 @@ SUBSYSTEM_DEF(input) // let's play the ascii game of A to Z (UPPERCASE) for(var/i in 65 to 90) classic_ctrl_override_keys += ascii2text(i) - // let's play the game of clientside bind overrides! - classic_ctrl_override_keys -= list("T", "O", "M", "L") - macroset_classic_input["Ctrl+T"] = "say" - macroset_classic_input["Ctrl+O"] = "ooc" - macroset_classic_input["Ctrl+L"] = "looc" // let's play the list iteration game x2 for(var/key in classic_ctrl_override_keys) // make sure to double double quote to ensure things are treated as a key combo instead of addition/semicolon logic. @@ -64,23 +65,9 @@ SUBSYSTEM_DEF(input) // Misc macroset_classic_input["Tab"] = "\".winset \\\"mainwindow.macro=[SKIN_MACROSET_CLASSIC_HOTKEYS] map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"" macroset_classic_input["Escape"] = "\".winset \\\"input.text=\\\"\\\"\\\"\"" - + // FINALLY, WE CAN DO SOMETHING MORE NORMAL FOR THE SNOWFLAKE-BUT-LESS KEYSET. - - // HAHA - SIKE. Because of BYOND weirdness (tl;dr not specifically binding this way results in potentially duplicate chatboxes when - // conflicts occur with something like say indicator vs say), we're going to snowflake this anyways - var/list/hard_binds = list( - "O" = "ooc", - "T" = "say", - "L" = "looc", - "M" = "me" - ) - var/list/hard_bind_anti_collision = list() - var/list/anti_collision_modifiers = list("Ctrl", "Alt", "Shift", "Ctrl+Alt", "Ctrl+Shift", "Alt+Shift", "Ctrl+Alt+Shift") - for(var/key in hard_binds) - for(var/modifier in anti_collision_modifiers) - hard_bind_anti_collision["[modifier]+[key]"] = ".NONSENSICAL_VERB_THAT_DOES_NOTHING" - + macroset_classic_hotkey = list( "Any" = "\"KeyDown \[\[*\]\]\"", "Any+UP" = "\"KeyUp \[\[*\]\]\"", @@ -88,9 +75,6 @@ SUBSYSTEM_DEF(input) "Escape" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", ) - - macroset_classic_hotkey |= hard_binds - macroset_classic_hotkey |= hard_bind_anti_collision // And finally, the modern set. macroset_hotkey = list( @@ -100,25 +84,23 @@ SUBSYSTEM_DEF(input) "Escape" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", ) - - macroset_hotkey |= hard_binds - macroset_hotkey |= hard_bind_anti_collision // Badmins just wanna have fun ♪ /datum/controller/subsystem/input/proc/refresh_client_macro_sets() var/list/clients = GLOB.clients for(var/i in 1 to clients.len) var/client/user = clients[i] - user.set_macros() - user.update_movement_keys() + user.full_macro_assert() /datum/controller/subsystem/input/fire() + set waitfor = FALSE var/list/clients = GLOB.clients // Let's sing the list cache song for(var/i in 1 to clients.len) var/client/C = clients[i] C.keyLoop() +#define NONSENSICAL_VERB "NONSENSICAL_VERB_THAT_DOES_NOTHING" /// *sigh /client/verb/NONSENSICAL_VERB_THAT_DOES_NOTHING() - set name = ".NONSENSICAL_VERB_THAT_DOES_NOTHING" + set name = "NONSENSICAL_VERB_THAT_DOES_NOTHING" set hidden = TRUE diff --git a/code/controllers/subsystem/ipintel.dm b/code/controllers/subsystem/ipintel.dm index fca394924d..fb0ddead09 100644 --- a/code/controllers/subsystem/ipintel.dm +++ b/code/controllers/subsystem/ipintel.dm @@ -2,13 +2,13 @@ SUBSYSTEM_DEF(ipintel) name = "XKeyScore" init_order = INIT_ORDER_XKEYSCORE flags = SS_NO_FIRE - var/enabled = 0 //disable at round start to avoid checking reconnects + var/enabled = FALSE //disable at round start to avoid checking reconnects var/throttle = 0 var/errors = 0 var/list/cache = list() /datum/controller/subsystem/ipintel/Initialize(timeofday, zlevel) - enabled = 1 + enabled = TRUE . = ..() diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 4f59992ace..0ba6076be2 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -55,9 +55,10 @@ SUBSYSTEM_DEF(job) continue if(!job.config_check()) continue - if(!job.map_check()) //Even though we initialize before mapping, this is fine because the config is loaded at new + if(!job.map_check(SSmapping.config)) //Even though we initialize before mapping, this is fine because the config is loaded at new testing("Removed [job.type] due to map config"); continue + job.process_map_overrides(SSmapping.config) occupations += job name_occupations[job.title] = job type_occupations[J] = job @@ -489,6 +490,31 @@ SUBSYSTEM_DEF(job) job.after_spawn(H, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not. equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works + if(ishuman(H) && H.client && N) + if(H.client && H.client.prefs && length(H.client.prefs.tcg_cards)) + var/obj/item/tcgcard_binder/binder = new(get_turf(H)) + H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE) + for(var/card_type in H.client.prefs.tcg_cards) + if(card_type) + var/obj/item/tcg_card/card = new(get_turf(H), card_type, H.client.prefs.tcg_cards[card_type]) + card.forceMove(binder) + binder.cards.Add(card) + binder.check_for_exodia() + if(length(H.client.prefs.tcg_decks)) + binder.decks = H.client.prefs.tcg_decks + else + if(H && N.client.prefs && length(N.client.prefs.tcg_cards)) + var/obj/item/tcgcard_binder/binder = new(get_turf(H)) + H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE) + for(var/card_type in N.client.prefs.tcg_cards) + if(card_type) + var/obj/item/tcg_card/card = new(get_turf(H), card_type, N.client.prefs.tcg_cards[card_type]) + card.forceMove(binder) + binder.cards.Add(card) + binder.check_for_exodia() + if(length(N.client.prefs.tcg_decks)) + binder.decks = N.client.prefs.tcg_decks + return H /* /datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank) @@ -665,15 +691,16 @@ SUBSYSTEM_DEF(job) message_admins(msg) CRASH(msg) -/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff, bypass_prereqs = FALSE) +/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff, bypass_prereqs = FALSE, can_drop = TRUE) var/mob/the_mob = N if(!the_mob) the_mob = M // cause this doesn't get assigned if player is a latejoiner - if(the_mob.client && the_mob.client.prefs && (the_mob.client.prefs.chosen_gear && the_mob.client.prefs.chosen_gear.len)) + var/list/chosen_gear = the_mob.client.prefs.loadout_data["SAVE_[the_mob.client.prefs.loadout_slot]"] + if(the_mob.client && the_mob.client.prefs && (chosen_gear && chosen_gear.len)) if(!ishuman(M))//no silicons allowed return - for(var/i in the_mob.client.prefs.chosen_gear) - var/datum/gear/G = i + for(var/i in chosen_gear) + var/datum/gear/G = istext(i[LOADOUT_ITEM]) ? text2path(i[LOADOUT_ITEM]) : i[LOADOUT_ITEM] G = GLOB.loadout_items[initial(G.category)][initial(G.subcategory)][initial(G.name)] if(!G) continue @@ -689,14 +716,43 @@ SUBSYSTEM_DEF(job) if(!permitted) continue var/obj/item/I = new G.path + if(I) + if(length(i[LOADOUT_COLOR])) //handle loadout colors + //handle polychromic items + if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors)) + var/datum/element/polychromic/polychromic = I.comp_lookup["item_worn_overlays"] //stupid way to do it but GetElement does not work for this + if(polychromic && istype(polychromic)) + var/list/polychromic_entry = polychromic.colors_by_atom[I] + if(polychromic_entry) + if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things? + polychromic.connect_helmet(I,i[LOADOUT_COLOR]) + polychromic.colors_by_atom[I] = i[LOADOUT_COLOR] + I.update_icon() + else + //handle non-polychromic items (they only have one color) + I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY) + I.update_icon() + //when inputting the data it's already sanitized + if(i[LOADOUT_CUSTOM_NAME]) + var/custom_name = i[LOADOUT_CUSTOM_NAME] + I.name = custom_name + if(i[LOADOUT_CUSTOM_DESCRIPTION]) + var/custom_description = i[LOADOUT_CUSTOM_DESCRIPTION] + I.desc = custom_description if(!M.equip_to_slot_if_possible(I, G.slot, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first if(iscarbon(M)) var/mob/living/carbon/C = M var/obj/item/storage/backpack/B = C.back if(!B || !SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, I, null, TRUE, TRUE)) // Otherwise, try to put it in the backpack, for carbons. - I.forceMove(get_turf(C)) + if(can_drop) + I.forceMove(get_turf(C)) + else + qdel(I) else if(!M.equip_to_slot_if_possible(I, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack - I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob. + if(can_drop) + I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob. + else + qdel(I) /datum/controller/subsystem/job/proc/FreeRole(rank) if(!rank) diff --git a/code/controllers/subsystem/jukeboxes.dm b/code/controllers/subsystem/jukeboxes.dm index 3ebeaf71ea..7be6d44a7f 100644 --- a/code/controllers/subsystem/jukeboxes.dm +++ b/code/controllers/subsystem/jukeboxes.dm @@ -94,8 +94,8 @@ SUBSYSTEM_DEF(jukeboxes) stack_trace("Nonexistant or invalid object associated with jukebox.") continue var/sound/song_played = sound(juketrack.song_path) - var/area/currentarea = get_area(jukebox) var/turf/currentturf = get_turf(jukebox) + var/area/currentarea = get_area(jukebox) var/list/hearerscache = hearers(7, jukebox) song_played.falloff = jukeinfo[4] @@ -116,7 +116,6 @@ SUBSYSTEM_DEF(jukeboxes) inrange = TRUE else song_played.status = SOUND_MUTE | SOUND_UPDATE //Setting volume = 0 doesn't let the sound properties update at all, which is lame. - M.playsound_local(currentturf, null, 100, channel = jukeinfo[2], S = song_played, envwet = (inrange ? -250 : 0), envdry = (inrange ? 0 : -10000)) CHECK_TICK return diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index e193c68536..19345f3c8d 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -6,6 +6,7 @@ SUBSYSTEM_DEF(lighting) name = "Lighting" wait = 2 init_order = INIT_ORDER_LIGHTING + flags = SS_TICKER /datum/controller/subsystem/lighting/stat_entry(msg) msg = "L:[length(GLOB.lighting_update_lights)]|C:[length(GLOB.lighting_update_corners)]|O:[length(GLOB.lighting_update_objects)]" diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index f356009569..23190574d8 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -2,6 +2,7 @@ SUBSYSTEM_DEF(machines) name = "Machines" init_order = INIT_ORDER_MACHINES flags = SS_KEEP_TIMING + wait = 2 SECONDS var/list/processing = list() var/list/currentrun = list() var/list/powernets = list() @@ -27,7 +28,7 @@ SUBSYSTEM_DEF(machines) return ..() -/datum/controller/subsystem/machines/fire(resumed = 0) +/datum/controller/subsystem/machines/fire(resumed = FALSE) if (!resumed) for(var/datum/powernet/Powernet in powernets) Powernet.reset() //reset the power state. @@ -36,11 +37,10 @@ SUBSYSTEM_DEF(machines) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - var/seconds = wait * 0.1 while(currentrun.len) var/obj/machinery/thing = currentrun[currentrun.len] currentrun.len-- - if(!QDELETED(thing) && thing.process(seconds) != PROCESS_KILL) + if(!QDELETED(thing) && thing.process(wait * 0.1) != PROCESS_KILL) if(thing.use_power) thing.auto_use_power() //add back the power state else diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 617004646a..90908bbde0 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -41,6 +41,8 @@ SUBSYSTEM_DEF(mapping) var/datum/space_level/transit var/datum/space_level/empty_space var/num_of_res_levels = 1 + /// Lookup for zlevel to station z. text = num. + var/list/z_to_station_z_index var/stat_map_name = "Loading..." @@ -259,6 +261,16 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") return parsed_maps +/datum/controller/subsystem/mapping/proc/setup_station_z_index() + z_to_station_z_index = list() + var/sz = 1 + var/cz = station_start + if(islist(config.map_file)) + for(var/map in config.map_file) + z_to_station_z_index["[cz++]"] = sz++ + else + z_to_station_z_index["[station_start]"] = 1 + /datum/controller/subsystem/mapping/proc/loadWorld() //if any of these fail, something has gone horribly, HORRIBLY, wrong var/list/FailedZs = list() @@ -271,6 +283,8 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loading [config.map_name]...") LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION, FALSE, config.orientation) + setup_station_z_index() + if(SSdbcore.Connect()) var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]") query_round_map_name.Execute() @@ -447,7 +461,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) //Manual loading of away missions. /client/proc/admin_away() set name = "Load Away Mission / Virtual Reality" - set category = "Fun" + set category = "Admin.Events" if(!holder ||!check_rights(R_FUN)) return diff --git a/code/controllers/subsystem/minimum_spawns.dm b/code/controllers/subsystem/minimum_spawns.dm new file mode 100644 index 0000000000..b9d19b6cd2 --- /dev/null +++ b/code/controllers/subsystem/minimum_spawns.dm @@ -0,0 +1,144 @@ +SUBSYSTEM_DEF(min_spawns) + name = "Minimum Spawns" /// this hot steaming pile of garbage makes sure theres a minimum of tendrils scattered around + init_order = INIT_ORDER_DEFAULT + flags = SS_BACKGROUND | SS_NO_FIRE + wait = 2 + var/where_we_droppin_boys_iterations = 0 + var/snaxi_snowflake_check = FALSE + var/list/active_spawns = list() // lavaland, snaxi, etc. primary spawn list + var/list/active_spawns_2 = list() // snaxi underground, etc. secondary spawn list + var/list/valid_mining_turfs = list() // lavaland/snaxi turfs + var/list/valid_mining_turfs_2 = list() // snaxi underground turfs + +GLOBAL_LIST_INIT(minimum_lavaland_spawns, list( + /obj/structure/spawner/lavaland, + /obj/structure/spawner/lavaland/goliath, + /obj/structure/spawner/lavaland/legion, + /mob/living/simple_animal/hostile/megafauna/dragon, + /mob/living/simple_animal/hostile/megafauna/colossus, + /mob/living/simple_animal/hostile/megafauna/bubblegum +)) + +GLOBAL_LIST_INIT(minimum_snow_surface_spawns, list( + /obj/structure/spawner/ice_moon, + /obj/structure/spawner/ice_moon/polarbear +)) +GLOBAL_LIST_INIT(minimum_snow_under_spawns, list( + /obj/structure/spawner/ice_moon/demonic_portal, + /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp, + /obj/structure/spawner/ice_moon/demonic_portal/snowlegion +)) + +// step 1: check for which list(s) to use - done +// step 2: check for caves - done +// step 3: check for mobs - done +// step 4: start throwing shit down - done +// step 5: snaxi support - done? + +/datum/controller/subsystem/min_spawns/Initialize(start_timeofday) + var/list/snaxi_zs_list = SSmapping.levels_by_trait(ZTRAIT_ICE_RUINS) // boy if these things arent mutually exclusive + var/list/lavaland_zs_list = SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS) // i'm gonna fuckin scream + if(snaxi_zs_list.len) + active_spawns = GLOB.minimum_snow_surface_spawns + active_spawns_2 = GLOB.minimum_snow_under_spawns + snaxi_snowflake_check = TRUE + else if(lavaland_zs_list.len) //todo: recognizing maps that aren't lavaland mining but are also not snaxi + active_spawns = GLOB.minimum_lavaland_spawns + else + return ..() // call it a day i guess + // borrowing this from auxbase code - see code\modules\mining\aux_base.dm + if(snaxi_snowflake_check) + for(var/z_level in SSmapping.levels_by_trait(ZTRAIT_ICE_RUINS)) + for(var/turf/TT in Z_TURFS(z_level)) + if(!isarea(TT.loc)) + continue + var/area/A = TT.loc + if(!A.mob_spawn_allowed) + continue + if(!istype(TT, /turf/open/floor/plating/asteroid)) + continue + if(typesof(/turf/open/lava) in orange(9, TT)) + continue + valid_mining_turfs.Add(TT) + for(var/z_level in SSmapping.levels_by_trait(ZTRAIT_ICE_RUINS_UNDERGROUND)) + for(var/turf/TT in Z_TURFS(z_level)) + if(!isarea(TT.loc)) + continue + var/area/A = TT.loc + if(!A.mob_spawn_allowed) + continue + if(!istype(TT, /turf/open/floor/plating/asteroid)) + continue + if(typesof(/turf/open/lava) in orange(9, TT)) + continue + valid_mining_turfs_2.Add(TT) + else + for(var/z_level in SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) + for(var/turf/TT in Z_TURFS(z_level)) + if(!isarea(TT.loc)) + continue + var/area/A = TT.loc + if(!A.mob_spawn_allowed) + continue + if(!istype(TT, /turf/open/floor/plating/asteroid)) + continue + if(typesof(/turf/open/lava) in orange(9, TT)) + continue + valid_mining_turfs.Add(TT) + if(!valid_mining_turfs.len) + return ..() // call it a day i guess + // if we're at this point we might as well fucking hit it + where_we_droppin_boys() + return ..() + +/datum/controller/subsystem/min_spawns/proc/where_we_droppin_boys() + while(active_spawns.len) + where_we_droppin_boys_iterations++ + CHECK_TICK + if(where_we_droppin_boys_iterations >= 1250) + INIT_ANNOUNCE("Minimum Spawns subsystem stopped early on spawns list 1 - too many iterations!") + break + var/turf/RT = pick_n_take(valid_mining_turfs) //Pick a random mining Z-level turf + var/MS_tospawn = pick_n_take(active_spawns) + for(var/mob/living/simple_animal/hostile/megafauna/H in urange(70,RT)) //prevents mob clumps + if((istype(MS_tospawn, /mob/living/simple_animal/hostile/megafauna)) && get_dist(RT, H) <= 70) + active_spawns.Add(MS_tospawn) + continue //let's try not to dump megas too close to each other? + if((istype(MS_tospawn, /obj/structure/spawner)) && get_dist(RT, H) <= 40) + active_spawns.Add(MS_tospawn) + continue //let's at least /try/ to space these out? + for(var/obj/structure/spawner/LT in urange(70,RT)) //prevents tendril/mega clumps + if((istype(MS_tospawn, /mob/living/simple_animal/hostile/megafauna)) && get_dist(RT, LT) <= 70) + active_spawns.Add(MS_tospawn) + continue //let's try not to dump megas too close to each other? + if((istype(MS_tospawn, /obj/structure/spawner)) && get_dist(RT, LT) <= 40) + active_spawns.Add(MS_tospawn) + continue //let's at least /try/ to space these out? + // man the overhead on this is gonna SUCK + new MS_tospawn(RT) + while(active_spawns_2.len) + where_we_droppin_boys_iterations++ + CHECK_TICK + if(where_we_droppin_boys_iterations >= 1250) + INIT_ANNOUNCE("Minimum Spawns subsystem stopped early on active list 2 - too many iterations!") + break + var/turf/RT2 = pick_n_take(valid_mining_turfs_2) //Pick a random mining Z-level turf + var/MS2_tospawn = pick_n_take(active_spawns_2) + for(var/mob/living/simple_animal/hostile/H in urange(70,RT2)) //prevents mob clumps + if((istype(MS2_tospawn, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(RT2, H) <= 70) + active_spawns_2.Add(MS2_tospawn) + continue //let's try not to dump megas too close to each other? + if((istype(MS2_tospawn, /obj/structure/spawner)) && get_dist(RT2, H) <= 40) + active_spawns_2.Add(MS2_tospawn) + continue //let's at least /try/ to space these out? + for(var/obj/structure/spawner/LT in urange(70,RT2)) //prevents tendril/mega clumps + if((istype(MS2_tospawn, /mob/living/simple_animal/hostile/megafauna)) && get_dist(RT2, LT) <= 70) + active_spawns_2.Add(MS2_tospawn) + continue //let's try not to dump megas too close to each other? + if((istype(MS2_tospawn, /obj/structure/spawner)) && get_dist(RT2, LT) <= 40) + active_spawns_2.Add(MS2_tospawn) + continue //let's at least /try/ to space these out? + // man the overhead on this is gonna SUCK + new MS2_tospawn(RT2) + if(!active_spawns.len && !active_spawns_2.len) + return // we're done here diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 2160cae6e3..d6cbf99f97 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -1,3 +1,5 @@ +#define PROB_MOUSE_SPAWN 98 + SUBSYSTEM_DEF(minor_mapping) name = "Minor Mapping" init_order = INIT_ORDER_MINOR_MAPPING @@ -5,29 +7,43 @@ SUBSYSTEM_DEF(minor_mapping) /datum/controller/subsystem/minor_mapping/Initialize(timeofday) trigger_migration(CONFIG_GET(number/mice_roundstart)) + // place_satchels() return ..() /datum/controller/subsystem/minor_mapping/proc/trigger_migration(num_mice=10) var/list/exposed_wires = find_exposed_wires() - var/mob/living/simple_animal/mouse/M + var/mob/living/simple_animal/mouse/mouse var/turf/proposed_turf while((num_mice > 0) && exposed_wires.len) proposed_turf = pick_n_take(exposed_wires) - if(!M) - M = new(proposed_turf) - else - M.forceMove(proposed_turf) - if(M.environment_is_safe()) - num_mice -= 1 - M = null + if(prob(PROB_MOUSE_SPAWN)) + if(!mouse) + mouse = new(proposed_turf) + else + mouse.forceMove(proposed_turf) + // else + // mouse = new /mob/living/simple_animal/hostile/regalrat/controlled(proposed_turf) + if(mouse.environment_is_safe()) + num_mice -= 1 + mouse = null + +// /datum/controller/subsystem/minor_mapping/proc/place_satchels(amount=10) +// var/list/turfs = find_satchel_suitable_turfs() + +// while(turfs.len && amount > 0) +// var/turf/T = pick_n_take(turfs) +// var/obj/item/storage/backpack/satchel/flat/F = new(T) + +// SEND_SIGNAL(F, COMSIG_OBJ_HIDE, T.intact) +// amount-- /proc/find_exposed_wires() var/list/exposed_wires = list() - exposed_wires.Cut() + var/list/all_turfs - for (var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) all_turfs += block(locate(1,1,z), locate(world.maxx,world.maxy,z)) for(var/turf/open/floor/plating/T in all_turfs) if(is_blocked_turf(T)) @@ -35,4 +51,16 @@ SUBSYSTEM_DEF(minor_mapping) if(locate(/obj/structure/cable) in T) exposed_wires += T - return shuffle(exposed_wires) \ No newline at end of file + return shuffle(exposed_wires) + +// /proc/find_satchel_suitable_turfs() +// var/list/suitable = list() + +// for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) +// for(var/t in block(locate(1,1,z), locate(world.maxx,world.maxy,z))) +// if(isfloorturf(t) && !isplatingturf(t)) +// suitable += t + +// return shuffle(suitable) + +#undef PROB_MOUSE_SPAWN diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index c67deaede1..c20820c092 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -5,6 +5,10 @@ SUBSYSTEM_DEF(npcpool) runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/list/currentrun = list() + /// catches sleeping + var/invoking = FALSE + /// Invoke start time + var/invoke_start = 0 /datum/controller/subsystem/npcpool/stat_entry(msg) var/list/activelist = GLOB.simple_animals[AI_ON] @@ -12,7 +16,6 @@ SUBSYSTEM_DEF(npcpool) return ..() /datum/controller/subsystem/npcpool/fire(resumed = FALSE) - if (!resumed) var/list/activelist = GLOB.simple_animals[AI_ON] src.currentrun = activelist.Copy() @@ -24,12 +27,22 @@ SUBSYSTEM_DEF(npcpool) var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len - if(!SA.ckey && !SA.mob_transforming) - if(SA.stat != DEAD) - SA.handle_automated_movement() - if(SA.stat != DEAD) - SA.handle_automated_action() - if(SA.stat != DEAD) - SA.handle_automated_speech() + invoking = TRUE + invoke_start = world.time + INVOKE_ASYNC(src, .proc/invoke_process, SA) + if(invoking) + stack_trace("WARNING: [SA] ([SA.type]) slept during NPCPool processing.") + invoking = FALSE + if (MC_TICK_CHECK) return + +/datum/controller/subsystem/npcpool/proc/invoke_process(mob/living/simple_animal/SA) + if(!SA.ckey && !SA.mob_transforming) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.handle_automated_action() + if(SA.stat != DEAD) + SA.handle_automated_speech() + invoking = FALSE diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index b42a1e6b7e..74b60783c3 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -48,9 +48,16 @@ SUBSYSTEM_DEF(overlays) for (var/thing in queue) count++ if(thing) - STAT_START_STOPWATCH var/atom/A = thing + if(A.overlays.len >= MAX_ATOM_OVERLAYS) + //Break it real GOOD + stack_trace("Too many overlays on [A.type] - [A.overlays.len], refusing to update and cutting") + A.overlays.Cut() + continue + STAT_START_STOPWATCH COMPILE_OVERLAYS(A) + UNSETEMPTY(A.add_overlays) + UNSETEMPTY(A.remove_overlays) STAT_STOP_STOPWATCH STAT_LOG_ENTRY(stats, A.type) if(mc_check) @@ -117,9 +124,8 @@ SUBSYSTEM_DEF(overlays) #define QUEUE_FOR_COMPILE flags_1 |= OVERLAY_QUEUED_1; SSoverlays.queue += src; /atom/proc/cut_overlays() LAZYINITLIST(remove_overlays) - LAZYINITLIST(add_overlays) remove_overlays = overlays.Copy() - add_overlays.Cut() + add_overlays = null //If not already queued for work and there are overlays to remove if(NOT_QUEUED_ALREADY && remove_overlays.len) @@ -129,7 +135,7 @@ SUBSYSTEM_DEF(overlays) if(!overlays) return overlays = build_appearance_list(overlays) - LAZYINITLIST(add_overlays) //always initialized after this point + LAZYINITLIST(add_overlays) LAZYINITLIST(remove_overlays) var/a_len = add_overlays.len var/r_len = remove_overlays.len @@ -140,8 +146,9 @@ SUBSYSTEM_DEF(overlays) var/fr_len = remove_overlays.len //If not already queued and there is work to be done - if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len)) + if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len )) QUEUE_FOR_COMPILE + UNSETEMPTY(add_overlays) /atom/proc/add_overlay(list/overlays) if(!overlays) diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index 64299fda38..7096c667e1 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -7,13 +7,21 @@ SUBSYSTEM_DEF(parallax) var/list/currentrun var/planet_x_offset = 128 var/planet_y_offset = 128 + var/random_layer + var/random_parallax_color -/datum/controller/subsystem/parallax/Initialize(timeofday) + +//These are cached per client so needs to be done asap so people joining at roundstart do not miss these. +/datum/controller/subsystem/parallax/PreInit() . = ..() + if(prob(70)) //70% chance to pick a special extra layer + random_layer = pick(/obj/screen/parallax_layer/random/space_gas, /obj/screen/parallax_layer/random/asteroids) + random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)//Special color for random_layer1. Has to be done here so everyone sees the same color. [COLOR_SILVER] planet_y_offset = rand(100, 160) planet_x_offset = rand(100, 160) -/datum/controller/subsystem/parallax/fire(resumed = 0) + +/datum/controller/subsystem/parallax/fire(resumed = FALSE) if (!resumed) src.currentrun = GLOB.clients.Copy() @@ -21,24 +29,27 @@ SUBSYSTEM_DEF(parallax) var/list/currentrun = src.currentrun while(length(currentrun)) - var/client/C = currentrun[currentrun.len] + var/client/processing_client = currentrun[currentrun.len] currentrun.len-- - if (!C || !C.eye) + if (QDELETED(processing_client) || !processing_client.eye) if (MC_TICK_CHECK) return continue - var/atom/movable/A = C.eye - if(!istype(A)) - continue - for (A; isloc(A.loc) && !isturf(A.loc); A = A.loc); - if(A != C.movingmob) - if(C.movingmob != null) - C.movingmob.client_mobs_in_contents -= C.mob - UNSETEMPTY(C.movingmob.client_mobs_in_contents) - LAZYINITLIST(A.client_mobs_in_contents) - A.client_mobs_in_contents += C.mob - C.movingmob = A + var/atom/movable/movable_eye = processing_client.eye + if(!istype(movable_eye)) + continue + + for (movable_eye; isloc(movable_eye.loc) && !isturf(movable_eye.loc); movable_eye = movable_eye.loc); + + if(movable_eye == processing_client.movingmob) + if (MC_TICK_CHECK) + return + continue + if(!isnull(processing_client.movingmob)) + LAZYREMOVE(processing_client.movingmob.client_mobs_in_contents, processing_client.mob) + LAZYADD(movable_eye.client_mobs_in_contents, processing_client.mob) + processing_client.movingmob = movable_eye if (MC_TICK_CHECK) return currentrun = null diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm index 8e1cf946ae..ccbea79306 100644 --- a/code/controllers/subsystem/pathfinder.dm +++ b/code/controllers/subsystem/pathfinder.dm @@ -18,7 +18,7 @@ SUBSYSTEM_DEF(pathfinder) var/free var/list/flow -/datum/flowcache/New(var/n) +/datum/flowcache/New(n) . = ..() lcount = n run = 0 diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm similarity index 51% rename from code/controllers/subsystem/persistence.dm rename to code/controllers/subsystem/persistence/_persistence.dm index e1b6e6f6e2..9b2c019db4 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -5,18 +5,14 @@ SUBSYSTEM_DEF(persistence) name = "Persistence" init_order = INIT_ORDER_PERSISTENCE flags = SS_NO_FIRE - var/list/satchel_blacklist = list() //this is a typecache - var/list/new_secret_satchels = list() //these are objects - var/list/old_secret_satchels = list() + + /// Marks if the station got horribly destroyed + var/station_was_destroyed = FALSE + /// Marks if persistence save should be disabled + var/station_persistence_save_disabled = FALSE var/list/obj/structure/chisel_message/chisel_messages = list() var/list/saved_messages = list() - var/list/saved_modes = list(1,2,3) - var/list/saved_dynamic_rules = list(list(),list(),list()) - var/list/saved_storytellers = list("foo","bar","baz") - var/list/average_dynamic_threat = 50 - var/list/saved_maps - var/list/saved_trophies = list() var/list/spawned_objects = list() var/list/antag_rep = list() var/list/antag_rep_change = list() @@ -28,62 +24,83 @@ SUBSYSTEM_DEF(persistence) var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() - LoadSatchels() - LoadPoly() - LoadChiselMessages() - LoadTrophies() - LoadRecentModes() - LoadRecentStorytellers() - LoadRecentRulesets() - LoadRecentMaps() - LoadPhotoPersistence() + LoadServerPersistence() + LoadGamePersistence() + var/map_persistence_path = get_map_persistence_path() + if(map_persistence_path) + LoadMapPersistence() + return ..() + +/** + * Gets the persistence path of the current map. + */ +/datum/controller/subsystem/persistence/proc/get_map_persistence_path() + ASSERT(SSmapping.config) + if(!SSmapping.config.persistence_key || (SSmapping.config.persistence_key == "NO_PERSIST")) + return null + return "data/persistence/[ckey(SSmapping.config.persistence_key)]" + +/datum/controller/subsystem/persistence/proc/CollectData() + SaveServerPersistence() + if(station_persistence_save_disabled) + return + SaveGamePersistence() + var/map_persistence_path = get_map_persistence_path() + if(map_persistence_path) + SaveMapPersistence() + +/** + * Loads persistent data relevant to the server: Configurations, past gamemodes, votes, antag rep, etc + */ +/datum/controller/subsystem/persistence/proc/LoadServerPersistence() for(var/client/C in GLOB.clients) LoadSavedVote(C.ckey) if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() LoadRandomizedRecipes() - LoadPanicBunker() - return ..() + LoadPaintings() -/datum/controller/subsystem/persistence/proc/LoadSatchels() - var/placed_satchel = 0 - var/path +/** + * Saves persistent data relevant to the server: Configurations, past gamemodes, votes, antag rep, etc + */ +/datum/controller/subsystem/persistence/proc/SaveServerPersistence() + if(CONFIG_GET(flag/use_antag_rep)) + CollectAntagReputation() + SaveRandomizedRecipes() - var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") - var/list/json = list() - if(fexists(json_file)) - json = json_decode(file2text(json_file)) +/** + * Loads persistent data relevant to the game in general: Photos, etc + * + * Legacy map persistence systems also use this. + */ +/datum/controller/subsystem/persistence/proc/LoadGamePersistence() + LoadChiselMessages() + LoadPhotoPersistence() + LoadPaintings() - old_secret_satchels = json["data"] - var/obj/item/storage/backpack/satchel/flat/F - if(old_secret_satchels && old_secret_satchels.len >= 10) //guards against low drop pools assuring that one player cannot reliably find his own gear. - var/pos = rand(1, old_secret_satchels.len) - F = new() - old_secret_satchels.Cut(pos, pos+1 % old_secret_satchels.len) - F.x = old_secret_satchels[pos]["x"] - F.y = old_secret_satchels[pos]["y"] - F.z = SSmapping.station_start - path = text2path(old_secret_satchels[pos]["saved_obj"]) +/** + * Saves persistent data relevant to the game in general: Photos, etc + * + * Legacy map persistence systems also use this. + */ +/datum/controller/subsystem/persistence/proc/SaveGamePersistence() + CollectChiselMessages() + SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. + SavePaintings() + SaveScars() + SaveTCGCards() - if(F) - if(isfloorturf(F.loc) && !isplatingturf(F.loc)) - F.hide(1) - if(ispath(path)) - var/spawned_item = new path(F) - spawned_objects[spawned_item] = TRUE - placed_satchel++ - var/free_satchels = 0 - for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,SSmapping.station_start), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,SSmapping.station_start)))) //Nontrivially expensive but it's roundstart only - if(isfloorturf(T) && !isplatingturf(T)) - new /obj/item/storage/backpack/satchel/flat/secret(T) - free_satchels++ - if((free_satchels + placed_satchel) == 10) //ten tiles, more than enough to kill anything that moves - break +/** + * Loads persistent data relevant to the current map: Objects, etc. + */ +/datum/controller/subsystem/persistence/proc/LoadMapPersistence() + return -/datum/controller/subsystem/persistence/proc/LoadPoly() - for(var/mob/living/simple_animal/parrot/Poly/P in GLOB.alive_mob_list) - twitterize(P.speech_buffer, "polytalk") - break //Who's been duping the bird?! +/** + * Saves persistent data relevant to the current map: Objects, etc. + */ +/datum/controller/subsystem/persistence/proc/SaveMapPersistence() + return /datum/controller/subsystem/persistence/proc/LoadChiselMessages() var/list/saved_messages = list() @@ -130,63 +147,6 @@ SUBSYSTEM_DEF(persistence) log_world("Loaded [saved_messages.len] engraved messages on map [SSmapping.config.map_name]") -/datum/controller/subsystem/persistence/proc/LoadTrophies() - if(fexists("data/npc_saves/TrophyItems.sav")) //legacy compatability to convert old format to new - var/savefile/S = new /savefile("data/npc_saves/TrophyItems.sav") - var/saved_json - S >> saved_json - if(!saved_json) - return - saved_trophies = json_decode(saved_json) - fdel("data/npc_saves/TrophyItems.sav") - else - var/json_file = file("data/npc_saves/TrophyItems.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_trophies = json["data"] - SetUpTrophies(saved_trophies.Copy()) - -/datum/controller/subsystem/persistence/proc/LoadRecentModes() - var/json_file = file("data/RecentModes.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_modes = json["data"] - -/datum/controller/subsystem/persistence/proc/LoadRecentRulesets() - var/json_file = file("data/RecentRulesets.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_dynamic_rules = json["data"] - -/datum/controller/subsystem/persistence/proc/LoadRecentStorytellers() - var/json_file = file("data/RecentStorytellers.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_storytellers = json["data"] - if(saved_storytellers.len > 3) - average_dynamic_threat = saved_storytellers[4] - saved_storytellers.len = 3 - -/datum/controller/subsystem/persistence/proc/LoadRecentMaps() - var/json_file = file("data/RecentMaps.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_maps = json["maps"] /datum/controller/subsystem/persistence/proc/LoadAntagReputation() var/json = file2text(FILE_ANTAG_REP) @@ -207,59 +167,6 @@ SUBSYSTEM_DEF(persistence) return saved_votes[ckey] = json["data"] -/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) - for(var/A in GLOB.trophy_cases) - var/obj/structure/displaycase/trophy/T = A - if (T.showpiece) - continue - T.added_roundstart = TRUE - - var/trophy_data = pick_n_take(trophy_items) - - if(!islist(trophy_data)) - continue - - var/list/chosen_trophy = trophy_data - - if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed - continue - - var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null - if(!path) - continue - - T.showpiece = new /obj/item/showpiece_dummy(T, path) - T.trophy_message = chosen_trophy["message"] - T.placer_key = chosen_trophy["placer_key"] - T.update_icon() - -/datum/controller/subsystem/persistence/proc/CollectData() - CollectChiselMessages() - CollectSecretSatchels() - CollectTrophies() - CollectRoundtype() - if(istype(SSticker.mode, /datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - CollectStoryteller(mode) - CollectRulesets(mode) - RecordMaps() - SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. - if(CONFIG_GET(flag/use_antag_rep)) - CollectAntagReputation() - SaveRandomizedRecipes() - SavePanicBunker() - SavePaintings() - SaveScars() - -/datum/controller/subsystem/persistence/proc/LoadPanicBunker() - var/bunker_path = file("data/bunker_passthrough.json") - if(fexists(bunker_path)) - var/list/json = json_decode(file2text(bunker_path)) - GLOB.bunker_passthrough = json["data"] - for(var/ckey in GLOB.bunker_passthrough) - if(daysSince(GLOB.bunker_passthrough[ckey]) >= CONFIG_GET(number/max_bunker_days)) - GLOB.bunker_passthrough -= ckey - /datum/controller/subsystem/persistence/proc/GetPhotoAlbums() var/album_path = file("data/photo_albums.json") if(fexists(album_path)) @@ -329,35 +236,6 @@ SUBSYSTEM_DEF(persistence) WRITE_FILE(frame_path, frame_json) -/datum/controller/subsystem/persistence/proc/CollectSecretSatchels() - satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar)) - var/list/satchels_to_add = list() - for(var/A in new_secret_satchels) - var/obj/item/storage/backpack/satchel/flat/F = A - if(QDELETED(F) || F.z != SSmapping.station_start || F.invisibility != INVISIBILITY_MAXIMUM) - continue - var/list/savable_obj = list() - for(var/obj/O in F) - if(is_type_in_typecache(O, satchel_blacklist) || (O.flags_1 & ADMIN_SPAWNED_1)) - continue - if(O.persistence_replacement) - savable_obj += O.persistence_replacement - else - savable_obj += O.type - if(isemptylist(savable_obj)) - continue - var/list/data = list() - data["x"] = F.x - data["y"] = F.y - data["saved_obj"] = pick(savable_obj) - satchels_to_add += list(data) - - var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") - var/list/file_data = list() - fdel(json_file) - file_data["data"] = old_secret_satchels + satchels_to_add - WRITE_FILE(json_file, json_encode(file_data)) - /datum/controller/subsystem/persistence/proc/CollectChiselMessages() var/json_file = file("data/npc_saves/ChiselMessages[SSmapping.config.map_name].json") @@ -373,84 +251,6 @@ SUBSYSTEM_DEF(persistence) /datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M) saved_messages += list(M.pack()) // dm eats one list - -/datum/controller/subsystem/persistence/proc/CollectTrophies() - var/json_file = file("data/npc_saves/TrophyItems.json") - var/list/file_data = list() - file_data["data"] = remove_duplicate_trophies(saved_trophies) - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/SavePanicBunker() - var/json_file = file("data/bunker_passthrough.json") - var/list/file_data = list() - file_data["data"] = GLOB.bunker_passthrough - fdel(json_file) - WRITE_FILE(json_file,json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/remove_duplicate_trophies(list/trophies) - var/list/ukeys = list() - . = list() - for(var/trophy in trophies) - var/tkey = "[trophy["path"]]-[trophy["message"]]" - if(ukeys[tkey]) - continue - else - . += list(trophy) - ukeys[tkey] = TRUE - -/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T) - if(!T.added_roundstart && T.showpiece) - var/list/data = list() - data["path"] = T.showpiece.type - data["message"] = T.trophy_message - data["placer_key"] = T.placer_key - saved_trophies += list(data) - -/datum/controller/subsystem/persistence/proc/CollectRoundtype() - saved_modes[3] = saved_modes[2] - saved_modes[2] = saved_modes[1] - saved_modes[1] = SSticker.mode.config_tag - var/json_file = file("data/RecentModes.json") - var/list/file_data = list() - file_data["data"] = saved_modes - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode) - saved_storytellers.len = 3 - saved_storytellers[3] = saved_storytellers[2] - saved_storytellers[2] = saved_storytellers[1] - saved_storytellers[1] = mode.storyteller.name - average_dynamic_threat = (mode.threat_average + average_dynamic_threat) / 2 - var/json_file = file("data/RecentStorytellers.json") - var/list/file_data = list() - file_data["data"] = saved_storytellers + average_dynamic_threat - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/CollectRulesets(var/datum/game_mode/dynamic/mode) - saved_dynamic_rules[3] = saved_dynamic_rules[2] - saved_dynamic_rules[2] = saved_dynamic_rules[1] - saved_dynamic_rules[1] = list() - for(var/r in mode.executed_rules) - var/datum/dynamic_ruleset/rule = r - saved_dynamic_rules[1] += rule.config_tag - var/json_file = file("data/RecentRulesets.json") - var/list/file_data = list() - file_data["data"] = saved_dynamic_rules - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/RecordMaps() - saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]") - var/json_file = file("data/RecentMaps.json") - var/list/file_data = list() - file_data["maps"] = saved_maps - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - - /datum/controller/subsystem/persistence/proc/CollectAntagReputation() var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum) @@ -550,3 +350,15 @@ SUBSYSTEM_DEF(persistence) if(!ending_human.client) return ending_human.client.prefs.save_character() + +/datum/controller/subsystem/persistence/proc/SaveTCGCards() + for(var/i in GLOB.joined_player_list) + var/mob/living/carbon/human/ending_human = get_mob_by_ckey(i) + if(!istype(ending_human) || !ending_human.mind || !ending_human.client || !ending_human.client.prefs || !ending_human.client.prefs.tcg_cards) + continue + + var/mob/living/carbon/human/original_human = ending_human.mind.original_character + if(!original_human || original_human.stat == DEAD || !(original_human == ending_human)) + continue + + ending_human.SaveTCGCards() diff --git a/code/controllers/subsystem/persistence/cleanable_debris.dm b/code/controllers/subsystem/persistence/cleanable_debris.dm new file mode 100644 index 0000000000..a0817c460b --- /dev/null +++ b/code/controllers/subsystem/persistence/cleanable_debris.dm @@ -0,0 +1,177 @@ +/** + * Persistence for cleanable debris. + */ +/datum/controller/subsystem/persistence + /// tracks if we already loaded debris. Unlike everything else, this can actually be a major problem if some badmin procs it twice. + var/loaded_debris = FALSE + +/datum/controller/subsystem/persistence/LoadMapPersistence() + . = ..() + if(CONFIG_GET(flag/persistent_debris)) + LoadMapDebris() + +/datum/controller/subsystem/persistence/SaveMapPersistence() + . = ..() + if(CONFIG_GET(flag/persistent_debris)) + SaveMapDebris() + +/datum/controller/subsystem/persistence/proc/LoadMapDebris() + if(CONFIG_GET(flag/persistent_debris_only)) + wipe_existing_debris() + if(!fexists("[get_map_persistence_path()]/debris.json")) + return + if(loaded_debris) + return + loaded_debris = TRUE + var/list/allowed_turf_typecache = typecacheof(/turf/open) - typecacheof(/turf/open/space) + var/list/allowed_z_cache = list() + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + allowed_z_cache[num2text(z)] = TRUE + var/list/data = json_decode(file2text("[get_map_persistence_path()]/debris.json")) + var/list/z_lookup = list() + var/loaded = 0 + var/list/loaded_by_type = list() + var/nopath = 0 + var/badloc = 0 + var/noturf = 0 + /// reverse it + for(var/z in SSmapping.z_to_station_z_index) + var/sz = SSmapping.z_to_station_z_index[z] + z_lookup[num2text(sz)] = text2num(z) + for(var/z in data) + var/actual_z = z_lookup[z] + var/list/L1 = data[z] + for(var/x in L1) + var/list/L2 = data[z][x] + for(var/y in L2) + var/turf/tile = locate(text2num(x), text2num(y), actual_z) + if(!tile) + noturf++ + continue + var/list/objects = data[z][x][y] + for(var/_L in objects) + var/list/objdata + var/path + if(islist(_L)) + objdata = _L + path = text2path(objdata["__PATH__"]) + else + path = text2path(_L) + objdata = objects[_L] + if(!path) + nopath++ + continue + if(!IsValidDebrisLocation(tile, allowed_turf_typecache, allowed_z_cache, path, TRUE)) + badloc++ + continue + var/obj/effect/decal/cleanable/instantiated = new path(tile) + loaded_by_type[path] += 1 + loaded++ + if(objdata) + instantiated.PersistenceLoad(objdata) + var/list/bytype = list() + for(var/path in loaded_by_type) + bytype += "[path] - [loaded_by_type[path]]" + subsystem_log( + {"Debris loading completed: + Errors: + No path: [nopath] + Invalid location: [badloc] + No turf on map: [noturf] + Total loaded: [loaded] + By type: + [bytype.Join("\n")]"} + ) + +/datum/controller/subsystem/persistence/proc/SaveMapDebris() + if(fexists("[get_map_persistence_path()]/debris.json")) + fdel("[get_map_persistence_path()]/debris.json") + if(CONFIG_GET(flag/persistent_debris_wipe_on_nuke) && station_was_destroyed) + return // local janitor cheers on nukeop team to save some work + var/list/data = list() + var/list/z_lookup = SSmapping.z_to_station_z_index + var/list/debris = RelevantPersistentDebris() + var/obj/effect/decal/cleanable/saving + var/global_max = CONFIG_GET(number/persistent_debris_global_max) + var/type_max = CONFIG_GET(number/persistent_debris_type_max) + var/stored = 0 + var/list/stored_by_type = list() + for(var/i in debris) + saving = i + var/list/serializing = list() + var/path = saving.PersistenceSave(serializing) + if(!path) + continue + if(stored_by_type[path] > type_max) + continue + var/text_z = num2text(z_lookup[num2text(saving.z)]) + var/text_y = num2text(saving.y) + var/text_x = num2text(saving.x) + LAZYINITLIST(data[text_z]) + LAZYINITLIST(data[text_z][text_x]) + LAZYINITLIST(data[text_z][text_x][text_y]) + if(saving.persistence_allow_stacking) + serializing["__PATH__"] = path + data[text_z][text_x][text_y] += list(serializing) + else + data[text_z][text_x][text_y][path] = serializing + stored++ + if(stored > global_max) + var/w = "Persistent debris saving globally aborted due to global max >= [global_max]. Either janitors never do their jobs or something is wrong." + message_admins(w) + subsystem_log(w) + return + stored_by_type[path] = stored_by_type[path]? stored_by_type[path] + 1 : 1 + if(stored_by_type[path] > type_max) + var/w = "Persistent debris saving aborted for type [path] due to type max >= [global_max]. Either janitors never do their jobs or something is wrong." + message_admins(w) + subsystem_log(w) + + var/list/bytype = list() + for(var/path in stored_by_type) + bytype += "[path] - [stored_by_type[path]]" + subsystem_log( + {"Debris saving completed: + Total: [stored] + By type: + [bytype.Join("\n")]"} + ) + WRITE_FILE(file("[get_map_persistence_path()]/debris.json"), json_encode(data)) + +/datum/controller/subsystem/persistence/proc/IsValidDebrisLocation(turf/tile, list/allowed_typecache, list/allowed_zcache, obj/effect/decal/cleanable/type, loading = FALSE) + if(!allowed_typecache[tile.type]) + return FALSE + var/area/A = tile.loc + if(!A.persistent_debris_allowed) + return FALSE + if(!allowed_zcache[num2text(tile.z)]) + return FALSE + if(loading) + if(!initial(type.persistence_allow_stacking)) + var/obj/effect/decal/cleanable/C = locate(type) in tile + if(!QDELETED(C)) + return FALSE + // Saving verifies allow stacking in the save proc. + for(var/obj/structure/window/W in tile) + if(W.fulltile) + return FALSE + return TRUE + +/datum/controller/subsystem/persistence/proc/wipe_existing_debris() + var/list/existing = RelevantPersistentDebris() + QDEL_LIST(existing) + +/datum/controller/subsystem/persistence/proc/RelevantPersistentDebris() + var/list/allowed_turf_typecache = typecacheof(/turf/open) - typecacheof(/turf/open/space) + var/list/allowed_z_cache = list() + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + allowed_z_cache[num2text(z)] = TRUE + . = list() + for(var/obj/effect/decal/cleanable/C in world) + if(!C.loc || QDELETED(C)) + continue + if(!C.persistent) + continue + if(!IsValidDebrisLocation(C.loc, allowed_turf_typecache, allowed_z_cache, C.type, FALSE)) + continue + . += C diff --git a/code/controllers/subsystem/persistence/panic_bunker.dm b/code/controllers/subsystem/persistence/panic_bunker.dm new file mode 100644 index 0000000000..93ada2835c --- /dev/null +++ b/code/controllers/subsystem/persistence/panic_bunker.dm @@ -0,0 +1,26 @@ +/** + * Persists panic bunker whitelisting for a configured period of time + */ +/datum/controller/subsystem/persistence/LoadServerPersistence() + . = ..() + LoadPanicBunker() + +/datum/controller/subsystem/persistence/SaveServerPersistence() + . = ..() + SavePanicBunker() + +/datum/controller/subsystem/persistence/proc/LoadPanicBunker() + var/bunker_path = file("data/bunker_passthrough.json") + if(fexists(bunker_path)) + var/list/json = json_decode(file2text(bunker_path)) + GLOB.bunker_passthrough = json["data"] + for(var/ckey in GLOB.bunker_passthrough) + if(daysSince(GLOB.bunker_passthrough[ckey]) >= CONFIG_GET(number/max_bunker_days)) + GLOB.bunker_passthrough -= ckey + +/datum/controller/subsystem/persistence/proc/SavePanicBunker() + var/json_file = file("data/bunker_passthrough.json") + var/list/file_data = list() + file_data["data"] = GLOB.bunker_passthrough + fdel(json_file) + WRITE_FILE(json_file,json_encode(file_data)) diff --git a/code/controllers/subsystem/persistence/poly_parrot.dm b/code/controllers/subsystem/persistence/poly_parrot.dm new file mode 100644 index 0000000000..64743e9623 --- /dev/null +++ b/code/controllers/subsystem/persistence/poly_parrot.dm @@ -0,0 +1,11 @@ +/** + * Persists poly messages across rounds + */ +/datum/controller/subsystem/persistence/LoadGamePersistence() + . = ..() + LoadPoly() + +/datum/controller/subsystem/persistence/proc/LoadPoly() + for(var/mob/living/simple_animal/parrot/Poly/P in GLOB.alive_mob_list) + twitterize(P.speech_buffer, "polytalk") + break //Who's been duping the bird?! diff --git a/code/controllers/subsystem/persistence/recent_votes_etc.dm b/code/controllers/subsystem/persistence/recent_votes_etc.dm new file mode 100644 index 0000000000..f1b902d6ab --- /dev/null +++ b/code/controllers/subsystem/persistence/recent_votes_etc.dm @@ -0,0 +1,107 @@ +/** + * Stores recently played gamemodes, maps, etc. + */ +/datum/controller/subsystem/persistence + var/list/saved_modes = list(1,2,3) + var/list/saved_dynamic_rules = list(list(),list(),list()) + var/list/saved_storytellers = list("foo","bar","baz") + var/list/average_dynamic_threat = 50 + var/list/saved_maps + +/datum/controller/subsystem/persistence/SaveServerPersistence() + . = ..() + CollectRoundtype() + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + CollectStoryteller(mode) + CollectRulesets(mode) + RecordMaps() + +/datum/controller/subsystem/persistence/LoadServerPersistence() + . = ..() + LoadRecentModes() + LoadRecentStorytellers() + LoadRecentRulesets() + LoadRecentMaps() + +/datum/controller/subsystem/persistence/proc/CollectRoundtype() + saved_modes[3] = saved_modes[2] + saved_modes[2] = saved_modes[1] + saved_modes[1] = SSticker.mode.config_tag + var/json_file = file("data/RecentModes.json") + var/list/file_data = list() + file_data["data"] = saved_modes + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode) + saved_storytellers.len = 3 + saved_storytellers[3] = saved_storytellers[2] + saved_storytellers[2] = saved_storytellers[1] + saved_storytellers[1] = mode.storyteller.name + average_dynamic_threat = (mode.max_threat + average_dynamic_threat) / 2 + var/json_file = file("data/RecentStorytellers.json") + var/list/file_data = list() + file_data["data"] = saved_storytellers + average_dynamic_threat + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/CollectRulesets(var/datum/game_mode/dynamic/mode) + saved_dynamic_rules[3] = saved_dynamic_rules[2] + saved_dynamic_rules[2] = saved_dynamic_rules[1] + saved_dynamic_rules[1] = list() + for(var/r in mode.executed_rules) + var/datum/dynamic_ruleset/rule = r + saved_dynamic_rules[1] += rule.config_tag + var/json_file = file("data/RecentRulesets.json") + var/list/file_data = list() + file_data["data"] = saved_dynamic_rules + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/RecordMaps() + saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]") + var/json_file = file("data/RecentMaps.json") + var/list/file_data = list() + file_data["maps"] = saved_maps + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/LoadRecentModes() + var/json_file = file("data/RecentModes.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_modes = json["data"] + +/datum/controller/subsystem/persistence/proc/LoadRecentRulesets() + var/json_file = file("data/RecentRulesets.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_dynamic_rules = json["data"] + +/datum/controller/subsystem/persistence/proc/LoadRecentStorytellers() + var/json_file = file("data/RecentStorytellers.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_storytellers = json["data"] + if(saved_storytellers.len > 3) + average_dynamic_threat = saved_storytellers[4] + saved_storytellers.len = 3 + +/datum/controller/subsystem/persistence/proc/LoadRecentMaps() + var/json_file = file("data/RecentMaps.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_maps = json["maps"] diff --git a/code/controllers/subsystem/persistence/secret_satchels.dm b/code/controllers/subsystem/persistence/secret_satchels.dm new file mode 100644 index 0000000000..fa2a445317 --- /dev/null +++ b/code/controllers/subsystem/persistence/secret_satchels.dm @@ -0,0 +1,79 @@ +/** + * Secret satchel persistence - allows storing of items in underfloor satchels that's loaded later. + */ +/datum/controller/subsystem/persistence + var/list/satchel_blacklist = list() //this is a typecache + var/list/new_secret_satchels = list() //these are objects + var/list/old_secret_satchels = list() + +/datum/controller/subsystem/persistence/LoadGamePersistence() + . = ..() + LoadSatchels() + +/datum/controller/subsystem/persistence/SaveGamePersistence() + . = ..() + CollectSecretSatchels() + +/datum/controller/subsystem/persistence/proc/LoadSatchels() + var/placed_satchel = 0 + var/path + + var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") + var/list/json = list() + if(fexists(json_file)) + json = json_decode(file2text(json_file)) + + old_secret_satchels = json["data"] + var/obj/item/storage/backpack/satchel/flat/F + if(old_secret_satchels && old_secret_satchels.len >= 10) //guards against low drop pools assuring that one player cannot reliably find his own gear. + var/pos = rand(1, old_secret_satchels.len) + F = new() + old_secret_satchels.Cut(pos, pos+1 % old_secret_satchels.len) + F.x = old_secret_satchels[pos]["x"] + F.y = old_secret_satchels[pos]["y"] + F.z = SSmapping.station_start + path = text2path(old_secret_satchels[pos]["saved_obj"]) + + if(F) + if(isfloorturf(F.loc) && !isplatingturf(F.loc)) + F.hide(1) + if(ispath(path)) + var/spawned_item = new path(F) + spawned_objects[spawned_item] = TRUE + placed_satchel++ + var/free_satchels = 0 + for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,SSmapping.station_start), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,SSmapping.station_start)))) //Nontrivially expensive but it's roundstart only + if(isfloorturf(T) && !isplatingturf(T)) + new /obj/item/storage/backpack/satchel/flat/secret(T) + free_satchels++ + if((free_satchels + placed_satchel) == 10) //ten tiles, more than enough to kill anything that moves + break + +/datum/controller/subsystem/persistence/proc/CollectSecretSatchels() + satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar)) + var/list/satchels_to_add = list() + for(var/A in new_secret_satchels) + var/obj/item/storage/backpack/satchel/flat/F = A + if(QDELETED(F) || F.z != SSmapping.station_start || F.invisibility != INVISIBILITY_MAXIMUM) + continue + var/list/savable_obj = list() + for(var/obj/O in F) + if(is_type_in_typecache(O, satchel_blacklist) || (O.flags_1 & ADMIN_SPAWNED_1)) + continue + if(O.persistence_replacement) + savable_obj += O.persistence_replacement + else + savable_obj += O.type + if(isemptylist(savable_obj)) + continue + var/list/data = list() + data["x"] = F.x + data["y"] = F.y + data["saved_obj"] = pick(savable_obj) + satchels_to_add += list(data) + + var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") + var/list/file_data = list() + fdel(json_file) + file_data["data"] = old_secret_satchels + satchels_to_add + WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/controllers/subsystem/persistence/trophies.dm b/code/controllers/subsystem/persistence/trophies.dm new file mode 100644 index 0000000000..770ca99125 --- /dev/null +++ b/code/controllers/subsystem/persistence/trophies.dm @@ -0,0 +1,84 @@ +/** + * Stores trophies in curator display cases + */ +/datum/controller/subsystem/persistence + var/list/saved_trophies = list() + +/datum/controller/subsystem/persistence/LoadGamePersistence() + . = ..() + LoadTrophies() + +/datum/controller/subsystem/persistence/SaveGamePersistence() + . = ..() + CollectTrophies() + +/datum/controller/subsystem/persistence/proc/LoadTrophies() + if(fexists("data/npc_saves/TrophyItems.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/TrophyItems.sav") + var/saved_json + S >> saved_json + if(!saved_json) + return + saved_trophies = json_decode(saved_json) + fdel("data/npc_saves/TrophyItems.sav") + else + var/json_file = file("data/npc_saves/TrophyItems.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_trophies = json["data"] + SetUpTrophies(saved_trophies.Copy()) + +/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) + for(var/A in GLOB.trophy_cases) + var/obj/structure/displaycase/trophy/T = A + if (T.showpiece) + continue + T.added_roundstart = TRUE + + var/trophy_data = pick_n_take(trophy_items) + + if(!islist(trophy_data)) + continue + + var/list/chosen_trophy = trophy_data + + if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed + continue + + var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null + if(!path) + continue + + T.showpiece = new /obj/item/showpiece_dummy(T, path) + T.trophy_message = chosen_trophy["message"] + T.placer_key = chosen_trophy["placer_key"] + T.update_icon() + +/datum/controller/subsystem/persistence/proc/CollectTrophies() + var/json_file = file("data/npc_saves/TrophyItems.json") + var/list/file_data = list() + file_data["data"] = remove_duplicate_trophies(saved_trophies) + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/remove_duplicate_trophies(list/trophies) + var/list/ukeys = list() + . = list() + for(var/trophy in trophies) + var/tkey = "[trophy["path"]]-[trophy["message"]]" + if(ukeys[tkey]) + continue + else + . += list(trophy) + ukeys[tkey] = TRUE + +/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T) + if(!T.added_roundstart && T.showpiece) + var/list/data = list() + data["path"] = T.showpiece.type + data["message"] = T.trophy_message + data["placer_key"] = T.placer_key + saved_trophies += list(data) diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm index ac720a7fb4..880e7a16a8 100644 --- a/code/controllers/subsystem/processing/circuit.dm +++ b/code/controllers/subsystem/processing/circuit.dm @@ -50,17 +50,20 @@ PROCESSING_SUBSYSTEM_DEF(circuit) /obj/item/electronic_assembly/simple, /obj/item/electronic_assembly/hook, /obj/item/electronic_assembly/pda, + /obj/item/electronic_assembly/dildo, /obj/item/electronic_assembly/small/default, /obj/item/electronic_assembly/small/cylinder, /obj/item/electronic_assembly/small/scanner, /obj/item/electronic_assembly/small/hook, /obj/item/electronic_assembly/small/box, + /obj/item/electronic_assembly/small/dildo, /obj/item/electronic_assembly/medium/default, /obj/item/electronic_assembly/medium/box, /obj/item/electronic_assembly/medium/clam, /obj/item/electronic_assembly/medium/medical, /obj/item/electronic_assembly/medium/gun, /obj/item/electronic_assembly/medium/radio, + /obj/item/electronic_assembly/medium/dildo, /obj/item/electronic_assembly/large/default, /obj/item/electronic_assembly/large/scope, /obj/item/electronic_assembly/large/terminal, diff --git a/code/controllers/subsystem/processing/fastprocess.dm b/code/controllers/subsystem/processing/fastprocess.dm index 9622e02146..1b30ca44c2 100644 --- a/code/controllers/subsystem/processing/fastprocess.dm +++ b/code/controllers/subsystem/processing/fastprocess.dm @@ -1,6 +1,4 @@ -//Fires five times every second. - PROCESSING_SUBSYSTEM_DEF(fastprocess) name = "Fast Processing" - wait = 2 + wait = 0.2 SECONDS stat_tag = "FP" diff --git a/code/controllers/subsystem/processing/nanites.dm b/code/controllers/subsystem/processing/nanites.dm index 5b53f9f884..8a55491f5f 100644 --- a/code/controllers/subsystem/processing/nanites.dm +++ b/code/controllers/subsystem/processing/nanites.dm @@ -1,7 +1,7 @@ PROCESSING_SUBSYSTEM_DEF(nanites) name = "Nanites" flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT - wait = 10 + wait = 1 SECONDS var/list/datum/nanite_cloud_backup/cloud_backups = list() var/list/mob/living/nanite_monitored_mobs = list() @@ -19,4 +19,4 @@ PROCESSING_SUBSYSTEM_DEF(nanites) if(!force && !check_hardware(backup)) return if(backup.cloud_id == cloud_id) - return backup \ No newline at end of file + return backup diff --git a/code/controllers/subsystem/processing/obj.dm b/code/controllers/subsystem/processing/obj.dm index 26021fb267..3566e8a4dc 100644 --- a/code/controllers/subsystem/processing/obj.dm +++ b/code/controllers/subsystem/processing/obj.dm @@ -2,4 +2,4 @@ PROCESSING_SUBSYSTEM_DEF(obj) name = "Objects" priority = FIRE_PRIORITY_OBJ flags = SS_NO_INIT - wait = 20 + wait = 2 SECONDS diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 637b04993d..5cefd3a148 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -1,10 +1,10 @@ -//Used to process objects. Fires once every second. +//Used to process objects. SUBSYSTEM_DEF(processing) name = "Processing" priority = FIRE_PRIORITY_PROCESS flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT - wait = 10 + wait = 1 SECONDS var/stat_tag = "P" //Used for logging var/list/processing = list() @@ -14,9 +14,10 @@ SUBSYSTEM_DEF(processing) msg = "[stat_tag]:[length(processing)]" return ..() -/datum/controller/subsystem/processing/fire(resumed = 0) +/datum/controller/subsystem/processing/fire(resumed = FALSE) if (!resumed) currentrun = processing.Copy() + var/delta_time = (flags & SS_TICKER)? (wait * world.tick_lag * 0.1) : (wait * 0.1) //cache for sanic speed (lists are references anyways) var/list/current_run = currentrun @@ -25,12 +26,26 @@ SUBSYSTEM_DEF(processing) current_run.len-- if(QDELETED(thing)) processing -= thing - else if(thing.process(wait) == PROCESS_KILL) + else if(thing.process(delta_time) == PROCESS_KILL) // fully stop so that a future START_PROCESSING will work STOP_PROCESSING(src, thing) if (MC_TICK_CHECK) return -/datum/proc/process() - set waitfor = 0 + +/** + * This proc is called on a datum on every "cycle" if it is being processed by a subsystem. The time between each cycle is determined by the subsystem's "wait" setting. + * You can start and stop processing a datum using the START_PROCESSING and STOP_PROCESSING defines. + * + * Since the wait setting of a subsystem can be changed at any time, it is important that any rate-of-change that you implement in this proc is multiplied by the delta_time that is sent as a parameter, + * Additionally, any "prob" you use in this proc should instead use the DT_PROB define to make sure that the final probability per second stays the same even if the subsystem's wait is altered. + * Examples where this must be considered: + * - Implementing a cooldown timer, use `mytimer -= delta_time`, not `mytimer -= 1`. This way, `mytimer` will always have the unit of seconds + * - Damaging a mob, do `L.adjustFireLoss(20 * delta_time)`, not `L.adjustFireLoss(20)`. This way, the damage per second stays constant even if the wait of the subsystem is changed + * - Probability of something happening, do `if(DT_PROB(25, delta_time))`, not `if(prob(25))`. This way, if the subsystem wait is e.g. lowered, there won't be a higher chance of this event happening per second + * + * If you override this do not call parent, as it will return PROCESS_KILL. This is done to prevent objects that dont override process() from staying in the processing list + */ +/datum/proc/process(delta_time) + set waitfor = FALSE return PROCESS_KILL diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index c57bac5526..74cd53b0ae 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -5,8 +5,8 @@ PROCESSING_SUBSYSTEM_DEF(quirks) name = "Quirks" init_order = INIT_ORDER_QUIRKS flags = SS_BACKGROUND - wait = 10 runlevels = RUNLEVEL_GAME + wait = 1 SECONDS var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/ var/list/quirk_names_by_path = list() diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm index 81fa77dc6c..7533e9663f 100644 --- a/code/controllers/subsystem/profiler.dm +++ b/code/controllers/subsystem/profiler.dm @@ -18,7 +18,7 @@ SUBSYSTEM_DEF(profiler) if(CONFIG_GET(flag/auto_profile)) StartProfiling() else - StopProfiling() //Stop the early start from world/New + StopProfiling() //Stop the early start profiler return ..() /datum/controller/subsystem/profiler/fire() @@ -31,12 +31,23 @@ SUBSYSTEM_DEF(profiler) return ..() /datum/controller/subsystem/profiler/proc/StartProfiling() +#if DM_BUILD < 1506 + stack_trace("Auto profiling unsupported on this byond version") + CONFIG_SET(flag/auto_profile, FALSE) +#else world.Profile(PROFILE_START) +#endif /datum/controller/subsystem/profiler/proc/StopProfiling() +#if DM_BUILD >= 1506 world.Profile(PROFILE_STOP) +#endif /datum/controller/subsystem/profiler/proc/DumpFile() +#if DM_BUILD < 1506 + stack_trace("Auto profiling unsupported on this byond version") + CONFIG_SET(flag/auto_profile, FALSE) +#else var/timer = TICK_USAGE_REAL var/current_profile_data = world.Profile(PROFILE_REFRESH,format="json") fetch_cost = MC_AVERAGE(fetch_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) @@ -49,3 +60,4 @@ SUBSYSTEM_DEF(profiler) timer = TICK_USAGE_REAL WRITE_FILE(json_file, current_profile_data) write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) +#endif diff --git a/code/controllers/subsystem/radiation.dm b/code/controllers/subsystem/radiation.dm index a6cd658bf6..2d764d84dd 100644 --- a/code/controllers/subsystem/radiation.dm +++ b/code/controllers/subsystem/radiation.dm @@ -1,6 +1,7 @@ PROCESSING_SUBSYSTEM_DEF(radiation) name = "Radiation" flags = SS_NO_INIT | SS_BACKGROUND + wait = 1 SECONDS var/list/warned_atoms = list() @@ -13,5 +14,5 @@ PROCESSING_SUBSYSTEM_DEF(radiation) warned_atoms[ref] = TRUE var/atom/master = contamination.parent SSblackbox.record_feedback("tally", "contaminated", 1, master.type) - var/msg = "has become contamintaed with enough radiation to contaminate other objects. || Source: [contamination.source] || Strength: [contamination.strength]" - master.investigate_log(msg, INVESTIGATE_RADIATION) \ No newline at end of file + var/msg = "has become contaminated with enough radiation to contaminate other objects. || Source: [contamination.source] || Strength: [contamination.strength]" + master.investigate_log(msg, INVESTIGATE_RADIATION) diff --git a/code/controllers/subsystem/runechat.dm b/code/controllers/subsystem/runechat.dm new file mode 100644 index 0000000000..9bd665e5ee --- /dev/null +++ b/code/controllers/subsystem/runechat.dm @@ -0,0 +1,238 @@ +/// Controls how many buckets should be kept, each representing a tick. (30 seconds worth) +#define BUCKET_LEN (world.fps * 1 * 30) +/// Helper for getting the correct bucket for a given chatmessage +#define BUCKET_POS(scheduled_destruction) (((round((scheduled_destruction - SSrunechat.head_offset) / world.tick_lag) + 1) % BUCKET_LEN) || BUCKET_LEN) +/// Gets the maximum time at which messages will be handled in buckets, used for deferring to secondary queue +#define BUCKET_LIMIT (world.time + TICKS2DS(min(BUCKET_LEN - (SSrunechat.practical_offset - DS2TICKS(world.time - SSrunechat.head_offset)) - 1, BUCKET_LEN - 1))) + +/** + * # Runechat Subsystem + * + * Maintains a timer-like system to handle destruction of runechat messages. Much of this code is modeled + * after or adapted from the timer subsystem. + * + * Note that this has the same structure for storing and queueing messages as the timer subsystem does + * for handling timers: the bucket_list is a list of chatmessage datums, each of which are the head + * of a circularly linked list. Any given index in bucket_list could be null, representing an empty bucket. + */ +SUBSYSTEM_DEF(runechat) + name = "Runechat" + flags = SS_TICKER | SS_NO_INIT + wait = 1 + priority = FIRE_PRIORITY_RUNECHAT + + /// world.time of the first entry in the bucket list, effectively the 'start time' of the current buckets + var/head_offset = 0 + /// Index of the first non-empty bucket + var/practical_offset = 1 + /// world.tick_lag the bucket was designed for + var/bucket_resolution = 0 + /// How many messages are in the buckets + var/bucket_count = 0 + /// List of buckets, each bucket holds every message that has to be killed that byond tick + var/list/bucket_list = list() + /// Queue used for storing messages that are scheduled for deletion too far in the future for the buckets + var/list/datum/chatmessage/second_queue = list() + +/datum/controller/subsystem/runechat/PreInit() + bucket_list.len = BUCKET_LEN + head_offset = world.time + bucket_resolution = world.tick_lag + +/datum/controller/subsystem/runechat/stat_entry(msg) + msg = "ActMsgs:[bucket_count] SecQueue:[length(second_queue)]" + return msg + +/datum/controller/subsystem/runechat/fire(resumed = FALSE) + // Store local references to datum vars as it is faster to access them this way + var/list/bucket_list = src.bucket_list + + if (MC_TICK_CHECK) + return + + + // Check for when we need to loop the buckets, this occurs when + // the head_offset is approaching BUCKET_LEN ticks in the past + if (practical_offset > BUCKET_LEN) + head_offset += TICKS2DS(BUCKET_LEN) + practical_offset = 1 + resumed = FALSE + + // Check for when we have to reset buckets, typically from auto-reset + if ((length(bucket_list) != BUCKET_LEN) || (world.tick_lag != bucket_resolution)) + reset_buckets() + bucket_list = src.bucket_list + resumed = FALSE + // Store a reference to the 'working' chatmessage so that we can resume if the MC + // has us stop mid-way through processing + var/static/datum/chatmessage/cm + if (!resumed) + cm = null + + // Iterate through each bucket starting from the practical offset + while (practical_offset <= BUCKET_LEN && head_offset + ((practical_offset - 1) * world.tick_lag) <= world.time) + var/datum/chatmessage/bucket_head = bucket_list[practical_offset] + if (!cm || !bucket_head || cm == bucket_head) + bucket_head = bucket_list[practical_offset] + cm = bucket_head + + while (cm) + // If the chatmessage hasn't yet had its life ended then do that now + var/datum/chatmessage/next = cm.next + if (!cm.eol_complete) + cm.end_of_life() + else if (!QDELETED(cm)) // otherwise if we haven't deleted it yet, do so (this is after EOL completion) + qdel(cm) + + if (MC_TICK_CHECK) + return + + // Break once we've processed the entire bucket + cm = next + if (cm == bucket_head) + break + + // Empty the bucket, check if anything in the secondary queue should be shifted to this bucket + bucket_list[practical_offset++] = null + var/i = 0 + for (i in 1 to length(second_queue)) + cm = second_queue[i] + if (cm.scheduled_destruction >= BUCKET_LIMIT) + i-- + break + + // Transfer the message into the bucket, performing necessary circular doubly-linked list operations + bucket_count++ + var/bucket_pos = max(1, BUCKET_POS(cm.scheduled_destruction)) + var/datum/timedevent/head = bucket_list[bucket_pos] + if (!head) + bucket_list[bucket_pos] = cm + cm.next = null + cm.prev = null + continue + + if (!head.prev) + head.prev = head + cm.next = head + cm.prev = head.prev + cm.next.prev = cm + cm.prev.next = cm + if (i) + second_queue.Cut(1, i + 1) + cm = null + +/datum/controller/subsystem/runechat/Recover() + bucket_list |= SSrunechat.bucket_list + second_queue |= SSrunechat.second_queue + +/datum/controller/subsystem/runechat/proc/reset_buckets() + bucket_list.len = BUCKET_LEN + head_offset = world.time + bucket_resolution = world.tick_lag + +/** + * Enters the runechat subsystem with this chatmessage, inserting it into the end-of-life queue + * + * This will also account for a chatmessage already being registered, and in which case + * the position will be updated to remove it from the previous location if necessary + * + * Arguments: + * * new_sched_destruction Optional, when provided is used to update an existing message with the new specified time + */ +/datum/chatmessage/proc/enter_subsystem(new_sched_destruction = 0) + // Get local references from subsystem as they are faster to access than the datum references + var/list/bucket_list = SSrunechat.bucket_list + var/list/second_queue = SSrunechat.second_queue + + // When necessary, de-list the chatmessage from its previous position + if (new_sched_destruction) + if (scheduled_destruction >= BUCKET_LIMIT) + second_queue -= src + else + SSrunechat.bucket_count-- + var/bucket_pos = BUCKET_POS(scheduled_destruction) + if (bucket_pos > 0) + var/datum/chatmessage/bucket_head = bucket_list[bucket_pos] + if (bucket_head == src) + bucket_list[bucket_pos] = next + if (prev != next) + prev.next = next + next.prev = prev + else + prev?.next = null + next?.prev = null + prev = next = null + scheduled_destruction = new_sched_destruction + + // Ensure the scheduled destruction time is properly bound to avoid missing a scheduled event + scheduled_destruction = max(CEILING(scheduled_destruction, world.tick_lag), world.time + world.tick_lag) + + // Handle insertion into the secondary queue if the required time is outside our tracked amounts + if (scheduled_destruction >= BUCKET_LIMIT) + BINARY_INSERT(src, SSrunechat.second_queue, /datum/chatmessage, src, scheduled_destruction, COMPARE_KEY) + return + + // Get bucket position and a local reference to the datum var, it's faster to access this way + var/bucket_pos = BUCKET_POS(scheduled_destruction) + + // Get the bucket head for that bucket, increment the bucket count + var/datum/chatmessage/bucket_head = bucket_list[bucket_pos] + SSrunechat.bucket_count++ + + // If there is no existing head of this bucket, we can set this message to be that head + if (!bucket_head) + bucket_list[bucket_pos] = src + return + + // Otherwise it's a simple insertion into the circularly doubly-linked list + if (!bucket_head.prev) + bucket_head.prev = bucket_head + next = bucket_head + prev = bucket_head.prev + next.prev = src + prev.next = src + + +/** + * Removes this chatmessage datum from the runechat subsystem + */ +/datum/chatmessage/proc/leave_subsystem() + // Attempt to find the bucket that contains this chat message + var/bucket_pos = BUCKET_POS(scheduled_destruction) + + // Get local references to the subsystem's vars, faster than accessing on the datum + var/list/bucket_list = SSrunechat.bucket_list + var/list/second_queue = SSrunechat.second_queue + + // Attempt to get the head of the bucket + var/datum/chatmessage/bucket_head + if (bucket_pos > 0) + bucket_head = bucket_list[bucket_pos] + + // Decrement the number of messages in buckets if the message is + // the head of the bucket, or has a SD less than BUCKET_LIMIT implying it fits + // into an existing bucket, or is otherwise not present in the secondary queue + if(bucket_head == src) + bucket_list[bucket_pos] = next + SSrunechat.bucket_count-- + else if(scheduled_destruction < BUCKET_LIMIT) + SSrunechat.bucket_count-- + else + var/l = length(second_queue) + second_queue -= src + if(l == length(second_queue)) + SSrunechat.bucket_count-- + + // Remove the message from the bucket, ensuring to maintain + // the integrity of the bucket's list if relevant + if(prev != next) + prev.next = next + next.prev = prev + else + prev?.next = null + next?.prev = null + prev = next = null + +#undef BUCKET_LEN +#undef BUCKET_POS +#undef BUCKET_LIMIT diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index 2427fbd277..7eb81003f1 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -56,12 +56,13 @@ SUBSYSTEM_DEF(server_maint) for(var/I in currentrun) var/client/C = I //handle kicking inactive players - if(round_started && kick_inactive && C.is_afk(afk_period)) + if(round_started && kick_inactive && !C.holder && C.is_afk(afk_period)) var/cmob = C.mob - if(!(isobserver(cmob) || (isdead(cmob) && C.holder))) + if (!isnewplayer(cmob) || !SSticker.queued_players.Find(cmob)) log_access("AFK: [key_name(C)]") - to_chat(C, "You have been inactive for more than [DisplayTimeText(afk_period)] and have been disconnected.") - qdel(C) + to_chat(C, "You have been inactive for more than [DisplayTimeText(afk_period)] and have been disconnected.
You may reconnect via the button in the file menu or by clicking here to reconnect.") + QDEL_IN(C, 1) //to ensure they get our message before getting disconnected + continue if (!(!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1))) winset(C, null, "command=.update_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]") @@ -83,4 +84,15 @@ SUBSYSTEM_DEF(server_maint) if(tgsversion) SSblackbox.record_feedback("text", "server_tools", 1, tgsversion.raw_parameter) + +/datum/controller/subsystem/server_maint/proc/UpdateHubStatus() + // if(!CONFIG_GET(flag/hub) || !CONFIG_GET(number/max_hub_pop)) + // return FALSE //no point, hub / auto hub controls are disabled + + // var/max_pop = CONFIG_GET(number/max_hub_pop) + + // if(GLOB.clients.len > max_pop) + // world.update_hub_visibility(FALSE) + // else + // world.update_hub_visibility(TRUE) #undef PING_BUFFER_TIME diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index c802448536..b74f1d46d3 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -47,7 +47,7 @@ SUBSYSTEM_DEF(shuttle) var/datum/round_event/shuttle_loan/shuttle_loan - var/shuttle_purchased = FALSE //If the station has purchased a replacement escape shuttle this round + var/shuttle_purchased = SHUTTLEPURCHASE_PURCHASABLE //If the station has purchased a replacement escape shuttle this round var/list/shuttle_purchase_requirements_met = list() //For keeping track of ingame events that would unlock new shuttles, such as defeating a boss or discovering a secret item var/lockdown = FALSE //disallow transit after nuke goes off diff --git a/code/controllers/subsystem/sounds.dm b/code/controllers/subsystem/sounds.dm index 5e7c5e6545..fa9ba3c472 100644 --- a/code/controllers/subsystem/sounds.dm +++ b/code/controllers/subsystem/sounds.dm @@ -5,34 +5,48 @@ SUBSYSTEM_DEF(sounds) flags = SS_NO_FIRE init_order = INIT_ORDER_SOUNDS var/static/using_channels_max = CHANNEL_HIGHEST_AVAILABLE //BYOND max channels + /// Amount of channels to reserve for random usage rather than reservations being allowed to reserve all channels. Also a nice safeguard for when someone screws up. + var/static/random_channels_min = 50 // Hey uh these two needs to be initialized fast because the whole "things get deleted before init" thing. - /// Assoc list, "[channel]" = either the datum using it or TRUE for an unsafe-reserved (datumless reservation) channel - var/list/using_channels = list() + /// Assoc list, `"[channel]" =` either the datum using it or TRUE for an unsafe-reserved (datumless reservation) channel + var/list/using_channels /// Assoc list datum = list(channel1, channel2, ...) for what channels something reserved. - var/list/using_channels_by_datum = list() - /// List of all available channels with associations set to TRUE for fast lookups/allocation. - var/list/available_channels + var/list/using_channels_by_datum + // Special datastructure for fast channel management + /// List of all channels as numbers + var/list/channel_list + /// Associative list of all reserved channels associated to their position. `"[channel_number]" =` index as number + var/list/reserved_channels + /// lower iteration position - Incremented and looped to get "random" sound channels for normal sounds. The channel at this index is returned when asking for a random channel. + var/channel_random_low + /// higher reserve position - decremented and incremented to reserve sound channels, anything above this is reserved. The channel at this index is the highest unreserved channel. + var/channel_reserve_high /datum/controller/subsystem/sounds/Initialize() setup_available_channels() return ..() /datum/controller/subsystem/sounds/proc/setup_available_channels() - available_channels = list() + channel_list = list() + reserved_channels = list() + using_channels = list() + using_channels_by_datum = list() for(var/i in 1 to using_channels_max) - available_channels[num2text(i)] = TRUE + channel_list += i + channel_random_low = 1 + channel_reserve_high = length(channel_list) /// Removes a channel from using list. /datum/controller/subsystem/sounds/proc/free_sound_channel(channel) - channel = num2text(channel) - var/using = using_channels[channel] - using_channels -= channel - if(using) + var/text_channel = num2text(channel) + var/using = using_channels[text_channel] + using_channels -= text_channel + if(using != TRUE) // datum channel using_channels_by_datum[using] -= channel if(!length(using_channels_by_datum[using])) using_channels_by_datum -= using - available_channels[channel] = TRUE + free_channel(channel) /// Frees all the channels a datum is using. /datum/controller/subsystem/sounds/proc/free_datum_channels(datum/D) @@ -40,8 +54,8 @@ SUBSYSTEM_DEF(sounds) if(!L) return for(var/channel in L) - using_channels -= channel - available_channels[channel] = TRUE + using_channels -= num2text(channel) + free_channel(channel) using_channels_by_datum -= D /// Frees all datumless channels @@ -50,42 +64,72 @@ SUBSYSTEM_DEF(sounds) /// NO AUTOMATIC CLEANUP - If you use this, you better manually free it later! Returns an integer for channel. /datum/controller/subsystem/sounds/proc/reserve_sound_channel_datumless() - var/channel = random_available_channel_text() - if(!channel) //oh no.. + . = reserve_channel() + if(!.) //oh no.. return FALSE - available_channels -= channel - using_channels[channel] = DATUMLESS + var/text_channel = num2text(.) + using_channels[text_channel] = DATUMLESS LAZYINITLIST(using_channels_by_datum[DATUMLESS]) - using_channels_by_datum[DATUMLESS] += channel - return text2num(channel) + using_channels_by_datum[DATUMLESS] += . /// Reserves a channel for a datum. Automatic cleanup only when the datum is deleted. Returns an integer for channel. /datum/controller/subsystem/sounds/proc/reserve_sound_channel(datum/D) if(!D) //i don't like typechecks but someone will fuck it up CRASH("Attempted to reserve sound channel without datum using the managed proc.") - var/channel = random_available_channel_text() - if(!channel) + .= reserve_channel() + if(!.) return FALSE - available_channels -= channel - using_channels[channel] = D + var/text_channel = num2text(.) + using_channels[text_channel] = D LAZYINITLIST(using_channels_by_datum[D]) - using_channels_by_datum[D] += channel - return text2num(channel) + using_channels_by_datum[D] += . + +/** + * Reserves a channel and updates the datastructure. Private proc. + */ +/datum/controller/subsystem/sounds/proc/reserve_channel() + PRIVATE_PROC(TRUE) + if(channel_reserve_high <= random_channels_min) // out of channels + return + var/channel = channel_list[channel_reserve_high] + reserved_channels[num2text(channel)] = channel_reserve_high-- + return channel + +/** + * Frees a channel and updates the datastructure. Private proc. + */ +/datum/controller/subsystem/sounds/proc/free_channel(number) + PRIVATE_PROC(TRUE) + var/text_channel = num2text(number) + var/index = reserved_channels[text_channel] + if(!index) + CRASH("Attempted to (internally) free a channel that wasn't reserved.") + reserved_channels -= text_channel + // push reserve index up, which makes it now on a channel that is reserved + channel_reserve_high++ + // swap the reserved channel wtih the unreserved channel so the reserve index is now on an unoccupied channel and the freed channel is next to be used. + channel_list.Swap(channel_reserve_high, index) + // now, an existing reserved channel will likely (exception: unreserving last reserved channel) be at index + // get it, and update position. + var/text_reserved = num2text(channel_list[index]) + if(!reserved_channels[text_reserved]) //if it isn't already reserved make sure we don't accidently mistakenly put it on reserved list! + return + reserved_channels[text_reserved] = index /// Random available channel, returns text. /datum/controller/subsystem/sounds/proc/random_available_channel_text() - return pick(available_channels) + if(channel_random_low > channel_reserve_high) + channel_random_low = 1 + . = "[channel_list[channel_random_low++]]" /// Random available channel, returns number /datum/controller/subsystem/sounds/proc/random_available_channel() - return text2num(pick(available_channels)) - -/// If a channel is available -/datum/controller/subsystem/sounds/proc/is_channel_available(channel) - return available_channels[num2text(channel)] + if(channel_random_low > channel_reserve_high) + channel_random_low = 1 + . = channel_list[channel_random_low++] /// How many channels we have left. /datum/controller/subsystem/sounds/proc/available_channels_left() - return length(available_channels) + return length(channel_list) - random_channels_min #undef DATUMLESS diff --git a/code/controllers/subsystem/spacedrift.dm b/code/controllers/subsystem/spacedrift.dm index c3261df304..e84a70a45f 100644 --- a/code/controllers/subsystem/spacedrift.dm +++ b/code/controllers/subsystem/spacedrift.dm @@ -13,7 +13,7 @@ SUBSYSTEM_DEF(spacedrift) return ..() -/datum/controller/subsystem/spacedrift/fire(resumed = 0) +/datum/controller/subsystem/spacedrift/fire(resumed = FALSE) if (!resumed) src.currentrun = processing.Copy() @@ -47,6 +47,7 @@ SUBSYSTEM_DEF(spacedrift) var/old_dir = AM.dir var/old_loc = AM.loc AM.inertia_moving = TRUE + AM.set_glide_size(DELAY_TO_GLIDE_SIZE(AM.inertia_move_delay), FALSE) step(AM, AM.inertia_dir) AM.inertia_moving = FALSE AM.inertia_next_move = world.time + AM.inertia_move_delay diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index cf7d4ba533..d0d5579611 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -27,28 +27,6 @@ SUBSYSTEM_DEF(statpanels) var/ETA = SSshuttle.emergency.getModeStr() if(ETA) global_data += "[ETA] [SSshuttle.emergency.getTimerStr()]" -/* Please fix - if(SSvote.mode) - var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING) - global_data += "Vote active!, There is currently a vote running. Question: [SSvote.question]" - if(!(SSvote.vote_system in supported)) - global_data += ", The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link." - return - global_data += "Time Left:, [round(SSvote.end_time - world.time)] seconds" - - global_data += "Choices:" - for(var/i in 1 to SSvote.choice_statclicks.len) - var/choice = SSvote.choice_statclicks[i] - var/ivotedforthis = FALSE - if(usr.ckey) - switch(SSvote.vote_system) - if(APPROVAL_VOTING) - ivotedforthis = SSvote.voted[usr.ckey] && (i in SSvote.voted[usr.ckey]) - if(PLURALITY_VOTING) - ivotedforthis = SSvote.voted[usr.ckey] == i - - global_data += (ivotedforthis? "\[X\]" : "\[ \]", SSvote.choice_statclicks[choice]) -*/ encoded_global_data = url_encode(json_encode(global_data)) src.currentrun = GLOB.clients.Copy() @@ -63,6 +41,38 @@ SUBSYSTEM_DEF(statpanels) var/ping_str = url_encode("Ping: [round(target.lastping, 1)]ms (Average: [round(target.avgping, 1)]ms)") var/other_str = url_encode(json_encode(target.mob.get_status_tab_items())) target << output("[encoded_global_data];[ping_str];[other_str]", "statbrowser:update") + if(SSvote.mode) + var/list/vote_arry = list( + list("Vote active!", "There is currently a vote running. Question: [SSvote.question]") + ) //see the MC on how this works. + if(!(SSvote.vote_system in list(PLURALITY_VOTING, APPROVAL_VOTING, SCHULZE_VOTING, INSTANT_RUNOFF_VOTING))) + vote_arry[++vote_arry.len] += list("STATPANEL VOTING DISABLED!", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.", "disabled") + //does not return. + else + vote_arry[++vote_arry.len] += list("Time Left:", " [DisplayTimeText(SSvote.end_time - world.time)] seconds") + vote_arry[++vote_arry.len] += list("Choices:", "") + for(var/choice in SSvote.choice_statclicks) + var/choice_id = SSvote.choice_statclicks[choice] + if(target.ckey) + switch(SSvote.vote_system) + if(PLURALITY_VOTING, APPROVAL_VOTING) + var/ivotedforthis = FALSE + if(SSvote.vote_system == APPROVAL_VOTING) + ivotedforthis = SSvote.voted[target.ckey] && (text2num(choice_id) in SSvote.voted[target.ckey]) + else + ivotedforthis = (SSvote.voted[target.ckey] == text2num(choice_id)) + vote_arry[++vote_arry.len] += list(ivotedforthis ? "\[X\]" : "\[ \]", choice, "[REF(SSvote)];vote=[choice_id];statpannel=1") + if(SCHULZE_VOTING, INSTANT_RUNOFF_VOTING) + var/list/vote = SSvote.voted[target.ckey] + var/vote_position = " " + if(vote) + vote_position = vote.Find(text2num(choice_id)) + vote_arry[++vote_arry.len] += list("\[[vote_position]\]", choice, "[REF(SSvote)];vote=[choice_id];statpannel=1") + var/vote_str = url_encode(json_encode(vote_arry)) + target << output("[vote_str]", "statbrowser:update_voting") + else + var/null_bullet = url_encode(json_encode(list(list(null)))) + target << output("[null_bullet]", "statbrowser:update_voting") if(!target.holder) target << output("", "statbrowser:remove_admin_tabs") else @@ -193,3 +203,4 @@ SUBSYSTEM_DEF(statpanels) set hidden = TRUE statbrowser_ready = TRUE + init_verbs() diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm index 189efa99fe..0c71777bc0 100644 --- a/code/controllers/subsystem/stickyban.dm +++ b/code/controllers/subsystem/stickyban.dm @@ -1,34 +1,231 @@ SUBSYSTEM_DEF(stickyban) - name = "Sticky Ban" + name = "PRISM" init_order = INIT_ORDER_STICKY_BAN flags = SS_NO_FIRE var/list/cache = list() + var/list/dbcache = list() + var/list/confirmed_exempt = list() + var/dbcacheexpire = 0 + /datum/controller/subsystem/stickyban/Initialize(timeofday) - var/list/bannedkeys = world.GetConfig("ban") + if (length(GLOB.stickybanadminexemptions)) + restore_stickybans() + var/list/bannedkeys = sticky_banned_ckeys() //sanitize the sticky ban list + + //delete db bans that no longer exist in the database and add new legacy bans to the database + if (SSdbcore.Connect() || length(SSstickyban.dbcache)) + if (length(GLOB.stickybanadminexemptions)) + restore_stickybans() + for (var/oldban in (world.GetConfig("ban") - bannedkeys)) + var/ckey = ckey(oldban) + if (ckey != oldban && (ckey in bannedkeys)) + continue + + var/list/ban = params2list(world.GetConfig("ban", oldban)) + if (ban && !ban["fromdb"]) + if (!import_raw_stickyban_to_db(ckey, ban)) + log_world("Could not import stickyban on [oldban] into the database. Ignoring") + continue + dbcacheexpire = 0 + bannedkeys += ckey + world.SetConfig("ban", oldban, null) + + if (length(GLOB.stickybanadminexemptions)) //the previous loop can sleep + restore_stickybans() + for (var/bannedkey in bannedkeys) var/ckey = ckey(bannedkey) - var/list/ban = stickyban2list(world.GetConfig("ban", bannedkey)) + var/list/ban = get_stickyban_from_ckey(bannedkey) - //byond stores sticky bans by key, that can end up confusing things - //i also remove it here so that if any stickybans cause a runtime, they just stop existing - world.SetConfig("ban", bannedkey, null) + //byond stores sticky bans by key, that's lame + if (ckey != bannedkey) + world.SetConfig("ban", bannedkey, null) if (!ban["ckey"]) ban["ckey"] = ckey - //storing these can break things and isn't needed for sticky ban tracking - ban -= "IP" - ban -= "computer_id" - ban["matches_this_round"] = list() ban["existing_user_matches_this_round"] = list() ban["admin_matches_this_round"] = list() + ban["pending_matches_this_round"] = list() + cache[ckey] = ban - - for (var/bannedckey in cache) - world.SetConfig("ban", bannedckey, list2stickyban(cache[bannedckey])) + world.SetConfig("ban", ckey, list2stickyban(ban)) return ..() + +/datum/controller/subsystem/stickyban/proc/Populatedbcache() + var/newdbcache = list() //so if we runtime or the db connection dies we don't kill the existing cache + + // var/datum/db_query/query_stickybans = SSdbcore.NewQuery("SELECT ckey, reason, banning_admin, datetime FROM [format_table_name("stickyban")] ORDER BY ckey") + // var/datum/db_query/query_ckey_matches = SSdbcore.NewQuery("SELECT stickyban, matched_ckey, first_matched, last_matched, exempt FROM [format_table_name("stickyban_matched_ckey")] ORDER BY first_matched") + // var/datum/db_query/query_cid_matches = SSdbcore.NewQuery("SELECT stickyban, matched_cid, first_matched, last_matched FROM [format_table_name("stickyban_matched_cid")] ORDER BY first_matched") + // var/datum/db_query/query_ip_matches = SSdbcore.NewQuery("SELECT stickyban, INET_NTOA(matched_ip), first_matched, last_matched FROM [format_table_name("stickyban_matched_ip")] ORDER BY first_matched") + + var/datum/DBQuery/query_stickybans = SSdbcore.NewQuery("SELECT ckey, reason, banning_admin, datetime FROM [format_table_name("stickyban")] ORDER BY ckey") + var/datum/DBQuery/query_ckey_matches = SSdbcore.NewQuery("SELECT stickyban, matched_ckey, first_matched, last_matched, exempt FROM [format_table_name("stickyban_matched_ckey")] ORDER BY first_matched") + var/datum/DBQuery/query_cid_matches = SSdbcore.NewQuery("SELECT stickyban, matched_cid, first_matched, last_matched FROM [format_table_name("stickyban_matched_cid")] ORDER BY first_matched") + var/datum/DBQuery/query_ip_matches = SSdbcore.NewQuery("SELECT stickyban, INET_NTOA(matched_ip), first_matched, last_matched FROM [format_table_name("stickyban_matched_ip")] ORDER BY first_matched") + + SSdbcore.QuerySelect(list(query_stickybans, query_ckey_matches, query_cid_matches, query_ip_matches)) + + if (query_stickybans.last_error) + qdel(query_stickybans) + qdel(query_ckey_matches) + qdel(query_cid_matches) + qdel(query_ip_matches) + return + + while (query_stickybans.NextRow()) + var/list/ban = list() + + ban["ckey"] = query_stickybans.item[1] + ban["message"] = query_stickybans.item[2] + ban["reason"] = "(InGameBan)([query_stickybans.item[3]])" + ban["admin"] = query_stickybans.item[3] + ban["datetime"] = query_stickybans.item[4] + ban["type"] = list("sticky") + + newdbcache["[query_stickybans.item[1]]"] = ban + + + if (!query_ckey_matches.last_error) + while (query_ckey_matches.NextRow()) + var/list/match = list() + + match["stickyban"] = query_ckey_matches.item[1] + match["matched_ckey"] = query_ckey_matches.item[2] + match["first_matched"] = query_ckey_matches.item[3] + match["last_matched"] = query_ckey_matches.item[4] + match["exempt"] = text2num(query_ckey_matches.item[5]) + + var/ban = newdbcache[query_ckey_matches.item[1]] + if (!ban) + continue + var/keys = ban[text2num(query_ckey_matches.item[5]) ? "whitelist" : "keys"] + if (!keys) + keys = ban[text2num(query_ckey_matches.item[5]) ? "whitelist" : "keys"] = list() + keys[query_ckey_matches.item[2]] = match + + if (!query_cid_matches.last_error) + while (query_cid_matches.NextRow()) + var/list/match = list() + + match["stickyban"] = query_cid_matches.item[1] + match["matched_cid"] = query_cid_matches.item[2] + match["first_matched"] = query_cid_matches.item[3] + match["last_matched"] = query_cid_matches.item[4] + + var/ban = newdbcache[query_cid_matches.item[1]] + if (!ban) + continue + var/computer_ids = ban["computer_id"] + if (!computer_ids) + computer_ids = ban["computer_id"] = list() + computer_ids[query_cid_matches.item[2]] = match + + + if (!query_ip_matches.last_error) + while (query_ip_matches.NextRow()) + var/list/match = list() + + match["stickyban"] = query_ip_matches.item[1] + match["matched_ip"] = query_ip_matches.item[2] + match["first_matched"] = query_ip_matches.item[3] + match["last_matched"] = query_ip_matches.item[4] + + var/ban = newdbcache[query_ip_matches.item[1]] + if (!ban) + continue + var/IPs = ban["IP"] + if (!IPs) + IPs = ban["IP"] = list() + IPs[query_ip_matches.item[2]] = match + + dbcache = newdbcache + dbcacheexpire = world.time+STICKYBAN_DB_CACHE_TIME + + qdel(query_stickybans) + qdel(query_ckey_matches) + qdel(query_cid_matches) + qdel(query_ip_matches) + + +/datum/controller/subsystem/stickyban/proc/import_raw_stickyban_to_db(ckey, list/ban) + . = FALSE + if (!ban["admin"]) + ban["admin"] = "LEGACY" + if (!ban["message"]) + ban["message"] = "Evasion" + + // TODO: USE NEW DB IMPLEMENTATION + var/datum/DBQuery/query_create_stickyban = SSdbcore.NewQuery( + "INSERT IGNORE INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES ([ckey], [ban["message"]], ban["admin"]))" + ) + + if (query_create_stickyban.warn_execute()) + qdel(query_create_stickyban) + return + qdel(query_create_stickyban) + + // var/datum/db_query/query_create_stickyban = SSdbcore.NewQuery( + // "INSERT IGNORE INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES (:ckey, :message, :admin)", + // list("ckey" = ckey, "message" = ban["message"], "admin" = ban["admin"]) + // ) + // if (!query_create_stickyban.warn_execute()) + // qdel(query_create_stickyban) + // return + // qdel(query_create_stickyban) + + var/list/sqlckeys = list() + var/list/sqlcids = list() + var/list/sqlips = list() + + if (ban["keys"]) + var/list/keys = splittext(ban["keys"], ",") + for (var/key in keys) + var/list/sqlckey = list() + sqlckey["stickyban"] = ckey + sqlckey["matched_ckey"] = ckey(key) + sqlckey["exempt"] = FALSE + sqlckeys[++sqlckeys.len] = sqlckey + + if (ban["whitelist"]) + var/list/keys = splittext(ban["whitelist"], ",") + for (var/key in keys) + var/list/sqlckey = list() + sqlckey["stickyban"] = ckey + sqlckey["matched_ckey"] = ckey(key) + sqlckey["exempt"] = TRUE + sqlckeys[++sqlckeys.len] = sqlckey + + if (ban["computer_id"]) + var/list/cids = splittext(ban["computer_id"], ",") + for (var/cid in cids) + var/list/sqlcid = list() + sqlcid["stickyban"] = ckey + sqlcid["matched_cid"] = cid + sqlcids[++sqlcids.len] = sqlcid + + if (ban["IP"]) + var/list/ips = splittext(ban["IP"], ",") + for (var/ip in ips) + var/list/sqlip = list() + sqlip["stickyban"] = ckey + sqlip["matched_ip"] = ip + sqlips[++sqlips.len] = sqlip + + if (length(sqlckeys)) + SSdbcore.MassInsert(format_table_name("stickyban_matched_ckey"), sqlckeys, ignore_errors = TRUE) + + if (length(sqlcids)) + SSdbcore.MassInsert(format_table_name("stickyban_matched_cid"), sqlcids, ignore_errors = TRUE) + + if (length(sqlips)) + SSdbcore.MassInsert(format_table_name("stickyban_matched_ip"), sqlips, ignore_errors = TRUE) + + + return TRUE diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 8c5abc5469..0fa8035d72 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -57,6 +57,7 @@ SUBSYSTEM_DEF(throwing) var/dx var/dy var/force = MOVE_FORCE_DEFAULT + var/gentle = FALSE var/pure_diagonal var/diagonal_error var/datum/callback/callback @@ -64,15 +65,44 @@ SUBSYSTEM_DEF(throwing) var/delayed_time = 0 var/last_move = 0 + +/datum/thrownthing/New(thrownthing, target, target_turf, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone) + . = ..() + src.thrownthing = thrownthing + RegisterSignal(thrownthing, COMSIG_PARENT_QDELETING, .proc/on_thrownthing_qdel) + src.target = target + src.target_turf = target_turf + src.init_dir = init_dir + src.maxrange = maxrange + src.speed = speed + src.thrower = thrower + src.diagonals_first = diagonals_first + src.force = force + src.gentle = gentle + src.callback = callback + src.target_zone = target_zone + + /datum/thrownthing/Destroy() + if(HAS_TRAIT_FROM(thrownthing, TRAIT_SPOOKY_THROW, "revenant")) + REMOVE_TRAIT(thrownthing, TRAIT_SPOOKY_THROW, "revenant") SSthrowing.processing -= thrownthing thrownthing.throwing = null thrownthing = null target = null thrower = null - callback = null + if(callback) + QDEL_NULL(callback) //It stores a reference to the thrownthing, its source. Let's clean that. return ..() + +///Defines the datum behavior on the thrownthing's qdeletion event. +/datum/thrownthing/proc/on_thrownthing_qdel(atom/movable/source, force) + SIGNAL_HANDLER + + qdel(src) + + /datum/thrownthing/proc/tick() var/atom/movable/AM = thrownthing if (!isturf(AM.loc) || !AM.throwing) @@ -112,7 +142,7 @@ SUBSYSTEM_DEF(throwing) finalize() return - AM.Move(step, get_dir(AM, step)) + AM.Move(step, get_dir(AM, step), DELAY_TO_GLIDE_SIZE(1 / speed)) if (!AM.throwing) // we hit something during our move finalize(hit = TRUE) @@ -136,15 +166,21 @@ SUBSYSTEM_DEF(throwing) if (A == target) hit = TRUE thrownthing.throw_impact(A, src) + if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing + return //deletion should already be handled by on_thrownthing_qdel() break if (!hit) thrownthing.throw_impact(get_turf(thrownthing), src) // we haven't hit something yet and we still must, let's hit the ground. + if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing + return //deletion should already be handled by on_thrownthing_qdel() thrownthing.newtonian_move(init_dir) else thrownthing.newtonian_move(init_dir) if(target) thrownthing.throw_impact(target, src) + if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing + return //deletion should already be handled by on_thrownthing_qdel() if (callback) callback.Invoke() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 19f19f05ac..198c380f41 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -371,6 +371,11 @@ SUBSYSTEM_DEF(ticker) if(player.ready == PLAYER_READY_TO_PLAY && player.mind) GLOB.joined_player_list += player.ckey player.create_character(FALSE) + if(player.new_character && player.client && player.client.prefs) // we cannot afford a runtime, ever + LAZYOR(player.client.prefs.slots_joined_as, player.client.prefs.default_slot) + LAZYOR(player.client.prefs.characters_joined_as, player.new_character.real_name) + else + stack_trace("WARNING: Either a player did not have a new_character, did not have a client, or did not have preferences. This is VERY bad.") else player.new_player_panel() CHECK_TICK @@ -482,18 +487,7 @@ SUBSYSTEM_DEF(ticker) INVOKE_ASYNC(SSmapping, /datum/controller/subsystem/mapping/.proc/maprotate) else var/vote_type = CONFIG_GET(string/map_vote_type) - switch(vote_type) - if("PLURALITY") - SSvote.initiate_vote("map","server", display = SHOW_RESULTS) - if("APPROVAL") - SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = APPROVAL_VOTING) - if("IRV") - SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = INSTANT_RUNOFF_VOTING) - if("SCORE") - SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = MAJORITY_JUDGEMENT_VOTING) - else - SSvote.initiate_vote("map","server", display = SHOW_RESULTS) - // fallback + SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = vote_type) /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index 2f4949fc1e..8a0a351d48 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -1,7 +1,8 @@ SUBSYSTEM_DEF(time_track) name = "Time Tracking" - wait = 1 SECONDS - flags = SS_NO_INIT|SS_NO_TICK_CHECK + wait = 10 + flags = SS_NO_TICK_CHECK + init_order = INIT_ORDER_TIMETRACK runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT var/time_dilation_current = 0 @@ -16,33 +17,81 @@ SUBSYSTEM_DEF(time_track) var/last_tick_byond_time = 0 var/last_tick_tickcount = 0 - var/last_measurement = 0 - var/measurement_delay = 60 - - var/stat_time_text - var/time_dilation_text +/datum/controller/subsystem/time_track/Initialize(start_timeofday) + . = ..() + GLOB.perf_log = "[GLOB.log_directory]/perf-[GLOB.round_id ? GLOB.round_id : "NULL"]-[SSmapping.config?.map_name].csv" + log_perf( + list( + "time", + "players", + "tidi", + "tidi_fastavg", + "tidi_avg", + "tidi_slowavg", + "maptick", + "num_timers", + "air_turf_cost", + "air_eg_cost", + "air_highpressure_cost", + "air_hotspots_cost", + "air_superconductivity_cost", + "air_pipenets_cost", + "air_rebuilds_cost", + "air_turf_count", + "air_eg_count", + "air_hotspot_count", + "air_network_count", + "air_delta_count", + "air_superconductive_count" + ) + ) /datum/controller/subsystem/time_track/fire() - stat_time_text = "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]\n\nRound Time: [DisplayTimeText(world.time - SSticker.round_start_time, 1)] \n\nStation Time: [STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]\n\n[time_dilation_text]" - if(++last_measurement == measurement_delay) - last_measurement = 0 - var/current_realtime = REALTIMEOFDAY - var/current_byondtime = world.time - var/current_tickcount = world.time/world.tick_lag + var/current_realtime = REALTIMEOFDAY + var/current_byondtime = world.time + var/current_tickcount = world.time/world.tick_lag + GLOB.glide_size_multiplier = (current_byondtime - last_tick_byond_time) / (current_realtime - last_tick_realtime) - if (!first_run) - var/tick_drift = max(0, (((current_realtime - last_tick_realtime) - (current_byondtime - last_tick_byond_time)) / world.tick_lag)) + if(times_fired % 10) // everything else is once every 10 seconds + return - time_dilation_current = tick_drift / (current_tickcount - last_tick_tickcount) * 100 + if (!first_run) + var/tick_drift = max(0, (((current_realtime - last_tick_realtime) - (current_byondtime - last_tick_byond_time)) / world.tick_lag)) - time_dilation_avg_fast = MC_AVERAGE_FAST(time_dilation_avg_fast, time_dilation_current) - time_dilation_avg = MC_AVERAGE(time_dilation_avg, time_dilation_avg_fast) - time_dilation_avg_slow = MC_AVERAGE_SLOW(time_dilation_avg_slow, time_dilation_avg) - else - first_run = FALSE - last_tick_realtime = current_realtime - last_tick_byond_time = current_byondtime - last_tick_tickcount = current_tickcount - SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[SQLtime()]" = list("current" = "[time_dilation_current]", "avg_fast" = "[time_dilation_avg_fast]", "avg" = "[time_dilation_avg]", "avg_slow" = "[time_dilation_avg_slow]"))) - time_dilation_text = "Time Dilation: [round(time_dilation_current,1)]% AVG:([round(time_dilation_avg_fast,1)]%, [round(time_dilation_avg,1)]%, [round(time_dilation_avg_slow,1)]%)" + time_dilation_current = tick_drift / (current_tickcount - last_tick_tickcount) * 100 + + time_dilation_avg_fast = MC_AVERAGE_FAST(time_dilation_avg_fast, time_dilation_current) + time_dilation_avg = MC_AVERAGE(time_dilation_avg, time_dilation_avg_fast) + time_dilation_avg_slow = MC_AVERAGE_SLOW(time_dilation_avg_slow, time_dilation_avg) + else + first_run = FALSE + last_tick_realtime = current_realtime + last_tick_byond_time = current_byondtime + last_tick_tickcount = current_tickcount + SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[SQLtime()]" = list("current" = "[time_dilation_current]", "avg_fast" = "[time_dilation_avg_fast]", "avg" = "[time_dilation_avg]", "avg_slow" = "[time_dilation_avg_slow]"))) + log_perf( + list( + world.time, + length(GLOB.clients), + time_dilation_current, + time_dilation_avg_fast, + time_dilation_avg, + time_dilation_avg_slow, + MAPTICK_LAST_INTERNAL_TICK_USAGE, + length(SStimer.timer_id_dict), + SSair.cost_turfs, + SSair.cost_groups, + SSair.cost_highpressure, + SSair.cost_hotspots, + SSair.cost_superconductivity, + SSair.cost_pipenets, + SSair.cost_rebuilds, + SSair.get_active_turfs(), //does not return a list, which is what we want + SSair.get_amt_excited_groups(), + length(SSair.hotspots), + length(SSair.networks), + length(SSair.high_pressure_delta), + length(SSair.active_super_conductivity) + ) + ) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 398e23cdc1..48165be960 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -1,31 +1,51 @@ -#define BUCKET_LEN (world.fps*1*60) //how many ticks should we keep in the bucket. (1 minutes worth) +/// Controls how many buckets should be kept, each representing a tick. (1 minutes worth) +#define BUCKET_LEN (world.fps*1*60) +/// Helper for getting the correct bucket for a given timer #define BUCKET_POS(timer) (((round((timer.timeToRun - SStimer.head_offset) / world.tick_lag)+1) % BUCKET_LEN)||BUCKET_LEN) +/// Gets the maximum time at which timers will be invoked from buckets, used for deferring to secondary queue #define TIMER_MAX (world.time + TICKS2DS(min(BUCKET_LEN-(SStimer.practical_offset-DS2TICKS(world.time - SStimer.head_offset))-1, BUCKET_LEN-1))) -#define TIMER_ID_MAX (2**24) //max float with integer precision +/// Max float with integer precision +#define TIMER_ID_MAX (2**24) +/** + * # Timer Subsystem + * + * Handles creation, callbacks, and destruction of timed events. + * + * It is important to understand the buckets used in the timer subsystem are just a series of circular doubly-linked + * lists. The object at a given index in bucket_list is a /datum/timedevent, the head of a circular list, which has prev + * and next references for the respective elements in that bucket's circular list. + */ SUBSYSTEM_DEF(timer) name = "Timer" - wait = 1 //SS_TICKER subsystem, so wait is in ticks + wait = 1 // SS_TICKER subsystem, so wait is in ticks init_order = INIT_ORDER_TIMER - + priority = FIRE_PRIORITY_TIMER flags = SS_TICKER|SS_NO_INIT - var/list/datum/timedevent/second_queue = list() //awe, yes, you've had first queue, but what about second queue? + /// Queue used for storing timers that do not fit into the current buckets + var/list/datum/timedevent/second_queue = list() + /// A hashlist dictionary used for storing unique timers var/list/hashes = list() - - var/head_offset = 0 //world.time of the first entry in the the bucket. - var/practical_offset = 1 //index of the first non-empty item in the bucket. - var/bucket_resolution = 0 //world.tick_lag the bucket was designed for - var/bucket_count = 0 //how many timers are in the buckets - - var/list/bucket_list = list() //list of buckets, each bucket holds every timer that has to run that byond tick. - - var/list/timer_id_dict = list() //list of all active timers assoicated to their timer id (for easy lookup) - - var/list/clienttime_timers = list() //special snowflake timers that run on fancy pansy "client time" - + /// world.time of the first entry in the bucket list, effectively the 'start time' of the current buckets + var/head_offset = 0 + /// Index of the wrap around pivot for buckets. buckets before this are later running buckets wrapped around from the end of the bucket list. + var/practical_offset = 1 + /// world.tick_lag the bucket was designed for + var/bucket_resolution = 0 + /// How many timers are in the buckets + var/bucket_count = 0 + /// List of buckets, each bucket holds every timer that has to run that byond tick + var/list/bucket_list = list() + /// List of all active timers associated to their timer ID (for easy lookup) + var/list/timer_id_dict = list() + /// Special timers that run in real-time, not BYOND time; these are more expensive to run and maintain + var/list/clienttime_timers = list() + /// Contains the last time that a timer's callback was invoked, or the last tick the SS fired if no timers are being processed var/last_invoke_tick = 0 + /// Contains the last time that a warning was issued for not invoking callbacks var/static/last_invoke_warning = 0 + /// Boolean operator controlling if the timer SS will automatically reset buckets if it fails to invoke callbacks for an extended period of time var/static/bucket_auto_reset = TRUE /datum/controller/subsystem/timer/PreInit() @@ -38,44 +58,53 @@ SUBSYSTEM_DEF(timer) return ..() /datum/controller/subsystem/timer/fire(resumed = FALSE) + // Store local references to datum vars as it is faster to access them var/lit = last_invoke_tick - var/last_check = world.time - TICKS2DS(BUCKET_LEN*1.5) var/list/bucket_list = src.bucket_list + var/last_check = world.time - TICKS2DS(BUCKET_LEN * 1.5) + // If there are no timers being tracked, then consider now to be the last invoked time if(!bucket_count) last_invoke_tick = world.time + // Check that we have invoked a callback in the last 1.5 minutes of BYOND time, + // and throw a warning and reset buckets if this is true if(lit && lit < last_check && head_offset < last_check && last_invoke_warning < last_check) last_invoke_warning = world.time - var/msg = "No regular timers processed in the last [BUCKET_LEN*1.5] ticks[bucket_auto_reset ? ", resetting buckets" : ""]!" + var/msg = "No regular timers processed in the last [BUCKET_LEN * 1.5] ticks[bucket_auto_reset ? ", resetting buckets" : ""]!" message_admins(msg) WARNING(msg) if(bucket_auto_reset) bucket_resolution = 0 - log_world("Timer bucket reset. world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + var/list/to_log = list("Timer bucket reset. world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") for (var/i in 1 to length(bucket_list)) var/datum/timedevent/bucket_head = bucket_list[i] if (!bucket_head) continue - log_world("Active timers at index [i]:") - + to_log += "Active timers at index [i]:" var/datum/timedevent/bucket_node = bucket_head var/anti_loop_check = 1000 do - log_world(get_timer_debug_string(bucket_node)) + to_log += get_timer_debug_string(bucket_node) bucket_node = bucket_node.next anti_loop_check-- while(bucket_node && bucket_node != bucket_head && anti_loop_check) - log_world("Active timers in the second_queue queue:") + + to_log += "Active timers in the second_queue queue:" for(var/I in second_queue) - log_world(get_timer_debug_string(I)) + to_log += get_timer_debug_string(I) - var/next_clienttime_timer_index = 0 - var/len = length(clienttime_timers) + // Dump all the logged data to the world log + log_world(to_log.Join("\n")) - for (next_clienttime_timer_index in 1 to len) + // Process client-time timers + var/static/next_clienttime_timer_index = 0 + if (next_clienttime_timer_index) + clienttime_timers.Cut(1, next_clienttime_timer_index+1) + next_clienttime_timer_index = 0 + for (next_clienttime_timer_index in 1 to length(clienttime_timers)) if (MC_TICK_CHECK) next_clienttime_timer_index-- break @@ -86,8 +115,8 @@ SUBSYSTEM_DEF(timer) var/datum/callback/callBack = ctime_timer.callBack if (!callBack) - clienttime_timers.Cut(next_clienttime_timer_index,next_clienttime_timer_index+1) - CRASH("Invalid timer: [get_timer_debug_string(ctime_timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset], REALTIMEOFDAY: [REALTIMEOFDAY]") + CRASH("Invalid timer: [get_timer_debug_string(ctime_timer)] world.time: [world.time], \ + head_offset: [head_offset], practical_offset: [practical_offset], REALTIMEOFDAY: [REALTIMEOFDAY]") ctime_timer.spent = REALTIMEOFDAY callBack.InvokeAsync() @@ -95,135 +124,93 @@ SUBSYSTEM_DEF(timer) if(ctime_timer.flags & TIMER_LOOP) ctime_timer.spent = 0 ctime_timer.timeToRun = REALTIMEOFDAY + ctime_timer.wait - BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, ctime_timer, timeToRun, COMPARE_KEY) + BINARY_INSERT(ctime_timer, clienttime_timers, /datum/timedevent, ctime_timer, timeToRun, COMPARE_KEY) else qdel(ctime_timer) - + // Remove invoked client-time timers if (next_clienttime_timer_index) clienttime_timers.Cut(1, next_clienttime_timer_index+1) + next_clienttime_timer_index = 0 if (MC_TICK_CHECK) return - var/static/list/spent = list() - var/static/datum/timedevent/timer + // Check for when we need to loop the buckets, this occurs when + // the head_offset is approaching BUCKET_LEN ticks in the past if (practical_offset > BUCKET_LEN) head_offset += TICKS2DS(BUCKET_LEN) practical_offset = 1 resumed = FALSE + // Check for when we have to reset buckets, typically from auto-reset if ((length(bucket_list) != BUCKET_LEN) || (world.tick_lag != bucket_resolution)) reset_buckets() bucket_list = src.bucket_list resumed = FALSE - if (!resumed) - timer = null - - while (practical_offset <= BUCKET_LEN && head_offset + ((practical_offset-1)*world.tick_lag) <= world.time) - var/datum/timedevent/head = bucket_list[practical_offset] - if (!timer || !head || timer == head) - head = bucket_list[practical_offset] - timer = head - while (timer) + // Iterate through each bucket starting from the practical offset + while (practical_offset <= BUCKET_LEN && head_offset + ((practical_offset - 1) * world.tick_lag) <= world.time) + var/datum/timedevent/timer + while ((timer = bucket_list[practical_offset])) var/datum/callback/callBack = timer.callBack if (!callBack) - bucket_resolution = null //force bucket recreation - CRASH("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + bucket_resolution = null // force bucket recreation + CRASH("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], \ + head_offset: [head_offset], practical_offset: [practical_offset]") + timer.bucketEject() //pop the timer off of the bucket list. + + // Invoke callback if possible if (!timer.spent) - spent += timer timer.spent = world.time callBack.InvokeAsync() last_invoke_tick = world.time - if (MC_TICK_CHECK) - return - - timer = timer.next - if (timer == head) - break - - - bucket_list[practical_offset++] = null - - //we freed up a bucket, lets see if anything in second_queue needs to be shifted to that bucket. - var/i = 0 - var/L = length(second_queue) - for (i in 1 to L) - timer = second_queue[i] - if (timer.timeToRun >= TIMER_MAX) - i-- - break - - if (timer.timeToRun < head_offset) - bucket_resolution = null //force bucket recreation - stack_trace("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") - - if (timer.callBack && !timer.spent) - timer.callBack.InvokeAsync() - spent += timer - bucket_count++ - else if(!QDELETED(timer)) - qdel(timer) - continue - - if (timer.timeToRun < head_offset + TICKS2DS(practical_offset-1)) - bucket_resolution = null //force bucket recreation - stack_trace("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") - if (timer.callBack && !timer.spent) - timer.callBack.InvokeAsync() - spent += timer - bucket_count++ - else if(!QDELETED(timer)) - qdel(timer) - continue - - bucket_count++ - var/bucket_pos = max(1, BUCKET_POS(timer)) - - var/datum/timedevent/bucket_head = bucket_list[bucket_pos] - if (!bucket_head) - bucket_list[bucket_pos] = timer - timer.next = null - timer.prev = null - continue - - if (!bucket_head.prev) - bucket_head.prev = bucket_head - timer.next = bucket_head - timer.prev = bucket_head.prev - timer.next.prev = timer - timer.prev.next = timer - if (i) - second_queue.Cut(1, i+1) - - timer = null - - bucket_count -= length(spent) - - for (var/i in spent) - var/datum/timedevent/qtimer = i - if(QDELETED(qtimer)) - bucket_count++ - continue - if(!(qtimer.flags & TIMER_LOOP)) - qdel(qtimer) - else - bucket_count++ - qtimer.spent = 0 - qtimer.bucketEject() - if(qtimer.flags & TIMER_CLIENT_TIME) - qtimer.timeToRun = REALTIMEOFDAY + qtimer.wait + if (timer.flags & TIMER_LOOP) // Prepare looping timers to re-enter the queue + timer.spent = 0 + timer.timeToRun = world.time + timer.wait + timer.bucketJoin() else - qtimer.timeToRun = world.time + qtimer.wait - qtimer.bucketJoin() + qdel(timer) - spent.len = 0 + if (MC_TICK_CHECK) + break -//formated this way to be runtime resistant + if (!bucket_list[practical_offset]) + // Empty the bucket, check if anything in the secondary queue should be shifted to this bucket + bucket_list[practical_offset++] = null + var/i = 0 + for (i in 1 to length(second_queue)) + timer = second_queue[i] + if (timer.timeToRun >= TIMER_MAX) + i-- + break + + // Check for timers that are scheduled to run in the past + if (timer.timeToRun < head_offset) + bucket_resolution = null // force bucket recreation + stack_trace("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. \ + [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + break + + // Check for timers that are not capable of being scheduled to run without rebuilding buckets + if (timer.timeToRun < head_offset + TICKS2DS(practical_offset - 1)) + bucket_resolution = null // force bucket recreation + stack_trace("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to \ + short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + break + + timer.bucketJoin() + if (i) + second_queue.Cut(1, i+1) + if (MC_TICK_CHECK) + break + +/** + * Generates a string with details about the timed event for debugging purposes + */ /datum/controller/subsystem/timer/proc/get_timer_debug_string(datum/timedevent/TE) . = "Timer: [TE]" . += "Prev: [TE.prev ? TE.prev : "NULL"], Next: [TE.next ? TE.next : "NULL"]" @@ -234,12 +221,16 @@ SUBSYSTEM_DEF(timer) if(!TE.callBack) . += ", NO CALLBACK" +/** + * Destroys the existing buckets and creates new buckets from the existing timed events + */ /datum/controller/subsystem/timer/proc/reset_buckets() - var/list/bucket_list = src.bucket_list + var/list/bucket_list = src.bucket_list // Store local reference to datum var, this is faster var/list/alltimers = list() - //collect the timers currently in the bucket + + // Get all timers currently in the buckets for (var/bucket_head in bucket_list) - if (!bucket_head) + if (!bucket_head) // if bucket is empty for this tick continue var/datum/timedevent/bucket_node = bucket_head do @@ -247,25 +238,38 @@ SUBSYSTEM_DEF(timer) bucket_node = bucket_node.next while(bucket_node && bucket_node != bucket_head) + // Empty the list by zeroing and re-assigning the length bucket_list.len = 0 bucket_list.len = BUCKET_LEN + // Reset values for the subsystem to their initial values practical_offset = 1 bucket_count = 0 head_offset = world.time bucket_resolution = world.tick_lag + // Add all timed events from the secondary queue as well alltimers += second_queue + + // If there are no timers being tracked by the subsystem, + // there is no need to do any further rebuilding if (!length(alltimers)) return + // Sort all timers by time to run sortTim(alltimers, .proc/cmp_timer) + // Get the earliest timer, and if the TTR is earlier than the current world.time, + // then set the head offset appropriately to be the earliest time tracked by the + // current set of buckets var/datum/timedevent/head = alltimers[1] - if (head.timeToRun < head_offset) head_offset = head.timeToRun + // Iterate through each timed event and insert it into an appropriate bucket, + // up unto the point that we can no longer insert into buckets as the TTR + // is outside the range we are tracking, then insert the remainder into the + // secondary queue var/new_bucket_count var/i = 1 for (i in 1 to length(alltimers)) @@ -273,34 +277,38 @@ SUBSYSTEM_DEF(timer) if (!timer) continue - var/bucket_pos = BUCKET_POS(timer) + // Check that the TTR is within the range covered by buckets, when exceeded we've finished if (timer.timeToRun >= TIMER_MAX) i-- break - + // Check that timer has a valid callback and hasn't been invoked if (!timer.callBack || timer.spent) - WARNING("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + WARNING("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], \ + head_offset: [head_offset], practical_offset: [practical_offset]") if (timer.callBack) qdel(timer) continue + // Insert the timer into the bucket, and perform necessary circular doubly-linked list operations new_bucket_count++ + var/bucket_pos = BUCKET_POS(timer) var/datum/timedevent/bucket_head = bucket_list[bucket_pos] if (!bucket_head) bucket_list[bucket_pos] = timer timer.next = null timer.prev = null continue - if (!bucket_head.prev) bucket_head.prev = bucket_head timer.next = bucket_head timer.prev = bucket_head.prev timer.next.prev = timer timer.prev.next = timer + + // Cut the timers that are tracked by the buckets from the secondary queue if (i) - alltimers.Cut(1, i+1) + alltimers.Cut(1, i + 1) second_queue = alltimers bucket_count = new_bucket_count @@ -311,45 +319,64 @@ SUBSYSTEM_DEF(timer) timer_id_dict |= SStimer.timer_id_dict bucket_list |= SStimer.bucket_list +/** + * # Timed Event + * + * This is the actual timer, it contains the callback and necessary data to maintain + * the timer. + * + * See the documentation for the timer subsystem for an explanation of the buckets referenced + * below in next and prev + */ /datum/timedevent + /// ID used for timers when the TIMER_STOPPABLE flag is present var/id + /// The callback to invoke after the timer completes var/datum/callback/callBack + /// The time at which the callback should be invoked at var/timeToRun + /// The length of the timer var/wait + /// Unique hash generated when TIMER_UNIQUE flag is present var/hash + /// The source of the timedevent, whatever called addtimer + var/source + /// Flags associated with the timer, see _DEFINES/subsystems.dm var/list/flags - var/spent = 0 //time we ran the timer. - var/name //for easy debugging. - //cicular doublely linked list + /// Time at which the timer was invoked or destroyed + var/spent = 0 + /// An informative name generated for the timer as its representation in strings, useful for debugging + var/name + /// Next timed event in the bucket var/datum/timedevent/next + /// Previous timed event in the bucket var/datum/timedevent/prev -/datum/timedevent/New(datum/callback/callBack, wait, flags, hash) +/datum/timedevent/New(datum/callback/callBack, wait, flags, hash, source) var/static/nextid = 1 id = TIMER_ID_NULL src.callBack = callBack src.wait = wait src.flags = flags src.hash = hash + src.source = source - if (flags & TIMER_CLIENT_TIME) - timeToRun = REALTIMEOFDAY + wait - else - timeToRun = world.time + wait + // Determine time at which the timer's callback should be invoked + timeToRun = (flags & TIMER_CLIENT_TIME ? REALTIMEOFDAY : world.time) + wait + // Include the timer in the hash table if the timer is unique if (flags & TIMER_UNIQUE) SStimer.hashes[hash] = src + // Generate ID for the timer if the timer is stoppable, include in the timer id dictionary if (flags & TIMER_STOPPABLE) id = num2text(nextid, 100) if (nextid >= SHORT_REAL_LIMIT) - nextid += min(1, 2**round(nextid/SHORT_REAL_LIMIT)) + nextid += min(1, 2 ** round(nextid / SHORT_REAL_LIMIT)) else nextid++ SStimer.timer_id_dict[id] = src - name = "Timer: [id] (\ref[src]), TTR: [timeToRun], Flags: [jointext(bitfield2list(flags, list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP")), ", ")], callBack: \ref[callBack], callBack.object: [callBack.object]\ref[callBack.object]([getcallingtype()]), callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""])" - if ((timeToRun < world.time || timeToRun < SStimer.head_offset) && !(flags & TIMER_CLIENT_TIME)) CRASH("Invalid timer state: Timer created that would require a backtrack to run (addtimer would never let this happen): [SStimer.get_timer_debug_string(src)]") @@ -390,23 +417,39 @@ SUBSYSTEM_DEF(timer) prev = null return QDEL_HINT_IWILLGC +/** + * Removes this timed event from any relevant buckets, or the secondary queue + */ /datum/timedevent/proc/bucketEject() + // Attempt to find bucket that contains this timed event var/bucketpos = BUCKET_POS(src) + + // Store local references for the bucket list and secondary queue + // This is faster than referencing them from the datum itself var/list/bucket_list = SStimer.bucket_list var/list/second_queue = SStimer.second_queue + + // Attempt to get the head of the bucket var/datum/timedevent/buckethead if(bucketpos > 0) buckethead = bucket_list[bucketpos] + + // Decrement the number of timers in buckets if the timed event is + // the head of the bucket, or has a TTR less than TIMER_MAX implying it fits + // into an existing bucket, or is otherwise not present in the secondary queue if(buckethead == src) bucket_list[bucketpos] = next SStimer.bucket_count-- - else if(timeToRun < TIMER_MAX || next || prev) + else if(timeToRun < TIMER_MAX) SStimer.bucket_count-- else var/l = length(second_queue) second_queue -= src if(l == length(second_queue)) SStimer.bucket_count-- + + // Remove the timed event from the bucket, ensuring to maintain + // the integrity of the bucket's list if relevant if(prev != next) prev.next = next next.prev = prev @@ -415,32 +458,47 @@ SUBSYSTEM_DEF(timer) next?.prev = null prev = next = null +/** + * Attempts to add this timed event to a bucket, will enter the secondary queue + * if there are no appropriate buckets at this time. + * + * Secondary queueing of timed events will occur when the timespan covered by the existing + * buckets is exceeded by the time at which this timed event is scheduled to be invoked. + * If the timed event is tracking client time, it will be added to a special bucket. + */ /datum/timedevent/proc/bucketJoin() - var/list/L + // Generate debug-friendly name for timer + var/static/list/bitfield_flags = list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP") + name = "Timer: [id] (\ref[src]), TTR: [timeToRun], wait:[wait] Flags: [jointext(bitfield2list(flags, bitfield_flags), ", ")], \ + callBack: \ref[callBack], callBack.object: [callBack.object]\ref[callBack.object]([getcallingtype()]), \ + callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""]), source: [source]" + // Check if this timed event should be diverted to the client time bucket, or the secondary queue + var/list/L if (flags & TIMER_CLIENT_TIME) L = SStimer.clienttime_timers else if (timeToRun >= TIMER_MAX) L = SStimer.second_queue - if(L) - BINARY_INSERT(src, L, datum/timedevent, src, timeToRun, COMPARE_KEY) + BINARY_INSERT(src, L, /datum/timedevent, src, timeToRun, COMPARE_KEY) return - //get the list of buckets + // Get a local reference to the bucket list, this is faster than referencing the datum var/list/bucket_list = SStimer.bucket_list - //calculate our place in the bucket list + // Find the correct bucket for this timed event var/bucket_pos = BUCKET_POS(src) - - //get the bucket for our tick var/datum/timedevent/bucket_head = bucket_list[bucket_pos] SStimer.bucket_count++ - //empty bucket, we will just add ourselves + + // If there is no timed event at this position, then the bucket is 'empty' + // and we can just set this event to that position if (!bucket_head) bucket_list[bucket_pos] = src return - //other wise, lets do a simplified linked list add. + + // Otherwise, we merely add this timed event into the bucket, which is a + // circularly doubly-linked list if (!bucket_head.prev) bucket_head.prev = bucket_head next = bucket_head @@ -448,7 +506,9 @@ SUBSYSTEM_DEF(timer) next.prev = src prev.next = src -///Returns a string of the type of the callback for this timer +/** + * Returns a string of the type of the callback for this timer + */ /datum/timedevent/proc/getcallingtype() . = "ERROR" if (callBack.object == GLOBAL_PROC) @@ -457,14 +517,15 @@ SUBSYSTEM_DEF(timer) . = "[callBack.object.type]" /** - * Create a new timer and insert it in the queue - * - * Arguments: - * * callback the callback to call on timer finish - * * wait deciseconds to run the timer for - * * flags flags for this timer, see: code\__DEFINES\subsystems.dm - */ -/proc/addtimer(datum/callback/callback, wait = 0, flags = 0) + * Create a new timer and insert it in the queue. + * You should not call this directly, and should instead use the addtimer macro, which includes source information. + * + * Arguments: + * * callback the callback to call on timer finish + * * wait deciseconds to run the timer for + * * flags flags for this timer, see: code\__DEFINES\subsystems.dm + */ +/proc/_addtimer(datum/callback/callback, wait = 0, flags = 0, file, line) if (!callback) CRASH("addtimer called without a callback") @@ -472,31 +533,30 @@ SUBSYSTEM_DEF(timer) stack_trace("addtimer called with a negative wait. Converting to [world.tick_lag]") if (callback.object != GLOBAL_PROC && QDELETED(callback.object) && !QDESTROYING(callback.object)) - stack_trace("addtimer called with a callback assigned to a qdeleted object. In the future such timers will not be supported and may refuse to run or run with a 0 wait") + stack_trace("addtimer called with a callback assigned to a qdeleted object. In the future such timers will not \ + be supported and may refuse to run or run with a 0 wait") wait = max(CEILING(wait, world.tick_lag), world.tick_lag) if(wait >= INFINITY) CRASH("Attempted to create timer with INFINITY delay") + // Generate hash if relevant for timed events with the TIMER_UNIQUE flag var/hash - if (flags & TIMER_UNIQUE) - var/list/hashlist - if(flags & TIMER_NO_HASH_WAIT) - hashlist = list(callback.object, "([REF(callback.object)])", callback.delegate, flags & TIMER_CLIENT_TIME) - else - hashlist = list(callback.object, "([REF(callback.object)])", callback.delegate, wait, flags & TIMER_CLIENT_TIME) + var/list/hashlist = list(callback.object, "([REF(callback.object)])", callback.delegate, flags & TIMER_CLIENT_TIME) + if(!(flags & TIMER_NO_HASH_WAIT)) + hashlist += wait hashlist += callback.arguments hash = hashlist.Join("|||||||") var/datum/timedevent/hash_timer = SStimer.hashes[hash] if(hash_timer) - if (hash_timer.spent) //it's pending deletion, pretend it doesn't exist. - hash_timer.hash = null //but keep it from accidentally deleting us + if (hash_timer.spent) // it's pending deletion, pretend it doesn't exist. + hash_timer.hash = null // but keep it from accidentally deleting us else if (flags & TIMER_OVERRIDE) - hash_timer.hash = null //no need having it delete it's hash if we are going to replace it + hash_timer.hash = null // no need having it delete it's hash if we are going to replace it qdel(hash_timer) else if (hash_timer.flags & TIMER_STOPPABLE) @@ -505,24 +565,23 @@ SUBSYSTEM_DEF(timer) else if(flags & TIMER_OVERRIDE) stack_trace("TIMER_OVERRIDE used without TIMER_UNIQUE") - var/datum/timedevent/timer = new(callback, wait, flags, hash) + var/datum/timedevent/timer = new(callback, wait, flags, hash, file && "[file]:[line]") return timer.id /** - * Delete a timer - * - * Arguments: - * * id a timerid or a /datum/timedevent - */ + * Delete a timer + * + * Arguments: + * * id a timerid or a /datum/timedevent + */ /proc/deltimer(id) if (!id) return FALSE if (id == TIMER_ID_NULL) CRASH("Tried to delete a null timerid. Use TIMER_STOPPABLE flag") - if (!istext(id)) - if (istype(id, /datum/timedevent)) - qdel(id) - return TRUE + if (istype(id, /datum/timedevent)) + qdel(id) + return TRUE //id is string var/datum/timedevent/timer = SStimer.timer_id_dict[id] if (timer && !timer.spent) @@ -531,25 +590,22 @@ SUBSYSTEM_DEF(timer) return FALSE /** - * Get the remaining deciseconds on a timer - * - * Arguments: - * * id a timerid or a /datum/timedevent - */ + * Get the remaining deciseconds on a timer + * + * Arguments: + * * id a timerid or a /datum/timedevent + */ /proc/timeleft(id) if (!id) return null if (id == TIMER_ID_NULL) CRASH("Tried to get timeleft of a null timerid. Use TIMER_STOPPABLE flag") - if (!istext(id)) - if (istype(id, /datum/timedevent)) - var/datum/timedevent/timer = id - return timer.timeToRun - world.time + if (istype(id, /datum/timedevent)) + var/datum/timedevent/timer = id + return timer.timeToRun - world.time //id is string var/datum/timedevent/timer = SStimer.timer_id_dict[id] - if (timer && !timer.spent) - return timer.timeToRun - world.time - return null + return (timer && !timer.spent) ? timer.timeToRun - world.time : null #undef BUCKET_LEN #undef BUCKET_POS diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index bd843f959d..996f73ccf6 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -25,12 +25,12 @@ SUBSYSTEM_DEF(title) SSmapping.HACK_LoadMapConfig() for(var/S in provisional_title_screens) var/list/L = splittext(S,"+") - if((L.len == 1 && L[1] != "blank.png")|| (L.len > 1 && ((use_rare_screens && lowertext(L[1]) == "rare") || (lowertext(L[1]) == lowertext(SSmapping.config.map_name))))) + if((L.len == 1 && (L[1] != "exclude" && L[1] != "blank.png"))|| (L.len > 1 && ((use_rare_screens && lowertext(L[1]) == "rare") || (lowertext(L[1]) == lowertext(SSmapping.config.map_name))))) title_screens += S if(length(title_screens)) file_path = "[global.config.directory]/title_screens/images/[pick(title_screens)]" - + if(!file_path) file_path = "icons/default_title.dmi" diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index f556f7dee7..9a0665e91f 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -52,7 +52,7 @@ SUBSYSTEM_DEF(traumas) "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), "the supernatural" = typecacheof(list(/mob/living/simple_animal/hostile/construct, /mob/living/simple_animal/hostile/clockwork, /mob/living/simple_animal/drone/cogscarab, - /mob/living/simple_animal/revenant, /mob/living/simple_animal/shade)), + /mob/living/simple_animal/revenant, /mob/living/simple_animal/hostile/construct/shade)), "aliens" = typecacheof(list(/mob/living/carbon/alien, /mob/living/simple_animal/slime)), "conspiracies" = typecacheof(list(/mob/living/simple_animal/bot/secbot, /mob/living/simple_animal/bot/ed209, /mob/living/simple_animal/drone, /mob/living/simple_animal/pet/penguin)), @@ -158,8 +158,8 @@ SUBSYSTEM_DEF(traumas) /obj/item/clothing/head/frenchberet, /obj/item/clothing/suit/suspenders, /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing, /obj/item/storage/backpack/mime, /obj/item/reagent_containers/food/snacks/grown/banana/mime, /obj/item/grown/bananapeel/mimanapeel, /obj/item/cartridge/virus/mime, /obj/item/clothing/shoes/sneakers/mime, - /obj/item/bedsheet/mime, /obj/item/reagent_containers/food/snacks/burger/mime, /obj/item/clothing/head/beret, /obj/item/clothing/mask/gas/sexymime, - /obj/item/clothing/under/rank/civilian/mime/sexy, /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence)), + /obj/item/bedsheet/mime, /obj/item/reagent_containers/food/snacks/burger/mime, /obj/item/clothing/head/beret, + /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence)), "cats" = typecacheof(list(/obj/item/organ/ears/cat, /obj/item/organ/tail/cat, /obj/item/laser_pointer, /obj/item/toy/cattoy, /obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty, /obj/item/melee/chainofcommand/tailwhip/kitty, /obj/item/stack/sheet/animalhide/cat)), @@ -198,7 +198,8 @@ SUBSYSTEM_DEF(traumas) "aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, /datum/species/shadow)), "anime" = typecacheof(list(/datum/species/human/felinid)), "cats" = typecacheof(list(/datum/species/human/felinid)), - "syndicate" = typecacheof(list(/datum/species/corporate, /datum/species/zombie/infectious)) + "syndicate" = typecacheof(list(/datum/species/corporate, /datum/species/zombie/infectious)), + "arachnid" = typecacheof(list(/datum/species/arachnid)) ) return ..() diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index 0635709074..b0e5d6c689 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -5,10 +5,12 @@ SUBSYSTEM_DEF(vis_overlays) init_order = INIT_ORDER_VIS var/list/vis_overlay_cache + var/list/unique_vis_overlays var/list/currentrun /datum/controller/subsystem/vis_overlays/Initialize() vis_overlay_cache = list() + unique_vis_overlays = list() return ..() /datum/controller/subsystem/vis_overlays/fire(resumed = FALSE) @@ -29,31 +31,45 @@ SUBSYSTEM_DEF(vis_overlays) return //the "thing" var can be anything with vis_contents which includes images -/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha = 255, add_appearance_flags = NONE) - . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]|[add_appearance_flags]" - var/obj/effect/overlay/vis/overlay = vis_overlay_cache[.] - if(!overlay) - overlay = new - overlay.icon = icon - overlay.icon_state = iconstate - overlay.layer = layer - overlay.plane = plane - overlay.dir = dir - overlay.alpha = alpha - overlay.appearance_flags |= add_appearance_flags - vis_overlay_cache[.] = overlay +/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha = 255, add_appearance_flags = NONE, unique = FALSE) + var/obj/effect/overlay/vis/overlay + if(!unique) + . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]|[add_appearance_flags]" + overlay = vis_overlay_cache[.] + if(!overlay) + overlay = _create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags) + vis_overlay_cache[.] = overlay + else + overlay.unused = 0 else - overlay.unused = 0 + overlay = _create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags) + overlay.cache_expiration = -1 + var/cache_id = "\ref[overlay]@{[world.time]}" + unique_vis_overlays += overlay + vis_overlay_cache[cache_id] = overlay + . = overlay thing.vis_contents += overlay if(!isatom(thing)) // Automatic rotation is not supported on non atoms - return + return overlay if(!thing.managed_vis_overlays) thing.managed_vis_overlays = list(overlay) - RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_vis_overlay) else thing.managed_vis_overlays += overlay + return overlay + +/datum/controller/subsystem/vis_overlays/proc/_create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags) + var/obj/effect/overlay/vis/overlay = new + overlay.icon = icon + overlay.icon_state = iconstate + overlay.layer = layer + overlay.plane = plane + overlay.dir = dir + overlay.alpha = alpha + overlay.appearance_flags |= add_appearance_flags + return overlay + /datum/controller/subsystem/vis_overlays/proc/remove_vis_overlay(atom/movable/thing, list/overlays) thing.vis_contents -= overlays @@ -62,15 +78,3 @@ SUBSYSTEM_DEF(vis_overlays) thing.managed_vis_overlays -= overlays if(!length(thing.managed_vis_overlays)) thing.managed_vis_overlays = null - UnregisterSignal(thing, COMSIG_ATOM_DIR_CHANGE) - -/datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir) - if(old_dir == new_dir) - return - var/rotation = dir2angle(old_dir) - dir2angle(new_dir) - var/list/overlays_to_remove = list() - for(var/i in thing.managed_vis_overlays) - var/obj/effect/overlay/vis/overlay = i - add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation), overlay.alpha, overlay.appearance_flags) - overlays_to_remove += overlay - remove_vis_overlay(thing, overlays_to_remove) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index a93aff7d2b..2474a6f272 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -16,6 +16,7 @@ SUBSYSTEM_DEF(vote) var/question = null var/list/choices = list() /// List of choice = object for statclick objects for statpanel voting + /// statclick rework? 2: list("name"="id") var/list/choice_statclicks = list() var/list/scores = list() var/list/choice_descs = list() // optional descriptions @@ -49,34 +50,6 @@ SUBSYSTEM_DEF(vote) client_popup.open(0) next_pop = world.time+VOTE_COOLDOWN -/** - * Renders a statpanel. Directly uses statpanel/stat calls since this is called from base of mob/Stat(). - */ -/datum/controller/subsystem/vote/proc/render_statpanel(mob/M) - if(!mode) // check if vote is running - return - if(!statpanel("Status")) // don't bother if they're not focused on this panel - return - var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING) - stat("Vote active!", "There is currently a vote running. Question: [question]") - if(!(vote_system in supported)) - stat("", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.") - return - stat("Time Left:", "[round(end_time - world.time)] seconds") - stat(null, null) - stat("Choices:", null) - stat(null, null) - for(var/i in 1 to choice_statclicks.len) - var/choice = choice_statclicks[i] - var/ivotedforthis = FALSE - switch(vote_system) - if(APPROVAL_VOTING) - ivotedforthis = voted[usr.ckey] && (i in voted[usr.ckey]) - if(PLURALITY_VOTING) - ivotedforthis = voted[usr.ckey] == i - stat(ivotedforthis? "\[X\]" : "\[ \]", choice_statclicks[choice]) - stat(null, null) - /datum/controller/subsystem/vote/proc/reset() initiator = null end_time = 0 @@ -87,30 +60,18 @@ SUBSYSTEM_DEF(vote) voted.Cut() voting.Cut() scores.Cut() - cleanup_statclicks() + choice_statclicks = list() display_votes = initial(display_votes) //CIT CHANGE - obfuscated votes remove_action_buttons() -/datum/controller/subsystem/vote/proc/cleanup_statclicks() - for(var/choice in choice_statclicks) - qdel(choice_statclicks[choice]) - choice_statclicks = list() - -/obj/effect/statclick/vote - name = "ERROR" - var/choice - -/obj/effect/statclick/vote/Click() - SSvote.submit_vote(choice) - -/obj/effect/statclick/vote/New(loc, choice, name) - src.choice = choice - src.name = name - /datum/controller/subsystem/vote/proc/get_result() //get the highest number of votes var/greatest_votes = 0 var/total_votes = 0 + if(mode == "gamemode" && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) + for(var/mob/dead/new_player/P in GLOB.player_list) + if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey]) + choices[choices[voted[P.ckey]]]-- for(var/option in choices) var/votes = choices[option] total_votes += votes @@ -144,6 +105,10 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/proc/calculate_condorcet_votes(var/blackbox_text) // https://en.wikipedia.org/wiki/Schulze_method#Implementation + if((mode == "gamemode" || mode == "dynamic") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) + for(var/mob/dead/new_player/P in GLOB.player_list) + if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey]) + voted -= P.ckey var/list/d[][] = new/list(choices.len,choices.len) // the basic vote matrix, how many times a beats b for(var/ckey in voted) var/list/this_vote = voted[ckey] @@ -184,12 +149,16 @@ SUBSYSTEM_DEF(vote) choices[choices[i]]++ // higher shortest path = better candidate, so we add to choices here // choices[choices[i]] is the schulze ranking, here, rather than raw vote numbers -/datum/controller/subsystem/vote/proc/calculate_majority_judgement_vote(var/blackbox_text) - // https://en.wikipedia.org/wiki/Majority_judgment +/datum/controller/subsystem/vote/proc/calculate_highest_median(var/blackbox_text) + // https://en.wikipedia.org/wiki/Highest_median_voting_rules var/list/scores_by_choice = list() for(var/choice in choices) scores_by_choice += "[choice]" scores_by_choice["[choice]"] = list() + if((mode == "gamemode" || mode == "dynamic") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) + for(var/mob/dead/new_player/P in GLOB.player_list) + if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey]) + voted -= P.ckey for(var/ckey in voted) var/list/this_vote = voted[ckey] var/list/pretty_vote = list() @@ -204,33 +173,24 @@ SUBSYSTEM_DEF(vote) // END BALLOT GATHERING for(var/score_name in scores_by_choice) var/list/score = scores_by_choice[score_name] - for(var/indiv_score in score) - SSblackbox.record_feedback("nested tally","voting",1,list(blackbox_text,"Scores",score_name,GLOB.vote_score_options[indiv_score])) - if(score.len == 0) - scores_by_choice -= score_name - while(scores_by_choice.len > 1) - var/highest_median = 0 - for(var/score_name in scores_by_choice) // first get highest median - var/list/score = scores_by_choice[score_name] - if(!score.len) - scores_by_choice -= score_name - continue + if(!score.len) + choices[score_name] = 0 + else var/median = score[max(1,round(score.len/2))] - if(median >= highest_median) - highest_median = median - for(var/score_name in scores_by_choice) // then, remove - var/list/score = scores_by_choice[score_name] - var/median = score[max(1,round(score.len/2))] - if(median < highest_median) - scores_by_choice -= score_name - for(var/score_name in scores_by_choice) // after removals - var/list/score = scores_by_choice[score_name] - if(score.len == 0) - choices[score_name] += 100 // we're in a tie situation--just go with the first one - return - var/median_pos = max(1,round(score.len/2)) - score.Cut(median_pos,median_pos+1) - choices[score_name]++ + var/p = 0 // proponents (those with higher than median) + var/q = 0 // opponents (lower than median) + var/list/this_score_list = scores_by_choice[score_name] + for(var/indiv_score in score) + SSblackbox.record_feedback("nested tally","voting",1,list(blackbox_text,"Scores",score_name,GLOB.vote_score_options[indiv_score])) + if(indiv_score < median) // this is possible to do in O(logn) but n is never more than 200 so this is fine + q += 1 + else if(indiv_score > median) + p += 1 + p /= this_score_list.len + q /= this_score_list.len + choices[score_name] = median + (((p - q) / (1 - p - q)) * 0.5) // usual judgement + // choices[score_name] = median + p - q // typical judgement + // choices[score_name] = median + (((p - q) / (p + q)) * 0.5) // central judgement /datum/controller/subsystem/vote/proc/calculate_scores(var/blackbox_text) for(var/choice in choices) @@ -288,8 +248,8 @@ SUBSYSTEM_DEF(vote) calculate_condorcet_votes(vote_title_text) if(vote_system == SCORE_VOTING) calculate_scores(vote_title_text) - if(vote_system == MAJORITY_JUDGEMENT_VOTING) - calculate_majority_judgement_vote(vote_title_text) // nothing uses this at the moment + if(vote_system == HIGHEST_MEDIAN_VOTING) + calculate_highest_median(vote_title_text) // nothing uses this at the moment var/list/winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result() var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic" if(winners.len > 0) @@ -298,8 +258,8 @@ SUBSYSTEM_DEF(vote) if(display_votes & SHOW_RESULTS) if(vote_system == SCHULZE_VOTING) text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" - if(vote_system == MAJORITY_JUDGEMENT_VOTING) - text += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" + if(vote_system == HIGHEST_MEDIAN_VOTING) + text += "\nThis is the highest median score plus the tiebreaker!" for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] if(!votes) @@ -345,7 +305,7 @@ SUBSYSTEM_DEF(vote) if(vote_system != SCORE_VOTING) if(vote_system == SCHULZE_VOTING) admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" - else if(vote_system == MAJORITY_JUDGEMENT_VOTING) + else if(vote_system == HIGHEST_MEDIAN_VOTING) admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] @@ -472,7 +432,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = list() voted[usr.ckey] += vote saved -= usr.ckey - if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) + if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING) if(!(usr.ckey in voted)) voted += usr.ckey voted[usr.ckey] = list() @@ -535,7 +495,7 @@ SUBSYSTEM_DEF(vote) if("dynamic") GLOB.master_mode = "dynamic" var/list/probabilities = CONFIG_GET(keyed_list/storyteller_weight) - for(var/T in config.storyteller_cache) + for(var/T in config.get_runnable_storytellers()) var/datum/dynamic_storyteller/S = T var/probability = ((initial(S.config_tag) in probabilities) ? probabilities[initial(S.config_tag)] : initial(S.weight)) if(probability > 0) @@ -582,10 +542,10 @@ SUBSYSTEM_DEF(vote) to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(vp)] to vote.") end_time = started_time+vp // generate statclick list - cleanup_statclicks() + choice_statclicks = list() for(var/i in 1 to choices.len) var/choice = choices[i] - choice_statclicks[choice] = new /obj/effect/statclick/vote(null, i, choice) + choice_statclicks[choice] = "[i]" // for(var/c in GLOB.clients) SEND_SOUND(c, sound('sound/misc/server-ready.ogg')) @@ -627,7 +587,7 @@ SUBSYSTEM_DEF(vote) . += "

Vote any number of choices.

" if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) . += "

Vote by order of preference. Revoting will demote to the bottom. 1 is your favorite, and higher numbers are worse.

" - if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) + if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING) . += "

Grade the candidates by how much you like them.

" . += "

No-votes have no power--your opinion is only heard if you vote!

" . += "Time Left: [DisplayTimeText(end_time-world.time)]
    " @@ -664,7 +624,7 @@ SUBSYSTEM_DEF(vote) . += "(Saved!)" . += "(Load vote from save)" . += "(Reset votes)" - if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) + if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING) var/list/myvote = voted[C.ckey] for(var/i=1,i<=choices.len,i++) . += "
  • [choices[i]]" @@ -767,7 +727,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = SSpersistence.saved_votes[usr.ckey][mode] if(islist(voted[usr.ckey])) var/malformed = FALSE - if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING) + if(vote_system == SCORE_VOTING || vote_system == HIGHEST_MEDIAN_VOTING) for(var/thing in voted[usr.ckey]) if(!(thing in choices)) malformed = TRUE @@ -781,11 +741,12 @@ SUBSYSTEM_DEF(vote) to_chat(usr,"Your saved vote was malformed! Start over!") voted -= usr.ckey else - if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING) + if(vote_system == SCORE_VOTING || vote_system == HIGHEST_MEDIAN_VOTING) submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"]))) else submit_vote(round(text2num(href_list["vote"]))) - usr.vote() + if(!href_list["statpannel"]) + usr.vote() /datum/controller/subsystem/vote/proc/remove_action_buttons() for(var/v in generated_actions) diff --git a/code/datums/accents.dm b/code/datums/accents.dm index ce32aa0884..d9e073b729 100644 --- a/code/datums/accents.dm +++ b/code/datums/accents.dm @@ -25,18 +25,15 @@ /datum/accent/abductor/modify_speech(list/speech_args, datum/source) var/message = speech_args[SPEECH_MESSAGE] - var/mob/living/carbon/human/user = source + var/mob/living/carbon/user = source + var/obj/item/organ/tongue/abductor/A = user.getorgan(/obj/item/organ/tongue/abductor) var/rendered = "[user.name]: [message]" user.log_talk(message, LOG_SAY, tag="abductor") - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - var/obj/item/organ/tongue/T = H.getorganslot(ORGAN_SLOT_TONGUE) - if(!T || T.type != type) + for(var/mob/living/carbon/C in GLOB.alive_mob_list) + var/obj/item/organ/tongue/abductor/T = C.getorgan(/obj/item/organ/tongue/abductor) + if(!T || T.mothership != A.mothership) continue - if(H.dna && H.dna.species.id == "abductor" && user.dna && user.dna.species.id == "abductor") - var/datum/antagonist/abductor/A = user.mind.has_antag_datum(/datum/antagonist/abductor) - if(!A || !(H.mind in A.team.members)) - continue - to_chat(H, rendered) + to_chat(C, rendered) for(var/mob/M in GLOB.dead_mob_list) var/link = FOLLOW_LINK(M, user) to_chat(M, "[link] [rendered]") diff --git a/code/datums/action.dm b/code/datums/action.dm index fbf7487e4d..9e25d0e3f3 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -2,6 +2,7 @@ #define AB_CHECK_STUN 2 #define AB_CHECK_LYING 4 #define AB_CHECK_CONSCIOUS 8 +#define AB_CHECK_ALIVE 16 /datum/action var/name = "Generic Action" @@ -115,6 +116,9 @@ if(check_flags & AB_CHECK_CONSCIOUS) if(owner.stat) return FALSE + if(check_flags & AB_CHECK_ALIVE) + if(owner.stat == DEAD) + return FALSE return TRUE /datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE) @@ -174,7 +178,7 @@ M.ghostize(can_reenter_corpse = TRUE, voluntary = TRUE) /datum/action/proc/OnUpdatedIcon() - UpdateButtonIcon() + addtimer(CALLBACK(src, .proc/UpdateButtonIcon), 1) //Hopefully runs after new icon overlays have been compiled. //Presets for item actions /datum/action/item_action @@ -273,6 +277,13 @@ if(istype(H)) H.toggle_welding_screen(owner) +/datum/action/item_action/toggle_welding_screen/plasmaman + +/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger() + var/obj/item/clothing/head/helmet/space/plasmaman/H = target + if(istype(H)) + H.toggle_welding_screen(owner) + /datum/action/item_action/toggle_headphones name = "Toggle Headphones" desc = "UNTZ UNTZ UNTZ" diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index e5e1434ab8..f35389f171 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -92,7 +92,7 @@ trauma = _trauma owner = trauma.owner - setup_friend() + INVOKE_ASYNC(src, .proc/setup_friend) join = new join.Grant(src) diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 6d3eedee1d..92c4e55699 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -263,4 +263,4 @@ popleft(speak_dejavu) //Remove the oldest speak_dejavu += speech_args[SPEECH_MESSAGE] else - speak_dejavu += speech_args[SPEECH_MESSAGE] \ No newline at end of file + speak_dejavu += speech_args[SPEECH_MESSAGE] diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 73d3e69ac4..669e3ddd77 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -1,12 +1,25 @@ +/// How long the chat message's spawn-in animation will occur for #define CHAT_MESSAGE_SPAWN_TIME 0.2 SECONDS +/// How long the chat message will exist prior to any exponential decay #define CHAT_MESSAGE_LIFESPAN 5 SECONDS +/// How long the chat message's end of life fading animation will occur for #define CHAT_MESSAGE_EOL_FADE 0.7 SECONDS -#define CHAT_MESSAGE_EXP_DECAY 0.7 // Messages decay at pow(factor, idx in stack) -#define CHAT_MESSAGE_HEIGHT_DECAY 0.9 // Increase message decay based on the height of the message -#define CHAT_MESSAGE_APPROX_LHEIGHT 11 // Approximate height in pixels of an 'average' line, used for height decay -#define CHAT_MESSAGE_WIDTH 96 // pixels -#define CHAT_MESSAGE_MAX_LENGTH 110 // characters -#define WXH_TO_HEIGHT(x) text2num(copytext((x), findtextEx((x), "x") + 1)) // thanks lummox +/// Factor of how much the message index (number of messages) will account to exponential decay +#define CHAT_MESSAGE_EXP_DECAY 0.7 +/// Factor of how much height will account to exponential decay +#define CHAT_MESSAGE_HEIGHT_DECAY 0.9 +/// Approximate height in pixels of an 'average' line, used for height decay +#define CHAT_MESSAGE_APPROX_LHEIGHT 11 +/// Max width of chat message in pixels +#define CHAT_MESSAGE_WIDTH 96 +/// Max length of chat message in characters +#define CHAT_MESSAGE_MAX_LENGTH 110 +/// Maximum precision of float before rounding errors occur (in this context) +#define CHAT_LAYER_Z_STEP 0.0001 +/// The number of z-layer 'slices' usable by the chat message layering +#define CHAT_LAYER_MAX_Z (CHAT_LAYER_MAX - CHAT_LAYER) / CHAT_LAYER_Z_STEP +/// Macro from Lummox used to get height from a MeasureText proc +#define WXH_TO_HEIGHT(x) text2num(copytext(x, findtextEx(x, "x") + 1)) /** * # Chat Message Overlay @@ -20,10 +33,18 @@ var/atom/message_loc /// The client who heard this message var/client/owned_by - /// Contains the scheduled destruction time + /// Contains the scheduled destruction time, used for scheduling EOL var/scheduled_destruction + /// Contains the time that the EOL for the message will be complete, used for qdel scheduling + var/eol_complete /// Contains the approximate amount of lines for height decay var/approx_lines + /// Contains the reference to the next chatmessage in the bucket, used by runechat subsystem + var/datum/chatmessage/next + /// Contains the reference to the previous chatmessage in the bucket, used by runechat subsystem + var/datum/chatmessage/prev + /// The current index used for adjusting the layer of each sequential chat message such that recent messages will overlay older ones + var/static/current_z_idx = 0 /** * Constructs a chat message overlay @@ -53,6 +74,7 @@ owned_by = null message_loc = null message = null + leave_subsystem() return ..() /** @@ -109,17 +131,12 @@ // We dim italicized text to make it more distinguishable from regular text var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color - // Approximate text height - // Note we have to replace HTML encoded metacharacters otherwise MeasureText will return a zero height - // BYOND Bug #2563917 - // Construct text - var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g") var/complete_text = "[owner.say_emphasis(text)]" - var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(replacetext(complete_text, html_metachars, "m"), null, CHAT_MESSAGE_WIDTH)) + var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH)) approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT) // Translate any existing messages upwards, apply exponential decay factors to timers - message_loc = target + message_loc = get_atom_on_turf(target) if (owned_by.seen_messages) var/idx = 1 var/combined_height = approx_lines @@ -127,14 +144,20 @@ var/datum/chatmessage/m = msg animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME) combined_height += m.approx_lines + + // When choosing to update the remaining time we have to be careful not to update the + // scheduled time once the EOL completion time has been set. var/sched_remaining = m.scheduled_destruction - world.time - if (sched_remaining > CHAT_MESSAGE_SPAWN_TIME) + if (!m.eol_complete) var/remaining_time = (sched_remaining) * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height) - m.scheduled_destruction = world.time + remaining_time - addtimer(CALLBACK(m, .proc/end_of_life), remaining_time, TIMER_UNIQUE|TIMER_OVERRIDE) + m.enter_subsystem(world.time + remaining_time) // push updated time to runechat SS + + // Reset z index if relevant + if (current_z_idx >= CHAT_LAYER_MAX_Z) + current_z_idx = 0 // Build message image - message = image(loc = message_loc, layer = CHAT_LAYER) + message = image(loc = message_loc, layer = CHAT_LAYER + CHAT_LAYER_Z_STEP * current_z_idx++) message.plane = CHAT_PLANE message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART message.alpha = 0 @@ -149,16 +172,19 @@ owned_by.images |= message animate(message, alpha = 255, time = CHAT_MESSAGE_SPAWN_TIME) - // Prepare for destruction + // Register with the runechat SS to handle EOL and destruction scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE) - addtimer(CALLBACK(src, .proc/end_of_life), lifespan - CHAT_MESSAGE_EOL_FADE, TIMER_UNIQUE|TIMER_OVERRIDE) + enter_subsystem() /** * Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion + * Arguments: + * * fadetime - The amount of time to animate the message's fadeout for */ /datum/chatmessage/proc/end_of_life(fadetime = CHAT_MESSAGE_EOL_FADE) + eol_complete = scheduled_destruction + fadetime animate(message, alpha = 0, time = fadetime, flags = ANIMATION_PARALLEL) - QDEL_IN(src, fadetime) + enter_subsystem(eol_complete) // re-enter the runechat SS with the EOL completion time to QDEL self /** * Creates a message overlay at a defined location for a given speaker diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index 7b3081cb33..2648ae1eab 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -30,7 +30,7 @@ /datum/cinematic var/id = CINEMATIC_DEFAULT var/list/watching = list() //List of clients watching this - var/list/locked = list() //Who had mob_transforming set during the cinematic + var/list/locked = list() //Who had mob_transforming set during the cinematic var/is_global = FALSE //Global cinematics will override mob-specific ones var/obj/screen/cinematic/screen var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc) @@ -45,7 +45,7 @@ if(!CC) continue var/client/C = CC - //C.mob.clear_fullscreen("cinematic") + C.mob.clear_fullscreen("cinematic") C.screen -= screen watching = null QDEL_NULL(screen) @@ -54,7 +54,7 @@ if(!MM) continue var/mob/M = MM - M.mob_transforming = FALSE + M.mob_transforming = FALSE locked = null return ..() @@ -93,7 +93,7 @@ toggle_ooc(TRUE) /datum/cinematic/proc/show_to(mob/M, client/C) - //SIGNAL_HANDLER //must not wait. + SIGNAL_HANDLER if(!M.mob_transforming) locked += M @@ -101,7 +101,7 @@ if(!C) return watching += C - //M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop) + M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop) C.screen += screen //Sound helper @@ -122,7 +122,7 @@ sleep(50) /datum/cinematic/proc/replacement_cinematic(datum/source, datum/cinematic/other) - //SIGNAL_HANDLER + SIGNAL_HANDLER if(!is_global && other.is_global) //Allow it to play if we're local and it's global return NONE @@ -210,6 +210,20 @@ special() screen.icon_state = "summary_cult" +// /datum/cinematic/cult_fail +// id = CINEMATIC_CULT_FAIL + +// /datum/cinematic/cult_fail/content() +// screen.icon_state = "station_intact" +// sleep(20) +// cinematic_sound(sound('sound/creatures/narsie_rises.ogg')) +// sleep(60) +// cinematic_sound(sound('sound/effects/explosion_distant.ogg')) +// sleep(10) +// cinematic_sound(sound('sound/magic/demon_dies.ogg')) +// sleep(30) +// special() + /datum/cinematic/nuke_annihilation id = CINEMATIC_ANNIHILATION diff --git a/code/datums/components/README.md b/code/datums/components/README.md index 509630bb0a..dd27c05469 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -1,9 +1,9 @@ -# Datum Component System (DCS) - -## Concept - -Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening. - -See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole. - -### See/Define signals and their arguments in [__DEFINES\components.dm](..\..\__DEFINES\components.dm) +# Datum Component System (DCS) + +## Concept + +Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening. + +See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole. + +### See/Define signals and their arguments in [__DEFINES\components.dm](..\..\__DEFINES\components.dm) diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index d138cf1971..72cf71496b 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -34,7 +34,7 @@ var/obj/item/bodypart/O = H.get_bodypart(picked_def_zone) if(!istype(O)) return - if(O.status == BODYPART_ROBOTIC) + if(O.is_robotic_limb()) return var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET) || (H.shoes && (H.shoes.body_parts_covered & FEET))) diff --git a/code/datums/components/combat_mode.dm b/code/datums/components/combat_mode.dm index b9952e9133..29d90fd509 100644 --- a/code/datums/components/combat_mode.dm +++ b/code/datums/components/combat_mode.dm @@ -125,7 +125,7 @@ ///Changes the user direction to (try) keep match the pointer. /datum/component/combat_mode/proc/on_move(atom/movable/source, dir, atom/oldloc, forced) var/mob/living/L = source - if(mode_flags & COMBAT_MODE_ACTIVE && L.client && lastmousedir && lastmousedir != dir) + if((mode_flags & COMBAT_MODE_ACTIVE) && L.client) L.setDir(lastmousedir, ismousemovement = TRUE) /// Added movement delay if moving backward. diff --git a/code/datums/components/crafting/glassware/glassware.dm b/code/datums/components/crafting/glassware/glassware.dm index 6e1a3d47a0..88f52d6b01 100644 --- a/code/datums/components/crafting/glassware/glassware.dm +++ b/code/datums/components/crafting/glassware/glassware.dm @@ -451,4 +451,4 @@ if(istype(I, /obj/item/stack/sheet/glass)) if(do_after(user,10, target = src)) new next_step(user.loc, 1) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/datums/components/crafting/glassware/lens_crafting.dm b/code/datums/components/crafting/glassware/lens_crafting.dm index 98fa242058..8907522946 100644 --- a/code/datums/components/crafting/glassware/lens_crafting.dm +++ b/code/datums/components/crafting/glassware/lens_crafting.dm @@ -95,4 +95,4 @@ name = "Handmade Glasses" desc = "Handmade glasses that have not been polished at all making them useless. Selling them could still be worth a few credits." icon = 'icons/obj/glass_ware.dmi' - icon_state = "frames_2" \ No newline at end of file + icon_state = "frames_2" diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index deab5e9b69..33db660c54 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -2,6 +2,12 @@ /obj/item/weaponcrafting icon = 'icons/obj/improvised.dmi' +/obj/item/weaponcrafting/receiver + name = "modular receiver" + desc = "A prototype modular receiver and trigger assembly for a firearm." + icon = 'icons/obj/improvised.dmi' + icon_state = "receiver" + /obj/item/weaponcrafting/stock name = "rifle stock" desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." @@ -12,41 +18,3 @@ name = "wound thread" desc = "A long piece of thread with some resemblance to cable coil." icon_state = "durastring" - -//////////////////////////////// -// IMPROVISED WEAPON PARTS// -//////////////////////////////// - -/obj/item/weaponcrafting/improvised_parts - name = "Debug Improvised Gun Part" - desc = "A badly coded gun part. You should report coders if you see this." - icon = 'icons/obj/guns/gun_parts.dmi' - icon_state = "palette" - -// RECEIVERS - -/obj/item/weaponcrafting/improvised_parts/rifle_receiver - name = "rifle receiver" - desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle." // removed some text implying that the item had more uses than it does - icon_state = "receiver_rifle" - w_class = WEIGHT_CLASS_SMALL - - -/obj/item/weaponcrafting/improvised_parts/shotgun_receiver - name = "shotgun reciever" - desc = "An improvised receiver to create a break-action breechloaded shotgun." // removed some text implying that the item had more uses than it does - icon_state = "receiver_shotgun" - w_class = WEIGHT_CLASS_SMALL - -// MISC - -/obj/item/weaponcrafting/improvised_parts/trigger_assembly - name = "firearm trigger assembly" - desc = "A modular trigger assembly with a firing pin, this can be used to make a whole bunch of improvised firearss." - icon_state = "trigger_assembly" - w_class = WEIGHT_CLASS_SMALL - -/obj/item/weaponcrafting/improvised_parts/wooden_body - name = "wooden firearm body" - desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart." - icon_state = "wooden_body" diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 14987bac44..d85df8c010 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -45,8 +45,8 @@ /datum/crafting_recipe/bloodsucker/blackcoffin name = "Black Coffin" result = /obj/structure/closet/crate/coffin/blackcoffin - tools = list(/obj/item/weldingtool, - /obj/item/screwdriver) + tools = list(TOOL_WELDER, + TOOL_SCREWDRIVER) reqs = list(/obj/item/stack/sheet/cloth = 1, /obj/item/stack/sheet/mineral/wood = 5, /obj/item/stack/sheet/metal = 1) @@ -72,8 +72,8 @@ /datum/crafting_recipe/bloodsucker/metalcoffin name = "Metal Coffin" result =/obj/structure/closet/crate/coffin/metalcoffin - tools = list(/obj/item/weldingtool, - /obj/item/screwdriver) + tools = list(TOOL_WELDER, + TOOL_SCREWDRIVER) reqs = list(/obj/item/stack/sheet/metal = 5) time = 100 subcategory = CAT_FURNITURE @@ -84,9 +84,9 @@ name = "Persuasion Rack" //desc = "For converting crewmembers into loyal Vassals." result = /obj/structure/bloodsucker/vassalrack - tools = list(/obj/item/weldingtool, - //obj/item/screwdriver, - /obj/item/wrench + tools = list(TOOL_WELDER, + //TOOL_SCREWDRIVER, + TOOL_WRENCH ) reqs = list(/obj/item/stack/sheet/mineral/wood = 3, /obj/item/stack/sheet/metal = 2, @@ -108,8 +108,8 @@ name = "Candelabrum" //desc = "For converting crewmembers into loyal Vassals." result = /obj/structure/bloodsucker/candelabrum - tools = list(/obj/item/weldingtool, - /obj/item/wrench + tools = list(TOOL_WELDER, + TOOL_WRENCH ) reqs = list(/obj/item/stack/sheet/metal = 3, /obj/item/stack/rods = 1, @@ -172,11 +172,11 @@ /////////////////// /datum/crafting_recipe/upgraded_gauze - name = "Improved Gauze" + name = "Sterilized Gauze" result = /obj/item/stack/medical/gauze/adv/one time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, - /datum/reagent/space_cleaner/sterilizine = 10) + /datum/reagent/space_cleaner/sterilizine = 5) category = CAT_MISC subcategory = CAT_TOOL @@ -184,7 +184,7 @@ name = "Suture Pack" result = /obj/item/stack/medical/suture/five time = 1 - reqs = list(/obj/item/stack/medical/gauze = 1, + reqs = list(/obj/item/stack/medical/gauze/adv = 1, /datum/reagent/medicine/styptic_powder = 10) category = CAT_MISC subcategory = CAT_TOOL @@ -193,7 +193,7 @@ name = "Regenerative Mesh" result = /obj/item/stack/medical/mesh/five time = 1 - reqs = list(/obj/item/stack/medical/gauze = 1, + reqs = list(/obj/item/stack/medical/gauze/adv = 1, /datum/reagent/medicine/silver_sulfadiazine = 10) category = CAT_MISC subcategory = CAT_TOOL diff --git a/code/datums/components/crafting/recipes/recipes_robot.dm b/code/datums/components/crafting/recipes/recipes_robot.dm index 2b8ee0fe3a..53606e64df 100644 --- a/code/datums/components/crafting/recipes/recipes_robot.dm +++ b/code/datums/components/crafting/recipes/recipes_robot.dm @@ -40,7 +40,7 @@ /datum/crafting_recipe/floorbot name = "Floorbot" result = /mob/living/simple_animal/bot/floorbot - reqs = list(/obj/item/storage/toolbox/mechanical = 1, + reqs = list(/obj/item/storage/toolbox = 1, /obj/item/stack/tile/plasteel = 1, /obj/item/assembly/prox_sensor = 1, /obj/item/bodypart/r_arm/robot = 1) @@ -95,4 +95,4 @@ reqs = list(/obj/item/aicard = 1, /obj/item/reagent_containers/food/snacks/grown/pumpkin = 1, /obj/item/stack/cable_coil = 5) - category = CAT_ROBOT \ No newline at end of file + category = CAT_ROBOT diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index ec8ea86d24..0135cab77f 100644 --- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -72,6 +72,52 @@ category = CAT_WEAPONRY subcategory = CAT_MELEE +/datum/crafting_recipe/bokken + name = "Training Bokken" + result = /obj/item/melee/bokken + tools = list(TOOL_SCREWDRIVER) + reqs = list(/obj/item/bokken_blade = 1, + /obj/item/bokken_hilt = 1, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/leather = 1) + time = 60 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + +/datum/crafting_recipe/bokken_steelwood + name = "Training Steelwood Bokken" + result = /obj/item/melee/bokken/steelwood + tools = list(TOOL_SCREWDRIVER) + reqs = list(/obj/item/bokken_steelblade = 1, + /obj/item/bokken_hilt = 1, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/leather = 1) + time = 60 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + +/datum/crafting_recipe/wakibokken + name = "Training Wakizashi Bokken" + result = /obj/item/melee/bokken/waki + tools = list(TOOL_SCREWDRIVER) + reqs = list(/obj/item/wakibokken_blade = 1, + /obj/item/bokken_hilt = 1, + /obj/item/stack/sheet/cloth = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + +/datum/crafting_recipe/wakibokken_steelwood + name = "Training Wakizashi Steelwood Bokken" + result = /obj/item/melee/bokken/waki/steelwood + tools = list(TOOL_SCREWDRIVER) + reqs = list(/obj/item/wakibokken_steelblade = 1, + /obj/item/bokken_hilt = 1, + /obj/item/stack/sheet/cloth = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + /datum/crafting_recipe/bola name = "Bola" result = /obj/item/restraints/legcuffs/bola @@ -248,33 +294,18 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON -/datum/crafting_recipe/ishotgun // smaller and more versatile gun requires some better materials +/datum/crafting_recipe/ishotgun name = "Improvised Shotgun" result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised - reqs = list(/obj/item/pipe = 2, // putting a large amount of meaningless timegates by forcing people to turn base resources into upgraded resources kinda sucks - /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1, - /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, - /obj/item/weaponcrafting/improvised_parts/wooden_body = 1, - /obj/item/weaponcrafting/stock = 1, - /obj/item/stack/packageWrap = 5) - tools = list(TOOL_SCREWDRIVER) - time = 100 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/irifle // larger and less versatile gun, but a bit easier to make - name = "Improvised Rifle (7.62mm)" - result = /obj/item/gun/ballistic/shotgun/boltaction/improvised - reqs = list(/obj/item/pipe = 2, // above - /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1, - /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, - /obj/item/weaponcrafting/improvised_parts/wooden_body = 1, + reqs = list(/obj/item/pipe = 1, + /obj/item/weaponcrafting/receiver = 1, /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5) tools = list(TOOL_SCREWDRIVER) time = 100 category = CAT_WEAPONRY subcategory = CAT_WEAPON +//the Improvised Rifle will not be missed. Rest in Pieces 2019-2021 ////////////////// ///AMMO CRAFTING// @@ -403,35 +434,50 @@ // PARTS CRAFTING // //////////////////// -// RECEIVERS +// BOKKEN CRAFTING -/datum/crafting_recipe/rifle_receiver - name = "Improvised Rifle Receiver" - result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver - reqs = list(/obj/item/stack/sheet/metal = 15) // you can carry multiple shotguns - tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) - time = 25 +/datum/crafting_recipe/bokken_blade + name = "Training Bokken Blade" + result = /obj/item/bokken_blade + tools = list(/obj/item/hatchet) + reqs = list(/obj/item/stack/sheet/mineral/wood = 5) + time = 20 category = CAT_WEAPONRY subcategory = CAT_PARTS -/datum/crafting_recipe/shotgun_receiver - name = "Improvised Shotgun Receiver" - result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver - reqs = list(/obj/item/stack/sheet/metal = 15, - /obj/item/stack/sheet/plasteel = 1) // requires access or hacking since shotgun is better - tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) - time = 25 +/datum/crafting_recipe/wakibokken_blade + name = "Training Wakizashi Bokken Blade" + result = /obj/item/wakibokken_blade + tools = list(/obj/item/hatchet) + reqs = list(/obj/item/stack/sheet/mineral/wood = 2) + time = 20 category = CAT_WEAPONRY subcategory = CAT_PARTS -// MISC - -/datum/crafting_recipe/trigger_assembly - name = "Trigger Assembly" - result = /obj/item/weaponcrafting/improvised_parts/trigger_assembly - reqs = list(/obj/item/stack/sheet/metal = 3, - /obj/item/assembly/igniter = 1) - tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) - time = 25 +/datum/crafting_recipe/bokken_steelblade + name = "Training Ironwood Bokken Blade" + result = /obj/item/bokken_steelblade + tools = list(/obj/item/hatchet, TOOL_WELDER) + reqs = list(/obj/item/grown/log/steel = 2) + time = 20 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/wakibokken_steelblade + name = "Training Wakizashi Ironwood Bokken Blade" + result = /obj/item/wakibokken_steelblade + tools = list(/obj/item/hatchet, TOOL_WELDER) + reqs = list(/obj/item/grown/log/steel = 1) + time = 20 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/bokken_hilt + name = "Training Bokken hilt" + result = /obj/item/bokken_hilt + tools = list(/obj/item/hatchet) + reqs = list(/obj/item/stack/sheet/mineral/wood = 5, + /obj/item/stack/sheet/cloth = 2) + time = 20 category = CAT_WEAPONRY subcategory = CAT_PARTS diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index 0ada00a2e8..3dd965b185 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -67,4 +67,4 @@ /datum/fantasy_affix/vampiric/apply(datum/component/fantasy/comp, newName) var/obj/item/master = comp.parent comp.appliedComponents += master.AddComponent(/datum/component/lifesteal, comp.quality) - return "vampiric [newName]" \ No newline at end of file + return "vampiric [newName]" diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index f767c607a5..8b326ac424 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -46,7 +46,7 @@ var/mob/living/LM = parent if(!T.footstep || LM.buckled || !CHECK_MOBILITY(LM, MOBILITY_STAND) || LM.buckled || LM.throwing || (LM.movement_type & (VENTCRAWLING | FLYING))) if (LM.lying && !LM.buckled && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying - playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * volume) + playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff_distance = 1) return if(HAS_TRAIT(LM, TRAIT_SILENT_STEP)) @@ -75,7 +75,7 @@ if(!T) return if(isfile(footstep_sounds) || istext(footstep_sounds)) - playsound(T, footstep_sounds, volume) + playsound(T, footstep_sounds, volume, falloff_distance = 1) return var/turf_footstep switch(footstep_type) @@ -89,7 +89,7 @@ turf_footstep = T.footstep if(!turf_footstep) return - playsound(T, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range) + playsound(T, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1) /datum/component/footstep/proc/play_humanstep() var/turf/open/T = prepare_step() @@ -114,10 +114,10 @@ turf_footstep = T.footstep L = GLOB.footstep if(FOOTSTEP_MOB_SLIME) - playsound(T, 'sound/effects/footstep/slime1.ogg', 50 * volume) + playsound(T, 'sound/effects/footstep/slime1.ogg', 50 * volume, falloff_distance = 1) return if(FOOTSTEP_MOB_CRAWL) - playsound(T, 'sound/effects/footstep/crawl1.ogg', 50 * volume) + playsound(T, 'sound/effects/footstep/crawl1.ogg', 50 * volume, falloff_distance = 1) return special = TRUE else @@ -126,13 +126,13 @@ playsound(T, pick(GLOB.footstep[T.footstep][1]), GLOB.footstep[T.footstep][2] * volume, TRUE, - GLOB.footstep[T.footstep][3] + e_range) + GLOB.footstep[T.footstep][3] + e_range, falloff_distance = 1) return if(!special && H.dna.species.special_step_sounds) - playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE) + playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1) else playsound(T, pick(L[turf_footstep][1]), L[turf_footstep][2] * volume, TRUE, - L[turf_footstep][3] + e_range) + L[turf_footstep][3] + e_range, falloff_distance = 1) diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index c2b3ad1f30..f3ff912321 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -21,12 +21,15 @@ GLOBAL_LIST_EMPTY(GPS_list) var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user. var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown -/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE) +/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE, starton = TRUE) . = ..() if(. == COMPONENT_INCOMPATIBLE || !isitem(parent)) return COMPONENT_INCOMPATIBLE var/atom/A = parent - A.add_overlay("working") + if(starton) + A.add_overlay("working") + else + tracking = FALSE A.name = "[initial(A.name)] ([gpstag])" RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/interact) if(!emp_proof) diff --git a/code/datums/components/igniter.dm b/code/datums/components/igniter.dm index 13944b1200..2f311db166 100644 --- a/code/datums/components/igniter.dm +++ b/code/datums/components/igniter.dm @@ -36,4 +36,4 @@ if(isliving(target)) var/mob/living/L = target L.adjust_fire_stacks(fire_stacks) - L.IgniteMob() \ No newline at end of file + L.IgniteMob() diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm index a36169e6df..7d399c7d26 100644 --- a/code/datums/components/knockoff.dm +++ b/code/datums/components/knockoff.dm @@ -41,4 +41,4 @@ RegisterSignal(H, COMSIG_HUMAN_DISARM_HIT, .proc/Knockoff, TRUE) /datum/component/knockoff/proc/OnDropped(datum/source, mob/living/M) - UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT) \ No newline at end of file + UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT) diff --git a/code/datums/components/magnetic_catch.dm b/code/datums/components/magnetic_catch.dm index 181b24260b..20cd8e1d78 100644 --- a/code/datums/components/magnetic_catch.dm +++ b/code/datums/components/magnetic_catch.dm @@ -31,4 +31,4 @@ UnregisterSignal(thing, COMSIG_MOVABLE_PRE_THROW) /datum/component/magnetic_catch/proc/throw_react(datum/source, list/arguments) - return COMPONENT_CANCEL_THROW \ No newline at end of file + return COMPONENT_CANCEL_THROW diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 87bc681651..203414b47c 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -189,26 +189,32 @@ if(-INFINITY to SANITY_CRAZY) setInsanityEffect(MAJOR_INSANITY_PEN) master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/insane) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity) sanity_level = 6 if(SANITY_CRAZY to SANITY_UNSTABLE) setInsanityEffect(MINOR_INSANITY_PEN) master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/crazy) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity) sanity_level = 5 if(SANITY_UNSTABLE to SANITY_DISTURBED) setInsanityEffect(SLIGHT_INSANITY_PEN) master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/disturbed) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity) sanity_level = 4 if(SANITY_DISTURBED to SANITY_NEUTRAL) setInsanityEffect(0) master.remove_movespeed_modifier(MOVESPEED_ID_SANITY) + master.remove_actionspeed_modifier(ACTIONSPEED_ID_SANITY) sanity_level = 3 if(SANITY_NEUTRAL+1 to SANITY_GREAT+1) //shitty hack but +1 to prevent it from responding to super small differences setInsanityEffect(0) master.remove_movespeed_modifier(MOVESPEED_ID_SANITY) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/high_sanity) sanity_level = 2 if(SANITY_GREAT+1 to INFINITY) setInsanityEffect(ECSTATIC_SANITY_PEN) //It's not a penalty but w/e master.remove_movespeed_modifier(MOVESPEED_ID_SANITY) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/high_sanity) sanity_level = 1 if(sanity_level != old_sanity_level) diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 29add286be..4e0ce3fc16 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -17,6 +17,44 @@ var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans var/diagnostics = TRUE //if TRUE, displays program list when scanned by nanite scanners + /// Delete ourselves when we're depleted. + var/qdel_self_on_depletion = TRUE + /// Allow deletion + var/can_be_deleted = TRUE + /// Whether or not we can survive no cloud syncing without errors + var/requires_cloud_sync = TRUE + /// Permanent programs - can never be deleted. does not count towards max_programs. + var/list/datum/nanite_program/permanent_programs = list() + + // Vulnerabilities + /// EMP flat deletion upper + var/emp_flat_deletion_upper = 35 + /// EMP flat deletion lower + var/emp_flat_deletion_lower = 20 + /// EMP percent deletion upper + var/emp_percent_deletion_upper = 0.35 + /// EMP percent deletion lower + var/emp_percent_deletion_lower = 0.30 + /// EMP severity multiplier, capping to 0 to 100 + var/emp_severity_mod = 1 + /// EMP severity div for cloudsync reset chance + var/emp_desync_mod = 0.25 + + /// Shock flat deletion upper + var/shock_flat_deletion_upper = 45 + /// Shock flat deletion lower + var/shock_flat_deletion_lower = 25 + /// Shock percent deletion upper + var/shock_percent_deletion_upper = 0.25 + /// Shock percent deletion lower + var/shock_percent_deletion_lower = 0.20 + + + /// minor shock deletion lower + var/minor_shock_deletion_lower = 5 + /// minor shock deletion upper + var/minor_shock_deletion_upper = 15 + /datum/component/nanites/Initialize(amount = 100, cloud = 0) if(!isliving(parent) && !istype(parent, /datum/nanite_cloud_backup)) return COMPONENT_INCOMPATIBLE @@ -55,6 +93,9 @@ RegisterSignal(parent, COMSIG_NANITE_ADD_PROGRAM, .proc/add_program) RegisterSignal(parent, COMSIG_NANITE_SCAN, .proc/nanite_scan) RegisterSignal(parent, COMSIG_NANITE_SYNC, .proc/sync) + RegisterSignal(parent, COMSIG_NANITE_CHECK_CONSOLE_LOCK, .proc/check_console_locking) + RegisterSignal(parent, COMSIG_NANITE_CHECK_HOST_LOCK, .proc/check_host_lockout) + RegisterSignal(parent, COMSIG_NANITE_CHECK_VIRAL_PREVENTION, .proc/check_viral_prevention) if(isliving(parent)) RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp) @@ -118,13 +159,63 @@ next_sync = world.time + NANITE_SYNC_DELAY set_nanite_bar() +/** + * Called when nanites are depleted. + * Deletes ourselves by default. + */ +/datum/component/nanites/proc/nanites_depleted() + if(qdel_self_on_depletion) + delete_nanites() +/** + * Used to rid ourselves + */ /datum/component/nanites/proc/delete_nanites() - qdel(src) + if(can_be_deleted) + qdel(src) + +/** + * Adds permanent programs + * + * WARNING: Has no sanity checks. Make sure you know what you are doing! (make sure programs do not conflict) + */ +/datum/component/nanites/proc/add_permanent_program(list/program, immutable = FALSE) + if(!islist(program)) + program = list(program) + for(var/i in program) + if(i in permanent_programs) + continue + var/datum/nanite_program/P = i + permanent_programs += P + if(immutable) + P.immutable = TRUE + for(var/e in programs) + var/datum/nanite_program/E = e + if(E.unique && (E.type == P.type)) + qdel(e) + programs += P + +/** + * Checks if we can block out console modification + */ +/datum/component/nanites/proc/check_console_locking() + return SEND_SIGNAL(src, COMSIG_NANITE_INTERNAL_CONSOLE_LOCK_CHECK) + +/** + * Checks if we can lock out host internal conscious modification + */ +/datum/component/nanites/proc/check_host_lockout() + return SEND_SIGNAL(src, COMSIG_NANITE_INTERNAL_HOST_LOCK_CHECK) + +/** + * Checks if we can block out viral replica + */ +/datum/component/nanites/proc/check_viral_prevention() + return SEND_SIGNAL(src, COMSIG_NANITE_INTERNAL_VIRAL_PREVENTION_CHECK) //Syncs the nanite component to another, making it so programs are the same with the same programming (except activation status) /datum/component/nanites/proc/sync(datum/signal_source, datum/component/nanites/source, full_overwrite = TRUE, copy_activation = FALSE) - var/list/programs_to_remove = programs.Copy() + var/list/programs_to_remove = programs.Copy() - permanent_programs var/list/programs_to_add = source.programs.Copy() for(var/X in programs) var/datum/nanite_program/NP = X @@ -151,7 +242,7 @@ sync(null, cloud_copy) return //Without cloud syncing nanites can accumulate errors and/or defects - if(prob(8) && programs.len) + if(prob(8) && programs.len && requires_cloud_sync) var/datum/nanite_program/NP = pick(programs) NP.software_error() @@ -159,8 +250,11 @@ for(var/X in programs) var/datum/nanite_program/NP = X if(NP.unique && NP.type == new_program.type) - qdel(NP) - if(programs.len >= max_programs) + if(NP in permanent_programs) + return COMPONENT_PROGRAM_NOT_INSTALLED + else + qdel(NP) + if((programs.len - length(permanent_programs)) >= max_programs) return COMPONENT_PROGRAM_NOT_INSTALLED if(source_program) source_program.copy_programming(new_program) @@ -177,7 +271,7 @@ /datum/component/nanites/proc/adjust_nanites(datum/source, amount) nanite_volume = clamp(nanite_volume + amount, 0, max_nanites) if(nanite_volume <= 0) //oops we ran out - qdel(src) + nanites_depleted() /datum/component/nanites/proc/set_nanite_bar(remove = FALSE) var/image/holder = host_mob.hud_list[DIAG_NANITE_FULL_HUD] @@ -191,28 +285,28 @@ holder.icon_state = "nanites[nanite_percent]" /datum/component/nanites/proc/on_emp(datum/source, severity) - nanite_volume *= (rand(60, 90) * 0.01) //Lose 10-40% of nanites - adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume - if(prob(40/severity)) + severity *= emp_severity_mod + var/loss = (severity / 100) * (rand(emp_percent_deletion_lower, emp_percent_deletion_upper) * nanite_volume) + rand(emp_flat_deletion_lower, emp_flat_deletion_upper) + adjust_nanites(null, -loss) + if(prob(severity * emp_desync_mod)) cloud_id = 0 for(var/X in programs) var/datum/nanite_program/NP = X NP.on_emp(severity) - /datum/component/nanites/proc/on_shock(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) if(shock_damage < 1) return if(!HAS_TRAIT_NOT_FROM(host_mob, TRAIT_SHOCKIMMUNE, "nanites"))//Another shock protection must protect nanites too, but nanites protect only host - nanite_volume *= (rand(45, 80) * 0.01) //Lose 20-55% of nanites - adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume + var/loss = (rand(shock_percent_deletion_lower, shock_percent_deletion_upper) * nanite_volume) + rand(shock_flat_deletion_lower, shock_flat_deletion_upper) + adjust_nanites(null, -loss) for(var/X in programs) var/datum/nanite_program/NP = X NP.on_shock(shock_damage) /datum/component/nanites/proc/on_minor_shock(datum/source) - adjust_nanites(null, -(rand(5, 15))) //Lose 5-15 flat nanite volume + adjust_nanites(null, -(rand(minor_shock_deletion_lower, minor_shock_deletion_upper))) //Lose 5-15 flat nanite volume for(var/X in programs) var/datum/nanite_program/NP = X NP.on_minor_shock() @@ -237,7 +331,7 @@ NP.receive_comm_signal(comm_code, comm_message, comm_source) /datum/component/nanites/proc/check_viable_biotype() - if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) + if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD|MOB_NANITES))) qdel(src) //bodytype no longer sustains nanites /datum/component/nanites/proc/check_access(datum/source, obj/O) @@ -378,3 +472,10 @@ id++ mob_programs += list(mob_program) data["mob_programs"] = mob_programs + +/** + * Subtype that doesn't erase itself from running out + */ +/datum/component/nanites/permanent + qdel_self_on_depletion = FALSE + can_be_deleted = FALSE diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 53373de6d7..26f52f6ba5 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -54,6 +54,7 @@ move_react() /datum/component/orbiter/proc/begin_orbit(atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) + SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_BEGIN, orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) if(orbiter.orbiting) if(orbiter.orbiting == src) orbiter.orbiting.end_orbit(orbiter, TRUE) @@ -87,6 +88,7 @@ /datum/component/orbiter/proc/end_orbit(atom/movable/orbiter, refreshing=FALSE) if(!orbiters[orbiter]) return + SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_END, orbiter, refreshing) UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED) orbiter.SpinAnimation(0, 0) if(istype(orbiters[orbiter],/matrix)) //This is ugly. @@ -144,9 +146,11 @@ if(!istype(A) || !get_turf(A) || A == src) return + orbit_target = A return A.AddComponent(/datum/component/orbiter, src, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) /atom/movable/proc/stop_orbit(datum/component/orbiter/orbits) + orbit_target = null return // We're just a simple hook /atom/proc/transfer_observers_to(atom/target) diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index 6a1028cc65..6404be94c4 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -55,7 +55,7 @@ var/mob/living/shooter /datum/component/pellet_cloud/Initialize(projectile_type=/obj/item/shrapnel, magnitude=5) - if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent)) + if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent) && !issupplypod(parent)) return COMPONENT_INCOMPATIBLE if(magnitude < 1) @@ -66,7 +66,7 @@ if(isammocasing(parent)) num_pellets = magnitude - else if(isgrenade(parent) || islandmine(parent)) + else if(isgrenade(parent) || islandmine(parent) || issupplypod(parent)) radius = magnitude /datum/component/pellet_cloud/Destroy(force, silent) @@ -86,9 +86,11 @@ RegisterSignal(parent, COMSIG_GRENADE_PRIME, .proc/create_blast_pellets) else if(islandmine(parent)) RegisterSignal(parent, COMSIG_MINE_TRIGGERED, .proc/create_blast_pellets) + else if(issupplypod(parent)) + RegisterSignal(parent, COMSIG_SUPPLYPOD_LANDED, .proc/create_blast_pellets) /datum/component/pellet_cloud/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_PELLET_CLOUD_INIT, COMSIG_GRENADE_PRIME, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UNCROSSED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED)) + UnregisterSignal(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_PELLET_CLOUD_INIT, COMSIG_GRENADE_PRIME, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UNCROSSED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED, COMSIG_SUPPLYPOD_LANDED)) /** * create_casing_pellets() is for directed pellet clouds for ammo casings that have multiple pellets (buckshot and scatter lasers for instance) diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index ca62a70ee5..01038c11d3 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -84,38 +84,37 @@ handles linking back and forth. _MakeLocal() /datum/component/remote_materials/proc/OnAttackBy(datum/source, obj/item/I, mob/user) - if (istype(I, /obj/item/multitool)) - var/obj/item/multitool/M = I - if (!QDELETED(M.buffer) && istype(M.buffer, /obj/machinery/ore_silo)) - if (silo == M.buffer) + if(I.tool_behaviour == TOOL_MULTITOOL) + if((I.buffer) && istype(I.buffer, /obj/machinery/ore_silo)) + if(silo == I.buffer) to_chat(user, "[parent] is already connected to [silo].") return COMPONENT_NO_AFTERATTACK - if (silo) + if(silo) silo.connected -= src silo.updateUsrDialog() - else if (mat_container) + else if(mat_container) mat_container.retrieve_all() qdel(mat_container) - silo = M.buffer + silo = I.buffer silo.connected += src silo.updateUsrDialog() mat_container = silo.GetComponent(/datum/component/material_container) to_chat(user, "You connect [parent] to [silo] from the multitool's buffer.") return COMPONENT_NO_AFTERATTACK - else if (silo && istype(I, /obj/item/stack)) - if (silo.remote_attackby(parent, user, I)) + else if(silo && istype(I, /obj/item/stack)) + if(silo.remote_attackby(parent, user, I)) return COMPONENT_NO_AFTERATTACK /datum/component/remote_materials/proc/on_hold() return silo && silo.holds["[get_area(parent)]/[category]"] /datum/component/remote_materials/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats) - if (silo) + if(silo) silo.silo_log(M || parent, action, amount, noun, mats) /datum/component/remote_materials/proc/format_amount() - if (mat_container) + if(mat_container) return "[mat_container.total_amount] / [mat_container.max_amount == INFINITY ? "Unlimited" : mat_container.max_amount] ([silo ? "remote" : "local"])" else return "0 / 0" diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 747dd8ca61..e11eca2975 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -36,15 +36,15 @@ if(del_on_unbuckle_all && !AM.has_buckled_mobs()) qdel(src) -/datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE) - handle_vehicle_offsets() +/datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force) + handle_vehicle_offsets(M.buckled?.dir) -/datum/component/riding/proc/handle_vehicle_layer() +/datum/component/riding/proc/handle_vehicle_layer(dir) var/atom/movable/AM = parent var/static/list/defaults = list(TEXT_NORTH = OBJ_LAYER, TEXT_SOUTH = ABOVE_MOB_LAYER, TEXT_EAST = ABOVE_MOB_LAYER, TEXT_WEST = ABOVE_MOB_LAYER) - . = defaults["[AM.dir]"] - if(directional_vehicle_layers["[AM.dir]"]) - . = directional_vehicle_layers["[AM.dir]"] + . = defaults["[dir]"] + if(directional_vehicle_layers["[dir]"]) + . = directional_vehicle_layers["[dir]"] if(isnull(.)) //you can set it to null to not change it. . = AM.layer AM.layer = . @@ -52,12 +52,17 @@ /datum/component/riding/proc/set_vehicle_dir_layer(dir, layer) directional_vehicle_layers["[dir]"] = layer -/datum/component/riding/proc/vehicle_moved(datum/source) +/datum/component/riding/proc/vehicle_moved(datum/source, oldLoc, dir) + SIGNAL_HANDLER + var/atom/movable/AM = parent + if (isnull(dir)) + dir = AM.dir + AM.set_glide_size(DELAY_TO_GLIDE_SIZE(vehicle_move_delay), FALSE) for(var/i in AM.buckled_mobs) ride_check(i) - handle_vehicle_offsets() - handle_vehicle_layer() + handle_vehicle_offsets(dir) + handle_vehicle_layer(dir) /datum/component/riding/proc/ride_check(mob/living/M) var/atom/movable/AM = parent @@ -74,9 +79,9 @@ /datum/component/riding/proc/additional_offset_checks() return TRUE -/datum/component/riding/proc/handle_vehicle_offsets() +/datum/component/riding/proc/handle_vehicle_offsets(dir) var/atom/movable/AM = parent - var/AM_dir = "[AM.dir]" + var/AM_dir = "[dir]" var/passindex = 0 if(AM.has_buckled_mobs()) for(var/m in AM.buckled_mobs) @@ -133,7 +138,7 @@ //KEYS /datum/component/riding/proc/keycheck(mob/user) - return !keytype || user.is_holding_item_of_type(keytype) + return !keytype || user?.is_holding_item_of_type(keytype) //BUCKLE HOOKS /datum/component/riding/proc/restore_position(mob/living/buckled_mob) @@ -141,7 +146,7 @@ buckled_mob.pixel_x = 0 buckled_mob.pixel_y = 0 if(buckled_mob.client) - buckled_mob.client.change_view(CONFIG_GET(string/default_view)) + buckled_mob.client.view_size.resetToDefault() //MOVEMENT /datum/component/riding/proc/turf_check(turf/next, turf/current) @@ -153,7 +158,7 @@ /datum/component/riding/proc/handle_ride(mob/user, direction) var/atom/movable/AM = parent - if(user.incapacitated()) + if(user && user.incapacitated()) Unbuckle(user) return if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * vehicle_move_delay)) @@ -177,8 +182,8 @@ else last_move_diagonal = FALSE - handle_vehicle_offsets() - handle_vehicle_layer() + handle_vehicle_offsets(direction) + handle_vehicle_layer(direction) else to_chat(user, "You'll need the keys in one of your hands to [drive_verb] [AM].") diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 129faabdb7..b8d629273b 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -125,7 +125,7 @@ else if(!default_can_user_rotate(user, default_rotation_direction)) return - if(istype(I,/obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) BaseRot(user,default_rotation_direction) return COMPONENT_NO_AFTERATTACK diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm index 96807fe313..15f5c8f2b5 100644 --- a/code/datums/components/shrink.dm +++ b/code/datums/components/shrink.dm @@ -39,4 +39,4 @@ if(ishuman(L)) var/mob/living/carbon/human/H = L H.physiology.damage_resistance += 100 - ..() \ No newline at end of file + ..() diff --git a/code/datums/components/sizzle.dm b/code/datums/components/sizzle.dm index 5e56dd15cb..df0298b2aa 100644 --- a/code/datums/components/sizzle.dm +++ b/code/datums/components/sizzle.dm @@ -22,4 +22,4 @@ grill_marks.Blend(icon('icons/obj/kitchen.dmi', "grillmarks"), ICON_MULTIPLY) //adds grill marks and the remaining white areas become transparent sizzling = new(grill_marks) sizzling.alpha = sizzlealpha - food.add_overlay(sizzling) \ No newline at end of file + food.add_overlay(sizzling) diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index 27bf4a5986..44fbf313cf 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -53,4 +53,4 @@ spawned_mobs += L L.nest = src L.faction = src.faction - P.visible_message("[L] [spawn_text] [P].") \ No newline at end of file + P.visible_message("[L] [spawn_text] [P].") diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index df44aef4de..a285b7d3f2 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -11,15 +11,22 @@ // This is to stop squeak spam from inhand usage var/last_use = 0 var/use_delay = 20 - + // squeak cooldowns var/last_squeak = 0 var/squeak_delay = 5 - + /// chance we'll be stopped from squeaking by cooldown when something crossing us squeaks var/cross_squeak_delay_chance = 33 // about 3 things can squeak at a time -/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override) + ///extra-range for this component's sound + var/sound_extra_range = -1 + ///when sounds start falling off for the squeak + var/sound_falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE + ///sound exponent for squeak. Defaults to 10 as squeaking is loud and annoying enough. + var/sound_falloff_exponent = 10 + +/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override, extrarange, falloff_exponent, fallof_distance) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak) @@ -45,8 +52,30 @@ step_delay = step_delay_override if(isnum(use_delay_override)) use_delay = use_delay_override + if(isnum(extrarange)) + sound_extra_range = extrarange + if(isnum(falloff_exponent)) + sound_falloff_exponent = falloff_exponent + if(isnum(fallof_distance)) + sound_falloff_distance = fallof_distance + +/datum/component/squeak/UnregisterFromParent() + if(!isatom(parent)) + return + UnregisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY)) + if(ismovable(parent)) + UnregisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT, + COMSIG_MOVABLE_CROSSED, COMSIG_ITEM_WEARERCROSSED, COMSIG_MOVABLE_CROSS, + COMSIG_CROSS_SQUEAKED, COMSIG_MOVABLE_DISPOSING)) + if(isitem(parent)) + UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT, COMSIG_ITEM_ATTACK_SELF, + COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) + if(istype(parent, /obj/item/clothing/shoes)) + UnregisterSignal(parent, COMSIG_SHOES_STEP_ACTION) + return ..() /datum/component/squeak/proc/play_squeak() + SIGNAL_HANDLER do_play_squeak() /datum/component/squeak/proc/do_play_squeak(bypass_cooldown = FALSE) @@ -54,14 +83,16 @@ return FALSE if(prob(squeak_chance)) if(!override_squeak_sounds) - playsound(parent, pickweight(default_squeak_sounds), volume, 1, -1) + playsound(parent, pickweight(default_squeak_sounds), volume, TRUE, sound_extra_range, sound_falloff_exponent, falloff_distance = sound_falloff_distance) else - playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1) + playsound(parent, pickweight(override_squeak_sounds), volume, TRUE, sound_extra_range, sound_falloff_exponent, falloff_distance = sound_falloff_distance) last_squeak = world.time return TRUE return FALSE /datum/component/squeak/proc/step_squeak() + SIGNAL_HANDLER + if(steps > step_delay) do_play_squeak(TRUE) steps = 0 @@ -69,20 +100,22 @@ steps++ /datum/component/squeak/proc/play_squeak_crossed(datum/source, atom/movable/AM) + SIGNAL_HANDLER + if(isitem(AM)) var/obj/item/I = AM if(I.item_flags & ABSTRACT) return - else if(istype(AM, /obj/item/projectile)) - var/obj/item/projectile/P = AM - if(P.original != parent) - return + if(AM.movement_type & (FLYING|FLOATING) || !AM.has_gravity()) + return var/atom/current_parent = parent if(isturf(current_parent.loc)) if(do_play_squeak()) SEND_SIGNAL(AM, COMSIG_CROSS_SQUEAKED) /datum/component/squeak/proc/use_squeak() + SIGNAL_HANDLER + if(last_use + use_delay < world.time) last_use = world.time play_squeak() @@ -103,6 +136,8 @@ RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change) /datum/component/squeak/proc/holder_dir_change(datum/source, old_dir, new_dir) + SIGNAL_HANDLER + //If the dir changes it means we're going through a bend in the pipes, let's pretend we bumped the wall if(old_dir != new_dir) play_squeak() diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index d919828e8e..8014cf17c2 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -16,6 +16,32 @@ to_chat(M, "[parent] only accepts machine parts!") return FALSE +/datum/component/storage/concrete/rped/quick_empty(mob/M) + var/atom/A = parent + if(!M.canUseStorage() || !A.Adjacent(M) || M.incapacitated()) + return + if(check_locked(null, M, TRUE)) + return FALSE + A.add_fingerprint(M) + var/list/things = contents() + var/lowest_rating = INFINITY + for(var/obj/item/B in things) + if(B.get_part_rating() < lowest_rating) + lowest_rating = B.get_part_rating() + for(var/obj/item/B in things) + if(B.get_part_rating() > lowest_rating) + things.Remove(B) + if(lowest_rating == INFINITY) + to_chat(M, "There's no parts to dump out from [parent].") + return + to_chat(M, "You start dumping out tier/cell rating [lowest_rating] parts from [parent].") + var/turf/T = get_turf(A) + var/datum/progressbar/progress = new(M, length(things), T) + while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress))) + stoplag(1) + qdel(progress) + A.do_squish(0.8, 1.2) + /datum/component/storage/concrete/bluespace/rped collection_mode = COLLECT_EVERYTHING allow_quick_gather = TRUE @@ -33,5 +59,29 @@ to_chat(M, "[parent] only accepts machine parts!") return FALSE -/datum/component/storage/concrete/cyborg/rped - max_items = 150 + +/datum/component/storage/concrete/bluespace/rped/quick_empty(mob/M) + var/atom/A = parent + if(!M.canUseStorage() || !A.Adjacent(M) || M.incapacitated()) + return + if(check_locked(null, M, TRUE)) + return FALSE + A.add_fingerprint(M) + var/list/things = contents() + var/lowest_rating = INFINITY + for(var/obj/item/B in things) + if(B.get_part_rating() < lowest_rating) + lowest_rating = B.get_part_rating() + for(var/obj/item/B in things) + if(B.get_part_rating() > lowest_rating) + things.Remove(B) + if(lowest_rating == INFINITY) + to_chat(M, "There's no parts to dump out from [parent].") + return + to_chat(M, "You start dumping out tier/cell rating [lowest_rating] parts from [parent].") + var/turf/T = get_turf(A) + var/datum/progressbar/progress = new(M, length(things), T) + while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress))) + stoplag(1) + qdel(progress) + A.do_squish(0.8, 1.2) diff --git a/code/datums/components/storage/concrete/tcg.dm b/code/datums/components/storage/concrete/tcg.dm new file mode 100644 index 0000000000..a9d8012a4b --- /dev/null +++ b/code/datums/components/storage/concrete/tcg.dm @@ -0,0 +1,49 @@ +/** + *A storage component to be used on card piles, for use as hands/decks/discard piles. Don't use on something that's not a card pile! + */ +/datum/component/storage/concrete/tcg + display_numerical_stacking = FALSE + max_w_class = WEIGHT_CLASS_TINY + max_items = 30 + max_combined_w_class = WEIGHT_CLASS_TINY * 30 + ///The deck that the card pile is using for FAIR PLAY. + +/datum/component/storage/concrete/tcg/can_be_inserted(obj/item/I, stop_messages, mob/M) + . = ..() + return istype(I, /obj/item/tcg_card) + +/datum/component/storage/concrete/tcg/PostTransfer() + . = ..() + handle_empty_deck() + +/datum/component/storage/concrete/tcg/remove_from_storage(atom/movable/AM, atom/new_location) + . = ..() + handle_empty_deck() + +/datum/component/storage/concrete/tcg/ui_show(mob/M) + . = ..() + M.visible_message("[M] starts to look through the contents of \the [parent]!", \ + "You begin looking into the contents of \the [parent]!") + +/datum/component/storage/concrete/tcg/close(mob/M) + . = ..() + var/list/card_contents = contents() + var/obj/temp_parent = parent + temp_parent.visible_message("\the [parent] is shuffled after looking through it.") + card_contents = shuffle(card_contents) + +/datum/component/storage/concrete/tcg/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress, trigger_on_found) + . = ..() + if(!things.len) + qdel(parent) + +/datum/component/storage/concrete/tcg/proc/handle_empty_deck() + var/list/contents = contents() + //You can't have a deck of one card! + if(contents.len == 1) + var/obj/item/tcgcard_deck/deck = parent + var/obj/item/tcg_card/card = contents[1] + remove_from_storage(card, card.drop_location()) + card.flipped = deck.flipped + card.update_icon_state() + qdel(parent) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index f93d40bb04..2fa5a20d7a 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -449,6 +449,10 @@ // this must come before the screen objects only block, dunno why it wasn't before if(over_object == M) user_show_to_mob(M) + return + if(isrevenant(M)) + RevenantThrow(over_object, M, source) + return if(!M.incapacitated()) if(!istype(over_object, /obj/screen)) dump_content_at(over_object, M) diff --git a/code/datums/components/summoning.dm b/code/datums/components/summoning.dm index 1d66cf9307..ffb4309c1c 100644 --- a/code/datums/components/summoning.dm +++ b/code/datums/components/summoning.dm @@ -68,4 +68,4 @@ spawn_location.visible_message("[L] [spawn_text].") /datum/component/summoning/proc/on_spawned_death(mob/killed, gibbed) - spawned_mobs -= killed \ No newline at end of file + spawned_mobs -= killed diff --git a/code/datums/components/swarming.dm b/code/datums/components/swarming.dm index e840788766..76179a82e8 100644 --- a/code/datums/components/swarming.dm +++ b/code/datums/components/swarming.dm @@ -52,4 +52,4 @@ var/atom/movable/owner = parent if(is_swarming) animate(owner, pixel_x = owner.pixel_x - offset_x, pixel_y = owner.pixel_y - offset_y, time = 2) - is_swarming = FALSE \ No newline at end of file + is_swarming = FALSE diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index a5f9271f4b..10ff5bda3d 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -85,10 +85,19 @@ to_chat(user, "You're not ready to tackle!") return + if(!user.mob_has_gravity() ||!user.loc.has_gravity() || isspaceturf(user.loc)) + to_chat(user, "You can't find your footing without gravity!") + return + if(user.has_status_effect(STATUS_EFFECT_TASED)) // can't tackle if you just got tased to_chat(user, "You can't tackle while tased!") return + var/left_paralysis = HAS_TRAIT(user, TRAIT_PARALYSIS_L_ARM) + var/right_paralysis = HAS_TRAIT(user, TRAIT_PARALYSIS_R_ARM) + if(left_paralysis && right_paralysis) + to_chat(user, "You can't tackle without the use of your arms!") + user.face_atom(A) var/list/modifiers = params2list(params) @@ -280,6 +289,10 @@ attack_mod -= 2 if(HAS_TRAIT(sacker, TRAIT_GIANT)) attack_mod += 2 + var/left_paralysis = HAS_TRAIT(sacker, TRAIT_PARALYSIS_L_ARM) + var/right_paralysis = HAS_TRAIT(sacker, TRAIT_PARALYSIS_R_ARM) + if(left_paralysis || right_paralysis) + attack_mod -= 2 if(ishuman(target)) var/mob/living/carbon/human/S = sacker diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 53323f1e3f..251272ac2e 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -78,4 +78,4 @@ /datum/component/thermite/proc/attackby_react(datum/source, obj/item/thing, mob/user, params) if(thing.get_temperature()) - thermite_melt(user) \ No newline at end of file + thermite_melt(user) diff --git a/code/datums/components/twitch_plays.dm b/code/datums/components/twitch_plays.dm new file mode 100644 index 0000000000..aadbd58b4b --- /dev/null +++ b/code/datums/components/twitch_plays.dm @@ -0,0 +1,104 @@ +/** + * Observers voting on things through orbiting + */ +/datum/component/twitch_plays + /// Observers + var/list/mob/players = list() + +/datum/component/twitch_plays/Initialize(...) + . = ..() + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_ATOM_ORBIT_BEGIN, .proc/on_start_orbit) + RegisterSignal(parent, COMSIG_ATOM_ORBIT_END, .proc/on_end_orbit) + +/datum/component/twitch_plays/Destroy(force, silent) + for(var/i in players) + DetachPlayer(i) + return ..() + +/datum/component/twitch_plays/proc/on_start_orbit(datum/source, atom/movable/orbiter) + if(!isobserver(orbiter)) + return + AttachPlayer(orbiter) + +/datum/component/twitch_plays/proc/on_end_orbit(datum/source, atom/movable/orbiter) + if(!(orbiter in players)) + return + DetachPlayer(orbiter) + +/datum/component/twitch_plays/proc/AttachPlayer(mob/dead/observer) + players |= observer + RegisterSignal(observer, COMSIG_PARENT_QDELETING, .proc/on_end_orbit) + +/datum/component/twitch_plays/proc/DetachPlayer(mob/dead/observer) + players -= observer + UnregisterSignal(observer, COMSIG_PARENT_QDELETING) + +/// Simple movement one +/datum/component/twitch_plays/simple_movement + /// Movement votes by observer + var/list/votes = list() + /// Allow diagonals + var/allow_diagonal = FALSE + +/datum/component/twitch_plays/simple_movement/Initialize(...) + . = ..() + if(. & COMPONENT_INCOMPATIBLE) + return + RegisterSignal(parent, COMSIG_TWITCH_PLAYS_MOVEMENT_DATA, .proc/fetch_data) + +/datum/component/twitch_plays/simple_movement/AttachPlayer(mob/dead/observer) + . = ..() + RegisterSignal(observer, COMSIG_MOVABLE_PRE_MOVE, .proc/pre_move) + +/datum/component/twitch_plays/simple_movement/DetachPlayer(mob/dead/observer) + . = ..() + UnregisterSignal(observer, COMSIG_MOVABLE_PRE_MOVE) + +/datum/component/twitch_plays/simple_movement/proc/pre_move(datum/source, turf/newLoc) + if(get_dist(newLoc, parent) > 1) // they're trying to escape orbit + return + . = COMPONENT_MOVABLE_BLOCK_PRE_MOVE + var/dir = get_dir(parent, newLoc) + if(!dir) + return + if(allow_diagonal || !((dir - 1) & dir)) + votes[source] = dir + else // pick one or the other + votes[source] = prob(50)? (dir & ~(dir - 1)) : (dir & (dir - 1)) + +/datum/component/twitch_plays/simple_movement/proc/fetch_data(datum/source, wipe_votes) + if(!votes.len) + return + var/list/total = list(TEXT_NORTH, TEXT_SOUTH, TEXT_EAST, TEXT_WEST) + for(var/i in votes) + total[num2text(votes[i])] += 1 + . = text2num(pickweight(total, 0)) + if(wipe_votes) + votes.len = 0 + +/datum/component/twitch_plays/simple_movement/auto + var/move_delay = 2 + var/last_move = 0 + +/datum/component/twitch_plays/simple_movement/auto/Initialize(...) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + . = ..() + if(. & COMPONENT_INCOMPATIBLE) + return + START_PROCESSING(SSfastprocess, src) + +/datum/component/twitch_plays/simple_movement/auto/Destroy(force, silent) + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/datum/component/twitch_plays/simple_movement/auto/process() + var/dir = fetch_data(null, TRUE) + if(!dir) + return + if(world.time < (last_move + move_delay)) + return + last_move = world.time + step(parent, dir) diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index 80570d0c3b..db5fa677f2 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -46,4 +46,4 @@ holder.update_action_buttons_icon() if(recharge_sound) playsound(dashing_item, recharge_sound, 50, 1) - to_chat(holder, "[src] now has [current_charges]/[max_charges] charges.") \ No newline at end of file + to_chat(holder, "[src] now has [current_charges]/[max_charges] charges.") diff --git a/code/datums/datum.dm b/code/datums/datum.dm index d11532a883..42580425ce 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -77,21 +77,21 @@ /** - * Default implementation of clean-up code. - * - * This should be overridden to remove all references pointing to the object being destroyed, if - * you do override it, make sure to call the parent and return it's return value by default - * - * Return an appropriate [QDEL_HINT][QDEL_HINT_QUEUE] to modify handling of your deletion; - * in most cases this is [QDEL_HINT_QUEUE]. - * - * The base case is responsible for doing the following - * * Erasing timers pointing to this datum - * * Erasing compenents on this datum - * * Notifying datums listening to signals from this datum that we are going away - * - * Returns [QDEL_HINT_QUEUE] - */ + * Default implementation of clean-up code. + * + * This should be overridden to remove all references pointing to the object being destroyed, if + * you do override it, make sure to call the parent and return it's return value by default + * + * Return an appropriate [QDEL_HINT][QDEL_HINT_QUEUE] to modify handling of your deletion; + * in most cases this is [QDEL_HINT_QUEUE]. + * + * The base case is responsible for doing the following + * * Erasing timers pointing to this datum + * * Erasing compenents on this datum + * * Notifying datums listening to signals from this datum that we are going away + * + * Returns [QDEL_HINT_QUEUE] + */ /datum/proc/Destroy(force=FALSE, ...) SHOULD_CALL_PARENT(TRUE) tag = null @@ -138,8 +138,6 @@ UnregisterSignal(target, signal_procs[target]) //END: ECS SHIT - SSsounds.free_datum_channels(src) //?? (not on tg) - return QDEL_HINT_QUEUE #ifdef DATUMVAR_DEBUGGING_MODE diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index a91549ab4c..0bb803ddb3 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -4,7 +4,7 @@ /datum/proc/can_vv_get(var_name) return TRUE -/datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited +/datum/proc/vv_edit_var(var_name, var_value, massedit) //called whenever a var is edited if(var_name == NAMEOF(src, vars)) return FALSE vars[var_name] = var_value diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 216d82b4c8..b4e53a7425 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -151,4 +151,4 @@ flags_1 |= SHOCKED_1 /mob/living/proc/reset_shocked() - flags_1 &= ~ SHOCKED_1 \ No newline at end of file + flags_1 &= ~ SHOCKED_1 diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index b12b657101..32e4b3807c 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -39,4 +39,4 @@ symptoms += S name = "Sample #[rand(1,10000)]" - ..() \ No newline at end of file + ..() diff --git a/code/datums/diseases/advance/symptoms/disfiguration.dm b/code/datums/diseases/advance/symptoms/disfiguration.dm index 4a4b704dc0..cdfc6370be 100644 --- a/code/datums/diseases/advance/symptoms/disfiguration.dm +++ b/code/datums/diseases/advance/symptoms/disfiguration.dm @@ -47,4 +47,4 @@ BONUS if(!.) return if(A.affected_mob) - REMOVE_TRAIT(A.affected_mob, TRAIT_DISFIGURED, DISEASE_TRAIT) \ No newline at end of file + REMOVE_TRAIT(A.affected_mob, TRAIT_DISFIGURED, DISEASE_TRAIT) diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm index be444e3916..d4fbbe9aca 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -52,4 +52,4 @@ Bonus to_chat(M, "A wave of dizziness washes over you!") M.Dizzy(5) if(power >= 2) - M.set_drugginess(5) \ No newline at end of file + M.set_drugginess(5) diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 0fad819e8e..b5b55c1e14 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -31,9 +31,8 @@ Bonus var/bleed = FALSE var/pain = FALSE threshold_desc = list( - "Resistance 9" = "Doubles the intensity of the immolation effect, but reduces the frequency of all of this symptom's effects.", - "Stage Speed 8" = "Increases explosion radius and explosion damage to the host when the host is wet.", - "Transmission 8" = "Additionally synthesizes chlorine trifluoride and napalm inside the host. More chemicals are synthesized if the resistance 9 threshold has been met." + "Resistance 7" = "Erodes the host's skin, causing them to bleed profusely.", + "Transmission 8" = "Eat's away at the host's musclemass, causing increased fatigue." ) /datum/symptom/flesh_eating/Start(datum/disease/advance/A) @@ -134,4 +133,4 @@ Bonus M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2)) if(zombie) M.reagents.add_reagent(/datum/reagent/romerol, 1) - return 1 \ No newline at end of file + return 1 diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index 944333d9cf..88ea57296d 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -59,4 +59,4 @@ BONUS M.adjustStaminaLoss(25) if(power >= 3 && A.stage >= 5) to_chat(M, "[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]") - M.Stun(35) \ No newline at end of file + M.Stun(35) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 2fc853500d..c19f23ed2a 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -263,18 +263,18 @@ /datum/symptom/heal/coma/CanHeal(datum/disease/advance/A) var/mob/living/M = A.affected_mob + if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma) + to_chat(M, "You feel yourself slip into a regenerative coma...") + active_coma = TRUE + addtimer(CALLBACK(src, .proc/coma, M), 60) if(HAS_TRAIT(M, TRAIT_DEATHCOMA)) return power - else if(M.IsUnconscious() || M.stat == UNCONSCIOUS) - return power * 0.9 else if(M.stat == SOFT_CRIT) return power * 0.5 else if(M.IsSleeping()) return power * 0.25 - else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma) - to_chat(M, "You feel yourself slip into a regenerative coma...") - active_coma = TRUE - addtimer(CALLBACK(src, .proc/coma, M), 60) + else if(M.IsUnconscious() || M.stat == UNCONSCIOUS) + return power * 0.9 /datum/symptom/heal/coma/proc/coma(mob/living/M) if(deathgasp) diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index c0c312cbc2..a68513685d 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -49,8 +49,8 @@ BONUS var/mob/living/carbon/M = A.affected_mob var/picked_bodypart = pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) var/obj/item/bodypart/bodypart = M.get_bodypart(picked_bodypart) - if(bodypart && bodypart.status == BODYPART_ORGANIC && !bodypart.is_pseudopart) //robotic limbs will mean less scratching overall + if(bodypart && bodypart.is_organic_limb() && !bodypart.is_pseudopart) //robotic limbs will mean less scratching overall var/can_scratch = scratch && !M.incapacitated() && get_location_accessible(M, picked_bodypart) M.visible_message("[can_scratch ? "[M] scratches [M.p_their()] [bodypart.name]." : ""]", "Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]") if(can_scratch) - bodypart.receive_damage(0.5) \ No newline at end of file + bodypart.receive_damage(0.5) diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 3821c0585e..24e01dbbaf 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -67,4 +67,4 @@ Bonus if(!..()) return if(A.stage >= 4) - REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT) \ No newline at end of file + REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT) diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm index e35fe741fd..d7a457aec1 100644 --- a/code/datums/diseases/advance/symptoms/skin.dm +++ b/code/datums/diseases/advance/symptoms/skin.dm @@ -38,4 +38,4 @@ BONUS M.reagents.add_reagent(color, 5) else if (prob(50)) // spam - M.visible_message("[M] looks rather vibrant...", "The colors, man, the colors...") \ No newline at end of file + M.visible_message("[M] looks rather vibrant...", "The colors, man, the colors...") diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 439f391fe4..765abaaec5 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -51,4 +51,4 @@ Bonus else M.emote("sneeze") if(M.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth - A.spread(4 + power) \ No newline at end of file + A.spread(4 + power) diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index a6ea7de5a0..b3f2de8b11 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -79,4 +79,4 @@ return /datum/symptom/proc/OnRemove(datum/disease/advance/A) //But dont forget to remove them too. - return \ No newline at end of file + return diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index bb0d9bdcf9..06e1107316 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -50,4 +50,4 @@ Bonus else to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") M.overeatduration = max(M.overeatduration - 100, 0) - M.adjust_nutrition(-100) \ No newline at end of file + M.adjust_nutrition(-100) diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/advance/symptoms/youth.dm index d2712a0146..a9f5261905 100644 --- a/code/datums/diseases/advance/symptoms/youth.dm +++ b/code/datums/diseases/advance/symptoms/youth.dm @@ -55,4 +55,4 @@ BONUS if(5) if(H.age > 21) H.age = 21 - to_chat(H, "You feel like you can take on the world!") \ No newline at end of file + to_chat(H, "You feel like you can take on the world!") diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 20ecceb224..cf810b9fdb 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -38,4 +38,4 @@ "You cough up butterflies!") new /mob/living/simple_animal/butterfly(affected_mob.loc) new /mob/living/simple_animal/butterfly(affected_mob.loc) - return \ No newline at end of file + return diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index ccae692b4b..53230711d9 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -36,4 +36,4 @@ affected_mob.visible_message("[affected_mob] coughs up a swarm of bees!", \ "You cough up a swarm of bees!") new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) - return \ No newline at end of file + return diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 660793ed83..649ecc537c 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -50,4 +50,4 @@ if(!affected_mob.disease_resistances.Find(/datum/disease/flu)) var/datum/disease/Flu = new /datum/disease/flu() affected_mob.ForceContractDisease(Flu, FALSE, TRUE) - cure() \ No newline at end of file + cure() diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index 47f391ecf7..58ed52e8b6 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -36,4 +36,4 @@ if(prob(1)) to_chat(affected_mob, "Your throat feels sore.") if(prob(10)) - to_chat(affected_mob, "You feel stiff.") \ No newline at end of file + to_chat(affected_mob, "You feel stiff.") diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index 5eda0e928f..952ce4f18d 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -37,7 +37,7 @@ to_chat(H, "You feel [pick("full", "nauseated", "sweaty", "weak", "tired", "short on breath", "uneasy")].") if(3 to 4) if(!sound) - H.playsound_local(H, 'sound/health/slowbeat.ogg',40,0, channel = CHANNEL_HEARTBEAT) + H.playsound_local(H, 'sound/health/slowbeat.ogg', 40, FALSE, channel = CHANNEL_HEARTBEAT) sound = TRUE if(prob(3)) to_chat(H, "You feel a sharp pain in your chest!") @@ -53,7 +53,7 @@ H.emote("cough") if(5) H.stop_sound_channel(CHANNEL_HEARTBEAT) - H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, 0) + H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, FALSE) if(H.stat == CONSCIOUS) H.visible_message("[H] clutches at [H.p_their()] chest as if [H.p_their()] heart is stopping!") H.adjustStaminaLoss(60) @@ -62,4 +62,4 @@ cure() else - cure() \ No newline at end of file + cure() diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index 0bfb918ba0..a355a4bc01 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -65,4 +65,4 @@ var/iter = rand(1,3) for(i=0,i 0) return - var/instability = -dna.stability + var/instability = - dna.stability dna.remove_all_mutations() dna.stability = 100 - if(prob(max(70-instability,0))) + if(prob(max(70 - instability,0))) switch(rand(0,3)) //not complete and utter death if(0) monkeyize() if(1) gain_trauma(/datum/brain_trauma/severe/paralysis) if(2) + unequip_everything() + drop_all_held_items() corgize() if(3) to_chat(src, "Oh, we actually feel quite alright!") else switch(rand(0,3)) if(0) + unequip_everything() + drop_all_held_items() gib() if(1) + unequip_everything() + drop_all_held_items() dust() - if(2) + unequip_everything() + drop_all_held_items() death() petrify(INFINITY) if(3) @@ -686,6 +696,8 @@ if(BP) BP.dismember() else + unequip_everything() + drop_all_held_items() gib() else set_species(/datum/species/dullahan) @@ -693,11 +705,19 @@ /datum/dna/proc/update_body_size(old_size) if(!holder || features["body_size"] == old_size) return + //new size detected holder.resize = features["body_size"] / old_size holder.update_transform() - var/danger = CONFIG_GET(number/threshold_body_size_slowdown) - if(features["body_size"] < danger) - var/slowdown = (1 - round(features["body_size"] / danger, 0.1)) * CONFIG_GET(number/body_size_slowdown_multiplier) - holder.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/small_stride, TRUE, slowdown) - else if(old_size < danger) - holder.remove_movespeed_modifier(/datum/movespeed_modifier/small_stride) + if(iscarbon(holder)) + var/mob/living/carbon/C = holder + var/penalty_threshold = CONFIG_GET(number/threshold_body_size_penalty) + if(features["body_size"] < penalty_threshold && old_size >= penalty_threshold) + C.maxHealth -= 10 //reduce the maxhealth + var/slowdown = (1 - round(features["body_size"] / penalty_threshold, 0.1)) * CONFIG_GET(number/body_size_slowdown_multiplier) + holder.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/small_stride, TRUE, slowdown) + else + if(old_size < penalty_threshold && features["body_size"] >= penalty_threshold) + C.maxHealth += 10 //give the maxhealth back + holder.remove_movespeed_modifier(/datum/movespeed_modifier/small_stride) //remove the slowdown + + diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm new file mode 100644 index 0000000000..4a498b2ed8 --- /dev/null +++ b/code/datums/elements/bed_tucking.dm @@ -0,0 +1,60 @@ +/// Tucking element, for things that can be tucked into bed. +/datum/element/bed_tuckable + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + /// our pixel_x offset - how much the item moves x when in bed (+x is closer to the pillow) + var/x_offset = 0 + /// our pixel_y offset - how much the item move y when in bed (-y is closer to the middle) + var/y_offset = 0 + /// our rotation degree - how much the item turns when in bed (+degrees turns it more parallel) + var/rotation_degree = 0 + +/datum/element/bed_tuckable/Attach(obj/target, x = 0, y = 0, rotation = 0) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + x_offset = x + y_offset = y + rotation_degree = rotation + RegisterSignal(target, COMSIG_ITEM_ATTACK_OBJ, .proc/tuck_into_bed) + +/datum/element/bed_tuckable/Detach(obj/target) + . = ..() + UnregisterSignal(target, list(COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_PICKUP)) + +/** + * Tuck our object into bed. + * + * tucked - the object being tucked + * target_bed - the bed we're tucking them into + * tucker - the guy doing the tucking + */ +/datum/element/bed_tuckable/proc/tuck_into_bed(obj/item/tucked, obj/structure/bed/target_bed, mob/living/tucker) + + + if(!istype(target_bed)) + return + + if(!tucker.transferItemToLoc(tucked, target_bed.drop_location())) + return + + to_chat(tucker, "You lay [tucked] out on [target_bed].") + tucked.pixel_x = x_offset + tucked.pixel_y = y_offset + if(rotation_degree) + tucked.transform = turn(tucked.transform, rotation_degree) + RegisterSignal(tucked, COMSIG_ITEM_PICKUP, .proc/untuck) + + return COMPONENT_NO_AFTERATTACK + +/** + * If we rotate our object, then we need to un-rotate it when it's picked up + * + * tucked - the object that is tucked + */ +/datum/element/bed_tuckable/proc/untuck(obj/item/tucked) + + + tucked.transform = turn(tucked.transform, -rotation_degree) + UnregisterSignal(tucked, COMSIG_ITEM_PICKUP) diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index ae139104f0..6217665157 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -13,6 +13,8 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/save_key /// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\] var/examine_no_preview = FALSE + /// Examine FULLY views. Overrides examine_no_preview + var/examine_full_view = FALSE /datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE) . = ..() @@ -37,7 +39,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code if(can_edit && ismob(target)) //but only mobs receive the proc/verb for the time being var/mob/M = target LAZYOR(GLOB.mobs_with_editable_flavor_text[M], src) - M.verbs |= /mob/proc/manage_flavor_tests + add_verb(M, /mob/proc/manage_flavor_tests) if(save_key && ishuman(target)) RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text) @@ -71,6 +73,9 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code examine_list += "\[[flavor_name]\]" return var/msg = replacetext(text, "\n", " ") + if(examine_full_view) + examine_list += "[msg]" + return if(length_char(msg) <= 40) examine_list += "[msg]" else @@ -113,6 +118,21 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/datum/element/flavor_text/F = choices[chosen] F.set_flavor(src) +/mob/proc/set_pose() + set name = "Set Pose" + set desc = "Sets your temporary flavor text" + set category = "IC" + + var/list/L = GLOB.mobs_with_editable_flavor_text[src] + var/datum/element/flavor_text/carbon/temporary/T + for(var/i in L) + if(istype(i, /datum/element/flavor_text/carbon/temporary)) + T = i + if(!T) + to_chat(src, "Your mob type does not support temporary flavor text.") + return + T.set_flavor(src) + /datum/element/flavor_text/proc/set_flavor(mob/user) if(!(user in texts_by_atom)) return FALSE @@ -135,7 +155,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert, /datum/antagonist/nukeop, /datum/antagonist/wizard)) -/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key = "flavor_text", _examine_no_preview = FALSE) +/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE) if(!iscarbon(target)) return ELEMENT_INCOMPATIBLE . = ..() @@ -167,3 +187,19 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code texts_by_atom[user] = "" if(user.dna) user.dna.features[save_key] = "" + +/datum/element/flavor_text/carbon/temporary + examine_full_view = TRUE + max_len = 1024 + +/datum/element/flavor_text/carbon/temporary/Attach(datum/target, text, _name, _addendum, _max_len, _always_show, _edit, _save_key, _examine_no_preview) + . = ..() + if(. & ELEMENT_INCOMPATIBLE) + return + if(ismob(target)) + add_verb(target, /mob/proc/set_pose) + +/datum/element/flavor_Text/carbon/temporary/Detach(datum/source, force) + . = ..() + if(ismob(source)) + remove_verb(source, /mob/proc/set_pose) diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm index d770e0f30d..619f674969 100644 --- a/code/datums/elements/mob_holder.dm +++ b/code/datums/elements/mob_holder.dm @@ -141,7 +141,7 @@ /obj/item/clothing/head/mob_holder/dropped(mob/user) . = ..() - if(held_mob && isturf(loc))//don't release on soft-drops + if(held_mob && !ismob(loc))//don't release on soft-drops release() /obj/item/clothing/head/mob_holder/proc/release() diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 7ae0d04b05..5e888e0609 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -165,12 +165,21 @@ /datum/element/polychromic/proc/on_examine(atom/source, mob/user, list/examine_list) examine_list += "Alt-click to recolor it." +/datum/element/polychromic/proc/connect_helmet(atom/I, var/applycolor) + if(isitem(I)) + if(istype(I,/obj/item/clothing/suit/hooded)) + var/obj/item/clothing/suit/hooded/Isuit = I + colors_by_atom[Isuit.hood] = applycolor + else if(istype(I,/obj/item/clothing/suit/space/hardsuit)) + var/obj/item/clothing/suit/space/hardsuit/Isuit = I + colors_by_atom[Isuit.helmet] = applycolor + /datum/element/polychromic/proc/register_helmet(atom/source, obj/item/clothing/head/H) if(!isitem(H)) //backup in case if it messes up somehow if(istype(source,/obj/item/clothing/suit/hooded)) //so how come it be like this, where toggleable headslots are named separately (helmet/hood) anyways? var/obj/item/clothing/suit/hooded/sourcesuit = source H = sourcesuit.hood - else if(istype(source,/obj/item/clothing/suit/space/hardsuit)) + else if(istype(source,/obj/item/clothing/suit/space/hardsuit)) var/obj/item/clothing/suit/space/hardsuit/sourcesuit = source H = sourcesuit.helmet else diff --git a/code/datums/elements/update_icon_blocker.dm b/code/datums/elements/update_icon_blocker.dm index c30dc9efad..f52a712ebb 100644 --- a/code/datums/elements/update_icon_blocker.dm +++ b/code/datums/elements/update_icon_blocker.dm @@ -7,4 +7,4 @@ RegisterSignal(target, COMSIG_ATOM_UPDATE_ICON, .proc/block_update_icon) /datum/element/update_icon_blocker/proc/block_update_icon() - return COMSIG_ATOM_NO_UPDATE_ICON_STATE | COMSIG_ATOM_NO_UPDATE_OVERLAYS \ No newline at end of file + return COMSIG_ATOM_NO_UPDATE_ICON_STATE | COMSIG_ATOM_NO_UPDATE_OVERLAYS diff --git a/code/datums/elements/ventcrawling.dm b/code/datums/elements/ventcrawling.dm new file mode 100644 index 0000000000..254345a97f --- /dev/null +++ b/code/datums/elements/ventcrawling.dm @@ -0,0 +1,36 @@ +/datum/element/ventcrawling + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/tier + +/datum/element/ventcrawling/Attach(datum/target, duration = 0, given_tier = VENTCRAWLER_NUDE) + . = ..() + + var/mob/living/person = target + if(!istype(person)) + return FALSE + + src.tier = given_tier + + RegisterSignal(target, COMSIG_HANDLE_VENTCRAWL, .proc/handle_ventcrawl) + RegisterSignal(target, COMSIG_CHECK_VENTCRAWL, .proc/check_ventcrawl) + to_chat(target, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.") + + if(duration!=0) + addtimer(CALLBACK(src, .proc/Detach, target), duration) + +/datum/element/ventcrawling/Detach(datum/target) + UnregisterSignal(target, list(COMSIG_HANDLE_VENTCRAWL, COMSIG_CHECK_VENTCRAWL)) + to_chat(target, "You can no longer ventcrawl.") + + return ..() + +/datum/element/ventcrawling/proc/handle_ventcrawl(datum/target,atom/A) + var/mob/living/person = target + if(!istype(person)) + return FALSE + + person.handle_ventcrawl(A,tier) + +/datum/element/ventcrawling/proc/check_ventcrawl() + return tier diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index e1147df225..5683367c55 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -55,7 +55,7 @@ return user.log_message(msg, LOG_EMOTE) - msg = "[user] " + msg + msg = "[user] [msg]" for(var/mob/M in GLOB.dead_mob_list) if(!M.client || isnewplayer(M)) @@ -66,8 +66,12 @@ if(emote_type == EMOTE_AUDIBLE) user.audible_message(msg) - else + else if(emote_type == EMOTE_VISIBLE) user.visible_message(msg) + else if(emote_type == EMOTE_BOTH) + user.visible_message(msg, blind_message = msg) + else if(emote_type == EMOTE_OMNI) + user.visible_message(msg, omni = TRUE) /datum/emote/proc/replace_pronoun(mob/user, message) if(findtext(message, "their")) @@ -140,7 +144,7 @@ var/sound //Sound to play when emote is called var/vary = FALSE //used for the honk borg emote var/volume = 50 - mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon) + mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon, /mob/camera/aiEye) /datum/emote/sound/run_emote(mob/user, params) . = ..() diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index 246226ceba..9a29158b33 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -33,6 +33,14 @@ GLOBAL_LIST_EMPTY(explosions) EX_PREPROCESS_EXIT_CHECK\ } +#define CREAK_DELAY 5 SECONDS //Time taken for the creak to play after explosion, if applicable. +#define FAR_UPPER 60 //Upper limit for the far_volume, distance, clamped. +#define FAR_LOWER 40 //lower limit for the far_volume, distance, clamped. +#define PROB_SOUND 75 //The probability modifier for a sound to be an echo, or a far sound. (0-100) +#define SHAKE_CLAMP 2.5 //The limit for how much the camera can shake for out of view booms. +#define FREQ_UPPER 40 //The upper limit for the randomly selected frequency. +#define FREQ_LOWER 25 //The lower of the above. + /datum/explosion/New(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog, ignorecap, flame_range, silent, smoke) set waitfor = FALSE @@ -90,6 +98,8 @@ GLOBAL_LIST_EMPTY(explosions) message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [ADMIN_VERBOSEJMP(epicenter)]") log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [loc_name(epicenter)]") + deadchat_broadcast("An explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) has occured at ([get_area(epicenter)])", turf_target = get_turf(epicenter)) + var/x0 = epicenter.x var/y0 = epicenter.y var/z0 = epicenter.z @@ -113,13 +123,14 @@ GLOBAL_LIST_EMPTY(explosions) var/sound/creaking_explosion_sound = sound(get_sfx("explosion_creaking")) var/sound/hull_creaking_sound = sound(get_sfx("hull_creaking")) var/sound/explosion_echo_sound = sound('sound/effects/explosion_distant.ogg') - var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION) + var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION) var/creaking_explosion = FALSE if(prob(devastation_range*30+heavy_impact_range*5) && on_station) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might. creaking_explosion = TRUE // prob over 100 always returns true - for(var/mob/M in GLOB.player_list) + for(var/MN in GLOB.player_list) + var/mob/M = MN // Double check for client var/turf/M_turf = get_turf(M) if(M_turf && M_turf.z == z0) @@ -129,15 +140,15 @@ GLOBAL_LIST_EMPTY(explosions) baseshakeamount = sqrt((orig_max_distance - dist)*0.1) // If inside the blast radius + world.view - 2 if(dist <= round(max_range + world.view - 2, 1)) - M.playsound_local(epicenter, null, 100, 1, frequency, falloff = 5, S = explosion_sound) + M.playsound_local(epicenter, null, 100, 1, frequency, S = explosion_sound) if(baseshakeamount > 0) shake_camera(M, 25, clamp(baseshakeamount, 0, 10)) // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. else if(dist <= far_dist) - var/far_volume = clamp(far_dist/2, 40, 60) // Volume is based on explosion size and dist + var/far_volume = clamp(far_dist/2, FAR_LOWER, FAR_UPPER) // Volume is based on explosion size and dist if(creaking_explosion) M.playsound_local(epicenter, null, far_volume, 1, frequency, S = creaking_explosion_sound, distance_multiplier = 0) - else if(prob(75)) + else if(prob(PROB_SOUND)) // Sound variety during meteor storm/tesloose/other bad event M.playsound_local(epicenter, null, far_volume, 1, frequency, S = far_explosion_sound, distance_multiplier = 0) // Far sound else M.playsound_local(epicenter, null, far_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0) // Echo sound @@ -145,18 +156,18 @@ GLOBAL_LIST_EMPTY(explosions) if(baseshakeamount > 0 || devastation_range) if(!baseshakeamount) // Devastating explosions rock the station and ground baseshakeamount = devastation_range*3 - shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5)) - - else if(M.can_hear() && !isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull + shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, SHAKE_CLAMP)) + else if(!isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull var/echo_volume = 40 if(devastation_range) baseshakeamount = devastation_range - shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5)) + shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, SHAKE_CLAMP)) echo_volume = 60 M.playsound_local(epicenter, null, echo_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0) if(creaking_explosion) // 5 seconds after the bang, the station begins to creak - addtimer(CALLBACK(M, /mob/proc/playsound_local, epicenter, null, rand(25, 40), 1, frequency, null, null, FALSE, hull_creaking_sound, null, null, null, null, 0), 5 SECONDS) + addtimer(CALLBACK(M, /mob/proc/playsound_local, epicenter, null, rand(FREQ_LOWER, FREQ_UPPER), 1, frequency, null, null, FALSE, hull_creaking_sound, 0), CREAK_DELAY) + EX_PREPROCESS_CHECK_TICK //postpone processing for a bit @@ -228,8 +239,13 @@ GLOBAL_LIST_EMPTY(explosions) atoms += A for(var/i in atoms) var/atom/A = i - if(!QDELETED(A)) - A.ex_act(dist) + if(QDELETED(A)) + continue + A.ex_act(dist, null, src) + if(QDELETED(A) || !ismovable(A)) + continue + var/atom/movable/AM = A + LAZYADD(AM.acted_explosions, explosion_id) if(flame_dist && prob(40) && !isspaceturf(T) && !T.density) new /obj/effect/hotspot(T) //Mostly for ambience! @@ -314,6 +330,14 @@ GLOBAL_LIST_EMPTY(explosions) ++stopped qdel(src) +#undef CREAK_DELAY +#undef FAR_UPPER +#undef FAR_LOWER +#undef PROB_SOUND +#undef SHAKE_CLAMP +#undef FREQ_UPPER +#undef FREQ_LOWER + #undef EX_PREPROCESS_EXIT_CHECK #undef EX_PREPROCESS_CHECK_TICK diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 5e9371f754..79c12c7fea 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -85,6 +85,15 @@ var/mob/M = teleatom M.cancel_camera() + var/static/list/bread_cache = typecacheof(/obj/item/reagent_containers/food/snacks/store/bread) + var/list/breadlist = typecache_filter_list(teleatom.GetAllContents(), bread_cache) + if(breadlist.len && (channel == TELEPORT_CHANNEL_BLUESPACE || channel == TELEPORT_CHANNEL_QUANTUM)) + for(var/obj/item/reagent_containers/food/snacks/store/bread/bread in breadlist) + bread.bread_teleport() + else if(istype(teleatom, /obj/item/reagent_containers/food/snacks/store/bread)) + var/obj/item/reagent_containers/food/snacks/store/bread/bread = teleatom + bread.bread_teleport() + return TRUE /proc/tele_play_specials(atom/movable/teleatom, atom/location, datum/effect_system/effect, sound) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 4bf02e8587..c54f6c971a 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -237,7 +237,7 @@ /obj/item/disk/holodisk/Initialize(mapload) . = ..() if(preset_record_text) - build_record() + INVOKE_ASYNC(src, .proc/build_record) /obj/item/disk/holodisk/Destroy() QDEL_NULL(record) @@ -425,42 +425,42 @@ "} /obj/item/disk/holodisk/ruin/snowengieruin - name = "Blackbox Print-out #EB412" - desc = "A holodisk containing the last moments of EB412. There's a bloody fingerprint on it." - preset_image_type = /datum/preset_holoimage/engineer - preset_record_text = {" - NAME Dave Tundrale - SAY Maria, how's Build? - DELAY 10 - NAME Maria Dell - PRESET /datum/preset_holoimage/engineer/atmos - SAY It's fine, don't worry. I've got Plastic on it. And frankly, i'm kinda busy with, the, uhhm, incinerator. - DELAY 30 - NAME Dave Tundrale - PRESET /datum/preset_holoimage/engineer - SAY Aight, wonderful. The science mans been kinda shit though. No RCDs- - DELAY 20 - NAME Maria Dell - PRESET /datum/preset_holoimage/engineer/atmos - SAY Enough about your RCDs. They're not even that important, just bui- - DELAY 15 - SOUND explosion - DELAY 10 - SAY Oh, shit! - DELAY 10 - PRESET /datum/preset_holoimage/engineer/atmos/rig - LANGUAGE /datum/language/narsie - NAME Unknown - SAY RISE, MY LORD!! - DELAY 10 - LANGUAGE /datum/language/common - NAME Plastic - PRESET /datum/preset_holoimage/engineer/rig - SAY Fuck, fuck, fuck! - DELAY 20 - SAY It's loose! CALL THE FUCKING SHUTT- - DELAY 10 - PRESET /datum/preset_holoimage/corgi - NAME Blackbox Automated Message - SAY Connection lost. Dumping audio logs to disk. - DELAY 50"} + name = "Blackbox Print-out #EB412" + desc = "A holodisk containing the last moments of EB412. There's a bloody fingerprint on it." + preset_image_type = /datum/preset_holoimage/engineer + preset_record_text = {" + NAME Dave Tundrale + SAY Maria, how's Build? + DELAY 10 + NAME Maria Dell + PRESET /datum/preset_holoimage/engineer/atmos + SAY It's fine, don't worry. I've got Plastic on it. And frankly, i'm kinda busy with, the, uhhm, incinerator. + DELAY 30 + NAME Dave Tundrale + PRESET /datum/preset_holoimage/engineer + SAY Aight, wonderful. The science mans been kinda shit though. No RCDs- + DELAY 20 + NAME Maria Dell + PRESET /datum/preset_holoimage/engineer/atmos + SAY Enough about your RCDs. They're not even that important, just bui- + DELAY 15 + SOUND explosion + DELAY 10 + SAY Oh, shit! + DELAY 10 + PRESET /datum/preset_holoimage/engineer/atmos/rig + LANGUAGE /datum/language/narsie + NAME Unknown + SAY RISE, MY LORD!! + DELAY 10 + LANGUAGE /datum/language/common + NAME Plastic + PRESET /datum/preset_holoimage/engineer/rig + SAY Fuck, fuck, fuck! + DELAY 20 + SAY It's loose! CALL THE FUCKING SHUTT- + DELAY 10 + PRESET /datum/preset_holoimage/corgi + NAME Blackbox Automated Message + SAY Connection lost. Dumping audio logs to disk. + DELAY 50"} diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 8bee4f3d1c..6af3b3c993 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -18,8 +18,12 @@ var/list/atom/output_atoms var/mid_sounds var/mid_length + ///Override for volume of start sound + var/start_volume var/start_sound var/start_length + ///Override for volume of end sound + var/end_volume var/end_sound var/chance var/volume = 100 @@ -27,10 +31,9 @@ var/max_loops var/direct var/extra_range = 0 - var/falloff - + var/falloff_exponent var/timerid - var/init_timerid + var/falloff_distance /datum/looping_sound/New(list/_output_atoms=list(), start_immediately=FALSE, _direct=FALSE) if(!mid_sounds) @@ -51,16 +54,13 @@ /datum/looping_sound/proc/start(atom/add_thing) if(add_thing) output_atoms |= add_thing - if(timerid || init_timerid) + if(timerid) return on_start() /datum/looping_sound/proc/stop(atom/remove_thing) if(remove_thing) output_atoms -= remove_thing - if(init_timerid) - deltimer(init_timerid) - init_timerid = null if(!timerid) return on_stop() @@ -76,18 +76,18 @@ if(!timerid) timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP) -/datum/looping_sound/proc/play(soundfile) +/datum/looping_sound/proc/play(soundfile, volume_override) var/list/atoms_cache = output_atoms var/sound/S = sound(soundfile) if(direct) S.channel = SSsounds.random_available_channel() - S.volume = volume + S.volume = volume_override || volume //Use volume as fallback if theres no override for(var/i in 1 to atoms_cache.len) var/atom/thing = atoms_cache[i] if(direct) SEND_SOUND(thing, S) else - playsound(thing, S, volume, vary, extra_range, falloff) + playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance) /datum/looping_sound/proc/get_sound(starttime, _mid_sounds) . = _mid_sounds || mid_sounds @@ -97,10 +97,10 @@ /datum/looping_sound/proc/on_start() var/start_wait = 0 if(start_sound) - play(start_sound) + play(start_sound, start_volume) start_wait = start_length - init_timerid = addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME | TIMER_STOPPABLE) + addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME) /datum/looping_sound/proc/on_stop() if(end_sound) - play(end_sound) + play(end_sound, end_volume) diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index f9a9e07aed..f7a3b46118 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -4,7 +4,7 @@ mid_sounds = list('sound/machines/shower/shower_mid1.ogg'=1,'sound/machines/shower/shower_mid2.ogg'=1,'sound/machines/shower/shower_mid3.ogg'=1) mid_length = 10 end_sound = 'sound/machines/shower/shower_end.ogg' - volume = 10 + volume = 20 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -12,6 +12,28 @@ mid_sounds = list('sound/machines/sm/supermatter1.ogg'=1,'sound/machines/sm/supermatter2.ogg'=1,'sound/machines/sm/supermatter3.ogg'=1) mid_length = 10 volume = 1 + extra_range = 25 + falloff_exponent = 10 + falloff_distance = 5 + vary = TRUE + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/looping_sound/destabilized_crystal + mid_sounds = list('sound/machines/sm/loops/delamming.ogg' = 1) + mid_length = 60 + volume = 55 + extra_range = 15 + vary = TRUE + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// /datum/looping_sound/hypertorus +// mid_sounds = list('sound/machines/hypertorus/loops/hypertorus_nominal.ogg' = 1) +// mid_length = 60 +// volume = 55 +// extra_range = 15 +// vary = TRUE /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -32,7 +54,22 @@ mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1) mid_length = 2 end_sound = 'sound/machines/fryer/deep_fryer_emerge.ogg' - volume = 5 + volume = 15 + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +/datum/looping_sound/grill + mid_sounds = list('sound/machines/grill/grillsizzle.ogg' = 1) + mid_length = 18 + volume = 50 + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/looping_sound/deep_fryer + mid_length = 2 + mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1) + volume = 30 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -46,9 +83,39 @@ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/looping_sound/grill - mid_length = 2 - mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1) - volume = 10 +// /datum/looping_sound/jackpot +// mid_length = 11 +// mid_sounds = list('sound/machines/roulettejackpot.ogg') +// volume = 85 +// vary = TRUE -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +/* +/datum/looping_sound/server + mid_sounds = list('sound/machines/tcomms/tcomms_mid1.ogg'=1,'sound/machines/tcomms/tcomms_mid2.ogg'=1,'sound/machines/tcomms/tcomms_mid3.ogg'=1,'sound/machines/tcomms/tcomms_mid4.ogg'=1,\ + 'sound/machines/tcomms/tcomms_mid5.ogg'=1,'sound/machines/tcomms/tcomms_mid6.ogg'=1,'sound/machines/tcomms/tcomms_mid7.ogg'=1) + mid_length = 1.8 SECONDS + extra_range = -11 + falloff_distance = 1 + falloff_exponent = 5 + volume = 50 +*/ +// /datum/looping_sound/computer +// start_sound = 'sound/machines/computer/computer_start.ogg' +// start_length = 7.2 SECONDS +// start_volume = 10 +// mid_sounds = list('sound/machines/computer/computer_mid1.ogg'=1, 'sound/machines/computer/computer_mid2.ogg'=1) +// mid_length = 1.8 SECONDS +// end_sound = 'sound/machines/computer/computer_end.ogg' +// end_volume = 10 +// volume = 2 +// falloff_exponent = 5 //Ultra quiet very fast +// extra_range = -12 +// falloff_distance = 1 //Instant falloff after initial tile + +// /datum/looping_sound/gravgen +// mid_sounds = list('sound/machines/gravgen/gravgen_mid1.ogg'=1,'sound/machines/gravgen/gravgen_mid2.ogg'=1,'sound/machines/gravgen/gravgen_mid3.ogg'=1,'sound/machines/gravgen/gravgen_mid4.ogg'=1,) +// mid_length = 1.8 SECONDS +// extra_range = 10 +// volume = 70 +// falloff_distance = 5 +// falloff_exponent = 20 diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 06d07260ed..28ca852a43 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -66,4 +66,4 @@ if(atk_verb) log_combat(A, D, "[atk_verb] (Psychotic Brawling)") - return TRUE \ No newline at end of file + return TRUE diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 7d884344f1..5881c76827 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -7,6 +7,7 @@ id = MARTIALART_SLEEPINGCARP allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/sleeping_carp_help + block_parry_data = /datum/block_parry_data/sleeping_carp pugilist = TRUE /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -130,10 +131,32 @@ playsound(get_turf(A), pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) P.firer = A P.setAngle(rand(0, 360))//SHING - A.adjustStaminaLossBuffered (3) //Citadel change to stop infinite bullet sponging as you run away, but it is buffered! + A.adjustStaminaLoss(3) return BULLET_ACT_FORCE_PIERCE return BULLET_ACT_HIT +/datum/block_parry_data/sleeping_carp + parry_time_windup = 0 + parry_time_active = 25 + parry_time_spindown = 0 + // we want to signal to players the most dangerous phase, the time when automatic counterattack is a thing. + parry_time_windup_visual_override = 1 + parry_time_active_visual_override = 3 + parry_time_spindown_visual_override = 12 + parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK //can attack while + parry_time_perfect = 2.5 // first ds isn't perfect + parry_time_perfect_leeway = 1.5 + parry_imperfect_falloff_percent = 5 + parry_efficiency_to_counterattack = 100 + parry_efficiency_considered_successful = 65 // VERY generous + parry_efficiency_perfect = 100 + parry_failed_stagger_duration = 4 SECONDS + parry_cooldown = 0.5 SECONDS + +/mob/living/carbon/human/UseStaminaBuffer(amount, warn = FALSE, considered_action = TRUE) + amount *= physiology? physiology.stamina_buffer_mod : 1 + return ..() + /datum/martial_art/the_sleeping_carp/teach(mob/living/carbon/human/H, make_temporary = FALSE) . = ..() if(!.) @@ -144,12 +167,12 @@ ADD_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT) H.physiology.brute_mod *= 0.4 //brute is really not gonna cut it H.physiology.burn_mod *= 0.7 //burn is distinctly more useful against them than brute but they're still resistant - H.physiology.stamina_mod *= 0.5 //You take less stamina damage overall, but you do not reduce the damage from stun batons + H.physiology.stamina_mod *= 0.4 //You take less stamina damage overall, but you do not reduce the damage from stun batons as much H.physiology.stun_mod *= 0.3 //for those rare stuns H.physiology.pressure_mod *= 0.3 //go hang out with carp H.physiology.cold_mod *= 0.3 //cold mods are different to burn mods, they do stack however H.physiology.heat_mod *= 2 //this is mostly so sleeping carp has a viable weakness. Cooking them alive. Setting them on fire and heating them will be their biggest weakness. The reason for this is....filet jokes. - + H.physiology.stamina_buffer_mod *= 0.75 //to help with some stamina H.faction |= "carp" //:D /datum/martial_art/the_sleeping_carp/on_remove(mob/living/carbon/human/H) @@ -165,7 +188,7 @@ H.physiology.pressure_mod = initial(H.physiology.pressure_mod) //no more carpies H.physiology.cold_mod = initial(H.physiology.cold_mod) H.physiology.heat_mod = initial(H.physiology.heat_mod) - + H.physiology.stamina_buffer_mod = initial(H.physiology.stamina_buffer_mod) H.faction -= "carp" //:( /mob/living/carbon/human/proc/sleeping_carp_help() diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 1abe077980..90982a00ec 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -163,7 +163,7 @@ timeout = 3 MINUTES /datum/mood_event/gates_of_mansus - description = "LIVING IN A PERFORMANCE IS WORSE THAN DEATH\n" + description = "I HAD A GLIMPSE OF THE HORROR BEYOND THIS WORLD. REALITY UNCOILED BEFORE MY EYES!\n" mood_change = -25 timeout = 4 MINUTES diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index 3bddfdaa63..b72874c329 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -150,7 +150,6 @@ overlays_standing[CM.layer_used] = mut_overlay apply_overlay(CM.layer_used) - /datum/mutation/human/proc/modify() //called when a genome is applied so we can properly update some stats without having to remove and reapply the mutation from someone if(modified || !power || !owner) return diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index bd9ecaeeaa..c859d38587 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -342,8 +342,9 @@ to_chat(user, "You can't lay webs here!") failed = TRUE var/turf/T = get_turf(user) - var/obj/structure/spider/stickyweb/genetic/W = locate() in T - if(W) + var/obj/structure/spider/stickyweb/W = locate() in T + var/obj/structure/arachnid/W2 = locate() in T + if(W || W2) to_chat(user, "There's already a web here!") failed = TRUE if(failed) diff --git a/code/datums/mutations/radioactive.dm b/code/datums/mutations/radioactive.dm index df30aaa9d2..2e6aa50d46 100644 --- a/code/datums/mutations/radioactive.dm +++ b/code/datums/mutations/radioactive.dm @@ -16,4 +16,4 @@ visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "radiation", -MUTATIONS_LAYER)) /datum/mutation/human/radioactive/get_visual_indicator() - return visual_indicators[type][1] \ No newline at end of file + return visual_indicators[type][1] diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index fbc194cc6f..c2e0d3c9d2 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -64,4 +64,4 @@ qdel(bar) . = ..() -#undef PROGRESSBAR_HEIGHT \ No newline at end of file +#undef PROGRESSBAR_HEIGHT diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 933eaf082e..a08b535aff 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -114,14 +114,12 @@ description = "..." suffix = "lavaland_surface_sloth.dmm" // Generates nothing but atmos runtimes and salt - cost = 0 /datum/map_template/ruin/lavaland/ratvar name = "Dead God" id = "ratvar" - description = "Ratvars final resting place." + description = "Ratvar's final resting place." suffix = "lavaland_surface_dead_ratvar.dmm" - cost = 0 allow_duplicates = FALSE /datum/map_template/ruin/lavaland/hierophant @@ -137,7 +135,7 @@ id = "blooddrunk" description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them." suffix = "lavaland_surface_blooddrunk1.dmm" - cost = 0 + always_place = TRUE allow_duplicates = FALSE //will only spawn one variant of the ruin /datum/map_template/ruin/lavaland/blood_drunk_miner/guidance diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index d6b73f96ed..e2e6a05b08 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -409,6 +409,13 @@ return TRUE return FALSE +/datum/map_template/shuttle/emergency/cruise + suffix = "nature" + name = "Dynamic Environmental Interaction Shuttle" + description = "A large shuttle with a center biodome that is flourishing with life. Frolick with the monkeys! (Extra monkeys are stored on the bridge.)" + admin_notes = "Pretty freakin' large, almost as big as Raven or Cere. Excercise caution with it." + credit_cost = 8000 + /datum/map_template/shuttle/ferry/base suffix = "base" name = "transport ferry" diff --git a/code/datums/skills/_skill_modifier.dm b/code/datums/skills/_skill_modifier.dm index c38cbf23c6..fd8de29f28 100644 --- a/code/datums/skills/_skill_modifier.dm +++ b/code/datums/skills/_skill_modifier.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) if(!mod_L) mod_L = GLOB.potential_mods_per_skill[target_skills] = list() else - BINARY_INSERT(identifier, mod_L, datum/skill_modifier, src, priority, COMPARE_VALUE) + BINARY_INSERT(identifier, mod_L, /datum/skill_modifier, src, priority, COMPARE_VALUE) mod_L[identifier] = src GLOB.potential_skills_per_mod[target_skills_key] = list(target_skills) else //Should be a list. @@ -66,7 +66,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) if(!mod_L) mod_L = GLOB.potential_mods_per_skill[path] = list() else - BINARY_INSERT(identifier, mod_L, datum/skill_modifier, src, priority, COMPARE_VALUE) + BINARY_INSERT(identifier, mod_L, /datum/skill_modifier, src, priority, COMPARE_VALUE) mod_L[identifier] = src /datum/skill_modifier/Destroy() diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index ef3979d822..fb6b5c9a65 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -438,12 +438,19 @@ return else linked_alert.icon_state = "fleshmend" - owner.adjustBruteLoss(-10, FALSE) - owner.adjustFireLoss(-5, FALSE) owner.adjustOxyLoss(-10) if(!iscarbon(owner)) + owner.adjustBruteLoss(-10, FALSE) + owner.adjustFireLoss(-5, FALSE) return var/mob/living/carbon/C = owner + var/list/damaged_parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_HYBRID, BODYPART_NANITES)) + if(damaged_parts.len) + for(var/obj/item/bodypart/part in damaged_parts) + part.heal_damage(10/damaged_parts.len, 5/damaged_parts.len, only_organic = FALSE, updating_health = FALSE) + C.updatehealth() + C.update_damage_overlays() + QDEL_LIST(C.all_scars) /obj/screen/alert/status_effect/fleshmend @@ -566,13 +573,17 @@ duration = 1 MINUTES status_type = STATUS_EFFECT_REPLACE alert_type = /obj/screen/alert/status_effect/regenerative_core + var/heal_amount = 25 /datum/status_effect/regenerative_core/on_apply() . = ..() ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core") - owner.adjustBruteLoss(-25) + + if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM)) //Robots can heal from cores, but only get 1/5th of the healing. They can use this to get past the damage threshhold however, and then regularely heal from there. + heal_amount *= 0.2 + owner.adjustBruteLoss(-heal_amount, only_organic = FALSE) if(!AmBloodsucker(owner)) //use your coffin you lazy bastard - owner.adjustFireLoss(-25) + owner.adjustFireLoss(-heal_amount, only_organic = FALSE) owner.remove_CC() owner.bodytemperature = BODYTEMP_NORMAL return TRUE @@ -599,7 +610,7 @@ //Heal brain damage and toxyloss, alongside trauma owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -8) - owner.adjustToxLoss(-6, forced = TRUE) + owner.adjustToxLoss(-6, forced = TRUE, toxins_type = TOX_OMNI) M.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) //Purges 50 rads per tick if(owner.radiation > 0) @@ -640,3 +651,120 @@ if(D.severity == DISEASE_SEVERITY_POSITIVE) continue D.cure() + +/datum/status_effect/mantra // available to wizards and admins alone, currently + id = "Mantra" + examine_text = "Their aura is filled with yellow energy!" + alert_type = null + var/damageboost = 10 + var/woundboost = 5 + var/prev_hair_color + var/powerup + var/powerdown + +/datum/status_effect/mantra/on_apply() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/human/H = owner + playsound(H, 'sound/magic/powerup.ogg', 50, 1) + H.add_filter("mantra_glow", 2, list("type" = "outline", "color" = "#edfa347a", "size" = 2)) + prev_hair_color = H.hair_color + H.hair_color = "ffe11e" + H.update_hair() + ADD_TRAIT(H, TRAIT_PUGILIST, "Mantra") + ADD_TRAIT(H, TRAIT_NOSOFTCRIT, "Mantra") + ADD_TRAIT(H, TRAIT_STUNIMMUNE, "Mantra") + ADD_TRAIT(H, TRAIT_PUSHIMMUNE, "Mantra") + ADD_TRAIT(H, TRAIT_NOGUNS, "Mantra") + H.dna.species.punchdamagehigh += damageboost + H.dna.species.punchdamagelow += damageboost + H.dna.species.punchwoundbonus += woundboost + H.physiology.brute_mod *= 0.9 // slightly resilient against lethal damage, but... + H.physiology.burn_mod *= 0.9 + H.physiology.stamina_mod *= 0.5 // very resistant to non-lethal damage, because they're already draining stamina every second + to_chat(H, "Your inner mantra coalesces around you, granting you incredible strength and durability - but at what cost?") + +/datum/status_effect/mantra/tick() + . = ..() + if(owner.health < HEALTH_THRESHOLD_FULLCRIT) + owner.remove_status_effect(STATUS_EFFECT_MANTRA) + return + if(owner.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) + owner.remove_status_effect(STATUS_EFFECT_MANTRA) + return + if(iscarbon(owner)) + var/mob/living/carbon/human/C = owner + C.adjustBruteLoss(-1) // slightly resilient against lethal damage + C.adjustFireLoss(-1) + C.adjustStaminaLoss(3) // in testing i personally found that 2/sec was too minimal and 4/sec was too much + /*if(SEND_SIGNAL(owner, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) // turning on combat mode flares up your aura + + else*/ + +/datum/status_effect/mantra/on_remove() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/human/M = owner + playsound(M, 'sound/magic/powerdown.ogg', 50, 1) + M.remove_filter("mantra_glow") + M.hair_color = prev_hair_color + M.update_hair() + REMOVE_TRAIT(M, TRAIT_PUGILIST, "Mantra") + REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT, "Mantra") + REMOVE_TRAIT(M, TRAIT_STUNIMMUNE, "Mantra") + REMOVE_TRAIT(M, TRAIT_PUSHIMMUNE, "Mantra") + REMOVE_TRAIT(M, TRAIT_NOGUNS, "Mantra") + M.dna.species.punchdamagehigh -= damageboost + M.dna.species.punchdamagelow -= damageboost + M.dna.species.punchwoundbonus -= woundboost + M.physiology.brute_mod /= 0.9 + M.physiology.burn_mod /= 0.9 + M.physiology.stamina_mod /= 0.5 + to_chat(M, "Your inner mantra collapses, for now.") + +/datum/status_effect/asura // mfw miner gear + id = "Asura" + examine_text = "Their aura is filled with red-hot rage!" + alert_type = null + var/damageboost = 10 + var/woundboost = 5 + +/datum/status_effect/asura/on_apply() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/human/H = owner + playsound(H, 'sound/magic/powerup.ogg', 50, 1) + H.add_filter("asura_glow", 2, list("type" = "outline", "color" = "#fc21217a", "size" = 2)) + ADD_TRAIT(H, TRAIT_PUGILIST, "Asura") + H.dna.species.punchdamagehigh += damageboost + H.dna.species.punchdamagelow += damageboost + H.dna.species.punchwoundbonus += woundboost + to_chat(H, "Your anger unleashes in a crimson blaze around you and corrosive power fills your muscles.") + +/datum/status_effect/asura/tick() + . = ..() + if(owner.health < HEALTH_THRESHOLD_CRIT) + owner.remove_status_effect(STATUS_EFFECT_ASURA) + return + if(owner.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) + owner.remove_status_effect(STATUS_EFFECT_ASURA) + return + if(iscarbon(owner)) + var/mob/living/carbon/human/C = owner + C.adjustBruteLoss(1) // drains 1 hp per second. You're gonna need some Senzu Cores. + C.adjustStaminaLoss(-2) // angry man punch a lot + /*if(SEND_SIGNAL(owner, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) // turning on combat mode flares up your aura + + else*/ + +/datum/status_effect/asura/on_remove() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/human/M = owner + playsound(M, 'sound/magic/powerdown.ogg', 50, 1) + M.remove_filter("asura_glow") + REMOVE_TRAIT(M, TRAIT_PUGILIST, "Asura") + M.dna.species.punchdamagehigh -= damageboost + M.dna.species.punchdamagelow -= damageboost + M.dna.species.punchwoundbonus -= woundboost + to_chat(M, "You calm yourself, and your unnatural strength dissipates.") diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index d46694d89c..fe59bbe14a 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -586,7 +586,7 @@ var/list/mob/living/targets = list() for(var/mob/living/potential_target in oview(owner, 1)) - if(IS_HERETIC(potential_target) || potential_target.mind?.has_antag_datum(/datum/antagonist/heretic_monster)) + if(IS_HERETIC(potential_target) || IS_HERETIC_MONSTER(potential_target)) continue targets += potential_target if(LAZYLEN(targets)) @@ -887,7 +887,7 @@ L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) -datum/status_effect/pacify +/datum/status_effect/pacify id = "pacify" status_type = STATUS_EFFECT_REPLACE tick_interval = 1 @@ -1046,7 +1046,7 @@ datum/status_effect/pacify id = "fake_virus" duration = 1800//3 minutes status_type = STATUS_EFFECT_REPLACE - tick_interval = 1 + tick_interval = 20 alert_type = null var/msg_stage = 0//so you dont get the most intense messages immediately diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 461ae9c65d..9dbbc1c469 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -74,13 +74,19 @@ /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null SHOULD_CALL_PARENT(TRUE) - REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) - REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) + if(blocks_combatmode) + REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) + if(blocks_sprint) + REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) return TRUE /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) + if(blocks_combatmode) + REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) + if(blocks_sprint) + REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) owner = null qdel(src) @@ -278,7 +284,3 @@ /datum/status_effect/grouped/before_remove(source) sources -= source return !length(sources) - -//do_after modifier! -/datum/status_effect/proc/interact_speed_modifier() - return 1 diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 045b1b257d..2ead3e6e19 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -141,22 +141,23 @@ // bones /datum/status_effect/wound/blunt -/datum/status_effect/wound/blunt/interact_speed_modifier() - var/mob/living/carbon/C = owner +/datum/status_effect/wound/blunt/on_apply() + . = ..() + RegisterSignal(owner, COMSIG_MOB_SWAP_HANDS, .proc/on_swap_hands) + on_swap_hands() - if(C.get_active_hand() == linked_limb) - to_chat(C, "The [lowertext(linked_wound)] in your [linked_limb.name] slows your progress!") - return linked_wound.interaction_efficiency_penalty +/datum/status_effect/wound/blunt/on_remove() + . = ..() + UnregisterSignal(owner, COMSIG_MOB_SWAP_HANDS) + var/mob/living/carbon/wound_owner = owner + wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound) - return 1 - -/datum/status_effect/wound/blunt/action_cooldown_mod() - var/mob/living/carbon/C = owner - - if(C.get_active_hand() == linked_limb) - return linked_wound.interaction_efficiency_penalty - - return 1 +/datum/status_effect/wound/blunt/proc/on_swap_hands() + var/mob/living/carbon/wound_owner = owner + if(wound_owner.get_active_hand() == linked_limb) + wound_owner.add_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound, (linked_wound.interaction_efficiency_penalty - 1)) + else + wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound) /datum/status_effect/wound/blunt/moderate id = "disjoint" diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index c6466fdd96..22a851da1d 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -11,6 +11,8 @@ var/antag_removal_text // Text will be given to the quirk holder if they get an antag that has it blacklisted. var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled var/mob_trait //if applicable, apply and remove this mob trait + /// should we immediately call on_spawn or add a timer to trigger + var/on_spawn_immediate = TRUE var/mob/living/quirk_holder /datum/quirk/New(mob/living/quirk_mob, spawn_effects) @@ -26,7 +28,10 @@ START_PROCESSING(SSquirks, src) add() if(spawn_effects) - on_spawn() + if(on_spawn_immediate) + on_spawn() + else + addtimer(CALLBACK(src, .proc/on_spawn), 0) addtimer(CALLBACK(src, .proc/post_add), 30) /datum/quirk/Destroy() diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 23fd75f982..659149a123 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -219,3 +219,19 @@ /datum/quirk/night_vision/on_spawn() var/mob/living/carbon/human/H = quirk_holder H.update_sight() + +/datum/quirk/multilingual + name = "Multi-Lingual" + desc = "You spent a portion of your life learning to understand an additional language. You may or may not be able to speak it based on your anatomy." + value = 1 + mob_trait = TRAIT_MULTILINGUAL + gain_text = "You've learned an extra language!" + lose_text = "You've forgotten your extra language." + +/datum/quirk/multilingual/post_add() + var/mob/living/carbon/human/H = quirk_holder + H.grant_language(H.client.prefs.language, TRUE, TRUE, LANGUAGE_MULTILINGUAL) + +/datum/quirk/multilingual/remove() + var/mob/living/carbon/human/H = quirk_holder + H.remove_language(H.client.prefs.language, TRUE, TRUE, LANGUAGE_MULTILINGUAL) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 322fba0a33..cce138e82c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -44,42 +44,16 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/family_heirloom/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/heirloom_type - switch(quirk_holder.mind.assigned_role) - if("Clown") - heirloom_type = pick(/obj/item/paint/anycolor, /obj/item/bikehorn/golden) - if("Mime") - heirloom_type = pick(/obj/item/paint/anycolor, /obj/item/toy/dummy) - if("Cook") - heirloom_type = /obj/item/kitchen/knife/scimitar - if("Botanist") - heirloom_type = pick(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie) - if("Medical Doctor") - heirloom_type = /obj/item/healthanalyzer - if("Paramedic") - heirloom_type = /obj/item/lighter - if("Station Engineer") - heirloom_type = /obj/item/wirecutters/brass - if("Atmospheric Technician") - heirloom_type = /obj/item/extinguisher/mini/family - if("Lawyer") - heirloom_type = /obj/item/storage/briefcase/lawyer/family - if("Janitor") - heirloom_type = /obj/item/mop - if("Security Officer") - heirloom_type = /obj/item/clothing/accessory/medal/silver/valor - if("Scientist") - heirloom_type = /obj/item/toy/plush/slimeplushie - if("Assistant") - heirloom_type = /obj/item/clothing/gloves/cut/family - if("Chaplain") - heirloom_type = /obj/item/camera/spooky/family - if("Captain") - heirloom_type = /obj/item/clothing/accessory/medal/gold/captain/family + var/species_heirloom_entry = GLOB.species_heirlooms[H.dna.species.id] + if(species_heirloom_entry) + if(prob(species_heirloom_entry[1])) + heirloom_type = pick(species_heirloom_entry[2]) if(!heirloom_type) - heirloom_type = pick( - /obj/item/toy/cards/deck, - /obj/item/lighter, - /obj/item/dice/d20) + var/job_heirloom_entry = GLOB.job_heirlooms[quirk_holder.mind.assigned_role] + if(!job_heirloom_entry) + heirloom_type = pick(GLOB.job_heirlooms["NO_JOB"]) //consider: should this be a define? + else + heirloom_type = pick(job_heirloom_entry) heirloom = new heirloom_type(get_turf(quirk_holder)) GLOB.family_heirlooms += heirloom var/list/slots = list( @@ -163,12 +137,18 @@ GLOBAL_LIST_EMPTY(family_heirlooms) var/lums = T.get_lumcount() if(lums <= 0.2) if(quirk_holder.m_intent == MOVE_INTENT_RUN) - to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark...") - quirk_holder.toggle_move_intent() + addtimer(CALLBACK(src, .proc/recheck),2) //0.2 seconds of being in the dark SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia) else SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") +/datum/quirk/nyctophobia/proc/recheck() + var/turf/T = get_turf(quirk_holder) + var/lums = T.get_lumcount() + if(lums <= 0.2) //check again, did they remain in the dark for 0.2 seconds? + to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark...") + quirk_holder.toggle_move_intent() + /datum/quirk/lightless name = "Light Sensitivity" desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..." @@ -204,6 +184,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) gain_text = null // Handled by trauma. lose_text = null medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities." + on_spawn_immediate = FALSE /datum/quirk/paraplegic/add() var/datum/brain_trauma/severe/paralysis/paraplegic/T = new() diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index e92564a3b4..18d565ed5a 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -105,11 +105,27 @@ gain_text = "You desire to be hurt." lose_text = "Pain has become less exciting for you." +/datum/quirk/libido + name = "Nymphomaniac" + desc = "You are much more sensitive to arousal." + value = 0 + mob_trait = TRAIT_NYMPHO + gain_text = "You are feeling extra wild." + lose_text = "You don't feel that burning sensation anymore." + +/datum/quirk/libido/add() + var/mob/living/carbon/human/H = quirk_holder + H.arousal_rate = 3 * initial(H.arousal_rate) + +/datum/quirk/libido/remove() + var/mob/living/carbon/human/H = quirk_holder + H.arousal_rate = initial(H.arousal_rate) + /datum/quirk/alcohol_intolerance name = "Alcohol Intolerance" desc = "You take toxin damage from alcohol rather than getting drunk." value = 0 - mob_trait = TRAIT_NO_ALCOHOL + mob_trait = TRAIT_TOXIC_ALCOHOL medical_record_text = "Patient's body does not react properly to ethyl alcohol." /datum/quirk/alcohol_intolerance/add() diff --git a/code/datums/view.dm b/code/datums/view.dm new file mode 100644 index 0000000000..8eb06c2bd2 --- /dev/null +++ b/code/datums/view.dm @@ -0,0 +1,127 @@ +//This is intended to be a full wrapper. DO NOT directly modify its values +///Container for client viewsize +/datum/viewData + var/width = 0 + var/height = 0 + var/default = "" + var/is_suppressed = FALSE + var/client/chief = null + +/datum/viewData/New(client/owner, view_string) + default = view_string + chief = owner + apply() + +/datum/viewData/proc/setDefault(string) + default = string + apply() + +/datum/viewData/proc/safeApplyFormat() + if(isZooming()) + assertFormat() + return + resetFormat() + +/datum/viewData/proc/assertFormat()//T-Pose + // winset(chief, "mapwindow.map", "zoom=0") + // Citadel Edit - We're using icon dropdown instead + +/datum/viewData/proc/resetFormat()//Cuck + // winset(chief, "mapwindow.map", "zoom=[chief.prefs.pixel_size]") + // Citadel Edit - We're using icon dropdown instead + +/datum/viewData/proc/setZoomMode() + // winset(chief, "mapwindow.map", "zoom-mode=[chief.prefs.scaling_method]") + // Citadel Edit - We're using icon dropdown instead + +/datum/viewData/proc/isZooming() + return (width || height) + +/datum/viewData/proc/resetToDefault() + width = 0 + height = 0 + apply() + +/datum/viewData/proc/add(toAdd) + width += toAdd + height += toAdd + apply() + +/datum/viewData/proc/addTo(toAdd) + var/list/shitcode = getviewsize(toAdd) + width += shitcode[1] + height += shitcode[2] + apply() + +/datum/viewData/proc/setTo(toAdd) + var/list/shitcode = getviewsize(toAdd) //Backward compatability to account + width = shitcode[1] //for a change in how sizes get calculated. we used to include world.view in + height = shitcode[2] //this, but it was jank, so I had to move it + apply() + +/datum/viewData/proc/setBoth(wid, hei) + width = wid + height = hei + apply() + +/datum/viewData/proc/setWidth(wid) + width = wid + apply() + +/datum/viewData/proc/setHeight(hei) + width = hei + apply() + +/datum/viewData/proc/addToWidth(toAdd) + width += toAdd + apply() + +/datum/viewData/proc/addToHeight(screen, toAdd) + height += toAdd + apply() + +/datum/viewData/proc/apply() + chief.change_view(getView()) + safeApplyFormat() + if(chief.prefs.auto_fit_viewport) + chief.fit_viewport() + +/datum/viewData/proc/supress() + is_suppressed = TRUE + apply() + +/datum/viewData/proc/unsupress() + is_suppressed = FALSE + apply() + +/datum/viewData/proc/getView() + var/list/temp = getviewsize(default) + if(is_suppressed) + return "[temp[1]]x[temp[2]]" + return "[width + temp[1]]x[height + temp[2]]" + +/datum/viewData/proc/zoomIn() + resetToDefault() + animate(chief, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) + +/datum/viewData/proc/zoomOut(radius = 0, offset = 0, direction = FALSE) + if(direction) + var/_x = 0 + var/_y = 0 + switch(direction) + if(NORTH) + _y = offset + if(EAST) + _x = offset + if(SOUTH) + _y = -offset + if(WEST) + _x = -offset + animate(chief, pixel_x = world.icon_size*_x, pixel_y = world.icon_size*_y, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) + //Ready for this one? + setTo(radius) + +/proc/getScreenSize(widescreen) + if(widescreen) + return CONFIG_GET(string/default_view) + return CONFIG_GET(string/default_view_square) diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 43190ef50c..6248be0de5 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -95,8 +95,8 @@ if(is_ash_immune(L)) return if(is_species(L, /datum/species/lizard/ashwalker)) - if(!IS_STAMCRIT(L)) - L.adjustStaminaLossBuffered(4) + if(L.getStaminaLoss() < (STAMINA_CRIT - 40)) + L.adjustStaminaLoss(4) return L.adjustFireLoss(4) diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 68c475f67b..1c9c14ee3e 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -265,11 +265,10 @@ reveal_wires = TRUE // Same for anyone with an abductor multitool. - else if(user.is_holding_item_of_type(/obj/item/multitool/abductor)) - reveal_wires = TRUE - // and advanced multitool - else if(user.is_holding_item_of_type(/obj/item/multitool/advanced)) - reveal_wires = TRUE + else if(user.is_holding_tool_quality(TOOL_MULTITOOL)) + var/obj/item/tool = user.is_holding_tool_quality(TOOL_MULTITOOL) + if(tool.show_wires) + reveal_wires = TRUE // Station blueprints do that too, but only if the wires are not randomized. else if(user.is_holding_item_of_type(/obj/item/areaeditor/blueprints) && !randomize) diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm index dae92d3c42..376512a375 100644 --- a/code/datums/wires/airalarm.dm +++ b/code/datums/wires/airalarm.dm @@ -72,4 +72,4 @@ var/area/AA = get_base_area(A) if(AA.atmosalert(2, holder)) A.post_alert(2) - A.update_icon() \ No newline at end of file + A.update_icon() diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index 19b2b8dda8..d167a11fd3 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -55,4 +55,4 @@ if(mend) A.aidisabled = FALSE else - A.aidisabled = TRUE \ No newline at end of file + A.aidisabled = TRUE diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm index 25493f2e30..6e3c5318bf 100644 --- a/code/datums/wires/explosive.dm +++ b/code/datums/wires/explosive.dm @@ -79,4 +79,4 @@ /datum/wires/explosive/gibtonite/explode() var/obj/item/gibtonite/P = holder - P.GibtoniteReaction(null, 2) \ No newline at end of file + P.GibtoniteReaction(null, 2) diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 988487727b..90f229fc2c 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -29,4 +29,4 @@ if(WIRE_MOTOR1, WIRE_MOTOR2) holder.visible_message("[icon2html(M, viewers(holder))] The drive motor whines briefly.") else - holder.visible_message("[icon2html(M, viewers(holder))] You hear a radio crackle.") \ No newline at end of file + holder.visible_message("[icon2html(M, viewers(holder))] You hear a radio crackle.") diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm index b782e589dd..97f518e434 100644 --- a/code/datums/wires/particle_accelerator.dm +++ b/code/datums/wires/particle_accelerator.dm @@ -47,4 +47,4 @@ C.remove_strength() /datum/wires/particle_accelerator/control_box/emp_pulse() // to prevent singulo from pulsing wires - return \ No newline at end of file + return diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm index 6c7e59c24c..e8fb883ecd 100644 --- a/code/datums/wires/vending.dm +++ b/code/datums/wires/vending.dm @@ -57,4 +57,4 @@ if(WIRE_IDSCAN) V.scan_id = mend if(WIRE_SPEAKER) - V.shut_up = mend \ No newline at end of file + V.shut_up = mend diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 261e423640..7a1f0f6980 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -164,7 +164,7 @@ . = list() .["version"] = GLOB.game_version .["mode"] = "hidden" //CIT CHANGE - hides the gamemode in topic() calls to prevent meta'ing the gamemode - .["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE + .["respawn"] = config ? CONFIG_GET(flag/respawns_enabled) : FALSE .["enter"] = GLOB.enter_allowed .["vote"] = CONFIG_GET(flag/allow_vote_mode) .["ai"] = CONFIG_GET(flag/allow_ai) diff --git a/code/datums/wounds/_scars.dm b/code/datums/wounds/_scars.dm index 85589976e6..3365fc359d 100644 --- a/code/datums/wounds/_scars.dm +++ b/code/datums/wounds/_scars.dm @@ -79,7 +79,7 @@ /// Used to "load" a persistent scar /datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity=WOUND_SEVERITY_SEVERE) - if(!(BP.body_zone in applicable_zones) || !(BP.is_organic_limb() || BP.render_like_organic)) + if(!(BP.body_zone in applicable_zones) || !BP.is_organic_limb()) qdel(src) return @@ -149,4 +149,4 @@ /// Used to format a scar to safe in preferences for persistent scars /datum/scar/proc/format_amputated(body_zone) description = pick(list("is several skintone shades paler than the rest of the body", "is a gruesome patchwork of artificial flesh", "has a large series of attachment scars at the articulation points")) - return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]" \ No newline at end of file + return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]" diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 1ed0d98543..9c5a41de5d 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -91,8 +91,6 @@ var/wound_flags = (FLESH_WOUND | BONE_WOUND | ACCEPTS_GAUZE) /datum/wound/Destroy() - if(attached_surgery) - QDEL_NULL(attached_surgery) if(limb?.wounds && (src in limb.wounds)) // destroy can call remove_wound() and remove_wound() calls qdel, so we check to make sure there's anything to remove first remove_wound() limb = null @@ -110,7 +108,7 @@ * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) */ /datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE) - if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner) || !(L.is_organic_limb() || L.render_like_organic)) + if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner) || !L.is_organic_limb()) qdel(src) return @@ -136,6 +134,7 @@ if(status_effect_type) linked_status_effect = victim.apply_status_effect(status_effect_type, src) SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb) + victim.emote("pain") if(!victim.alerts["wound"]) // only one alert is shared between all of the wounds victim.throw_alert("wound", /obj/screen/alert/status_effect/wound) diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index d7c34da34a..a1746001b9 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -168,7 +168,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) return TRUE return FALSE -datum/atom_hud/alternate_appearance/basic/onePerson +/datum/atom_hud/alternate_appearance/basic/onePerson var/mob/seer /datum/atom_hud/alternate_appearance/basic/onePerson/mobShouldSee(mob/M) diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 5310b24202..b2673c960e 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -41,9 +41,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station power_environ = FALSE valid_territory = FALSE outdoors = TRUE + persistent_debris_allowed = FALSE ambientsounds = SPACE blob_allowed = FALSE //Eating up space doesn't count for victory as a blob. considered_hull_exterior = TRUE + sound_environment = SOUND_AREA_SPACE /area/space/nearstation icon_state = "space_near" @@ -69,6 +71,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station blob_allowed = FALSE //Nope, no winning on the asteroid as a blob. Gotta eat the station. valid_territory = FALSE ambientsounds = MINING + sound_environment = SOUND_AREA_ASTEROID /area/asteroid/nearstation dynamic_lighting = DYNAMIC_LIGHTING_FORCED @@ -106,7 +109,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/maintenance ambientsounds = MAINTENANCE valid_territory = FALSE - + sound_environment = SOUND_AREA_TUNNEL_ENCLOSED //Departments @@ -121,6 +124,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/maintenance/department/crew_quarters/bar name = "Bar Maintenance" icon_state = "maint_bar" + sound_environment = SOUND_AREA_WOODFLOOR /area/maintenance/department/crew_quarters/dorms name = "Dormitory Maintenance" @@ -264,6 +268,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/hallway nightshift_public_area = NIGHTSHIFT_AREA_PUBLIC + sound_environment = SOUND_AREA_STANDARD_STATION /area/hallway/primary/aft name = "Aft Primary Hallway" @@ -325,10 +330,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Service Hallway" icon_state = "hall_service" -/area/hallway/secondary/civilian - name = "Civilian Wing" - icon_state = "hallFS" - //Command @@ -336,30 +337,36 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Bridge" icon_state = "bridge" music = "signal" + sound_environment = SOUND_AREA_STANDARD_STATION /area/bridge/meeting_room name = "Heads of Staff Meeting Room" icon_state = "meeting" music = null + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/bridge/meeting_room/council name = "Council Chamber" icon_state = "meeting" music = null + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/bridge/showroom/corporate name = "Corporate Showroom" icon_state = "showroom" music = null + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/crew_quarters/heads/captain name = "Captain's Office" icon_state = "captain" clockwork_warp_allowed = FALSE + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/heads/captain/private name = "Captain's Quarters" icon_state = "captain" + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/heads/chief name = "Chief Engineer's Office" @@ -404,10 +411,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/comms name = "Communications Relay" icon_state = "tcomsatcham" + sound_environment = SOUND_AREA_STANDARD_STATION /area/server name = "Messaging Server Room" icon_state = "server" + sound_environment = SOUND_AREA_STANDARD_STATION //Crew @@ -416,6 +425,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "Sleep" safe = TRUE nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + sound_environment = SOUND_AREA_STANDARD_STATION /area/crew_quarters/dorms/male name = "Male Dorm" @@ -434,6 +444,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/toilet name = "Dormitory Toilets" icon_state = "toilet" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/crew_quarters/toilet/auxiliary name = "Auxiliary Restrooms" @@ -468,6 +479,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Lounge" icon_state = "yellow" nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/crew_quarters/arcade + name = "Arcade" + icon_state = "abandoned_g_den" + nightshift_public_area = NIGHTSHIFT_AREA_RECREATION /area/crew_quarters/fitness name = "Fitness Room" @@ -479,6 +496,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "fitness" nightshift_public_area = NIGHTSHIFT_AREA_RECREATION +/area/crew_quarters/fitness/pool + name = "Pool Area" + icon_state = "pool" + /area/crew_quarters/cafeteria name = "Cafeteria" icon_state = "cafeteria" @@ -496,15 +517,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/kitchen/backroom name = "Kitchen Coldroom" icon_state = "kitchen" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/crew_quarters/bar name = "Bar" icon_state = "bar" nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/bar/atrium name = "Atrium" icon_state = "bar" + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/electronic_marketing_den name = "Electronic Marketing Den" @@ -520,6 +544,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/theatre name = "Theatre" icon_state = "Theatre" + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/theatre/abandoned name = "Abandoned Theatre" @@ -540,10 +565,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "library" flags_1 = NONE nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + sound_environment = SOUND_AREA_LARGE_SOFTFLOOR /area/library/lounge name = "Library Lounge" icon_state = "library" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/library/abandoned name = "Abandoned Library" @@ -558,6 +585,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station clockwork_warp_allowed = FALSE clockwork_warp_fail = "The consecration here prevents you from warping in." nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/chapel/main name = "Chapel" @@ -573,6 +601,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/chapel/asteroid name = "Chapel Asteroid" icon_state = "explored" + sound_environment = SOUND_AREA_ASTEROID /area/chapel/asteroid/monastery name = "Monastery Asteroid" @@ -584,12 +613,14 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/lawoffice name = "Law Office" icon_state = "law" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR //Engineering /area/engine ambientsounds = ENGINEERING + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/engine/engine_smes name = "Engineering SMES" @@ -607,14 +638,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/engine/atmospherics_engine name = "Atmospherics Engine" icon_state = "atmos_engine" + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/engine/supermatter name = "Supermatter Engine" icon_state = "engine_sm" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/engine/break_room name = "Engineering Foyer" icon_state = "engine_foyer" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/engine/gravity_generator name = "Gravity Generator Room" @@ -629,6 +663,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/engine/storage name = "Engineering Storage" icon_state = "engi_storage" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/engine/storage_shared name = "Shared Engineering Storage" @@ -648,10 +683,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station blob_allowed = FALSE flags_1 = NONE ambientsounds = ENGINEERING + sound_environment = SOUND_AREA_SPACE /area/solar/fore name = "Fore Solar Array" icon_state = "yellow" + sound_environment = SOUND_AREA_STANDARD_STATION /area/solar/aft name = "Aft Solar Array" @@ -757,6 +794,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "gateway" music = "signal" ambientsounds = ENGINEERING + sound_environment = SOUND_AREA_STANDARD_STATION //MedBay @@ -764,11 +802,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Medical" icon_state = "medbay3" ambientsounds = MEDICAL + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/medical/clinic + name = "Clinic" + icon_state = "medbay3" + ambientsounds = MEDICAL /area/medical/abandoned name = "Abandoned Medbay" icon_state = "medbay3" music = 'sound/ambience/signal.ogg' + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/medical/medbay/central name = "Medbay Central" @@ -810,6 +855,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/medical/patients_rooms name = "Patients' Rooms" icon_state = "patients" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/medical/patients_rooms/room_a name = "Patient Room A" @@ -828,6 +874,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Morgue" icon_state = "morgue" ambientsounds = SPOOKY + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/medical/chemistry name = "Chemistry" @@ -868,6 +915,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Security" icon_state = "security" ambientsounds = HIGHSEC + sound_environment = SOUND_AREA_STANDARD_STATION /area/security/main name = "Security Office" @@ -880,6 +928,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/security/courtroom name = "Courtroom" icon_state = "courtroom" + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/security/prison name = "Prison Wing" @@ -892,10 +941,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/security/processing/cremation name = "Security Crematorium" icon_state = "sec_prison" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/security/warden name = "Brig Control" icon_state = "Warden" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/security/armory name = "Armory" @@ -909,6 +960,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/security/detectives_office/private_investigators_office name = "Private Investigator's Office" icon_state = "detective" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/security/range name = "Firing Range" @@ -986,18 +1038,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/quartermaster name = "Quartermasters" icon_state = "quart" - -///////////WORK IN PROGRESS////////// + sound_environment = SOUND_AREA_STANDARD_STATION /area/quartermaster/sorting name = "Delivery Office" icon_state = "cargo_delivery" + sound_environment = SOUND_AREA_STANDARD_STATION /area/quartermaster/warehouse name = "Warehouse" icon_state = "cargo_warehouse" - -////////////WORK IN PROGRESS////////// + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/quartermaster/office name = "Cargo Office" @@ -1006,6 +1057,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/quartermaster/storage name = "Cargo Bay" icon_state = "cargo_bay" + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/quartermaster/qm name = "Quartermaster's Office" @@ -1035,10 +1087,21 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Custodial Closet" icon_state = "janitor" flags_1 = NONE + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/janitor/aux + name = "Auxiliary Custodial Closet" + icon_state = "janitor" + flags_1 = NONE /area/hydroponics name = "Hydroponics" icon_state = "hydro" + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/hydroponics/lobby + name = "Hydroponics Lobby" + icon_state = "hydro" /area/hydroponics/garden name = "Garden" @@ -1047,6 +1110,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/hydroponics/garden/abandoned name = "Abandoned Garden" icon_state = "abandoned_garden" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/hydroponics/garden/monastery name = "Monastery Garden" @@ -1057,6 +1121,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/science name = "Science Division" icon_state = "toxlab" + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/science/observatory + name = "Research Observatory" + icon_state = "toxmisc" /area/science/lab name = "Research and Development" @@ -1100,6 +1169,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Research Division Server Room" icon_state = "server" +/area/science/server/compcore + name = "Computer Core" + icon_state = "server" + /area/science/explab name = "Experimentation Lab" icon_state = "toxmisc" @@ -1139,12 +1212,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/science/research/abandoned name = "Abandoned Research Lab" icon_state = "medresearch" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/science/nanite name = "Nanite Lab" icon_state = "toxmisc" //Storage +/area/storage + sound_environment = SOUND_AREA_STANDARD_STATION /area/storage/tools name = "Auxiliary Tool Storage" @@ -1186,6 +1262,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "storage" clockwork_warp_allowed = FALSE +/area/storage/emergency + name = "Emergency Storage" + icon_state = "emergencystorage" + /area/storage/emergency/starboard name = "Starboard Emergency Storage" icon_state = "emergencystorage" @@ -1210,6 +1290,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Construction Area" icon_state = "yellow" ambientsounds = ENGINEERING + sound_environment = SOUND_AREA_STANDARD_STATION /area/construction/minisat_exterior name = "Minisat Exterior" @@ -1218,6 +1299,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/construction/mining/aux_base name = "Auxiliary Base Construction" icon_state = "yellow" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/construction/mining/aux_base/closet name = "Auxiliary Closet Construction" @@ -1273,6 +1355,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station //AI +/area/ai_monitored + sound_environment = SOUND_AREA_STANDARD_STATION /area/ai_monitored/security/armory name = "Armory" @@ -1297,10 +1381,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/ai_monitored/turret_protected/ai_upload name = "AI Upload Chamber" icon_state = "ai_upload" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/ai_monitored/turret_protected/ai_upload_foyer name = "AI Upload Access" icon_state = "ai_foyer" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/ai_monitored/turret_protected/ai name = "AI Chamber" @@ -1309,6 +1395,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/ai_monitored/turret_protected/aisat name = "AI Satellite" icon_state = "ai" + sound_environment = SOUND_ENVIRONMENT_ROOM /area/ai_monitored/turret_protected/aisat/atmos name = "AI Satellite Atmos" @@ -1333,6 +1420,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/ai_monitored/turret_protected/aisat_interior name = "AI Satellite Antechamber" icon_state = "ai" + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/ai_monitored/turret_protected/AIsatextFP name = "AI Sat Ext" @@ -1386,6 +1474,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/tcommsat/computer name = "Telecomms Control Room" icon_state = "tcomsatcomp" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/tcommsat/server name = "Telecomms Server Room" @@ -1395,100 +1484,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Telecommunications Satellite Lounge" icon_state = "tcomsatlounge" -/area/crew_quarters/fitness/pool - name = "Pool Area" - icon_state = "pool" - -/area/crew_quarters/dorms/blue - name = "Blue Dorms" - icon_state = "Sleep" - nightshift_public_area = NIGHTSHIFT_AREA_NONE - -/area/crew_quarters/dorms/purple - name = "Purple Dorms" - icon_state = "Sleep" - nightshift_public_area = NIGHTSHIFT_AREA_NONE - -/area/crew_quarters/lounge/jazz - name = "Jazz Lounge" - icon_state = "yellow" - ambientsounds = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg') - nightshift_public_area = NIGHTSHIFT_AREA_RECREATION - - -/area/crew_quarters/fitness/recreation - name = "Recreation Area" - icon_state = "fitness" - nightshift_public_area = NIGHTSHIFT_AREA_RECREATION - -/area/crew_quarters/fitness/cogpool - name = "Pool" - icon_state = "fitness" - clockwork_warp_fail = "Pool's closed." - nightshift_public_area = NIGHTSHIFT_AREA_RECREATION - -/area/crew_quarters/barbershop - name = "Barbershop" - icon_state = "blue" - nightshift_public_area = NIGHTSHIFT_AREA_RECREATION - -/area/crew_quarters/observatory - name = "Observatory" - icon_state = "Sleep" - -//Engineering - -/area/engine/teg_hot - name = "Hot Loop" - icon_state = "red" - -/area/engine/teg_cold - name = "Cold Loop" - icon_state = "blue" - -/area/engine/workshop - name = "Engineering Workshop" - icon_state = "engine" - -/area/security/courtroom/jury - name = "Jury Room" - icon_state = "courtroom" - -/area/quartermaster/miningdock/airless - name = "Mining Dock" - icon_state = "mining" - has_gravity = STANDARD_GRAVITY - valid_territory = FALSE - outdoors = TRUE - ambientsounds = SPACE - blob_allowed = FALSE //While part of the station, what good will it do you? - -/area/quartermaster/miningdock/airless/no_grav - name = "Mining Dock" - icon_state = "mining" - dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT - power_light = FALSE - power_equip = FALSE - power_environ = FALSE - valid_territory = FALSE - outdoors = TRUE - ambientsounds = SPACE - blob_allowed = FALSE //While part of the station, what good will it do you? - -/area/janitor/aux - name = "Auxiliary Custodial Closet" - icon_state = "janitor" - flags_1 = NONE - -/area/hydroponics/lobby - name = "Hydroponics Lobby" - icon_state = "hydro" - -//Storage - -/area/storage/emergency/generic - name = "Emergency Storage" - icon_state = "emergencystorage" //Construction @@ -1545,10 +1540,99 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Storage Wing" icon_state = "storage_wing" -//Routers +//Areas that predominantly only apply to CogStation + +/area/crew_quarters/dorms/blue + name = "Blue Dorms" + icon_state = "Sleep" + nightshift_public_area = NIGHTSHIFT_AREA_NONE + +/area/crew_quarters/dorms/purple + name = "Purple Dorms" + icon_state = "Sleep" + nightshift_public_area = NIGHTSHIFT_AREA_NONE + +/area/crew_quarters/lounge/jazz + name = "Jazz Lounge" + icon_state = "yellow" + ambientsounds = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg') + nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + +/area/crew_quarters/fitness/cogpool + name = "Pool" + icon_state = "fitness" + clockwork_warp_fail = "Pool's closed." + nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + +/area/crew_quarters/barbershop + name = "Barbershop" + icon_state = "blue" + nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + +/area/crew_quarters/observatory + name = "Observatory" + icon_state = "Sleep" + +/area/hallway/secondary/civilian + name = "Civilian Wing" + icon_state = "hallFS" + +/area/engine/atmos/aftair + name = "Aft Air Hookup" + icon_state = "atmos" + flags_1 = NONE + +/area/engine/teg + name = "Thermo-Electric Generator" + icon_state = "engine" + +/area/engine/teg/hotloop + name = "Hot Loop" + icon_state = "red" + +/area/engine/teg/coldloop + name = "Cold Loop" + icon_state = "blue" + +/area/engine/workshop + name = "Engineering Workshop" + icon_state = "engine" + +/area/engine/substation + name = "Electrical Substation" + icon_state = "engine" + +/area/security/courtroom/jury + name = "Jury Room" + icon_state = "courtroom" + +/area/quartermaster/miningdock/airless + name = "Mining Dock" + icon_state = "mining" + has_gravity = STANDARD_GRAVITY + valid_territory = FALSE + outdoors = TRUE + ambientsounds = SPACE + blob_allowed = FALSE //While part of the station, what good will it do you? + +/area/quartermaster/miningdock/airless/no_grav + name = "Mining Dock" + icon_state = "mining" + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + power_light = FALSE + power_equip = FALSE + power_environ = FALSE + valid_territory = FALSE + outdoors = TRUE + ambientsounds = SPACE + blob_allowed = FALSE //While part of the station, what good will it do you? + + + +//Routers (currently exclusive to CogStation) /area/router - name = "Router" + name = "Routing Depot" icon_state = "yellow" ambientsounds = ENGINEERING diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm index 87b44291f5..48e77e1623 100644 --- a/code/game/area/ai_monitored.dm +++ b/code/game/area/ai_monitored.dm @@ -3,6 +3,7 @@ clockwork_warp_allowed = FALSE var/list/obj/machinery/camera/motioncameras = list() var/list/datum/weakref/motionTargets = list() + sound_environment = SOUND_ENVIRONMENT_ROOM /area/ai_monitored/Initialize(mapload) . = ..() @@ -28,4 +29,4 @@ for(var/X in motioncameras) var/obj/machinery/camera/cam = X cam.lostTargetRef(WEAKREF(O)) - return \ No newline at end of file + return diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b9415f3cf8..4790d20f64 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -1,16 +1,72 @@ -// Areas.dm - - +/** + * # area + * + * A grouping of tiles into a logical space, mostly used by map editors + */ /area - level = null name = "Space" icon = 'icons/turf/areas.dmi' icon_state = "unknown" layer = AREA_LAYER - plane = BLACKNESS_PLANE //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE. + //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE. + plane = BLACKNESS_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT invisibility = INVISIBILITY_LIGHTING + var/fire = null + ///Whether there is an atmos alarm in this area + var/atmosalm = FALSE + var/poweralm = FALSE + var/lightswitch = TRUE + + /// All beauty in this area combined, only includes indoor area. + var/totalbeauty = 0 + /// Beauty average per open turf in the area + var/beauty = 0 + /// If a room is too big it doesn't have beauty. + var/beauty_threshold = 150 + + /// For space, the asteroid, lavaland, etc. Used with blueprints or with weather to determine if we are adding a new area (vs editing a station room) + var/outdoors = FALSE + + /// Size of the area in open turfs, only calculated for indoors areas. + var/areasize = 0 + + /// Bonus mood for being in this area + var/mood_bonus = 0 + /// Mood message for being here, only shows up if mood_bonus != 0 + var/mood_message = "This area is pretty nice!\n" + + ///Will objects this area be needing power? + var/requires_power = TRUE + /// This gets overridden to 1 for space in area/Initialize(). + var/always_unpowered = FALSE + + var/power_equip = TRUE + var/power_light = TRUE + var/power_environ = TRUE + + var/has_gravity = FALSE + + var/parallax_movedir = 0 + + var/list/ambientsounds = GENERIC + flags_1 = CAN_BE_DIRTY_1 + + var/list/firedoors + var/list/cameras + var/list/firealarms + var/firedoors_last_closed_on = 0 + + + ///This datum, if set, allows terrain generation behavior to be ran on Initialize() + // var/datum/map_generator/map_generator + + ///Used to decide what kind of reverb the area makes sound have + var/sound_environment = SOUND_ENVIRONMENT_NONE + + /// CIT SPECIFIC VARS + /// Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints. var/map_name @@ -24,6 +80,10 @@ var/clockwork_warp_allowed = TRUE /// Message to display when the clockwork warp fails var/clockwork_warp_fail = "The structure there is too dense for warping to pierce. (This is normal in high-security areas.)" + /// Persistent debris alowed + var/persistent_debris_allowed = TRUE + /// Dirty flooring allowed + var/dirt_buildup_allowed = TRUE /// If mining tunnel generation is allowed in this area var/tunnel_allowed = FALSE @@ -37,29 +97,8 @@ /// Considered space for hull shielding var/considered_hull_exterior = FALSE - var/fire = null var/atmos = TRUE - var/atmosalm = FALSE - var/poweralm = TRUE - var/lightswitch = TRUE - var/totalbeauty = 0 //All beauty in this area combined, only includes indoor area. - var/beauty = 0 // Beauty average per open turf in the area - var/beauty_threshold = 150 //If a room is too big it doesn't have beauty. - - var/requires_power = TRUE - /// This gets overridden to 1 for space in area/Initialize(). - var/always_unpowered = FALSE - - /// For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) - var/outdoors = FALSE - - /// Size of the area in open turfs, only calculated for indoors areas. - var/areasize = 0 - - var/power_equip = TRUE - var/power_light = TRUE - var/power_environ = TRUE var/music = null var/used_equip = 0 var/used_light = 0 @@ -68,7 +107,6 @@ var/static_light = 0 var/static_environ - var/has_gravity = 0 /// Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter) var/noteleport = FALSE /// Hides area from player Teleport function. @@ -80,15 +118,6 @@ var/no_air = null - var/parallax_movedir = 0 - - var/list/ambientsounds = GENERIC - flags_1 = CAN_BE_DIRTY_1 - - var/list/firedoors - var/list/cameras - var/list/firealarms - var/firedoors_last_closed_on = 0 var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default? var/list/canSmoothWithAreas //typecache to limit the areas that atoms in this area can smooth with @@ -107,10 +136,24 @@ var/nightshift_public_area = NIGHTSHIFT_AREA_NONE //considered a public area for nightshift -/*Adding a wizard area teleport list because motherfucking lag -- Urist*/ -/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ + +/** + * A list of teleport locations + * + * Adding a wizard area teleport list because motherfucking lag -- Urist + * I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game + */ GLOBAL_LIST_EMPTY(teleportlocs) +/** + * Generate a list of turfs you can teleport to from the areas list + * + * Includes areas if they're not a shuttle or not not teleport or have no contents + * + * The chosen turf is the first item in the areas contents that is a station level + * + * The returned list of turfs is sorted by name + */ /proc/process_teleport_locs() for(var/V in GLOB.sortedAreas) var/area/AR = V @@ -124,11 +167,19 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (picked && is_station_level(picked.z)) GLOB.teleportlocs[AR.name] = AR - sortTim(GLOB.teleportlocs, /proc/cmp_text_dsc) - -// === + sortTim(GLOB.teleportlocs, /proc/cmp_text_asc) +/** + * Called when an area loads + * + * Adds the item to the GLOB.areas_by_type list based on area type + */ /area/New() + // This interacts with the map loader, so it needs to be set immediately + // rather than waiting for atoms to initialize. + if (unique) + GLOB.areas_by_type[type] = src + if(!minimap_color) // goes in New() because otherwise it doesn't fucking work // generate one using the icon_state if(icon_state && icon_state != "unknown") @@ -137,14 +188,18 @@ GLOBAL_LIST_EMPTY(teleportlocs) minimap_color = I.GetPixel(1,1) else // no icon state? use random. minimap_color = rgb(rand(50,70),rand(50,70),rand(50,70)) // This interacts with the map loader, so it needs to be set immediately - // rather than waiting for atoms to initialize. - if (unique) - GLOB.areas_by_type[type] = src return ..() +/** + * Initalize this area + * + * intializes the dynamic area lighting and also registers the area with the z level via + * reg_in_areas_in_z + * + * returns INITIALIZE_HINT_LATELOAD + */ /area/Initialize() icon_state = "" - layer = AREA_LAYER map_name = name // Save the initial (the name set in the map) name of the area. canSmoothWithAreas = typecacheof(canSmoothWithAreas) @@ -198,29 +253,55 @@ GLOBAL_LIST_EMPTY(teleportlocs) return INITIALIZE_HINT_LATELOAD +/** + * Sets machine power levels in the area + */ /area/LateInitialize() if(!base_area) //we don't want to run it twice. power_change() // all machines set to current power level, also updates icon update_beauty() -/area/proc/reg_in_areas_in_z() - if(contents.len) - var/list/areas_in_z = SSmapping.areas_in_z - var/z - update_areasize() - for(var/i in 1 to contents.len) - var/atom/thing = contents[i] - if(!thing) - continue - z = thing.z - break - if(!z) - WARNING("No z found for [src]") - return - if(!areas_in_z["[z]"]) - areas_in_z["[z]"] = list() - areas_in_z["[z]"] += src +/// Soon ™ +/area/proc/RunGeneration() + // if(map_generator) + // map_generator = new map_generator() + // var/list/turfs = list() + // for(var/turf/T in contents) + // turfs += T + // map_generator.generate_terrain(turfs) +/area/proc/test_gen() + // if(map_generator) + // var/list/turfs = list() + // for(var/turf/T in contents) + // turfs += T + // map_generator.generate_terrain(turfs) + +/** + * Register this area as belonging to a z level + * + * Ensures the item is added to the SSmapping.areas_in_z list for this z + */ +/area/proc/reg_in_areas_in_z() + if(!length(contents)) + return + var/list/areas_in_z = SSmapping.areas_in_z + update_areasize() + if(!z) + WARNING("No z found for [src]") + return + if(!areas_in_z["[z]"]) + areas_in_z["[z]"] = list() + areas_in_z["[z]"] += src + +/** + * Destroy an area and clean it up + * + * Removes the area from GLOB.areas_by_type and also stops it processing on SSobj + * + * This is despite the fact that no code appears to put it on SSobj, but + * who am I to argue with old coders + */ /area/Destroy() if(GLOB.areas_by_type[type] == src) GLOB.areas_by_type[type] = null @@ -240,6 +321,11 @@ GLOBAL_LIST_EMPTY(teleportlocs) STOP_PROCESSING(SSobj, src) return ..() +/** + * Generate a power alert for this area + * + * Sends to all ai players, alert consoles, drones and alarm monitor programs in the world + */ /area/proc/poweralert(state, obj/source) if (state != poweralm) poweralm = state @@ -521,6 +607,13 @@ GLOBAL_LIST_EMPTY(teleportlocs) used_environ += amount +/** + * Call back when an atom enters an area + * + * Sends signals COMSIG_AREA_ENTERED and COMSIG_ENTER_AREA (to the atom) + * + * If the area has ambience, then it plays some ambience music to the ambience channel + */ /area/Entered(atom/movable/M, atom/OldLoc) set waitfor = FALSE SEND_SIGNAL(src, COMSIG_AREA_ENTERED, M) @@ -563,6 +656,12 @@ GLOBAL_LIST_EMPTY(teleportlocs) return FALSE //Too big beauty = totalbeauty / areasize + +/** + * Called when an atom exits an area + * + * Sends signals COMSIG_AREA_EXITED and COMSIG_EXIT_AREA (to the atom) + */ /area/Exited(atom/movable/M) SEND_SIGNAL(src, COMSIG_AREA_EXITED, M) SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index b724c92607..63beaec412 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -9,6 +9,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" icon_state = "away" has_gravity = STANDARD_GRAVITY ambientsounds = AWAY_MISSION + sound_environment = SOUND_ENVIRONMENT_ROOM /area/awaymission/beach name = "Beach" @@ -25,4 +26,4 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" /area/awaymission/vr name = "Virtual Reality" - icon_state = "awaycontent1" \ No newline at end of file + icon_state = "awaycontent1" diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 96b621acd8..18d239328f 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -37,6 +37,10 @@ name = "winterball Zone" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED +/area/centcom/supplypod/supplypod_temp_holding + name = "Supplypod Shipping lane" + icon_state = "supplypod_flight" + /area/centcom/supplypod name = "Supplypod Facility" icon_state = "supplypod" @@ -49,18 +53,35 @@ /area/centcom/supplypod/loading name = "Supplypod Loading Facility" icon_state = "supplypod_loading" + var/loading_id = "" + +/area/centcom/supplypod/loading/Initialize() + . = ..() + if(!loading_id) + CRASH("[type] created without a loading_id") + if(GLOB.supplypod_loading_bays[loading_id]) + CRASH("Duplicate loading bay area: [type] ([loading_id])") + GLOB.supplypod_loading_bays[loading_id] = src /area/centcom/supplypod/loading/one - name = "Supplypod Loading Bay #1" + name = "Bay #1" + loading_id = "1" /area/centcom/supplypod/loading/two - name = "Supplypod Loading Bay #2" + name = "Bay #2" + loading_id = "2" /area/centcom/supplypod/loading/three - name = "Supplypod Loading Bay #3" + name = "Bay #3" + loading_id = "3" /area/centcom/supplypod/loading/four - name = "Supplypod Loading Bay #4" + name = "Bay #4" + loading_id = "4" + +/area/centcom/supplypod/loading/ert + name = "ERT Bay" + loading_id = "5" //THUNDERDOME /area/tdome diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index 9eec00460a..c0819d29b9 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -4,6 +4,7 @@ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED flags_1 = 0 hidden = TRUE + sound_environment = SOUND_ENVIRONMENT_PADDED_CELL var/obj/machinery/computer/holodeck/linked var/restricted = 0 // if true, program goes on emag list diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 70e0910dde..520c7ba59f 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -19,6 +19,7 @@ flags_1 = NONE ambientsounds = MINING flora_allowed = FALSE + sound_environment = SOUND_AREA_STANDARD_STATION /area/mine/unexplored name = "Mine" @@ -86,6 +87,7 @@ has_gravity = STANDARD_GRAVITY flags_1 = NONE flora_allowed = TRUE + sound_environment = SOUND_AREA_LAVALAND /area/lavaland/surface name = "Lavaland" @@ -139,6 +141,7 @@ flags_1 = NONE flora_allowed = TRUE blob_allowed = FALSE + sound_environment = SOUND_AREA_ICEMOON /area/icemoon/surface name = "Icemoon" diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index b97c3f0ef4..17ba4f7721 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -7,6 +7,7 @@ hidden = TRUE dynamic_lighting = DYNAMIC_LIGHTING_FORCED ambientsounds = RUINS + sound_environment = SOUND_ENVIRONMENT_STONEROOM /area/ruin/unpowered diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index 19a1fd503d..66c4f8542b 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -94,4 +94,4 @@ //ash walker nest /area/ruin/unpowered/ash_walkers - icon_state = "red" \ No newline at end of file + icon_state = "red" diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 43ea487894..9a890ead75 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -12,6 +12,7 @@ icon_state = "shuttle" // Loading the same shuttle map at a different time will produce distinct area instances. unique = FALSE + sound_environment = SOUND_ENVIRONMENT_ROOM /area/shuttle/Initialize() if(!canSmoothWithAreas) @@ -150,7 +151,6 @@ /area/shuttle/escape/luxury name = "Luxurious Emergency Shuttle" - noteleport = TRUE /area/shuttle/escape/arena name = "The Arena" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 98b502122c..bd2e515562 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,12 +1,22 @@ +/** + * The base type for nearly all physical objects in SS13 + + * Lots and lots of functionality lives here, although in general we are striving to move + * as much as possible to the components/elements system + */ /atom layer = TURF_LAYER plane = GAME_PLANE - var/level = 2 - var/article // If non-null, overrides a/an/some in all cases + appearance_flags = TILE_BOUND + var/level = 2 + ///If non-null, overrides a/an/some in all cases + var/article + + ///First atom flags var var/flags_1 = NONE + ///Intearaction flags var/interaction_flags_atom = NONE - var/datum/reagents/reagents = null var/flags_ricochet = NONE @@ -15,35 +25,52 @@ ///When a projectile ricochets off this atom, it deals the normal damage * this modifier to this atom var/ricochet_damage_mod = 0.33 - //This atom's HUD (med/sec, etc) images. Associative list. + ///Reagents holder + var/datum/reagents/reagents = null + + ///This atom's HUD (med/sec, etc) images. Associative list. var/list/image/hud_list = null - //HUD images that this atom can provide. + ///HUD images that this atom can provide. var/list/hud_possible - //Value used to increment ex_act() if reactionary_explosions is on + ///Value used to increment ex_act() if reactionary_explosions is on var/explosion_block = 0 - var/list/atom_colours //used to store the different colors on an atom - //its inherent color, the colored paint applied on it, special color effect etc... + /** + * used to store the different colors on an atom + * + * its inherent color, the colored paint applied on it, special color effect etc... + */ + var/list/atom_colours - var/list/remove_overlays // a very temporary list of overlays to remove - var/list/add_overlays // a very temporary list of overlays to add - var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays - ///overlays managed by update_overlays() to prevent removing overlays that weren't added by the same proc + /// a very temporary list of overlays to remove + var/list/remove_overlays + /// a very temporary list of overlays to add + var/list/add_overlays + + ///vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays + var/list/managed_vis_overlays + ///overlays managed by [update_overlays][/atom/proc/update_overlays] to prevent removing overlays that weren't added by the same proc var/list/managed_overlays + ///Proximity monitor associated with this atom var/datum/proximity_monitor/proximity_monitor + ///Last fingerprints to touch this atom var/fingerprintslast var/list/filter_data //For handling persistent filters + ///Price of an item in a vending machine, overriding the base vending machine price. Define in terms of paycheck defines as opposed to raw numbers. var/custom_price + ///Price of an item in a vending machine, overriding the premium vending machine price. Define in terms of paycheck defines as opposed to raw numbers. var/custom_premium_price + //List of datums orbiting this atom var/datum/component/orbiter/orbiters var/rad_flags = NONE // Will move to flags_1 when i can be arsed to + /// Radiation insulation types var/rad_insulation = RAD_NO_INSULATION ///The custom materials this atom is made of, used by a lot of things like furniture, walls, and floors (if I finish the functionality, that is.) @@ -72,6 +99,19 @@ ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy() var/list/targeted_by + ///Reference to atom being orbited + var/atom/orbit_target + +/** + * Called when an atom is created in byond (built in engine proc) + * + * Not a lot happens here in SS13 code, as we offload most of the work to the + * [Intialization][/atom/proc/Initialize] proc, mostly we run the preloader + * if the preloader is being used and then call [InitAtom][/datum/controller/subsystem/atoms/proc/InitAtom] of which the ultimate + * result is that the Intialize proc is called. + * + * We also generate a tag here if the DF_USE_TAG flag is set on the atom + */ /atom/New(loc, ...) //atom creation method that preloads variables at creation if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() @@ -87,24 +127,50 @@ //we were deleted return -//Called after New if the map is being loaded. mapload = TRUE -//Called from base of New if the map is not being loaded. mapload = FALSE -//This base must be called or derivatives must set initialized to TRUE -//must not sleep -//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE -//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm - -//Note: the following functions don't call the base for optimization and must copypasta: -// /turf/Initialize -// /turf/open/space/Initialize - +/** + * The primary method that objects are setup in SS13 with + * + * we don't use New as we have better control over when this is called and we can choose + * to delay calls or hook other logic in and so forth + * + * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), + * After the map has loaded, then Initalize is called on all atoms one by one. NB: this + * is also true for loading map templates as well, so they don't Initalize until all objects + * in the map file are parsed and present in the world + * + * If you're creating an object at any point after SSInit has run then this proc will be + * immediately be called from New. + * + * mapload: This parameter is true if the atom being loaded is either being intialized during + * the Atom subsystem intialization, or if the atom is being loaded from the map template. + * If the item is being created at runtime any time after the Atom subsystem is intialized then + * it's false. + * + * You must always call the parent of this proc, otherwise failures will occur as the item + * will not be seen as initalized (this can lead to all sorts of strange behaviour, like + * the item being completely unclickable) + * + * You must not sleep in this proc, or any subprocs + * + * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map + * there are no other arguments + * + * Must return an [initialization hint][INITIALIZE_HINT_NORMAL] or a runtime will occur. + * + * Note: the following functions don't call the base for optimization and must copypasta handling: + * * [/turf/proc/Initialize] + * * [/turf/open/space/proc/Initialize] + */ /atom/proc/Initialize(mapload, ...) + // SHOULD_NOT_SLEEP(TRUE) + SHOULD_CALL_PARENT(TRUE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 if(loc) SEND_SIGNAL(loc, COMSIG_ATOM_CREATED, src) /// Sends a signal that the new atom `src`, has been created at `loc` + //atom color stuff if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) @@ -126,14 +192,34 @@ return INITIALIZE_HINT_NORMAL -//called if Initialize returns INITIALIZE_HINT_LATELOAD +/** + * Late Intialization, for code that should run after all atoms have run Intialization + * + * To have your LateIntialize proc be called, your atoms [Initalization][/atom/proc/Initialize] + * proc must return the hint + * [INITIALIZE_HINT_LATELOAD] otherwise you will never be called. + * + * useful for doing things like finding other machines on GLOB.machines because you can guarantee + * that all atoms will actually exist in the "WORLD" at this time and that all their Intialization + * code has been run + */ /atom/proc/LateInitialize() - return + set waitfor = FALSE -// Put your AddComponent() calls here +/// Put your [AddComponent] calls here /atom/proc/ComponentInitialize() return +/** + * Top level of the destroy chain for most atoms + * + * Cleans up the following: + * * Removes alternate apperances from huds that see them + * * qdels the reagent holder from atoms if it exists + * * clears the orbiters list + * * clears overlays and priority overlays + * * clears the light object + */ /atom/Destroy() if(alternate_appearances) for(var/K in alternate_appearances) @@ -143,6 +229,8 @@ if(reagents) qdel(reagents) + orbiters = null // The component is attached to us normaly and will be deleted elsewhere + LAZYCLEARLIST(overlays) for(var/i in targeted_by) @@ -179,6 +267,16 @@ /atom/proc/CanPass(atom/movable/mover, turf/target) return !density +/** + * Is this atom currently located on centcom + * + * Specifically, is it on the z level and within the centcom areas + * + * You can also be in a shuttleshuttle during endgame transit + * + * Used in gamemode to identify mobs who have escaped and for some other areas of the code + * who don't want atoms where they shouldn't be + */ /atom/proc/onCentCom() var/turf/T = get_turf(src) if(!T) @@ -209,6 +307,13 @@ if(T in shuttle_area) return TRUE +/** + * Is the atom in any of the centcom syndicate areas + * + * Either in the syndie base on centcom, or any of their shuttles + * + * Also used in gamemode code for win conditions + */ /atom/proc/onSyndieBase() var/turf/T = get_turf(src) if(!T) @@ -222,6 +327,23 @@ return FALSE +/** + * Is the atom in an away mission + * + * Must be in the away mission z-level to return TRUE + * + * Also used in gamemode code for win conditions + */ +/atom/proc/onAwayMission() + var/turf/T = get_turf(src) + if(!T) + return FALSE + + if(is_away_level(T.z)) + return TRUE + + return FALSE + /atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user) if(does_attack_animation) @@ -415,7 +537,7 @@ /// Updates the overlays of the atom /atom/proc/update_overlays() - SHOULD_CALL_PARENT(1) + SHOULD_CALL_PARENT(TRUE) . = list() SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) @@ -429,7 +551,7 @@ /atom/proc/contents_explosion(severity, target) return //For handling the effects of explosions on contents that would not normally be effected -/atom/proc/ex_act(severity, target) +/atom/proc/ex_act(severity, target, datum/explosion/E) set waitfor = FALSE contents_explosion(severity, target) SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) @@ -864,7 +986,7 @@ return /atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) - if(!istype(I, /obj/item/multitool)) + if(!I.tool_behaviour == TOOL_MULTITOOL) if(user && !silent) to_chat(user, "[I] has no data buffer!") return FALSE @@ -1128,20 +1250,18 @@ /atom/proc/rust_heretic_act() return -///Passes Stat Browser Panel clicks to the game and calls client click on an atom -/atom/Topic(href, list/href_list) - . = ..() - if(!usr?.client) +/** + * Used to set something as 'open' if it's being used as a supplypod + * + * Override this if you want an atom to be usable as a supplypod. + */ +/atom/proc/setOpened() + return + +/** + * Used to set something as 'closed' if it's being used as a supplypod + * + * Override this if you want an atom to be usable as a supplypod. + */ +/atom/proc/setClosed() return - var/client/usr_client = usr.client - var/list/paramslist = list() - if(href_list["statpanel_item_shiftclick"]) - paramslist["shift"] = "1" - if(href_list["statpanel_item_ctrlclick"]) - paramslist["ctrl"] = "1" - if(href_list["statpanel_item_altclick"]) - paramslist["alt"] = "1" - if(href_list["statpanel_item_click"]) - // first of all make sure we valid - var/mouseparams = list2params(paramslist) - usr_client.Click(src, loc, null, mouseparams) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0a6c2b9eca..a582fa03e4 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,5 +1,7 @@ /atom/movable layer = OBJ_LAYER + glide_size = 8 + SET_APPEARANCE_FLAGS(TILE_BOUND | PIXEL_SCALE) var/last_move = null var/last_move_time = 0 var/anchored = FALSE @@ -28,14 +30,20 @@ var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before. var/list/client_mobs_in_contents // This contains all the client mobs within this container var/list/acted_explosions //for explosion dodging - glide_size = 8 - appearance_flags = TILE_BOUND|PIXEL_SCALE var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm - var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc. + + /** + * In case you have multiple types, you automatically use the most useful one. + * IE: Skating on ice, flippers on water, flying over chasm/space, etc. + * I reccomend you use the movetype_handler system and not modify this directly, especially for living mobs. + */ + var/movement_type = GROUND + var/atom/movable/pulling var/grab_state = 0 var/throwforce = 0 var/datum/component/orbiter/orbiting + /// Used for space ztransit stuff var/can_be_z_moved = TRUE ///If we were without gravity and another animation happened, the bouncing will stop, and we need to restart it in next life(). var/floating_need_update = FALSE @@ -58,6 +66,42 @@ em_block = new(src, render_target) vis_contents += em_block + +/atom/movable/Destroy(force) + QDEL_NULL(proximity_monitor) + QDEL_NULL(language_holder) + QDEL_NULL(em_block) + + unbuckle_all_mobs(force = TRUE) + + if(loc) + //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) + if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc)) + CanAtmosPass = ATMOS_PASS_YES + air_update_turf(TRUE) + loc.handle_atom_del(src) + + // if(opacity) + // RemoveElement(/datum/element/light_blocking) + + invisibility = INVISIBILITY_ABSTRACT + + if(pulledby) + pulledby.stop_pulling() + + if(orbiting) + orbiting.end_orbit(src) + orbiting = null + + . = ..() + + for(var/movable_content in contents) + qdel(movable_content) + + LAZYCLEARLIST(client_mobs_in_contents) + + moveToNullspace() + /atom/movable/proc/update_emissive_block() if(blocks_emissive != EMISSIVE_BLOCK_GENERIC) return @@ -112,40 +156,52 @@ return FALSE return T.zPassOut(src, direction, destination) && destination.zPassIn(src, direction, T) -/atom/movable/vv_edit_var(var_name, var_value) - var/static/list/banned_edits = list("step_x", "step_y", "step_size") - var/static/list/careful_edits = list("bound_x", "bound_y", "bound_width", "bound_height") - if(var_name in banned_edits) +/atom/movable/vv_edit_var(var_name, var_value, massedit) + var/static/list/banned_edits = list("step_x" = TRUE, "step_y" = TRUE, "step_size" = TRUE, "bounds" = TRUE) + var/static/list/careful_edits = list("bound_x" = TRUE, "bound_y" = TRUE, "bound_width" = TRUE, "bound_height" = TRUE) + if(banned_edits[var_name]) return FALSE //PLEASE no. - if((var_name in careful_edits) && (var_value % world.icon_size) != 0) + if((careful_edits[var_name]) && (var_value % world.icon_size) != 0) return FALSE + switch(var_name) if(NAMEOF(src, x)) var/turf/T = locate(var_value, y, z) if(T) - forceMove(T) + admin_teleport(T, !massedit) return TRUE return FALSE if(NAMEOF(src, y)) var/turf/T = locate(x, var_value, z) if(T) - forceMove(T) + admin_teleport(T, !massedit) return TRUE return FALSE if(NAMEOF(src, z)) var/turf/T = locate(x, y, var_value) if(T) - forceMove(T) + admin_teleport(T, !massedit) return TRUE return FALSE if(NAMEOF(src, loc)) - if(istype(var_value, /atom)) - forceMove(var_value) - return TRUE - else if(isnull(var_value)) - moveToNullspace() + if(isatom(var_value) || isnull(var_value)) + admin_teleport(var_value, !massedit) return TRUE return FALSE + if(NAMEOF(src, anchored)) + set_anchored(var_value) + . = TRUE + if(NAMEOF(src, pulledby)) + set_pulledby(var_value) + . = TRUE + if(NAMEOF(src, glide_size)) + set_glide_size(var_value) + . = TRUE + + if(!isnull(.)) + datum_flags |= DF_VAR_EDITED + return + return ..() /atom/movable/proc/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) @@ -167,48 +223,73 @@ AMob.grabbedby(src) return TRUE stop_pulling() + + // SEND_SIGNAL(src, COMSIG_ATOM_START_PULL, AM, state, force) + if(AM.pulledby) log_combat(AM, AM.pulledby, "pulled from", src) AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. pulling = AM - AM.pulledby = src + AM.set_pulledby(src) setGrabState(state) if(ismob(AM)) var/mob/M = AM log_combat(src, M, "grabbed", addition="passive grab") if(!supress_message) - visible_message("[src] has grabbed [M] passively!") + M.visible_message("[src] grabs [M] passively.", \ + "[src] grabs you passively.") return TRUE /atom/movable/proc/stop_pulling() if(!pulling) return - pulling.pulledby = null + pulling.set_pulledby(null) var/mob/living/ex_pulled = pulling + setGrabState(GRAB_PASSIVE) pulling = null - setGrabState(0) if(isliving(ex_pulled)) var/mob/living/L = ex_pulled L.update_mobility()// mob gets up if it was lyng down in a chokehold +///Reports the event of the change in value of the pulledby variable. +/atom/movable/proc/set_pulledby(new_pulledby) + if(new_pulledby == pulledby) + return FALSE //null signals there was a change, be sure to return FALSE if none happened here. + . = pulledby + pulledby = new_pulledby + /atom/movable/proc/Move_Pulled(atom/A) if(!pulling) - return + return FALSE if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src)) stop_pulling() - return + return FALSE if(isliving(pulling)) var/mob/living/L = pulling if(L.buckled && L.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it stop_pulling() - return + return FALSE if(A == loc && pulling.density) - return - if(!Process_Spacemove(get_dir(pulling.loc, A))) - return - step(pulling, get_dir(pulling.loc, A)) + return FALSE + var/move_dir = get_dir(pulling.loc, A) + if(!Process_Spacemove(move_dir)) + return FALSE + pulling.Move(get_step(pulling.loc, move_dir), move_dir, glide_size) return TRUE +/** + * Recursively set glide size for atom's pulled things + */ +/atom/movable/proc/recursive_pulled_glidesize_update() + var/list/ran = list() + var/atom/movable/updating = pulling + while(updating) + if(ran[updating]) + return + updating.set_glide_size(glide_size, FALSE) + ran[updating] = TRUE + updating = updating.pulling + /atom/movable/proc/check_pulling() if(pulling) var/atom/movable/pullee = pulling @@ -228,54 +309,57 @@ if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move. pulledby.stop_pulling() -/atom/movable/Destroy(force) - QDEL_NULL(proximity_monitor) - QDEL_NULL(language_holder) - QDEL_NULL(em_block) +/atom/movable/proc/set_glide_size(target = 8, recursive = TRUE) +#ifdef SMOOTH_MOVEMENT + // SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target) + glide_size = target - unbuckle_all_mobs(force=1) + for(var/m in buckled_mobs) + var/mob/buckled_mob = m + buckled_mob.set_glide_size(target) - . = ..() + if(recursive) + recursive_pulled_glidesize_update() +#else + return +#endif - if(loc) - //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) - if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc)) - CanAtmosPass = ATMOS_PASS_YES - air_update_turf(TRUE) - loc.handle_atom_del(src) - for(var/atom/movable/AM in contents) - qdel(AM) - moveToNullspace() - invisibility = INVISIBILITY_ABSTRACT - if(pulledby) - pulledby.stop_pulling() - - if(orbiting) - orbiting.end_orbit(src) - orbiting = null +///Sets the anchored var and returns if it was sucessfully changed or not. +/atom/movable/proc/set_anchored(anchorvalue) + SHOULD_CALL_PARENT(TRUE) + if(anchored == anchorvalue) + return + . = anchored + anchored = anchorvalue + // SEND_SIGNAL(src, COMSIG_MOVABLE_SET_ANCHORED, anchorvalue) /atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - set waitfor = 0 + set waitfor = FALSE var/hitpush = TRUE var/impact_signal = SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) if(impact_signal & COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH) hitpush = FALSE // hacky, tie this to something else or a proper workaround later - if(impact_signal & ~COMPONENT_MOVABLE_IMPACT_NEVERMIND) // in case a signal interceptor broke or deleted the thing before we could process our hit - return hit_atom.hitby(src, throwingdatum = throwingdatum, hitpush = hitpush) + if(!(impact_signal && (impact_signal & COMPONENT_MOVABLE_IMPACT_NEVERMIND))) // in case a signal interceptor broke or deleted the thing before we could process our hit + return hit_atom.hitby(src, throwingdatum=throwingdatum, hitpush=hitpush) /atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum) if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO)))) step(src, AM.dir) ..() -/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, messy_throw = TRUE) +/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) return - return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, messy_throw) + return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, gentle) -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, messy_throw = TRUE) //If this returns FALSE then callback will not be called. +///If this returns FALSE then callback will not be called. +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE, quickstart = TRUE) . = FALSE + + if(QDELETED(src)) + CRASH("Qdeleted thing being thrown around.") + if (!target || speed <= 0) return @@ -287,7 +371,7 @@ //They are moving! Wouldn't it be cool if we calculated their momentum and added it to the throw? if (thrower && thrower.last_move && thrower.client && thrower.client.move_delay >= world.time + world.tick_lag*2) - var/user_momentum = thrower.movement_delay() + var/user_momentum = thrower.movement_delay() //cached_multiplicative_slowdown if (!user_momentum) //no movement_delay, this means they move once per byond tick, lets calculate from that instead. user_momentum = world.tick_lag @@ -311,19 +395,13 @@ . = TRUE // No failure conditions past this point. - var/datum/thrownthing/TT = new() - TT.thrownthing = src - TT.target = target - TT.target_turf = get_turf(target) - TT.init_dir = get_dir(src, target) - TT.maxrange = range - TT.speed = speed - TT.thrower = thrower - TT.diagonals_first = diagonals_first - TT.force = force - TT.callback = callback - if(!QDELETED(thrower)) - TT.target_zone = thrower.zone_selected + var/target_zone + if(QDELETED(thrower)) + thrower = null //Let's not pass a qdeleting reference if any. + else + target_zone = thrower.zone_selected + + var/datum/thrownthing/TT = new(src, target, get_turf(target), get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone) var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) @@ -358,7 +436,8 @@ SSthrowing.processing[src] = TT if (SSthrowing.state == SS_PAUSED && length(SSthrowing.currentrun)) SSthrowing.currentrun[src] = TT - TT.tick() + if (quickstart) + TT.tick() /atom/movable/proc/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) return FALSE @@ -381,13 +460,13 @@ return TRUE return ..() -// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. -/atom/movable/proc/on_exit_storage(datum/component/storage/concrete/S) - return +/// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. +/atom/movable/proc/on_exit_storage(datum/component/storage/concrete/S) // rename S to master_storage + // SEND_SIGNAL(src, COMSIG_STORAGE_EXITED, master_storage) -// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item. +/// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item. /atom/movable/proc/on_enter_storage(datum/component/storage/concrete/S) - return + // SEND_SIGNAL(src, COMSIG_STORAGE_ENTERED, master_storage) /atom/movable/proc/get_spacemove_backup() var/atom/movable/dense_object_backup @@ -421,24 +500,26 @@ return //don't do an animation if attacking self var/pixel_x_diff = 0 var/pixel_y_diff = 0 + var/turn_dir = 1 var/direction = get_dir(src, A) if(direction & NORTH) pixel_y_diff = 8 + turn_dir = prob(50) ? -1 : 1 else if(direction & SOUTH) pixel_y_diff = -8 + turn_dir = prob(50) ? -1 : 1 if(direction & EAST) pixel_x_diff = 8 else if(direction & WEST) pixel_x_diff = -8 + turn_dir = -1 - var/matrix/OM = matrix(transform) - var/matrix/M = matrix(transform) - M.Turn(pixel_x_diff ? pixel_x_diff*2 : pick(-16, 16)) - - animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform = M, time = 2) - animate(src, pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, transform = OM, time = 2) + var/matrix/initial_transform = matrix(transform) + var/matrix/rotated_transform = transform.Turn(15 * turn_dir) + animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform=rotated_transform, time = 1, easing=BACK_EASING|EASE_IN) + animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, transform=initial_transform, time = 2, easing=SINE_EASING) /atom/movable/proc/do_item_attack_animation(atom/A, visual_effect_icon, obj/item/used_item) var/image/I @@ -449,21 +530,21 @@ I.plane = GAME_PLANE // Scale the icon. - I.transform *= 0.75 + I.transform *= 0.4 // The icon should not rotate. I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA // Set the direction of the icon animation. var/direction = get_dir(src, A) if(direction & NORTH) - I.pixel_y = -16 + I.pixel_y = -12 else if(direction & SOUTH) - I.pixel_y = 16 + I.pixel_y = 12 if(direction & EAST) - I.pixel_x = -16 + I.pixel_x = -14 else if(direction & WEST) - I.pixel_x = 16 + I.pixel_x = 14 if(!direction) // Attacked self?! I.pixel_z = 16 @@ -471,10 +552,12 @@ if(!I) return - flick_overlay(I, GLOB.clients, 5) // 5 ticks/half a second + flick_overlay(I, GLOB.clients, 10) // And animate the attack! - animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) + animate(I, alpha = 175, transform = matrix() * 0.75, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) + animate(time = 1) + animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT) /atom/movable/vv_get_dropdown() . = ..() @@ -491,19 +574,17 @@ return TRUE //TODO: Better floating -/atom/movable/proc/float(on) - if(throwing) +/atom/movable/proc/float(on, throw_override) + if(throwing || !throw_override) return - if(on && (!(movement_type & FLOATING) || floating_need_update)) - animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) - sleep(10) - animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) - if(!(movement_type & FLOATING)) - setMovetype(movement_type | FLOATING) - else if (!on && movement_type & FLOATING) + if(on && !(movement_type & FLOATING)) + animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + setMovetype(movement_type | FLOATING) + else if (!on && (movement_type & FLOATING)) animate(src, pixel_y = initial(pixel_y), time = 10) setMovetype(movement_type & ~FLOATING) - floating_need_update = FALSE + floating_need_update = FALSE // assume it's done /* Language procs * Unless you are doing something very specific, these are the ones you want to use. @@ -610,10 +691,32 @@ return FALSE return TRUE -/// Updates the grab state of the movable -/// This exists to act as a hook for behaviour +/** + * Updates the grab state of the movable + * + * This exists to act as a hook for behaviour + */ /atom/movable/proc/setGrabState(newstate) + if(newstate == grab_state) + return + // SEND_SIGNAL(src, COMSIG_MOVABLE_SET_GRAB_STATE, newstate) + . = grab_state grab_state = newstate + // switch(grab_state) // Current state. + // if(GRAB_PASSIVE) + // REMOVE_TRAIT(pulling, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT) + // REMOVE_TRAIT(pulling, TRAIT_HANDS_BLOCKED, CHOKEHOLD_TRAIT) + // if(. >= GRAB_NECK) // Previous state was a a neck-grab or higher. + // REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) + // if(GRAB_AGGRESSIVE) + // if(. >= GRAB_NECK) // Grab got downgraded. + // REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) + // else // Grab got upgraded from a passive one. + // ADD_TRAIT(pulling, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT) + // ADD_TRAIT(pulling, TRAIT_HANDS_BLOCKED, CHOKEHOLD_TRAIT) + // if(GRAB_NECK, GRAB_KILL) + // if(. <= GRAB_AGGRESSIVE) + // ADD_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) /obj/item/proc/do_pickup_animation(atom/target) set waitfor = FALSE @@ -625,31 +728,24 @@ I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA var/turf/T = get_turf(src) var/direction - var/to_x = 0 - var/to_y = 0 + var/to_x = initial(target.pixel_x) + var/to_y = initial(target.pixel_y) if(!QDELETED(T) && !QDELETED(target)) direction = get_dir(T, target) if(direction & NORTH) - to_y = 32 + to_y += 32 else if(direction & SOUTH) - to_y = -32 + to_y -= 32 if(direction & EAST) - to_x = 32 + to_x += 32 else if(direction & WEST) - to_x = -32 + to_x -= 32 if(!direction) - to_y = 16 + to_y += 16 flick_overlay(I, GLOB.clients, 6) var/matrix/M = new M.Turn(pick(-30, 30)) animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING) sleep(1) animate(I, alpha = 0, transform = matrix(), time = 1) - -/atom/movable/proc/set_anchored(anchorvalue) //literally only for plumbing ran - SHOULD_CALL_PARENT(TRUE) - if(anchored == anchorvalue) - return - . = anchored - anchored = anchorvalue diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm index db9424d983..4f07ff6f95 100644 --- a/code/game/atoms_movement.dm +++ b/code/game/atoms_movement.dm @@ -5,8 +5,7 @@ // Here's where we rewrite how byond handles movement except slightly different // To be removed on step_ conversion // All this work to prevent a second bump -/atom/movable/Move(atom/newloc, direct=0) - set waitfor = FALSE //n o +/atom/movable/Move(atom/newloc, direct=0, glide_size_override = 0) . = FALSE if(!newloc || newloc == loc) return @@ -52,8 +51,7 @@ // //////////////////////////////////////// -/atom/movable/Move(atom/newloc, direct) - set waitfor = FALSE //n o +/atom/movable/Move(atom/newloc, direct, glide_size_override = 0) var/atom/movable/pullee = pulling var/turf/T = loc if(!moving_from_pull) @@ -61,6 +59,9 @@ if(!loc || !newloc) return FALSE var/atom/oldloc = loc + //Early override for some cases like diagonal movement + if(glide_size_override) + set_glide_size(glide_size_override, FALSE) if(loc != newloc) if (!(direct & (direct - 1))) //Cardinal move @@ -120,32 +121,38 @@ return if(!loc || (loc == oldloc && oldloc != newloc)) - last_move = NONE + last_move = 0 return + setDir(direct) if(.) - last_move = direct - setDir(direct) - - if(has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s) - return FALSE - - if(pulling && pulling == pullee && pulling != moving_from_pull) //we were pulling a thing and didn't lose it during our move. - if(pulling.anchored) - stop_pulling() - else - var/pull_dir = get_dir(src, pulling) - //puller and pullee more than one tile away or in diagonal position - if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) - pulling.moving_from_pull = src - pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position - pulling.moving_from_pull = null Moved(oldloc, direct) + if(. && pulling && pulling == pullee && pulling != moving_from_pull) //we were pulling a thing and didn't lose it during our move. + if(pulling.anchored) + stop_pulling() + else + var/pull_dir = get_dir(src, pulling) + //puller and pullee more than one tile away or in diagonal position + if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) + pulling.moving_from_pull = src + pulling.Move(T, get_dir(pulling, T), glide_size) //the pullee tries to reach our previous position + pulling.moving_from_pull = null + check_pulling() -/atom/movable/proc/handle_buckled_mob_movement(newloc,direct) + + //glide_size strangely enough can change mid movement animation and update correctly while the animation is playing + //This means that if you don't override it late like this, it will just be set back by the movement update that's called when you move turfs. + if(glide_size_override) + set_glide_size(glide_size_override, FALSE) + + last_move = direct + if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, glide_size_override)) //movement failed due to buckled mob(s) + return FALSE + +/atom/movable/proc/handle_buckled_mob_movement(newloc, direct, glide_size_override) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - if(!buckled_mob.Move(newloc, direct)) + if(!buckled_mob.Move(newloc, direct, glide_size_override)) forceMove(buckled_mob.loc) last_move = buckled_mob.last_move inertia_dir = last_move @@ -155,6 +162,7 @@ //Called after a successful Move(). By this point, we've already moved /atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) + SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) if (!inertia_moving) inertia_next_move = world.time + inertia_move_delay @@ -174,6 +182,8 @@ //oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called! /atom/movable/Crossed(atom/movable/AM, oldloc) + // SHOULD_CALL_PARENT(TRUE) + . = ..() SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM) /atom/movable/Uncross(atom/movable/AM, atom/newloc) @@ -204,7 +214,11 @@ var/atom/movable/AM = item AM.onTransitZ(old_z,new_z) +///Proc to modify the movement_type and hook behavior associated with it changing. /atom/movable/proc/setMovetype(newval) + if(movement_type == newval) + return + . = movement_type movement_type = newval ///////////// FORCED MOVEMENT ///////////// @@ -268,37 +282,44 @@ old_area.Exited(src, null) loc = null -//Called whenever an object moves and by mobs when they attempt to move themselves through space -//And when an object or action applies a force on src, see newtonian_move() below -//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting -//Mobs should return 1 if they should be able to move of their own volition, see client/Move() in mob_movement.dm -//movement_dir == 0 when stopping or any dir when trying to move +/** + * Called whenever an object moves and by mobs when they attempt to move themselves through space + * And when an object or action applies a force on src, see [newtonian_move][/atom/movable/proc/newtonian_move] + * + * Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting + * + * Mobs should return 1 if they should be able to move of their own volition, see [/client/proc/Move] + * + * Arguments: + * * movement_dir - 0 when stopping or any dir when trying to move + */ /atom/movable/proc/Process_Spacemove(movement_dir = 0) if(has_gravity(src)) - return 1 + return TRUE - if(pulledby) - return 1 + if(pulledby && (pulledby.pulledby != src || moving_from_pull)) + return TRUE if(throwing) - return 1 + return TRUE if(!isturf(loc)) - return 1 + return TRUE if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier - return 1 + return TRUE - return 0 + return FALSE -/atom/movable/proc/newtonian_move(direction) //Only moves the object if it's under no gravity - if(!loc || Process_Spacemove(0)) +/// Only moves the object if it's under no gravity +/atom/movable/proc/newtonian_move(direction) + if(!isturf(loc) || Process_Spacemove(0)) inertia_dir = 0 - return 0 + return FALSE inertia_dir = direction if(!direction) - return 1 + return TRUE inertia_last_loc = loc SSspacedrift.processing[src] = src - return 1 + return TRUE diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index be8dee5bf8..29455afe56 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -150,14 +150,14 @@ Credit where due: var/datum/team/clockcult/main_clockcult /datum/game_mode/clockwork_cult/pre_setup() //Gamemode and job code is pain. Have fun codediving all of that stuff, whoever works on this next - Delta - var/list/errorList = list() + /*var/list/errorList = list() var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE) if(errorList.len) // reebe failed to load message_admins("Reebe failed to load!") log_game("Reebe failed to load!") return FALSE - for(var/datum/parsed_map/PM in reebes) - PM.initTemplateBounds() + for(var/datum/parsed_map/PM in reebes) //Temporarily commented because of z-level loading reliably segfaulting the server. + PM.initTemplateBounds()*/ if(CONFIG_GET(flag/protect_roles_from_antagonist)) restricted_jobs += protected_jobs if(CONFIG_GET(flag/protect_assistant_from_antagonist)) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index fbc433a8a0..6a16b62643 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -64,6 +64,8 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) var/threat_average_weight = 0 /// Last time a threat average sample was taken. Used for weighting the rolling average. var/last_threat_sample_time = 0 + /// Maximum threat recorded so far, for cross-round chaos adjustment. + var/max_threat = 0 /// Things that cause a rolling threat adjustment to be displayed at roundend. var/list/threat_tallies = list() /// Running information about the threat. Can store text or datum entries. @@ -72,6 +74,8 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) var/list/threat_log_verbose = list() /// List of roundstart rules used for selecting the rules. var/list/roundstart_rules = list() + /// List of minor roundstart rules used for selecting the rules. + var/list/minor_rules = list() /// List of latejoin rules used for selecting the rules. var/list/latejoin_rules = list() /// List of midround rules used for selecting the rules. @@ -121,10 +125,12 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) var/pop_last_updated = 0 /// How many percent of the rounds are more peaceful. var/peaceful_percentage = 50 - /// If a highlander executed. + /// If a highlander executed. No other highlander rulesets will be run. var/highlander_executed = FALSE - /// If a only ruleset has been executed. + /// If a only ruleset has been executed. No other rulesets will be run. var/only_ruleset_executed = FALSE + /// If the first picked ruleset was a minor ruleset. Minor antagonists will be weighted higher. + var/minor_ruleset_start = FALSE /// Antags rolled by rules so far, to keep track of and discourage scaling past a certain ratio of crew/antags especially on lowpop. var/antags_rolled = 0 // Arbitrary threat addition, for fudging purposes. @@ -141,6 +147,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) third_rule_req = list(101, 101, 101, 101, 101, 100, 90, 80, 70, 60) high_pop_second_rule_req = CONFIG_GET(number/dynamic_second_rule_high_pop_requirement) high_pop_third_rule_req = CONFIG_GET(number/dynamic_third_rule_high_pop_requirement) + added_threat = CONFIG_GET(number/dynamic_threat_baseline) GLOB.dynamic_high_pop_limit = CONFIG_GET(number/dynamic_high_pop_limit) GLOB.dynamic_latejoin_delay_min = CONFIG_GET(number/dynamic_latejoin_delay_min)*600 GLOB.dynamic_latejoin_delay_max = CONFIG_GET(number/dynamic_latejoin_delay_max)*600 @@ -372,6 +379,8 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) if(ruleset.name == "") continue switch(ruleset.ruletype) + if("Minor") + minor_rules += ruleset if("Roundstart") roundstart_rules += ruleset if ("Latejoin") @@ -396,21 +405,47 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) rigged_roundstart() else roundstart() - - var/starting_rulesets = "" - for (var/datum/dynamic_ruleset/roundstart/DR in executed_rules) - starting_rulesets += "[DR.name], " - log_game("DYNAMIC: Picked the following roundstart rules: [starting_rulesets]") + if(minor_ruleset_start) + log_game("DYNAMIC: Starting a minor ruleset round.") + else + var/starting_rulesets = "" + for (var/datum/dynamic_ruleset/roundstart/DR in executed_rules) + starting_rulesets += "[DR.name], " + log_game("DYNAMIC: Picked the following roundstart rules: [starting_rulesets]") candidates.Cut() return TRUE /datum/game_mode/dynamic/post_setup(report) update_playercounts() - - for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules) - addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_roundstart_rule, rule), rule.delay) + if(minor_ruleset_start) + addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/minor_roundstart),rand(1 MINUTES,3 MINUTES)) + else + for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules) + addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_roundstart_rule, rule), rule.delay) ..() +/datum/game_mode/dynamic/proc/minor_roundstart() + message_admins("Dynamic beginning minor antag roundstart rolls.") + var/list/potential_minor_rulesets = storyteller.minor_rule_draft() + var/iterations = 0 + var/num_rulesets_executed = 0 + while(threat < threat_level && potential_minor_rulesets.len && (!CHECK_TICK || iterations < 100)) + var/datum/dynamic_ruleset/minor/rule = pickweight(potential_minor_rulesets) + rule.candidates = current_players[CURRENT_LIVING_PLAYERS].Copy() + rule.trim_candidates() + if(!check_blocking(rule.blocking_rules, executed_rules) && rule.ready()) + rule.execute() + executed_rules |= rule + log_threat("[rule.ruletype] - [rule.name] [rule.cost] threat", verbose = TRUE) + num_rulesets_executed++ + else + potential_minor_rulesets -= rule + update_playercounts() + iterations++ + message_admins("Minor antag roundstart rolls completed, with [iterations] rolls done and [num_rulesets_executed] antags or antag teams made.") + log_game("DYNAMIC: Minor antag roundstart made [num_rulesets_executed] antags or antag teams.") + + /// A simple roundstart proc used when dynamic_forced_roundstart_ruleset has rules in it. /datum/game_mode/dynamic/proc/rigged_roundstart() message_admins("[GLOB.dynamic_forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.") @@ -429,12 +464,17 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) if (GLOB.dynamic_forced_extended) log_game("DYNAMIC: Starting a round of forced extended.") return TRUE + if(prob(storyteller.minor_start_chance())) + minor_ruleset_start = TRUE + message_admins("Dynamic has initialized a minor antag start. Antags will be assigned in 1-5 minutes.") + log_game("DYNAMIC: Minor start initialized.") + return TRUE var/list/drafted_rules = storyteller.roundstart_draft() if(!drafted_rules.len) - message_admins("Not enough threat level for roundstart antags!") - log_game("DYNAMIC: Not enough threat level for roundstart antags!") - midround_injection_cooldown = round((midround_injection_cooldown + world.time) / 2, 1) - latejoin_injection_cooldown = round((latejoin_injection_cooldown + world.time) / 2, 1) + message_admins("No roundstart antags drafted! Falling back to minor ruleset start.") + log_game("DYNAMIC: No roundstart antags drafted! Falling back to minor ruleset start.") + minor_ruleset_start = TRUE + return FALSE var/indice_pop = min(10,round(roundstart_pop_ready/pop_per_requirement)+1) extra_rulesets_amount = 0 if (GLOB.dynamic_classic_secret) @@ -468,8 +508,9 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) else if(threat_level >= 50) - message_admins("DYNAMIC: Picking first roundstart ruleset failed. You should report this.") + message_admins("DYNAMIC: Picking first roundstart ruleset failed. You should report this. Falling back to minor antag start.") log_game("DYNAMIC: Picking first roundstart ruleset failed. drafted_rules.len = [drafted_rules.len] and threat = [threat]/[threat_level]") + minor_ruleset_start = TRUE return FALSE return TRUE @@ -513,7 +554,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) drafted_rules -= starting_rule starting_rule.trim_candidates() - starting_rule.scale_up(extra_rulesets_amount, threat_level-added_threat) if (starting_rule.pre_execute()) log_threat("[starting_rule.ruletype] - [starting_rule.name] [starting_rule.cost + starting_rule.scaled_times * starting_rule.scaling_cost] threat", verbose = TRUE) if(starting_rule.flags & HIGHLANDER_RULESET) @@ -575,6 +615,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) latejoin_rules = remove_from_list(latejoin_rules, rule.type) else if(rule.ruletype == "Midround") midround_rules = remove_from_list(midround_rules, rule.type) + message_admins("DYNAMIC: Picked [rule]; executing soon...") addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_midround_latejoin_rule, rule), rule.delay) return TRUE @@ -626,6 +667,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) /datum/game_mode/dynamic/proc/execute_midround_latejoin_rule(sent_rule) var/datum/dynamic_ruleset/rule = sent_rule if (rule.execute()) + message_admins("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].") log_game("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].") log_threat("[rule.ruletype] [rule.name] added [rule.cost]", verbose = TRUE) if(rule.flags & HIGHLANDER_RULESET) @@ -704,6 +746,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) if(!M.voluntary_ghosted) current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow) threat = storyteller.calculate_threat() + added_threat + max_threat = max(max_threat,threat) if(threat_average_weight) var/cur_sample_weight = world.time - last_threat_sample_time threat_average = ((threat_average * threat_average_weight) + (threat * cur_sample_weight)) / (threat_average_weight + cur_sample_weight) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index eb7da2144f..3e7e504130 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -50,8 +50,12 @@ /// Used for the roundend report var/total_cost = 0 /// A flag that determines how the ruleset is handled + /// ONLY_RULESET are rulesets that prevent ALL other rulesets from rolling. /// HIGHLANDER_RULESET are rulesets can end the round. - /// TRAITOR_RULESET and MINOR_RULESET can't end the round and have no difference right now. + /// TRAITOR_RULESET are the "default" ruleset--they should always be addable to a round, if the round type allows antags and dynamic thinks there should be another. + /// MINOR_RULESET is for rulesets whose antags can have multiple instances without causing too much issue. As roundstarts, they have their weights reduced based on the storyteller's minor-antag-round chance. + /// FAKE_ANTAG_RULESET is for rulesets whose antags aren't actually antagonistic--essentially just flavor meant to spice the round up. + /// ALWAYS_MAX_WEIGHT_RULESET means that the ruleset doesn't have its weight reduced based on recency. var/flags = 0 /// Pop range per requirement. If zero defaults to mode's pop_per_requirement. var/pop_per_requirement = 0 @@ -82,9 +86,6 @@ var/delay = 0 /// List of tags for use in storytellers. var/list/property_weights = list() - /// Whether or not recent-round weight values are taken into account for this ruleset. - /// Weight reduction uses the same values as secret's recent-round mode weight reduction. - var/always_max_weight = FALSE /// Weight reduction by recent-rounds. Saved on new. var/weight_mult = 1 @@ -100,7 +101,7 @@ var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement) var/list/repeated_mode_adjust = CONFIG_GET(number_list/repeated_mode_adjust) if(config_tag in weights) - if(!always_max_weight && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3) + if(!(flags & ALWAYS_MAX_WEIGHT_RULESET) && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3) var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules for(var/i in 1 to 3) if(config_tag in saved_dynamic_rules[i]) @@ -119,6 +120,9 @@ /datum/dynamic_ruleset/roundstart // One or more of those drafted at roundstart ruletype = "Roundstart" +/datum/dynamic_ruleset/minor // drafted at roundstart in minor rounds, one antag at a time, for a "mixed" round + ruletype = "Minor" + // Can be drafted when a player joins the server /datum/dynamic_ruleset/latejoin ruletype = "Latejoin" @@ -175,7 +179,7 @@ /// This is called if persistent variable is true everytime SSTicker ticks. /datum/dynamic_ruleset/proc/rule_process() return TRUE - + /// Called on game mode pre_setup for roundstart rulesets. /// Do everything you need to do before job is assigned here. /// IMPORTANT: ASSIGN special_role HERE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index d2fa8bcc70..7842c6e0f7 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -70,9 +70,8 @@ requirements = list(40,30,20,15,15,15,15,15,15,15) high_population_requirement = 15 repeatable = TRUE - flags = TRAITOR_RULESET + flags = TRAITOR_RULESET | MINOR_RULESET | ALWAYS_MAX_WEIGHT_RULESET property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1) - always_max_weight = TRUE ////////////////////////////////////////////// // // @@ -207,6 +206,7 @@ weight = 4 cost = 25 requirements = list(60,60,60,55,50,50,50,50,50,50) + flags = MINOR_RULESET high_population_requirement = 50 property_weights = list("story_potential" = 1, "trust" = -1, "chaos" = 2, "extended" = -1, "valid" = 2) repeatable = TRUE @@ -229,6 +229,7 @@ cost = 10 property_weights = list("story_potential" = 2, "extended" = 2, "trust" = -2, "valid" = 1) requirements = list(70,65,60,55,50,45,40,35,30,30) + flags = MINOR_RULESET high_population_requirement = 30 repeatable = TRUE @@ -258,6 +259,7 @@ required_candidates = 1 weight = 3 cost = 15 + flags = MINOR_RULESET requirements = list(101,101,101,101,101,101,101,101,101,101) property_weights = list("trust" = -2, "valid" = 2) high_population_requirement = 101 @@ -281,5 +283,5 @@ requirements = list(10,10,10,10,10,10,10,10,10,10) high_population_requirement = 10 repeatable = TRUE - flags = TRAITOR_RULESET | MINOR_RULESET - property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 2) + flags = TRAITOR_RULESET | MINOR_RULESET | FAKE_ANTAG_RULESET + property_weights = list("story_potential" = 1, "trust" = -1, "extended" = 2) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index b29584aa58..7ce6e74cc1 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -48,6 +48,9 @@ if (!M.client) // Are they connected? trimmed_list.Remove(M) continue + if(M.client.prefs && M.client.prefs.toggles & MIDROUND_ANTAG) + trimmed_list.Remove(M) + continue if(!mode.check_age(M.client, minimum_required_age)) trimmed_list.Remove(M) continue @@ -207,9 +210,8 @@ requirements = list(30,25,20,15,15,15,15,15,15,15) repeatable = TRUE high_population_requirement = 15 - flags = TRAITOR_RULESET + flags = TRAITOR_RULESET | MINOR_RULESET | ALWAYS_MAX_WEIGHT_RULESET property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1) - always_max_weight = TRUE /datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0) var/player_count = mode.current_players[CURRENT_LIVING_PLAYERS].len @@ -494,6 +496,7 @@ required_candidates = 1 weight = 3 cost = 10 + flags = MINOR_RULESET requirements = list(101,101,101,70,50,40,20,15,15,15) high_population_requirement = 50 repeatable_weight_decrease = 2 @@ -630,6 +633,7 @@ required_candidates = 1 weight = 4 cost = 15 + flags = MINOR_RULESET requirements = list(101,101,101,90,80,70,60,50,40,30) high_population_requirement = 30 property_weights = list("story_potential" = 1, "extended" = -2, "valid" = 2) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_minor.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_minor.dm new file mode 100644 index 0000000000..74a61bd3ff --- /dev/null +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_minor.dm @@ -0,0 +1,255 @@ +/datum/dynamic_ruleset/minor/proc/trim_list(list/L = list()) + var/list/trimmed_list = L.Copy() + for(var/mob/M in trimmed_list) + if (!ishuman(M)) + trimmed_list.Remove(M) + continue + if (HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG)) + trimmed_list.Remove(M) + continue + if (!M.client) // Are they connected? + trimmed_list.Remove(M) + continue + if(!mode.check_age(M.client, minimum_required_age)) + trimmed_list.Remove(M) + continue + if(antag_flag_override) + if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override)) + trimmed_list.Remove(M) + continue + else + if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag)) + trimmed_list.Remove(M) + continue + if (M.mind) + if ((M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role? + trimmed_list.Remove(M) + continue + if (M.mind.assigned_role in restricted_roles) // Does their job allow it? + trimmed_list.Remove(M) + continue + if ((exclusive_roles.len > 0) && !(M.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job? + trimmed_list.Remove(M) + continue + return trimmed_list + +/datum/dynamic_ruleset/minor/trim_candidates() + // + // All you need to know is that here, the candidates list contains 4 lists itself, indexed with the following defines: + // Candidates = list(CURRENT_LIVING_PLAYERS, CURRENT_LIVING_ANTAGS, CURRENT_DEAD_PLAYERS, CURRENT_OBSERVERS) + // So for example you can get the list of all current dead players with var/list/dead_players = candidates[CURRENT_DEAD_PLAYERS] + // Make sure to properly typecheck the mobs in those lists, as the dead_players list could contain ghosts, or dead players still in their bodies. + // We're still gonna trim the obvious (mobs without clients, jobbanned players, etc) + candidates = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS]) + +////////////////////////////////////////////// +// // +// SYNDICATE TRAITORS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/minor/traitor + name = "Traitors" + config_tag = "traitor" // these having identical config tags to the roundstart modes is 100% intentional, so that config edits are simpler + persistent = TRUE + antag_flag = ROLE_TRAITOR + antag_datum = /datum/antagonist/traitor/ + minimum_required_age = 0 + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Cyborg") + restricted_roles = list("Cyborg", "AI") + required_candidates = 1 + weight = 5 + flags = TRAITOR_RULESET | ALWAYS_MAX_WEIGHT_RULESET + cost = 10 // Avoid raising traitor threat above 10, as it is the default low cost ruleset. + requirements = list(50,50,50,50,50,50,50,50,50,50) + high_population_requirement = 40 + property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1, "valid" = 1) + +/datum/dynamic_ruleset/minor/traitor/execute() + var/mob/M = pick_n_take(candidates) + assigned += M + var/datum/antagonist/traitor/newTraitor = new + M.mind.add_antag_datum(newTraitor) + log_admin("[M] was made into a traitor by dynamic.") + message_admins("[M] was made into a traitor by dynamic.") + return TRUE + +////////////////////////////////////////// +// // +// BLOOD BROTHERS // +// // +////////////////////////////////////////// + +/datum/dynamic_ruleset/minor/traitorbro + name = "Blood Brothers" + config_tag = "traitorbro" + antag_flag = ROLE_BROTHER + antag_datum = /datum/antagonist/brother + restricted_roles = list("AI", "Cyborg") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + required_candidates = 2 + weight = 4 + cost = 10 + requirements = list(101,101,101,101,101,101,101,101,101,101) + high_population_requirement = 101 + antag_cap = list(2,2,2,2,2,2,2,2,2,2) // Can pick 3 per team, but rare enough it doesn't matter. + property_weights = list("story_potential" = 1, "trust" = -1, "extended" = 1, "valid" = 1) + var/list/datum/team/brother_team/pre_brother_teams = list() + var/const/min_team_size = 2 + +/datum/dynamic_ruleset/minor/traitorbro/execute() + if(candidates.len < min_team_size || candidates.len < required_candidates) + return FALSE + var/datum/team/brother_team/team = new + var/team_size = prob(10) ? min(3, candidates.len) : 2 + for(var/k = 1 to team_size) + var/mob/bro = pick_n_take(candidates) + assigned += bro.mind + team.add_member(bro.mind) + bro.mind.special_role = "brother" + bro.mind.restricted_roles = restricted_roles + team.pick_meeting_area() + team.forge_brother_objectives() + for(var/datum/mind/M in team.members) + M.add_antag_datum(/datum/antagonist/brother, team) + team.update_name() + mode.brother_teams += team + +////////////////////////////////////////////// +// // +// CHANGELINGS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/minor/changeling + name = "Changelings" + config_tag = "changeling" + antag_flag = ROLE_CHANGELING + antag_datum = /datum/antagonist/changeling + restricted_roles = list("AI", "Cyborg") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + required_candidates = 1 + weight = 3 + cost = 15 + scaling_cost = 15 + requirements = list(101,101,101,101,101,101,101,101,101,101) + property_weights = list("trust" = -2, "valid" = 2) + high_population_requirement = 10 + antag_cap = list(1,1,1,1,1,2,2,2,2,3) + var/team_mode_probability = 30 + +/datum/dynamic_ruleset/minor/changeling/execute() + var/mob/M = pick_n_take(candidates) + assigned += M.mind + M.mind.restricted_roles = restricted_roles + M.mind.special_role = ROLE_CHANGELING + var/datum/antagonist/changeling/new_antag = new antag_datum() + M.mind.add_antag_datum(new_antag) + return TRUE + +////////////////////////////////////////////// +// // +// ELDRITCH CULT // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/minor/heretics + name = "Heretic" + antag_flag = "heretic" + antag_datum = /datum/antagonist/heretic + protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain") + restricted_roles = list("AI", "Cyborg") + required_candidates = 1 + weight = 3 + cost = 25 + scaling_cost = 15 + requirements = list(60,60,60,55,50,50,50,50,50,50) + property_weights = list("story_potential" = 1, "trust" = -1, "chaos" = 2, "extended" = -1, "valid" = 2) + antag_cap = list(1,1,1,1,2,2,2,2,3,3) + high_population_requirement = 50 + + +/datum/dynamic_ruleset/minor/heretics/pre_execute() + var/mob/picked_candidate = pick_n_take(candidates) + assigned += picked_candidate.mind + picked_candidate.mind.restricted_roles = restricted_roles + picked_candidate.mind.special_role = ROLE_HERETIC + var/datum/antagonist/heretic/new_antag = new antag_datum() + picked_candidate.mind.add_antag_datum(new_antag) + return TRUE + +////////////////////////////////////////////// +// // +// DEVIL // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/minor/devil + name = "Devil" + config_tag = "devil" + antag_flag = ROLE_DEVIL + antag_datum = /datum/antagonist/devil + restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") + required_candidates = 1 + weight = 3 + cost = 0 + requirements = list(101,101,101,101,101,101,101,101,101,101) + high_population_requirement = 101 + antag_cap = list(1,1,1,2,2,2,3,3,3,4) + property_weights = list("extended" = 1) + +/datum/dynamic_ruleset/minor/devil/pre_execute() + var/mob/devil = pick_n_take(candidates) + assigned += devil.mind + devil.mind.special_role = ROLE_DEVIL + devil.mind.restricted_roles = restricted_roles + + log_game("[key_name(devil)] has been selected as a devil") + add_devil(devil, ascendable = TRUE) + add_devil_objectives(devil.mind,2) + return TRUE + +/datum/dynamic_ruleset/minor/devil/proc/add_devil_objectives(datum/mind/devil_mind, quantity) + var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target) + var/datum/antagonist/devil/D = devil_mind.has_antag_datum(/datum/antagonist/devil) + for(var/i = 1 to quantity) + var/type = pick(validtypes) + var/datum/objective/devil/objective = new type(null) + objective.owner = devil_mind + D.objectives += objective + if(!istype(objective, /datum/objective/devil/buy_target)) + validtypes -= type + else + objective.find_target() + +////////////////////////////////////////////// +// // +// BLOODSUCKERS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/minor/bloodsucker + name = "Bloodsuckers" + config_tag = "bloodsucker" + antag_flag = ROLE_BLOODSUCKER + antag_datum = ANTAG_DATUM_BLOODSUCKER + minimum_required_age = 0 + protected_roles = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + restricted_roles = list("Cyborg", "AI") + required_candidates = 1 + weight = 2 + cost = 15 + scaling_cost = 10 + property_weights = list("story_potential" = 1, "extended" = 1, "trust" = -2, "valid" = 1) + requirements = list(70,65,60,55,50,50,50,50,50,50) + high_population_requirement = 50 + +/datum/dynamic_ruleset/minor/bloodsucker/execute() + var/mob/M = pick_n_take(candidates) + assigned += M.mind + M.mind.special_role = ROLE_BLOODSUCKER + M.mind.restricted_roles = restricted_roles + mode.check_start_sunlight() + if(mode.make_bloodsucker(M.mind)) + mode.bloodsuckers += M.mind + return TRUE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index db4ec99558..1be5cb3c57 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -8,13 +8,13 @@ /datum/dynamic_ruleset/roundstart/traitor name = "Traitors" config_tag = "traitor" - persistent = TRUE antag_flag = ROLE_TRAITOR antag_datum = /datum/antagonist/traitor/ minimum_required_age = 0 protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Cyborg") restricted_roles = list("Cyborg", "AI") required_candidates = 1 + flags = TRAITOR_RULESET | MINOR_RULESET | ALWAYS_MAX_WEIGHT_RULESET weight = 5 cost = 10 // Avoid raising traitor threat above 10, as it is the default low cost ruleset. scaling_cost = 10 @@ -22,7 +22,6 @@ high_population_requirement = 40 antag_cap = list(1,1,1,1,2,2,2,2,3,3) property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1, "valid" = 1) - always_max_weight = TRUE var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec) /datum/dynamic_ruleset/roundstart/traitor/pre_execute() @@ -34,15 +33,6 @@ M.mind.restricted_roles = restricted_roles return TRUE -/datum/dynamic_ruleset/roundstart/traitor/rule_process() - if (autotraitor_cooldown > 0) - autotraitor_cooldown-- - else - autotraitor_cooldown = 450 // 15 minutes - message_admins("Checking if we can turn someone into a traitor.") - log_game("DYNAMIC: Checking if we can turn someone into a traitor.") - mode.picking_specific_rule(/datum/dynamic_ruleset/midround/autotraitor) - ////////////////////////////////////////// // // // BLOOD BROTHERS // @@ -57,6 +47,7 @@ restricted_roles = list("AI", "Cyborg") protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_candidates = 2 + flags = MINOR_RULESET weight = 4 cost = 10 requirements = list(101,101,101,101,101,101,101,101,101,101) @@ -106,6 +97,7 @@ restricted_roles = list("AI", "Cyborg") protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_candidates = 1 + flags = MINOR_RULESET weight = 3 cost = 15 scaling_cost = 15 @@ -156,6 +148,7 @@ protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain") restricted_roles = list("AI", "Cyborg") required_candidates = 1 + flags = MINOR_RULESET weight = 3 cost = 25 scaling_cost = 15 @@ -694,6 +687,7 @@ antag_datum = /datum/antagonist/devil restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") required_candidates = 1 + flags = MINOR_RULESET weight = 3 cost = 0 requirements = list(101,101,101,101,101,101,101,101,101,101) @@ -850,6 +844,7 @@ protected_roles = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") restricted_roles = list("Cyborg", "AI") required_candidates = 1 + flags = MINOR_RULESET weight = 2 cost = 15 scaling_cost = 10 diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index 04e295356a..03aa9d174a 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -15,10 +15,13 @@ */ var/flags = 0 var/dead_player_weight = 1 // How much dead players matter for threat calculation - var/weight = 3 // Weights for randomly picking storyteller. Multiplied by score after voting. + var/weight = 0 // Weights for randomly picking storyteller. Multiplied by score after voting. + var/min_chaos = -1000 // Won't show up if recent rounds have been below this chaotic on average + var/max_chaos = 1000 // Won't show up if recent rounds have been above this chaotic on average var/event_frequency_lower = 6 MINUTES // How rare events will be, at least. var/event_frequency_upper = 20 MINUTES // How rare events will be, at most. var/min_players = -1 // How many players are required for this one to start. + var/soft_antag_ratio_cap = 4 // how many players-per-antag there should be var/datum/game_mode/dynamic/mode = null // Cached as soon as it's made, by dynamic. /** @@ -32,6 +35,9 @@ Property weights are added to the config weight of the ruleset. They are: "conversion" -- Basically a bool. Conversion antags, well, convert. It's in its own class 'cause people kinda hate conversion. */ +/datum/dynamic_storyteller/proc/minor_start_chance() + return clamp(60 - mode.threat_level,0,100) // by default higher threat = lower chance of minor round + /datum/dynamic_storyteller/proc/start_injection_cooldowns() var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_latejoin_delay_max + GLOB.dynamic_first_latejoin_delay_min) mode.latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time @@ -98,17 +104,37 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/proc/should_inject_antag(dry_run = FALSE) if(mode.forced_injection) - mode.forced_injection = !dry_run + mode.forced_injection = dry_run return TRUE + if(mode.current_players[CURRENT_LIVING_PLAYERS].len < (mode.current_players[CURRENT_LIVING_ANTAGS].len * soft_antag_ratio_cap)) + return FALSE return mode.threat < mode.threat_level /datum/dynamic_storyteller/proc/roundstart_draft() var/list/drafted_rules = list() + var/minor_round_weight_mult = (100-minor_start_chance()) / 100 for (var/datum/dynamic_ruleset/roundstart/rule in mode.roundstart_rules) if (rule.acceptable(mode.roundstart_pop_ready, mode.threat_level)) // If we got the population and threat required rule.candidates = mode.candidates.Copy() rule.trim_candidates() if (rule.ready() && rule.candidates.len > 0) + var/property_weight = 0 + for(var/property in property_weights) + if(property in rule.property_weights) // just treat it as 0 if it's not in there + property_weight += rule.property_weights[property] * property_weights[property] + var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult + if(CHECK_BITFIELD(rule.flags, MINOR_RULESET)) + calced_weight *= minor_round_weight_mult + if(calced_weight > 0) // negatives in the list might cause problems + drafted_rules[rule] = calced_weight + return drafted_rules + +/datum/dynamic_storyteller/proc/minor_rule_draft() + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/rule in mode.minor_rules) + if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) + rule.trim_candidates() + if (rule.ready()) var/property_weight = 0 for(var/property in property_weights) if(property in rule.property_weights) // just treat it as 0 if it's not in there @@ -124,7 +150,7 @@ Property weights are added to the config weight of the ruleset. They are: // if there are antags OR the rule is an antag rule, antag_acceptable will be true. if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) // Classic secret : only autotraitor/minor roles - if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET))) continue rule.trim_candidates() if (rule.ready()) @@ -133,7 +159,7 @@ Property weights are added to the config weight of the ruleset. They are: if(property in rule.property_weights) // just treat it as 0 if it's not in there property_weight += rule.property_weights[property] * property_weights[property] var/threat_weight = 1 - if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)) // makes the traitor rulesets always possible anyway + if(!(rule.flags & TRAITOR_RULESET)) // makes the traitor rulesets always possible anyway var/cost_difference = rule.cost-(mode.threat_level-mode.threat) /* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to pick this particular ruleset. @@ -157,7 +183,7 @@ Property weights are added to the config weight of the ruleset. They are: for (var/datum/dynamic_ruleset/latejoin/rule in mode.latejoin_rules) if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level - mode.threat)) // Classic secret : only autotraitor/minor roles - if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET))) continue // No stacking : only one round-ender, unless threat level > stacking_limit. if (mode.threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) @@ -172,7 +198,7 @@ Property weights are added to the config weight of the ruleset. They are: if(property in rule.property_weights) property_weight += rule.property_weights[property] * property_weights[property] var/threat_weight = 1 - if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)) + if(!(rule.flags & TRAITOR_RULESET)) var/cost_difference = rule.cost-(mode.threat_level-mode.threat) threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,abs(cost_difference),0))) if(cost_difference > 0) @@ -191,10 +217,15 @@ Property weights are added to the config weight of the ruleset. They are: weight = 1 event_frequency_lower = 2 MINUTES event_frequency_upper = 10 MINUTES + max_chaos = 50 + soft_antag_ratio_cap = 1 flags = WAROPS_ALWAYS_ALLOWED | FORCE_IF_WON min_players = 30 var/refund_cooldown = 0 +/datum/dynamic_storyteller/chaotic/minor_start_chance() + return 0 + /datum/dynamic_storyteller/chaotic/do_process() if(refund_cooldown < world.time) mode.create_threat(20) @@ -210,11 +241,15 @@ Property weights are added to the config weight of the ruleset. They are: desc = "Modes where the crew must band together. Nukies, xenos, blob. Only one antag threat at once." curve_centre = 2 curve_width = 1.5 - weight = 2 + weight = 4 + max_chaos = 75 min_players = 20 flags = WAROPS_ALWAYS_ALLOWED | USE_PREV_ROUND_WEIGHTS property_weights = list("valid" = 3, "trust" = 5) +/datum/dynamic_storyteller/team/minor_start_chance() + return 0 + /datum/dynamic_storyteller/team/should_inject_antag(dry_run = FALSE) return (mode.current_players[CURRENT_LIVING_ANTAGS].len ? FALSE : ..()) @@ -228,10 +263,15 @@ Property weights are added to the config weight of the ruleset. They are: flags = WAROPS_ALWAYS_ALLOWED property_weights = list("valid" = 1, "conversion" = 20) +/datum/dynamic_storyteller/conversion/minor_start_chance() + return 0 + /datum/dynamic_storyteller/random name = "Random" config_tag = "random" weight = 1 + max_chaos = 60 + soft_antag_ratio_cap = 1 desc = "No weighting at all; every ruleset has the same chance of happening. Cooldowns vary wildly. As random as it gets." /datum/dynamic_storyteller/random/on_start() @@ -244,6 +284,9 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/random/should_inject_antag() return prob(50) +/datum/dynamic_storyteller/random/minor_start_chance() + return 20 + /datum/dynamic_storyteller/random/roundstart_draft() var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/roundstart/rule in mode.roundstart_rules) @@ -254,12 +297,22 @@ Property weights are added to the config weight of the ruleset. They are: drafted_rules[rule] = 1 return drafted_rules +/datum/dynamic_storyteller/random/minor_rule_draft() + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/minor/rule in mode.minor_rules) + if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) + rule.candidates = mode.candidates.Copy() + rule.trim_candidates() + if (rule.ready() && rule.candidates.len > 0) + drafted_rules[rule] = 1 + return drafted_rules + /datum/dynamic_storyteller/random/midround_draft() var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/midround/rule in mode.midround_rules) if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) // Classic secret : only autotraitor/minor roles - if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET))) continue rule.trim_candidates() if (rule.ready()) @@ -271,7 +324,7 @@ Property weights are added to the config weight of the ruleset. They are: for (var/datum/dynamic_ruleset/latejoin/rule in mode.latejoin_rules) if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) // Classic secret : only autotraitor/minor roles - if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET))) continue // No stacking : only one round-ender, unless threat level > stacking_limit. if (mode.threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) @@ -286,8 +339,8 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/story name = "Story" config_tag = "story" - desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies. Has a buildup-climax-falling action threat curve." - weight = 2 + desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies." + weight = 4 curve_width = 2 flags = USE_PREV_ROUND_WEIGHTS property_weights = list("story_potential" = 2) @@ -295,6 +348,7 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/classic name = "Classic" config_tag = "classic" + weight = 8 desc = "No special antagonist weights. Good variety, but not like random. Uses your chaos preference to weight." flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS @@ -302,12 +356,25 @@ Property weights are added to the config weight of the ruleset. They are: name = "Intrigue" config_tag = "intrigue" desc = "Antags that instill distrust in the crew. Traitors, bloodsuckers." - weight = 2 + weight = 4 curve_width = 2 dead_player_weight = 2 flags = USE_PREV_ROUND_WEIGHTS property_weights = list("trust" = -2) +/datum/dynamic_storyteller/intrigue/minor_start_chance() + return 100 - mode.threat_level + +/datum/dynamic_storyteller/grabbag + name = "Grab Bag" + config_tag = "grabbag" + desc = "Crew antags (e.g. traitor, changeling, bloodsucker, heretic) only at round start, all mixed together." + weight = 4 + flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS + +/datum/dynamic_storyteller/grabbag/minor_start_chance() + return 100 + /datum/dynamic_storyteller/liteextended name = "Calm" config_tag = "calm" @@ -315,16 +382,22 @@ Property weights are added to the config weight of the ruleset. They are: curve_centre = -3 curve_width = 0.5 flags = NO_ASSASSIN - weight = 1 + min_chaos = 30 + weight = 3 dead_player_weight = 5 + soft_antag_ratio_cap = 8 property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "conversion" = -10) +/datum/dynamic_storyteller/liteextended/minor_start_chance() + return 90 + /datum/dynamic_storyteller/no_antag name = "Extended" config_tag = "semiextended" desc = "No standard antags." curve_centre = -5 curve_width = 0.5 + min_chaos = 40 flags = NO_ASSASSIN | FORCE_IF_WON weight = 1 property_weights = list("extended" = 2) diff --git a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm index 20a129a5a3..a3e3c54dce 100644 --- a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm +++ b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm @@ -41,7 +41,6 @@ break var/datum/mind/cultie = antag_pick(antag_candidates) antag_candidates -= cultie - cultie.special_role = ROLE_HERETIC cultie.restricted_roles = restricted_jobs culties += cultie diff --git a/code/game/gamemodes/gangs/dominator_countdown.dm b/code/game/gamemodes/gangs/dominator_countdown.dm index c6ae610e37..3b61a07829 100644 --- a/code/game/gamemodes/gangs/dominator_countdown.dm +++ b/code/game/gamemodes/gangs/dominator_countdown.dm @@ -10,4 +10,4 @@ else if(D.gang && D.gang.domination_time != NOT_DOMINATING) return D.gang.domination_time_remaining() else - return "OFFLINE" \ No newline at end of file + return "OFFLINE" diff --git a/code/game/gamemodes/gangs/gang.dm b/code/game/gamemodes/gangs/gang.dm index a766dda57c..a4483ca3b8 100644 --- a/code/game/gamemodes/gangs/gang.dm +++ b/code/game/gamemodes/gangs/gang.dm @@ -197,7 +197,7 @@ if(gangtool)//Here is where all of the text occurs when a gang boss first spawns in. var/obj/item/device/gangtool/G = new() - var/where = H.equip_in_one_of_slots(G, slots) + var/where = H.equip_in_one_of_slots(G, slots, critical = TRUE) if (!where) to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a Gangtool.") else @@ -207,7 +207,7 @@ if(pen) var/obj/item/pen/gang/T = new() - var/where2 = H.equip_in_one_of_slots(T, slots) + var/where2 = H.equip_in_one_of_slots(T, slots, critical = TRUE) if (!where2) to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start.") else @@ -215,7 +215,7 @@ if(spraycan) var/obj/item/toy/crayon/spraycan/gang/SC = new(null,gang) - var/where3 = H.equip_in_one_of_slots(SC, slots) + var/where3 = H.equip_in_one_of_slots(SC, slots, critical = TRUE) if (!where3) to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start.") else @@ -223,7 +223,7 @@ if(hud) var/obj/item/clothing/glasses/hud/security/chameleon/C = new(null,gang) - var/where4 = H.equip_in_one_of_slots(C, slots) + var/where4 = H.equip_in_one_of_slots(C, slots, critical = TRUE) if (!where4) to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD.") else diff --git a/code/game/gamemodes/gangs/gang_decals.dm b/code/game/gamemodes/gangs/gang_decals.dm index a37b4cb63b..75d8d459ef 100644 --- a/code/game/gamemodes/gangs/gang_decals.dm +++ b/code/game/gamemodes/gangs/gang_decals.dm @@ -35,4 +35,4 @@ return ..() /obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/T) - return isspaceturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T) \ No newline at end of file + return isspaceturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T) diff --git a/code/game/gamemodes/gangs/gang_hud.dm b/code/game/gamemodes/gangs/gang_hud.dm index 3fde6d4123..825d361ab0 100644 --- a/code/game/gamemodes/gangs/gang_hud.dm +++ b/code/game/gamemodes/gangs/gang_hud.dm @@ -31,4 +31,4 @@ var/image/holder = M.hud_list[ANTAG_HUD] if(holder) holder.color = null - ..() \ No newline at end of file + ..() diff --git a/code/game/gamemodes/gangs/gang_items.dm b/code/game/gamemodes/gangs/gang_items.dm index 7d6ecd00f6..d1cf006600 100644 --- a/code/game/gamemodes/gangs/gang_items.dm +++ b/code/game/gamemodes/gangs/gang_items.dm @@ -133,7 +133,7 @@ icon_state = "knuckles" w_class = 3 -datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang member anyways? +/datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang member anyways? name = "Cool Sunglasses" id = "glasses" cost = 5 @@ -313,13 +313,13 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m permeability_coefficient = 0.01 clothing_flags = NOSLIP -datum/gang_item/equipment/shield +/datum/gang_item/equipment/shield name = "Riot Shield" id = "riot_shield" cost = 25 item_path = /obj/item/shield/riot -datum/gang_item/equipment/gangsheild +/datum/gang_item/equipment/gangsheild name = "Tower Shield" id = "metal" cost = 45 //High block of melee and even higher for bullets diff --git a/code/game/gamemodes/gangs/gang_pen.dm b/code/game/gamemodes/gangs/gang_pen.dm index b7bd6cca5e..09cea5cecb 100644 --- a/code/game/gamemodes/gangs/gang_pen.dm +++ b/code/game/gamemodes/gangs/gang_pen.dm @@ -56,4 +56,4 @@ H.silent = max(H.silent, 5) H.DefaultCombatKnockdown(100) gangster_mind.add_antag_datum(/datum/antagonist/gang, gang) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/game/gamemodes/gangs/gangtool.dm b/code/game/gamemodes/gangs/gangtool.dm index e99455bcd5..32272ae51a 100644 --- a/code/game/gamemodes/gangs/gangtool.dm +++ b/code/game/gamemodes/gangs/gangtool.dm @@ -256,4 +256,4 @@ outfits = TRUE /obj/item/device/gangtool/spare/lt - promotable = TRUE \ No newline at end of file + promotable = TRUE diff --git a/code/game/gamemodes/gangs/implant_gang.dm b/code/game/gamemodes/gangs/implant_gang.dm index ee91928845..cad54d4fc1 100644 --- a/code/game/gamemodes/gangs/implant_gang.dm +++ b/code/game/gamemodes/gangs/implant_gang.dm @@ -58,4 +58,4 @@ qdel(src) return imp = new /obj/item/implant/gang(src,gang) - .=..() \ No newline at end of file + .=..() diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 795508320b..5cfec2376a 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -46,17 +46,17 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event var/startx switch(startSide) if(NORTH) - starty = world.maxy-(TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + starty = world.maxy-(TRANSITIONEDGE+2) + startx = rand((TRANSITIONEDGE+2), world.maxx-(TRANSITIONEDGE+2)) if(EAST) - starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - startx = world.maxx-(TRANSITIONEDGE+1) + starty = rand((TRANSITIONEDGE+2),world.maxy-(TRANSITIONEDGE+2)) + startx = world.maxx-(TRANSITIONEDGE+2) if(SOUTH) - starty = (TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + starty = (TRANSITIONEDGE+2) + startx = rand((TRANSITIONEDGE+2), world.maxx-(TRANSITIONEDGE+2)) if(WEST) - starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - startx = (TRANSITIONEDGE+1) + starty = rand((TRANSITIONEDGE+2), world.maxy-(TRANSITIONEDGE+2)) + startx = (TRANSITIONEDGE+2) . = locate(startx, starty, Z) /proc/spaceDebrisFinishLoc(startSide, Z) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 10b92d9655..0ee07951a9 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -76,6 +76,13 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/proc/check_completion() return completed +/* +Used during the round to check if an objective has already been completed, generally should have harsher requirements that the default objective (no true because of short afk, etc) +If not set, defaults to check_completion instead. Set it. It's used by cryo. +*/ +/datum/objective/proc/check_midround_completion() + return check_completion() + /datum/objective/proc/is_unique_objective(possible_target) var/list/datum/mind/owners = get_owners() for(var/datum/mind/M in owners) @@ -159,7 +166,7 @@ GLOBAL_LIST_EMPTY(objectives) var/list/slots = list("backpack" = SLOT_IN_BACKPACK) for(var/eq_path in special_equipment) var/obj/O = new eq_path - H.equip_in_one_of_slots(O, slots) + H.equip_in_one_of_slots(O, slots, critical = TRUE) /datum/objective/assassinate name = "assasinate" @@ -175,6 +182,9 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/assassinate/check_completion() return !considered_alive(target) || considered_afk(target) +/datum/objective/assassinate/check_midround_completion() + return FALSE //They need to be dead at the end of the round, silly! + /datum/objective/assassinate/update_explanation_text() ..() if(target && target.current) @@ -201,13 +211,16 @@ GLOBAL_LIST_EMPTY(objectives) return won || ..() /datum/objective/assassinate/once/process() - won = check_midround_completion() + won = tick_check_completion() if(won) STOP_PROCESSING(SSprocessing,src) -/datum/objective/assassinate/once/proc/check_midround_completion() +/datum/objective/assassinate/once/proc/tick_check_completion() return won || !considered_alive(target) //The target afking / logging off for a bit during the round doesn't complete it, but them being afk at roundend does. +/datum/objective/assassinate/once/check_midround_completion() + return won //If they cryoed, only keep it if we already won + /datum/objective/assassinate/internal var/stolen = 0 //Have we already eliminated this target? @@ -233,6 +246,9 @@ GLOBAL_LIST_EMPTY(objectives) var/turf/T = get_turf(target.current) return !T || !is_station_level(T.z) +/datum/objective/mutiny/check_midround_completion() + return FALSE + /datum/objective/mutiny/update_explanation_text() ..() if(target && target.current) @@ -252,7 +268,10 @@ GLOBAL_LIST_EMPTY(objectives) return target /datum/objective/maroon/check_completion() - return !target || !considered_alive(target) || (!target.current.onCentCom() && !target.current.onSyndieBase()) + return !target || !considered_alive(target) || (!target.current?.onCentCom() && !target.current?.onSyndieBase()) + +/datum/objective/maroon/check_midround_completion() + return FALSE /datum/objective/maroon/update_explanation_text() if(target && target.current) @@ -313,6 +332,9 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/protect/check_completion() return !target || considered_alive(target, enforce_human = human_check) +/datum/objective/protect/check_midround_completion() + return FALSE //Nuh uh, you get a new objective + /datum/objective/protect/update_explanation_text() ..() if(target && target.current) @@ -412,6 +434,9 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/breakout/check_completion() return !target || considered_escaped(target) +/datum/objective/breakout/check_midround_completion() + return FALSE + /datum/objective/breakout/find_target_by_role(role, role_type=0, invert=0) if(!invert) target_role_type = role_type @@ -430,7 +455,7 @@ GLOBAL_LIST_EMPTY(objectives) var/target_real_name // Has to be stored because the target's real_name can change over the course of the round var/target_missing_id -/datum/objective/escape/escape_with_identity/find_target() +/datum/objective/escape/escape_with_identity/find_target(dupe_search_range, blacklist) target = ..() update_explanation_text() @@ -462,6 +487,9 @@ GLOBAL_LIST_EMPTY(objectives) return TRUE return FALSE +/datum/objective/escape/escape_with_identity/check_midround_completion() + return FALSE + /datum/objective/escape/escape_with_identity/admin_edit(mob/admin) admin_simple_target_pick(admin) @@ -525,7 +553,7 @@ GLOBAL_LIST_EMPTY(possible_items) for(var/I in subtypesof(/datum/objective_item/steal)) new I -/datum/objective/steal/find_target() +/datum/objective/steal/find_target(dupe_search_range, blacklist) var/list/datum/mind/owners = get_owners() var/approved_targets = list() check_items: @@ -603,7 +631,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) for(var/I in subtypesof(/datum/objective_item/special) + subtypesof(/datum/objective_item/stack)) new I -/datum/objective/steal/special/find_target() +/datum/objective/steal/special/find_target(dupe_search_range, blacklist) return set_target(pick(GLOB.possible_items_special)) /datum/objective/steal/exchange @@ -622,6 +650,8 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Acquire [targetinfo.name] held by [target.current.real_name], the [target.assigned_role] and syndicate agent" steal_target = targetinfo.targetitem +/datum/objective/steal/exchange/check_midround_completion() + return FALSE /datum/objective/steal/exchange/update_explanation_text() ..() @@ -814,7 +844,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) name = "destroy AI" martyr_compatible = 1 -/datum/objective/destroy/find_target() +/datum/objective/destroy/find_target(dupe_search_range, blacklist) var/list/possible_targets = active_ais(1) var/mob/living/silicon/ai/target_ai = pick(possible_targets) target = target_ai.mind @@ -826,6 +856,9 @@ GLOBAL_LIST_EMPTY(possible_items_special) return target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey //Borgs/brains/AIs count as dead for traitor objectives. return TRUE +/datum/objective/destroy/check_midround_completion() + return FALSE + /datum/objective/destroy/update_explanation_text() ..() if(target && target.current) @@ -1091,7 +1124,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/hoard/heirloom name = "steal heirloom" -/datum/objective/hoard/heirloom/find_target() +/datum/objective/hoard/heirloom/find_target(dupe_search_range, blacklist) set_target(pick(GLOB.family_heirlooms)) GLOBAL_LIST_EMPTY(traitor_contraband) @@ -1108,7 +1141,7 @@ GLOBAL_LIST_EMPTY(cult_contraband) if(!GLOB.cult_contraband.len) GLOB.cult_contraband = list(/obj/item/clockwork/slab,/obj/item/clockwork/component/belligerent_eye,/obj/item/clockwork/component/belligerent_eye/lens_gem,/obj/item/shuttle_curse,/obj/item/cult_shift) -/datum/objective/hoard/collector/find_target() +/datum/objective/hoard/collector/find_target(dupe_search_range, blacklist) var/obj/item/I var/I_type if(prob(50)) @@ -1119,7 +1152,7 @@ GLOBAL_LIST_EMPTY(cult_contraband) I.forceMove(get_turf(owner)) if(ishuman(owner)) var/mob/living/carbon/human/H = owner - H.equip_in_one_of_slots(I, list("backpack" = SLOT_IN_BACKPACK)) + H.equip_in_one_of_slots(I, list("backpack" = SLOT_IN_BACKPACK), critical = TRUE) hoarded_item = I @@ -1139,7 +1172,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages) for(var/I in subtypesof(/datum/sabotage_objective)) new I -/datum/objective/sabotage/find_target() +/datum/objective/sabotage/find_target(dupe_search_range, blacklist) var/list/datum/mind/owners = get_owners() var/approved_targets = list() check_sabotages: diff --git a/code/game/gamemodes/objective_sabotage.dm b/code/game/gamemodes/objective_sabotage.dm index c8f1ef4713..1fbebfdac4 100644 --- a/code/game/gamemodes/objective_sabotage.dm +++ b/code/game/gamemodes/objective_sabotage.dm @@ -33,6 +33,7 @@ /datum/sabotage_objective/processing/check_conditions() return won +/* /datum/sabotage_objective/processing/power_sink name = "Drain at least 100 megajoules of power using a power sink." sabotage_type = "powersink" @@ -44,6 +45,7 @@ for(var/s in GLOB.power_sinks) var/obj/item/powersink/sink = s won = max(won,sink.power_drained/1e8) +*/ /obj/item/paper/guides/antag/supermatter_sabotage info = "Ways to sabotage a supermatter:
    \ diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 6bac63dff0..82209221ce 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -82,7 +82,7 @@ O.add_fingerprint(user) update_icon() - else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + else if(O.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) if(stat & BROKEN) if(!O.tool_start_check(user, amount=0)) return diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index bced9db61f..06e1635656 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -145,8 +145,8 @@ /obj/machinery/sleeper/ui_state(mob/user) if(controls_inside) - return GLOB.contained_state - return GLOB.default_state + return GLOB.default_state + return GLOB.notcontained_state /obj/machinery/sleeper/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -209,6 +209,7 @@ data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss() data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN) + data["occupant"]["is_robotic_organism"] = HAS_TRAIT(mob_occupant, TRAIT_ROBOTIC_ORGANISM) data["occupant"]["reagents"] = list() if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 1b1fa949a2..f46169f72e 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -18,9 +18,10 @@ GLOBAL_LIST_EMPTY(announcement_systems) var/obj/item/radio/headset/radio var/arrival = "%PERSON has signed up as %RANK" - var/arrivalToggle = 1 + var/arrivalToggle = TRUE var/newhead = "%PERSON, %RANK, is the department head." - var/newheadToggle = 1 + var/newheadToggle = TRUE + var/cryostorage = "%PERSON, %RANK, has been moved into cryogenic storage." // this shouldnt be changed var/greenlight = "Light_Green" var/pinklight = "Light_Pink" @@ -84,6 +85,8 @@ GLOBAL_LIST_EMPTY(announcement_systems) message = CompileText(arrival, user, rank) else if(message_type == "NEWHEAD" && newheadToggle) message = CompileText(newhead, user, rank) + else if(message_type == "CRYOSTORAGE") + message = CompileText(cryostorage, user, rank) else if(message_type == "ARRIVALS_BROKEN") message = "The arrivals shuttle has been damaged. Docking for repairs..." @@ -111,7 +114,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) . = ..() if(.) return - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return if(stat & BROKEN) visible_message("[src] buzzes.", "You hear a faint buzz.") @@ -144,7 +147,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) . = attack_ai(user) /obj/machinery/announcement_system/attack_ai(mob/user) - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user))) return if(stat & BROKEN) to_chat(user, "[src]'s firmware appears to be malfunctioning!") @@ -164,7 +167,9 @@ GLOBAL_LIST_EMPTY(announcement_systems) act_up() /obj/machinery/announcement_system/emag_act() + . = ..() if(obj_flags & EMAGGED) return obj_flags |= EMAGGED act_up() + return TRUE diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index 28733a6b6c..6fdeae61a1 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -59,7 +59,7 @@ else if(istype(O, /obj/item/bodypart)) var/obj/item/bodypart/B = O - if(B.status != BODYPART_ROBOTIC) + if(!B.is_robotic_limb(FALSE)) to_chat(user, "The machine only accepts cybernetics!") return if(storedpart) @@ -73,7 +73,7 @@ O.add_fingerprint(user) update_icon() - else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + else if(O.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) if(obj_integrity < max_integrity) if(!O.tool_start_check(user, amount=0)) return diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index b5031b68a1..0de76694c0 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -65,7 +65,7 @@ . += "button-board" /obj/machinery/button/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(panel_open || allowed(user)) default_deconstruction_screwdriver(user, "button-open", "[skin]",W) update_icon() @@ -93,7 +93,7 @@ req_access = board.accesses to_chat(user, "You add [W] to the button.") - if(!device && !board && istype(W, /obj/item/wrench)) + if(!device && !board && W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start unsecuring the button frame...") W.play_tool_sound(src) if(W.use_tool(src, user, 40)) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index b6af0600e4..ba54822140 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -39,7 +39,7 @@ switch(state) if(1) // State 1 - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You weld the assembly securely into place.") setAnchored(TRUE) @@ -56,7 +56,7 @@ return return - else if(istype(W, /obj/item/weldingtool)) + else if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You unweld the assembly from its place.") @@ -133,7 +133,9 @@ qdel(src) return TRUE -/obj/structure/camera_assembly/proc/weld(obj/item/weldingtool/W, mob/living/user) +/obj/structure/camera_assembly/proc/weld(obj/item/W, mob/living/user) + if(!W.tool_behaviour == TOOL_WELDER) + return if(!W.tool_start_check(user, amount=0)) return FALSE to_chat(user, "You start to weld \the [src]...") diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index d103e2a856..af5093d6ca 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -75,3 +75,38 @@ if (!area_motion) if(isliving(AM)) newTarget(AM) + +/obj/machinery/camera/motion/thunderdome + name = "entertainment camera" + network = list("thunder") + c_tag = "Arena" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF | FREEZE_PROOF + +/obj/machinery/camera/motion/thunderdome/Initialize() + . = ..() + proximity_monitor.SetRange(7) + +/obj/machinery/camera/motion/thunderdome/HasProximity(atom/movable/AM as mob|obj) + if (!isliving(AM) || get_area(AM) != get_area(src)) + return + localMotionTargets |= WEAKREF(AM) + if (!detectTime) + for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines) + TV.notify(TRUE) + detectTime = world.time + 30 SECONDS + +/obj/machinery/camera/motion/thunderdome/process() + if (!detectTime) + return + + for (var/datum/weakref/targetref in localMotionTargets) + var/mob/target = targetref.resolve() + if(QDELETED(target) || target.stat == DEAD || get_dist(src, target) > 7 || get_area(src) != get_area(target)) + localMotionTargets -= targetref + + if (localMotionTargets.len) + detectTime = world.time + 30 SECONDS + else if (world.time > detectTime) + detectTime = 0 + for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines) + TV.notify(FALSE) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index effd70e9ab..25445f0d1c 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -10,7 +10,7 @@ circuit = /obj/item/circuitboard/machine/cell_charger pass_flags = PASSTABLE var/obj/item/stock_parts/cell/charging = null - var/charge_rate = 500 + var/recharge_coeff = 1 /obj/machinery/cell_charger/update_overlays() . += ..() @@ -28,9 +28,10 @@ . = ..() . += "There's [charging ? "a" : "no"] cell in the charger." if(charging) - . += "Current charge: [round(charging.percent(), 1)]%." + var/obj/item/stock_parts/cell/C = charging.get_cell() + . += "Current charge: [C.percent()]%." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Charge rate at [charge_rate]J per cycle." + . += "The status display reads: Charge rate at [recharge_coeff*10]J per cycle." /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell) && !panel_open) @@ -122,17 +123,18 @@ charging.emp_act(severity) /obj/machinery/cell_charger/RefreshParts() - charge_rate = 500 for(var/obj/item/stock_parts/capacitor/C in component_parts) - charge_rate *= C.rating + recharge_coeff = C.rating /obj/machinery/cell_charger/process() if(!charging || !anchored || (stat & (BROKEN|NOPOWER))) return - if(charging.percent() >= 100) - return - use_power(charge_rate) - charging.give(charge_rate) //this is 2558, efficient batteries exist + if(charging) + var/obj/item/stock_parts/cell/C = charging.get_cell() + if(C) + if(C.charge < C.maxcharge) + C.give(C.chargerate * recharge_coeff) + use_power(250 * recharge_coeff) update_icon() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 60a310e9d5..e95543cffb 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -297,22 +297,20 @@ if(default_deconstruction_crowbar(W)) return - if(istype(W, /obj/item/multitool)) - var/obj/item/multitool/P = W - - if(istype(P.buffer, /obj/machinery/computer/cloning)) - if(get_area(P.buffer) != get_area(src)) + if(W.tool_behaviour == TOOL_MULTITOOL) + if(istype(W.buffer, /obj/machinery/computer/cloning)) + if(get_area(W.buffer) != get_area(src)) to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") - P.buffer = null + W.buffer = null return - to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") - var/obj/machinery/computer/cloning/comp = P.buffer + to_chat(user, "-% Successfully linked [W.buffer] with [src] %-") + var/obj/machinery/computer/cloning/comp = W.buffer if(connected) connected.DetachCloner(src) comp.AttachCloner(src) else - P.buffer = src - to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") + W.buffer = src + to_chat(user, "-% Successfully stored [REF(W.buffer)] [W.buffer] in buffer %-") return var/mob/living/mob_occupant = occupant diff --git a/code/game/machinery/colormate.dm b/code/game/machinery/colormate.dm new file mode 100644 index 0000000000..1f1c16248c --- /dev/null +++ b/code/game/machinery/colormate.dm @@ -0,0 +1,249 @@ +/obj/machinery/gear_painter + name = "\improper Color Mate" + desc = "A machine to give your apparel a fresh new color! Recommended to use with white items for best results." + icon = 'icons/obj/vending.dmi' + icon_state = "colormate" + density = TRUE + anchored = TRUE + circuit = /obj/item/circuitboard/machine/colormate + var/atom/movable/inserted + var/activecolor = "#FFFFFF" + var/list/color_matrix_last + var/matrix_mode = FALSE + /// Allow holder'd mobs + var/allow_mobs = TRUE + /// Minimum lightness for normal mode + var/minimum_normal_lightness = 50 + /// Minimum lightness for matrix mode, tested using 4 test colors of full red, green, blue, white. + var/minimum_matrix_lightness = 75 + /// Minimum matrix tests that must pass for something to be considered a valid color (see above) + var/minimum_matrix_tests = 2 + var/list/allowed_types = list( + /obj/item/clothing, + /obj/item/storage/backpack, + /obj/item/storage/belt + ) + +/obj/machinery/gear_painter/Initialize(mapload) + . = ..() + color_matrix_last = list( + 1, 0, 0, + 0, 1, 0, + 0, 0, 1, + 0, 0, 0 + ) + +/obj/machinery/gear_painter/update_icon_state() + if(panel_open) + icon_state = "colormate_open" + else if(!is_operational()) + icon_state = "colormate_off" + else if(inserted) + icon_state = "colormate_active" + else + icon_state = "colormate" + +/obj/machinery/gear_painter/Destroy() + inserted.forceMove(drop_location()) + return ..() + +/obj/machinery/gear_painter/attackby(obj/item/I, mob/living/user) + if(inserted) + to_chat(user, "The machine is already loaded.") + return + if(default_deconstruction_screwdriver(user, "colormate_open", "colormate", I)) + return + if(default_deconstruction_crowbar(I)) + return + if(default_unfasten_wrench(user, I, 40)) + return + if(user.a_intent == INTENT_HARM) + return ..() + if(allow_mobs && istype(I, /obj/item/clothing/head/mob_holder)) + var/obj/item/clothing/head/mob_holder/H = I + var/mob/victim = H.held_mob + if(!user.transferItemToLoc(I, src)) + to_chat(user, "[I] is stuck to your hand!") + return + if(!QDELETED(H)) + H.release() + insert_mob(victim, user) + + if(is_type_in_list(I, allowed_types) && is_operational()) + if(!user.transferItemToLoc(I, src)) + to_chat(user, "[I] is stuck to your hand!") + return + if(QDELETED(I)) + return + user.visible_message("[user] inserts [I] into [src]'s receptable.") + + inserted = I + update_icon() + else + return ..() + +/obj/machinery/gear_painter/proc/insert_mob(mob/victim, mob/user) + if(inserted) + return + if(user) + visible_message("[user] stuffs [victim] into [src]!") + inserted = victim + inserted.forceMove(src) + +/obj/machinery/gear_painter/AllowDrop() + return FALSE + +/obj/machinery/gear_painter/handle_atom_del(atom/movable/AM) + if(AM == inserted) + inserted = null + return ..() + +/obj/machinery/gear_painter/AltClick(mob/user) + . = ..() + if(!user.CanReach(src)) + return + if(!inserted) + return + to_chat(user, "You remove [inserted] from [src]") + inserted.forceMove(drop_location()) + inserted = null + update_icon() + updateUsrDialog() + +/obj/machinery/gear_painter/ui_interact(mob/user) + if(!is_operational()) + return + user.set_machine(src) + var/list/dat = list("Color Mate Control Panel
    ") + if(!inserted) + dat += "No item inserted." + else + dat += "Item inserted: [inserted]
    " + dat += "Matrix mode: [matrix_mode? "On" : "Off"]" + if(!matrix_mode) + dat += "Select new color.
    " + dat += "Color: " + dat += "Apply new color.

    " + else + // POGGERS +#define MATRIX_FIELD(field, default) " " + dat += "
    " + dat += "" + dat += "[cm] is far too dark (min lightness [minimum_normal_lightness]!") + return FALSE + return TRUE + else // matrix + // We test using full red, green, blue, and white + // A predefined number of them must pass to be considered valid + var/passed = 0 +#define COLORTEST(thestring, thematrix) passed += (ReadHSV(RGBtoHSV(RGBMatrixTransform(thestring, thematrix)))[3] >= minimum_matrix_lightness) + COLORTEST("FF0000", cm) + COLORTEST("00FF00", cm) + COLORTEST("0000FF", cm) + COLORTEST("FFFFFF", cm) +#undef COLORTEST + if(passed < minimum_matrix_tests) + to_chat(user, "[english_list(color)] is not allowed (pased [passed] out of 4, minimum [minimum_matrix_tests], minimum lightness [minimum_matrix_lightness]).") + return FALSE + return TRUE diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index a2fdc2336f..b837553b38 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -88,6 +88,7 @@ data["patient"]["fireLoss"] = patient.getFireLoss() data["patient"]["toxLoss"] = patient.getToxLoss() data["patient"]["oxyLoss"] = patient.getOxyLoss() + data["patient"]["is_robotic_organism"] = HAS_TRAIT(patient, TRAIT_ROBOTIC_ORGANISM) if(patient.surgeries.len) data["procedures"] = list() for(var/datum/surgery/procedure in patient.surgeries) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 8ebb64097d..bd7ae64e16 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -10,8 +10,8 @@ var/mob/living/silicon/ai/occupier = null var/active = FALSE -/obj/machinery/computer/aifixer/attackby(obj/I, mob/user, params) - if(occupier && istype(I, /obj/item/screwdriver)) +/obj/machinery/computer/aifixer/attackby(obj/item/I, mob/user, params) + if(occupier && I.tool_behaviour == TOOL_SCREWDRIVER) if(stat & (NOPOWER|BROKEN)) to_chat(user, "The screws on [name]'s screen won't budge.") else diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index c14837b8e3..804025961b 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -151,7 +151,14 @@ var/obj/machinery/power/apc/target = locate(ref) in GLOB.apcs_list if(!target) return - target.vars[type] = target.setsubsystem(text2num(value)) + value = target.setsubsystem(text2num(value)) + switch(type) // Sanity check + if("equipment", "lighting", "environ") + target.vars[type] = value + else + message_admins("Warning: possible href exploit by [key_name(usr)] - attempted to set [type] on [target] to [value]") + log_game("Warning: possible href exploit by [key_name(usr)] - attempted to set [type] on [target] to [value]") + return target.update_icon() target.update() var/setTo = "" diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm index a6c98c6c9c..96f224f4cf 100644 --- a/code/game/machinery/computer/arcade/battle.dm +++ b/code/game/machinery/computer/arcade/battle.dm @@ -60,7 +60,7 @@ blocked = TRUE var/attackamt = rand(2,6) temp = "You attack for [attackamt] damage!" - playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3) updateUsrDialog() if(turtle > 0) turtle-- @@ -74,7 +74,7 @@ var/pointamt = rand(1,3) var/healamt = rand(6,8) temp = "You use [pointamt] magic to heal for [healamt] damage!" - playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3) updateUsrDialog() turtle++ @@ -89,7 +89,7 @@ blocked = TRUE var/chargeamt = rand(4,7) temp = "You regain [chargeamt] points" - playsound(loc, 'sound/arcade/mana.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3) player_mp += chargeamt if(turtle > 0) turtle-- @@ -124,7 +124,7 @@ if(!gameover) gameover = TRUE temp = "[enemy_name] has fallen! Rejoice!" - playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3) if(obj_flags & EMAGGED) new /obj/effect/spawner/newbomb/timer/syndicate(loc) @@ -141,13 +141,13 @@ else if ((obj_flags & EMAGGED) && (turtle >= 4)) var/boomamt = rand(5,10) temp = "[enemy_name] throws a bomb, exploding you for [boomamt] damage!" - playsound(loc, 'sound/arcade/boom.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/boom.ogg', 50, TRUE, extrarange = -3) player_hp -= boomamt else if ((enemy_mp <= 5) && (prob(70))) var/stealamt = rand(2,3) temp = "[enemy_name] steals [stealamt] of your power!" - playsound(loc, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3) player_mp -= stealamt updateUsrDialog() @@ -155,27 +155,27 @@ gameover = TRUE sleep(turn_speed) temp = "You have been drained! GAME OVER" - playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3) if(obj_flags & EMAGGED) usr.gib() SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "mana", (obj_flags & EMAGGED ? "emagged":"normal"))) else if ((enemy_hp <= 10) && (enemy_mp > 4)) temp = "[enemy_name] heals for 4 health!" - playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3) enemy_hp += 4 enemy_mp -= 4 else var/attackamt = rand(3,6) temp = "[enemy_name] attacks for [attackamt] damage!" - playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3) player_hp -= attackamt if ((player_mp <= 0) || (player_hp <= 0)) gameover = TRUE temp = "You have been crushed! GAME OVER" - playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3) if(obj_flags & EMAGGED) usr.gib() SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (obj_flags & EMAGGED ? "emagged":"normal"))) @@ -212,4 +212,4 @@ name = "Outbomb Cuban Pete" updateUsrDialog() - return TRUE \ No newline at end of file + return TRUE diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm index a9c9b5dfd9..3f7ef778b0 100644 --- a/code/game/machinery/computer/arcade/minesweeper.dm +++ b/code/game/machinery/computer/arcade/minesweeper.dm @@ -78,7 +78,7 @@ columns = 0 mine_placed = 0 if(href_list["Easy"]) - playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10) + playsound(loc, startup_sound, 50, FALSE, extrarange = -3) flag_text = "OFF" game_status = MINESWEEPER_GAME_PLAYING reset_board = TRUE @@ -87,7 +87,7 @@ columns = 10 mine_limit = 10 if(href_list["Intermediate"]) - playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10) + playsound(loc, startup_sound, 50, FALSE, extrarange = -3) flag_text = "OFF" game_status = MINESWEEPER_GAME_PLAYING reset_board = TRUE @@ -96,7 +96,7 @@ columns = 17 mine_limit = 40 if(href_list["Hard"]) - playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10) + playsound(loc, startup_sound, 50, FALSE, extrarange = -3) flag_text = "OFF" game_status = MINESWEEPER_GAME_PLAYING reset_board = TRUE @@ -110,9 +110,9 @@ game_status = MINESWEEPER_GAME_PLAYING reset_board = TRUE difficulty = "Custom" - playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10) + playsound(loc, startup_sound, 50, FALSE, extrarange = -3) if(href_list["Flag"]) - playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3) if(!flagging) flagging = TRUE flag_text = "ON" @@ -122,10 +122,10 @@ if(game_status == MINESWEEPER_GAME_MAIN_MENU) if(CHECK_BITFIELD(obj_flags, EMAGGED)) - playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, FALSE, extrarange = -3) web += "Explode in the game, explode in real life!
    What difficulty do you want to play?



    Easy (9x9 board, 10 mines)
    Intermediate (16x16 board, 40 mines)
    Hard (16x30 board, 99 mines)
    Custom" else - playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, FALSE, extrarange = -3) web += web_difficulty_menu if(game_status == MINESWEEPER_GAME_PLAYING) @@ -152,7 +152,7 @@ if(table[y1][x1] < 10 && table[y1][x1] >= 0) //Check that it's not already revealed, and stop flag removal if we're out of flag mode table[y1][x1] += 10 if(table[y1][x1] != 10) - playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3) else if(game_status != MINESWEEPER_GAME_LOST && game_status != MINESWEEPER_GAME_WON) game_status = MINESWEEPER_GAME_LOST @@ -164,14 +164,14 @@ if(mine_sound) switch(rand(1,3)) //Play every time a mine is hit if(1) - playsound(loc, 'sound/arcade/minesweeper_explosion1.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_explosion1.ogg', 50, FALSE, extrarange = -3) if(2) - playsound(loc, 'sound/arcade/minesweeper_explosion2.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_explosion2.ogg', 50, FALSE, extrarange = -3) if(3) - playsound(loc, 'sound/arcade/minesweeper_explosion3.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_explosion3.ogg', 50, FALSE, extrarange = -3) mine_sound = FALSE else - playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3) if(table[y1][x1] >= 0) //Check that it's not already flagged table[y1][x1] -= 10 else if(table[y1][x1] < 0) //If flagged, remove the flag @@ -182,7 +182,7 @@ game_status = MINESWEEPER_GAME_PLAYING if(table[y1][x1] >= 10) //If revealed, become unrevealed! if(mine_sound) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) mine_sound = FALSE table[y1][x1] -= 10 if(table[y1][x1] > 10 && !reset_board) @@ -243,10 +243,10 @@ if(safe_squares_revealed >= win_condition && game_status == MINESWEEPER_GAME_PLAYING) game_status = MINESWEEPER_GAME_WON if(rows < 10 || columns < 10) //If less than easy difficulty - playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, FALSE, extrarange = -3) say("You cleared the board of all mines, but you picked too small of a board! Try again with at least a 9x9 board!") else - playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, FALSE, extrarange = -3) say("You cleared the board of all mines! Congratulations!") if(CHECK_BITFIELD(obj_flags, EMAGGED)) var/itemname @@ -299,32 +299,32 @@ ENABLE_BITFIELD(obj_flags, EMAGGED) if(game_status == MINESWEEPER_GAME_MAIN_MENU) to_chat(user, "An ominous tune plays from the arcade's speakers!") - playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, 0, extrarange = 3, falloff = 10) + playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, FALSE, extrarange = 3) else //Can't let you do that, star fox! to_chat(user, "The machine buzzes and sparks... the game has been reset!") - playsound(user, 'sound/machines/buzz-sigh.ogg', 100, 0, extrarange = 3, falloff = 10) //Loud buzz + playsound(user, 'sound/machines/buzz-sigh.ogg', 100, FALSE, extrarange = 3) //Loud buzz game_status = MINESWEEPER_GAME_MAIN_MENU return TRUE /obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound + playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) //Entered into the menu so ping sound var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num if(!new_rows || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return FALSE new_rows = clamp(new_rows + 1, 4, 30) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num if(!new_columns || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return FALSE new_columns = clamp(new_columns + 1, 4, 50) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) var/grid_area = (new_rows - 1) * (new_columns - 1) var/lower_limit = round(grid_area*0.156) var/upper_limit = round(grid_area*0.85) var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num if(!new_mine_limit || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return FALSE - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) rows = new_rows columns = new_columns mine_limit = clamp(new_mine_limit, lower_limit, upper_limit) diff --git a/code/game/machinery/computer/arcade/misc_arcade.dm b/code/game/machinery/computer/arcade/misc_arcade.dm index 24516740f9..50633192ce 100644 --- a/code/game/machinery/computer/arcade/misc_arcade.dm +++ b/code/game/machinery/computer/arcade/misc_arcade.dm @@ -17,14 +17,14 @@ to_chat(c_user, "You move your hand towards the machine, and begin to hesitate as a bloodied guillotine emerges from inside of it...") if(do_after(c_user, 50, target = src)) to_chat(c_user, "The guillotine drops on your arm, and the machine sucks it in!") - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1) var/which_hand = BODY_ZONE_L_ARM if(!(c_user.active_hand_index % 2)) which_hand = BODY_ZONE_R_ARM var/obj/item/bodypart/chopchop = c_user.get_bodypart(which_hand) chopchop.dismember() qdel(chopchop) - playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3) for(var/i=1; i<=rand(3,5); i++) prizevend(user) else diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 4ba8d9f3d3..75a181b922 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -6,6 +6,7 @@ name = "gas sensor" icon = 'icons/obj/stationobjs.dmi' icon_state = "gsensor1" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 0) var/on = TRUE diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index a21ebbeccf..280348368d 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -7,14 +7,14 @@ add_fingerprint(user) switch(state) if(0) - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start wrenching the frame into place...") if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") setAnchored(TRUE) state = 1 return - if(istype(P, /obj/item/weldingtool)) + if(P.tool_behaviour == TOOL_WELDER) if(!P.tool_start_check(user, amount=0)) return @@ -26,7 +26,7 @@ qdel(src) return if(1) - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start to unfasten the frame...") if(P.use_tool(src, user, 20, volume=50) && state == 1) to_chat(user, "You unfasten the frame.") @@ -46,13 +46,13 @@ else if(istype(P, /obj/item/circuitboard) && !circuit) to_chat(user, "This frame does not accept circuit boards of this type!") return - if(istype(P, /obj/item/screwdriver) && circuit) + if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) P.play_tool_sound(src) to_chat(user, "You screw [circuit] into place.") state = 2 icon_state = "2" return - if(istype(P, /obj/item/crowbar) && circuit) + if(P.tool_behaviour == TOOL_CROWBAR && circuit) P.play_tool_sound(src) to_chat(user, "You remove [circuit].") state = 1 @@ -62,7 +62,7 @@ circuit = null return if(2) - if(istype(P, /obj/item/screwdriver) && circuit) + if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) P.play_tool_sound(src) to_chat(user, "You unfasten the circuit board.") state = 1 @@ -78,7 +78,7 @@ icon_state = "3" return if(3) - if(istype(P, /obj/item/wirecutters)) + if(P.tool_behaviour == TOOL_WIRECUTTER) P.play_tool_sound(src) to_chat(user, "You remove the cables.") state = 2 @@ -98,7 +98,7 @@ src.icon_state = "4" return if(4) - if(istype(P, /obj/item/crowbar)) + if(P.tool_behaviour == TOOL_CROWBAR) P.play_tool_sound(src) to_chat(user, "You remove the glass panel.") state = 3 @@ -106,7 +106,7 @@ var/obj/item/stack/sheet/glass/G = new(drop_location(), 2) G.add_fingerprint(user) return - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) P.play_tool_sound(src) to_chat(user, "You connect the monitor.") var/obj/B = new circuit.build_path (loc, circuit) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index d42291cd3c..03a5a17493 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -246,10 +246,12 @@ network = list("thunder") density = FALSE circuit = null - interaction_flags_atom = NONE // interact() is called by BigClick() + //interaction_flags_atom = NONE // interact() is called by BigClick() var/icon_state_off = "entertainment_blank" var/icon_state_on = "entertainment" +/* If someone would like to try to get this long-distance viewing thing working, be my guest. I tried everything I could possibly think of and it just refused to operate correctly. + /obj/machinery/computer/security/telescreen/entertainment/Initialize() . = ..() RegisterSignal(src, COMSIG_CLICK, .proc/BigClick) @@ -258,6 +260,8 @@ /obj/machinery/computer/security/telescreen/entertainment/proc/BigClick() interact(usr) +*/ + /obj/machinery/computer/security/telescreen/entertainment/proc/notify(on) if(on && icon_state == icon_state_off) say(pick( @@ -278,7 +282,7 @@ name = "circuitry telescreen" desc = "Used for watching the other eggheads from the safety of the circuitry lab." network = list("rd") - + /obj/machinery/computer/security/telescreen/ce name = "\improper Chief Engineer's telescreen" desc = "Used for watching the engine, telecommunications and the minisat." diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 4b5806b8fd..7d2c851206 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -11,6 +11,8 @@ var/datum/action/innate/camera_off/off_action = new var/datum/action/innate/camera_jump/jump_action = new var/list/actions = list() + /// Should we suppress the user's view? + var/should_supress_view_changes = TRUE light_color = LIGHT_COLOR_RED @@ -77,6 +79,7 @@ current_user = null user.unset_machine() + user.client.view_size.unsupress() playsound(src, 'sound/machines/terminal_off.ogg', 25, 0) /obj/machinery/computer/camera_advanced/check_eye(mob/user) @@ -157,6 +160,8 @@ user.remote_control = eyeobj user.reset_perspective(eyeobj) eyeobj.setLoc(eyeobj.loc) + if(should_supress_view_changes) + user.client.view_size.supress() /mob/camera/aiEye/remote name = "Inactive Camera Eye" @@ -273,4 +278,4 @@ C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console! else - playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) \ No newline at end of file + playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 2a05b359d8..adadb40bc9 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -12,6 +12,7 @@ var/list/pods //Linked cloning pods var/temp = "Inactive" var/scantemp_ckey + var/scantemp_name var/scantemp = "Ready to Scan" var/menu = 1 //Which menu screen to display var/datum/data/record/active_record = null @@ -132,22 +133,20 @@ to_chat(user, "You insert [W].") playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) src.updateUsrDialog() - else if(istype(W, /obj/item/multitool)) - var/obj/item/multitool/P = W - - if(istype(P.buffer, clonepod_type)) - if(get_area(P.buffer) != get_area(src)) + else if(W.tool_behaviour == TOOL_MULTITOOL) + if(istype(W.buffer, clonepod_type)) + if(get_area(W.buffer) != get_area(src)) to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") - P.buffer = null + W.buffer = null return - to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") - var/obj/machinery/clonepod/pod = P.buffer + to_chat(user, "-% Successfully linked [W.buffer] with [src] %-") + var/obj/machinery/clonepod/pod = W.buffer if(pod.connected) pod.connected.DetachCloner(pod) AttachCloner(pod) else - P.buffer = src - to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") + W.buffer = src + to_chat(user, "-% Successfully stored [REF(W.buffer)] [W.buffer] in buffer %-") return else return ..() @@ -195,9 +194,10 @@ dat += "[scanner_occupant] => Scanning..." else if(use_records) - if(scanner_occupant.ckey != scantemp_ckey) + if(scanner_occupant.ckey != scantemp_ckey || scanner_occupant.name != scantemp_name) scantemp = "Ready to Scan" scantemp_ckey = scanner_occupant.ckey + scantemp_name = scanner_occupant.name else scantemp = "Ready to Clone" dat += "[scanner_occupant] => [scantemp]" @@ -296,17 +296,18 @@ autoprocess = FALSE STOP_PROCESSING(SSmachines, src) playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + src.updateUsrDialog() . = TRUE else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational()) scantemp = "" loading = TRUE - src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) say("Initiating scan...") var/prev_locked = scanner.locked scanner.locked = TRUE + src.updateUsrDialog() addtimer(CALLBACK(src, .proc/finish_scan, scanner.occupant, prev_locked), 2 SECONDS) . = TRUE @@ -318,6 +319,7 @@ else scanner.locked = FALSE playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + src.updateUsrDialog() . = TRUE @@ -340,6 +342,7 @@ src.menu = 3 else src.temp = "Record missing." + src.updateUsrDialog() . = TRUE else if (href_list["del_rec"]) @@ -348,6 +351,7 @@ if (src.menu == 3) //If we are viewing a record, confirm deletion src.temp = "Delete record?" src.menu = 4 + src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) else if (src.menu == 4) @@ -357,12 +361,14 @@ src.temp = "[src.active_record.fields["name"]] => Record deleted." src.records.Remove(active_record) active_record = null + src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) src.menu = 2 var/obj/item/circuitboard/computer/cloning/board = circuit board.records = records else src.temp = "Access Denied." + src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) . = TRUE @@ -384,6 +390,7 @@ for(var/key in diskette.fields) src.active_record.fields[key] = diskette.fields[key] src.temp = "Load successful." + src.updateUsrDialog() var/obj/item/circuitboard/computer/cloning/board = circuit board.records = records playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) @@ -403,6 +410,7 @@ diskette.fields = active_record.fields.Copy() diskette.name = "data disk - '[src.diskette.fields["name"]]'" src.temp = "Save successful." + src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) . = TRUE @@ -431,17 +439,21 @@ if(active_record == C) active_record = null menu = 1 + src.updateUsrDialog() else temp = "[C.fields["name"]] => Initialisation failure." + src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) else temp = "Data corruption." + src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) . = TRUE else if (href_list["menu"] && use_records) menu = text2num(href_list["menu"]) + src.updateUsrDialog() playsound(src, "terminal_type", 25, 0) . = TRUE @@ -449,7 +461,6 @@ if(!scanner || !L) return src.add_fingerprint(usr) - src.updateUsrDialog() if(use_records) scan_occupant(L) @@ -457,9 +468,10 @@ clone_occupant(L) loading = FALSE + scanner.locked = prev_locked src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - scanner.locked = prev_locked + /obj/machinery/computer/cloning/proc/scan_occupant(occupant) var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index b2f7ae73a1..18a0aeb221 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -23,11 +23,10 @@ if(W.tool_behaviour == TOOL_MULTITOOL) if(!multitool_check_buffer(user, W)) return - var/obj/item/multitool/M = W - if(M.buffer && istype(M.buffer, /obj/machinery/launchpad)) + if(W.buffer && istype(W.buffer, /obj/machinery/launchpad)) if(LAZYLEN(launchpads) < maximum_pads) - launchpads |= M.buffer - M.buffer = null + launchpads |= W.buffer + W.buffer = null to_chat(user, "You upload the data from the [W.name]'s buffer.") else to_chat(user, "[src] cannot handle any more connections!") diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index fa6d4327a4..fc7bec7134 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -69,4 +69,4 @@ return 0 if(B.scrambledcodes || B.emagged) return 0 - return ..() \ No newline at end of file + return ..() diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm new file mode 100644 index 0000000000..3489ee5d35 --- /dev/null +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -0,0 +1,164 @@ +/obj/machinery/computer/mechpad + name = "orbital mech pad console" + desc = "A computer designed to handle the calculations and routing required for sending and receiving mechs from orbit. Requires a link to a nearby Orbital Mech Pad to function." + icon_screen = "mechpad" + icon_keyboard = "teleport_key" + circuit = /obj/item/circuitboard/computer/mechpad + ///ID of the mechpad, used for linking up + var/id = "roboticsmining" + ///Selected mechpad in the console + var/selected_id + ///Mechpads that it can send mechs through to other mechpads + var/obj/machinery/mechpad/connected_mechpad + ///List of mechpads connected + var/list/obj/machinery/mechpad/mechpads = list() + ///Maximum amount of pads connected at once + var/maximum_pads = 3 + +/obj/machinery/computer/mechpad/Initialize(mapload) + . = ..() + if(mapload) + connected_mechpad = connect_to_pad() + connected_mechpad.connected_console = src + connected_mechpad.id = id + return INITIALIZE_HINT_LATELOAD + else + id ="handmade" + +/obj/machinery/computer/mechpad/LateInitialize() + for(var/obj/machinery/mechpad/pad in GLOB.mechpad_list) + if(pad == connected_mechpad) + continue + if(pad.id != id) + continue + mechpads += pad + LAZYADD(pad.consoles, src) + if(mechpads.len > maximum_pads) + break + +/obj/machinery/computer/mechpad/Destroy() + if(connected_mechpad) + connected_mechpad.connected_console = null + connected_mechpad = null + for(var/obj/machinery/mechpad/mechpad in mechpads) + LAZYREMOVE(mechpad.consoles, src) + return ..() + +///Tries to locate a pad in the cardinal directions, if it finds one it returns it +/obj/machinery/computer/mechpad/proc/connect_to_pad() + if(connected_mechpad) + return + for(var/direction in GLOB.cardinals) + connected_mechpad = locate(/obj/machinery/mechpad, get_step(src, direction)) + if(connected_mechpad) + break + return connected_mechpad + +/obj/machinery/computer/mechpad/multitool_act(mob/living/user, obj/item/tool) + if(!tool.tool_behaviour == TOOL_MULTITOOL) + return + if(!multitool_check_buffer(user, tool)) + return + if(istype(tool.buffer, /obj/machinery/mechpad)) + var/obj/machinery/mechpad/buffered_console = tool.buffer + if(!(mechpads.len < maximum_pads)) + to_chat(user, "[src] cannot handle any more connections!") + return + if(buffered_console == connected_mechpad) + to_chat(user, "[src] cannot connect to its own mechpad!") + else if(!connected_mechpad && buffered_console == connect_to_pad()) + connected_mechpad = buffered_console + connected_mechpad.connected_console = src + connected_mechpad.id = id + tool.buffer = null + to_chat(user, "You connect the console to the pad with data from the [tool.name]'s buffer.") + else + mechpads += buffered_console + LAZYADD(buffered_console.consoles, src) + tool.buffer = null + to_chat(user, "You upload the data from the [tool.name]'s buffer.") + +/** + * Tries to call the launch proc on the connected mechpad, returns if there is no connected mechpad or there is no mecha on the pad + * Arguments: + * * user - The user of the proc + * * where - The mechpad that the connected mechpad will try to send a supply pod to + */ +/obj/machinery/computer/mechpad/proc/try_launch(var/mob/user, var/obj/machinery/mechpad/where) + if(!connected_mechpad) + to_chat(user, "[src] has no connected pad!") + return + if(connected_mechpad.panel_open) + to_chat(user, "[src]'s pad has its' panel open! It won't work!") + return + if(!(locate(/obj/vehicle/sealed/mecha) in get_turf(connected_mechpad))) + to_chat(user, "[src] detects no mecha on the pad!") + return + connected_mechpad.launch(where) + +///Checks if the pad of a certain number has been QDELETED, if yes returns FALSE, otherwise returns TRUE +/obj/machinery/computer/mechpad/proc/pad_exists(number) + var/obj/machinery/mechpad/pad = mechpads[number] + if(QDELETED(pad)) + return FALSE + return TRUE + +///Returns the pad of the value specified +/obj/machinery/computer/mechpad/proc/get_pad(number) + var/obj/machinery/mechpad/pad = mechpads[number] + return pad + +/obj/machinery/computer/mechpad/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MechpadConsole", name) + ui.open() + +/obj/machinery/computer/mechpad/ui_data(mob/user) + var/list/data = list() + var/list/pad_list = list() + for(var/i in 1 to LAZYLEN(mechpads)) + if(pad_exists(i)) + var/obj/machinery/mechpad/pad = get_pad(i) + var/list/this_pad = list() + this_pad["name"] = pad.display_name + this_pad["id"] = i + if(pad.machine_stat & NOPOWER) + this_pad["inactive"] = TRUE + pad_list += list(this_pad) + else + mechpads -= get_pad(i) + data["mechpads"] = pad_list + data["selected_id"] = selected_id + data["connected_mechpad"] = !!connected_mechpad + if(selected_id) + var/obj/machinery/mechpad/current_pad = mechpads[selected_id] + data["pad_name"] = current_pad.display_name + data["selected_pad"] = current_pad + if(QDELETED(current_pad) || (current_pad.machine_stat & NOPOWER)) + data["pad_active"] = FALSE + return data + data["pad_active"] = TRUE + return data + +/obj/machinery/computer/mechpad/ui_act(action, params) + . = ..() + if(.) + return + var/obj/machinery/mechpad/current_pad = mechpads[selected_id] + switch(action) + if("select_pad") + selected_id = text2num(params["id"]) + if("rename") + var/new_name = params["name"] + if(!new_name) + return + current_pad.display_name = new_name + if("remove") + if(usr && alert(usr, "Are you sure?", "Unlink Orbital Pad", "I'm Sure", "Abort") != "Abort") + mechpads -= current_pad + LAZYREMOVE(current_pad.consoles, src) + selected_id = null + if("launch") + try_launch(usr, current_pad) + . = TRUE diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 401d05da12..9b911e9c15 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -21,6 +21,9 @@ return if(R.scrambledcodes) return + if(hasSiliconAccessInArea(user) && !issilicon(user)) + if(!Adjacent(user)) + return return TRUE /obj/machinery/computer/robotics/ui_interact(mob/user, datum/tgui/ui) @@ -40,6 +43,10 @@ else if(IsAdminGhost(user)) data["can_hack"] = TRUE + data["can_convert"] = FALSE + if(isAI(user) && is_servant_of_ratvar(user)) + data["can_convert"] = TRUE + data["cyborgs"] = list() for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs) if(!can_control(user, R)) @@ -54,6 +61,7 @@ module = R.module ? "[R.module.name] Module" : "No Module Detected", synchronization = R.connected_ai, emagged = R.emagged, + servant = is_servant_of_ratvar(R), ref = REF(R) ) data["cyborgs"] += list(cyborg_data) @@ -110,6 +118,13 @@ log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!") message_admins("[ADMIN_LOOKUPFLW(usr)] emagged cyborg [key_name_admin(R)] using robotic console!") R.SetEmagged(TRUE) + if("convert") + if(isAI(usr) && is_servant_of_ratvar(usr)) + var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs + if(istype(R) && !is_servant_of_ratvar(R) && R.connected_ai == usr) + log_game("[key_name(usr)] converted [key_name(R)] using robotic console!") + message_admins("[ADMIN_LOOKUPFLW(usr)] converted cyborg [key_name_admin(R)] using robotic console!") + add_servant_of_ratvar(R) if("killdrone") if(allowed(usr)) var/mob/living/simple_animal/drone/D = locate(params["ref"]) in GLOB.mob_list diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 0157f4ca87..45bb9bd327 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -264,6 +264,8 @@ What a mess.*/ active1 = null if(!( GLOB.data_core.security.Find(active2) )) active2 = null + if(!authenticated && href_list["choice"] != "Log In") // logging in is the only action you can do if not logged in + return if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr) || IsAdminGhost(usr)) usr.set_machine(src) switch(href_list["choice"]) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 5ee8223625..b00edfd82c 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -90,7 +90,7 @@ icon_state = "box_1" return - if(istype(P, /obj/item/screwdriver) && !anchored) + if(P.tool_behaviour == TOOL_SCREWDRIVER && !anchored) user.visible_message("[user] disassembles the frame.", \ "You start to disassemble the frame...", "You hear banging and clanking.") if(P.use_tool(src, user, 40, volume=50)) @@ -100,7 +100,7 @@ M.add_fingerprint(user) qdel(src) return - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") if(P.use_tool(src, user, 40, volume=75)) if(state == 1) @@ -109,7 +109,7 @@ return if(2) - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") if(P.use_tool(src, user, 40, volume=75)) to_chat(user, "You [anchored ? "un" : ""]secure [name].") @@ -140,7 +140,7 @@ to_chat(user, "This frame does not accept circuit boards of this type!") return - if(istype(P, /obj/item/wirecutters)) + if(P.tool_behaviour == TOOL_WIRECUTTER) P.play_tool_sound(src) to_chat(user, "You remove the cables.") state = 1 @@ -149,7 +149,7 @@ return if(3) - if(istype(P, /obj/item/crowbar)) + if(P.tool_behaviour == TOOL_CROWBAR) P.play_tool_sound(src) state = 2 circuit.forceMove(drop_location()) @@ -167,14 +167,14 @@ icon_state = "box_1" return - if(istype(P, /obj/item/wrench) && !circuit.needs_anchored) + if(P.tool_behaviour == TOOL_WRENCH && !circuit.needs_anchored) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") if(P.use_tool(src, user, 40, volume=75)) to_chat(user, "You [anchored ? "un" : ""]secure [name].") setAnchored(!anchored) return - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) var/component_check = 1 for(var/R in req_components) if(req_components[R] > 0) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index b48742d885..5be3e2a3a5 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -22,17 +22,16 @@ //Used for logging people entering cryosleep and important items they are carrying. var/list/frozen_crew = list() - var/list/frozen_items = list() - - // Used for containing rare items traitors need to steal, so it's not - // game-over if they get iced - var/list/objective_items = list() - // A cache of theft datums so you don't have to re-create them for - // each item check - var/list/theft_cache = list() + var/list/obj/stored_packages = list() var/allow_items = TRUE +/obj/machinery/computer/cryopod/deconstruct() + . = ..() + for(var/i in stored_packages) + var/obj/O = i + O.forceMove(drop_location()) + /obj/machinery/computer/cryopod/attack_ai() attack_hand() @@ -67,11 +66,11 @@ if(3) dat += "<< Back

    " dat += "

    Recently stored objects




    " - if(!frozen_items.len) + if(!stored_packages.len) dat += "There has been no storage usage at this terminal.
    " else - for(var/obj/item/I in frozen_items) - dat += "[I.name]
    " + for(var/obj/O in stored_packages) + dat += "[O.name]
    " dat += "
    " var/datum/browser/popup = new(user, "cryopod_console", "Cryogenic System Control") @@ -87,25 +86,27 @@ add_fingerprint(user) if(href_list["item"]) - if(!allowed(user)) + if(!allowed(user) && !(obj_flags & EMAGGED)) to_chat(user, "Access Denied.") playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) updateUsrDialog() return - if(!allow_items) return - if(frozen_items.len == 0) + if(!allow_items) + return + + if(stored_packages.len == 0) to_chat(user, "There is nothing to recover from storage.") playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) updateUsrDialog() return - var/obj/item/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items + var/obj/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in stored_packages playsound(src, "terminal_type", 25, 0) if(!I) return - if(!(I in frozen_items)) + if(!(I in stored_packages)) to_chat(user, "\The [I] is no longer in storage.") playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) updateUsrDialog() @@ -117,20 +118,21 @@ I.forceMove(drop_location()) if(user && Adjacent(user) && user.can_hold_items()) user.put_in_hands(I) - frozen_items -= I + stored_packages -= I updateUsrDialog() else if(href_list["allitems"]) playsound(src, "terminal_type", 25, 0) - if(!allowed(user)) + if(!allowed(user) && !(obj_flags & EMAGGED)) to_chat(user, "Access Denied.") playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) updateUsrDialog() return + if(!allow_items) return - if(frozen_items.len == 0) + if(stored_packages.len == 0) to_chat(user, "There is nothing to recover from storage.") playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) return @@ -138,10 +140,10 @@ visible_message("The console beeps happily as it disgorges the desired objects.") playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - for(var/obj/item/I in frozen_items) - I.forceMove(drop_location()) - frozen_items -= I - updateUsrDialog() + for(var/obj/O in stored_packages) + O.forceMove(get_turf(src)) + stored_packages.Cut() + updateUsrDialog() else if (href_list["menu"]) src.menu = text2num(href_list["menu"]) @@ -159,6 +161,13 @@ /obj/machinery/computer/cryopod/contents_explosion() return +/obj/machinery/computer/cryopod/contents_explosion() + return //don't blow everyone's shit up. + +/// The box +/obj/item/storage/box/blue/cryostorage_items + w_class = WEIGHT_CLASS_HUGE + //Cryopods themselves. /obj/machinery/cryopod name = "cryogenic freezer" @@ -177,44 +186,9 @@ var/despawn_world_time = null // Used to keep track of the safe period. var/obj/machinery/computer/cryopod/control_computer + var/item_storage_type = /obj/item/storage/box/blue/cryostorage_items //with how storage components work this can be anything the player can open or anything with a storage component. var/last_no_computer_message = 0 - // These items are preserved when the process() despawn proc occurs. - var/static/list/preserve_items = typecacheof(list( - /obj/item/hand_tele, - /obj/item/card/id/captains_spare, - /obj/item/aicard, - /obj/item/mmi, - /obj/item/paicard, - /obj/item/gun, - /obj/item/pinpointer, - /obj/item/clothing/shoes/magboots, - /obj/item/areaeditor/blueprints, - /obj/item/clothing/head/helmet/space, - /obj/item/clothing/suit/space, - /obj/item/clothing/suit/armor, - /obj/item/defibrillator/compact, - /obj/item/reagent_containers/hypospray/CMO, - /obj/item/clothing/accessory/medal/gold/captain, - /obj/item/clothing/gloves/krav_maga, - /obj/item/nullrod, - /obj/item/tank/jetpack, - /obj/item/documents, - /obj/item/nuke_core_container - )) - // These items will NOT be preserved - var/static/list/do_not_preserve_items = typecacheof(list( - /obj/item/mmi/posibrain, - /obj/item/gun/energy/laser/mounted, - /obj/item/gun/energy/e_gun/advtaser/mounted, - /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg, - /obj/item/gun/energy/disabler/cyborg, - /obj/item/gun/energy/e_gun/advtaser/cyborg, - /obj/item/gun/energy/printer, - /obj/item/gun/energy/kinetic_accelerator/cyborg, - /obj/item/gun/energy/laser/cyborg - )) - /obj/machinery/cryopod/Initialize(mapload) . = ..() update_icon() @@ -286,73 +260,95 @@ despawn_occupant() -#define CRYO_DESTROY 0 -#define CRYO_PRESERVE 1 -#define CRYO_OBJECTIVE 2 -#define CRYO_IGNORE 3 -#define CRYO_DESTROY_LATER 4 - -/obj/machinery/cryopod/proc/should_preserve_item(obj/item/I) - for(var/datum/objective_item/steal/T in control_computer.theft_cache) - if(istype(I, T.targetitem) && T.check_special_completion(I)) - return CRYO_OBJECTIVE - if(preserve_items[I] && !do_not_preserve_items[I]) - return CRYO_PRESERVE - return CRYO_DESTROY - // This function can not be undone; do not call this unless you are sure /obj/machinery/cryopod/proc/despawn_occupant() if(!control_computer) find_control_computer() var/mob/living/mob_occupant = occupant - var/list/obj/item/cryo_items = list() + + var/list/obj/item/storing = list() + var/list/obj/item/destroying = list() + var/list/obj/item/destroy_later = list() investigate_log("Despawning [key_name(mob_occupant)].", INVESTIGATE_CRYOGENICS) - //Handle Borg stuff first + var/atom/target_store = (control_computer?.allow_items && control_computer) || src //the double control computer check makes it return the control computer. + var/drop_to_ground = !istype(target_store, /obj/machinery/computer/cryopod) + + var/mind_identity = mob_occupant.mind?.name + var/occupant_identity = mob_occupant.real_name + if(iscyborg(mob_occupant)) var/mob/living/silicon/robot/R = mob_occupant if(R.mmi?.brain) - cryo_items[R.mmi] = CRYO_DESTROY_LATER - cryo_items[R.mmi.brain] = CRYO_DESTROY_LATER - for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc - for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags - cryo_items[O] = should_preserve_item(O) - O.forceMove(src) - R.module.remove_module(I, TRUE) //delete the module itself so it doesn't transfer over. - - //Drop all items into the pod. - for(var/obj/item/I in mob_occupant) - if(cryo_items[I] == CRYO_IGNORE || cryo_items[I] ==CRYO_DESTROY_LATER) - continue - cryo_items[I] = should_preserve_item(I) - mob_occupant.transferItemToLoc(I, src, TRUE) - if(I.contents.len) //Make sure we catch anything not handled by qdel() on the items. - if(cryo_items[I] != CRYO_DESTROY) // Don't remove the contents of things that need preservation + destroy_later += R.mmi + destroy_later += R.mmi.brain + for(var/i in R.module) + if(!isitem(i)) + destroying += i continue - for(var/obj/item/O in I.contents) - cryo_items[O] = should_preserve_item(O) - O.forceMove(src) + var/obj/item/I = i + // let's be honest we only care about the trash bag don't beat around the bush + if(SEND_SIGNAL(I, COMSIG_CONTAINS_STORAGE)) + storing += I.contents + for(var/atom/movable/AM in I.contents) + AM.forceMove(src) + R.module.remove_module(I, TRUE) + else - for(var/A in cryo_items) - var/obj/item/I = A - if(QDELETED(I)) //edge cases and DROPDEL. - continue - var/preserve = cryo_items[I] - if(preserve == CRYO_DESTROY_LATER) - continue - if(preserve != CRYO_IGNORE) - if(preserve == CRYO_DESTROY) - qdel(I) - else if(control_computer?.allow_items) - control_computer.frozen_items += I - if(preserve == CRYO_OBJECTIVE) - control_computer.objective_items += I - I.moveToNullspace() + if(ishuman(mob_occupant)) + var/mob/living/carbon/human/H = mob_occupant + if(H.mind && H.client && H.client.prefs && H == H.mind.original_character) + H.SaveTCGCards() + + var/list/gear = list() + if(iscarbon(mob_occupant)) // sorry simp-le-mobs deserve no mercy + var/mob/living/carbon/C = mob_occupant + gear = C.get_all_gear() + for(var/i in gear) + var/obj/item/I = i + I.forceMove(src) + if(!istype(I)) + destroying += I + continue + if(I.item_flags & (DROPDEL | ABSTRACT)) + destroying += I + continue + if(HAS_TRAIT(I, TRAIT_NODROP)) + destroying += I + continue + // WEE WOO SNOWFLAKE TIME + if(istype(I, /obj/item/pda)) + var/obj/item/pda/P = I + if((P.owner == mind_identity) || (P.owner == occupant_identity)) + destroying += P + else + storing += P + else if(istype(I, /obj/item/card/id)) + var/obj/item/card/id/idcard = I + if((idcard.registered_name == mind_identity) || (idcard.registered_name == occupant_identity)) + destroying += idcard + else + storing += idcard else - I.forceMove(loc) - cryo_items -= I + storing += I + + // get rid of mobs + for(var/mob/living/L in mob_occupant.GetAllContents() - mob_occupant) + L.forceMove(drop_location()) + + if(storing.len) + var/obj/O = new item_storage_type + O.name = "cryogenic retrieval package: [mob_occupant.real_name]" + for(var/i in storing) + var/obj/item/I = i + I.forceMove(O) + O.forceMove(drop_to_ground? target_store.drop_location() : target_store) + if((target_store == control_computer) && !drop_to_ground) + control_computer.stored_packages += O + + QDEL_LIST(destroying) //Update any existing objectives involving this mob. for(var/i in GLOB.objectives) @@ -361,8 +357,12 @@ // them win or lose based on cryo is silly so we remove the objective. if(istype(O,/datum/objective/mutiny) && O.target == mob_occupant.mind) qdel(O) - else if(O.target && istype(O.target, /datum/mind) && !O.check_completion()) - if(O.target == mob_occupant.mind && O.owner?.current) + else if(O.target && istype(O.target, /datum/mind)) + if(O.target != mob_occupant.mind) + continue + if(O.check_midround_completion()) + continue + if(O.owner && O.owner.current) to_chat(O.owner.current, "
    You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!") O.target = null spawn(10) //This should ideally fire after the occupant is deleted. @@ -410,22 +410,13 @@ // Ghost and delete the mob. if(!mob_occupant.get_ghost(1)) - mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE) + mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE, cryo = TRUE) QDEL_NULL(occupant) - for(var/I in cryo_items) //only "CRYO_DESTROY_LATER" atoms are left) - var/atom/A = I - if(!QDELETED(A)) - qdel(A) + QDEL_LIST(destroy_later) open_machine() name = initial(name) -#undef CRYO_DESTROY -#undef CRYO_PRESERVE -#undef CRYO_OBJECTIVE -#undef CRYO_IGNORE -#undef CRYO_DESTROY_LATER - /obj/machinery/cryopod/MouseDrop_T(mob/living/target, mob/user) if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled) return diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 756f924cfa..8b24a3804f 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -35,7 +35,7 @@ /obj/machinery/jukebox/attackby(obj/item/O, mob/user, params) if(!active && !(flags_1 & NODECONSTRUCT_1)) - if(istype(O, /obj/item/wrench)) + if(O.tool_behaviour == TOOL_WRENCH) if(!anchored && !isinspace()) to_chat(user,"You secure [src] to the floor.") setAnchored(TRUE) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 677cbe1208..bc6cc4b60e 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -99,19 +99,21 @@ return ..() -/obj/machinery/defibrillator_mount/multitool_act(mob/living/user, obj/item/multitool) +/obj/machinery/defibrillator_mount/multitool_act(mob/living/user, obj/item/W) + if(!W.tool_behaviour == TOOL_MULTITOOL) + return if(!defib) to_chat(user, "There isn't any defibrillator to clamp in!") return TRUE if(!clamps_locked) to_chat(user, "[src]'s clamps are disengaged!") return TRUE - user.visible_message("[user] presses [multitool] into [src]'s ID slot...", \ + user.visible_message("[user] presses [W] into [src]'s ID slot...", \ "You begin overriding the clamps on [src]...") playsound(src, 'sound/machines/click.ogg', 50, TRUE) if(!do_after(user, 100, target = src) || !clamps_locked) return - user.visible_message("[user] pulses [multitool], and [src]'s clamps slide up.", \ + user.visible_message("[user] pulses [W], and [src]'s clamps slide up.", \ "You override the locking clamps on [src]!") playsound(src, 'sound/machines/locktoggle.ogg', 50, TRUE) clamps_locked = FALSE diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 252e6cf6b3..ca4b392efa 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -26,7 +26,7 @@ return /obj/structure/barricade/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM && bar_material == METAL) + if(I.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM && bar_material == METAL) if(obj_integrity < max_integrity) if(!I.tool_start_check(user, amount=0)) return diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index e721e986d2..0dcb0e7235 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -32,6 +32,8 @@ . = ..() if(in_range(user, src) || isobserver(user)) . += "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
    Radiation pulse damage decreased by factor [damage_coeff**2].
    " + if(scan_level >= 3) + . += "Scanner has been upgraded to support autoprocessing." /obj/machinery/dna_scannernew/update_icon_state() //no power or maintenance @@ -94,6 +96,13 @@ ..(user) +// search for ghosts, if the corpse is empty and the scanner is connected to a cloner + var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) + if(istype(mob_occupant)) + if(locate_computer(/obj/machinery/computer/cloning)) + if(!mob_occupant.suiciding && !(HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && !mob_occupant.hellbound) + mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src) + // DNA manipulators cannot operate on severed heads or brains if(iscarbon(occupant)) if(linked_console) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 515a4672a5..f4a65ce984 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -864,7 +864,7 @@ update_icon() return if(AIRLOCK_SECURITY_METAL) - if(istype(C, /obj/item/weldingtool)) + if(C.tool_behaviour == TOOL_WELDER) if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the panel's shielding...") @@ -879,10 +879,9 @@ update_icon() return if(AIRLOCK_SECURITY_PLASTEEL_I_S) - if(istype(C, /obj/item/crowbar)) - var/obj/item/crowbar/W = C + if(C.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start removing the inner layer of shielding...") - if(W.use_tool(src, user, 40, volume=100)) + if(C.use_tool(src, user, 40, volume=100)) if(!panel_open) return if(security_level != AIRLOCK_SECURITY_PLASTEEL_I_S) @@ -896,7 +895,7 @@ update_icon() return if(AIRLOCK_SECURITY_PLASTEEL_I) - if(istype(C, /obj/item/weldingtool)) + if(C.tool_behaviour == TOOL_WELDER) if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the inner layer of shielding...") @@ -909,7 +908,7 @@ security_level = AIRLOCK_SECURITY_PLASTEEL_I_S return if(AIRLOCK_SECURITY_PLASTEEL_O_S) - if(istype(C, /obj/item/crowbar)) + if(C.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start removing outer layer of shielding...") if(C.use_tool(src, user, 40, volume=100)) if(!panel_open) @@ -922,7 +921,7 @@ spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1) return if(AIRLOCK_SECURITY_PLASTEEL_O) - if(istype(C, /obj/item/weldingtool)) + if(C.tool_behaviour == TOOL_WELDER) if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the outer layer of shielding...") @@ -935,7 +934,7 @@ security_level = AIRLOCK_SECURITY_PLASTEEL_O_S return if(AIRLOCK_SECURITY_PLASTEEL) - if(istype(C, /obj/item/wirecutters)) + if(C.tool_behaviour == TOOL_WIRECUTTER) if(src.hasPower() && src.shock(user, 60)) // Protective grille of wiring is electrified return to_chat(user, "You start cutting through the outer grille.") @@ -946,7 +945,7 @@ "You cut through \the [src]'s outer grille.") security_level = AIRLOCK_SECURITY_PLASTEEL_O return - if(istype(C, /obj/item/screwdriver)) + if(C.tool_behaviour == TOOL_SCREWDRIVER) if(panel_open && detonated) to_chat(user, "[src] has no maintenance panel!") return @@ -954,7 +953,7 @@ to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the airlock.") C.play_tool_sound(src) src.update_icon() - else if(istype(C, /obj/item/wirecutters) && note) + else if(C.tool_behaviour == TOOL_WIRECUTTER && note) user.visible_message("[user] cuts down [note] from [src].", "You remove [note] from [src].") C.play_tool_sound(src) note.forceMove(get_turf(user)) @@ -999,7 +998,9 @@ return ..() -/obj/machinery/door/airlock/try_to_weld(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/airlock/try_to_weld(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return if(!operating && density) if(user.a_intent != INTENT_HELP) if(!W.tool_start_check(user, amount=0)) @@ -1028,12 +1029,14 @@ else to_chat(user, "The airlock doesn't need repairing.") -/obj/machinery/door/airlock/proc/weld_checks(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/airlock/proc/weld_checks(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return return !operating && density /obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user) var/beingcrowbarred = null - if(istype(I, /obj/item/crowbar) ) + if(I.tool_behaviour == TOOL_CROWBAR) beingcrowbarred = 1 else beingcrowbarred = 0 @@ -1059,7 +1062,7 @@ to_chat(user, "The airlock's motors resist your efforts to force it!") else if(locked) to_chat(user, "The airlock's bolts prevent it from being forced!") - else if( !welded && !operating) + else if(!welded && !operating) if(!beingcrowbarred) //being fireaxe'd var/obj/item/fireaxe/axe = I if(!axe.wielded) @@ -1069,7 +1072,9 @@ else INVOKE_ASYNC(src, (density ? .proc/open : .proc/close), 2) - if(istype(I, /obj/item/crowbar/power)) + if(I.tool_behaviour == TOOL_CROWBAR) + if(!I.can_force_powered) + return if(hasPower() && isElectrified()) shock(user,100)//it's like sticking a forck in a power socket return @@ -1457,6 +1462,16 @@ ui.open() return TRUE +/obj/machinery/door/airlock/ui_status(mob/user) + . = ..() + if (!issilicon(user) && hasSiliconAccessInArea(user)) + . = UI_INTERACTIVE + +/obj/machinery/door/airlock/can_interact(mob/user) + . = ..() + if (!issilicon(user) && hasSiliconAccessInArea(user)) + return TRUE + /obj/machinery/door/airlock/ui_data() var/list/data = list() diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index fe2bdf90b1..2a4b586d7c 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -508,7 +508,7 @@ /obj/machinery/door/airlock/cult/allowed(mob/living/L) if(!density) return 1 - if(friendly || iscultist(L) || istype(L, /mob/living/simple_animal/shade) || isconstruct(L)) + if(friendly || iscultist(L) || isshade(L) || isconstruct(L)) if(!stealthy) new openingoverlaytype(loc) return 1 @@ -658,7 +658,7 @@ /obj/machinery/door/airlock/clockwork/proc/attempt_construction(obj/item/I, mob/living/user) if(!I || !user || !user.canUseTopic(src)) return 0 - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) if(construction_state == GEAR_SECURE) user.visible_message("[user] begins loosening [src]'s cogwheel...", "You begin loosening [src]'s cogwheel...") if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_SECURE) @@ -674,7 +674,7 @@ playsound(src, 'sound/items/deconstruct.ogg', 50, 1) construction_state = GEAR_SECURE return 1 - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) if(construction_state == GEAR_SECURE) to_chat(user, "[src]'s cogwheel is too tightly secured! Your [I.name] can't reach under it!") return 1 diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index 42649a9ff2..fa516f4b6b 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -23,7 +23,7 @@ . = ..() SSradio.remove_object(src, air_frequency) air_connection = SSradio.add_object(src, air_frequency, RADIO_TO_AIRALARM) - open() + INVOKE_ASYNC(src, .proc/open) /obj/machinery/door/airlock/alarmlock/receive_signal(datum/signal/signal) ..() @@ -40,4 +40,4 @@ close() if("minor", "clear") autoclose = FALSE - open() \ No newline at end of file + open() diff --git a/code/game/machinery/doors/checkForMultipleDoors.dm b/code/game/machinery/doors/checkForMultipleDoors.dm index 35a944c965..73a9edde6f 100644 --- a/code/game/machinery/doors/checkForMultipleDoors.dm +++ b/code/game/machinery/doors/checkForMultipleDoors.dm @@ -13,4 +13,4 @@ if(!istype(D, /obj/machinery/door/window) && D.density) return 0 //There are no false wall checks because that would be fucking - return 1 \ No newline at end of file + return 1 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 1faff76626..63a8ad22d4 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -173,7 +173,9 @@ /obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) return get_dir(src, M) & unres_sides -/obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/proc/try_to_weld(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return return /obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d88a9c9072..d84b994b92 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -123,7 +123,9 @@ /obj/machinery/door/firedoor/try_to_activate_door(mob/user) return -/obj/machinery/door/firedoor/try_to_weld(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/firedoor/try_to_weld(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return if(!W.tool_start_check(user, amount=0)) return user.visible_message("[user] starts [welded ? "unwelding" : "welding"] [src].", "You start welding [src].") diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 60652981cf..1ec5b3c373 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -70,4 +70,4 @@ return /obj/machinery/door/password/ex_act(severity, target) - return \ No newline at end of file + return diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm index 828624adb4..6e9d7f9561 100644 --- a/code/game/machinery/doors/unpowered.dm +++ b/code/game/machinery/doors/unpowered.dm @@ -19,4 +19,4 @@ icon_state = "door1" opacity = 1 density = TRUE - explosion_block = 1 \ No newline at end of file + explosion_block = 1 diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 3cd2011334..dd885542c9 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -55,6 +55,7 @@ icon_state = "[src.base_state]open" /obj/machinery/door/window/update_atom_colour() + . = ..() if((color && (color_hex2num(color) < 255))) visible = TRUE if(density) @@ -66,9 +67,9 @@ /obj/machinery/door/window/proc/open_and_close() open() if(src.check_access(null)) - sleep(50) + sleep(60) else //secure doors close faster - sleep(20) + sleep(40) close() /obj/machinery/door/window/Bumped(atom/movable/AM) @@ -242,7 +243,7 @@ add_fingerprint(user) if(!(flags_1&NODECONSTRUCT_1)) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(density || operating) to_chat(user, "You need to open the door to access the maintenance panel!") return @@ -251,7 +252,7 @@ to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the [src.name].") return - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) if(panel_open && !density && !operating) user.visible_message("[user] removes the electronics from the [src.name].", \ "You start to remove electronics from the [src.name]...") diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index a9c411c634..1cdb81ee1d 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(doppler_arrays) return /obj/machinery/doppler_array/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) if(!anchored && !isinspace()) anchored = TRUE power_change() @@ -187,4 +187,4 @@ GLOBAL_LIST_EMPTY(doppler_arrays) /obj/machinery/doppler_array/research/science/Initialize() . = ..() - linked_techweb = SSresearch.science_tech \ No newline at end of file + linked_techweb = SSresearch.science_tech diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 33ea273e9d..74df30ebfe 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -210,13 +210,13 @@ icon_state = icon_on /obj/machinery/droneDispenser/attackby(obj/item/I, mob/living/user) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() I.play_tool_sound(src) to_chat(user, "You retrieve the materials from [src].") - else if(istype(I, /obj/item/weldingtool)) + else if(I.tool_behaviour == TOOL_WELDER) if(!(stat & BROKEN)) to_chat(user, "[src] doesn't need repairs.") return diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index ea39133112..125c6692f3 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -312,4 +312,4 @@ [state_options]"} - return output \ No newline at end of file + return output diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index ca9ce09ced..c6b29cf54c 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -160,7 +160,7 @@ /obj/machinery/firealarm/attackby(obj/item/W, mob/user, params) add_fingerprint(user) - if(istype(W, /obj/item/screwdriver) && buildstage == 2) + if(W.tool_behaviour == TOOL_SCREWDRIVER && buildstage == 2) W.play_tool_sound(src) panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].") @@ -169,7 +169,7 @@ if(panel_open) - if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) + if((W.tool_behaviour == TOOL_WELDER) && user.a_intent == INTENT_HELP) if(obj_integrity < max_integrity) if(!W.tool_start_check(user, amount=0)) return @@ -184,7 +184,7 @@ switch(buildstage) if(2) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) detecting = !detecting if (src.detecting) user.visible_message("[user] has reconnected [src]'s detecting unit!", "You reconnect [src]'s detecting unit.") @@ -192,7 +192,7 @@ user.visible_message("[user] has disconnected [src]'s detecting unit!", "You disconnect [src]'s detecting unit.") return - else if (istype(W, /obj/item/wirecutters)) + else if(W.tool_behaviour == TOOL_WIRECUTTER) buildstage = 1 W.play_tool_sound(src) new /obj/item/stack/cable_coil(user.loc, 5) @@ -215,7 +215,7 @@ update_icon() return - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) user.visible_message("[user.name] removes the electronics from [src.name].", \ "You start prying out the circuit...") if(W.use_tool(src, user, 20, volume=50)) @@ -247,7 +247,7 @@ update_icon() return - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) user.visible_message("[user] removes the fire alarm assembly from the wall.", \ "You remove the fire alarm assembly from the wall.") var/obj/item/wallframe/firealarm/frame = new /obj/item/wallframe/firealarm() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index c0e1122140..20aac89743 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -57,8 +57,8 @@ //Don't want to render prison breaks impossible /obj/machinery/flasher/attackby(obj/item/W, mob/user, params) add_fingerprint(user) - if (istype(W, /obj/item/wirecutters)) - if (bulb) + if(W.tool_behaviour == TOOL_WIRECUTTER) + if(bulb) user.visible_message("[user] begins to disconnect [src]'s flashbulb.", "You begin to disconnect [src]'s flashbulb...") if(W.use_tool(src, user, 30, volume=50) && bulb) user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb.") @@ -66,7 +66,7 @@ bulb = null power_change() - else if (istype(W, /obj/item/assembly/flash/handheld)) + else if(istype(W, /obj/item/assembly/flash/handheld)) if (!bulb) if(!user.transferItemToLoc(W, src)) return @@ -76,7 +76,7 @@ else to_chat(user, "A flashbulb is already installed in [src]!") - else if (istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) if(!bulb) to_chat(user, "You start unsecuring the flasher frame...") if(W.use_tool(src, user, 40, volume=50)) @@ -173,10 +173,10 @@ flash() /obj/machinery/flasher/portable/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) W.play_tool_sound(src, 100) - if (!anchored && !isinspace()) + if(!anchored && !isinspace()) to_chat(user, "[src] is now secured.") add_overlay("[base_state]-s") setAnchored(TRUE) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index ba4d01cfe5..bb047a6a5e 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -91,7 +91,7 @@ // src.sd_SetLuminosity(0) /obj/machinery/sparker/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) add_fingerprint(user) src.disable = !src.disable if (src.disable) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index e3df79e291..87989b18ec 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -38,8 +38,7 @@ if(I.tool_behaviour == TOOL_MULTITOOL) if(!multitool_check_buffer(user, I)) return - var/obj/item/multitool/M = I - M.buffer = src + I.buffer = src to_chat(user, "You save the data in the [I.name]'s buffer.") return TRUE diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index f77cf3adfb..33f949aba4 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -24,19 +24,24 @@ var/selected_category var/screen = 1 var/list/categories = list( - "human", - "lizard", - "fly", - "insect", - "plasmaman", - "mammal", - "xeno", - "other" + "human" = /datum/species/human, + "lizard" = /datum/species/lizard, + "mammal" = /datum/species/mammal, + "insect" = /datum/species/insect, + "fly" = /datum/species/fly, + "plasmaman" = /datum/species/plasmaman, + "xeno" = /datum/species/xeno, + "other" = /datum/species, ) + var/list/stored_species = list() + var/obj/item/disk/data/dna_disk /obj/machinery/limbgrower/Initialize() create_reagents(100, OPENCONTAINER) stored_research = new /datum/techweb/specialized/autounlocking/limbgrower + for(var/i in categories) + var/species = categories[i] + stored_species[i] = new species() . = ..() /obj/machinery/limbgrower/ui_interact(mob/user) @@ -64,8 +69,8 @@ ..() /obj/machinery/limbgrower/attackby(obj/item/O, mob/user, params) - if (busy) - to_chat(user, "The Limb Grower is busy. Please wait for completion of previous operation.") + if(busy) + to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.") return if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", O)) @@ -78,6 +83,16 @@ if(user.a_intent == INTENT_HARM) //so we can hit the machine return ..() + if(istype(O, /obj/item/disk)) + if(dna_disk) + to_chat(user, "\The [src] already has a dna disk, take it out first!") + return + else + O.forceMove(src) + dna_disk = O + to_chat(user, "You insert \the [O] into \the [src].") + return + /obj/machinery/limbgrower/Topic(href, href_list) if(..()) return @@ -110,8 +125,24 @@ icon_state = "limbgrower_idleon" addtimer(CALLBACK(src, .proc/build_item),32*prod_coeff) + if(href_list["dna_disk"]) + var/mob/living/carbon/user = usr + if(istype(user)) + if(!dna_disk) + var/obj/item/disk/diskette = user.get_active_held_item() + if(istype(diskette)) + diskette.forceMove(src) + dna_disk = diskette + to_chat(user, "You insert \the [diskette] into \the [src].") + else + dna_disk.forceMove(src.loc) + user.put_in_active_hand(dna_disk) + to_chat(user, "You remove \the [dna_disk] from \the [src].") + dna_disk = null + else + to_chat(user, "You are unable to grasp \the [dna_disk] disk from \the [src].") else - to_chat(usr, "The limb grower is busy. Please wait for completion of previous operation.") + to_chat(usr, "\The [src] is busy. Please wait for completion of previous operation.") updateUsrDialog() return @@ -120,8 +151,10 @@ if(reagents.has_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff)) //sanity check, if this happens we are in big trouble reagents.remove_reagent(/datum/reagent/medicine/synthflesh, being_built.reagents_list[/datum/reagent/medicine/synthflesh]*prod_coeff) var/buildpath = being_built.build_path - if(ispath(buildpath, /obj/item/bodypart)) //This feels like spatgheti code, but i need to initilise a limb somehow + if(ispath(buildpath, /obj/item/bodypart)) //This feels like spaghetti code, but i need to initiliaze a limb somehow build_limb(buildpath) + else if(ispath(buildpath, /obj/item/organ/genital)) //genitals are uhh... customizable + build_genital(buildpath) else //Just build whatever it is new buildpath(loc) @@ -135,19 +168,65 @@ /obj/machinery/limbgrower/proc/build_limb(buildpath) //i need to create a body part manually using a set icon (otherwise it doesnt appear) var/obj/item/bodypart/limb + var/datum/species/selected = stored_species[selected_category] limb = new buildpath(loc) - if(selected_category=="human" || selected_category=="lizard") //Species with greyscale parts should be included here - limb.icon = 'icons/mob/human_parts_greyscale.dmi' - limb.base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC - limb.color_src = MUTCOLORS - else - limb.icon = 'icons/mob/human_parts.dmi' - // Set this limb up using the specias name and body zone - limb.icon_state = "[selected_category]_[limb.body_zone]" - limb.name = "\improper synthetic [selected_category] [parse_zone(limb.body_zone)]" - limb.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]." - limb.species_id = selected_category + limb.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC + limb.species_id = selected.limbs_id + limb.color_src = (MUTCOLORS in selected.species_traits ? MUTCOLORS : (selected.use_skintones ? SKINTONE : FALSE)) + limb.should_draw_gender = (selected.sexes && (limb.body_zone in list(BODY_ZONE_HEAD, BODY_ZONE_CHEST))) + limb.update_limb(TRUE) limb.update_icon_dropped() + limb.name = "\improper synthetic [lowertext(selected.name)] [limb.name]" + limb.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]." + for(var/obj/item/bodypart/BP in limb) + BP.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC + BP.species_id = selected.limbs_id + BP.color_src = (MUTCOLORS in selected.species_traits ? MUTCOLORS : (selected.use_skintones ? SKINTONE : FALSE)) + BP.should_draw_gender = (selected.sexes && (limb.body_zone in list(BODY_ZONE_HEAD, BODY_ZONE_CHEST))) + BP.update_limb(TRUE) + BP.update_icon_dropped() + BP.name = "\improper synthetic [lowertext(selected.name)] [limb.name]" + BP.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]." + +/obj/machinery/limbgrower/proc/build_genital(buildpath) + //i needed to create a way to customize gene tools using dna + var/list/features = dna_disk?.fields["features"] + if(length(features)) + switch(buildpath) + if(/obj/item/organ/genital/penis) + var/obj/item/organ/genital/penis/penis = new(loc) + if(features["has_cock"]) + penis.shape = features["cock_shape"] + penis.length = features["cock_shape"] + penis.diameter_ratio = features["cock_diameter_ratio"] + penis.color = sanitize_hexcolor(features["cock_color"], 6) + penis.update_icon() + if(/obj/item/organ/genital/testicles) + var/obj/item/organ/genital/testicles/balls = new(loc) + if(features["has_balls"]) + balls.color = sanitize_hexcolor(features["balls_color"], 6) + balls.shape = features["balls_shape"] + balls.size = features["balls_size"] + balls.fluid_rate = features["balls_cum_rate"] + balls.fluid_mult = features["balls_cum_mult"] + balls.fluid_efficiency = features["balls_efficiency"] + if(/obj/item/organ/genital/vagina) + var/obj/item/organ/genital/vagina/vegana = new(loc) + if(features["has_vagina"]) + vegana.color = sanitize_hexcolor(features["vag_color"], 6) + vegana.shape = features["vag_shape"] + if(/obj/item/organ/genital/breasts) + var/obj/item/organ/genital/breasts/boobs = new(loc) + if(features["has_breasts"]) + boobs.color = sanitize_hexcolor(features["breasts_color"], 6) + boobs.size = features["breasts_size"] + boobs.shape = features["breasts_shape"] + if(!features["breasts_producing"]) + boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH) + else + new buildpath(loc) + else + new buildpath(loc) /obj/machinery/limbgrower/RefreshParts() reagents.maximum_volume = 0 @@ -165,7 +244,9 @@ . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
    Synthflesh consumption at [prod_coeff*100]%." /obj/machinery/limbgrower/proc/main_win(mob/user) - var/dat = "

    Limb Grower Menu:


    " + var/dat = "

    [src] Menu:


    " + dat += "[dna_disk ? "Remove" : "Insert"] cloning data disk" + dat += "
    " dat += "Chemical Storage" dat += materials_printout() dat += "" @@ -218,7 +299,7 @@ /obj/machinery/limbgrower/proc/get_design_cost(datum/design/D) var/dat - if(D.reagents_list["synthflesh"]) + if(D.reagents_list[/datum/reagent/medicine/synthflesh]) dat += "[D.reagents_list[/datum/reagent/medicine/synthflesh] * prod_coeff] Synthetic flesh " return dat @@ -233,3 +314,47 @@ to_chat(user, "A warning flashes onto the screen, stating that safety overrides have been deactivated!") obj_flags |= EMAGGED return TRUE + +/obj/machinery/limbgrower/AltClick(mob/living/user) + . = ..() + if(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(busy) + to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.") + else + if(dna_disk) + dna_disk.forceMove(src.loc) + user.put_in_active_hand(dna_disk) + to_chat(user, "You remove \the [dna_disk] from \the [src].") + dna_disk = null + else + to_chat(user, "\The [src] has doesn't have a disk on it!") + +//Defines some vars that makes limbs appears, TO-DO: define every single species. + +/datum/species/human + limbs_id = SPECIES_HUMAN + icon_limbs = 'icons/mob/human_parts_greyscale.dmi' + +/datum/species/lizard + limbs_id = SPECIES_LIZARD + icon_limbs = 'icons/mob/human_parts_greyscale.dmi' + +/datum/species/mammal + limbs_id = SPECIES_MAMMAL + icon_limbs = 'icons/mob/human_parts_greyscale.dmi' + +/datum/species/insect + limbs_id = SPECIES_INSECT + icon_limbs = 'icons/mob/human_parts_greyscale.dmi' + +/datum/species/fly + limbs_id = SPECIES_FLY + icon_limbs = 'icons/mob/human_parts.dmi' + +/datum/species/plasmaman + limbs_id = SPECIES_PLASMAMAN + icon_limbs = 'icons/mob/human_parts.dmi' + +/datum/species/xeno + limbs_id = SPECIES_XENOHYBRID + icon_limbs = 'icons/mob/human_parts_greyscale.dmi' diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 0b89b117c4..b39c6d350f 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -48,4 +48,4 @@ if(isliving(O)) var/mob/living/L = O to_chat(L, "You feel something click beneath you!") - addtimer(CALLBACK(src, .proc/drive), drive_delay) \ No newline at end of file + addtimer(CALLBACK(src, .proc/drive), drive_delay) diff --git a/code/game/machinery/mechlaunchpad.dm b/code/game/machinery/mechlaunchpad.dm new file mode 100644 index 0000000000..f32fe0bc4f --- /dev/null +++ b/code/game/machinery/mechlaunchpad.dm @@ -0,0 +1,77 @@ +/obj/machinery/mechpad + name = "orbital mech pad" + desc = "A slab of heavy plating designed to withstand orbital-drop impacts. Through some sort of advanced bluespace tech, this one seems able to send and receive Mechs. Requires linking to a console to function." + icon = 'icons/obj/telescience.dmi' + icon_state = "mechpad" + circuit = /obj/item/circuitboard/machine/mechpad + ///ID of the console, used for linking up + var/id = "roboticsmining" + ///Name of the mechpad in a mechpad console + var/display_name = "Orbital Pad" + ///The console the pad is linked to + var/obj/machinery/computer/mechpad/connected_console + ///List of consoles that can access the pad + var/list/obj/machinery/computer/mechpad/consoles + +/obj/machinery/mechpad/Initialize() + . = ..() + display_name = "Orbital Pad - [get_area_name(src)]" + GLOB.mechpad_list += src + +/obj/machinery/mechpad/Destroy() + if(connected_console) + connected_console.connected_mechpad = null + connected_console = null + for(var/obj/machinery/computer/mechpad/console in consoles) + console.mechpads -= src + return ..() + +/obj/machinery/mechpad/screwdriver_act(mob/user, obj/item/tool) + . = ..() + if(!.) + return default_deconstruction_screwdriver(user, "mechpad-o", "mechpad", tool) + +/obj/machinery/mechpad/crowbar_act(mob/user, obj/item/tool) + ..() + if(default_deconstruction_crowbar(tool)) + return TRUE + +/obj/machinery/mechpad/multitool_act(mob/living/user, obj/item/tool) + if(!tool.tool_behaviour == TOOL_MULTITOOL) + return + if(!panel_open) + return + if(!multitool_check_buffer(user, tool)) + return + tool.buffer = src + to_chat(user, "You save the data in the [tool.name]'s buffer.") + return TRUE + +/** + * Spawns a special supply pod whitelisted to only accept mechs and have its drop off location be another mechpad + * Arguments: + * * where - where the supply pod will land after grabbing the mech + */ +/obj/machinery/mechpad/proc/launch(obj/machinery/mechpad/where) + var/obj/structure/closet/supplypod/mechpod/pod = new() + var/turf/target_turf = get_turf(where) + pod.reverse_dropoff_coords = list(target_turf.x, target_turf.y, target_turf.z) + new /obj/effect/pod_landingzone(get_turf(src), pod) + +/obj/structure/closet/supplypod/mechpod + style = STYLE_SEETHROUGH + explosionSize = list(0,0,0,0) + reversing = TRUE + landingDelay = 0 + openingDelay = 0 + departureDelay = 0 + effectOrgans = TRUE + effectQuiet = TRUE + leavingSound = 'sound/vehicles/rocketlaunch.ogg' + close_sound = null + pod_flags = FIRST_SOUNDS + +/obj/structure/closet/supplypod/mechpod/insertion_allowed(atom/movable/AM) + if(!ismecha(AM)) + return FALSE + . = ..() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 766943de36..752ba1b732 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -89,7 +89,7 @@ if(T.intact) return // prevent intraction when T-scanner revealed - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) open = !open user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 3acbaba4fd..141afa53e7 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -127,7 +127,9 @@ Buildable meters /obj/item/pipe/attack_self(mob/user) setDir(turn(dir,-90)) -/obj/item/pipe/wrench_act(mob/living/user, obj/item/wrench/W) +/obj/item/pipe/wrench_act(mob/living/user, obj/item/W) + if(!W.tool_behaviour == TOOL_WRENCH) + return if(!isturf(loc)) return TRUE @@ -196,8 +198,9 @@ Buildable meters w_class = WEIGHT_CLASS_BULKY var/piping_layer = PIPING_LAYER_DEFAULT -/obj/item/pipe_meter/wrench_act(mob/living/user, obj/item/wrench/W) - +/obj/item/pipe_meter/wrench_act(mob/living/user, obj/item/W) + if(!W.tool_behaviour == TOOL_WRENCH) + return var/obj/machinery/atmospherics/pipe/pipe for(var/obj/machinery/atmospherics/pipe/P in loc) if(P.piping_layer == piping_layer) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 34745a65f6..aad64df6d9 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -283,9 +283,9 @@ /obj/machinery/porta_turret/attackby(obj/item/I, mob/user, params) if(stat & BROKEN) - if(istype(I, /obj/item/crowbar)) - //If the turret is destroyed, you can remove it with a crowbar to - //try and salvage its components + if(I.tool_behaviour == TOOL_CROWBAR) + //If the turret is destroyed, you can remove it with something + //that acts like a crowbar to try and salvage its components to_chat(user, "You begin prying the metal coverings off...") if(I.use_tool(src, user, 20)) if(prob(70)) @@ -302,7 +302,7 @@ qdel(src) return - else if((istype(I, /obj/item/wrench)) && (!on)) + else if((I.tool_behaviour == TOOL_WRENCH) && (!on)) if(raised) return @@ -329,12 +329,11 @@ to_chat(user, "Controls are now [locked ? "locked" : "unlocked"].") else to_chat(user, "Access denied.") - else if(istype(I, /obj/item/multitool) && !locked) + else if(I.tool_behaviour == TOOL_MULTITOOL && !locked) if(!multitool_check_buffer(user, I)) return - var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, "You add [src] to multitool buffer.") + I.buffer = src + to_chat(user, "You add [src] to [I]'s buffer.") else return ..() @@ -393,6 +392,27 @@ spark_system.start() //creates some sparks because they look cool qdel(cover) //deletes the cover - no need on keeping it there! +//turret healing +/obj/machinery/porta_turret/examine(mob/user) + . = ..() + if(obj_integrity < max_integrity) + . += "[src] is damaged, use a lit welder to fix it." + +/obj/machinery/porta_turret/welder_act(mob/living/user, obj/item/I) + . = TRUE + if(cover && obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is welding the turret.", \ + "You begin repairing the turret...", \ + "You hear welding.") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + user.visible_message("[user.name] has repaired [src].", \ + "You finish repairing the turret.") + else + to_chat(user, "The turret doesn't need repairing.") + /obj/machinery/porta_turret/process() //the main machinery process if(cover == null && anchored) //if it has no cover and is anchored @@ -774,6 +794,9 @@ stun_projectile_sound = 'sound/weapons/gunshot_smg.ogg' armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 80, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) +/obj/machinery/porta_turret/syndicate/pod/toolbox + max_integrity = 100 + /obj/machinery/porta_turret/syndicate/shuttle/target(atom/movable/target) if(target) setDir(get_dir(base, target))//even if you can't shoot, follow the target @@ -924,20 +947,19 @@ if(stat & BROKEN) return - if (istype(I, /obj/item/multitool)) + if(I.tool_behaviour == TOOL_MULTITOOL) if(!multitool_check_buffer(user, I)) return - var/obj/item/multitool/M = I - if(M.buffer && istype(M.buffer, /obj/machinery/porta_turret)) - turrets |= M.buffer - to_chat(user, "You link \the [M.buffer] with \the [src].") + if(I.buffer && istype(I.buffer, /obj/machinery/porta_turret)) + turrets |= I.buffer + to_chat(user, "You link \the [I.buffer] with \the [src].") return - if (issilicon(user)) + if(issilicon(user)) return attack_hand(user) - if ( get_dist(src, user) == 0 ) // trying to unlock the interface - if (allowed(usr)) + if(get_dist(src, user) == 0 ) // trying to unlock the interface + if(allowed(usr)) if(obj_flags & EMAGGED) to_chat(user, "The turret control is unresponsive!") return diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 2a73ee8d89..3b9e6ff45f 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -23,14 +23,14 @@ //this is a bit unwieldy but self-explanatory switch(build_step) if(PTURRET_UNSECURED) //first step - if(istype(I, /obj/item/wrench) && !anchored) + if(I.tool_behaviour == TOOL_WRENCH && !anchored) I.play_tool_sound(src, 100) to_chat(user, "You secure the external bolts.") setAnchored(TRUE) build_step = PTURRET_BOLTED return - else if(istype(I, /obj/item/crowbar) && !anchored) + else if(I.tool_behaviour == TOOL_CROWBAR && !anchored) I.play_tool_sound(src, 75) to_chat(user, "You dismantle the turret construction.") new /obj/item/stack/sheet/metal( loc, 5) @@ -48,7 +48,7 @@ to_chat(user, "You need two sheets of metal to continue construction!") return - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 75) to_chat(user, "You unfasten the external bolts.") setAnchored(FALSE) @@ -57,13 +57,13 @@ if(PTURRET_START_INTERNAL_ARMOUR) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 100) to_chat(user, "You bolt the metal armor into place.") build_step = PTURRET_INTERNAL_ARMOUR_ON return - else if(istype(I, /obj/item/weldingtool)) + else if(I.tool_behaviour == TOOL_WELDER) if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel return @@ -89,7 +89,7 @@ build_step = PTURRET_GUN_EQUIPPED return - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 100) to_chat(user, "You remove the turret's metal armor bolts.") build_step = PTURRET_START_INTERNAL_ARMOUR @@ -106,7 +106,7 @@ if(PTURRET_SENSORS_ON) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) I.play_tool_sound(src, 100) build_step = PTURRET_CLOSED to_chat(user, "You close the internal access hatch.") @@ -123,14 +123,14 @@ to_chat(user, "You need two sheets of metal to continue construction!") return - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) I.play_tool_sound(src, 100) build_step = PTURRET_SENSORS_ON to_chat(user, "You open the internal access hatch.") return if(PTURRET_START_EXTERNAL_ARMOUR) - if(istype(I, /obj/item/weldingtool)) + if(I.tool_behaviour == TOOL_WELDER) if(!I.tool_start_check(user, amount=5)) return @@ -153,7 +153,7 @@ qdel(src) return - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) I.play_tool_sound(src, 75) to_chat(user, "You pry off the turret's exterior armor.") new /obj/item/stack/sheet/metal(loc, 2) diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index e0746bda78..33a7a44e63 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -37,7 +37,7 @@ /obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench) && !parent_turret.on) + if(I.tool_behaviour == TOOL_WRENCH && !parent_turret.on) if(parent_turret.raised) return @@ -60,10 +60,9 @@ updateUsrDialog() else to_chat(user, "Access denied.") - else if(istype(I, /obj/item/multitool) && !parent_turret.locked) - var/obj/item/multitool/M = I - M.buffer = parent_turret - to_chat(user, "You add [parent_turret] to multitool buffer.") + else if(I.tool_behaviour == TOOL_MULTITOOL && !parent_turret.locked) + I.buffer = parent_turret + to_chat(user, "You add [parent_turret] to [I]'s buffer.") else return ..() diff --git a/code/game/machinery/poweredfans/fan_assembly.dm b/code/game/machinery/poweredfans/fan_assembly.dm index 651b3342ac..59dbe84def 100644 --- a/code/game/machinery/poweredfans/fan_assembly.dm +++ b/code/game/machinery/poweredfans/fan_assembly.dm @@ -25,7 +25,7 @@ switch(stat) if(1) // Stat 1 - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You weld the fan assembly securely into place.") setAnchored(TRUE) @@ -46,7 +46,7 @@ forceMove(F) F.setDir(src.dir) return - else if(istype(W, /obj/item/weldingtool)) + else if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You unweld the fan assembly from its place.") stat = 1 @@ -64,7 +64,9 @@ deconstruct() return TRUE -/obj/machinery/fan_assembly/proc/weld(obj/item/weldingtool/W, mob/living/user) +/obj/machinery/fan_assembly/proc/weld(obj/item/W, mob/living/user) + if(!W.tool_behaviour == TOOL_WELDER) + return if(!W.tool_start_check(user, amount=0)) return FALSE switch(stat) diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index f9fda50daf..5c1a2195a4 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -55,19 +55,17 @@ return if(panel_open) - if(istype(I, /obj/item/multitool)) - var/obj/item/multitool/M = I - M.buffer = src + if(I.tool_behaviour == TOOL_MULTITOOL) + I.buffer = src to_chat(user, "You save the data in [I]'s buffer. It can now be saved to pads with closed panels.") return TRUE - else if(istype(I, /obj/item/multitool)) - var/obj/item/multitool/M = I - if(istype(M.buffer, /obj/machinery/quantumpad)) - if(M.buffer == src) + else if(I.tool_behaviour == TOOL_MULTITOOL) + if(istype(I.buffer, /obj/machinery/quantumpad)) + if(I.buffer == src) to_chat(user, "You cannot link a pad to itself!") return TRUE else - linked_pad = M.buffer + linked_pad = I.buffer to_chat(user, "You link [src] to the one in [I]'s buffer.") return TRUE else @@ -130,7 +128,7 @@ /obj/machinery/quantumpad/proc/doteleport(mob/user, obj/machinery/quantumpad/target_pad = linked_pad) if(target_pad) - playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1) + playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, TRUE) teleporting = TRUE spawn(teleport_speed) @@ -155,9 +153,9 @@ target_pad.sparks() flick("qpad-beam", src) - playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE) flick("qpad-beam", target_pad) - playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, TRUE) for(var/atom/movable/ROI in get_turf(src)) if(QDELETED(ROI)) continue //sleeps in CHECK_TICK diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 1d118023c9..aad011119f 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -61,7 +61,7 @@ setCharging() /obj/machinery/recharger/attackby(obj/item/G, mob/user, params) - if(istype(G, /obj/item/wrench)) + if(G.tool_behaviour == TOOL_WRENCH) if(charging) to_chat(user, "Remove the charging item first!") return @@ -102,7 +102,7 @@ if(default_deconstruction_screwdriver(user, "rechargeropen", "recharger0", G)) return - if(panel_open && istype(G, /obj/item/crowbar)) + if(panel_open && G.tool_behaviour == TOOL_CROWBAR) default_deconstruction_crowbar(G) return diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 706d2bb9bf..2ffd556dc1 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -100,51 +100,54 @@ eat(AM) . = ..() -/obj/machinery/recycler/proc/eat(atom/AM0) - if(stat & (BROKEN|NOPOWER) || safety_mode) +/obj/machinery/recycler/proc/eat(atom/movable/AM0, sound=TRUE) + if(stat & (BROKEN|NOPOWER)) return + if(safety_mode) + return + if(!isturf(AM0.loc)) + return //I don't know how you called Crossed() but stop it. - var/list/to_eat + var/list/to_eat = AM0.GetAllContents() - to_eat = list(AM0) + var/living_detected = FALSE //technically includes silicons as well but eh + var/list/nom = list() + var/list/crunchy_nom = list() //Mobs have to be handled differently so they get a different list instead of checking them multiple times. - var/items_recycled = 0 - var/buzz = FALSE for(var/i in to_eat) var/atom/movable/AM = i - if(QDELETED(AM)) - continue - var/obj/item/bodypart/head/as_head = AM - var/obj/item/mmi/as_mmi = AM - var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay) - if(brain_holder) - if(obj_flags & EMAGGED) - continue - else - emergency_stop(AM) - return + if(istype(AM, /obj/item)) + var/obj/item/bodypart/head/as_head = AM + var/obj/item/mmi/as_mmi = AM + if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay)) + living_detected = TRUE + nom += AM else if(isliving(AM)) - if((obj_flags & EMAGGED)||((!allowed(AM))&&(!ishuman(AM)))) - to_eat += crush_living(AM) - else - emergency_stop(AM) - return - else if(isitem(AM)) - var/obj/O = AM - if(O.resistance_flags & INDESTRUCTIBLE) - buzz = TRUE - O.forceMove(loc) - else - to_eat += recycle_item(AM) - items_recycled++ - else - buzz = TRUE - AM.forceMove(loc) - - if(items_recycled) - playsound(src, item_recycle_sound, 50, 1) - if(buzz) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) + living_detected = TRUE + crunchy_nom += AM + var/not_eaten = to_eat.len - nom.len - crunchy_nom.len + if(living_detected) // First, check if we have any living beings detected. + if(obj_flags & EMAGGED) + for(var/CRUNCH in crunchy_nom) // Eat them and keep going because we don't care about safety. + if(isliving(CRUNCH)) // MMIs and brains will get eaten like normal items + crush_living(CRUNCH) + else // Stop processing right now without eating anything. + emergency_stop() + return + for(var/nommed in nom) + recycle_item(nommed) + if(nom.len && sound) + playsound(src, item_recycle_sound, (50 + nom.len*5), TRUE, nom.len, ignore_walls = (nom.len - 10)) // As a substitute for playing 50 sounds at once. + if(not_eaten) + playsound(src, 'sound/machines/buzz-sigh.ogg', (50 + not_eaten*5), FALSE, not_eaten, ignore_walls = (not_eaten - 10)) // Ditto. + if(!ismob(AM0)) + AM0.moveToNullspace() + qdel(AM0) + else // Lets not move a mob to nullspace and qdel it, yes? + for(var/i in AM0.contents) + var/atom/movable/content = i + content.moveToNullspace() + qdel(content) /obj/machinery/recycler/proc/recycle_item(obj/item/I) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 2915c2f34b..5d1b30741b 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -502,7 +502,7 @@ GLOBAL_LIST_EMPTY(allConsoles) messages += "From: [linkedsender]
    [message]" /obj/machinery/requests_console/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/crowbar)) + if(O.tool_behaviour == TOOL_CROWBAR) if(open) to_chat(user, "You close the maintenance panel.") open = FALSE @@ -511,7 +511,7 @@ GLOBAL_LIST_EMPTY(allConsoles) open = TRUE update_icon() return - if(istype(O, /obj/item/screwdriver)) + if(O.tool_behaviour == TOOL_SCREWDRIVER) if(open) hackState = !hackState if(hackState) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 8a0f376b0f..2ebb137839 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -146,7 +146,7 @@ return /obj/machinery/shieldgen/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) W.play_tool_sound(src, 100) panel_open = !panel_open if(panel_open) @@ -165,7 +165,7 @@ to_chat(user, "You repair \the [src].") update_icon() - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) if(locked) to_chat(user, "The bolts are covered! Unlocking this would retract the covers.") return @@ -343,7 +343,7 @@ return ..() /obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, W, 0) else if(W.GetID()) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 6282d74346..1fadad168e 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -11,6 +11,8 @@ #define SPIN_TIME 65 //As always, deciseconds. #define REEL_DEACTIVATE_DELAY 7 #define SEVEN "7" +#define HOLOCHIP 1 +#define COIN 2 /obj/machinery/computer/slot_machine name = "slot machine" @@ -21,40 +23,48 @@ use_power = IDLE_POWER_USE idle_power_usage = 50 circuit = /obj/item/circuitboard/computer/slot_machine + light_color = LIGHT_COLOR_BROWN var/money = 3000 //How much money it has CONSUMED var/plays = 0 - var/working = 0 + var/working = FALSE var/balance = 0 //How much money is in the machine, ready to be CONSUMED. var/jackpots = 0 + var/paymode = HOLOCHIP //toggles between HOLOCHIP/COIN, defined above + var/cointype = /obj/item/coin/iron //default cointype + var/list/coinvalues = list() var/list/reels = list(list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0) var/list/symbols = list(SEVEN = 1, "&" = 2, "@" = 2, "$" = 2, "?" = 2, "#" = 2, "!" = 2, "%" = 2) //if people are winning too much, multiply every number in this list by 2 and see if they are still winning too much. - light_color = LIGHT_COLOR_BROWN /obj/machinery/computer/slot_machine/Initialize() . = ..() jackpots = rand(1, 4) //false hope plays = rand(75, 200) - toggle_reel_spin(1) //The reels won't spin unless we activate them + INVOKE_ASYNC(src, .proc/toggle_reel_spin, TRUE)//The reels won't spin unless we activate them var/list/reel = reels[1] for(var/i = 0, i < reel.len, i++) //Populate the reels. randomize_reels() - toggle_reel_spin(0) + INVOKE_ASYNC(src, .proc/toggle_reel_spin, FALSE) + + for(cointype in typesof(/obj/item/coin)) + var/obj/item/coin/C = new cointype + coinvalues["[cointype]"] = C.get_item_credit_value() + qdel(C) //Sigh /obj/machinery/computer/slot_machine/Destroy() if(balance) - give_coins(balance) + give_payout(balance) return ..() -/obj/machinery/computer/slot_machine/process() +/obj/machinery/computer/slot_machine/process(delta_time) . = ..() //Sanity checks. if(!.) return . - money++ //SPESSH MAJICKS + money += round(delta_time / 2) //SPESSH MAJICKS /obj/machinery/computer/slot_machine/update_icon_state() if(stat & NOPOWER) @@ -69,27 +79,46 @@ else icon_state = "slots1" -/obj/machinery/computer/slot_machine/power_change() - ..() - update_icon() - /obj/machinery/computer/slot_machine/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/coin)) var/obj/item/coin/C = I - if(prob(2)) - if(!user.transferItemToLoc(C, drop_location())) - return - C.throw_at(user, 3, 10) - if(prob(10)) - balance = max(balance - SPIN_PRICE, 0) - to_chat(user, "[src] spits your coin back out!") + if(paymode == COIN) + if(prob(2)) + if(!user.transferItemToLoc(C, drop_location())) + return + C.throw_at(user, 3, 10) + if(prob(10)) + balance = max(balance - SPIN_PRICE, 0) + to_chat(user, "[src] spits your coin back out!") + else + if(!user.temporarilyRemoveItemFromInventory(C)) + return + to_chat(user, "You insert [C] into [src]'s slot!") + balance += C.value + qdel(C) else - if(!user.temporarilyRemoveItemFromInventory(C)) + to_chat(user, "This machine is only accepting holochips!") + else if(istype(I, /obj/item/holochip)) + if(paymode == HOLOCHIP) + var/obj/item/holochip/H = I + if(!user.temporarilyRemoveItemFromInventory(H)) return - to_chat(user, "You insert [C] into [src]'s slot!") - balance += C.value - qdel(C) + to_chat(user, "You insert [H.credits] holocredits into [src]'s slot!") + balance += H.credits + qdel(H) + else + to_chat(user, "This machine is only accepting coins!") + else if(I.tool_behaviour == TOOL_MULTITOOL) + if(balance > 0) + visible_message("[src] says, 'ERROR! Please empty the machine balance before altering paymode'") //Prevents converting coins into holocredits and vice versa + else + if(paymode == HOLOCHIP) + paymode = COIN + visible_message("[src] says, 'This machine now works with COINS!'") + else + paymode = HOLOCHIP + visible_message("[src] says, 'This machine now works with HOLOCHIPS!'") else return ..() @@ -101,8 +130,7 @@ var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(4, 0, src.loc) spark_system.start() - playsound(src, "sparks", 50, 1) - return TRUE + playsound(src, "sparks", 50, TRUE) /obj/machinery/computer/slot_machine/ui_interact(mob/living/user) . = ..() @@ -127,8 +155,9 @@ Play!

    [reeltext] -
    - Refund balance
    "} +
    "} + if(balance > 0) + dat+="Refund balance
    " var/datum/browser/popup = new(user, "slotmachine", "Slot Machine") popup.set_content(dat) @@ -143,21 +172,22 @@ spin(usr) else if(href_list["refund"]) - give_coins(balance) - balance = 0 + if(balance > 0) + give_payout(balance) + balance = 0 /obj/machinery/computer/slot_machine/emp_act(severity) . = ..() if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF) return - if(prob(1500 / severity)) + if(prob(15 * severity)) return - if(prob(1 * severity/100)) // :^) + if(prob(1)) // :^) obj_flags |= EMAGGED var/severity_ascending = 4 - severity money = max(rand(money - (200 * severity_ascending), money + (200 * severity_ascending)), 0) balance = max(rand(balance - (50 * severity_ascending), balance + (50 * severity_ascending)), 0) - money -= max(0, give_coins(min(rand(-50, 100 * severity_ascending)), money)) //This starts at -50 because it shouldn't always dispense coins yo + money -= max(0, give_payout(min(rand(-50, 100 * severity_ascending)), money)) //This starts at -50 because it shouldn't always dispense coins yo spin() /obj/machinery/computer/slot_machine/proc/spin(mob/user) @@ -174,37 +204,43 @@ balance -= SPIN_PRICE money += SPIN_PRICE plays += 1 - working = 1 + working = TRUE toggle_reel_spin(1) update_icon() updateDialog() - spawn(0) - while(working) - randomize_reels() - updateDialog() - sleep(2) + var/spin_loop = addtimer(CALLBACK(src, .proc/do_spin), 2, TIMER_LOOP|TIMER_STOPPABLE) - spawn(SPIN_TIME - (REEL_DEACTIVATE_DELAY * reels.len)) //WARNING: no sanity checking for user since it's not needed and would complicate things (machine should still spin even if user is gone), be wary of this if you're changing this code. - toggle_reel_spin(0, REEL_DEACTIVATE_DELAY) - working = 0 - give_prizes(the_name, user) - update_icon() - updateDialog() + addtimer(CALLBACK(src, .proc/finish_spinning, spin_loop, user, the_name), SPIN_TIME - (REEL_DEACTIVATE_DELAY * reels.len)) + //WARNING: no sanity checking for user since it's not needed and would complicate things (machine should still spin even if user is gone), be wary of this if you're changing this code. + +/obj/machinery/computer/slot_machine/proc/do_spin() + randomize_reels() + updateDialog() + +/obj/machinery/computer/slot_machine/proc/finish_spinning(spin_loop, mob/user, the_name) + toggle_reel_spin(0, REEL_DEACTIVATE_DELAY) + working = FALSE + deltimer(spin_loop) + give_prizes(the_name, user) + update_icon() + updateDialog() /obj/machinery/computer/slot_machine/proc/can_spin(mob/user) if(stat & NOPOWER) to_chat(user, "The slot machine has no power!") + return FALSE if(stat & BROKEN) to_chat(user, "The slot machine is broken!") + return FALSE if(working) to_chat(user, "You need to wait until the machine stops spinning before you can play again!") - return 0 + return FALSE if(balance < SPIN_PRICE) to_chat(user, "Insufficient money to play!") - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/computer/slot_machine/proc/toggle_reel_spin(value, delay = 0) //value is 1 or 0 aka on or off for(var/list/reel in reels) @@ -223,23 +259,25 @@ var/linelength = get_lines() if(reels[1][2] + reels[2][2] + reels[3][2] + reels[4][2] + reels[5][2] == "[SEVEN][SEVEN][SEVEN][SEVEN][SEVEN]") - visible_message("[src] says, 'JACKPOT! You win [money] credits worth of coins!'") + visible_message("[src] says, 'JACKPOT! You win [money] credits!'") priority_announce("Congratulations to [user ? user.real_name : usrname] for winning the jackpot at the slot machine in [get_area(src)]!") jackpots += 1 - balance += money - give_coins(JACKPOT) + balance += money - give_payout(JACKPOT) money = 0 - - for(var/i = 0, i < 5, i++) - var/cointype = pick(subtypesof(/obj/item/coin)) - var/obj/item/coin/C = new cointype(loc) - random_step(C, 2, 50) + if(paymode == HOLOCHIP) + new /obj/item/holochip(loc,JACKPOT) + else + for(var/i = 0, i < 5, i++) + cointype = pick(subtypesof(/obj/item/coin)) + var/obj/item/coin/C = new cointype(loc) + random_step(C, 2, 50) else if(linelength == 5) - visible_message("[src] says, 'Big Winner! You win a thousand credits worth of coins!'") + visible_message("[src] says, 'Big Winner! You win a thousand credits!'") give_money(BIG_PRIZE) else if(linelength == 4) - visible_message("[src] says, 'Winner! You win four hundred credits worth of coins!'") + visible_message("[src] says, 'Winner! You win four hundred credits!'") give_money(SMALL_PRIZE) else if(linelength == 3) @@ -271,12 +309,15 @@ /obj/machinery/computer/slot_machine/proc/give_money(amount) var/amount_to_give = money >= amount ? amount : money - var/surplus = amount_to_give - give_coins(amount_to_give) + var/surplus = amount_to_give - give_payout(amount_to_give) money = max(0, money - amount) balance += surplus -/obj/machinery/computer/slot_machine/proc/give_coins(amount) - var/cointype = obj_flags & EMAGGED ? /obj/item/coin/iron : /obj/item/coin/silver +/obj/machinery/computer/slot_machine/proc/give_payout(amount) + if(paymode == HOLOCHIP) + cointype = /obj/item/holochip + else + cointype = obj_flags & EMAGGED ? /obj/item/coin/iron : /obj/item/coin/silver if(!(obj_flags & EMAGGED)) amount = dispense(amount, cointype, null, 0) @@ -288,22 +329,25 @@ return amount -/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/coin/silver, mob/living/target, throwit = FALSE) - var/value = GLOB.coin_values[cointype] || GLOB.coin_values[/obj/item/coin/iron] - INVOKE_ASYNC(src, .proc/become_rich, amount, value, cointype, target, throwit) - return amount % value +/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/coin/silver, mob/living/target, throwit = 0) + if(paymode == HOLOCHIP) + var/obj/item/holochip/H = new /obj/item/holochip(loc,amount) -/obj/machinery/computer/slot_machine/proc/become_rich(amount, value, cointype = /obj/item/coin/silver, mob/living/target, throwit = FALSE) - if(value <= 0) - return - while(amount >= value && !QDELETED(src)) - var/obj/item/coin/C = new cointype(loc) //DOUBLE THE PAIN - amount -= value if(throwit && target) - C.throw_at(target, 3, 10) - else - random_step(C, 2, 40) - CHECK_TICK + H.throw_at(target, 3, 10) + else + var/value = coinvalues["[cointype]"] + if(value <= 0) + CRASH("Coin value of zero, refusing to payout in dispenser") + while(amount >= value) + var/obj/item/coin/C = new cointype(loc) //DOUBLE THE PAIN + amount -= value + if(throwit && target) + C.throw_at(target, 3, 10) + else + random_step(C, 2, 40) + + return amount #undef SEVEN #undef SPIN_TIME @@ -311,3 +355,5 @@ #undef BIG_PRIZE #undef SMALL_PRIZE #undef SPIN_PRICE +#undef HOLOCHIP +#undef COIN diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index c6484b051c..d6478f2e58 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -18,7 +18,7 @@ var/mode = HEATER_MODE_STANDBY var/setMode = "auto" // Anything other than "heat" or "cool" is considered auto. var/targetTemperature = T20C - var/heatingPower = 40000 + var/heatingPower = 10000 var/efficiency = 20000 var/temperatureTolerance = 1 var/settableTemperatureMedian = 30 + T0C @@ -74,46 +74,55 @@ if(cell && cell.charge > 0) var/turf/L = loc - if(!istype(L)) - if(mode != HEATER_MODE_STANDBY) - mode = HEATER_MODE_STANDBY - update_icon() - return + PerformHeating(L) - var/datum/gas_mixture/env = L.return_air() + for(var/direction in GLOB.alldirs) + L=get_step(src,direction) + if(!locate(/turf/closed) in L) // we don't want to heat walls and cause jank + PerformHeating(L) - var/newMode = HEATER_MODE_STANDBY - if(setMode != HEATER_MODE_COOL && env.return_temperature() < targetTemperature - temperatureTolerance) - newMode = HEATER_MODE_HEAT - else if(setMode != HEATER_MODE_HEAT && env.return_temperature() > targetTemperature + temperatureTolerance) - newMode = HEATER_MODE_COOL - - if(mode != newMode) - mode = newMode - update_icon() - - if(mode == HEATER_MODE_STANDBY) - return - - var/heat_capacity = env.heat_capacity() - var/requiredPower = abs(env.return_temperature() - targetTemperature) * heat_capacity - requiredPower = min(requiredPower, heatingPower) - - if(requiredPower < 1) - return - - var/deltaTemperature = requiredPower / heat_capacity - if(mode == HEATER_MODE_COOL) - deltaTemperature *= -1 - if(deltaTemperature) - env.set_temperature(env.return_temperature() + deltaTemperature) - air_update_turf() - cell.use(requiredPower / efficiency) else on = FALSE update_icon() return PROCESS_KILL +/obj/machinery/space_heater/proc/PerformHeating(turf/L) + if(!istype(L)) + if(mode != HEATER_MODE_STANDBY) + mode = HEATER_MODE_STANDBY + update_icon() + return + + var/datum/gas_mixture/env = L.return_air() + + var/newMode = HEATER_MODE_STANDBY + if(setMode != HEATER_MODE_COOL && env.return_temperature() < targetTemperature - temperatureTolerance) + newMode = HEATER_MODE_HEAT + else if(setMode != HEATER_MODE_HEAT && env.return_temperature() > targetTemperature + temperatureTolerance) + newMode = HEATER_MODE_COOL + + if(mode != newMode) + mode = newMode + update_icon() + + if(mode == HEATER_MODE_STANDBY) + return + + var/heat_capacity = env.heat_capacity() + var/requiredPower = abs(env.return_temperature() - targetTemperature) * heat_capacity + requiredPower = min(requiredPower, heatingPower) + + if(requiredPower < 1) + return + + var/deltaTemperature = requiredPower / heat_capacity + if(mode == HEATER_MODE_COOL) + deltaTemperature *= -1 + if(deltaTemperature) + env.set_temperature(env.return_temperature() + deltaTemperature) + air_update_turf() + cell.use(requiredPower / efficiency) + /obj/machinery/space_heater/RefreshParts() var/laser = 2 var/cap = 1 @@ -122,7 +131,7 @@ for(var/obj/item/stock_parts/capacitor/M in component_parts) cap += M.rating - heatingPower = laser * 40000 + heatingPower = laser * 10000 settableTemperatureRange = cap * 30 efficiency = (cap + 1) * 10000 @@ -155,7 +164,7 @@ else to_chat(user, "The hatch must be open to insert a power cell!") return - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) panel_open = !panel_open user.visible_message("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src].", "You [panel_open ? "open" : "close"] the hatch on \the [src].") update_icon() diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 1b3f942c51..fc5af59dcb 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -75,7 +75,7 @@ GLOBAL_VAR_INIT(singularity_counter, 0) to_chat(user, "You need to screw the beacon to the floor first!") /obj/machinery/power/singularity_beacon/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(active) to_chat(user, "You need to deactivate the beacon first!") return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 50984c43b8..561daf433d 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -112,7 +112,7 @@ . = timer_set /obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench) && can_unanchor) + if(I.tool_behaviour == TOOL_WRENCH && can_unanchor) if(!anchored) if(!isturf(loc) || isspaceturf(loc)) to_chat(user, "The bomb must be placed on solid ground to attach it.") @@ -130,7 +130,7 @@ else to_chat(user, "The bolts are locked down!") - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) open_panel = !open_panel update_icon() to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") @@ -138,7 +138,7 @@ else if(is_wire_tool(I) && open_panel) wires.interact(user) - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) if(open_panel && wires.is_all_cut()) if(payload) to_chat(user, "You carefully pry out [payload].") @@ -158,7 +158,7 @@ to_chat(user, "You place [payload] into [src].") else to_chat(user, "[payload] is already loaded into [src]! You'll have to remove it first.") - else if(istype(I, /obj/item/weldingtool)) + else if(I.tool_behaviour == TOOL_WELDER) if(payload || !wires.is_all_cut() || !open_panel) return @@ -436,7 +436,7 @@ qdel(src) /obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/crowbar) && beakers.len > 0) + if(I.tool_behaviour == TOOL_CROWBAR && beakers.len > 0) I.play_tool_sound(src) for (var/obj/item/B in beakers) B.forceMove(drop_location()) diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 539025e4d5..a674bb6489 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -80,7 +80,7 @@ ref = REF(pda) ) data_out["message_logs"] += list(data) - + return data_out /obj/machinery/computer/message_monitor/ui_data(mob/user) @@ -119,7 +119,7 @@ if(!linkedServer) data_out["selected"] = null return data_out - + data_out["selected"] = list( name = linkedServer.name, id = linkedServer.id, @@ -156,7 +156,7 @@ if(LAZYLEN(machinelist) > 0) message = "FAILED: Cannot probe when buffer full" return - + for(var/obj/machinery/telecomms/message_server/T in GLOB.telecomms_list) if(T.network == network) LAZYADD(machinelist, T) @@ -206,7 +206,7 @@ message = "NOTICE: Decryption key set." return message = incorrectkey - + if("hack") if(!(linkedServer.on && (linkedServer.toggled != FALSE))) message = noserver @@ -225,7 +225,7 @@ else if(!(linkedServer.on && (linkedServer.toggled != FALSE))) message = noserver return - + var/datum/data_ref = locate(params["ref"]) if(istype(data_ref, /datum/data_rc_msg)) LAZYREMOVE(linkedServer.rc_msgs, data_ref) @@ -258,7 +258,7 @@ else if(!(linkedServer.on && (linkedServer.toggled != FALSE))) message = noserver return - + if("reset" in params) ResetMessage() return @@ -311,7 +311,7 @@ return custommessage = M return - + if("recepient" in params) // Get out list of viable PDAs var/list/obj/item/pda/sendPDAs = get_viewable_pdas() @@ -324,8 +324,8 @@ update_static_data(usr) /obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params) - if(istype(O, /obj/item/screwdriver) && CHECK_BITFIELD(obj_flags, EMAGGED)) - //Stops people from just unscrewing the monitor and putting it back to get the console working again. + if(O.tool_behaviour == TOOL_SCREWDRIVER && CHECK_BITFIELD(obj_flags, EMAGGED)) + //Stops people from just unscrewing the monitor and putting it back to get the console working again. //Why this though, you should make it emag to a board level. (i wont do it) to_chat(user, "It is too hot to mess with!") else diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index cc8784c5b8..d1c7222485 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -11,7 +11,7 @@ /obj/machinery/telecomms/attackby(obj/item/P, mob/user, params) var/icon_closed = initial(icon_state) var/icon_open = "[initial(icon_state)]_o" - + if(!on) icon_closed = "[initial(icon_state)]_off" icon_open = "[initial(icon_state)]_o_off" @@ -19,7 +19,7 @@ if(default_deconstruction_screwdriver(user, icon_open, icon_closed, P)) return // Using a multitool lets you access the receiver's interface - else if(istype(P, /obj/item/multitool)) + else if(P.tool_behaviour == TOOL_MULTITOOL) attack_hand(user) else if(default_deconstruction_crowbar(P)) @@ -42,7 +42,7 @@ . = list() //cpypaste from the vending bus .["notice"] = temp .["multitool"] = FALSE - var/obj/item/multitool/P = get_multitool(user) + var/obj/item/P = get_multitool(user) if(P) .["multitool"] = TRUE .["multitool_buf"] = null //to clean the list! @@ -113,7 +113,7 @@ if("network" in params) if(!canAccess(usr)) return - var/newnet = sanitize(sanitize_text(params["network"], network)) + var/newnet = sanitize(sanitize_text(params["network"], network)) if(length(newnet) > 15) temp = "-% Too many characters in new network tag. %-" return @@ -122,19 +122,19 @@ temp = "-% New network tag assigned: \"[network]\" %-" return if("multitool") - var/obj/item/multitool/P = get_multitool(usr) + var/obj/item/P = get_multitool(usr) if("Link" in params) if(!canAccess(usr)) return - if(!istype(P)) + if(!P.tool_behaviour == TOOL_MULTITOOL) temp = "-% Unable to acquire buffer %-" return - + var/obj/machinery/telecomms/T = P.buffer if(!istype(T) || T == src) temp = "-% Unable to acquire buffer %-" return - + if(!(src in T.links)) LAZYADD(T.links, src) @@ -158,7 +158,7 @@ return P.buffer = src - temp = "% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-" + temp = "% Successfully stored [REF(P.buffer)] [P.buffer] in buffer %-" if("unlink") var/obj/machinery/telecomms/T = locate(params["value"]) @@ -167,7 +167,7 @@ if(!istype(T)) temp = "-% Unable to locate machine to unlink from, try again. %-" return - + temp = "-% Removed [REF(T)] [T.name] from linked entities. %-" if(T.links) //lazyrem makes blank list null, which is good but some might cause runtime ee's T.links.Remove(src) @@ -198,7 +198,7 @@ var/x = text2num(params["remove"]) temp = "-% Removed frequency filter [x] %-" freq_listening.Remove(x) - + /obj/machinery/telecomms/relay/ui_act(action, params) ..() switch(action) @@ -243,7 +243,11 @@ // Check if the user can use it. /obj/machinery/telecomms/proc/canInteract(mob/user) - if(hasSiliconAccessInArea(user) || istype(user.get_active_held_item(), /obj/item/multitool)) + var/get = user.get_active_held_item() + var/obj/item/I = get + if(I.tool_behaviour == TOOL_MULTITOOL) + return TRUE + if(hasSiliconAccessInArea(user)) return TRUE return FALSE // Check if the user is nearby and has a multitool. @@ -256,14 +260,16 @@ /obj/machinery/telecomms/proc/get_multitool(mob/user) if(!canInteract(user)) return null - var/obj/item/multitool/P = user.get_active_held_item() + var/obj/item/P = user.get_active_held_item() // Is the ref not a null? and is it the actual type? - if(istype(P)) + if(P.tool_behaviour == TOOL_MULTITOOL) return P else if(isAI(user)) var/mob/living/silicon/ai/U = user P = U.aiMulti else if(iscyborg(user) && in_range(user, src)) - if(istype(user.get_active_held_item(), /obj/item/multitool)) - P = user.get_active_held_item() + var/get = user.get_active_held_item() + var/obj/item/I = get + if(I.tool_behaviour == TOOL_MULTITOOL) + I = user.get_active_held_item() return P diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index fbb5505586..7cc421ef15 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -38,5 +38,5 @@ signal.broadcast() /obj/machinery/telecomms/allinone/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/multitool)) + if(P.tool_behaviour == TOOL_MULTITOOL) return attack_hand(user) diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 04fd5f6af5..a0440001c3 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -28,10 +28,10 @@ if(!do_after(user, 30 SECONDS, TRUE, src)) to_chat(user, "Your fingers slip as you fail to pry the [stored] from the [src], clicking it right back into the slot!") return - if(user.put_in_hands(stored)) - stored.forceMove(user.drop_location()) + user.put_in_hands(stored) + to_chat(user, "You successfully pry the [stored] from the [src]\ + [user.is_holding(stored) ? "" : ", and send its overwhelming weight tumbling onto the ground"]! The tapes on the [src] stop spinning...") stored = null - to_chat(user, "You successfully pry the [stored] from the [src], and send its overwhelming weight tumbling onto the ground! The tapes on the [src] stop spinning...") update_icon() return else @@ -41,7 +41,7 @@ /obj/machinery/blackbox_recorder/attackby(obj/item/I, mob/living/user, params) . = ..() if(istype(I, /obj/item/blackbox)) - if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src)) + if(!user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") return user.visible_message("[user] clicks the [I] into the [src]!", \ diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 16ae158ea7..daadbf4f72 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -164,16 +164,15 @@ return ..() /obj/machinery/teleport/station/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/multitool)) - var/obj/item/multitool/M = W + if(W.tool_behaviour == TOOL_MULTITOOL) if(panel_open) - M.buffer = src + W.buffer = src to_chat(user, "You download the data to the [W.name]'s buffer.") else - if(M.buffer && istype(M.buffer, /obj/machinery/teleport/station) && M.buffer != src) + if(W.buffer && istype(W.buffer, /obj/machinery/teleport/station) && W.buffer != src) if(linked_stations.len < efficiency) - linked_stations.Add(M.buffer) - M.buffer = null + linked_stations.Add(W.buffer) + W.buffer = null to_chat(user, "You upload the data from the [W.name]'s buffer.") else to_chat(user, "This station can't hold more information, try to use better parts.") @@ -185,7 +184,7 @@ else if(default_deconstruction_crowbar(W)) return - else if(istype(W, /obj/item/wirecutters)) + else if(W.tool_behaviour == TOOL_WIRECUTTER) if(panel_open) link_console_and_hub() to_chat(user, "You reconnect the station to nearby machinery.") diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 12fdc2193b..6aeef4b6ac 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -84,7 +84,7 @@ if(is_station_level(T.z)) destinations += B var/chosen_beacon = pick(destinations) - var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon)) + var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), 100, null, FALSE, get_turf(chosen_beacon)) try_move_adjacent(J) playsound(src,'sound/effects/sparks4.ogg',50,1) charges-- diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 8a4a2fdd9b..f9a86066ff 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -8,4 +8,4 @@ for(var/obj/item/I in equipment) if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/)) var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I - gun.projectiles_cache = gun.projectiles_cache_max \ No newline at end of file + gun.projectiles_cache = gun.projectiles_cache_max diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 7c7c6be2bc..06e4208d71 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -172,4 +172,4 @@ mineral_scan_pulse(get_turf(src)) #undef DRILL_BASIC -#undef DRILL_HARDENED \ No newline at end of file +#undef DRILL_HARDENED diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 8039aabd1f..4dbb57479f 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -56,7 +56,7 @@ var/turf/target_turf = pick(L) if(!target_turf) return - var/list/obj/effect/portal/created = create_portal_pair(get_turf(src), target_turf, src, 300, 1, /obj/effect/portal/anom) + var/list/obj/effect/portal/created = create_portal_pair(get_turf(src), target_turf, 300, 1, /obj/effect/portal/anom) var/turf/T = get_turf(target) message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] used a Wormhole Generator in [ADMIN_VERBOSEJMP(T)]") log_game("[key_name(chassis.occupant)] used a Wormhole Generator in [AREACOORD(T)]") diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index f2bced4aa8..30bf06b475 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -97,7 +97,7 @@ icon_state = "mecha_ion" energy_drain = 120 projectile = /obj/item/projectile/ion - fire_sound = 'sound/weapons/laser.ogg' + fire_sound = 'sound/weapons/IonRifle.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla equip_cooldown = 35 @@ -195,7 +195,7 @@ //Base ballistic weapon type /obj/item/mecha_parts/mecha_equipment/weapon/ballistic name = "general ballistic weapon" - fire_sound = 'sound/weapons/gunshot.ogg' + fire_sound = 'sound/weapons/lmgshot.ogg' var/projectiles var/projectiles_cache //ammo to be loaded in, if possible. var/projectiles_cache_max @@ -285,6 +285,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot name = "\improper LBX AC 10 \"Scattershot\"" desc = "A weapon for combat exosuits. Shoots a spread of pellets." + fire_sound = 'sound/weapons/gunshotshotgunshot.ogg' icon_state = "mecha_scatter" equip_cooldown = 20 projectile = /obj/item/projectile/bullet/scattershot @@ -299,6 +300,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/seedscatter name = "\improper Melon Seed \"Scattershot\"" desc = "A weapon for combat exosuits. Shoots a spread of pellets, shaped as seed." + fire_sound = 'sound/weapons/gunshotshotgunshot.ogg' icon_state = "mecha_scatter" equip_cooldown = 20 projectile = /obj/item/projectile/bullet/seed @@ -331,7 +333,7 @@ desc = "A weapon for combat exosuits. Launches light explosive missiles." icon_state = "mecha_missilerack" projectile = /obj/item/projectile/bullet/a84mm_he - fire_sound = 'sound/weapons/grenadelaunch.ogg' + fire_sound = 'sound/weapons/rocketlaunch.ogg' projectiles = 8 projectiles_cache = 0 projectiles_cache_max = 0 @@ -345,7 +347,7 @@ desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target." icon_state = "mecha_missilerack_six" projectile = /obj/item/projectile/bullet/a84mm_br - fire_sound = 'sound/weapons/grenadelaunch.ogg' + fire_sound = 'sound/weapons/rocketlaunch.ogg' projectiles = 6 projectiles_cache = 0 projectiles_cache_max = 0 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f16a5f9292..036aa6ed79 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -578,6 +578,7 @@ /obj/mecha/proc/mechstep(direction) var/current_dir = dir + set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) var/result = step(src,direction) if(strafe) setDir(current_dir) @@ -1007,7 +1008,7 @@ if(L && L.client) L.update_mouse_pointer() - L.client.change_view(CONFIG_GET(string/default_view)) + L.client.view_size.resetToDefault() zoom_mode = 0 ///////////////////////// diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 68d05e6a65..ee43e3f770 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -243,10 +243,10 @@ chassis.mecha_log_message("Toggled zoom mode.") chassis.occupant_message("Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") if(chassis.zoom_mode) - owner.client.change_view(12) + owner.client.view_size.setTo(4.5) SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) else - owner.client.change_view(CONFIG_GET(string/default_view)) //world.view - default mob view size + owner.client.view_size.resetToDefault() UpdateButtonIcon() /datum/action/innate/mecha/mech_switch_damtype diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index d5b27a9636..ed26ff6185 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -196,7 +196,7 @@ to_chat(user, "Invalid ID: Access denied.") else to_chat(user, "Maintenance protocols disabled by operator.") - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) if(state==1) state = 2 to_chat(user, "You undo the securing bolts.") @@ -204,7 +204,7 @@ state = 1 to_chat(user, "You tighten the securing bolts.") return - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) if(state==2) state = 3 to_chat(user, "You open the hatch to the power unit.") @@ -220,7 +220,7 @@ else to_chat(user, "You need two lengths of cable to fix this mech!") return - else if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM) + else if(W.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent != INTENT_HARM) if(internal_damage & MECHA_INT_TEMP_CONTROL) clearInternalDamage(MECHA_INT_TEMP_CONTROL) to_chat(user, "You repair the damaged temperature controller.") @@ -248,7 +248,7 @@ to_chat(user, "There's already a powercell installed.") return - else if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + else if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) user.DelayNextAction(CLICK_CD_MELEE) if(obj_integrity < max_integrity) if(W.use_tool(src, user, 0, volume=50, amount=1)) diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 9175489c89..36584b85ec 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -35,7 +35,7 @@ . += "The AI recovery beacon is active." /obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weldingtool)) + if(I.tool_behaviour == TOOL_WELDER) if(salvage_num <= 0 || !length(welder_salvage)) to_chat(user, "You don't see anything that can be cut with [I]!") return @@ -54,7 +54,7 @@ to_chat(user, "You fail to salvage anything valuable from [src]!") return - else if(istype(I, /obj/item/wirecutters)) + else if(I.tool_behaviour == TOOL_WIRECUTTER) if(salvage_num <= 0) to_chat(user, "You don't see anything that can be cut with [I]!") return @@ -67,7 +67,7 @@ else to_chat(user, "You fail to salvage anything valuable from [src]!") - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) if(crowbar_salvage && crowbar_salvage.len) var/obj/S = pick(crowbar_salvage) if(S) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index bdb748925c..27b0aa4e66 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -14,6 +14,9 @@ if(.) return if(can_buckle && has_buckled_mobs()) + if(ishuman(src)) //prevent people from unbuckling fireman-carried/piggybacked people unless on disarm or harm intents + if(act_intent == INTENT_HELP || act_intent == INTENT_GRAB) + return if(buckled_mobs.len > 1) var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs if(user_unbuckle_mob(unbuckled,user)) @@ -84,16 +87,22 @@ M.IgniteMob() /atom/movable/proc/unbuckle_mob(mob/living/buckled_mob, force=FALSE) - if(istype(buckled_mob) && buckled_mob.buckled == src && (buckled_mob.can_unbuckle() || force)) - . = buckled_mob - buckled_mob.buckled = null - buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.update_mobility() - buckled_mob.clear_alert("buckled") - buckled_mobs -= buckled_mob - SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force) + if(!isliving(buckled_mob)) + CRASH("Non-living [buckled_mob] thing called unbuckle_mob() for source.") + if(buckled_mob.buckled != src) + CRASH("[buckled_mob] called unbuckle_mob() for source while having buckled as [buckled_mob.buckled].") + if(!force && !buckled_mob.can_unbuckle()) + return + . = buckled_mob + buckled_mob.buckled = null + buckled_mob.anchored = initial(buckled_mob.anchored) + buckled_mob.update_mobility() + buckled_mob.clear_alert("buckled") + buckled_mob.set_glide_size(DELAY_TO_GLIDE_SIZE(buckled_mob.total_multiplicative_slowdown())) + buckled_mobs -= buckled_mob + SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force) - post_unbuckle_mob(.) + post_unbuckle_mob(.) /atom/movable/proc/unbuckle_all_mobs(force=FALSE) if(!has_buckled_mobs()) diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 5276062121..6496b392c3 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -53,6 +53,7 @@ return 0 /obj/effect/acid/Crossed(AM as mob|obj) + . = ..() if(isliving(AM)) var/mob/living/L = AM if(L.movement_type & FLYING) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 9d6d034364..8f8b83bfde 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -138,7 +138,7 @@ /obj/effect/anomaly/grav/high/Initialize(mapload, new_lifespan) . = ..() - setup_grav_field() + INVOKE_ASYNC(src, .proc/setup_grav_field) /obj/effect/anomaly/grav/high/proc/setup_grav_field() grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = 7, "host" = src, "gravity_value" = rand(0,3))) diff --git a/code/game/objects/effects/arachnid_web.dm b/code/game/objects/effects/arachnid_web.dm new file mode 100644 index 0000000000..2adaa12dc9 --- /dev/null +++ b/code/game/objects/effects/arachnid_web.dm @@ -0,0 +1,70 @@ +/obj/structure/arachnid + name = "large web" + icon = 'icons/effects/effects.dmi' + desc = "It's stringy and sticky, but the threads are larger than what spiderlings could produce." + anchored = TRUE + density = FALSE + max_integrity = 20 + +/obj/structure/arachnid/New() + ..() + icon_state = pick(list("stickyweb1", "stickyweb2")) + + +/obj/structure/arachnid/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + if(damage_type == BURN)//the stickiness of the web mutes all attack sounds except fire damage type + playsound(loc, 'sound/items/welder.ogg', 100, TRUE) + +/obj/structure/arachnid/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) + if(damage_flag == "melee") + switch(damage_type) + if(BURN) + damage_amount *= 2 + if(BRUTE) + damage_amount *= 0.5 + . = ..() + +/obj/structure/arachnid/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + take_damage(5, BURN, 0, 0) + +/obj/structure/arachnid/CanPass(atom/movable/mover, turf/target) + . = ..() + if(isarachnid(mover)) + + return TRUE + else if(isliving(mover)) + if(isarachnid(mover.pulledby)) + + return TRUE + if(prob(20)) + to_chat(mover, "You get stuck in \the [src] for a moment.") + return FALSE + +/obj/structure/arachnid/cocoon + name = "cocoon" + desc = "Something wrapped in silky spider web." + icon_state = "cocoon1" + anchored = FALSE + density = FALSE + max_integrity = 60 + +/obj/structure/arachnid/cocoon/Initialize() + icon_state = pick("cocoon1","cocoon2","cocoon3") + . = ..() + +/obj/structure/arachnid/cocoon/container_resist(mob/living/user) + var/breakout_time = 150 // DECI not DECA ffs + to_chat(user, "You struggle against the tight bonds... (This will take about [DisplayTimeText(breakout_time)].)") + visible_message("You see something struggling and writhing in \the [src]!") + if(do_after(user,(breakout_time), target = src)) + if(!user || user.stat != CONSCIOUS || user.loc != src) + return + qdel(src) + +/obj/structure/arachnid/cocoon/Destroy() + var/turf/T = get_turf(src) + src.visible_message("\The [src] splits open.") + for(var/atom/movable/A in contents) + A.forceMove(T) + return ..() diff --git a/code/game/objects/effects/blessing.dm b/code/game/objects/effects/blessing.dm index 5df90d65c7..6db28b3700 100644 --- a/code/game/objects/effects/blessing.dm +++ b/code/game/objects/effects/blessing.dm @@ -24,4 +24,4 @@ /obj/effect/blessing/proc/block_cult_teleport(datum/source, channel, turf/origin, turf/destination) if(channel == TELEPORT_CHANNEL_CULT) - return COMPONENT_BLOCK_TELEPORT \ No newline at end of file + return COMPONENT_BLOCK_TELEPORT diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 8e2f39d0df..846132a2fc 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -92,7 +92,7 @@ /obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wirecutters)) + if(I.tool_behaviour == TOOL_WIRECUTTER) I.play_tool_sound(src, 100) if(ruined) to_chat(user, "You remove the remnants of the poster.") diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 34996177af..5a6d5e54e9 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,6 +1,13 @@ /obj/effect/decal/cleanable gender = PLURAL layer = ABOVE_NORMAL_TURF_LAYER + /// Is this kind of cleanable decal persistent + var/persistent = FALSE + /// Can we stack multiple in one tile? + var/persistence_allow_stacking = FALSE + /// Are we deleted by turf changes? + var/wiped_by_floor_change = FALSE + var/list/random_icon_states = null var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints @@ -29,9 +36,21 @@ addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, beauty)), 0) +/** + * A data list is passed into this. + * This should return null to skip saving, or the type of data to save. Type must be /cleanable. + */ +/obj/effect/decal/cleanable/proc/PersistenceSave(list/data) + return type + +/** + * Loads from a data list. + */ +/obj/effect/decal/cleanable/proc/PersistenceLoad(list/data) + return + /obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal - if(mergeable_decal) - qdel(C) + return mergeable_decal /obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks)) diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index fa4bfe7e67..875f23434b 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -74,4 +74,4 @@ /obj/effect/decal/cleanable/blood/xtracks/Initialize() add_blood_DNA(list("UNKNOWN DNA" = "X*")) - . = ..() \ No newline at end of file + . = ..() diff --git a/code/game/objects/effects/decals/cleanable/gibs.dm b/code/game/objects/effects/decals/cleanable/gibs.dm index 7df0153ddc..4b63cbecc8 100644 --- a/code/game/objects/effects/decals/cleanable/gibs.dm +++ b/code/game/objects/effects/decals/cleanable/gibs.dm @@ -6,6 +6,7 @@ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") mergeable_decal = FALSE bloodiness = 0 //This isn't supposed to be bloody. + persistent = TRUE var/body_colors = "#e3ba84" //a default color just in case. var/gibs_reagent_id = /datum/reagent/liquidgibs var/gibs_bloodtype = "A+" @@ -31,6 +32,10 @@ flesh.color = body_colors add_overlay(flesh) +/obj/effect/decal/cleanable/blood/gibs/PersistenceSave(list/data) + . = ..() + return /obj/effect/decal/cleanable/blood/gibs/old + /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return @@ -159,6 +164,10 @@ . = ..() update_icon() +/obj/effect/decal/cleanable/blood/gibs/slime/PersistenceSave(list/data) + . = ..() + return type + /obj/effect/decal/cleanable/blood/gibs/slime/update_icon() add_atom_colour(body_colors, FIXED_COLOUR_PRIORITY) cut_overlays() @@ -198,6 +207,10 @@ . = ..() update_icon() +/obj/effect/decal/cleanable/blood/gibs/synth/PersistenceSave(list/data) + . = ..() + return type + //IPCs /obj/effect/decal/cleanable/blood/gibs/ipc desc = "They look sharp yet oozing." @@ -209,6 +222,10 @@ . = ..() update_icon() +/obj/effect/decal/cleanable/blood/gibs/ipc/PersistenceSave(list/data) + . = ..() + return type + /obj/effect/decal/cleanable/blood/gibs/ipc/update_icon() add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) cut_overlays() diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index fa16a95faf..bd32ddadf3 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -8,12 +8,18 @@ bloodiness = BLOOD_AMOUNT_PER_DECAL color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere. beauty = -100 + persistent = TRUE + var/fixed_color = FALSE /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) + if(C.fixed_color) + qdel(C) + return FALSE if (C.blood_DNA) blood_DNA |= C.blood_DNA + qdel(C) update_icon() - ..() + return FALSE /obj/effect/decal/cleanable/blood/transfer_blood_dna() ..() @@ -24,7 +30,22 @@ update_icon() /obj/effect/decal/cleanable/blood/update_icon() - color = blood_DNA_to_color() + . = ..() + if(!fixed_color) + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) + +/obj/effect/decal/cleanable/blood/PersistenceSave(list/data) + . = ..() + data["color"] = color + +/obj/effect/decal/cleanable/blood/PersistenceLoad(list/data) + . = ..() + if(data["color"]) + fixed_color = TRUE + add_atom_colour(data["color"], FIXED_COLOUR_PRIORITY) + name = "dried blood" + desc = "Looks like it's been here a while. Eew" + bloodiness = 0 /obj/effect/decal/cleanable/blood/old name = "dried blood" @@ -38,6 +59,7 @@ /obj/effect/decal/cleanable/blood/splats random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") + persistence_allow_stacking = TRUE /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("splatter1", "splatter2", "splatter3", "splatter4", "splatter5") @@ -48,16 +70,44 @@ random_icon_states = null beauty = -50 +/obj/effect/decal/cleanable/blood/tracks/PersistenceSave(list/data) + . = ..() + data["dir"] = dir + +/obj/effect/decal/cleanable/blood/tracks/PersistenceLoad(list/data) + . = ..() + if(data["dir"]) + setDir(text2num(data["dir"])) + /obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose name = "blood" + icon = 'icons/effects/blood.dmi' icon_state = "ltrails_1" desc = "Your instincts say you shouldn't be following these." random_icon_states = null beauty = -50 + persistent = TRUE + persistence_allow_stacking = TRUE var/list/existing_dirs = list() + var/fixed_color = FALSE + +/obj/effect/decal/cleanable/trail_holder/PersistenceSave(list/data) + . = ..() + data["dir"] = dir + data["color"] = color + +/obj/effect/decal/cleanable/trail_holder/PersistenceLoad(list/data) + . = ..() + if(data["dir"]) + setDir(text2num(data["dir"])) + if(data["color"]) + fixed_color = TRUE + add_atom_colour(data["color"], FIXED_COLOUR_PRIORITY) /obj/effect/decal/cleanable/trail_holder/update_icon() - color = blood_DNA_to_color() + . = ..() + if(!fixed_color) + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) /obj/effect/cleanable/trail_holder/Initialize() . = ..() @@ -84,8 +134,19 @@ var/entered_dirs = 0 var/exited_dirs = 0 blood_state = BLOOD_STATE_BLOOD //the icon state to load images from + persistent = TRUE + persistence_allow_stacking = TRUE var/list/shoe_types = list() +/obj/effect/decal/cleanable/blood/footprints/PersistenceSave(list/data) + . = ..() + data["dir"] = dir + +/obj/effect/decal/cleanable/blood/footprints/PersistenceLoad(list/data) + . = ..() + if(data["dir"]) + setDir(text2num(data["dir"])) + /obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O) if(ishuman(O)) var/mob/living/carbon/human/H = O @@ -143,7 +204,7 @@ return if(color != C.color) return - ..() + return ..() /obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in() if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 044c5c6e86..bb566f4d87 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -12,6 +12,8 @@ icon_state = "ash" mergeable_decal = FALSE beauty = -50 + persistent = TRUE + persistence_allow_stacking = TRUE /obj/effect/decal/cleanable/ash/Initialize() . = ..() @@ -38,6 +40,8 @@ icon = 'icons/obj/shards.dmi' icon_state = "tiny" beauty = -100 + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/glass/Initialize() . = ..() @@ -53,10 +57,33 @@ name = "dirt" desc = "Someone should clean that up." icon_state = "dirt" + alpha = 127 canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall) smooth = SMOOTH_FALSE mouse_opacity = MOUSE_OPACITY_TRANSPARENT beauty = -75 + mergeable_decal = TRUE + persistent = TRUE + wiped_by_floor_change = TRUE + +/obj/effect/decal/cleanable/dirt/Initialize(mapload) + . = ..() + alpha = CONFIG_GET(number/dirt_alpha_starting) + +/obj/effect/decal/cleanable/dirt/proc/dirty(strength = 1) + if(alpha < 255) + alpha += strength + if(alpha > 255) + alpha = 255 + +/obj/effect/decal/cleanable/dirt/PersistenceSave(list/data) + . = ..() + data["alpha"] = alpha + +/obj/effect/decal/cleanable/dirt/PersistenceLoad(list/data) + . = ..() + if(data["alpha"]) + alpha = text2num(data["alpha"]) /obj/effect/decal/cleanable/dirt/Initialize() . = ..() @@ -94,6 +121,8 @@ light_color = LIGHT_COLOR_GREEN icon_state = "greenglow" beauty = -300 + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/greenglow/Initialize(mapload) . = ..() @@ -122,6 +151,8 @@ icon_state = "molten" mergeable_decal = FALSE beauty = -150 + persistent = TRUE + persistence_allow_stacking = TRUE /obj/effect/decal/cleanable/molten_object/large name = "big gooey grey mass" @@ -136,6 +167,7 @@ icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") beauty = -150 + persistent = TRUE /obj/effect/decal/cleanable/vomit/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) if(ishuman(user)) @@ -151,6 +183,10 @@ reagents.trans_to(H, reagents.total_volume) qdel(src) +/obj/effect/decal/cleanable/vomit/PersistenceSave(list/data) + . = ..() + return /obj/effect/decal/cleanable/vomit/old + /obj/effect/decal/cleanable/vomit/old name = "crusty dried vomit" desc = "You try not to look at the chunks, and fail." @@ -166,12 +202,16 @@ icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") beauty = -100 + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_plant") + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/egg_smudge name = "smashed egg" @@ -179,6 +219,8 @@ gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/pie_smudge //honk name = "smashed pie" @@ -186,6 +228,8 @@ gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/chem_pile name = "chemical pile" @@ -193,6 +237,8 @@ gender = NEUTER icon = 'icons/obj/objects.dmi' icon_state = "ash" + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/shreds name = "shreds" @@ -200,6 +246,8 @@ icon_state = "shreds" gender = PLURAL mergeable_decal = FALSE + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/shreds/ex_act(severity, target) if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion. @@ -222,6 +270,8 @@ desc = "The herpes of arts and crafts." icon = 'icons/effects/atmospherics.dmi' gender = NEUTER + mergeable_decal = TRUE + persistent = FALSE /obj/effect/decal/cleanable/glitter/pink name = "pink glitter" @@ -247,3 +297,5 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") + mergeable_decal = TRUE + persistent = TRUE diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 2765330977..9dd3c2a852 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -11,6 +11,7 @@ bloodiness = BLOOD_AMOUNT_PER_DECAL mergeable_decal = FALSE beauty = -50 + persistent = TRUE /obj/effect/decal/cleanable/robot_debris/Initialize(mapload, list/datum/disease/diseases) . = ..() @@ -52,6 +53,7 @@ blood_state = BLOOD_STATE_OIL bloodiness = BLOOD_AMOUNT_PER_DECAL beauty = -100 + persistent = TRUE /obj/effect/decal/cleanable/oil/Initialize() . = ..() @@ -61,8 +63,11 @@ /obj/effect/decal/cleanable/oil/streak random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") beauty = -50 + persistent = TRUE /obj/effect/decal/cleanable/oil/slippery + persistent = FALSE /obj/effect/decal/cleanable/oil/slippery/Initialize() + . = ..() AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE)) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 8cfdad0432..387b8c167d 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -5,6 +5,8 @@ icon_state = "rune1" plane = ABOVE_WALL_PLANE //makes the graffiti visible over a wall. gender = NEUTER + persistent = TRUE + persistence_allow_stacking = TRUE mergeable_decal = FALSE var/do_icon_rotate = TRUE var/rotation = 0 @@ -29,3 +31,35 @@ if(main) paint_colour = main add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY) + +/obj/effect/decal/cleanable/crayon/PersistenceSave(list/data) + . = ..() + if(icon != initial(icon)) // no support for alticons yet, awful system anyways + return null + data["icon_state"] = icon_state + data["paint_color"] = paint_colour + if(do_icon_rotate) + data["rotation"] = rotation + data["name"] = name + if(pixel_x != initial(pixel_x)) + data["pixel_x"] = pixel_x + if(pixel_y != initial(pixel_y)) + data["pixel_y"] = pixel_y + +/obj/effect/decal/cleanable/crayon/PersistenceLoad(list/data) + . = ..() + if(data["name"]) + name = data["name"] + if(do_icon_rotate && data["rotation"]) + var/matrix/M = matrix() + M.Turn(text2num(data["rotation"])) + transform = M + if(data["paint_color"]) + paint_colour = data["paint_color"] + add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY) + if(data["icon_state"]) + icon_state = data["icon_state"] + if(data["pixel_x"]) + pixel_x = data["pixel_x"] + if(data["pixel_y"]) + pixel_y = data["pixel_y"] diff --git a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm index 85c2c78abb..7b5b4d9b4e 100644 --- a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm +++ b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm @@ -235,4 +235,4 @@ icon_state = "trimline_corner_fill" /obj/effect/turf_decal/trimline/neutral/filled/end - icon_state = "trimline_end_fill" \ No newline at end of file + icon_state = "trimline_end_fill" diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 9a498c9a70..2d28d3a041 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -9,12 +9,19 @@ icon = 'icons/obj/lighting.dmi' icon_state = "glowshroom" //replaced in New layer = ABOVE_NORMAL_TURF_LAYER - max_integrity = 5 - var/delay = 1200 + /// Time interval between glowshroom "spreads" + var/delay_spread = 2 MINUTES + /// Time interval between glowshroom decay checks + var/delay_decay = 30 SECONDS + /// Boolean to indicate if the shroom is on the floor/wall var/floor = 0 + /// Mushroom generation number var/generation = 1 - var/spreadIntoAdjacentChance = 60 + /// Chance to spread into adjacent tiles (0-100) + var/spreadIntoAdjacentChance = 75 + /// Internal seed of the glowshroom, stats are stored here var/obj/item/seeds/myseed = /obj/item/seeds/glowshroom + /// Turfs where the glowshroom cannot spread to var/static/list/blacklisted_glowshroom_turfs = typecacheof(list( /turf/open/lava, /turf/open/floor/plating/beach/water)) @@ -43,21 +50,30 @@ QDEL_NULL(myseed) return ..() -/obj/structure/glowshroom/New(loc, obj/item/seeds/newseed, mutate_stats) - ..() +/** + * Creates a new glowshroom structure. + * + * Arguments: + * * newseed - Seed of the shroom + * * mutate_stats - If the plant needs to mutate their stats + * * spread - If the plant is a result of spreading, reduce its stats + */ + +/obj/structure/glowshroom/Initialize(mapload, obj/item/seeds/newseed, mutate_stats, spread) + . = ..() if(newseed) myseed = newseed.Copy() myseed.forceMove(src) else myseed = new myseed(src) + if(spread) + myseed.potency -= round(myseed.potency * 0.25) // Reduce potency of the little mushie if it's spreading if(mutate_stats) //baby mushrooms have different stats :3 - myseed.adjust_potency(rand(-3,6)) - myseed.adjust_yield(rand(-1,2)) - myseed.adjust_production(rand(-3,6)) - myseed.adjust_endurance(rand(-3,6)) - delay = delay - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I - obj_integrity = myseed.endurance / 7 - max_integrity = myseed.endurance / 7 + myseed.adjust_potency(rand(-4,3)) + myseed.adjust_yield(rand(-3,2)) + myseed.adjust_production(rand(-3,3)) + myseed.endurance = clamp(myseed.endurance + rand(-3,2), 0, 100) // adjust_endurance has a min value of 10, need to edit directly + delay_spread = delay_spread - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow) if(ispath(G)) // Seeds were ported to initialize so their genes are still typepaths here, luckily their initializer is smart enough to handle us doing this myseed.genes -= G @@ -80,13 +96,20 @@ else //if on the floor, glowshroom on-floor sprite icon_state = base_icon_state - addtimer(CALLBACK(src, .proc/Spread), delay) + addtimer(CALLBACK(src, .proc/Spread), delay_spread) + addtimer(CALLBACK(src, .proc/Decay), delay_decay, FALSE) // Start decaying the plant + +/** + * Causes glowshroom spreading across the floor/walls. + */ /obj/structure/glowshroom/proc/Spread() var/turf/ownturf = get_turf(src) var/shrooms_planted = 0 for(var/i in 1 to myseed.yield) - if(prob(1/(generation * generation) * 100))//This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2... + var/chance_stats = ((myseed.potency + myseed.endurance * 2) * 0.2) // Chance of generating a new mushroom based on stats + var/chance_generation = (100 / (generation * generation)) // This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2... + if(prob(max(chance_stats, chance_generation))) // Whatever is the higher chance we use it var/list/possibleLocs = list() var/spreadsIntoAdjacent = FALSE @@ -96,7 +119,7 @@ for(var/turf/open/floor/earth in view(3,src)) if(is_type_in_typecache(earth, blacklisted_glowshroom_turfs)) continue - if(!disease_air_spread_walk(ownturf, earth)) + if(!ownturf.CanAtmosPass(earth)) continue if(spreadsIntoAdjacent || !locate(/obj/structure/glowshroom) in view(1,earth)) possibleLocs += earth @@ -118,16 +141,15 @@ if(shroomCount >= placeCount) continue - var/obj/structure/glowshroom/child = new type(newLoc, myseed, TRUE) + Decay(TRUE, 2) // Decay before spawning new mushrooms to reduce their endurance + var/obj/structure/glowshroom/child = new type(newLoc, myseed, TRUE, TRUE) child.generation = generation + 1 shrooms_planted++ CHECK_TICK - else - shrooms_planted++ //if we failed due to generation, don't try to plant one later - if(shrooms_planted < myseed.yield) //if we didn't get all possible shrooms planted, try again later - myseed.yield -= shrooms_planted - addtimer(CALLBACK(src, .proc/Spread), delay) + if(shrooms_planted <= myseed.yield) //if we didn't get all possible shrooms planted, try again later + myseed.adjust_yield(-shrooms_planted) + addtimer(CALLBACK(src, .proc/Spread), delay_spread) /obj/structure/glowshroom/proc/CalcDir(turf/location = loc) var/direction = 16 @@ -161,9 +183,27 @@ floor = 1 return 1 +/** + * Causes the glowshroom to decay by decreasing its endurance. + * + * Arguments: + * * spread - Boolean to indicate if the decay is due to spreading or natural decay. + * * amount - Amount of endurance to be reduced due to spread decay. + */ +/obj/structure/glowshroom/proc/Decay(spread, amount) + if (spread) // Decay due to spread + myseed.endurance -= amount + else // Timed decay + myseed.endurance -= 1 + if (myseed.endurance > 0) + addtimer(CALLBACK(src, .proc/Decay), delay_decay, FALSE) // Recall decay timer + return + if (myseed.endurance < 1) // Plant is gone + qdel(src) + /obj/structure/glowshroom/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type == BURN && damage_amount) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) + playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) /obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) @@ -175,3 +215,8 @@ var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src)) I.desc = "Looks like this was \an [src] some time ago." qdel(src) + +/obj/structure/glowshroom/attackby(obj/item/I, mob/living/user, params) + if (istype(I, /obj/item/plant_analyzer)) + return myseed.attackby(I, user, params) // Hacky I guess + return ..() // Attack normally diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index d5f53b2f1c..b0e801137d 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -16,7 +16,7 @@ return . = ..() - if(AM.movement_type & FLYING) + if(AM.movement_type & FLYING || iseffect(AM)) return triggermine(AM) diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index c2cfab0f7c..3bd43e44fb 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -40,10 +40,6 @@ density = TRUE layer = FLY_LAYER -/obj/effect/supplypod_selector - icon_state = "supplypod_selector" - layer = FLY_LAYER - //Makes a tile fully lit no matter what /obj/effect/fullbright icon = 'icons/effects/alphacolors.dmi' @@ -91,4 +87,4 @@ /obj/effect/dummy/lighting_obj/moblight/Initialize(mapload, _color, _range, _power, _duration) . = ..() if(!ismob(loc)) - return INITIALIZE_HINT_QDEL \ No newline at end of file + return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index b310119827..6be0a50a5e 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -49,6 +49,42 @@ /obj/effect/overlay/vis mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE - vis_flags = NONE - var/unused = 0 //When detected to be unused it gets set to world.time, after a while it gets removed - var/cache_expiration = 2 MINUTES // overlays which go unused for 2 minutes get cleaned up + vis_flags = VIS_INHERIT_DIR + ///When detected to be unused it gets set to world.time, after a while it gets removed + var/unused = 0 + ///overlays which go unused for this amount of time get cleaned up + var/cache_expiration = 2 MINUTES + +// /obj/effect/overlay/atmos_excited +// name = "excited group" +// icon = null +// icon_state = null +// anchored = TRUE // should only appear in vis_contents, but to be safe +// appearance_flags = RESET_TRANSFORM | TILE_BOUND +// invisibility = INVISIBILITY_ABSTRACT +// mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +// layer = ATMOS_GROUP_LAYER +// plane = ATMOS_GROUP_PLANE + +// /obj/effect/overlay/light_visible +// name = "" +// icon = 'icons/effects/light_overlays/light_32.dmi' +// icon_state = "light" +// layer = O_LIGHTING_VISUAL_LAYER +// plane = O_LIGHTING_VISUAL_PLANE +// appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM +// mouse_opacity = MOUSE_OPACITY_TRANSPARENT +// alpha = 0 +// vis_flags = NONE + +// /obj/effect/overlay/light_cone +// name = "" +// icon = 'icons/effects/light_overlays/light_cone.dmi' +// icon_state = "light" +// layer = O_LIGHTING_VISUAL_LAYER +// plane = O_LIGHTING_VISUAL_PLANE +// appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM +// mouse_opacity = MOUSE_OPACITY_TRANSPARENT +// vis_flags = NONE +// alpha = 110 diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index ab35d213ea..5c477501f4 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -5,6 +5,7 @@ var/list/checkers //list of /obj/effect/abstract/proximity_checkers var/current_range var/ignore_if_not_on_turf //don't check turfs in range if the host's loc isn't a turf + var/wire = FALSE /datum/proximity_monitor/New(atom/_host, range, _ignore_if_not_on_turf = TRUE) checkers = list() @@ -35,6 +36,8 @@ return ..() /datum/proximity_monitor/proc/HandleMove() + SIGNAL_HANDLER + var/atom/_host = host var/atom/new_host_loc = _host.loc if(last_host_loc != new_host_loc) @@ -58,6 +61,8 @@ var/atom/_host = host var/atom/loc_to_use = ignore_if_not_on_turf ? _host.loc : get_turf(_host) + if(wire && !isturf(loc_to_use)) //it makes assemblies attached on wires work + loc_to_use = get_turf(loc_to_use) if(!isturf(loc_to_use)) //only check the host's loc if(range) var/obj/effect/abstract/proximity_checker/pc @@ -109,4 +114,5 @@ /obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM) set waitfor = FALSE - monitor?.hasprox_receiver.HasProximity(AM) + . = ..() + monitor?.hasprox_receiver?.HasProximity(AM) diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm index b75df644eb..58cd0f4fa9 100644 --- a/code/game/objects/effects/spawners/bundle.dm +++ b/code/game/objects/effects/spawners/bundle.dm @@ -160,16 +160,17 @@ /obj/effect/spawner/bundle/costume/sexyclown name = "sexy clown costume spawner" items = list( - /obj/item/clothing/mask/gas/sexyclown, + /obj/item/clothing/mask/gas/clown_hat/sexy, /obj/item/clothing/under/rank/civilian/clown/sexy) /obj/effect/spawner/bundle/costume/sexymime name = "sexy mime costume spawner" items = list( - /obj/item/clothing/mask/gas/sexymime, + /obj/item/clothing/mask/gas/mime/sexy, /obj/item/clothing/under/rank/civilian/mime/sexy) /obj/effect/spawner/bundle/crate/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) if(items && items.len) var/turf/T = get_turf(src) var/obj/structure/closet/LC = locate(/obj/structure/closet) in T diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 6564a83729..5a0e1790a9 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -464,7 +464,7 @@ /obj/effect/spawner/lootdrop/cigars_cases/no_turf = 2, /obj/effect/spawner/lootdrop/space_cash/no_turf = 5, /obj/item/reagent_containers/food/snacks/grown/cannabis = 5, - /obj/item/storage/box/dice = 5, + /obj/item/storage/dice = 5, /obj/item/toy/cards/deck = 5, /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5 ) @@ -483,7 +483,7 @@ /obj/effect/spawner/lootdrop/cig_packs/no_turf = 10, /obj/effect/spawner/lootdrop/cigars_cases/no_turf = 5, /obj/item/reagent_containers/food/snacks/grown/cannabis = 5, - /obj/item/storage/box/dice = 5, + /obj/item/storage/dice = 5, /obj/item/toy/cards/deck = 5, /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5, /obj/item/kitchen/knife = 5, @@ -664,9 +664,8 @@ lootcount = 1 spawn_on_turf = FALSE loot = list("" = 50, - /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 13, - /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 13, - /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 12, + /obj/item/weaponcrafting/receiver = 25, + /obj/item/weaponcrafting/stock = 25, ) /obj/effect/spawner/lootdrop/weapon_parts @@ -674,8 +673,8 @@ lootcount = 1 spawn_on_turf = FALSE loot = list("" = 80, - /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 5, - /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 5, + /obj/item/weaponcrafting/receiver = 5, + /obj/item/weaponcrafting/stock = 5, ) /obj/effect/spawner/lootdrop/ammo diff --git a/code/game/objects/effects/spawners/traps.dm b/code/game/objects/effects/spawners/traps.dm index 82cfe89662..731b4efc1d 100644 --- a/code/game/objects/effects/spawners/traps.dm +++ b/code/game/objects/effects/spawners/traps.dm @@ -7,4 +7,4 @@ ..() var/new_type = pick(subtypesof(/obj/structure/trap) - typesof(/obj/structure/trap/ctf)) new new_type(get_turf(src)) - return INITIALIZE_HINT_QDEL \ No newline at end of file + return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm index 9be52dab52..dd4a6ea479 100644 --- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm +++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm @@ -15,5 +15,5 @@ message_admins("An alien egg has been delivered to [ADMIN_VERBOSEJMP(T)].") log_game("An alien egg has been delivered to [AREACOORD(T)]") var/message = "Attention [station_name()], we have entrusted you with a research specimen in [get_area_name(T, TRUE)]. Remember to follow all safety precautions when dealing with the specimen." - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/_addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time)) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 8d5458333c..44fa231c07 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -515,3 +515,12 @@ /obj/effect/temp_visual/dir_setting/space_wind/Initialize(mapload, set_dir, set_alpha = 255) . = ..() alpha = set_alpha + +/obj/effect/temp_visual/slime_puddle + icon = 'icons/mob/mob.dmi' + duration = 12 + icon_state = "to_puddle" + +/obj/effect/temp_visual/slime_puddle/reverse + icon_state = "from_puddle" + duration = 7 diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 235fbf6a9f..c467cbd4e8 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -10,6 +10,7 @@ if(log) message_admins("EMP with power [power], max distance [max_distance] in area [epicenter.loc.name] ") log_game("EMP with power [power], max distance [max_distance] in area [epicenter.loc.name] ") + deadchat_broadcast("EMP with power ([power]), max distance ([max_distance]) in [epicenter.loc.name]", turf_target = epicenter) if(power > 100) new /obj/effect/temp_visual/emp/pulse(epicenter) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b4c114eb6a..8a09bca0bf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -11,7 +11,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb name = "item" icon = 'icons/obj/items_and_weapons.dmi' blocks_emissive = EMISSIVE_BLOCK_GENERIC - + attack_hand_speed = 0 attack_hand_is_action = FALSE attack_hand_unwieldlyness = 0 @@ -112,6 +112,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb var/tool_behaviour = NONE var/toolspeed = 1 + //Special multitools + var/buffer = null + var/show_wires = FALSE + var/datum/integrated_io/selected_io = null //functional for integrated circuits. + //Special crowbar + var/can_force_powered = FALSE var/reach = 1 //In tiles, how far this weapon can reach; 1 for adjacent, which is default @@ -315,7 +321,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS) if(current_equipped_slot in user.check_obscured_slots()) - to_chat(src, "You are unable to unequip that while wearing other garments over it!") + to_chat(user, "You are unable to unequip that while wearing other garments over it!") return FALSE if(resistance_flags & ON_FIRE) @@ -383,7 +389,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS) if(current_equipped_slot in user.check_obscured_slots()) - to_chat(src, "You are unable to unequip that while wearing other garments over it!") + to_chat(user, "You are unable to unequip that while wearing other garments over it!") return FALSE @@ -428,18 +434,19 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /obj/item/proc/talk_into(mob/M, input, channel, spans, datum/language/language) return ITALICS | REDUCE_RANGE -/obj/item/proc/dropped(mob/user) +/// Called when a mob drops an item. +/obj/item/proc/dropped(mob/user, silent = FALSE) SHOULD_CALL_PARENT(TRUE) - current_equipped_slot = null for(var/X in actions) var/datum/action/A = X A.Remove(user) if(item_flags & DROPDEL) qdel(src) item_flags &= ~IN_INVENTORY - if(SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) & COMPONENT_DROPPED_RELOCATION) - . = ITEM_RELOCATED_BY_DROPPED - user.update_equipment_speed_mods() + SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) + // if(!silent) + // playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE) + user?.update_equipment_speed_mods() // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) @@ -467,29 +474,43 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb melee_attack_chain(usr, over) usr.FlushCurrentAction() return TRUE //returning TRUE as a "is this overridden?" flag + if(isrevenant(usr)) + if(RevenantThrow(over, usr, src)) + return + if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows over.MouseDrop_T(src,usr) return -// called after an item is placed in an equipment slot -// user is mob that equipped it -// slot uses the slot_X defines found in setup.dm -// for items that can be placed in multiple slots -// note this isn't called during the initial dressing of a player -/obj/item/proc/equipped(mob/user, slot) +/** + * Called after an item is placed in an equipment slot. + * + * Note that hands count as slots. + * + * Arguments: + * * user is mob that equipped it + * * slot uses the slot_X defines found in setup.dm for items that can be placed in multiple slots + * * Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it + */ +/obj/item/proc/equipped(mob/user, slot, initial = FALSE) SHOULD_CALL_PARENT(TRUE) - . = SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) + SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) current_equipped_slot = slot - if(!(. & COMPONENT_NO_GRANT_ACTIONS)) - for(var/X in actions) - var/datum/action/A = X - if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot. - A.Grant(user) + for(var/X in actions) + var/datum/action/A = X + if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot. + A.Grant(user) item_flags |= IN_INVENTORY + // if(!initial) + // if(equip_sound && (slot_flags & slot)) + // playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE) + // else if(slot == ITEM_SLOT_HANDS) + // playsound(src, pickup_sound, PICKUP_SOUND_VOLUME, ignore_walls = FALSE) user.update_equipment_speed_mods() + //Overlays for the worn overlay so you can overlay while you overlay //eg: ammo counters, primed grenade flashing, etc. //"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file @@ -565,7 +586,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb to_chat(user, "You cannot locate any organic eyes on this brain!") return - if(IS_STAMCRIT(user))//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit + if(IS_STAMCRIT(user) || !user.UseStaminaBuffer(STAMINA_COST_ITEM_EYESTAB, warn = TRUE))//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto return //CIT CHANGE - ditto @@ -575,8 +596,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb user.do_attack_animation(M) - user.adjustStaminaLossBuffered(10)//CIT CHANGE - makes eyestabbing cost stamina - if(M != user) M.visible_message("[user] has stabbed [M] in the eye with [src]!", \ "[user] stabs you in the eye with [src]!") @@ -658,6 +677,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb else playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1) + // else + // playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE) return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum) /obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) @@ -928,6 +949,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /obj/item/proc/get_part_rating() return 0 +//Can this item be given to people? +/obj/item/proc/can_give() + return TRUE + /obj/item/doMove(atom/destination) if (ismob(loc)) var/mob/M = loc diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 6e305c30ee..019231b8b4 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -63,7 +63,7 @@ return update_icon() to_chat(user, "You add the cables to [src]. It now contains [loaded.amount].") - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(!loaded) return if(ghetto && prob(10)) //Is it a ghetto RCL? If so, give it a 10% chance to fall apart @@ -166,7 +166,7 @@ last = C break -obj/item/rcl/proc/getMobhook(mob/to_hook) +/obj/item/rcl/proc/getMobhook(mob/to_hook) if(listeningTo == to_hook) return if(listeningTo) diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 8fd2ed2377..da5ab1a5a5 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -93,7 +93,7 @@ RSF use_matter(50, user) if(4) to_chat(user, "Dispensing Dice Pack...") - new /obj/item/storage/box/dice(T) + new /obj/item/storage/dice(T) use_matter(200, user) if(5) to_chat(user, "Dispensing Cigarette...") diff --git a/code/game/objects/items/armor_kits.dm b/code/game/objects/items/armor_kits.dm index fa88b77600..906d7c5f81 100644 --- a/code/game/objects/items/armor_kits.dm +++ b/code/game/objects/items/armor_kits.dm @@ -10,35 +10,41 @@ /obj/item/armorkit/afterattack(atom/target, mob/user, proximity_flag, click_parameters) // yeah have fun making subtypes and modifying the afterattack if you want to make variants // idiot - // - hatter var/used = FALSE if(isobj(target) && istype(target, /obj/item/clothing/under)) var/obj/item/clothing/under/C = target - if(C.armor.melee < 10) - C.armor.melee = 10 + if(C.damaged_clothes) + to_chat(user,"You should repair the damage done to [C] first.") + return + if(C.attached_accessory) + to_chat(user,"Kind of hard to sew around [C.attached_accessory].") + return + if(C.armor.getRating("melee") < 10) + C.armor = C.armor.setRating("melee" = 10) used = TRUE - if(C.armor.laser < 10) - C.armor.laser = 10 + if(C.armor.getRating("laser") < 10) + C.armor = C.armor.setRating("laser" = 10) used = TRUE - if(C.armor.fire < 40) - C.armor.fire = 40 + if(C.armor.getRating("fire") < 40) + C.armor = C.armor.setRating("fire" = 40) used = TRUE - if(C.armor.acid < 10) - C.armor.acid = 10 + if(C.armor.getRating("acid") < 10) + C.armor = C.armor.setRating("acid" = 10) used = TRUE - if(C.armor.bomb < 5) - C.armor.bomb = 5 + if(C.armor.getRating("bomb") < 5) + C.armor = C.armor.setRating("bomb" = 5) used = TRUE if(used) - user.visible_message("[user] uses [src] on [C], reinforcing it and tossing the empty case away afterwards.", \ - "You reinforce [C] with [src], making it a little more protective! You toss the empty casing away afterwards.") - C.name = "durathread [C.name]" // this disappears if it gets repaired, which is annoying + user.visible_message("[user] reinforces [C] with [src].", \ + "You reinforce [C] with [src], making it as protective as a durathread jumpsuit.") + C.name = "durathread [C.name]" + C.upgrade_prefix = "durathread" // god i hope this works qdel(src) return else - to_chat(user, "You stare at [src] and [C], coming to the conclusion that you probably don't need to reinforce it any further.") + to_chat(user, "You don't need to reinforce [C] any further.") return else return diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm index 347f0ad3a7..01295204a8 100644 --- a/code/game/objects/items/binoculars.dm +++ b/code/game/objects/items/binoculars.dm @@ -25,41 +25,32 @@ return ..() /obj/item/binoculars/proc/on_wield(obj/item/source, mob/user) - RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/unwield) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_walk) + RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, .proc/rotate) listeningTo = user user.visible_message("[user] holds [src] up to [user.p_their()] eyes.", "You hold [src] up to your eyes.") item_state = "binoculars_wielded" user.regenerate_icons() - if(!user?.client) - return - var/client/C = user.client - var/_x = 0 - var/_y = 0 - switch(user.dir) - if(NORTH) - _y = zoom_amt - if(EAST) - _x = zoom_amt - if(SOUTH) - _y = -zoom_amt - if(WEST) - _x = -zoom_amt - C.change_view(world.view + zoom_out_amt) - C.pixel_x = world.icon_size*_x - C.pixel_y = world.icon_size*_y + user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, user.dir) + +/obj/item/binoculars/proc/rotate(atom/thing, old_dir, new_dir) + if(ismob(thing)) + var/mob/lad = thing + lad.regenerate_icons() + lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir) + +/obj/item/binoculars/proc/on_walk() + attack_self(listeningTo) //Yes I have sinned, why do you ask? + /obj/item/binoculars/proc/on_unwield(obj/item/source, mob/user) unwield(user) /obj/item/binoculars/proc/unwield(mob/user) if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE) listeningTo = null user.visible_message("[user] lowers [src].", "You lower [src].") item_state = "binoculars" user.regenerate_icons() - if(user && user.client) - user.regenerate_icons() - var/client/C = user.client - C.change_view(CONFIG_GET(string/default_view)) - user.client.pixel_x = 0 - user.client.pixel_y = 0 + user.client.view_size.zoomIn() diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index a3366e714e..960e3ce499 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -82,4 +82,8 @@ /obj/item/candle/infinite/hugbox heats_space = FALSE +/obj/item/candle/DoRevenantThrowEffects(atom/target) + if(!infinite) + put_out_candle() + #undef CANDLE_LUMINOSITY diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 5b1b86b9e4..7d2b0ed832 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -779,16 +779,40 @@ /obj/item/card/id/departmental_budget/update_label() return +/obj/item/card/id/departmental_budget/civ + department_ID = ACCOUNT_CIV + department_name = ACCOUNT_CIV_NAME + +/obj/item/card/id/departmental_budget/eng + department_ID = ACCOUNT_ENG + department_name = ACCOUNT_ENG_NAME + +/obj/item/card/id/departmental_budget/sci + department_ID = ACCOUNT_SCI + department_name = ACCOUNT_SCI_NAME + +/obj/item/card/id/departmental_budget/med + department_ID = ACCOUNT_MED + department_name = ACCOUNT_MED_NAME + +/obj/item/card/id/departmental_budget/srv + department_ID = ACCOUNT_SRV + department_name = ACCOUNT_SRV_NAME + /obj/item/card/id/departmental_budget/car department_ID = ACCOUNT_CAR department_name = ACCOUNT_CAR_NAME +/obj/item/card/id/departmental_budget/sec + department_ID = ACCOUNT_SEC + department_name = ACCOUNT_SEC_NAME + //Polychromatic Knight Badge /obj/item/card/id/knight name = "knight badge" icon_state = "knight" - desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID" + desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID." var/id_color = "#00FF00" //defaults to green var/mutable_appearance/id_overlay diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 9b658bc5f1..3f5296a1ef 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -63,7 +63,7 @@ to_chat(user, "Your name has been sent to your employers for approval.") // Autoapproves after a certain time response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE) - to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will autoapprove in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") + to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [html_encode(new_name)] (will autoapprove in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") /obj/item/station_charter/proc/reject_proposed(user) if(!user) diff --git a/code/game/objects/items/chromosome.dm b/code/game/objects/items/chromosome.dm index 8330a8e202..3acf3cfe5c 100644 --- a/code/game/objects/items/chromosome.dm +++ b/code/game/objects/items/chromosome.dm @@ -89,4 +89,4 @@ /obj/item/chromosome/reinforcer/apply(datum/mutation/human/HM) HM.mutadone_proof = TRUE - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index de32375642..4280e7105f 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -136,6 +136,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM STOP_PROCESSING(SSobj, src) . = ..() +/obj/item/clothing/mask/cigarette/DoRevenantThrowEffects(atom/target) + if(lit) + attackby() + else + light() + /obj/item/clothing/mask/cigarette/attackby(obj/item/W, mob/user, params) if(!lit && smoketime > 0) var/lighting_text = W.ignition_effect(src, user) @@ -517,6 +523,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM overlay_state = pick(overlay_list) update_icon() +/obj/item/lighter/DoRevenantThrowEffects(atom/target) + set_lit() + /obj/item/lighter/suicide_act(mob/living/carbon/user) if (lit) user.visible_message("[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 2fa48582f7..8387c2704e 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -66,7 +66,7 @@ var/list/dept_list = list("Civilian","Security","Medical","Science","Engineering","Cargo") /obj/item/circuitboard/computer/card/minor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) target_dept = (target_dept == dept_list.len) ? 1 : (target_dept + 1) to_chat(user, "You set the board to \"[dept_list[target_dept]]\".") else @@ -181,7 +181,7 @@ build_path = /obj/machinery/computer/rdconsole/core /obj/item/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(build_path == /obj/machinery/computer/rdconsole/core) name = "R&D Console - Robotics (Computer Board)" build_path = /obj/machinery/computer/rdconsole/robotics @@ -297,6 +297,10 @@ name = "Mining Shuttle (Computer Board)" build_path = /obj/machinery/computer/shuttle/mining +/obj/item/circuitboard/computer/mining_shuttle/common + name = "Lavaland Shuttle (Computer Board)" + build_path = /obj/machinery/computer/shuttle/mining/common + /obj/item/circuitboard/computer/snow_taxi name = "Snow Taxi (Computer Board)" build_path = /obj/machinery/computer/shuttle/snow_taxi @@ -334,7 +338,7 @@ build_path = /obj/machinery/computer/libraryconsole /obj/item/circuitboard/computer/libraryconsole/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement) name = "Library Visitor Console (Computer Board)" build_path = /obj/machinery/computer/libraryconsole diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 8e59e91e38..e0ea5f3bac 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -243,6 +243,12 @@ /obj/item/stack/sheet/glass = 1) def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) +/obj/item/circuitboard/machine/colormate + name = "Colormate (Machine Board)" + build_path = /obj/machinery/gear_painter + req_components = list() + def_components = list() + /obj/item/circuitboard/machine/vendor name = "Custom Vendor (Machine Board)" desc = "You can turn the \"brand selection\" dial using a screwdriver." @@ -257,6 +263,7 @@ /obj/machinery/vending/cola = "Robust Softdrinks", /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", /obj/machinery/vending/games = "\improper Good Clean Fun", + /obj/machinery/vending/kink = "KinkMate", /obj/machinery/vending/autodrobe = "AutoDrobe", /obj/machinery/vending/assist = "\improper Vendomat", /obj/machinery/vending/engivend = "\improper Engi-Vend", @@ -289,7 +296,7 @@ /obj/machinery/vending/custom = "Custom Vendor") /obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/position = vending_names_paths.Find(build_path) position = (position == vending_names_paths.len) ? 1 : (position + 1) var/typepath = vending_names_paths[position] @@ -365,7 +372,7 @@ build_path = PATH_HEATER /obj/item/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/obj/item/circuitboard/new_type var/new_setting switch(build_path) @@ -434,7 +441,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(build_path == /obj/machinery/processor) name = "Slime Processor (Machine Board)" build_path = /obj/machinery/processor/slime @@ -470,7 +477,7 @@ return ..() /obj/item/circuitboard/machine/smartfridge/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/position = fridges_name_paths.Find(build_path, fridges_name_paths) position = (position == fridges_name_paths.len) ? 1 : (position + 1) build_path = fridges_name_paths[position] @@ -651,7 +658,7 @@ build_path = PATH_POWERCOIL /obj/item/circuitboard/machine/tesla_coil/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/obj/item/circuitboard/new_type var/new_setting switch(build_path) @@ -770,7 +777,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/chem_master/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/new_name = "ChemMaster" var/new_path = /obj/machinery/chem_master diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index c98484b81e..be39bb6973 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -100,4 +100,4 @@ #undef WAND_OPEN #undef WAND_BOLT -#undef WAND_EMERGENCY \ No newline at end of file +#undef WAND_EMERGENCY diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index 21cfd1fbad..b7f7f5f2d1 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -80,6 +80,17 @@ to_chat(user, "You insert the credits into [src].") update_icon() qdel(H) + if(istype(I, /obj/item/card/id)) + var/obj/item/card/id/ID = I + if(!ID.registered_account) + to_chat(user, "[ID] doesn't have a linked account to deposit into!") + return + for(var/obj/item/holochip/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/stack/spacecash/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/coin/money in src.loc.contents) + ID.attackby(money, user) /obj/item/holochip/AltClick(mob/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 484901990a..25a5bcc800 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -4,7 +4,7 @@ /obj/item/defibrillator name = "defibrillator" desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients." - icon = 'icons/obj/items_and_weapons.dmi' + icon = 'icons/obj/defibrillators.dmi' icon_state = "defibunit" item_state = "defibunit" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -23,8 +23,8 @@ var/obj/item/stock_parts/cell/cell var/combat = FALSE //can we revive through space suits? var/grab_ghost = FALSE // Do we pull the ghost back into their body? - var/healdisk = FALSE // Will we shock people dragging the body? - var/pullshocksafely = FALSE //Dose the unit have the healdisk upgrade? + var/healdisk = FALSE // Does the unit have the healdisk upgrade? + var/pullshocksafely = FALSE // Will we shock people dragging the body? var/primetime = 0 // is the defib faster var/timedeath = 10 var/disarm_shock_time = 10 @@ -120,7 +120,7 @@ to_chat(user, "You install a cell in [src].") update_power() - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(cell) cell.update_icon() cell.forceMove(get_turf(src)) @@ -261,7 +261,7 @@ /obj/item/shockpaddles name = "defibrillator paddles" desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks." - icon = 'icons/obj/items_and_weapons.dmi' + icon = 'icons/obj/defibrillators.dmi' icon_state = "defibpaddles0" item_state = "defibpaddles0" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -616,7 +616,7 @@ if(defib.healdisk) H.heal_overall_damage(25, 25) var/list/policies = CONFIG_GET(keyed_list/policyconfig) - var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) + var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] if(policy) @@ -682,7 +682,7 @@ /obj/item/shockpaddles/cyborg name = "cyborg defibrillator paddles" - icon = 'icons/obj/items_and_weapons.dmi' + icon = 'icons/obj/defibrillators.dmi' icon_state = "defibpaddles0" item_state = "defibpaddles0" req_defib = FALSE @@ -703,7 +703,7 @@ name = "syndicate defibrillator paddles" desc = "A pair of paddles used to revive deceased operatives. It possesses both the ability to penetrate armor and to deliver powerful shocks offensively." combat = TRUE - icon = 'icons/obj/items_and_weapons.dmi' + icon = 'icons/obj/defibrillators.dmi' icon_state = "defibpaddles0" item_state = "defibpaddles0" req_defib = FALSE diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index c09d23aafb..2820b11312 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -665,7 +665,8 @@ GLOBAL_LIST_EMPTY(PDAs) create_message(U, locate(href_list["target"])) if("MessageAll") - send_to_all(U) + if(cartridge?.spam_enabled) + send_to_all(U) if("toggle_block") toggle_blocking(usr, href_list["target"]) diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm index e3385dc13f..2cb4922f36 100644 --- a/code/game/objects/items/devices/desynchronizer.dm +++ b/code/game/objects/items/devices/desynchronizer.dm @@ -91,4 +91,4 @@ return ..() /obj/effect/abstract/sync_holder/AllowDrop() - return TRUE //no dropping spaghetti out of your spacetime pocket \ No newline at end of file + return TRUE //no dropping spaghetti out of your spacetime pocket diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index 1f91196b24..4d57d05be4 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -347,9 +347,9 @@ last_hearcheck = world.time for(var/mob/H in hearing_mobs) if(!istype(H.loc, /obj/item/dogborg/sleeper)) - H.playsound_local(source, null, 45, falloff = 0, S = pred_death) + H.playsound_local(source, null, 45, S = pred_death) else if(H in contents) - H.playsound_local(source, null, 65, falloff = 0, S = prey_death) + H.playsound_local(source, null, 65, S = prey_death) for(var/belly in T.vore_organs) var/obj/belly/B = belly for(var/atom/movable/thing in B) @@ -391,9 +391,9 @@ last_hearcheck = world.time for(var/mob/H in hearing_mobs) if(!istype(H.loc, /obj/item/dogborg/sleeper)) - H.playsound_local(source, null, 45, falloff = 0, S = pred_digest) + H.playsound_local(source, null, 45, S = pred_digest) else if(H in contents) - H.playsound_local(source, null, 65, falloff = 0, S = prey_digest) + H.playsound_local(source, null, 65, S = prey_digest) update_gut(hound) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 035375fdaf..e29519406a 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -37,11 +37,14 @@ /obj/item/flashlight/attack_self(mob/user) on = !on update_brightness(user) - playsound(user, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, 1) + playsound(src, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE) for(var/X in actions) var/datum/action/A = X A.UpdateButtonIcon() - return 1 + return TRUE + +/obj/item/flashlight/DoRevenantThrowEffects(atom/target) + attack_self() /obj/item/flashlight/suicide_act(mob/living/carbon/human/user) if (user.eye_blind) @@ -366,6 +369,11 @@ flashlight_power = 0.8 custom_price = PRICE_CHEAP +/obj/item/flashlight/lantern/heirloom_moth + name = "old lantern" + desc = "An old lantern that has seen plenty of use." + light_range = 4 + /obj/item/flashlight/lantern/jade name = "jade lantern" desc = "An ornate, green lantern." diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index f5d3014d35..2413a3fb9a 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -166,7 +166,7 @@ to_chat(user, "[icon2html(src, user)] Target is free of radioactive contamination.") /obj/item/geiger_counter/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver) && (obj_flags & EMAGGED)) + if(I.tool_behaviour == TOOL_SCREWDRIVER && (obj_flags & EMAGGED)) if(scanning) to_chat(user, "Turn off [src] before you perform this action!") return 0 diff --git a/code/game/objects/items/devices/glue.dm b/code/game/objects/items/devices/glue.dm index 2c57ede706..42fbecc780 100644 --- a/code/game/objects/items/devices/glue.dm +++ b/code/game/objects/items/devices/glue.dm @@ -29,4 +29,4 @@ if(uses == 0) icon_state = "glue_used" name = "empty bottle of super glue" - return \ No newline at end of file + return diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index bb46577702..e0453cebc0 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -8,10 +8,12 @@ slot_flags = ITEM_SLOT_BELT obj_flags = UNIQUE_RENAME var/gpstag = "COM0" + var/emp_proof = FALSE + var/starton = TRUE /obj/item/gps/Initialize() . = ..() - AddComponent(/datum/component/gps/item, gpstag) + AddComponent(/datum/component/gps/item, gpstag, emp_proof, starton) /obj/item/gps/science icon_state = "gps-s" @@ -26,6 +28,9 @@ gpstag = "MINE0" desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." +/obj/item/gps/mining/off + starton = FALSE + /obj/item/gps/cyborg icon_state = "gps-b" gpstag = "BORG0" diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 6d10d31f5c..4d9c0a687c 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -50,7 +50,7 @@ else to_chat(user, "[src] already has a diode installed.") - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(diode) to_chat(user, "You remove the [diode.name] from \the [src].") diode.forceMove(drop_location()) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 915fcac504..365446bad9 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -62,4 +62,4 @@ name = "clown's megaphone" desc = "Something that should not exist." icon_state = "megaphone-clown" - voicespan = list(SPAN_CLOWN) \ No newline at end of file + voicespan = list(SPAN_CLOWN) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 7a8a523a18..5177224835 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -21,15 +21,14 @@ force = 5 w_class = WEIGHT_CLASS_SMALL tool_behaviour = TOOL_MULTITOOL + item_flags = SURGICAL_TOOL throwforce = 0 throw_range = 7 throw_speed = 3 custom_materials = list(/datum/material/iron=50, /datum/material/glass=20) - var/obj/machinery/buffer // simple machine buffer for device linkage + buffer = null // simple machine buffer for device linkage toolspeed = 1 - tool_behaviour = TOOL_MULTITOOL usesound = 'sound/weapons/empty.ogg' - var/datum/integrated_io/selected_io = null //functional for integrated circuits. var/mode = 0 /obj/item/multitool/chaplain @@ -72,7 +71,7 @@ if(selected_io) icon_state += "_red" -/obj/item/multitool/proc/wire(var/datum/integrated_io/io, mob/user) +/obj/item/proc/wire(var/datum/integrated_io/io, mob/user) if(!io.holder.assembly) to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") return @@ -101,7 +100,7 @@ update_icon() -/obj/item/multitool/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user) +/obj/item/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user) if(!io1.linked.len || !io2.linked.len) to_chat(user, "There is nothing connected to the data channel.") return @@ -256,6 +255,7 @@ icon = 'icons/obj/abductor.dmi' icon_state = "multitool" toolspeed = 0.1 + show_wires = TRUE /obj/item/multitool/advanced name = "advanced multitool" @@ -263,6 +263,7 @@ icon = 'icons/obj/advancedtools.dmi' icon_state = "multitool" toolspeed = 0.2 + show_wires = TRUE /obj/item/multitool/advanced/brass name = "clockwork multitool" diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 7450cb937c..9a722feb6a 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -18,6 +18,7 @@ /obj/item/paicard/Initialize() SSpai.pai_card_list += src add_overlay("pai-off") + AddElement(/datum/element/bed_tuckable, 6, -5, 90) return ..() /obj/item/paicard/Destroy() diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm index 0308f19b5f..17e364c4f3 100644 --- a/code/game/objects/items/devices/polycircuit.dm +++ b/code/game/objects/items/devices/polycircuit.dm @@ -18,8 +18,8 @@ else if(zero_amount()) return - chosen_circuit = input("What type of circuit would you like to remove?", "Choose a Circuit Type", chosen_circuit) in list("airlock","firelock","fire alarm","air alarm","APC") - if(zero_amount()) + chosen_circuit = input("What type of circuit would you like to remove?", "Choose a Circuit Type", chosen_circuit) as null|anything in list("airlock","firelock","fire alarm","air alarm","APC") + if(zero_amount() || !chosen_circuit || !in_range(src,user)) return switch(chosen_circuit) if("airlock") diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index c3127c246f..838b5376c5 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -16,9 +16,9 @@ GLOBAL_LIST_EMPTY(power_sinks) throw_speed = 1 throw_range = 2 custom_materials = list(/datum/material/iron=750) - var/drain_rate = 1600000 // amount of power to drain per tick + var/drain_rate = 2000000 // amount of power to drain per tick. Currently 2MJ. var/power_drained = 0 // has drained this much power - var/max_power = 1e10 // maximum power that can be drained before exploding + var/max_power = 2000000000 // maximum power that can be drained before exploding. Currently 2GJ. About 17 minutes to explode at the max rate. var/mode = 0 // 0 = off, 1=clamped (off), 2=operating var/admins_warned = FALSE // stop spam, only warn the admins once that we are about to boom @@ -67,7 +67,7 @@ GLOBAL_LIST_EMPTY(power_sinks) set_light(0) /obj/item/powersink/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(mode == DISCONNECTED) var/turf/T = loc if(isturf(T) && !T.intact) @@ -155,5 +155,5 @@ GLOBAL_LIST_EMPTY(power_sinks) if(power_drained >= max_power) STOP_PROCESSING(SSobj, src) - explosion(src.loc, 4,8,16,32) + explosion(src.loc, 3,7,14,28) qdel(src) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 6ac2d310a1..54556c20b6 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -69,7 +69,8 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans,datum/language/language) if (!listening) return ITALICS | REDUCE_RANGE - return ..() + if (language != /datum/language/signlanguage) + return ..() /obj/item/radio/headset/can_receive(freq, level, AIuser) if(ishuman(src.loc)) @@ -277,20 +278,18 @@ GLOBAL_LIST_INIT(channel_tokens, list( to_chat(user,"You upgrade [src].") bowmanize() qdel(W) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(keyslot || keyslot2) for(var/ch_name in channels) SSradio.remove_object(src, GLOB.radiochannels[ch_name]) secure_radio_connections[ch_name] = null - var/turf/T = user.drop_location() - if(T) - if(keyslot) - keyslot.forceMove(T) - keyslot = null - if(keyslot2) - keyslot2.forceMove(T) - keyslot2 = null + if(keyslot) + user.put_in_hands(keyslot) + keyslot = null + if(keyslot2) + user.put_in_hands(keyslot2) + keyslot2 = null recalculateChannels() to_chat(user, "You pop out the encryption keys in the headset.") diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 8657684ff4..72552de98d 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -23,7 +23,7 @@ freerange = TRUE /obj/item/radio/intercom/ratvar/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "[src] is fastened to the wall with [is_servant_of_ratvar(user) ? "replicant alloy" : "some material you've never seen"], and can't be removed.") return //no unfastening! . = ..() @@ -57,7 +57,7 @@ . += "It's unscrewed from the wall, and can be detached." /obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(unfastened) user.visible_message("[user] starts tightening [src]'s screws...", "You start screwing in [src]...") if(I.use_tool(src, user, 30, volume=50)) @@ -69,7 +69,7 @@ user.visible_message("[user] loosens [src]'s screws!", "You unscrew [src], loosening it from the wall.") unfastened = TRUE return - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) if(!unfastened) to_chat(user, "You need to unscrew [src] from the wall first!") return diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 4623a405de..e81110425c 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -208,6 +208,8 @@ return if(!M.IsVocal()) return + if(language == /datum/language/signlanguage) + return if(use_command) spans |= commandspan @@ -331,7 +333,7 @@ /obj/item/radio/attackby(obj/item/W, mob/user, params) add_fingerprint(user) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) unscrewed = !unscrewed if(unscrewed) to_chat(user, "The radio can now be attached and modified!") @@ -382,7 +384,7 @@ /obj/item/radio/borg/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(keyslot) for(var/ch_name in channels) SSradio.remove_object(src, GLOB.radiochannels[ch_name]) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index db29614f20..8b5e1edd91 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -155,7 +155,7 @@ GENETICS SCANNER if(oxy_loss > 10) msg += "\n\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected." if(tox_loss > 10) - msg += "\n\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected." + msg += "\n\t[tox_loss > 50 ? "Severe" : "Minor"] amount of [HAS_TRAIT(M, TRAIT_ROBOTIC_ORGANISM) ? "system corruption" : "toxin damage"] detected." if(M.getStaminaLoss()) msg += "\n\tSubject appears to be suffering from fatigue." if(advanced) @@ -182,7 +182,7 @@ GENETICS SCANNER
    \ \ \ - \ + \ \ \ \ @@ -306,18 +306,6 @@ GENETICS SCANNER if(T.name == "fluffy tongue") temp_message += " Subject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant." - //HECK - else if(istype(O, /obj/item/organ/genital/penis)) - var/obj/item/organ/genital/penis/P = O - if(P.length>20) - temp_message += " Subject has a sizeable gentleman's organ at [P.length] inches." - - else if(istype(O, /obj/item/organ/genital/breasts)) - var/obj/item/organ/genital/breasts/Br = O - if(Br.cached_size>5) - temp_message += " Subject has a sizeable bosom with a [Br.size] cup." - - //GENERAL HANDLER if(!damage_message) @@ -628,9 +616,9 @@ GENETICS SCANNER var/turf/location = get_turf(user) if(!istype(location)) return - + scan_turf(user, location) - + /obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens . = ..() @@ -905,7 +893,7 @@ GENETICS SCANNER throw_range = 7 custom_materials = list(/datum/material/iron=200) var/list/discovered = list() //hit a dna console to update the scanners database - var/list/buffer + buffer = list() var/ready = TRUE var/cooldown = 200 diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index cef06bfde8..958877d42d 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -19,7 +19,8 @@ var/starting_tape_type = /obj/item/tape/random var/open_panel = 0 var/canprint = 1 - + var/list/icons_available = list() + var/icon_directory = 'icons/radials/taperecorder.dmi' /obj/item/taperecorder/Initialize(mapload) . = ..() @@ -32,6 +33,29 @@ . = ..() . += "The wire panel is [open_panel ? "opened" : "closed"]." +/obj/item/taperecorder/AltClick(mob/user) + . = ..() + play() + +/obj/item/taperecorder/proc/update_available_icons() + icons_available = list() + + if(recording) + icons_available += list("Stop Recording" = image(icon = icon_directory, icon_state = "record_stop")) + else + if(!playing) + icons_available += list("Record" = image(icon = icon_directory, icon_state = "record")) + + if(playing) + icons_available += list("Pause" = image(icon = icon_directory, icon_state = "pause")) + else + if(!recording) + icons_available += list("Play" = image(icon = icon_directory, icon_state = "play")) + + if(canprint && !recording && !playing) + icons_available += list("Print Transcript" = image(icon = icon_directory, icon_state = "print")) + if(mytape) + icons_available += list("Eject" = image(icon = icon_directory, icon_state = "eject")) /obj/item/taperecorder/attackby(obj/item/I, mob/user, params) if(!mytape && istype(I, /obj/item/tape)) @@ -69,7 +93,6 @@ return TRUE return FALSE - /obj/item/taperecorder/verb/ejectverb() set name = "Eject Tape" set category = "Object" @@ -81,7 +104,6 @@ eject(usr) - /obj/item/taperecorder/update_icon_state() if(!mytape) icon_state = "taperecorder_empty" @@ -92,7 +114,6 @@ else icon_state = "taperecorder_idle" - /obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source) . = ..() if(mytape && recording) @@ -193,13 +214,31 @@ /obj/item/taperecorder/attack_self(mob/user) - if(!mytape || mytape.ruined) + if(!mytape) + to_chat(user, "The [src] does not have a tape inside.") + return + if(mytape.ruined) + to_chat(user, "The tape inside the [src] appears to be broken.") return - if(recording) - stop() - else - record() + update_available_icons() + if(icons_available) + var/selection = show_radial_menu(user, src, icons_available, radius = 38, require_near = TRUE, tooltips = TRUE) + if(!selection) + return + switch(selection) + if("Pause") + stop() + if("Stop Recording") // yes we actually need 2 seperate stops for the same proc- Hopek + stop() + if("Record") + record() + if("Play") + play() + if("Print Transcript") + print_transcript() + if("Eject") + eject(user) /obj/item/taperecorder/verb/print_transcript() set name = "Print Transcript" @@ -275,7 +314,7 @@ /obj/item/tape/attackby(obj/item/I, mob/user, params) - if(ruined && istype(I, /obj/item/screwdriver) || istype(I, /obj/item/pen)) + if(ruined && I.tool_behaviour == TOOL_SCREWDRIVER || istype(I, /obj/item/pen)) to_chat(user, "You start winding the tape back in...") if(I.use_tool(src, user, 120)) to_chat(user, "You wound the tape back in.") diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index eb444cdb12..70edd3f43d 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -264,6 +264,30 @@ effective or pretty fucking useless. GLOB.active_jammers -= src update_icon() +/*portable turret*/ +/obj/item/storage/toolbox/emergency/turret + desc = "You feel a strange urge to hit this with a wrench." + +/obj/item/storage/toolbox/emergency/turret/PopulateContents() + new /obj/item/screwdriver(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/analyzer(src) + new /obj/item/wirecutters(src) + +/obj/item/storage/toolbox/emergency/turret/attackby(obj/item/I, mob/living/user, params) + if(I.tool_behaviour == TOOL_WRENCH && user.a_intent == INTENT_HARM) + user.visible_message("[user] bashes [src] with [I]!", \ + "You bash [src] with [I]!", null, COMBAT_MESSAGE_RANGE) + playsound(src, "sound/items/drill_use.ogg", 80, TRUE, -1) + var/obj/machinery/porta_turret/syndicate/pod/toolbox/turret = new(get_turf(loc)) + turret.faction = list("[REF(user)]") + qdel(src) + return + + ..() + /obj/item/headsetupgrader name = "headset upgrader" desc = "A tool that can be used to upgrade a normal headset to be able to protect from flashbangs." diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 2fe4c67362..bbc493672f 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -1,39 +1,38 @@ -/obj/item/storage/box/dice +/*****************************Dice Bags********************************/ + +/obj/item/storage/dice name = "bag of dice" desc = "Contains all the luck you'll ever need." icon = 'icons/obj/dice.dmi' icon_state = "dicebag" + w_class = WEIGHT_CLASS_SMALL + var/list/special_die = list( + /obj/item/dice/d1, + /obj/item/dice/d2, + /obj/item/dice/fudge, + /obj/item/dice/d6/space, + /obj/item/dice/d00, + /obj/item/dice/eightbd20, + /obj/item/dice/fourdd6, + /obj/item/dice/d100 + ) -/obj/item/storage/box/dice/Initialize() - . = ..() - var/special_die = pick("1","2","fudge","space","00","8bd20","4dd6","100") - if(special_die == "1") - new /obj/item/dice/d1(src) - if(special_die == "2") - new /obj/item/dice/d2(src) +/obj/item/storage/dice/PopulateContents() new /obj/item/dice/d4(src) new /obj/item/dice/d6(src) - if(special_die == "fudge") - new /obj/item/dice/fudge(src) - if(special_die == "space") - new /obj/item/dice/d6/space(src) new /obj/item/dice/d8(src) new /obj/item/dice/d10(src) - if(special_die == "00") - new /obj/item/dice/d00(src) new /obj/item/dice/d12(src) new /obj/item/dice/d20(src) - if(special_die == "8bd20") - new /obj/item/dice/eightbd20(src) - if(special_die == "4dd6") - new /obj/item/dice/fourdd6(src) - if(special_die == "100") - new /obj/item/dice/d100(src) + var/picked = pick(special_die) + new picked(src) -/obj/item/storage/box/dice/suicide_act(mob/user) +/obj/item/storage/dice/suicide_act(mob/user) user.visible_message("[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!") return (OXYLOSS) +/*****************************Dice********************************/ + /obj/item/dice //depreciated d6, use /obj/item/dice/d6 if you actually want a d6 name = "die" desc = "A die with six sides. Basic and serviceable." diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 6cf6a524de..3d62a98ddf 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -253,7 +253,7 @@ possible_colors = list("purple") /obj/item/dualsaber/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) if(!hacked) hacked = TRUE to_chat(user, "2XRNBW_ENGAGE") diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 0d5c9a22aa..39c8143ee9 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -46,6 +46,9 @@ if(.) new /obj/item/toy/eightball/haunted(loc) +/obj/item/toy/eightball/DoRevenantThrowEffects(atom/target) + MakeHaunted() + /obj/item/toy/eightball/attack_self(mob/user) if(shaking) return diff --git a/code/game/objects/items/electrostaff.dm b/code/game/objects/items/electrostaff.dm index 65d2fdd699..31aaff12b5 100644 --- a/code/game/objects/items/electrostaff.dm +++ b/code/game/objects/items/electrostaff.dm @@ -21,12 +21,11 @@ var/can_block_projectiles = FALSE //can't block guns var/lethal_cost = 400 //10000/400*20 = 500. decent enough? var/lethal_damage = 20 - var/lethal_stam_cost = 4 var/stun_cost = 333 //10000/333*25 = 750. stunbatons are at time of writing 10000/1000*49 = 490. var/stun_status_effect = STATUS_EFFECT_ELECTROSTAFF //a small slowdown effect var/stun_stamdmg = 40 var/stun_status_duration = 25 - var/stun_stam_cost = 3.5 + var/stam_cost = 3.5 var/wielded = FALSE // track wielded status on item // haha security desword time /s @@ -171,7 +170,7 @@ turn_off() /obj/item/electrostaff/attack(mob/living/target, mob/living/user) - if(IS_STAMCRIT(user))//CIT CHANGE - makes it impossible to baton in stamina softcrit + if(IS_STAMCRIT(user) || !user.UseStaminaBuffer(stam_cost))//CIT CHANGE - makes it impossible to baton in stamina softcrit to_chat(user, "You're too exhausted to use [src] properly.")//CIT CHANGE - ditto return //CIT CHANGE - ditto if(on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) @@ -186,13 +185,11 @@ if(user.a_intent != INTENT_HARM) if(stun_act(target, user, null, return_list)) user.do_attack_animation(target) - user.adjustStaminaLossBuffered(stun_stam_cost) return else if(!harm_act(target, user, null, return_list)) return ..() //if you can't fry them just beat them with it else //we did harm act them user.do_attack_animation(target) - user.adjustStaminaLossBuffered(lethal_stam_cost) /obj/item/electrostaff/proc/stun_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE, list/block_return = list()) var/stunforce = block_calculate_resultant_damage(stun_stamdmg, block_return) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index b1f51f608d..301b8d4155 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -63,7 +63,7 @@ name = "advanced fire extinguisher" desc = "Used to stop thermonuclear fires from spreading inside your engine." icon_state = "foam_extinguisher0" - //item_state = "foam_extinguisher" needs sprite + item_state = "foam_extinguisher" dog_fashion = null chem = /datum/reagent/firefighting_foam tanktype = /obj/structure/reagent_dispensers/foamtank @@ -235,16 +235,23 @@ return EmptyExtinguisher(user) -/obj/item/extinguisher/proc/EmptyExtinguisher(var/mob/user) - if(loc == user && reagents.total_volume) +/obj/item/extinguisher/DoRevenantThrowEffects(atom/target) + EmptyExtinguisher() + +/obj/item/extinguisher/proc/EmptyExtinguisher(mob/user) + if(!reagents.total_volume) + return + if(loc == user || !user) reagents.clear_reagents() var/turf/T = get_turf(loc) if(isopenturf(T)) var/turf/open/theturf = T theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) - - user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by using its release valve.") + if(user) + user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by using its release valve.") + else + user.visible_message("The release valve of \the [src] suddenly opens and sprays it's contents on the floor!") //firebot assembly /obj/item/extinguisher/attackby(obj/O, mob/user, params) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 515f5715dd..3d1ea9e7a2 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -79,7 +79,7 @@ flame_turf(turflist) /obj/item/flamethrower/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !status)//Taking this apart + if(W.tool_behaviour == TOOL_WRENCH && !status)//Taking this apart var/turf/T = get_turf(src) if(weldtool) weldtool.forceMove(T) @@ -94,7 +94,7 @@ qdel(src) return - else if(istype(W, /obj/item/screwdriver) && igniter && !lit) + else if(W.tool_behaviour == TOOL_SCREWDRIVER && igniter && !lit) status = !status to_chat(user, "[igniter] is now [status ? "secured" : "unsecured"]!") update_icon() diff --git a/code/game/objects/items/gift.dm b/code/game/objects/items/gift.dm index 8054d8c6a4..a9ed94aae9 100644 --- a/code/game/objects/items/gift.dm +++ b/code/game/objects/items/gift.dm @@ -8,6 +8,15 @@ * Gifts */ +GLOBAL_LIST_INIT(gift_item_blacklist, typecacheof(list( + /obj/effect, + /obj/belly, + /obj/mafia_game_board, + /obj/docking_port, + /obj/shapeshift_holder, + /obj/screen + ))) + GLOBAL_LIST_EMPTY(possible_gifts) /obj/item/a_gift @@ -95,7 +104,7 @@ GLOBAL_LIST_EMPTY(possible_gifts) var/list/gift_types_list = subtypesof(/obj/item) for(var/V in gift_types_list) var/obj/item/I = V - if((!initial(I.icon_state)) || (!initial(I.item_state)) || (initial(I.item_flags) & ABSTRACT)) + if((!initial(I.icon_state)) || (!initial(I.item_state)) || (initial(I.item_flags) & ABSTRACT) || (is_type_in_typecache(I, GLOB.gift_item_blacklist))) gift_types_list -= V GLOB.possible_gifts = gift_types_list var/gift_type = pick(GLOB.possible_gifts) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index f06dd634c6..b67b7ae587 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -51,7 +51,7 @@ /obj/item/grenade/chem_grenade/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(stage == WIRED) if(beakers.len) stage_change(READY) @@ -105,11 +105,11 @@ to_chat(user, "You need one length of coil to wire the assembly!") return - else if(stage == READY && istype(I, /obj/item/wirecutters) && !active) + else if(stage == READY && I.tool_behaviour == TOOL_WIRECUTTER && !active) stage_change(WIRED) to_chat(user, "You unlock the [initial(name)] assembly.") - else if(stage == WIRED && istype(I, /obj/item/wrench)) + else if(stage == WIRED && I.tool_behaviour == TOOL_WRENCH) if(beakers.len) for(var/obj/O in beakers) O.forceMove(drop_location()) @@ -275,7 +275,7 @@ var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool. /obj/item/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/multitool)) + if(I.tool_behaviour == TOOL_MULTITOOL) switch(unit_spread) if(0 to 24) unit_spread += 5 diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 014487332c..23fe128fa8 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -19,6 +19,7 @@ var/boom_sizes = list(0, 0, 3) var/can_attach_mob = FALSE var/full_damage_on_mobs = FALSE + var/can_gib_mobs = FALSE /obj/item/grenade/plastic/Initialize() . = ..() @@ -46,7 +47,7 @@ playsound(src, 'sound/weapons/tap.ogg', 20, 1) update_icon() return - if(nadeassembly && istype(I, /obj/item/wirecutters)) + if(nadeassembly && I.tool_behaviour == TOOL_WIRECUTTER) I.play_tool_sound(src, 20) nadeassembly.forceMove(get_turf(src)) nadeassembly.master = null @@ -72,7 +73,7 @@ explosion(get_step(T, aim_dir), boom_sizes[1], boom_sizes[2], boom_sizes[3]) else explosion(location, boom_sizes[1], boom_sizes[2], boom_sizes[3]) - if(ismob(target)) + if(ismob(target) && can_gib_mobs) var/mob/M = target M.gib() qdel(src) @@ -84,6 +85,7 @@ /obj/item/grenade/plastic/Crossed(atom/movable/AM) if(nadeassembly) nadeassembly.Crossed(AM) + . = ..() /obj/item/grenade/plastic/on_found(mob/finder) if(nadeassembly) @@ -204,7 +206,7 @@ user.gib(1, 1) /obj/item/grenade/plastic/c4/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) open_panel = !open_panel to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") else if(is_wire_tool(I)) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 4c9ea06620..59b6d56b51 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -245,6 +245,9 @@ slowdown = 7 breakouttime = 300 //Deciseconds = 30s = 0.5 minute +/obj/item/restraints/legcuffs/proc/on_removed() + return + /obj/item/restraints/legcuffs/beartrap name = "bear trap" throw_speed = 1 @@ -376,11 +379,8 @@ icon_state = "ebola" hitsound = 'sound/weapons/taserhit.ogg' w_class = WEIGHT_CLASS_SMALL - breakouttime = 60 + breakouttime = 25 -/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(iscarbon(hit_atom)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) - B.Crossed(hit_atom) - qdel(src) - ..() +/obj/item/restraints/legcuffs/bola/energy/on_removed() + do_sparks(1, TRUE, src) + qdel(src) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 58146be20f..a541fb8fe3 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -492,7 +492,7 @@ var/possessed = FALSE /obj/item/nullrod/scythe/talking/process() - for(var/mob/living/simple_animal/shade/S in contents) + for(var/mob/living/simple_animal/hostile/construct/shade/S in contents) if(S.mind) return else @@ -516,7 +516,7 @@ if(LAZYLEN(candidates)) var/mob/C = pick(candidates) - var/mob/living/simple_animal/shade/S = new(src) + var/mob/living/simple_animal/hostile/construct/shade/S = new(src) S.real_name = name S.name = name S.ckey = C.ckey @@ -537,7 +537,7 @@ possessed = FALSE /obj/item/nullrod/scythe/talking/Destroy() - for(var/mob/living/simple_animal/shade/S in contents) + for(var/mob/living/simple_animal/hostile/construct/shade/S in contents) to_chat(S, "You were destroyed!") qdel(S) return ..() @@ -803,6 +803,7 @@ force = 4 throwforce = 0 attack_verb = list("whipped", "repented", "lashed", "flagellated") + slot_flags = ITEM_SLOT_BELT var/praying = FALSE var/deity_name = "Coderbus" //This is the default, hopefully won't actually appear if the religion subsystem is running properly diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index cc2ae3631e..f8e02eaf03 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -40,11 +40,11 @@ //What does the implant do upon injection? //return 1 if the implant injects //return 0 if there is no room for implant / it fails -/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = FALSE) +/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) if(SEND_SIGNAL(src, COMSIG_IMPLANT_IMPLANTING, args) & COMPONENT_STOP_IMPLANTING) return LAZYINITLIST(target.implants) - if(!target.can_be_implanted() || !can_be_implanted_in(target)) + if(!force && (!target.can_be_implanted() || !can_be_implanted_in(target))) return FALSE for(var/X in target.implants) var/obj/item/implant/imp_e = X diff --git a/code/game/objects/items/implants/implant_chem.dm b/code/game/objects/items/implants/implant_chem.dm index 8da1d1e472..d148cbbb3c 100644 --- a/code/game/objects/items/implants/implant_chem.dm +++ b/code/game/objects/items/implants/implant_chem.dm @@ -96,4 +96,4 @@ if(implant?.imp_in) qdel(implant) else - return ..() \ No newline at end of file + return ..() diff --git a/code/game/objects/items/implants/implant_hijack.dm b/code/game/objects/items/implants/implant_hijack.dm index 36e58d8887..06d2df9272 100644 --- a/code/game/objects/items/implants/implant_hijack.dm +++ b/code/game/objects/items/implants/implant_hijack.dm @@ -92,10 +92,17 @@ /obj/item/implant/hijack/proc/hijack_remotely(obj/machinery/power/apc/apc) if (apc.hijacker || hijacking) return FALSE //can't remotely hijack an already hijacked APC + + if(apc.being_hijacked) + to_chat(imp_in, "This APC is already being hijacked!") + return FALSE + + apc.being_hijacked = TRUE hijacking = TRUE to_chat(imp_in, "Establishing remote connection with APC.") if (!do_after(imp_in, 4 SECONDS,target=apc)) to_chat(imp_in, "Aborting.") + apc.being_hijacked = FALSE hijacking = FALSE return TRUE if (LAZYLEN(imp_in.siliconaccessareas) >= HIJACK_APC_MAX_AMOUNT) @@ -118,6 +125,7 @@ toggle_eyes() else to_chat(imp_in, "Aborting.") + apc.being_hijacked = FALSE hijacking = FALSE imp_in.light_power = 0 imp_in.light_range = 0 diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 36f82b599c..0a86abdec9 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -40,17 +40,80 @@ /obj/item/implant/warp name = "warp implant" - desc = "Saves your position somewhere, and then warps you back to it after five seconds." + desc = "Warps you to where you were 10 seconds before when activated." icon_state = "warp" - uses = 15 + uses = -1 + var/total_delay = 10 SECONDS + var/cooldown = 30 SECONDS + var/last_use = 0 + var/list/positions = list() + var/next_prune = 0 + +/obj/item/implant/warp/Destroy() + positions = null + return ..() + +/obj/item/implant/warp/implant(mob/living/target, mob/user, silent, force) + . = ..() + if(.) + update_position() + RegisterSignal(imp_in, COMSIG_MOVABLE_MOVED, .proc/update_position) + +/obj/item/implant/warp/removed(mob/living/source, silent, special) + . = ..() + clear_positions() + +/obj/item/implant/warp/proc/update_position(datum/source) + if(!isatom(imp_in.loc)) + return + positions[num2text(world.time)] = imp_in.loc + if(!((++next_prune) % 10)) + prune() + +/obj/item/implant/warp/proc/clear_positions() + positions = list() + +/obj/item/implant/warp/proc/get_tele_position() + prune() + return positions[positions[1]] + +/obj/item/implant/warp/proc/do_teleport_effects() + var/safety = 100 + var/list/done = list() + var/time + var/turf/target + for(var/i in 1 to positions.len) + if(!--safety) + break + time = positions[i] + target = positions[time] + if(done[target]) + continue + done[target] = TRUE + if(!istype(target)) + continue + new /obj/effect/temp_visual/dir_setting/ninja(target) /obj/item/implant/warp/activate() . = ..() - uses-- - imp_in.do_adrenaline(20, TRUE, 0, 0, TRUE, list(/datum/reagent/fermi/eigenstate = 1.2), "You feel an internal prick as as the bluespace starts ramping up!") - to_chat(imp_in, "You feel an internal prick as as the bluespace starts ramping up!") - if(!uses) - qdel(src) + if(last_use + cooldown > world.time) + to_chat(imp_in, "[src] is still recharging!") + return + last_use = world.time + prune() + do_teleport_effects() //first. + do_teleport(imp_in, get_tele_position(), 0, TRUE, null, null, null, null, null, TELEPORT_CHANNEL_QUANTUM, TRUE) + +/obj/item/implant/warp/proc/prune() + var/minimum_time = world.time - total_delay + var/remove = 0 + for(var/i in 1 to length(positions)) + if(text2num(positions[i]) < minimum_time) + remove++ + else + break + if(remove) + positions.Cut(1, remove + 1) /obj/item/implanter/warp name = "implanter (warp)" diff --git a/code/game/objects/items/implants/implant_radio.dm b/code/game/objects/items/implants/implant_radio.dm index 6f42547004..f3e7027c37 100644 --- a/code/game/objects/items/implants/implant_radio.dm +++ b/code/game/objects/items/implants/implant_radio.dm @@ -66,4 +66,4 @@ /obj/item/implanter/radio/syndicate name = "implanter (internal syndicate radio)" - imp_type = /obj/item/implant/radio/syndicate \ No newline at end of file + imp_type = /obj/item/implant/radio/syndicate diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index 4f81432a39..2fa0244831 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -73,4 +73,4 @@ /obj/item/implantcase/track name = "implant case - 'Tracking'" desc = "A glass case containing a tracking implant." - imp_type = /obj/item/implant/tracking \ No newline at end of file + imp_type = /obj/item/implant/tracking diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index b57ffa27c0..578d8595dd 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -77,4 +77,4 @@ /obj/item/implanter/hijack name = "implanter (hijack)" - imp_type = /obj/item/implant/hijack \ No newline at end of file + imp_type = /obj/item/implant/hijack diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 8a596b2e6e..ddcd35f834 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -62,7 +62,7 @@ /obj/item/inducer/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) W.play_tool_sound(src) if(!opened) to_chat(user, "You unscrew the battery compartment.") diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index e7cf8defc9..7f2fe6a01d 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -150,8 +150,8 @@ item_state = "knife" desc = "A military combat utility survival knife." embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE) - force = 20 - throwforce = 20 + force = 16 + throwforce = 16 attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") bayonet = TRUE @@ -165,6 +165,35 @@ throwforce = 15 bayonet = TRUE +/obj/item/kitchen/knife/combat/survival/knuckledagger + name = "survival dagger" + icon_state = "glaive-dagger" + desc = "An enhanced hunting grade survival dagger, with a bright light and a handguard that makes it better for efficient butchery." + actions_types = list(/datum/action/item_action/toggle_light) + var/light_on = FALSE + var/brightness_on = 7 + +/obj/item/kitchen/knife/combat/survival/knuckledagger/Initialize() + . = ..() + AddComponent(/datum/component/butchering, 30, 130, 20) // it's good for butchering stuff + +/obj/item/kitchen/knife/combat/survival/knuckledagger/ui_action_click(mob/user, actiontype) + light_on = !light_on + playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) + update_brightness(user) + update_icon() + +/obj/item/kitchen/knife/combat/survival/knuckledagger/proc/update_brightness(mob/user = null) + if(light_on) + set_light(brightness_on) + else + set_light(0) + +/obj/item/kitchen/knife/combat/survival/knuckledagger/update_overlays() + . = ..() + if(light_on) + . += "[icon_state]_lit" + /obj/item/kitchen/knife/combat/bone name = "bone dagger" item_state = "bone_dagger" @@ -222,10 +251,10 @@ /* Trays moved to /obj/item/storage/bag */ /obj/item/kitchen/knife/scimitar - name = "Scimitar knife" + name = "scimitar knife" desc = "A knife used to cleanly butcher. Its razor-sharp edge has been honed for butchering, but has been poorly maintained over the years." attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") -/obj/item/kitchen/knife/scimiar/Initialize() +/obj/item/kitchen/knife/scimitar/Initialize() . = ..() AddComponent(/datum/component/butchering, 90 - force, 100, force - 60) //bonus chance increases depending on force diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 679491aeb6..55546a7f9c 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -190,12 +190,53 @@ /obj/item/melee/transforming/energy/sword/saber possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER) + unique_reskin = list("Sword" = "sword0", "saber" = "esaber0") var/hacked = FALSE + var/saber = FALSE -/obj/item/melee/transforming/energy/sword/saber/set_sword_color() - if(LAZYLEN(possible_colors)) +/obj/item/melee/transforming/energy/sword/saber/transform_weapon(mob/living/user, supress_message_text) + . = ..() + if(.) + if(active) + if(sword_color) + if(saber) + icon_state = "esaber[sword_color]" + else + icon_state = "sword[sword_color]" + else + if(saber) + icon_state = "esaber0" + else + icon_state = "sword0" + +/obj/item/melee/transforming/energy/sword/saber/reskin_obj(mob/M) + . = ..() + if(icon_state == "esaber0") + saber = TRUE + if(active) + if(saber) + icon_state = "esaber[sword_color]" + else + icon_state = "sword[sword_color]" + +/obj/item/melee/transforming/energy/sword/saber/set_sword_color(var/color_forced) + if(color_forced) // wow i really do not like this at fucking all holy SHIT + if(color_forced == "red") + sword_color = "red" + light_color = LIGHT_COLOR_RED + else if(color_forced == "blue") + sword_color = "blue" + light_color = LIGHT_COLOR_LIGHT_CYAN + else if(color_forced == "green") + sword_color = "green" + light_color = LIGHT_COLOR_GREEN + else if(color_forced == "purple") + sword_color = "purple" + light_color = LIGHT_COLOR_LAVENDER + else if(LAZYLEN(possible_colors)) sword_color = pick(possible_colors) light_color = possible_colors[sword_color] + return /obj/item/melee/transforming/energy/sword/saber/process() . = ..() @@ -204,30 +245,59 @@ light_color = possible_colors[set_color] update_light() -/obj/item/melee/transforming/energy/sword/saber/red - possible_colors = list("red" = LIGHT_COLOR_RED) +/obj/item/melee/transforming/energy/sword/saber/red/Initialize(mapload) + . = ..() + set_sword_color("red") -/obj/item/melee/transforming/energy/sword/saber/blue - possible_colors = list("blue" = LIGHT_COLOR_LIGHT_CYAN) +/obj/item/melee/transforming/energy/sword/saber/blue/Initialize(mapload) + . = ..() + set_sword_color("blue") -/obj/item/melee/transforming/energy/sword/saber/green - possible_colors = list("green" = LIGHT_COLOR_GREEN) +/obj/item/melee/transforming/energy/sword/saber/green/Initialize(mapload) + . = ..() + set_sword_color("green") -/obj/item/melee/transforming/energy/sword/saber/purple - possible_colors = list("purple" = LIGHT_COLOR_LAVENDER) +/obj/item/melee/transforming/energy/sword/saber/purple/Initialize(mapload) + . = ..() + set_sword_color("purple") + +/obj/item/melee/transforming/energy/sword/saber/proc/select_sword_color(mob/user) /// this is for the radial + if(!istype(user) || user.incapacitated()) + return + + var/static/list/options = list( + "red" = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "swordred-blade"), + "blue" = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "swordblue-blade"), + "green" = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "swordgreen-blade"), + "purple" = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "swordpurple-blade") + ) + + var/choice = show_radial_menu(user, src, options, custom_check = FALSE, radius = 36, require_near = TRUE) + + if(src && choice && !user.incapacitated() && in_range(user,src)) + set_sword_color(choice) + to_chat(user, "[src] is now [choice].") /obj/item/melee/transforming/energy/sword/saber/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) + if(user.a_intent == INTENT_DISARM) + if(!active) + to_chat(user, "COLOR_SET") + hacked = FALSE + select_sword_color(user) + return + else + to_chat(user, "Turn it off first - getting that close to an active sword is not a great idea.") + return if(!hacked) hacked = TRUE sword_color = "rainbow" to_chat(user, "RNBW_ENGAGE") - if(active) icon_state = "swordrainbow" user.update_inv_hands() else - to_chat(user, "It's already fabulous!") + to_chat(user, "It's already fabulous! If you wanted to reset the color, though, try a disarming intent while it's off.") else return ..() @@ -369,7 +439,9 @@ force_on = 15 //As strong a survival knife/bone dagger /obj/item/melee/transforming/energy/sword/cx/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/melee/transforming/energy/sword/cx)) + if(istype(W, /obj/item/melee/transforming/energy/sword/cx/traitor)) + return + else if(istype(W, /obj/item/melee/transforming/energy/sword/cx)) if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP)) to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!") return diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 52ff0f740e..15d10c4d11 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -352,6 +352,8 @@ return else if(cooldown_check < world.time) + if(!UseStaminaBufferStandard(user, STAM_COST_BATON_MOB_MULT, warn = TRUE)) + return DISCARD_LAST_ACTION if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, null) & BLOCK_SUCCESS) playsound(target, 'sound/weapons/genhit.ogg', 50, 1) return @@ -373,7 +375,6 @@ else target.LAssailant = WEAKREF(user) cooldown_check = world.time + cooldown - user.adjustStaminaLossBuffered(getweight(user, STAM_COST_BATON_MOB_MULT)) else var/wait_desc = get_wait_description() if(wait_desc) diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 7e14fb9d35..224c4ffb9b 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -1,17 +1,3 @@ -/obj/item/caution - desc = "Caution! Wet Floor!" - name = "wet floor sign" - icon = 'icons/obj/janitor.dmi' - icon_state = "caution" - lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' - force = 1 - throwforce = 3 - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_SMALL - attack_verb = list("warned", "cautioned", "smashed") - /obj/item/choice_beacon name = "choice beacon" desc = "Hey, why are you viewing this?!! Please let Centcom know about this odd occurance." @@ -52,7 +38,8 @@ /obj/item/choice_beacon/proc/spawn_option(atom/choice,mob/living/M) var/obj/new_item = create_choice_atom(choice, M) - var/obj/structure/closet/supplypod/bluespacepod/pod = new() + var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas + var/obj/structure/closet/supplypod/bluespacepod/pod = new(pick(get_area_turfs(pod_storage_area))) //Lets just have it in the pod storage zone for a really short time because we don't want it in nullspace pod.explosionSize = list(0,0,0,0) new_item.forceMove(pod) var/msg = "After making your selection, you notice a strange target on the ground. It might be best to step back!" @@ -62,7 +49,7 @@ msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: Item request received. Your package is inbound, please stand back from the landing site. Message ends.\"" to_chat(M, msg) - new /obj/effect/abstract/DPtarget(get_turf(src), pod) + new /obj/effect/pod_landingzone(get_turf(src), pod) /obj/item/choice_beacon/ingredients name = "ingredient box delivery beacon" diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index b420bfc002..62a3530afe 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -24,13 +24,17 @@ create_reagents(mopcap, NONE, NO_REAGENTS_VALUE) -/obj/item/mop/proc/clean(turf/A) +/obj/item/mop/proc/clean(turf/A, mob/user) if(reagents.has_reagent(/datum/reagent/water, 1) || reagents.has_reagent(/datum/reagent/water/holywater, 1) || reagents.has_reagent(/datum/reagent/consumable/ethanol/vodka, 1) || reagents.has_reagent(/datum/reagent/space_cleaner, 1)) SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) A.clean_blood() + var/cleaned_something = FALSE for(var/obj/effect/O in A) if(is_cleanable(O)) + cleaned_something = TRUE qdel(O) + if(cleaned_something && user && user.client) + user.client.increment_progress("janitor", 1) reagents.reaction(A, TOUCH, 10) //Needed for proper floor wetting. reagents.remove_any(1) //reaction() doesn't use up the reagents @@ -56,22 +60,20 @@ return if(T) + if(!L.UseStaminaBuffer(stamusage, warn = TRUE)) + return user.visible_message("[user] cleans \the [T] with [src].", "You clean \the [T] with [src].") - clean(T) + clean(T, user) user.DelayNextAction(CLICK_CD_MELEE) user.do_attack_animation(T, used_item = src) - if(istype(L)) - L.adjustStaminaLossBuffered(stamusage) playsound(T, "slosh", 50, 1) - /obj/effect/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/mop) || istype(I, /obj/item/soap)) return else return ..() - /obj/item/mop/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) if(insertable) J.put_in_cart(src, user) diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 3420e72c72..e47b2bb0d8 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -19,6 +19,8 @@ var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off var/alert = FALSE // TRUE to display things more seriously + /// resets target on toggle + var/resets_target = TRUE /obj/item/pinpointer/Initialize() . = ..() @@ -27,17 +29,22 @@ /obj/item/pinpointer/Destroy() STOP_PROCESSING(SSfastprocess, src) GLOB.pinpointer_list -= src - target = null + unset_target() return ..() +/obj/item/pinpointer/DoRevenantThrowEffects(atom/target) + attack_self() + /obj/item/pinpointer/attack_self(mob/living/user) active = !active - user.visible_message("[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.", "You [active ? "" : "de"]activate your pinpointer.") + if(user) + user.visible_message("[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.", "You [active ? "" : "de"]activate your pinpointer.") playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) if(active) START_PROCESSING(SSfastprocess, src) else - target = null + if(resets_target) + unset_target() STOP_PROCESSING(SSfastprocess, src) update_icon() @@ -50,6 +57,18 @@ /obj/item/pinpointer/proc/scan_for_target() return +/obj/item/pinpointer/proc/set_target(atom/movable/newtarget) + if(target) + unset_target() + target = newtarget + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/unset_target) + +/obj/item/pinpointer/proc/unset_target() + if(!target) + return + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + target = null + /obj/item/pinpointer/update_overlays() . = ..() if(!active) @@ -101,7 +120,8 @@ active = FALSE user.visible_message("[user] deactivates [user.p_their()] pinpointer.", "You deactivate your pinpointer.") playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) - target = null //Restarting the pinpointer forces a target reset + if(resets_target) + unset_target() //Restarting the pinpointer forces a target reset STOP_PROCESSING(SSfastprocess, src) update_icon() return @@ -137,7 +157,7 @@ if(!A || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated()) return - target = names[A] + set_target(names[A]) active = TRUE user.visible_message("[user] activates [user.p_their()] pinpointer.", "You activate your pinpointer.") playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) @@ -149,7 +169,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target if(!trackable(H)) - target = null + unset_target() if(!target) //target can be set to null from above code, or elsewhere active = FALSE @@ -163,7 +183,7 @@ . = ..() /obj/item/pinpointer/pair/scan_for_target() - target = other_pair + set_target(other_pair) /obj/item/pinpointer/pair/examine(mob/user) . = ..() @@ -195,8 +215,20 @@ shuttleport = SSshuttle.getShuttle("huntership") /obj/item/pinpointer/shuttle/scan_for_target() - target = shuttleport + set_target(shuttleport) /obj/item/pinpointer/shuttle/Destroy() shuttleport = null - . = ..() \ No newline at end of file + . = ..() + +/obj/item/pinpointer/ian + name = "ian pinpointer" + desc = "A handheld tracking device that locates Ian. Made with real corgis!" + icon_state = "pinpointer_ian" + +/obj/item/pinpointer/ian/scan_for_target() + set_target(locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list) + +/obj/item/pinpointer/custom + resets_target = FALSE + diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 9bc20565a6..c213fa34df 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -33,6 +33,8 @@ //--end of love :'(-- var/snowflake_id //if we set from a config snowflake plushie. + /// wrapper, do not use, read only + var/__ADMIN_SET_TO_ID var/can_random_spawn = TRUE //if this is FALSE, don't spawn this for random plushies. /obj/item/toy/plush/random_snowflake/Initialize(mapload, set_snowflake_id) @@ -43,9 +45,14 @@ return set_snowflake_from_config(id) +/obj/item/toy/plush/DoRevenantThrowEffects(atom/target) + var/datum/component/squeak/squeaker = GetComponent(/datum/component/squeak) + squeaker.do_play_squeak(TRUE) + /obj/item/toy/plush/Initialize(mapload, set_snowflake_id) . = ..() AddComponent(/datum/component/squeak, squeak_override) + AddElement(/datum/element/bed_tuckable, 6, -5, 90) //have we decided if Pinocchio goes in the blue or pink aisle yet? if(gender == NEUTER) @@ -112,10 +119,21 @@ return ..() +/obj/item/toy/plush/vv_get_var(var_name) + if(var_name == NAMEOF(src, __ADMIN_SET_TO_ID)) + return debug_variable("__ADMIN: SET SNOWFLAKE ID", snowflake_id, 0, src) + return ..() + +/obj/item/toy/plush/vv_edit_var(var_name, var_value) + if(var_name == NAMEOF(src, __ADMIN_SET_TO_ID)) + return set_snowflake_from_config(var_value) + return ..() + /obj/item/toy/plush/proc/set_snowflake_from_config(id) var/list/configlist = CONFIG_GET(keyed_list/snowflake_plushies) var/list/jsonlist = configlist[id] - ASSERT(jsonlist) + if(!jsonlist) + return FALSE jsonlist = json_decode(jsonlist) if(jsonlist["inherit_from"]) var/path = text2path(jsonlist["inherit_from"]) @@ -151,6 +169,7 @@ var/datum/component/squeak/S = GetComponent(/datum/component/squeak) S?.override_squeak_sounds = squeak_override snowflake_id = id + return TRUE /obj/item/toy/plush/handle_atom_del(atom/A) if(A == grenade) @@ -447,6 +466,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) can_random_spawn = FALSE /obj/item/toy/plush/random/Initialize() + SHOULD_CALL_PARENT(FALSE) var/newtype var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 23be8cbb9a..e62208f848 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -43,6 +43,13 @@ /obj/item/pneumatic_cannon/proc/init_charge() //wrapper so it can be vv'd easier START_PROCESSING(SSobj, src) +/obj/item/pneumatic_cannon/DoRevenantThrowEffects(atom/target) + var/picked_target + var/list/possible_targets = range(3,src) + picked_target = pick(possible_targets) + if(target) + Fire(null, picked_target) + /obj/item/pneumatic_cannon/process() if(++charge_tick >= charge_ticks && charge_type) fill_with_type(charge_type, charge_amount) @@ -77,7 +84,7 @@ updateTank(W, 0, user) else if(W.type == type) to_chat(user, "You're fairly certain that putting a pneumatic cannon inside another pneumatic cannon would cause a spacetime disruption.") - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) switch(pressureSetting) if(1) pressureSetting = 2 @@ -86,7 +93,7 @@ if(3) pressureSetting = 1 to_chat(user, "You tweak \the [src]'s pressure output to [pressureSetting].") - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(tank) updateTank(tank, 1, user) else if(loadedWeightClass >= maxWeightClass) @@ -134,21 +141,29 @@ Fire(user, target) /obj/item/pneumatic_cannon/proc/Fire(mob/living/user, var/atom/target) - if(!istype(user) && !target) + if(!target) return + if(user) + if(!isliving(user)) + return var/discharge = 0 - if(!can_trigger_gun(user)) + if(user && !can_trigger_gun(user)) return if(!loadedItems || !loadedWeightClass) - to_chat(user, "\The [src] has nothing loaded.") + if(user) + to_chat(user, "\The [src] has nothing loaded.") return if(!tank && checktank) - to_chat(user, "\The [src] can't fire without a source of gas.") + if(user) + to_chat(user, "\The [src] can't fire without a source of gas.") return if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting)) - to_chat(user, "\The [src] lets out a weak hiss and doesn't react!") + if(user) + to_chat(user, "\The [src] lets out a weak hiss and doesn't react!") + else + visible_message(src, "\The [src] lets out a weak hiss and doesn't react!") return - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user)) + if(user && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user)) var/mob/living/carbon/C = user C.visible_message("[C] loses [C.p_their()] grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!") C.dropItemToGround(src, TRUE) @@ -157,15 +172,18 @@ else var/list/possible_targets = range(3,src) target = pick(possible_targets) - discharge = 1 - if(!discharge) + discharge = TRUE + if(!discharge && user) user.visible_message("[user] fires \the [src]!", \ "You fire \the [src]!") - log_combat(user, target, "fired at", src) var/turf/T = get_target(target, get_turf(src)) - playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1) - fire_items(T, user) - if(pressureSetting >= 3 && iscarbon(user)) + playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE) + if(user) + log_combat(user, target, "fired at", src) + fire_items(T, user) + else + fire_items(T) + if(user && pressureSetting >= 3 && iscarbon(user)) var/mob/living/carbon/C = user C.visible_message("[C] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!") C.DefaultCombatKnockdown(60) diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 2834b3b758..f95acd6018 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -6,7 +6,7 @@ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' flags_1 = CONDUCT_1 - item_flags = NEEDS_PERMIT | NO_COMBAT_MODE_FORCE_MODIFIER //To avoid ambushing and oneshotting healthy crewmembers on force setting 3. + item_flags = NEEDS_PERMIT attack_verb = list("whacked", "fisted", "power-punched") force = 20 throwforce = 10 @@ -36,7 +36,7 @@ to_chat(user, "\The [IT] is too small for \the [src].") return updateTank(W, 0, user) - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) switch(fisto_setting) if(1) fisto_setting = 2 @@ -46,7 +46,7 @@ fisto_setting = 1 W.play_tool_sound(src) to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting].") - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(tank) updateTank(tank, 1, user) @@ -76,6 +76,9 @@ if(!tank) to_chat(user, "\The [src] can't operate without a source of gas!") return FALSE + var/weight = getweight(user, STAM_COST_ATTACK_MOB_MULT) + if(!user.UseStaminaBuffer(weight, warn = TRUE)) + return FALSE var/datum/gas_mixture/gasused = tank.air_contents.remove(gasperfist * fisto_setting) var/turf/T = get_turf(src) if(!T) @@ -108,8 +111,4 @@ target.throw_at(throw_target, 5 * fisto_setting, 0.5 + (fisto_setting / 2)) log_combat(user, target, "power fisted", src) - - var/weight = getweight(user, STAM_COST_ATTACK_MOB_MULT) - if(weight) - user.adjustStaminaLossBuffered(weight) return TRUE diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 648ba27897..345f3185da 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -134,11 +134,10 @@ /obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM) . = ..() if(trigger_item && istype(AM, specific_item) && !claimed) - AM.anchored = TRUE + AM.set_anchored(TRUE) flick("laserbox_burn", AM) trigger() - sleep(15) - qdel(AM) + QDEL_IN(src, 15) // snowflake code until undertile elements /obj/item/pressure_plate/hologrid/hide() diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 61a05aacd8..b8f0d161dc 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -321,4 +321,4 @@ desc = "A rusted claymore, once at the heart of a powerful scottish clan struck down and oppressed by tyrants, it has been passed down the ages as a symbol of defiance." force = 15 block_chance = 30 - armour_penetration = 5 \ No newline at end of file + armour_penetration = 5 diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index a9cd4c33a7..fbb3297f89 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -226,7 +226,7 @@ else to_chat(user, "You need to attach a flash to it first!") - else if (istype(W, /obj/item/multitool)) + else if(W.tool_behaviour == TOOL_MULTITOOL) if(check_completion()) Interact(user) else @@ -326,6 +326,9 @@ else if(istype(W, /obj/item/borg/upgrade/ai)) var/obj/item/borg/upgrade/ai/M = W if(check_completion()) + if(!chest.cell) + to_chat(user, "The endoskeleton still needs a power cell!") + return if(!isturf(loc)) to_chat(user, "You cannot install[M], the frame has to be standing on the ground to be perfectly precise!") return @@ -346,7 +349,6 @@ O.lawupdate = FALSE O.make_laws() - O.cell = chest.cell chest.cell.forceMove(O) chest.cell = null @@ -380,7 +382,7 @@ var/mob/living/living_user = usr var/obj/item/item_in_hand = living_user.get_active_held_item() - if(!istype(item_in_hand, /obj/item/multitool)) + if(!item_in_hand.tool_behaviour == TOOL_MULTITOOL) to_chat(living_user, "You need a multitool!") return @@ -392,6 +394,7 @@ created_name = new_name else created_name = "" + log_game("[key_name(usr)] renamed [src] ([REF(src)]) to [created_name].") else if(href_list["Master"]) forced_ai = select_active_ai(usr) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 9f098bc16c..291fc30aa2 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -80,6 +80,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst desc = "Used to kick in a cyborg's VTEC systems, increasing their speed." icon_state = "cyborg_upgrade2" require_module = 1 + var/obj/effect/proc_holder/silicon/cyborg/vtecControl/VC /obj/item/borg/upgrade/vtec/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -91,12 +92,14 @@ as performing this in action() will cause the upgrade to end up in the borg inst //R.speed = -2 // Gotta go fast. //Citadel change - makes vtecs give an ability rather than reducing the borg's speed instantly - R.AddAbility(new/obj/effect/proc_holder/silicon/cyborg/vtecControl) + VC = new /obj/effect/proc_holder/silicon/cyborg/vtecControl + R.AddAbility(VC) R.cansprint = 0 /obj/item/borg/upgrade/vtec/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() if (.) + R.RemoveAbility(VC) R.speed = initial(R.speed) R.cansprint = 1 diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 4952c93928..5c3e4fd612 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -136,15 +136,17 @@ if(!(shield_flags & SHIELD_BASH_GROUND_SLAM)) to_chat(user, "You can't ground slam with [src]!") return FALSE + if(!user.UseStaminaBuffer(shieldbash_stamcost, warn = TRUE)) + return FALSE bash_target(user, target, NONE, harmful) user.do_attack_animation(target, used_item = src) playsound(src, harmful? "swing_hit" : 'sound/weapons/thudswoosh.ogg', 75, 1) last_shieldbash = world.time - user.adjustStaminaLossBuffered(shieldbash_stamcost) return TRUE // Directional sweep! last_shieldbash = world.time - user.adjustStaminaLossBuffered(shieldbash_stamcost) + if(!user.UseStaminaBuffer(shieldbash_stamcost, warn = TRUE)) + return FALSE // Since we are in combat mode, we can probably safely use the user's dir instead of getting their mouse pointing cardinal dir. var/bashdir = user.dir do_shieldbash_effect(user, bashdir, harmful) @@ -256,7 +258,7 @@ shield_flags = SHIELD_FLAGS_DEFAULT max_integrity = 300 -obj/item/shield/riot/bullet_proof +/obj/item/shield/riot/bullet_proof name = "bullet resistant shield" desc = "A far more frail shield made of resistant plastics and kevlar meant to block ballistics." armor = list("melee" = 30, "bullet" = 80, "laser" = 0, "energy" = 0, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 954950f5e6..e2036835ce 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -33,6 +33,20 @@ . = ..() update_desc() +/obj/item/stack/spacecash/attackby(obj/item/W, mob/user, params) + . = ..() + if(istype(W, /obj/item/card/id)) + var/obj/item/card/id/ID = W + if(!ID.registered_account) + to_chat(user, "[ID] doesn't have a linked account to deposit into!") + return + for(var/obj/item/holochip/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/stack/spacecash/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/coin/money in src.loc.contents) + ID.attackby(money, user) + /obj/item/stack/spacecash/c1 icon_state = "spacecash" singular_name = "one credit bill" diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index a96b0104f1..6e66f833c2 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -59,7 +59,7 @@ if(!affecting) //Missing limb? to_chat(user, "[C] doesn't have \a [parse_zone(user.zone_selected)]!") return - if(affecting.status == BODYPART_ORGANIC) //Limb must be organic to be healed - RR + if(affecting.is_organic_limb(FALSE)) //Limb must be organic to be healed - RR if(affecting.brute_dam && brute || affecting.burn_dam && burn) user.visible_message("[user] applies \the [src] on [C]'s [affecting.name].", "You apply \the [src] on [C]'s [affecting.name].") if(affecting.heal_damage(brute, burn)) @@ -173,11 +173,11 @@ "You hear cutting.") use(2) else if(I.is_drainable() && I.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine)) - if(!I.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine, 10)) + if(!I.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine, 5)) to_chat(user, "There's not enough sterilizine in [I] to sterilize [src]!") return - user.visible_message("[user] pours the contents of [I] onto [src], sterilizing it.", "You pour the contents of [I] onto [src], sterilizing it.") - I.reagents.remove_reagent(/datum/reagent/space_cleaner/sterilizine, 10) + user.visible_message("[user] sterilizes [src] with the contents of [I].", "You pour the contents of [I] onto [src], sterilizing it.") + I.reagents.remove_reagent(/datum/reagent/space_cleaner/sterilizine, 5) new /obj/item/stack/medical/gauze/adv/one(user.drop_location()) use(1) else @@ -187,6 +187,9 @@ user.visible_message("[user] begins tightening \the [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies!") return OXYLOSS +/obj/item/stack/medical/gauze/one + amount = 1 + /obj/item/stack/medical/gauze/improvised name = "improvised gauze" singular_name = "improvised gauze" @@ -204,8 +207,9 @@ heal_brute = 6 self_delay = 45 other_delay = 15 - absorption_rate = 0.4 - absorption_capacity = 6 + absorption_rate = 0.5 + absorption_capacity = 12 + splint_factor = 0.15 /obj/item/stack/medical/gauze/adv/one amount = 1 @@ -472,3 +476,51 @@ return TRUE to_chat(user, "You can't heal [M] with the \the [src]!") + +/obj/item/stack/medical/nanogel + name = "nanogel" + singular_name = "nanogel" + desc = "A highly advanced gel that when applied on a sufficiently repaired robotic limb will neutralize internal damage if present, allowing further repairs without the need for surgery." + self_delay = 150 //Agonizingly slow if used on self, but, not completely forbidden because antags with robolimbs need a way to handle their thresholds. + other_delay = 30 //Pretty fast if used on others. + amount = 12 + max_amount = 12 //Two synths worth of fixing, if every single bodypart of them has internal damage. Usually, probably more like 6-12. + icon_state = "nanogel" + var/being_applied = FALSE //No doafter stacking. + +/obj/item/stack/medical/nanogel/try_heal(mob/living/M, mob/user, silent = FALSE) + if(being_applied) + to_chat(user, "You are already applying [src]!") + return + if(!iscarbon(M)) + to_chat(user, "This won't work on [M]!") + return + being_applied = TRUE + ..() + being_applied = FALSE + +/obj/item/stack/medical/nanogel/heal(mob/living/M, mob/user) + var/mob/living/carbon/C = M //Only carbons should be able to get here + if(!C) + return + var/obj/item/bodypart/affecting = C.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) //Missing limb? + to_chat(user, "[C] doesn't have \a [parse_zone(user.zone_selected)]!") + return + if(!affecting.is_robotic_limb()) + to_chat(user, "This won't work on nonrobotic limbs!") + return + if(!affecting.threshhold_brute_passed && !affecting.threshhold_burn_passed) + to_chat(user, "There is no need to use this on [affecting]") + return + if(affecting.threshhold_brute_passed && affecting.brute_dam == affecting.threshhold_passed_mindamage) + . = TRUE + affecting.threshhold_brute_passed = FALSE + if(affecting.threshhold_burn_passed && affecting.burn_dam == affecting.threshhold_passed_mindamage) + . = TRUE + affecting.threshhold_burn_passed = FALSE + if(.) + user.visible_message("The nanogel gets to work on [C], repairing [affecting]'s internal damage.", "You watch as the nanogel gets to work on fixing the internal damage in [affecting]") + return + //If it gets here: It failed, lets tell the user why. + to_chat(user, "[src] fails to work on [affecting] due to residual [(affecting.threshhold_burn_passed && affecting.threshhold_burn_passed) ? "brute and burn" : "[affecting.threshhold_burn_passed ? "burn" : "brute"]"] damage! Perform some external repairs before using this.") diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 1277bb3d4e..c6763092ca 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ custom_materials = list(/datum/material/iron=1000) max_amount = 50 attack_verb = list("hit", "bludgeoned", "whacked") - hitsound = 'sound/weapons/grenadelaunch.ogg' + hitsound = 'sound/items/trayhit1.ogg' embedding = list() novariants = TRUE @@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ icon_state = "rods" /obj/item/stack/rods/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(get_amount() < 2) to_chat(user, "You need at least two rods to do this!") return diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 29b4dea6d8..de2e3b89fe 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -388,4 +388,4 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( /obj/item/shard/plasma/alien name = "alien shard" - desc = "A nasty looking shard of advanced alloy glass." \ No newline at end of file + desc = "A nasty looking shard of advanced alloy glass." diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 32d65041bc..798f1d3a6a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -246,14 +246,12 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\ )), null, \ - new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 20), \ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \ new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \ new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \ new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\ new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\ - new/datum/stack_recipe("training bokken", /obj/item/melee/bokken, 10, time = 15),\ null, \ new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ @@ -388,9 +386,11 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("mining satchel", /obj/item/storage/bag/ore, 4), \ new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \ new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \ + new/datum/stack_recipe("material bag", /obj/item/storage/bag/material, 4), \ + new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4), \ null, \ new/datum/stack_recipe("string", /obj/item/weaponcrafting/string, 1, time = 10), \ - new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \ + new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 10), \ new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \ new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \ @@ -466,6 +466,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), \ new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ new/datum/stack_recipe("folder", /obj/item/folder), \ + new/datum/stack_recipe("cardboard card", /obj/item/cardboard_card, 1), \ // holy fuck why are there so many boxes new/datum/stack_recipe_list("fancy boxes", list ( \ new /datum/stack_recipe("donut box", /obj/item/storage/fancy/donut_box), \ @@ -792,7 +793,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \ new /datum/stack_recipe("duct", /obj/item/stack/ducts,1), \ new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \ - new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2))) + new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2))) /obj/item/stack/sheet/plastic name = "plastic" diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 3e2bb675fa..520a400630 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -65,7 +65,7 @@ if(merge) for(var/obj/item/stack/S in loc) if(S.merge_type == merge_type) - merge(S) + INVOKE_ASYNC(src, .proc/merge, S) var/list/temp_recipes = get_main_recipes() recipes = temp_recipes.Copy() if(material_type) diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index 85e08aa4d2..00b1f49d9f 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -20,7 +20,7 @@ state = 0 //fine /obj/item/stack/tile/light/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/crowbar)) + if(O.tool_behaviour == TOOL_CROWBAR) new/obj/item/stack/sheet/metal(user.loc) amount-- new/obj/item/stack/light_w(user.loc) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 91ffae9cb1..8b272f98b4 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -40,7 +40,7 @@ /obj/item/stack/tile/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(get_amount() < 4) to_chat(user, "You need at least four tiles to do this!") return @@ -214,7 +214,7 @@ /obj/item/stack/tile/carpet/arcade name = "arcade carpet" icon_state = "tile-carpet-arcade" - turf_type = /turf/open/floor + turf_type = /turf/open/floor/carpet/arcade tableVariant = null /obj/item/stack/tile/carpet/blackred diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index f15588a7f1..f10167890a 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -639,7 +639,7 @@ new /obj/item/bikehorn(src) new /obj/item/implanter/sad_trombone(src) -obj/item/storage/backpack/duffelbag/syndie/shredderbundle +/obj/item/storage/backpack/duffelbag/syndie/shredderbundle desc = "A large duffel bag containing two CX Shredders, some magazines, an elite hardsuit, and a chest rig." /obj/item/storage/backpack/duffelbag/syndie/shredderbundle/PopulateContents() diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index b64aa60cac..3dd48237d6 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -234,7 +234,7 @@ STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 100 STR.max_items = 100 - STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/seeds, /obj/item/grown, /obj/item/reagent_containers/honeycomb)) + STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/seeds, /obj/item/grown, /obj/item/reagent_containers/honeycomb, /obj/item/disk/plantgene)) //////// @@ -457,6 +457,9 @@ STR.display_numerical_stacking = FALSE STR.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing)) +/* +Bag for holding materials +*/ /obj/item/storage/bag/material name = "material pouch" desc = "A pouch for sheets and RCD ammunition that manages to hang where you would normally put things in your pocket." @@ -474,3 +477,24 @@ STR.max_items = 2 STR.display_numerical_stacking = TRUE STR.can_hold = typecacheof(list(/obj/item/rcd_ammo, /obj/item/stack/sheet)) + +/* + * Construction bag (for engineering, holds stock parts and electronics) + */ + +/obj/item/storage/bag/construction + name = "construction bag" + icon = 'icons/obj/tools.dmi' + icon_state = "construction_bag" + desc = "A bag for storing small construction components." + w_class = WEIGHT_CLASS_TINY + resistance_flags = FLAMMABLE + +/obj/item/storage/bag/construction/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_combined_w_class = 100 + STR.max_items = 50 + STR.max_w_class = WEIGHT_CLASS_SMALL + STR.insert_preposition = "in" + STR.can_hold = typecacheof(list(/obj/item/stack/ore/bluespace_crystal, /obj/item/assembly, /obj/item/stock_parts, /obj/item/reagent_containers/glass/beaker, /obj/item/stack/cable_coil, /obj/item/circuitboard, /obj/item/electronics,/obj/item/wallframe/camera)) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 590df34cde..9c3d776b56 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -802,7 +802,8 @@ . += "Alt-click it to quickly draw the blade." /obj/item/storage/belt/sabre/PopulateContents() - new starting_sword(src) + if(starting_sword) + new starting_sword(src) /obj/item/storage/belt/sabre/rapier name = "rapier sheath" @@ -816,13 +817,47 @@ fitting_swords = list(/obj/item/melee/rapier) starting_sword = /obj/item/melee/rapier +/obj/item/storage/belt/sabre/secbelt + name = "security sheath" + desc = "A statement on modern practical fashion; this limber black sheath is fitted to a lightened security belt, allowing one to look fashionable with their sword-shaped stun-baton, while of course carrying less things." + icon_state = "secsheath" + item_state = "secsheath" + w_class = WEIGHT_CLASS_BULKY + starting_sword = /obj/item/melee/baton/stunsword + content_overlays = TRUE + +/obj/item/storage/belt/sabre/secbelt/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 5 + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.rustle_sound = TRUE + STR.quickdraw = FALSE + STR.can_hold = typecacheof(list( // cannot carry other batons + /obj/item/melee/baton/stunsword, + /obj/item/grenade, + /obj/item/reagent_containers/spray/pepper, + /obj/item/restraints/handcuffs, + /obj/item/assembly/flash/handheld, + /obj/item/clothing/glasses, + /obj/item/reagent_containers/food/snacks/donut, + /obj/item/flashlight/seclite, + /obj/item/radio, + /obj/item/clothing/gloves, + /obj/item/restraints/legcuffs/bola + )) + +/obj/item/storage/belt/sabre/secbelt/PopulateContents() + new /obj/item/melee/baton/stunsword(src) + update_icon() + /obj/item/storage/belt/sabre/twin name = "twin sheath" desc = "Two sheaths. One is capable of holding a katana (or bokken) and the other a wakizashi. You could put two wakizashis in if you really wanted to. Now you can really roleplay as a samurai." - icon_state = "twinsheath" - item_state = "quiver" //this'll do. + icon_state = "2sheath" + item_state = "katana" //this'll do. w_class = WEIGHT_CLASS_BULKY - fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken) + fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken, /obj/item/katana) starting_sword = null /obj/item/storage/belt/sabre/twin/ComponentInitialize() @@ -830,3 +865,65 @@ var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 2 STR.max_w_class = WEIGHT_CLASS_BULKY + WEIGHT_CLASS_NORMAL //katana and waki. + STR.max_combined_w_class = 7 + +/obj/item/melee/smith/twohand/katana/on_exit_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/twin/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/unsheath.ogg', 25, 1) + . = ..() + +/obj/item/melee/smith/twohand/katana/on_enter_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/twin/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/sheath.ogg', 25, 1) + . = ..() + +/obj/item/melee/smith/wakizashi/on_exit_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/twin/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/unsheath.ogg', 25, 1) + . = ..() + +/obj/item/melee/smith/wakizashi/on_enter_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/twin/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/sheath.ogg', 25, 1) + . = ..() + +/obj/item/melee/bokken/on_exit_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/twin/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/unsheath.ogg', 25, 1) + . = ..() + +/obj/item/melee/bokken/on_enter_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/twin/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/sheath.ogg', 25, 1) + . = ..() + +/obj/item/storage/belt/plant + name = "botanical belt" + desc = "A belt used to hold most hydroponics supplies. Suprisingly, not green." + icon_state = "plantbelt" + item_state = "plantbelt" + content_overlays = TRUE + +/obj/item/storage/belt/plant/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 6 + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.can_hold = typecacheof(list( + /obj/item/reagent_containers/spray/plantbgone, + /obj/item/plant_analyzer, + /obj/item/seeds, + /obj/item/reagent_containers/glass/bottle, + /obj/item/reagent_containers/glass/beaker, + /obj/item/cultivator, + /obj/item/reagent_containers/spray/pestspray, + /obj/item/hatchet, + /obj/item/shovel/spade, + /obj/item/gun/energy/floragun + )) diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 28850e79a2..476f35fe4c 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -103,7 +103,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", /obj/item/storage/book/bible/proc/bless(mob/living/carbon/human/H, mob/living/user) for(var/X in H.bodyparts) var/obj/item/bodypart/BP = X - if(BP.status == BODYPART_ROBOTIC) + if(BP.is_robotic_limb()) to_chat(user, "[src.deity_name] refuses to heal this metallic taint!") return 0 @@ -198,7 +198,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", if(istype(A, /obj/item/cult_bastard)) for(var/obj/item/soulstone/SS in A.contents) SS.usability = TRUE - for(var/mob/living/simple_animal/shade/EX in SS) + for(var/mob/living/simple_animal/hostile/construct/shade/EX in SS) SSticker.mode.remove_cultist(EX.mind, 1, 0) EX.icon_state = "ghost1" EX.name = "Purified [EX.name]" @@ -217,7 +217,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", if(do_after(user, 40, target = SS)) playsound(src,'sound/effects/pray_chaplain.ogg',60,1) SS.usability = TRUE - for(var/mob/living/simple_animal/shade/EX in SS) + for(var/mob/living/simple_animal/hostile/construct/shade/EX in SS) SSticker.mode.remove_cultist(EX.mind, 1, 0) EX.icon_state = "ghost1" EX.name = "Purified [EX.name]" diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 975621ead1..3f9c3a019e 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -275,7 +275,7 @@ for(var/i in 1 to 7) new /obj/item/grenade/flashbang(src) -obj/item/storage/box/stingbangs +/obj/item/storage/box/stingbangs name = "box of stingbangs (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause severe injuries or death in repeated use." icon_state = "secbox" diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index cde6f5bd5a..4080a45af0 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -17,9 +17,6 @@ /obj/item/storage/fancy icon = 'icons/obj/food/containers.dmi' - icon_state = "donutbox6" - name = "donut box" - desc = "Mmm. Donuts." resistance_flags = FLAMMABLE var/icon_type = "donut" var/spawn_type = null @@ -59,18 +56,22 @@ fancy_open = TRUE update_icon() +#define DONUT_INBOX_SPRITE_WIDTH 3 + /* * Donut Box */ /obj/item/storage/fancy/donut_box - icon = 'icons/obj/food/containers.dmi' - icon_state = "donutbox6" - icon_type = "donut" name = "donut box" + desc = "Mmm. Donuts." + icon = 'icons/obj/food/donut.dmi' + icon_state = "donutbox_inner" + icon_type = "donut" spawn_type = /obj/item/reagent_containers/food/snacks/donut fancy_open = TRUE custom_price = PRICE_NORMAL + appearance_flags = KEEP_TOGETHER /obj/item/storage/fancy/donut_box/ComponentInitialize() . = ..() @@ -78,6 +79,36 @@ STR.max_items = 6 STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/donut)) +/obj/item/storage/fancy/donut_box/PopulateContents() + . = ..() + update_icon() + +/obj/item/storage/fancy/donut_box/update_icon_state() + if(fancy_open) + icon_state = "donutbox_inner" + else + icon_state = "donutbox" + +/obj/item/storage/fancy/donut_box/update_overlays() + . = ..() + + if (!fancy_open) + return + + var/donuts = 0 + + for (var/_donut in contents) + var/obj/item/reagent_containers/food/snacks/donut/donut = _donut + if (!istype(donut)) + continue + + . += image(icon = initial(icon), icon_state = donut.in_box_sprite(), pixel_x = donuts * DONUT_INBOX_SPRITE_WIDTH) + donuts += 1 + + . += image(icon = initial(icon), icon_state = "donutbox_top") + +#undef DONUT_INBOX_SPRITE_WIDTH + /* * Egg Box */ diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 4e6a0b3463..2988b54e8f 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -36,14 +36,14 @@ /obj/item/storage/secure/attackby(obj/item/W, mob/user, params) if(SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) - if (istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if (W.use_tool(src, user, 20)) open =! open to_chat(user, "You [open ? "open" : "close"] the service panel.") return - if (istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) to_chat(user, "[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be pulsed.") - if ((istype(W, /obj/item/multitool)) && (!l_hacking)) + if((W.tool_behaviour == TOOL_MULTITOOL) && (!l_hacking)) if(open == 1) to_chat(user, "Now attempting to reset internal memory, please hold.") l_hacking = 1 diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 73246276c2..7a067257cb 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -103,6 +103,39 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/mechanical/old/heirloom/PopulateContents() return +/obj/item/storage/toolbox/mechanical/old/clean // the assistant traitor toolbox, damage scales with TC inside + name = "toolbox" + desc = "An old, blue toolbox. It menaces with a sickening miasma of robust energies. You sure about this, Brain?" + icon_state = "toolbox_blue_clean" + force = 19 + throwforce = 22 + wound_bonus = 0 + bare_wound_bonus = 10 + +/obj/item/storage/toolbox/mechanical/old/clean/proc/calc_damage() + var/power = 0 + for (var/obj/item/stack/telecrystal/TC in GetAllContents()) + power += TC.amount + force = 19 + power + throwforce = 22 + power + +/obj/item/storage/toolbox/mechanical/old/clean/attack(mob/target, mob/living/user) + calc_damage() // one damage for one telecrystal equals about thirty seven(?) damage if you pour ALL your tc + ..() + +/obj/item/storage/toolbox/mechanical/old/clean/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + calc_damage() + ..() + +/obj/item/storage/toolbox/mechanical/old/clean/PopulateContents() + new /obj/item/screwdriver(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/wirecutters(src) + new /obj/item/multitool(src) + new /obj/item/clothing/gloves/color/yellow(src) + /obj/item/storage/toolbox/electrical name = "electrical toolbox" icon_state = "yellow" diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 442228ef31..ae2f432d2e 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -520,3 +520,14 @@ new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) new /obj/item/lighter(src) +/obj/item/storage/box/syndie_kit/scarp + +/obj/item/storage/box/syndie_kit/scarp/PopulateContents() + new /obj/item/book/granter/martial/carp(src) + new /obj/item/clothing/suit/hooded/carp_costume(src) + new /obj/item/staff/bostaff(src) + +/obj/item/storage/box/syndie_kit/sleepytime/cardpack/PopulateContents() + . = ..() + new /obj/item/cardpack/syndicate(src) + new /obj/item/cardpack/syndicate(src) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 5e76d506ba..cc01e6aaee 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -47,6 +47,9 @@ cell = new preload_cell_type(src) update_icon() +/obj/item/melee/baton/DoRevenantThrowEffects(atom/target) + switch_status() + /obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() //Only mob/living types have stun handling @@ -116,7 +119,7 @@ to_chat(user, "You install a cell in [src].") update_icon() - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(cell) cell.update_icon() cell.forceMove(get_turf(src)) @@ -166,13 +169,12 @@ if(turned_on) if(baton_stun(M, user, disarming)) user.do_attack_animation(M) - user.adjustStaminaLossBuffered(getweight(user, STAM_COST_BATON_MOB_MULT)) else if(user.a_intent != INTENT_HARM) //they'll try to bash in the last proc. M.visible_message("[user] has prodded [M] with [src]. Luckily it was off.", \ "[user] has prodded you with [src]. Luckily it was off") return disarming || (user.a_intent != INTENT_HARM) -/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user, disarming = FALSE) +/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/living/user, disarming = FALSE) var/list/return_list = list() if(L.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, return_list) & BLOCK_SUCCESS) //No message; check_shields() handles that playsound(L, 'sound/weapons/genhit.ogg', 50, 1) @@ -194,6 +196,9 @@ return FALSE stunpwr *= round(stuncharge/hitcost, 0.1) + if(user && !user.UseStaminaBuffer(getweight(user, STAM_COST_BATON_MOB_MULT), warn = TRUE)) + return FALSE + if(!disarming) if(knockdown) L.DefaultCombatKnockdown(50, override_stamdmg = 0) //knockdown @@ -234,9 +239,15 @@ if(!iscyborg(loc)) deductcharge(severity*10, TRUE, FALSE) +/obj/item/melee/baton/can_give() + if(turned_on) + return FALSE + else + ..() + /obj/item/melee/baton/stunsword name = "stunsword" - desc = "not actually sharp, this sword is functionally identical to a stunbaton" + desc = "Not actually sharp, this sword is functionally identical to its baton counterpart." icon_state = "stunsword" item_state = "sword" @@ -248,6 +259,18 @@ /obj/item/melee/baton/stunsword/get_worn_belt_overlay(icon_file) return mutable_appearance(icon_file, "-stunsword") +/obj/item/melee/baton/stunsword/on_exit_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/secbelt/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/unsheath.ogg', 25, 1) + ..() + +/obj/item/melee/baton/stunsword/on_enter_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/secbelt/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/sheath.ogg', 25, 1) + ..() + /obj/item/ssword_kit name = "stunsword kit" desc = "a modkit for making a stunbaton into a stunsword" @@ -255,21 +278,22 @@ icon_state = "refill_donksoft" var/product = /obj/item/melee/baton/stunsword //what it makes var/list/fromitem = list(/obj/item/melee/baton, /obj/item/melee/baton/loaded) //what it needs - afterattack(obj/O, mob/user as mob) - if(istype(O, product)) - to_chat(user,"[O] is already modified!") - else if(O.type in fromitem) //makes sure O is the right thing - var/obj/item/melee/baton/B = O - if(!B.cell) //checks for a powercell in the baton. If there isn't one, continue. If there is, warn the user to take it out - new product(usr.loc) //spawns the product - user.visible_message("[user] modifies [O]!","You modify the [O]!") - qdel(O) //Gets rid of the baton - qdel(src) //gets rid of the kit - else - to_chat(user,"Remove the powercell first!") //We make this check because the stunsword starts without a battery. +/obj/item/ssword_kit/afterattack(obj/O, mob/user as mob) + if(istype(O, product)) + to_chat(user,"[O] is already modified!") + return + if(O.type in fromitem) //makes sure O is the right thing + var/obj/item/melee/baton/B = O + if(!B.cell) //checks for a powercell in the baton. If there isn't one, continue. If there is, warn the user to take it out + new product(usr.loc) //spawns the product + user.visible_message("[user] modifies [O]!","You modify the [O]!") + qdel(O) //Gets rid of the baton + qdel(src) //gets rid of the kit else - to_chat(user, " You can't modify [O] with this kit!") + to_chat(user,"Remove the powercell first!") //We make this check because the stunsword starts without a battery. + else + to_chat(user, " You can't modify [O] with this kit!") //Makeshift stun baton. Replacement for stun gloves. /obj/item/melee/baton/cattleprod @@ -300,12 +324,12 @@ /obj/item/melee/baton/boomerang name = "\improper OZtek Boomerang" desc = "A device invented in 2486 for the great Space Emu War by the confederacy of Australicus, these high-tech boomerangs also work exceptionally well at stunning crewmembers. Just be careful to catch it when thrown!" - throw_speed = 1 + throw_speed = 1.5 icon_state = "boomerang" item_state = "boomerang" force = 5 throwforce = 5 - throw_range = 5 + throw_range = 10 hitcost = 2000 throw_hit_chance = 99 //Have you prayed today? custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000) @@ -314,7 +338,7 @@ if(turned_on) if(ishuman(thrower)) var/mob/living/carbon/human/H = thrower - H.throw_mode_off() //so they can catch it on the return. + H.throw_mode_on() //so they can catch it on the return. return ..() /obj/item/melee/baton/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 7cf25098e1..29961d12b4 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -55,6 +55,8 @@ RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react) if(full_speed) user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) + else + user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack) /obj/item/tank/jetpack/proc/turn_off(mob/user) on = FALSE @@ -63,6 +65,7 @@ ion_trail.stop() UnregisterSignal(user, COMSIG_MOVABLE_MOVED) user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) + user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack) /obj/item/tank/jetpack/proc/move_react(mob/user) allow_thrust(0.01, user) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index d16d1b29f1..325e49dd7a 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -198,4 +198,4 @@ /obj/item/tank/internals/methyl_bromide/populate_gas() air_contents.set_moles(/datum/gas/methyl_bromide, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return \ No newline at end of file + return diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 08b91332ef..d57f0cc51f 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -73,6 +73,15 @@ /obj/item/tank/proc/populate_gas() return +/obj/item/tank/DoRevenantThrowEffects(atom/target) + if(air_contents) + var/turf/open/location = get_turf(src) + if(istype(location)) + location.assume_air(air_contents) + air_contents.clear() + SSair.add_to_active(location) + visible_message("[user] is putting [user.p_their()] head in [src], it looks like [user.p_theyre()] trying to commit suicide!") @@ -104,4 +109,4 @@ icon = 'icons/obj/advancedtools.dmi' usesound = 'sound/weapons/sonic_jackhammer.ogg' icon_state = "crowbar" - toolspeed = 0.2 \ No newline at end of file + toolspeed = 0.2 diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 86c223606d..920afb8d14 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -8,6 +8,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 5 w_class = WEIGHT_CLASS_TINY throwforce = 5 @@ -89,6 +90,9 @@ toolspeed = 0.5 random_color = FALSE +/obj/item/screwdriver/brass/family + toolspeed = 1 + /obj/item/screwdriver/bronze name = "bronze screwdriver" desc = "A screwdriver plated with bronze." @@ -158,4 +162,4 @@ item_state = "screwdriver_nuke" usesound = 'sound/items/pshoom.ogg' toolspeed = 0.2 - random_color = FALSE \ No newline at end of file + random_color = FALSE diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 4cada03307..98889485b6 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -9,6 +9,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 3 throwforce = 5 hitsound = "swing_hit" @@ -21,12 +22,16 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) resistance_flags = FIRE_PROOF + var/self_fueling = FALSE //Do we refill ourselves or not + var/nextrefueltick = 0 //When is the next tick we refuel? + var/refueling_interval = 10 //Every how many processing ticks does this refuel? (1 = every processing tick) + custom_materials = list(/datum/material/iron=70, /datum/material/glass=30) var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) var/max_fuel = 20 //The max amount of fuel the welder can hold var/change_icons = 1 - var/can_off_process = 0 + var/can_off_process = FALSE var/light_intensity = 2 //how powerful the emitted light is when used. var/progress_flash_divisor = 10 var/burned_fuel_for = 0 //when fuel was last removed @@ -52,6 +57,9 @@ else item_state = "[initial(item_state)]" +/obj/item/weldingtool/DoRevenantThrowEffects(atom/target) + attack_self() + /obj/item/weldingtool/update_overlays() . = ..() if(change_icons) @@ -62,6 +70,14 @@ . += "[initial(icon_state)]-on" /obj/item/weldingtool/process() + //This handles refueling. Its looking at how much fuel the tool has and comparing that to how much it holds + //This then looks if the refuel tick has come based on world time. + //Then looks if we refuel ourselves or not. + + if(self_fueling && get_fuel() < max_fuel && nextrefueltick <= world.time) + nextrefueltick = world.time + refueling_interval + reagents.add_reagent(/datum/reagent/fuel, 1) + switch(welding) if(0) force = 3 @@ -82,14 +98,12 @@ //This is to start fires. process() is only called if the welder is on. open_flame() - /obj/item/weldingtool/suicide_act(mob/user) user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") return (FIRELOSS) - /obj/item/weldingtool/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) flamethrower_screwdriver(I, user) else if(istype(I, /obj/item/stack/rods)) flamethrower_rods(I, user) @@ -109,18 +123,25 @@ var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) - if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM) - //only heal to 25 if limb is damaged to or past 25 brute, otherwise heal normally - var/difference = affecting.brute_dam - 25 + if(affecting && affecting.is_robotic_limb() && user.a_intent != INTENT_HARM) + //only heal to threshhold_passed_mindamage if limb is damaged to or past threshhold, otherwise heal normally + var/damage var/heal_amount = 15 - if(difference >= 0) - heal_amount = difference + if(src.use_tool(H, user, 0, volume=50, amount=1)) if(user == H) user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") if(!do_mob(user, H, 50)) return + damage = affecting.brute_dam + affecting.update_threshhold_state(burn = FALSE) + if(affecting.threshhold_brute_passed) + heal_amount = min(heal_amount, damage - affecting.threshhold_passed_mindamage) + + if(!heal_amount) + to_chat(user, "[user == H ? "Your" : "[H]'s"] [affecting.name] appears to have suffered severe internal damage and requires surgery to repair further.") + return item_heal_robotic(H, user, heal_amount, 0) else return ..() @@ -190,12 +211,14 @@ //Switches the welder on /obj/item/weldingtool/proc/switched_on(mob/user) if(!status) - to_chat(user, "[src] can't be turned on while unsecured!") + if(user) + to_chat(user, "[src] can't be turned on while unsecured!") return welding = !welding if(welding) if(get_fuel() >= 1) - to_chat(user, "You switch [src] on.") + if(user) + to_chat(user, "You switch [src] on.") playsound(loc, acti_sound, 50, 1) force = 15 damtype = "fire" @@ -311,7 +334,6 @@ /obj/item/weldingtool/largetank/flamethrower_screwdriver() return - /obj/item/weldingtool/mini name = "emergency welding tool" desc = "A miniature welder used during emergencies." @@ -324,20 +346,6 @@ /obj/item/weldingtool/mini/flamethrower_screwdriver() return -/obj/item/weldingtool/abductor - name = "alien welding tool" - desc = "An alien welding tool. Whatever fuel it uses, it never runs out." - icon = 'icons/obj/abductor.dmi' - icon_state = "welder" - toolspeed = 0.1 - light_intensity = 0 - change_icons = 0 - -/obj/item/weldingtool/abductor/process() - if(get_fuel() <= max_fuel) - reagents.add_reagent(/datum/reagent/fuel, 1) - ..() - /obj/item/weldingtool/hugetank name = "upgraded industrial welding tool" desc = "An upgraded welder based of the industrial welder." @@ -346,27 +354,6 @@ max_fuel = 80 custom_materials = list(/datum/material/iron=70, /datum/material/glass=120) -/obj/item/weldingtool/experimental - name = "experimental welding tool" - desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes." - icon_state = "exwelder" - item_state = "exwelder" - max_fuel = 40 - custom_materials = list(/datum/material/iron=70, /datum/material/glass=120) - var/last_gen = 0 - change_icons = 0 - can_off_process = 1 - light_intensity = 1 - toolspeed = 0.5 - var/nextrefueltick = 0 - -/obj/item/weldingtool/experimental/brass - name = "brass welding tool" - desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch." - resistance_flags = FIRE_PROOF | ACID_PROOF - icon_state = "clockwelder" - item_state = "brasswelder" - /obj/item/weldingtool/bronze name = "bronze plated welding tool" desc = "A bronze plated welder." @@ -375,24 +362,51 @@ icon_state = "brasswelder" item_state = "brasswelder" -/obj/item/weldingtool/experimental/process() - ..() - if(get_fuel() < max_fuel && nextrefueltick < world.time) - nextrefueltick = world.time + 10 - reagents.add_reagent(/datum/reagent/fuel, 1) +//Self filling welders below + +/obj/item/weldingtool/experimental + name = "experimental welding tool" + desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes." + icon_state = "exwelder" + item_state = "exwelder" + max_fuel = 40 + custom_materials = list(/datum/material/iron=70, /datum/material/glass=120) + change_icons = 0 + self_fueling = TRUE + can_off_process = TRUE + light_intensity = 1 + toolspeed = 0.5 + +/obj/item/weldingtool/experimental/brass + name = "brass welding tool" + desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch." + resistance_flags = FIRE_PROOF | ACID_PROOF + refueling_interval = 5 + icon_state = "clockwelder" + item_state = "brasswelder" + +/obj/item/weldingtool/abductor + name = "alien welding tool" + desc = "An alien welding tool. Whatever fuel it uses, it never runs out." + icon = 'icons/obj/abductor.dmi' + icon_state = "welder" + self_fueling = TRUE + can_off_process = TRUE + refueling_interval = 1 + toolspeed = 0.1 + light_intensity = 0 + change_icons = 0 /obj/item/weldingtool/advanced name = "advanced welding tool" - desc = "A modern welding tool combined with an alien welding tool, it never runs out of fuel and works almost as fast." + desc = "A modern welding tool combined with an alien welding tool, it almost never runs out of fuel and works nearly as fast." icon = 'icons/obj/advancedtools.dmi' icon_state = "welder" + self_fueling = TRUE + can_off_process = TRUE + refueling_interval = 2 toolspeed = 0.2 light_intensity = 0 change_icons = 0 -/obj/item/weldingtool/advanced/process() - if(get_fuel() <= max_fuel) - reagents.add_reagent(/datum/reagent/fuel, 1) - ..() - #undef WELDER_FUEL_BURN_INTERVAL diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 53a578a45d..ee72c7fed2 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -8,6 +8,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 6 throw_speed = 3 throw_range = 7 @@ -69,6 +70,9 @@ random_color = FALSE toolspeed = 0.5 +/obj/item/wirecutters/brass/family + toolspeed = 1 + /obj/item/wirecutters/bronze name = "bronze plated wirecutters" desc = "A pair of wirecutters plated with bronze." @@ -145,4 +149,4 @@ icon = 'icons/obj/advancedtools.dmi' icon_state = "cutters" toolspeed = 0.2 - random_color = FALSE \ No newline at end of file + random_color = FALSE diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index e1c09f394e..6199e7fc76 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -7,6 +7,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 5 throwforce = 7 w_class = WEIGHT_CLASS_SMALL @@ -40,6 +41,9 @@ icon_state = "wrench_clock" toolspeed = 0.5 +/obj/item/wrench/brass/family + toolspeed = 1 + /obj/item/wrench/bronze name = "bronze plated wrench" desc = "A bronze plated wrench." @@ -125,4 +129,4 @@ icon = 'icons/obj/advancedtools.dmi' icon_state = "wrench" usesound = 'sound/effects/empulse.ogg' - toolspeed = 0.2 \ No newline at end of file + toolspeed = 0.2 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 4e82df2452..454016d9e7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -277,7 +277,7 @@ newSaber.hacked = TRUE qdel(W) qdel(src) - else if(istype(W, /obj/item/multitool)) + else if(W.tool_behaviour == TOOL_MULTITOOL) if(!hacked) hacked = TRUE to_chat(user, "RNBW_ENGAGE") @@ -531,6 +531,7 @@ pop_burst() /obj/item/toy/snappop/Crossed(H as mob|obj) + . = ..() if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 3f2dc2506a..554ea81974 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -296,13 +296,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY - force = 7 //how much harm mode damage we do - var/stamina_damage_increment = 4 //how much extra damage do we do when in non-harm mode + force = 10 //how much harm mode damage we do + var/stamina_damage_increment = 5 //how much extra damage do we do when in non-harm mode throwforce = 10 damtype = STAMINA attack_verb = list("whacked", "smacked", "struck") total_mass = TOTAL_MASS_MEDIEVAL_WEAPON - hitsound = 'sound/weapons/grenadelaunch.ogg' // no good wood thunk sounds + hitsound = 'sound/weapons/woodbonk.ogg' var/harm = FALSE // TRUE = brute, FALSE = stam var/reinforced = FALSE var/burnt = FALSE @@ -310,11 +310,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/quick_parry = FALSE // false = default parry, true = really small parry window item_flags = ITEM_CAN_PARRY block_parry_data = /datum/block_parry_data/bokken + var/default_parry_data = /datum/block_parry_data/bokken + var/quick_parry_data = /datum/block_parry_data/bokken/quick_parry bare_wound_bonus = 0 wound_bonus = 0 /datum/block_parry_data/bokken // fucked up parry data, emphasizing quicker, shorter parries - parry_stamina_cost = 8 // be wise about when you parry, though, else you won't be able to fight enough to make it count + parry_stamina_cost = 10 // be wise about when you parry, though, else you won't be able to fight enough to make it count parry_time_windup = 0 parry_time_active = 10 // small parry window parry_time_spindown = 0 @@ -330,11 +332,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 ) parry_failed_stagger_duration = 3 SECONDS parry_data = list( - PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25 + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 ) /datum/block_parry_data/bokken/quick_parry // emphasizing REALLY SHORT PARRIES - parry_stamina_cost = 6 // still more costly than most parries, but less than a full bokken parry + parry_stamina_cost = 8 // still more costly than most parries, but less than a full bokken parry parry_time_active = 5 // REALLY small parry window parry_time_perfect = 2.5 // however... parry_time_perfect_leeway = 2 // the entire time, the parry is perfect @@ -371,9 +373,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 . = ..() quick_parry = !quick_parry if(quick_parry) - block_parry_data = /datum/block_parry_data/bokken/quick_parry + block_parry_data = quick_parry_data else - block_parry_data = /datum/block_parry_data/bokken + block_parry_data = default_parry_data to_chat(user, "[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].") /obj/item/melee/bokken/attackby(obj/item/I, mob/living/user, params) @@ -410,23 +412,76 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(burnt) . += " Burned into the \"blade\" is [burned_in]." +/obj/item/melee/bokken/steelwood + name = "steelwood bokken" + desc = "A misnomer of sorts, this is effectively a blunt katana made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh." + icon_state = "bokken_steel" + item_state = "bokken_steel" + force = 12 + stamina_damage_increment = 3 + +/obj/item/melee/bokken/waki + name = "wakizashi bokken" + desc = "A space-Japanese training sword made of wood and shaped like a wakizashi." + icon_state = "wakibokken" + item_state = "wakibokken" + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_NORMAL + force = 6 + stamina_damage_increment = 4 + block_parry_data = /datum/block_parry_data/bokken/waki + default_parry_data = /datum/block_parry_data/bokken/waki + quick_parry_data = /datum/block_parry_data/bokken/waki/quick_parry + +/datum/block_parry_data/bokken/waki // weaker parries than the bigger variant, but cheaper and faster recovery, like quick parry + parry_stamina_cost = 4 + parry_time_windup = 0 + parry_time_active = 6 + parry_time_spindown = 0 + parry_time_perfect = 1.5 + parry_time_perfect_leeway = 1 + parry_imperfect_falloff_percent = 7.5 + parry_efficiency_to_counterattack = 120 + parry_efficiency_considered_successful = 65 + parry_efficiency_perfect = 120 + parry_efficiency_perfect_override = list( + TEXT_ATTACK_TYPE_PROJECTILE = 30, + ) + parry_failed_stagger_duration = 2 SECONDS + parry_data = list( + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 1.5, // 6*1.5 = 9, 7*1.5 = 10.5, 8*1.5 = 12, 9*1.5 = 13.5 + ) + +/datum/block_parry_data/bokken/waki/quick_parry //For the parry spammer in you + parry_stamina_cost = 2 // Slam that parry button + parry_time_active = 2.5 + parry_time_perfect = 1 + parry_time_perfect_leeway = 1 + parry_failed_stagger_duration = 1 SECONDS + parry_failed_clickcd_duration = 1 SECONDS + +/datum/block_parry_data/bokken/waki/quick_parry/proj + parry_efficiency_perfect_override = list() + +/obj/item/melee/bokken/waki/steelwood + name = "wakizashi steelwood bokken" + desc = "A misnomer of sorts, this is effectively a blunt wakizashi made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh." + icon_state = "wakibokken_steel" + item_state = "wakibokken_steel" + force = 8 + stamina_damage_increment = 2 + /obj/item/melee/bokken/debug name = "funny debug parrying stick" desc = "if you see this you've fucked up somewhere my good man" block_parry_data = /datum/block_parry_data/bokken/debug - -/obj/item/melee/bokken/debug/AltClick(mob/user) - quick_parry = !quick_parry - if(quick_parry) - block_parry_data = /datum/block_parry_data/bokken/quick_parry/debug - else - block_parry_data = /datum/block_parry_data/bokken/debug - to_chat(user, "[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].") + default_parry_data = /datum/block_parry_data/bokken/debug + quick_parry_data = /datum/block_parry_data/bokken/quick_parry/debug /datum/block_parry_data/bokken/debug parry_efficiency_perfect_override = list() parry_data = list( - PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25 + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 PARRY_DISARM_ATTACKER = TRUE, PARRY_KNOCKDOWN_ATTACKER = 10, PARRY_STAGGER_ATTACKER = 10, @@ -436,13 +491,63 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /datum/block_parry_data/bokken/quick_parry/debug parry_efficiency_perfect_override = list() parry_data = list( - PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25 + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 PARRY_DISARM_ATTACKER = TRUE, PARRY_KNOCKDOWN_ATTACKER = 10, PARRY_STAGGER_ATTACKER = 10, PARRY_DAZE_ATTACKER = 10, ) +/// BOKKEN CRAFTNG PIECES + +/obj/item/bokken_blade + name = "training bokken wooden blade" + desc = "The blade piece of a bokken katana." + icon = 'icons/obj/smith.dmi' + icon_state = "bokken" + item_state = "bone_dagger" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/bokken_steelblade + name = "training bokken steelwood blade" + desc = "The blade piece of a steelwood bokken katana." + icon = 'icons/obj/smith.dmi' + icon_state = "bokken_steel" + item_state = "switchblade_ext" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/wakibokken_blade + name = "training bokken wooden wakizashi blade" + desc = "The blade piece of a bokken wakizashi." + icon = 'icons/obj/smith.dmi' + icon_state = "wakibokken" + item_state = "bone_dagger" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/wakibokken_steelblade + name = "training bokken steelwood wakizashi blade" + desc = "The blade piece of a steelwood bokken katana." + icon = 'icons/obj/smith.dmi' + icon_state = "wakibokken_steel" + item_state = "switchblade_ext" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/bokken_hilt + name = "training bokken hilt" + desc = "The hilt piece of a bokken. This hilt is appropriate for any potential blade length or material." + icon = 'icons/obj/smith.dmi' + icon_state = "bokken_hilt" + item_state = "bone_dagger" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' /obj/item/wirerod name = "wired rod" diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 3de28b38e8..73a21e4a25 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -109,7 +109,7 @@ return user.do_attack_animation(src) . = take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration) - user.DelayNextAction() + user.DelayNextAction(CLICK_CD_MELEE) /obj/attack_alien(mob/living/carbon/alien/humanoid/user) if(attack_generic(user, 60, BRUTE, "melee", 0)) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 3abee4db33..8a14d99776 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -304,18 +304,36 @@ /obj/proc/reskin_obj(mob/M) if(!LAZYLEN(unique_reskin)) return - var/list/skins = list() - for(var/S in unique_reskin) - skins[S] = image(icon = icon, icon_state = unique_reskin[S]) - var/choice = show_radial_menu(M, src, skins, custom_check = CALLBACK(src, .proc/check_skinnable, M), radius = 40, require_near = TRUE) - if(!choice) - return FALSE - icon_state = unique_reskin[choice] - current_skin = choice - return -/obj/proc/check_skinnable(/mob/M) - if(current_skin || !always_reskinnable) + var/list/items = list() + for(var/reskin_option in unique_reskin) + var/image/item_image = image(icon = src.icon, icon_state = unique_reskin[reskin_option]) + items += list("[reskin_option]" = item_image) + sortList(items) + + var/pick = show_radial_menu(M, src, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, M), radius = 38, require_near = TRUE) + if(!pick) + return + if(!unique_reskin[pick]) + return + current_skin = pick + icon_state = unique_reskin[pick] + to_chat(M, "[src] is now skinned as '[pick].'") + +/** + * Checks if we are allowed to interact with a radial menu for reskins + * + * Arguments: + * * user The mob interacting with the menu + */ +/obj/proc/check_reskin_menu(mob/user) + if(QDELETED(src)) + return FALSE + if(current_skin) + return FALSE + if(!istype(user)) + return FALSE + if(user.incapacitated()) return FALSE return TRUE diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 1090bae9f8..3549ab85f8 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -61,7 +61,7 @@ return TRUE /obj/structure/AIcore/latejoin_inactive/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/multitool)) + if(P.tool_behaviour == TOOL_MULTITOOL) active = !active to_chat(user, "You [active? "activate" : "deactivate"] [src]'s transmitters.") return @@ -76,10 +76,10 @@ return ..() /obj/structure/AIcore/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) return default_unfasten_wrench(user, P, 20) if(!anchored) - if(istype(P, /obj/item/weldingtool) && can_deconstruct) + if(P.tool_behaviour == TOOL_WELDER && can_deconstruct) if(state != EMPTY_CORE) to_chat(user, "The core must be empty to deconstruct it!") return @@ -105,13 +105,13 @@ circuit = P return if(CIRCUIT_CORE) - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) P.play_tool_sound(src) to_chat(user, "You screw the circuit board into place.") state = SCREWED_CORE update_icon() return - if(istype(P, /obj/item/crowbar)) + if(P.tool_behaviour == TOOL_CROWBAR) P.play_tool_sound(src) to_chat(user, "You remove the circuit board.") state = EMPTY_CORE @@ -120,7 +120,7 @@ circuit = null return if(SCREWED_CORE) - if(istype(P, /obj/item/screwdriver) && circuit) + if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) P.play_tool_sound(src) to_chat(user, "You unfasten the circuit board.") state = CIRCUIT_CORE @@ -139,7 +139,7 @@ to_chat(user, "You need five lengths of cable to wire the AI core!") return if(CABLED_CORE) - if(istype(P, /obj/item/wirecutters)) + if(P.tool_behaviour == TOOL_WIRECUTTER) if(brain) to_chat(user, "Get that [brain.name] out of there first!") else @@ -201,7 +201,7 @@ update_icon() return - if(istype(P, /obj/item/crowbar) && brain) + if(P.tool_behaviour == TOOL_CROWBAR && brain) P.play_tool_sound(src) to_chat(user, "You remove the brain.") brain.forceMove(loc) @@ -210,7 +210,7 @@ return if(GLASS_CORE) - if(istype(P, /obj/item/crowbar)) + if(P.tool_behaviour == TOOL_CROWBAR) P.play_tool_sound(src) to_chat(user, "You remove the glass panel.") state = CABLED_CORE @@ -218,7 +218,7 @@ new /obj/item/stack/sheet/rglass(loc, 2) return - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) P.play_tool_sound(src) to_chat(user, "You connect the monitor.") if(brain) @@ -247,7 +247,7 @@ P.transfer_ai("INACTIVE", "AICARD", src, user) return - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) P.play_tool_sound(src) to_chat(user, "You disconnect the monitor.") state = GLASS_CORE diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index 2a4856f60e..a96d39316e 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -62,7 +62,7 @@ pick_sign(user) /obj/structure/sign/barsign/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(!allowed(user)) to_chat(user, "Access denied.") return @@ -271,6 +271,11 @@ icon = "the_lightbulb" desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms." +/datum/barsign/goose + name = "The Loose Goose" + icon = "goose" + desc = "Drink till you puke and/or break the laws of reality!" + /datum/barsign/cybersylph name = "Cyber Sylph's" icon = "cybersylph" diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 5f01a27825..c86c62094b 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -37,9 +37,19 @@ return attack_hand(user) /obj/structure/bed/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) + if(W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1)) W.play_tool_sound(src) deconstruct(TRUE) + else if(istype(W, /obj/item/bedsheet)) + if(user.transferItemToLoc(W, drop_location())) + to_chat(user, "You make \the [src] with [W].") + W.pixel_x = 0 + W.pixel_y = 0 + else if(istype(W, /obj/item/disk/nuclear)) + if(user.transferItemToLoc(W, drop_location())) + to_chat(user, "You tuck little disky into bed. Good night disky.") + W.pixel_x = 6 //make sure they reach the pillow + W.pixel_y = -6 else return ..() diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 39bef1a9c0..76ab086eb2 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -77,7 +77,7 @@ qdel(src) /obj/structure/chair/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) + if(W.tool_behaviour == TOOL_WRENCH && !(flags_1 & NODECONSTRUCT_1)) W.play_tool_sound(src) deconstruct() else if(istype(W, /obj/item/assembly/shock_kit)) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index c36fba96cb..2172040022 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -22,6 +22,10 @@ LINEN BINS dog_fashion = /datum/dog_fashion/head/ghost var/list/dream_messages = list("white") +/obj/item/bedsheet/Initialize(mapload) + . = ..() + AddElement(/datum/element/bed_tuckable, 0, 0, 0) + /obj/item/bedsheet/attack(mob/living/M, mob/user) if(!attempt_initiate_surgery(src, M, user)) ..() @@ -41,7 +45,7 @@ LINEN BINS return /obj/item/bedsheet/attackby(obj/item/I, mob/user, params) - if(!(flags_1 & HOLOGRAM_1) && (istype(I, /obj/item/wirecutters) || I.get_sharpness())) + if(!(flags_1 & HOLOGRAM_1) && (I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())) var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) transfer_fingerprints_to(C) C.add_fingerprint(user) @@ -243,7 +247,7 @@ LINEN BINS /obj/item/bedsheet/random/Initialize() ..() - var/type = pick(typesof(/obj/item/bedsheet) - list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon)) + var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable))) new type(loc) return INITIALIZE_HINT_QDEL @@ -257,9 +261,32 @@ LINEN BINS chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/bedsheet chameleon_action.chameleon_name = "Bedsheet" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random), only_root_path = TRUE) + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random, /obj/item/bedsheet/unlockable), only_root_path = FALSE) chameleon_action.initialize_disguises() +//unlockable bedsheets +/obj/item/bedsheet/unlockable + name = "unlockable bedsheet" + desc = "this shouldn't be here!" + +//janitor: clean 100 messes with mop as janitor +/obj/item/bedsheet/unlockable/janitor + name = "janitor bedsheet" + desc = "A white bedsheet, with a warning sign on the front." + icon_state = "sheetjanitor" + +//cook: use microwave 100 times properly (contents must make one good item) as cook +/obj/item/bedsheet/unlockable/cook + name = "cook bedsheet" + desc = "A grey bedsheet, with a microwave on the front." + icon_state = "sheetcook" + +//miner: redeem 100,000 mining points +/obj/item/bedsheet/unlockable/miner + name = "miner bedsheet" + desc = "A red and black bedsheet. It seems to be made with goliath hide." + icon_state = "sheetminer" + //bedsheet bin /obj/structure/bedsheetbin name = "linen bin" diff --git a/code/game/objects/structures/chess.dm b/code/game/objects/structures/chess.dm index 8254405fee..ec882f34f8 100644 --- a/code/game/objects/structures/chess.dm +++ b/code/game/objects/structures/chess.dm @@ -73,4 +73,4 @@ /obj/structure/chess/blackking name = "\improper Black King" desc = "A black king chess piece. It can move one tile in any direction." - icon_state = "black_king" \ No newline at end of file + icon_state = "black_king" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 46eb82342a..be7a457c7d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -25,7 +25,7 @@ var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container var/mob_storage_capacity = 3 // how many human sized mob/living can fit together inside a closet. var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients. - var/cutting_tool = /obj/item/weldingtool + var/cutting_tool = TOOL_WELDER var/open_sound = 'sound/machines/click.ogg' var/close_sound = 'sound/machines/click.ogg' var/material_drop = /obj/item/stack/sheet/metal @@ -302,7 +302,9 @@ update_icon() return TRUE -/obj/structure/closet/proc/handle_lock_removal(mob/user, obj/item/screwdriver/S) +/obj/structure/closet/proc/handle_lock_removal(mob/user, obj/item/S) + if(!S.tool_behaviour == TOOL_SCREWDRIVER) + return if(lock_in_use) to_chat(user, "Wait for work on [src] to be done first!") return @@ -357,7 +359,7 @@ if(opened) if(istype(W, cutting_tool)) var/welder = FALSE - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin [welder ? "slicing" : "deconstructing"] \the [src] apart...") @@ -377,9 +379,9 @@ return TRUE else if(istype(W, /obj/item/electronics/airlock)) handle_lock_addition(user, W) - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) handle_lock_removal(user, W) - else if(istype(W, /obj/item/weldingtool) && can_weld_shut) + else if(W.tool_behaviour == TOOL_WELDER && can_weld_shut) if(!W.tool_start_check(user, amount=0)) return @@ -396,7 +398,7 @@ "You [welded ? "weld" : "unwelded"] \the [src] with \the [W].", "You hear welding.") update_icon() - else if(istype(W, /obj/item/wrench) && anchorable) + else if(W.tool_behaviour == TOOL_WRENCH && anchorable) if(isinspace() && !anchored) return setAnchored(!anchored) @@ -446,8 +448,11 @@ var/mob/living/L = O if(!issilicon(L)) L.DefaultCombatKnockdown(40) - O.forceMove(T) - close() + if(istype(src, /obj/structure/closet/supplypod/extractionpod)) + O.forceMove(src) + else + O.forceMove(T) + close() else O.forceMove(T) return 1 diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index e51aeafdc1..09441a577e 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -32,7 +32,7 @@ else name = "body bag" return - else if(istype(I, /obj/item/wirecutters)) + else if(I.tool_behaviour == TOOL_WIRECUTTER) to_chat(user, "You cut the tag off [src].") name = "body bag" tagged = 0 @@ -108,4 +108,4 @@ icon_state = "radbodybag" mob_storage_capacity = 1 foldedbag_path = /obj/item/bodybag/containment - rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE \ No newline at end of file + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 500b8d6a49..1d6826b548 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -8,7 +8,7 @@ max_integrity = 70 integrity_failure = 0 can_weld_shut = 0 - cutting_tool = /obj/item/wirecutters + cutting_tool = TOOL_WIRECUTTER open_sound = "rustle" material_drop = /obj/item/stack/sheet/cardboard delivery_icon = "deliverybox" @@ -74,7 +74,7 @@ mob_storage_capacity = 5 resistance_flags = NONE move_speed_multiplier = 2 - cutting_tool = /obj/item/weldingtool + cutting_tool = TOOL_WELDER open_sound = 'sound/machines/click.ogg' material_drop = /obj/item/stack/sheet/plasteel #undef SNAKE_SPAM_TICKS diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 0da502283b..b33962d8de 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -5,7 +5,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood - cutting_tool = /obj/item/screwdriver + cutting_tool = TOOL_SCREWDRIVER /obj/structure/closet/acloset name = "strange closet" diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 21b75e8af3..3af0d0278a 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -70,7 +70,7 @@ new /obj/item/melee/flyswatter(src) new /obj/item/flashlight(src) for(var/i in 1 to 3) - new /obj/item/caution(src) + new /obj/item/clothing/suit/caution(src) new /obj/item/holosign_creator(src) new /obj/item/lightreplacer(src) new /obj/item/soap(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 484d152a3f..36b770cd25 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -5,7 +5,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood - cutting_tool = /obj/item/screwdriver + cutting_tool = TOOL_SCREWDRIVER /obj/structure/closet/secure_closet/bar/PopulateContents() ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 05798df953..4b405ae64a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -30,6 +30,8 @@ new /obj/item/construction/rcd/loaded/upgraded(src) new /obj/item/clothing/suit/hooded/wintercoat/ce(src) new /obj/item/clothing/head/beret/ce/white(src) + new /obj/item/storage/bag/construction(src) + new /obj/item/storage/bag/material(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -78,6 +80,8 @@ new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/storage/box/emptysandbags(src) new /obj/item/cartridge/engineering(src) + new /obj/item/storage/bag/construction(src) + new /obj/item/storage/bag/material(src) /obj/structure/closet/secure_closet/atmospherics name = "\proper atmospheric technician's locker" @@ -92,13 +96,15 @@ new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/analyzer(src) new /obj/item/holosign_creator/atmos(src) - new /obj/item/holosign_creator/firelock(src) + new /obj/item/holosign_creator/firelock(src) //what if atmos techs could test things they are meant to test, wild, innit? new /obj/item/watertank/atmos(src) new /obj/item/clothing/suit/fire/atmos(src) new /obj/item/clothing/head/hardhat/atmos(src) new /obj/item/clothing/glasses/meson/engine/tray(src) new /obj/item/extinguisher/advanced(src) new /obj/item/cartridge/atmos(src) + new /obj/item/storage/bag/construction(src) + new /obj/item/storage/bag/material(src) /* * Empty lockers diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index a9e6243060..c554cad034 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -10,4 +10,4 @@ new /obj/item/radio/headset/headset_srv(src) new /obj/item/cultivator(src) new /obj/item/hatchet(src) - new /obj/item/storage/box/disks_plantgene(src) \ No newline at end of file + new /obj/item/storage/box/disks_plantgene(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index a7ffef1a0c..babb047c8d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -47,6 +47,25 @@ new /obj/item/clothing/glasses/hud/health(src) return +/obj/structure/closet/secure_closet/paramedic + name = "paramedic's locker" + req_access = list(ACCESS_MEDICAL) + icon_state = "paramed_secure" + +/obj/structure/closet/secure_closet/paramedic/PopulateContents() + ..() + new /obj/item/clothing/suit/toggle/labcoat/paramedic(src) + new /obj/item/clothing/under/rank/medical/paramedic(src) + new /obj/item/clothing/under/rank/medical/paramedic/skirt(src) + new /obj/item/radio/headset/headset_med(src) + new /obj/item/defibrillator/loaded(src) + new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/storage/belt/medical(src) + new /obj/item/clothing/glasses/hud/health(src) + new /obj/item/pinpointer/crew(src) + new /obj/item/sensor_device(src) + return + /obj/structure/closet/secure_closet/CMO name = "\proper chief medical officer's locker" req_access = list(ACCESS_CMO) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index d127a87b20..52abb00cc7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -26,7 +26,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood - cutting_tool = /obj/item/screwdriver + cutting_tool = TOOL_SCREWDRIVER /obj/structure/closet/secure_closet/personal/cabinet/PopulateContents() new /obj/item/storage/backpack/satchel/leather/withwallet( src ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 2c31303f79..1d23903d03 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -155,7 +155,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood - cutting_tool = /obj/item/screwdriver + cutting_tool = TOOL_SCREWDRIVER /obj/structure/closet/secure_closet/detective/PopulateContents() ..() diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 3cee96e435..c376e63880 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -16,7 +16,7 @@ to_chat(user, "You need a crowbar to pry this open!") /obj/structure/closet/crate/large/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) if(manifest) tear_manifest(user) diff --git a/code/game/objects/structures/crates_lockers/crates/wooden.dm b/code/game/objects/structures/crates_lockers/crates/wooden.dm index 09d176783a..6c8d3066ee 100644 --- a/code/game/objects/structures/crates_lockers/crates/wooden.dm +++ b/code/game/objects/structures/crates_lockers/crates/wooden.dm @@ -15,4 +15,4 @@ new /obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter(src) new /obj/item/pneumatic_cannon/pie(src) new /obj/item/reagent_containers/food/snacks/pie/cream(src) - new /obj/item/storage/crayons(src) \ No newline at end of file + new /obj/item/storage/crayons(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 19c0f0aed1..e3b9ae1df1 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -108,7 +108,7 @@ toggle_lock(user) else to_chat(user, "Access denied.") - else if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP && !broken) + else if(W.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP && !broken) if(obj_integrity < max_integrity) if(!W.tool_start_check(user, amount=5)) return @@ -121,7 +121,7 @@ else to_chat(user, "[src] is already in good condition!") return - else if(!alert && istype(W, /obj/item/crowbar) && openable) //Only applies to the lab cage and player made display cases + else if(!alert && W.tool_behaviour == TOOL_CROWBAR && openable) //Only applies to the lab cage and player made display cases if(broken) if(showpiece) to_chat(user, "Remove the displayed object first.") @@ -187,7 +187,7 @@ /obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) //The player can only deconstruct the wooden frame + if(I.tool_behaviour == TOOL_WRENCH) //The player can only deconstruct the wooden frame to_chat(user, "You start disassembling [src]...") I.play_tool_sound(src) if(I.use_tool(src, user, 30)) @@ -553,4 +553,4 @@ /obj/structure/displaycase/forsale/kitchen desc = "A display case with an ID-card swiper. Use your ID to purchase the contents. Meant for the bartender and chef." req_one_access = list(ACCESS_KITCHEN, ACCESS_BAR) -*/ \ No newline at end of file +*/ diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index ac6ea27821..aba3b743bb 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -58,7 +58,7 @@ return created_name = t - else if(istype(W, /obj/item/weldingtool) && (mineral || glass || !anchored )) + else if(W.tool_behaviour == TOOL_WELDER && (mineral || glass || !anchored )) if(!W.tool_start_check(user, amount=0)) return @@ -88,8 +88,8 @@ to_chat(user, "You disassemble the airlock assembly.") deconstruct(TRUE) - else if(istype(W, /obj/item/wrench)) - if(!anchored ) + else if(W.tool_behaviour == TOOL_WRENCH) + if(!anchored) var/door_check = 1 for(var/obj/machinery/door/D in loc) if(!D.sub_door) @@ -134,7 +134,7 @@ to_chat(user, "You wire the airlock assembly.") name = "wired airlock assembly" - else if(istype(W, /obj/item/wirecutters) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) + else if(W.tool_behaviour == TOOL_WIRECUTTER && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) user.visible_message("[user] cuts the wires from the airlock assembly.", \ "You start to cut the wires from the airlock assembly...") @@ -162,7 +162,7 @@ electronics = W - else if(istype(W, /obj/item/crowbar) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) + else if(W.tool_behaviour == TOOL_CROWBAR && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) user.visible_message("[user] removes the electronics from the airlock assembly.", \ "You start to remove electronics from the airlock assembly...") @@ -226,7 +226,7 @@ else to_chat(user, "You cannot add [G] to [src]!") - else if(istype(W, /obj/item/screwdriver) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) + else if(W.tool_behaviour == TOOL_SCREWDRIVER && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) user.visible_message("[user] finishes the airlock.", \ "You start finishing the airlock...") diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 7fdec9b3d9..9790a0e661 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -7,7 +7,7 @@ anchored = TRUE /obj/structure/dresser/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 6f1d56c4a5..c5802b5086 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -11,7 +11,7 @@ add_overlay(mutable_appearance('icons/obj/chairs.dmi', "echair_over", MOB_LAYER + 1)) /obj/structure/chair/e_chair/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) var/obj/structure/chair/C = new /obj/structure/chair(loc) W.play_tool_sound(src) C.setDir(dir) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 84926ccfb0..467dd47c50 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -42,7 +42,7 @@ update_icon() /obj/structure/extinguisher_cabinet/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench) && !stored_extinguisher) + if(I.tool_behaviour == TOOL_WRENCH && !stored_extinguisher) to_chat(user, "You start unsecuring [name]...") I.play_tool_sound(src) if(I.use_tool(src, user, 60)) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index b654f4f5c0..5b3cd3139c 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -93,7 +93,7 @@ to_chat(user, "You must wait until the door has stopped moving!") return - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(density) var/turf/T = get_turf(src) if(T.density) @@ -107,7 +107,7 @@ else to_chat(user, "You can't reach, close it first!") - else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + else if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(W.use_tool(src, user, 0, volume=50)) dismantle(user, TRUE) else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) @@ -158,7 +158,7 @@ /obj/structure/falsewall/reinforced/attackby(obj/item/tool, mob/user) ..() - if(istype(tool, /obj/item/wirecutters)) + if(tool.tool_behaviour == TOOL_WIRECUTTER) dismantle(user, TRUE, tool) /* diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index f90161f587..eaf5398605 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -57,7 +57,7 @@ hole_size = LARGE_HOLE /obj/structure/fence/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) if(!cuttable) to_chat(user, "This section of the fence can't be cut.") return diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 412730910f..a247908b3b 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -24,9 +24,9 @@ return ..() /obj/structure/fireaxecabinet/attackby(obj/item/I, mob/user, params) - if(iscyborg(user) || istype(I, /obj/item/multitool)) + if(iscyborg(user) || I.tool_behaviour == TOOL_MULTITOOL) toggle_lock(user) - else if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP && !broken) + else if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP && !broken) if(obj_integrity < max_integrity) if(!I.tool_start_check(user, amount=2)) return diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index bd7ddb36d5..477bc19a22 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -11,7 +11,7 @@ var/deconstructible = TRUE /obj/structure/fluff/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/wrench) && deconstructible) + if(I.tool_behaviour == TOOL_WRENCH && deconstructible) user.visible_message("[user] starts disassembling [src]...", "You start disassembling [src]...") I.play_tool_sound(src) if(I.use_tool(src, user, 50)) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 87cfbb56e0..50240aabb3 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -361,7 +361,7 @@ new /obj/item/stack/sheet/runed_metal(drop_location(), 1) qdel(src) - else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + else if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount=0)) return @@ -436,7 +436,7 @@ /obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) - if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount = 0)) return to_chat(user, "You start slicing apart [src]...") diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 7853b9619c..2ac85f79dc 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -142,11 +142,11 @@ /obj/structure/grille/attackby(obj/item/W, mob/user, params) user.DelayNextAction(CLICK_CD_MELEE) add_fingerprint(user) - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) if(!shock(user, 100)) W.play_tool_sound(src, 100) deconstruct() - else if((istype(W, /obj/item/screwdriver)) && (isturf(loc) || anchored)) + else if((W.tool_behaviour == TOOL_SCREWDRIVER) && (isturf(loc) || anchored)) if(!shock(user, 90)) W.play_tool_sound(src, 100) setAnchored(!anchored) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 1e278a9f88..d996f86df7 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -98,6 +98,10 @@ /obj/structure/holosign/barrier/firelock/BlockSuperconductivity() return TRUE +/obj/structure/holosign/barrier/firelock/Initialize() + . = ..() + air_update_turf(TRUE) + /obj/structure/holosign/barrier/combifan name = "holo combifan" desc = "A holographic barrier resembling a blue-accented tiny fan. Though it does not prevent solid objects from passing through, gas and temperature changes are kept out." diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 10a9f2afd4..bcb9422708 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -73,7 +73,7 @@ l.janicart_insert(user,src) else to_chat(user, fail_msg) - else if(istype(I, /obj/item/caution)) + else if(istype(I, /obj/item/clothing/suit/caution)) if(signs < max_signs) put_in_cart(I, user) signs++ @@ -82,7 +82,7 @@ to_chat(user, "[src] can't hold any more signs!") else if(mybag) mybag.attackby(I, user) - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) user.visible_message("[user] begins to empty the contents of [src].", "You begin to empty the contents of [src]...") if(I.use_tool(src, user, 30)) to_chat(usr, "You empty the contents of [src]'s bucket onto the floor.") @@ -104,7 +104,7 @@ items += list("Spray bottle" = image(icon = myspray.icon, icon_state = myspray.icon_state)) if(myreplacer) items += list("Light replacer" = image(icon = myreplacer.icon, icon_state = myreplacer.icon_state)) - var/obj/item/caution/sign = locate() in src + var/obj/item/clothing/suit/caution/sign = locate() in src if(sign) items += list("Sign" = image(icon = sign.icon, icon_state = sign.icon_state)) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index a23dd3a21e..a37797045f 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -22,7 +22,7 @@ var/obj/F = new /obj/structure/kitchenspike(src.loc) transfer_fingerprints_to(F) qdel(src) - else if(istype(I, /obj/item/weldingtool)) + else if(I.tool_behaviour == TOOL_WELDER) if(!I.tool_start_check(user, amount=0)) return to_chat(user, "You begin cutting \the [src] apart...") diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 6e497cff60..13f86d13bd 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -39,7 +39,7 @@ /obj/structure/lattice/attackby(obj/item/C, mob/user, params) if(resistance_flags & INDESTRUCTIBLE) return - if(istype(C, /obj/item/wirecutters)) + if(C.tool_behaviour == TOOL_WIRECUTTER) to_chat(user, "Slicing [name] joints ...") deconstruct() else @@ -100,7 +100,7 @@ number_of_rods = 2 smooth = SMOOTH_TRUE canSmoothWith = null - obj_flags = CAN_BE_HIT | BLOCK_Z_FALL + obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP /obj/structure/lattice/catwalk/deconstruction_hints(mob/user) to_chat(user, "The supporting rods look like they could be cut.") @@ -159,7 +159,7 @@ color = "#5286b9ff" smooth = SMOOTH_TRUE canSmoothWith = null - obj_flags = CAN_BE_HIT | BLOCK_Z_FALL + obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP resistance_flags = FIRE_PROOF | LAVA_PROOF /obj/structure/lattice/lava/deconstruction_hints(mob/user) diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index 164e597117..28ff5a8de7 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -38,4 +38,4 @@ user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL) return TRUE -#undef FABRIC_PER_SHEET \ No newline at end of file +#undef FABRIC_PER_SHEET diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index e8fbafa42b..d89606417f 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -11,7 +11,7 @@ max_integrity = 100 buckle_lying = FALSE layer = ABOVE_MOB_LAYER - var/view_range = 10 + var/view_range = 3 var/cooldown = 0 var/projectile_type = /obj/item/projectile/bullet/manned_turret var/rate_of_fire = 1 @@ -38,7 +38,7 @@ buckled_mob.pixel_x = 0 buckled_mob.pixel_y = 0 if(buckled_mob.client) - buckled_mob.client.change_view(CONFIG_GET(string/default_view)) + buckled_mob.client.view_size.resetToDefault() anchored = FALSE . = ..() STOP_PROCESSING(SSfastprocess, src) @@ -65,7 +65,7 @@ playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) anchored = TRUE if(M.client) - M.client.change_view(view_range) + M.client.view_size.setTo(view_range) START_PROCESSING(SSfastprocess, src) /obj/machinery/manned_turret/process() diff --git a/code/game/objects/structures/memorial.dm b/code/game/objects/structures/memorial.dm index 243a7e3cba..d359cfc54a 100644 --- a/code/game/objects/structures/memorial.dm +++ b/code/game/objects/structures/memorial.dm @@ -18,4 +18,4 @@ This memorial has been designed for him and any future coders to perish. icon = 'icons/obj/tomb.dmi' icon_state = "memorial" density = TRUE - anchored = TRUE \ No newline at end of file + anchored = TRUE diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index fa6bab0fcc..32040b8573 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -94,7 +94,7 @@ name = "magic mirror" desc = "Turn and face the strange... face." icon_state = "magic_mirror" - var/list/races_blacklist = list("skeleton", "agent", "angel", "military_synth", "memezombies", "clockwork golem servant", "android", "synth", "mush", "zombie", "memezombie") + var/list/races_blacklist = list("skeleton", "agent", "military_synth", "memezombies", "clockwork golem servant", "android", "synth", "mush", "zombie", "memezombie") var/list/choosable_races = list() /obj/structure/mirror/magic/New() diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index e1bb143fef..3eb88ad12d 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -26,4 +26,4 @@ /obj/structure/mopbucket/update_overlays() . = ..() if(reagents.total_volume > 0) - . += "mopbucket_water" \ No newline at end of file + . += "mopbucket_water" diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index a07e9a26d5..ff8287d77b 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -62,7 +62,7 @@ return 1 var/mob/living/M = caller - if(!M.ventcrawler && M.mob_size != MOB_SIZE_TINY) + if(!(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY) return 0 var/atom/movable/M = caller if(M && M.pulling) @@ -91,7 +91,7 @@ return 1 if(M.buckled && istype(M.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass. return 1 - if(!M.lying && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. + if(!M.lying && !(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. return 0 return ..() diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 5cc2315352..8174f6a82e 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -78,13 +78,13 @@ if(admin) return - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) can_rotate = !can_rotate to_chat(user, "You [can_rotate ? "unlock" : "lock"] [src]'s rotation.") W.play_tool_sound(src) return - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) if(anchored) to_chat(user, "Unweld [src] from the floor first!") return @@ -95,7 +95,7 @@ if(buildstackamount) new buildstacktype(drop_location(), buildstackamount) qdel(src) - else if(istype(W, /obj/item/weldingtool)) + else if(W.tool_behaviour == TOOL_WELDER) if(obj_integrity < max_integrity) if(!W.tool_start_check(user, amount=0)) return diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index b0427274a4..3b7933ab87 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -109,7 +109,7 @@ //However if a player wants to move an existing showcase or remove one, this is for that. /obj/structure/showcase/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/screwdriver) && !anchored) + if(W.tool_behaviour == TOOL_SCREWDRIVER && !anchored) if(deconstruction_state == SHOWCASE_SCREWDRIVERED) to_chat(user, "You screw the screws back into the showcase.") W.play_tool_sound(src, 100) @@ -119,7 +119,7 @@ W.play_tool_sound(src, 100) deconstruction_state = SHOWCASE_SCREWDRIVERED - if(istype(W, /obj/item/crowbar) && deconstruction_state == SHOWCASE_SCREWDRIVERED) + if(W.tool_behaviour == TOOL_CROWBAR && deconstruction_state == SHOWCASE_SCREWDRIVERED) if(W.use_tool(src, user, 20, volume=100)) to_chat(user, "You start to crowbar the showcase apart...") new /obj/item/stack/sheet/metal(drop_location(), 4) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index aa31fe9542..8b82cdba5e 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -26,7 +26,7 @@ playsound(loc, 'sound/items/welder.ogg', 80, 1) /obj/structure/sign/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench) && buildable_sign) + if(I.tool_behaviour == TOOL_WRENCH && buildable_sign) user.visible_message("[user] starts removing [src]...", \ "You start unfastening [src].") I.play_tool_sound(src) diff --git a/code/game/objects/structures/signs/signs_maps.dm b/code/game/objects/structures/signs/signs_maps.dm index ee29ef7443..bcd7c02c66 100644 --- a/code/game/objects/structures/signs/signs_maps.dm +++ b/code/game/objects/structures/signs/signs_maps.dm @@ -56,17 +56,17 @@ desc = "A direction sign, pointing out which way the Cafe is." icon_state = "direction_cafe" -obj/structure/sign/directions/rooms +/obj/structure/sign/directions/rooms name = "room" desc = "Room numbers, helps others find you!" icon_state = "roomnum" -obj/structure/sign/directions/dorms +/obj/structure/sign/directions/dorms name = "dorm" desc = "Dorm numbers, help others find you, or you find others." icon_state = "dormnum" -obj/structure/sign/directions/cells +/obj/structure/sign/directions/cells name = "room" desc = "So the less fortunate amongst us know where they'll be staying." icon_state = "cellnum" diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index e67ef7af60..9032a80d91 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -72,4 +72,4 @@ /obj/structure/spawner/mining/wumborian name = "wumborian fugu den" desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) \ No newline at end of file + mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index f8b54d04b6..2924545cc1 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -22,7 +22,7 @@ if(!(flags_1 & NODECONSTRUCT_1)) if(default_unfasten_wrench(user, W)) return - if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount=0)) return FALSE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 9f91d2c5e0..edb69236c6 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -73,7 +73,7 @@ if(user.grab_state < GRAB_AGGRESSIVE) to_chat(user, "You need a better grip to do that!") return - if(user.grab_state >= GRAB_NECK) + if(user.grab_state >= GRAB_NECK || HAS_TRAIT(user, TRAIT_MAULER)) tablelimbsmash(user, pushed_mob) else tablepush(user, pushed_mob) @@ -147,7 +147,7 @@ pushed_mob.Knockdown(30) var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD) var/extra_wound = 0 - if(HAS_TRAIT(user, TRAIT_HULK)) + if(HAS_TRAIT(user, TRAIT_HULK) || HAS_TRAIT(user, TRAIT_MAULER)) extra_wound = 20 banged_limb.receive_damage(30, wound_bonus = extra_wound) pushed_mob.apply_damage(60, STAMINA) @@ -170,13 +170,13 @@ /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) - if(istype(I, /obj/item/screwdriver) && deconstruction_ready) + if(I.tool_behaviour == TOOL_SCREWDRIVER && deconstruction_ready) to_chat(user, "You start disassembling [src]...") if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE) return - if(istype(I, /obj/item/wrench) && deconstruction_ready) + if(I.tool_behaviour == TOOL_WRENCH && deconstruction_ready) to_chat(user, "You start deconstructing [src]...") if(I.use_tool(src, user, 40, volume=50)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) @@ -269,13 +269,13 @@ UnregisterSignal(source, COMSIG_MOVABLE_MOVED) /obj/structure/table/rolling/Moved(atom/OldLoc, Dir) + . = ..() for(var/mob/M in OldLoc.contents)//Kidnap everyone on top M.forceMove(loc) for(var/x in attached_items) var/atom/movable/AM = x if(!AM.Move(loc)) RemoveItemFromTable(AM, AM.loc) - return TRUE /* * Glass tables @@ -538,7 +538,7 @@ return "The top cover is firmly welded on." /obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return @@ -689,7 +689,7 @@ step(O, get_dir(O, src)) /obj/structure/rack/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) + if(W.tool_behaviour == TOOL_WRENCH && !(flags_1 & NODECONSTRUCT_1)) W.play_tool_sound(src) deconstruct(TRUE) return @@ -747,7 +747,7 @@ var/building = FALSE /obj/item/rack_parts/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) new /obj/item/stack/sheet/metal(user.loc) qdel(src) else diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 2a441ff0f2..6b5e24089d 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -50,7 +50,7 @@ oxygentanks++ else full = TRUE - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, I, time = 20) return else if(user.a_intent != INTENT_HARM) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 3a5eb135f4..a5b6b0c9e1 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -94,7 +94,7 @@ /obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) for(var/obj/structure/transit_tube_pod/P in loc) P.deconstruct(FALSE, user) else diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 56608789f7..7e3684ad32 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -37,7 +37,7 @@ deconstruct(FALSE) /obj/structure/transit_tube/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) if(tube_construction) for(var/obj/structure/transit_tube_pod/pod in src.loc) to_chat(user, "Remove the pod first!") @@ -50,7 +50,7 @@ transfer_fingerprints_to(R) R.add_fingerprint(user) qdel(src) - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) for(var/obj/structure/transit_tube_pod/pod in src.loc) pod.attackby(W, user) else diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index cf68341b2c..89b03a8d78 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -26,7 +26,7 @@ icon_state = "pod" /obj/structure/transit_tube_pod/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) if(!moving) I.play_tool_sound(src) if(contents.len) @@ -126,12 +126,13 @@ if(current_tube == null) setDir(next_dir) - Move(get_step(loc, dir), dir) // Allow collisions when leaving the tubes. + Move(get_step(loc, dir), dir, DELAY_TO_GLIDE_SIZE(exit_delay)) // Allow collisions when leaving the tubes. break last_delay = current_tube.enter_delay(src, next_dir) sleep(last_delay) setDir(next_dir) + set_glide_size(DELAY_TO_GLIDE_SIZE(last_delay + exit_delay)) forceMove(next_loc) // When moving from one tube to another, skip collision and such. density = current_tube.density diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 4c8379d14f..e6a76f36ca 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -56,6 +56,7 @@ animate(src, alpha = initial(alpha), time = time_between_triggers) /obj/structure/trap/Crossed(atom/movable/AM) + . = ..() if(last_trigger + time_between_triggers > world.time) return // Don't want the traps triggered by sparks, ghosts or projectiles. @@ -67,6 +68,7 @@ return if(M.anti_magic_check()) flare() + return if(charges <= 0) return flare() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 2214f9e4bb..2d3ec4bc1f 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -93,7 +93,7 @@ /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) add_fingerprint(user) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...") playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(I.use_tool(src, user, 30)) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 4544cab3da..ef1ca6720a 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -87,7 +87,7 @@ add_fingerprint(user) switch(state) if("01") - if(istype(W, /obj/item/weldingtool) && !anchored) + if(W.tool_behaviour == TOOL_WELDER && !anchored) if(!W.tool_start_check(user, amount=0)) return @@ -105,7 +105,7 @@ return //Wrenching an unsecure assembly anchors it in place. Step 4 complete - if(istype(W, /obj/item/wrench) && !anchored) + if(W.tool_behaviour == TOOL_WRENCH && !anchored) for(var/obj/machinery/door/window/WD in loc) if(WD.dir == dir) to_chat(user, "There is already a windoor in that location!") @@ -128,7 +128,7 @@ name = "anchored windoor assembly" //Unwrenching an unsecure assembly un-anchors it. Step 4 undone - else if(istype(W, /obj/item/wrench) && anchored) + else if(W.tool_behaviour == TOOL_WRENCH && anchored) user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...") @@ -184,7 +184,7 @@ if("02") //Removing wire from the assembly. Step 5 undone. - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...") if(W.use_tool(src, user, 40, volume=100)) @@ -218,7 +218,7 @@ W.forceMove(drop_location()) //Screwdriver to remove airlock electronics. Step 6 undone. - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(!electronics) return @@ -245,7 +245,7 @@ //Crowbar to complete the assembly, Step 7 complete. - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) if(!electronics) to_chat(usr, "The assembly is missing electronics!") return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 74f006296f..d0b21016d4 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -191,7 +191,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) add_fingerprint(user) - if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) + if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP) if(obj_integrity < max_integrity) if(!I.tool_start_check(user, amount=0)) return @@ -224,7 +224,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) qdel(K) if(!(flags_1&NODECONSTRUCT_1)) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) I.play_tool_sound(src, 75) if(reinf) if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME) @@ -245,7 +245,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) return - else if (istype(I, /obj/item/crowbar) && reinf && (state == WINDOW_OUT_OF_FRAME || state == WINDOW_IN_FRAME)) + else if(I.tool_behaviour == TOOL_CROWBAR && reinf && (state == WINDOW_OUT_OF_FRAME || state == WINDOW_IN_FRAME)) to_chat(user, "You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...") I.play_tool_sound(src, 75) if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) @@ -253,7 +253,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) to_chat(user, "You pry the window [state == WINDOW_IN_FRAME ? "into":"out of"] the frame.") return - else if(istype(I, /obj/item/wrench) && !anchored) + else if(I.tool_behaviour == TOOL_WRENCH && !anchored) I.play_tool_sound(src, 75) to_chat(user, " You begin to disassemble [src]...") if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) diff --git a/code/game/say.dm b/code/game/say.dm index a5691ad11f..b7bfe540d0 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/endspanpart = "" //Message - var/messagepart = " [say_emphasis(lang_treat(speaker, message_language, raw_message, spans, message_mode))]" + var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]" var/languageicon = "" var/datum/language/D = GLOB.language_datum_instances[message_language] @@ -96,18 +96,16 @@ GLOBAL_LIST_INIT(freqtospan, list( return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]" // Citadel edit [spanned ? ", \"[spanned]\"" : ""]" -#define ENCODE_HTML_EPHASIS(input, char, html, varname) \ - var/static/regex/##varname = regex("[char]{2}(.+?)[char]{2}", "g");\ - input = varname.Replace_char(input, "<[html]>$1") - +/// Converts specific characters, like +, |, and _ to formatted output. /atom/movable/proc/say_emphasis(input) - ENCODE_HTML_EPHASIS(input, "\\|", "i", italics) - ENCODE_HTML_EPHASIS(input, "\\+", "b", bold) - ENCODE_HTML_EPHASIS(input, "_", "u", underline) + var/static/regex/italics = regex(@"\|((?=\S)[\w\W]*?(?<=\S))\|", "g") + input = italics.Replace_char(input, "$1") + var/static/regex/bold = regex(@"\+((?=\S)[\w\W]*?(?<=\S))\+", "g") + input = bold.Replace_char(input, "$1") + var/static/regex/underline = regex(@"_((?=\S)[\w\W]*?(?<=\S))_", "g") + input = underline.Replace_char(input, "$1") return input -#undef ENCODE_HTML_EPHASIS - /// Quirky citadel proc for our custom sayverbs to strip the verb out. Snowflakey as hell, say rewrite 3.0 when? /atom/movable/proc/quoteless_say_quote(input, list/spans = list(speech_span), message_mode) if((input[1] == "!") && (length_char(input) > 1)) @@ -118,6 +116,7 @@ GLOBAL_LIST_INIT(freqtospan, list( /atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode, no_quote = FALSE) if(has_language(language)) var/atom/movable/AM = speaker.GetSource() + raw_message = say_emphasis(raw_message) if(AM) //Basically means "if the speaker is virtual" return no_quote ? AM.quoteless_say_quote(raw_message, spans, message_mode) : AM.say_quote(raw_message, spans, message_mode) else diff --git a/code/game/sound.dm b/code/game/sound.dm index b012ba4e2a..1816336bd1 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -1,4 +1,49 @@ -/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, soundenvwet = -10000, soundenvdry = 0) +// /tg/ reverb disabled +/* +///Default override for echo +/sound + echo = list( + 0, // Direct + 0, // DirectHF + -10000, // Room, -10000 means no low frequency sound reverb + -10000, // RoomHF, -10000 means no high frequency sound reverb + 0, // Obstruction + 0, // ObstructionLFRatio + 0, // Occlusion + 0.25, // OcclusionLFRatio + 1.5, // OcclusionRoomRatio + 1.0, // OcclusionDirectRatio + 0, // Exclusion + 1.0, // ExclusionLFRatio + 0, // OutsideVolumeHF + 0, // DopplerFactor + 0, // RolloffFactor + 0, // RoomRolloffFactor + 1.0, // AirAbsorptionFactor + 0, // Flags (1 = Auto Direct, 2 = Auto Room, 4 = Auto RoomHF) + ) + environment = SOUND_ENVIRONMENT_NONE //Default to none so sounds without overrides dont get reverb +*/ + +/*! playsound + +playsound is a proc used to play a 3D sound in a specific range. This uses SOUND_RANGE + extra_range to determine that. + +source - Origin of sound +soundin - Either a file, or a string that can be used to get an SFX +vol - The volume of the sound, excluding falloff and pressure affection. +vary - bool that determines if the sound changes pitch every time it plays +extrarange - modifier for sound range. This gets added on top of SOUND_RANGE +falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive. +frequency - playback speed of audio +channel - The channel the sound is played at +pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space) +ignore_walls - Whether or not the sound can pass through walls. +falloff_distance - Distance at which falloff begins. Sound is at peak volume (in regards to falloff) aslong as it is in this range. + +*/ + +/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, envwet = -10000, envdry = 0) if(isarea(source)) CRASH("playsound(): source is an area") @@ -10,26 +55,60 @@ //allocate a channel if necessary now so its the same for everyone channel = channel || SSsounds.random_available_channel() - // Looping through the player list has the added bonus of working for mobs inside containers + // Looping through the player list has the added bonus of working for mobs inside containers var/sound/S = sound(get_sfx(soundin)) - var/maxdistance = (world.view + extrarange) - var/z = turf_source.z - var/list/listeners = SSmobs.clients_by_zlevel[z] + var/maxdistance = SOUND_RANGE + extrarange + var/source_z = turf_source.z + var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy() + + var/turf/above_turf = SSmapping.get_turf_above(turf_source) + var/turf/below_turf = SSmapping.get_turf_below(turf_source) + if(!ignore_walls) //these sounds don't carry through walls listeners = listeners & hearers(maxdistance,turf_source) + + if(above_turf && istransparentturf(above_turf)) + listeners += hearers(maxdistance,above_turf) + + if(below_turf && istransparentturf(turf_source)) + listeners += hearers(maxdistance,below_turf) + + else + if(above_turf && istransparentturf(above_turf)) + listeners += SSmobs.clients_by_zlevel[above_turf.z] + + if(below_turf && istransparentturf(turf_source)) + listeners += SSmobs.clients_by_zlevel[below_turf.z] + for(var/P in listeners) var/mob/M = P if(get_dist(M, turf_source) <= maxdistance) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry) - for(var/P in SSmobs.dead_players_by_zlevel[z]) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, null, envwet, envdry) + for(var/P in SSmobs.dead_players_by_zlevel[source_z]) var/mob/M = P if(get_dist(M, turf_source) <= maxdistance) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, null, envwet, envdry) -/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S, envwet = -10000, envdry = 0, manual_x, manual_y, distance_multiplier = 1) - if(audiovisual_redirect) - var/turf/T = get_turf(src) - audiovisual_redirect.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, 0, -1000, turf_source.x - T.x, turf_source.y - T.y, distance_multiplier) +/*! playsound + +playsound_local is a proc used to play a sound directly on a mob from a specific turf. +This is called by playsound to send sounds to players, in which case it also gets the max_distance of that sound. + +turf_source - Origin of sound +soundin - Either a file, or a string that can be used to get an SFX +vol - The volume of the sound, excluding falloff +vary - bool that determines if the sound changes pitch every time it plays +frequency - playback speed of audio +falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive. +channel - The channel the sound is played at +pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space) +max_distance - The peak distance of the sound, if this is a 3D sound +falloff_distance - Distance at which falloff begins, if this is a 3D sound +distance_multiplier - Can be used to multiply the distance at which the sound is heard + +*/ + +/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, envwet = -10000, envdry = 0) if(!client || !can_hear()) return @@ -39,7 +118,9 @@ S.wait = 0 //No queue S.channel = channel || SSsounds.random_available_channel() S.volume = vol + // CITADEL EDIT - Force citadel reverb S.environment = 7 + // End if(vary) if(frequency) @@ -51,13 +132,13 @@ var/turf/T = get_turf(src) //sound volume falloff with distance - var/distance = 0 - if(!manual_x && !manual_y) - distance = get_dist(T, turf_source) + var/distance = get_dist(T, turf_source) distance *= distance_multiplier - S.volume -= max(distance - world.view, 0) * 2 //multiplicative falloff to add on top of natural audio falloff. + if(max_distance) //If theres no max_distance we're not a 3D sound, so no falloff. + S.volume -= (max(distance - falloff_distance, 0) ** (1 / falloff_exponent)) / ((max(max_distance, distance) - falloff_distance) ** (1 / falloff_exponent)) * S.volume + //https://www.desmos.com/calculator/sqdfl8ipgf if(pressure_affected) //Atmosphere affects sound @@ -72,42 +153,57 @@ else //space pressure_factor = 0 - S.echo = list(envdry, null, envwet, null, null, null, null, null, null, null, null, null, null, 1, 1, 1, null, null) - if(distance <= 1) pressure_factor = max(pressure_factor, 0.15) //touching the source of the sound S.volume *= pressure_factor //End Atmosphere affecting sound + /// Citadel edit - Citadel reverb + S.echo = list(envdry, null, envwet, null, null, null, null, null, null, null, null, null, null, 1, 1, 1, null, null) + /// End + if(S.volume <= 0) return //No sound - var/dx = 0 // Hearing from the right/left - if(!manual_x) - dx = turf_source.x - T.x - else - dx = manual_x + var/dx = turf_source.x - T.x // Hearing from the right/left S.x = dx * distance_multiplier - var/dz = 0 // Hearing from infront/behind - if(!manual_x) - dz = turf_source.y - T.y - else - dz = manual_y + var/dz = turf_source.y - T.y // Hearing from infront/behind S.z = dz * distance_multiplier - // The y value is for above your head, but there is no ceiling in 2d spessmens. - S.y = 1 - S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) + var/dy = (turf_source.z - T.z) * 5 * distance_multiplier // Hearing from above / below, multiplied by 5 because we assume height is further along coords. + S.y = dy + + S.falloff = isnull(max_distance)? FALLOFF_SOUNDS : max_distance //use max_distance, else just use 1 as we are a direct sound so falloff isnt relevant. + + /* + /// Tg reverb removed + if(S.environment == SOUND_ENVIRONMENT_NONE) + if(sound_environment_override != SOUND_ENVIRONMENT_NONE) + S.environment = sound_environment_override + else + var/area/A = get_area(src) + if(A.sound_environment != SOUND_ENVIRONMENT_NONE) + S.environment = A.sound_environment + + if(use_reverb) + if(S.environment == SOUND_ENVIRONMENT_NONE) //We have reverb, reset our echo setting + S.environment = SOUND_ENVIRONMENT_CONCERT_HALL + S.echo = list(0, null, -10000, null, null, null, null, null, null, null, null, null, null, 1, 1, 1, null, null) + else + S.echo[3] = 0 //Room setting, 0 means normal reverb + S.echo[4] = 0 //RoomHF setting, 0 means normal reverb. + */ + /// SEND_SOUND(src, S) -/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, falloff = FALSE, channel = 0, pressure_affected = FALSE, sound/S) +/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, channel = 0, pressure_affected = FALSE, sound/S) if(!S) S = sound(get_sfx(soundin)) for(var/m in GLOB.player_list) if(ismob(m) && !isnewplayer(m)) var/mob/M = m - M.playsound_local(M, null, volume, vary, frequency, falloff, channel, pressure_affected, S) + M.playsound_local(M, null, volume, vary, frequency, null, channel, pressure_affected, S) /mob/proc/stop_sound_channel(chan) SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan)) @@ -130,14 +226,14 @@ /proc/get_sfx(soundin) if(istext(soundin)) switch(soundin) - if ("explosion_creaking") // from skyrat-ss13/skyrat13/pull/3295 - soundin = pick('sound/effects/explosioncreak1.ogg', 'sound/effects/explosioncreak2.ogg') - if ("hull_creaking") // from skyrat-ss13/skyrat13/pull/3295 - soundin = pick('sound/effects/creak1.ogg', 'sound/effects/creak2.ogg', 'sound/effects/creak3.ogg') if ("shatter") soundin = pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg') if ("explosion") soundin = pick('sound/effects/explosion1.ogg','sound/effects/explosion2.ogg') + if ("explosion_creaking") + soundin = pick('sound/effects/explosioncreak1.ogg', 'sound/effects/explosioncreak2.ogg') + if ("hull_creaking") + soundin = pick('sound/effects/creak1.ogg', 'sound/effects/creak2.ogg', 'sound/effects/creak3.ogg') if ("sparks") soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg') if ("rustle") diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 1ff056c572..876c170923 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -11,6 +11,15 @@ var/clawfootstep = null var/heavyfootstep = null + /// Dirtyness system, cit specific. + + /// Does dirt buildup happen on us? + var/dirt_buildup_allowed = FALSE + /// Dirt level. + var/dirtyness = 0 + /// Dirt level to spawn dirt. Null to use config. + var/dirt_spawn_threshold + /turf/open/ComponentInitialize() . = ..() if(wet) @@ -18,11 +27,21 @@ //direction is direction of travel of A /turf/open/zPassIn(atom/movable/A, direction, turf/source) - return (direction == DOWN) + if(direction == DOWN) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + return TRUE + return FALSE //direction is direction of travel of A /turf/open/zPassOut(atom/movable/A, direction, turf/destination) - return (direction == UP) + if(direction == UP) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + return TRUE + return FALSE //direction is direction of travel of air /turf/open/zAirIn(direction, turf/source) diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm index ea539ce5b5..69bdcf06cf 100644 --- a/code/game/turfs/openspace/openspace.dm +++ b/code/game/turfs/openspace/openspace.dm @@ -10,6 +10,8 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr plane = OPENSPACE_BACKDROP_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = SPLASHSCREEN_LAYER + //I don't know why the others are aligned but I shall do the same. + vis_flags = VIS_INHERIT_ID /turf/open/transparent/openspace name = "open space" @@ -17,6 +19,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr icon_state = "transparent" baseturfs = /turf/open/transparent/openspace CanAtmosPassVertical = ATMOS_PASS_YES + intact = FALSE //this means wires go on top //mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/can_cover_up = TRUE var/can_build_on = TRUE @@ -32,10 +35,14 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr /turf/open/transparent/openspace/show_bottom_level() return FALSE -/turf/open/transparent/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker +/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() - vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it. + return INITIALIZE_HINT_LATELOAD + +/turf/open/openspace/LateInitialize() + . = ..() + // AddElement(/datum/element/turf_z_transparency, FALSE) /turf/open/transparent/openspace/can_have_cabling() if(locate(/obj/structure/lattice/catwalk, src)) @@ -49,15 +56,32 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr return TRUE /turf/open/transparent/openspace/zPassIn(atom/movable/A, direction, turf/source) - return TRUE + if(direction == DOWN) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + return TRUE + if(direction == UP) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_IN_UP) + return FALSE + return TRUE + return FALSE /turf/open/transparent/openspace/zPassOut(atom/movable/A, direction, turf/destination) if(A.anchored) return FALSE - for(var/obj/O in contents) - if(O.obj_flags & BLOCK_Z_FALL) - return FALSE - return TRUE + if(direction == DOWN) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_OUT_DOWN) + return FALSE + return TRUE + if(direction == UP) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + return TRUE + return FALSE /turf/open/transparent/openspace/proc/CanCoverUp() return can_cover_up @@ -78,6 +102,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr return if(L) if(R.use(1)) + qdel(L) to_chat(user, "You construct a catwalk.") playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) new/obj/structure/lattice/catwalk(src) @@ -131,9 +156,22 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr /turf/open/transparent/openspace/icemoon name = "ice chasm" baseturfs = /turf/open/transparent/openspace/icemoon - can_cover_up = TRUE - can_build_on = TRUE initial_gas_mix = ICEMOON_DEFAULT_ATMOS + planetary_atmos = TRUE + var/replacement_turf = /turf/open/floor/plating/asteroid/snow/icemoon + +/turf/open/transparent/openspace/icemoon/Initialize() + . = ..() + var/turf/T = below() + // if(T.flags_1 & NO_RUINS_1) + // ChangeTurf(replacement_turf, null, CHANGETURF_IGNORE_AIR) + // return + // if(!ismineralturf(T)) + // return + var/turf/closed/mineral/M = T + M.mineralAmt = 0 + M.gets_drilled() + baseturfs = /turf/open/transparent/openspace/icemoon //This is to ensure that IF random turf generation produces a openturf, there won't be other turfs assigned other than openspace. /turf/open/transparent/openspace/icemoon/can_zFall(atom/movable/A, levels = 1, turf/target) return TRUE diff --git a/code/game/turfs/openspace/transparent.dm b/code/game/turfs/openspace/transparent.dm index 8efc60a15b..fa5bc17638 100644 --- a/code/game/turfs/openspace/transparent.dm +++ b/code/game/turfs/openspace/transparent.dm @@ -66,7 +66,12 @@ /turf/open/transparent/glass/Initialize() icon_state = "" //Prevent the normal icon from appearing behind the smooth overlays - return ..() + ..() + return INITIALIZE_HINT_LATELOAD + +/turf/open/floor/glass/LateInitialize() + . = ..() + // AddElement(/datum/element/turf_z_transparency, TRUE) /turf/open/transparent/glass/wrench_act(mob/living/user, obj/item/I) to_chat(user, "You begin removing glass...") diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 5e8f55feed..9490d728fe 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -9,6 +9,7 @@ canSmoothWith = list(/turf/open/floor/fakepit, /turf/open/chasm) density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf bullet_bounce_sound = null //abandon all hope ye who enter + dirt_buildup_allowed = FALSE /turf/open/chasm/Initialize() . = ..() diff --git a/code/game/turfs/simulated/dirtystation.dm b/code/game/turfs/simulated/dirtystation.dm index e29d75a248..add8467ceb 100644 --- a/code/game/turfs/simulated/dirtystation.dm +++ b/code/game/turfs/simulated/dirtystation.dm @@ -8,6 +8,9 @@ //Making the station dirty, one tile at a time. Called by master controller's setup_objects /turf/open/floor/proc/MakeDirty() + if(CONFIG_GET(flag/persistent_debris_only)) + return + if(prob(66)) //fastest possible exit 2/3 of the time return @@ -38,7 +41,7 @@ return //Construction zones. Blood, sweat, and oil. Oh, and dirt. - var/static/list/engine_dirt_areas = typecacheof(list(/area/engine, + var/static/list/engine_dirt_areas = typecacheof(list(/area/engine, /area/crew_quarters/heads/chief, /area/ruin/space/derelict/assembly_line, /area/science/robotics, diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index ddec9750d9..d13ae862ca 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -5,6 +5,7 @@ name = "floor" icon = 'icons/turf/floors.dmi' baseturfs = /turf/open/floor/plating + dirt_buildup_allowed = TRUE footstep = FOOTSTEP_FLOOR barefootstep = FOOTSTEP_HARD_BAREFOOT @@ -137,6 +138,9 @@ burnt = 1 /turf/open/floor/proc/make_plating() + for(var/obj/effect/decal/cleanable/C in src) + if(C.wiped_by_floor_change) + qdel(C) return ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/ChangeTurf(path, new_baseturf, flags) @@ -167,7 +171,7 @@ /turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) return - var/obj/item/crowbar/CB = user.is_holding_item_of_type(/obj/item/crowbar) + var/obj/item/CB = user.is_holding_tool_quality(TOOL_CROWBAR) if(!CB) return var/turf/open/floor/plating/P = pry_tile(CB, user, TRUE) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 3cf6cc7511..3960f9a034 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -32,9 +32,9 @@ /turf/open/floor/wood/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) return - var/obj/item/tool = user.is_holding_item_of_type(/obj/item/screwdriver) + var/obj/item/tool = user.is_holding_tool_quality(TOOL_SCREWDRIVER) if(!tool) - tool = user.is_holding_item_of_type(/obj/item/crowbar) + tool = user.is_holding_tool_quality(TOOL_CROWBAR) if(!tool) return var/turf/open/floor/plating/P = pry_tile(tool, user, TRUE) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index c70332eacb..82e60ed8f6 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -196,7 +196,7 @@ if(M.client && (is_servant_of_ratvar(M) || isobserver(M) || M.stat == DEAD)) viewing += M.client flick_overlay(I, viewing, 8) - L.adjustToxLoss(-3, TRUE, TRUE) + L.adjustToxLoss(-3, TRUE, TRUE, toxins_type = TOX_OMNI) /turf/open/floor/clockwork/try_replace_tile(obj/item/stack/tile/T, mob/user, params) return @@ -278,4 +278,4 @@ heavyfootstep = FOOTSTEP_RUST /turf/open/floor/plating/rust/rust_heretic_act() - return + return diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 35ee06a584..ad3cf86864 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -61,6 +61,9 @@ to_chat(user, "You begin reinforcing the floor...") if(do_after(user, 30, target = src)) if (R.get_amount() >= 2 && !istype(src, /turf/open/floor/engine)) + for(var/obj/effect/decal/cleanable/decal in src) + if(decal.wiped_by_floor_change) + qdel(decal) PlaceOnTop(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) R.use(2) @@ -78,6 +81,9 @@ to_chat(user, "You begin adding glass to the floor...") if(do_after(user, 5, target = src)) if (G.get_amount() >= 2 && !istype(src, /turf/open/transparent/glass)) + for(var/obj/effect/decal/cleanable/decal in src) + if(decal.wiped_by_floor_change) + qdel(decal) PlaceOnTop(/turf/open/transparent/glass, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) G.use(2) @@ -95,6 +101,9 @@ to_chat(user, "You begin adding reinforced glass to the floor...") if(do_after(user, 10, target = src)) if (RG.get_amount() >= 2 && !istype(src, /turf/open/transparent/glass/reinforced)) + for(var/obj/effect/decal/cleanable/decal in src) + if(decal.wiped_by_floor_change) + qdel(decal) PlaceOnTop(/turf/open/transparent/glass/reinforced, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) RG.use(2) @@ -110,6 +119,9 @@ var/obj/item/stack/tile/W = C if(!W.use(1)) return + for(var/obj/effect/decal/cleanable/decal in src) + if(decal.wiped_by_floor_change) + qdel(decal) if(istype(W, /obj/item/stack/tile/material)) var/turf/newturf = PlaceOnTop(/turf/open/floor/material, flags = CHANGETURF_INHERIT_AIR) newturf.set_custom_materials(W.custom_materials) diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 6e7dbaf904..d9dbf3aa3b 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -204,7 +204,8 @@ digResult = /obj/item/stack/sheet/mineral/snow mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/wolf = 50, /obj/structure/spawner/ice_moon = 3, \ /mob/living/simple_animal/hostile/asteroid/polarbear = 30, /obj/structure/spawner/ice_moon/polarbear = 3, \ - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10) + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, \ + /mob/living/simple_animal/hostile/asteroid/lobstrosity = 15) flora_spawn_list = list(/obj/structure/flora/tree/pine = 2, /obj/structure/flora/grass/both = 12, /obj/structure/flora/rock/icy = 6, /obj/structure/flora/rock/pile/icy = 6) data_having_type = /turf/open/floor/plating/asteroid/airless/cave/snow/has_data turf_type = /turf/open/floor/plating/asteroid/snow/icemoon diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 42b4707b50..f8c6ff1ce2 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -43,6 +43,9 @@ return TRUE if(floor_tile) new floor_tile(src, 2) + for(var/obj/effect/decal/cleanable/C in src) + if(C.wiped_by_floor_change) + qdel(C) ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return TRUE diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 2f223f2c40..e7471478fb 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -6,6 +6,7 @@ gender = PLURAL //"That's some lava." baseturfs = /turf/open/lava //lava all the way down slowdown = 2 + dirt_buildup_allowed = FALSE light_range = 2 light_power = 0.75 diff --git a/code/game/turfs/simulated/reebe_void.dm b/code/game/turfs/simulated/reebe_void.dm index 14aa02065d..3f3bf31f9b 100644 --- a/code/game/turfs/simulated/reebe_void.dm +++ b/code/game/turfs/simulated/reebe_void.dm @@ -6,6 +6,7 @@ planetary_atmos = TRUE bullet_bounce_sound = null //forever falling tiled_dirt = FALSE + dirt_buildup_allowed = FALSE /turf/open/indestructible/reebe_void/Initialize(mapload) . = ..() diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 5e60f65ccc..03d5cecc26 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -65,7 +65,7 @@ //DECONSTRUCTION switch(d_state) if(INTACT) - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) W.play_tool_sound(src, 100) d_state = SUPPORT_LINES update_icon() @@ -73,7 +73,7 @@ return 1 if(SUPPORT_LINES) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You begin unsecuring the support lines...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_LINES) @@ -83,7 +83,7 @@ to_chat(user, "You unsecure the support lines.") return 1 - else if(istype(W, /obj/item/wirecutters)) + else if(W.tool_behaviour == TOOL_WIRECUTTER) W.play_tool_sound(src, 100) d_state = INTACT update_icon() @@ -91,7 +91,7 @@ return 1 if(COVER) - if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin slicing through the metal cover...") @@ -103,7 +103,7 @@ to_chat(user, "You press firmly on the cover, dislodging it.") return 1 - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You begin securing the support lines...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) @@ -114,7 +114,7 @@ return 1 if(CUT_COVER) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You struggle to pry off the cover...") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) @@ -124,7 +124,7 @@ to_chat(user, "You pry off the cover.") return 1 - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin welding the metal cover back to the frame...") @@ -137,7 +137,7 @@ return 1 if(ANCHOR_BOLTS) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != ANCHOR_BOLTS) @@ -147,7 +147,7 @@ to_chat(user, "You remove the bolts anchoring the support rods.") return 1 - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start to pry the cover back into place...") if(W.use_tool(src, user, 20, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != ANCHOR_BOLTS) @@ -158,7 +158,7 @@ return 1 if(SUPPORT_RODS) - if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin slicing through the support rods...") @@ -170,7 +170,7 @@ to_chat(user, "You slice through the support rods.") return 1 - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start tightening the bolts which secure the support rods to their frame...") W.play_tool_sound(src, 100) if(W.use_tool(src, user, 40)) @@ -182,7 +182,7 @@ return 1 if(SHEATH) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You struggle to pry off the outer sheath...") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) @@ -191,7 +191,7 @@ dismantle_wall() return 1 - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin welding the support rods back together...") diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 402ab36947..79ca5add10 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -199,7 +199,7 @@ if((user.a_intent != INTENT_HELP) || !LAZYLEN(dent_decals)) return FALSE - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return FALSE @@ -233,7 +233,7 @@ return FALSE /turf/closed/wall/proc/try_decon(obj/item/I, mob/user, turf/T) - if(istype(I, /obj/item/weldingtool) || istype(I, /obj/item/gun/energy/plasmacutter)) + if(I.tool_behaviour == TOOL_WELDER || istype(I, /obj/item/gun/energy/plasmacutter)) if(!I.tool_start_check(user, amount=0)) return FALSE diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 0e028ed4af..0905fb2e9c 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -3,6 +3,7 @@ icon_state = "0" name = "\proper space" intact = 0 + dirt_buildup_allowed = FALSE temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT @@ -19,12 +20,19 @@ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED bullet_bounce_sound = null + vis_flags = VIS_INHERIT_ID //when this be added to vis_contents of something it be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf. /turf/open/space/basic/New() //Do not convert to Initialize //This is used to optimize the map loader return +/** + * Space Initialize + * + * Doesn't call parent, see [/atom/proc/Initialize] + */ /turf/open/space/Initialize() + SHOULD_CALL_PARENT(FALSE) icon_state = SPACE_ICON_STATE air = space_gas update_air_ref() @@ -35,6 +43,15 @@ stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 + // if (length(smoothing_groups)) + // sortTim(smoothing_groups) //In case it's not properly ordered, let's avoid duplicate entries with the same values. + // SET_BITFLAG_LIST(smoothing_groups) + // if (length(canSmoothWith)) + // sortTim(canSmoothWith) + // if(canSmoothWith[length(canSmoothWith)] > MAX_S_TURF) //If the last element is higher than the maximum turf-only value, then it must scan turf contents for smoothing targets. + // smoothing_flags |= SMOOTH_OBJ + // SET_BITFLAG_LIST(canSmoothWith) + var/area/A = loc if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) add_overlay(/obj/effect/fullbright) @@ -48,6 +65,13 @@ if (opacity) has_opaque_atom = TRUE + var/turf/T = SSmapping.get_turf_above(src) + if(T) + T.multiz_turf_new(src, DOWN) + T = SSmapping.get_turf_below(src) + if(T) + T.multiz_turf_new(src, UP) + ComponentInitialize() return INITIALIZE_HINT_NORMAL @@ -73,6 +97,10 @@ /turf/open/space/Assimilate_Air() return +//IT SHOULD RETURN NULL YOU MONKEY, WHY IN TARNATION WHAT THE FUCKING FUCK +/turf/open/space/remove_air(amount) + return null + /turf/open/space/proc/update_starlight() if(CONFIG_GET(flag/starlight)) for(var/t in RANGE_TURFS(1,src)) //RANGE_TURFS is in code\__HELPERS\game.dm @@ -89,9 +117,8 @@ /turf/open/space/proc/CanBuildHere() return TRUE -/turf/open/space/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube) - if(lube & FLYING_DOESNT_HELP) - return ..() +/turf/open/space/handle_slip() + return // no lube bullshit, this is space /turf/open/space/attackby(obj/item/C, mob/user, params) ..() @@ -106,15 +133,16 @@ return if(L) if(R.use(1)) + qdel(L) to_chat(user, "You construct a catwalk.") - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) new/obj/structure/lattice/catwalk(src) else to_chat(user, "You need two rods to build a catwalk!") return if(R.use(1)) to_chat(user, "You construct a lattice.") - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) ReplaceWithLattice() else to_chat(user, "You need one rod to build a lattice.") @@ -125,7 +153,7 @@ var/obj/item/stack/tile/plasteel/S = C if(S.use(1)) qdel(L) - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) to_chat(user, "You build a floor.") PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else @@ -133,13 +161,10 @@ else to_chat(user, "The plating is going to need some support! Place metal rods first.") -/turf/open/space/Entered(atom/movable/A, atom/OldLoc) - . = ..() - - var/turf/old = get_turf(OldLoc) - if(!isspaceturf(old) && ismob(A)) - var/mob/M = A - M.update_gravity(M.mob_has_gravity()) +/turf/open/space/Entered(atom/movable/A) + ..() + if ((!(A) || src != A.loc)) + return if(destination_z && destination_x && destination_y && !(A.pulledby || !A.can_be_z_moved)) var/tx = destination_x @@ -160,18 +185,29 @@ ty-- DT = locate(tx, ty, destination_z) - var/atom/movable/AM = A.pulling + var/atom/movable/pulling = A.pulling + var/atom/movable/puller = A A.forceMove(DT) - if(AM) - var/turf/T = get_step(A.loc,turn(A.dir, 180)) - AM.can_be_z_moved = FALSE - AM.forceMove(T) - A.start_pulling(AM) - AM.can_be_z_moved = TRUE + + while (pulling != null) + var/next_pulling = pulling.pulling + if(next_pulling == pulling) + break // no loops + + var/turf/T = get_step(puller.loc, turn(puller.dir, 180)) + pulling.can_be_z_moved = FALSE + pulling.forceMove(T) + puller.start_pulling(pulling) + pulling.can_be_z_moved = TRUE + + puller = pulling + pulling = next_pulling //now we're on the new z_level, proceed the space drifting stoplag()//Let a diagonal move finish, if necessary A.newtonian_move(A.inertia_dir) + A.inertia_moving = TRUE + /turf/open/space/Exited(atom/movable/AM, atom/OldLoc) . = ..() @@ -235,3 +271,110 @@ destination_x = dest_x destination_y = dest_y destination_z = dest_z + + +/turf/open/space/transparent + baseturfs = /turf/open/space/transparent/openspace + intact = FALSE //this means wires go on top + +/turf/open/space/transparent/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker + ..() + plane = OPENSPACE_PLANE + layer = OPENSPACE_LAYER + icon_state = "transparent" + + return INITIALIZE_HINT_LATELOAD + +/turf/open/space/transparent/LateInitialize() + update_multiz(TRUE, TRUE) + +/turf/open/space/transparent/Destroy() + vis_contents.len = 0 + return ..() + +/turf/open/space/transparent/update_multiz(prune_on_fail = FALSE, init = FALSE) + . = ..() + var/turf/T = below() + if(!T) + vis_contents.len = 0 + if(!show_bottom_level() && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to space as a fallback + ChangeTurf(/turf/open/space) + return FALSE + if(init) + vis_contents += T + return TRUE + +/turf/open/space/transparent/multiz_turf_del(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/space/transparent/multiz_turf_new(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +///Called when there is no real turf below this turf +/turf/open/space/transparent/proc/show_bottom_level() + var/turf/path = SSmapping.level_trait(z, ZTRAIT_BASETURF) || /turf/open/space + if(!ispath(path)) + path = text2path(path) + if(!ispath(path)) + warning("Z-level [z] has invalid baseturf '[SSmapping.level_trait(z, ZTRAIT_BASETURF)]'") + path = /turf/open/space + var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER, plane = PLANE_SPACE) + underlays += underlay_appearance + return TRUE + +/turf/open/space/transparent/openspace + name = "open space" + desc = "Watch your step!" + icon_state = "transparent" + baseturfs = /turf/open/space/transparent/openspace + CanAtmosPassVertical = ATMOS_PASS_YES + //mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +///No bottom level for openspace. +/turf/open/space/transparent/openspace/show_bottom_level() + return FALSE + +/turf/open/space/transparent/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker + . = ..() + + icon_state = "transparent" + + vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it. + +/turf/open/space/transparent/openspace/zAirIn() + return TRUE + +/turf/open/space/transparent/openspace/zAirOut() + return TRUE + +/turf/open/space/transparent/openspace/zPassIn(atom/movable/A, direction, turf/source) + if(direction == DOWN) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + return TRUE + if(direction == UP) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_IN_UP) + return FALSE + return TRUE + return FALSE + +/turf/open/space/transparent/openspace/zPassOut(atom/movable/A, direction, turf/destination) + if(A.anchored) + return FALSE + if(direction == DOWN) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_OUT_DOWN) + return FALSE + return TRUE + if(direction == UP) + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + return TRUE + return FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 55d945535d..c2fee908fb 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -1,8 +1,11 @@ +GLOBAL_LIST_EMPTY(station_turfs) + +/// Any floor or wall. What makes up the station and the rest of the map. /turf icon = 'icons/turf/floors.dmi' - level = 1 - vis_flags = VIS_INHERIT_PLANE|VIS_INHERIT_ID //when this be added to vis_contents of something it inherit something.plane and be associatet with something on clicking, - //important for visualisation of turf in openspace and interraction with openspace that show you turf. + flags_1 = CAN_BE_DIRTY_1 + vis_flags = VIS_INHERIT_ID|VIS_INHERIT_PLANE // Important for interaction with and visualization of openspace. + luminosity = 1 var/intact = 1 @@ -19,8 +22,6 @@ var/blocks_air = FALSE - flags_1 = CAN_BE_DIRTY_1 - var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes var/explosion_level = 0 //for preventing explosion dodging @@ -41,7 +42,13 @@ return FALSE . = ..() +/** + * Turf Initialize + * + * Doesn't call parent, see [/atom/proc/Initialize] + */ /turf/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 @@ -49,7 +56,7 @@ // by default, vis_contents is inherited from the turf that was here before vis_contents.Cut() - if(color) + if(color) // is this being used? This is here because parent isn't being called add_atom_colour(color, FIXED_COLOUR_PRIORITY) assemble_baseturfs() @@ -57,6 +64,7 @@ levelupdate() if(smooth) queue_smooth(src) + visibilityChanged() for(var/atom/movable/AM in src) @@ -76,11 +84,10 @@ var/turf/T = SSmapping.get_turf_above(src) if(T) T.multiz_turf_new(src, DOWN) - SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) T = SSmapping.get_turf_below(src) if(T) T.multiz_turf_new(src, UP) - SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) + if (opacity) has_opaque_atom = TRUE @@ -112,8 +119,6 @@ var/turf/B = new world.turf(src) for(var/A in B.contents) qdel(A) - for(var/I in B.vars) - B.vars[I] = null return SSair.remove_from_active(src) visibilityChanged() @@ -122,12 +127,14 @@ requires_activation = FALSE ..() -/turf/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) +/turf/on_attack_hand(mob/user) user.Move_Pulled(src) /turf/proc/multiz_turf_del(turf/T, dir) + // SEND_SIGNAL(src, COMSIG_TURF_MULTIZ_DEL, T, dir) /turf/proc/multiz_turf_new(turf/T, dir) + SEND_SIGNAL(src, COMSIG_TURF_MULTIZ_NEW, T, dir) //zPassIn doesn't necessarily pass an atom! //direction is direction of travel of air @@ -158,13 +165,14 @@ prev_turf.visible_message("[mov_name] falls through [prev_turf]!") if(flags & FALL_INTERCEPTED) return - if(zFall(A, ++levels)) + if(zFall(A, levels + 1)) return FALSE A.visible_message("[A] crashes into [src]!") A.onZImpact(src, levels) return TRUE /turf/proc/can_zFall(atom/movable/A, levels = 1, turf/target) + SHOULD_BE_PURE(TRUE) return zPassOut(A, DOWN, target) && target.zPassIn(A, DOWN, src) /turf/proc/zFall(atom/movable/A, levels = 1, force = FALSE) @@ -217,49 +225,54 @@ stack_trace("Non movable passed to turf CanPass : [mover]") return FALSE +//There's a lot of QDELETED() calls here if someone can figure out how to optimize this but not runtime when something gets deleted by a Bump/CanPass/Cross call, lemme know or go ahead and fix this mess - kevinz000 /turf/Enter(atom/movable/mover, atom/oldloc) // Do not call ..() // Byond's default turf/Enter() doesn't have the behaviour we want with Bump() // By default byond will call Bump() on the first dense object in contents // Here's hoping it doesn't stay like this for years before we finish conversion to step_ var/atom/firstbump - if(!CanPass(mover, src)) - firstbump = src - else + var/canPassSelf = CanPass(mover, src) + if(canPassSelf || (mover.movement_type & UNSTOPPABLE)) for(var/i in contents) + if(QDELETED(mover)) + return FALSE //We were deleted, do not attempt to proceed with movement. if(i == mover || i == mover.loc) // Multi tile objects and moving out of other objects continue - if(QDELETED(mover)) - break var/atom/movable/thing = i if(!thing.Cross(mover)) - if(CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE)) + if(QDELETED(mover)) //Mover deleted from Cross/CanPass, do not proceed. + return FALSE + if((mover.movement_type & UNSTOPPABLE)) mover.Bump(thing) continue else if(!firstbump || ((thing.layer > firstbump.layer || thing.flags_1 & ON_BORDER_1) && !(firstbump.flags_1 & ON_BORDER_1))) firstbump = thing + if(QDELETED(mover)) //Mover deleted from Cross/CanPass/Bump, do not proceed. + return FALSE + if(!canPassSelf) //Even if mover is unstoppable they need to bump us. + firstbump = src if(firstbump) - if(!QDELETED(mover)) - mover.Bump(firstbump) - return CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE) + mover.Bump(firstbump) + return (mover.movement_type & UNSTOPPABLE) return TRUE /turf/Exit(atom/movable/mover, atom/newloc) . = ..() - if(!.) + if(!. || QDELETED(mover)) return FALSE for(var/i in contents) - if(QDELETED(mover)) - break if(i == mover) continue var/atom/movable/thing = i if(!thing.Uncross(mover, newloc)) if(thing.flags_1 & ON_BORDER_1) mover.Bump(thing) - if(!CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE)) + if(!(mover.movement_type & UNSTOPPABLE)) return FALSE + if(QDELETED(mover)) + return FALSE //We were deleted. /turf/Entered(atom/movable/AM) ..() @@ -271,6 +284,7 @@ has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. reconsider_lights() + /turf/open/Entered(atom/movable/AM) ..() //melting @@ -278,7 +292,6 @@ var/obj/O = AM if(O.obj_flags & FROZEN) O.make_unfrozen() - if(!AM.zfalling) zFall(AM) @@ -336,14 +349,13 @@ /turf/proc/levelupdate() for(var/obj/O in src) - if(O.level == 1 && (O.flags_1 & INITIALIZED_1)) - O.hide(src.intact) + if(O.flags_1 & INITIALIZED_1) + // SEND_SIGNAL(O, COMSIG_OBJ_HIDE, intact) + O.hide(intact) // override for space turfs, since they should never hide anything /turf/open/space/levelupdate() - for(var/obj/O in src) - if(O.level == 1 && (O.flags_1 & INITIALIZED_1)) - O.hide(0) + return // Removes all signs of lattice on the pos of the turf -Donkieyo /turf/proc/RemoveLattice() @@ -368,13 +380,13 @@ if(.) return if(length(src_object.contents())) - to_chat(user, "You start dumping out the contents...") - if(!do_after(user,20,target=src_object.parent)) + to_chat(usr, "You start dumping out the contents...") + if(!do_after(usr,20,target=src_object.parent)) return FALSE var/list/things = src_object.contents() var/datum/progressbar/progress = new(user, things.len, src) - while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress))) + while (do_after(usr, 1 SECONDS, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress))) stoplag(1) qdel(progress) @@ -494,10 +506,8 @@ I.loc = src I.setDir(AM.dir) I.alpha = 128 - LAZYADD(blueprint_data, I) - /turf/proc/add_blueprints_preround(atom/movable/AM) if(!SSticker.HasRoundStarted()) add_blueprints(AM) @@ -531,7 +541,7 @@ if(!forced) return if(has_gravity(src)) - playsound(src, "bodyfall", 50, 1) + playsound(src, "bodyfall", 50, TRUE) faller.drop_all_held_items() /turf/proc/photograph(limit=20) diff --git a/code/game/world.dm b/code/game/world.dm index 42c90d8be1..4369ca6668 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -1,21 +1,46 @@ #define RESTART_COUNTER_PATH "data/round_counter.txt" GLOBAL_VAR(restart_counter) + GLOBAL_VAR_INIT(tgs_initialized, FALSE) GLOBAL_VAR(topic_status_lastcache) GLOBAL_LIST(topic_status_cache) -//This happens after the Master subsystem new(s) (it's a global datum) -//So subsystems globals exist, but are not initialised +/** + * World creation + * + * Here is where a round itself is actually begun and setup. + * * db connection setup + * * config loaded from files + * * loads admins + * * Sets up the dynamic menu system + * * and most importantly, calls initialize on the master subsystem, starting the game loop that causes the rest of the game to begin processing and setting up + * + * + * Nothing happens until something moves. ~Albert Einstein + * + * For clarity, this proc gets triggered later in the initialization pipeline, it is not the first thing to happen, as it might seem. + * + * Initialization Pipeline: + * Global vars are new()'ed, (including config, glob, and the master controller will also new and preinit all subsystems when it gets new()ed) + * Compiled in maps are loaded (mainly centcom). all areas/turfs/objs/mobs(ATOMs) in these maps will be new()ed + * world/New() (You are here) + * Once world/New() returns, client's can connect. + * 1 second sleep + * Master Controller initialization. + * Subsystem initialization. + * Non-compiled-in maps are maploaded, all atoms are new()ed + * All atoms in both compiled and uncompiled maps are initialized() + */ /world/New() if (fexists(EXTOOLS)) call(EXTOOLS, "maptick_initialize")() - #ifdef EXTOOLS_LOGGING +#ifdef EXTOOLS_LOGGING call(EXTOOLS, "init_logging")() else CRASH("[EXTOOLS] does not exist!") - #endif +#endif enable_debugger() #ifdef REFERENCE_TRACKING enable_reference_tracking() @@ -23,12 +48,11 @@ GLOBAL_LIST(topic_status_cache) world.Profile(PROFILE_START) - log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!") - GLOB.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.world_job_debug_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.[GUID()].log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl - make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) + log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!") + make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) GLOB.revdata = new @@ -36,6 +60,9 @@ GLOBAL_LIST(topic_status_cache) config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER]) + load_admins() + load_mentors() + //SetupLogs depends on the RoundID, so lets check //DB schema and set RoundID if we can SSdbcore.CheckSchemaVersion() @@ -49,14 +76,9 @@ GLOBAL_LIST(topic_status_cache) world.log = file("[GLOB.log_directory]/dd.log") //not all runtimes trigger world/Error, so this is the only way to ensure we can see all of them. #endif - load_admins() - load_mentors() LoadVerbs(/datum/verbs/menu) if(CONFIG_GET(flag/usewhitelist)) load_whitelist() - LoadBans() - initialize_global_loadout_items() - reload_custom_roundstart_items_list()//Cit change - loads donator items. Remind me to remove when I port over bay's loadout system GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 @@ -67,10 +89,15 @@ GLOBAL_LIST(topic_status_cache) if(NO_INIT_PARAMETER in params) return + LoadBans() + initialize_global_loadout_items() + reload_custom_roundstart_items_list()//Cit change - loads donator items. Remind me to remove when I port over bay's loadout system + Master.Initialize(10, FALSE, TRUE) - if(TEST_RUN_PARAMETER in params) - HandleTestRun() + #ifdef UNIT_TESTS + HandleTestRun() + #endif /world/proc/InitTgs() TgsNew(new /datum/tgs_event_handler/impl, TGS_SECURITY_TRUSTED) @@ -88,7 +115,7 @@ GLOBAL_LIST(topic_status_cache) #else cb = VARSET_CALLBACK(SSticker, force_ending, TRUE) #endif - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, cb, 10 SECONDS)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/_addtimer, cb, 10 SECONDS)) /world/proc/SetupLogs() var/override_dir = params[OVERRIDE_LOG_DIRECTORY_PARAMETER] @@ -136,7 +163,7 @@ GLOBAL_LIST(topic_status_cache) #ifdef UNIT_TESTS - GLOB.test_log = file("[GLOB.log_directory]/tests.log") + GLOB.test_log = "[GLOB.log_directory]/tests.log" start_log(GLOB.test_log) #endif start_log(GLOB.world_game_log) @@ -172,7 +199,7 @@ GLOBAL_LIST(topic_status_cache) if(!SSfail2topic) return "Server not initialized." - else if(SSfail2topic.IsRateLimited(addr)) + if(SSfail2topic.IsRateLimited(addr)) return "Rate limited." if(length(T) > CONFIG_GET(number/topic_max_size)) @@ -243,9 +270,10 @@ GLOBAL_LIST(topic_status_cache) TgsReboot() - if(TEST_RUN_PARAMETER in params) - FinishTestRun() - return + #ifdef UNIT_TESTS + FinishTestRun() + return + #endif if(TgsAvailable()) var/do_hard_reboot @@ -280,11 +308,11 @@ GLOBAL_LIST(topic_status_cache) var/list/features = list() - /*if(GLOB.master_mode) CIT CHANGE - hides the gamemode from the hub entry, removes some useless info from the hub entry - features += GLOB.master_mode + // if(GLOB.master_mode) + // features += GLOB.master_mode - if (!GLOB.enter_allowed) - features += "closed"*/ + // if (!GLOB.enter_allowed) + // features += "closed" var/s = "" var/hostedby @@ -292,25 +320,22 @@ GLOBAL_LIST(topic_status_cache) var/server_name = CONFIG_GET(string/servername) if (server_name) s += "[server_name] — " - /*features += "[CONFIG_GET(flag/norespawn) ? "no " : ""]respawn" CIT CHANGE - removes some useless info from the hub entry - if(CONFIG_GET(flag/allow_vote_mode)) - features += "vote" - if(CONFIG_GET(flag/allow_ai)) - features += "AI allowed"*/ + // features += "[CONFIG_GET(flag/norespawn) ? "no " : ""]respawn" + // if(CONFIG_GET(flag/allow_vote_mode)) + // features += "vote" + // if(CONFIG_GET(flag/allow_ai)) + // features += "AI allowed" hostedby = CONFIG_GET(string/hostedby) s += "[station_name()]"; s += " (" - s += "" //Change this to wherever you want the hub to link to. CIT CHANGE - links to cit's website on the hub - s += "Citadel" //Replace this with something else. Or ever better, delete it and uncomment the game version. CIT CHANGE - modifies the hub entry link + s += "" //Change this to wherever you want the hub to link to. + s += "Citadel" //Replace this with something else. Or ever better, delete it and uncomment the game version. s += "" s += ")\]" //CIT CHANGE - encloses the server title in brackets to make the hub entry fancier s += "
    [CONFIG_GET(string/servertagline)]
    " //CIT CHANGE - adds a tagline! - var/n = 0 - for (var/mob/M in GLOB.player_list) - if (M.client) - n++ + var/players = GLOB.clients.len if(SSmapping.config) // this just stops the runtime, honk. features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map @@ -318,16 +343,23 @@ GLOBAL_LIST(topic_status_cache) if(NUM2SECLEVEL(GLOB.security_level))//CIT CHANGE - makes the hub entry show the security level features += "[NUM2SECLEVEL(GLOB.security_level)] alert" - if (n > 1) - features += "~[n] players" - else if (n > 0) - features += "~[n] player" + var/popcaptext = "" + var/popcap = max(CONFIG_GET(number/extreme_popcap), CONFIG_GET(number/hard_popcap), CONFIG_GET(number/soft_popcap)) + if (popcap) + popcaptext = "/[popcap]" + + if (players > 1) + features += "[players][popcaptext] players" + else if (players > 0) + features += "[players][popcaptext] player" + + game_state = (CONFIG_GET(number/extreme_popcap) && players >= CONFIG_GET(number/extreme_popcap)) //tells the hub if we are full if (!host && hostedby) features += "hosted by [hostedby]" if (features) - s += "\[[jointext(features, ", ")]" //CIT CHANGE - replaces the colon here with a left bracket + s += "\[[jointext(features, ", ")]" status = s @@ -346,4 +378,28 @@ GLOBAL_LIST(topic_status_cache) SSidlenpcpool.MaxZChanged() world.refresh_atmos_grid() +/// Extools atmos /world/proc/refresh_atmos_grid() + +/world/proc/change_fps(new_value = 20) + if(new_value <= 0) + CRASH("change_fps() called with [new_value] new_value.") + if(fps == new_value) + return //No change required. + + fps = new_value + on_tickrate_change() + + +/world/proc/change_tick_lag(new_value = 0.5) + if(new_value <= 0) + CRASH("change_tick_lag() called with [new_value] new_value.") + if(tick_lag == new_value) + return //No change required. + + tick_lag = new_value + on_tickrate_change() + + +/world/proc/on_tickrate_change() + SStimer?.reset_buckets() diff --git a/code/modules/actionspeed/_actionspeed_modifier.dm b/code/modules/actionspeed/_actionspeed_modifier.dm new file mode 100644 index 0000000000..a2870be6f4 --- /dev/null +++ b/code/modules/actionspeed/_actionspeed_modifier.dm @@ -0,0 +1,175 @@ +/*! Actionspeed modification datums. + + How action speed for mobs works + +Action speed is now calculated by using modifier datums which are added to mobs. Some of them (nonvariable ones) are globally cached, the variable ones are instanced and changed based on need. + +This gives us the ability to have multiple sources of actionspeed, reliabily keep them applied and remove them when they should be + +THey can have unique sources and a bunch of extra fancy flags that control behaviour + +Previously trying to update action speed was a shot in the dark that usually meant mobs got stuck going faster or slower + +Actionspeed modification list is a simple key = datum system. Key will be the datum's ID if it is overridden to not be null, or type if it is not. + +DO NOT override datum IDs unless you are going to have multiple types that must overwrite each other. It's more efficient to use types, ID functionality is only kept for cases where dynamic creation of modifiers need to be done. + +When update actionspeed is called, the list of items is iterated, according to flags priority and a bunch of conditions +this spits out a final calculated value which is used as a modifer to last_move + modifier for calculating when a mob +can next move + +*/ + +/datum/actionspeed_modifier + /// Whether or not this is a variable modifier. Variable modifiers can NOT be ever auto-cached. ONLY CHECKED VIA INITIAL(), EFFECTIVELY READ ONLY (and for very good reason) + var/variable = FALSE + + /// Unique ID. You can never have different modifications with the same ID. By default, this SHOULD NOT be set. Only set it for cases where you're dynamically making modifiers/need to have two types overwrite each other. If unset, uses path (converted to text) as ID. + var/id + + /// Higher ones override lower priorities. This is NOT used for ID, ID must be unique, if it isn't unique the newer one overwrites automatically if overriding. + var/priority = 0 + var/flags = NONE + + /// Multiplicative slowdown + var/multiplicative_slowdown = 0 + + /// Other modification datums this conflicts with. + var/conflicts_with + +/datum/actionspeed_modifier/New() + . = ..() + if(!id) + id = "[type]" //We turn the path into a string. + +GLOBAL_LIST_EMPTY(actionspeed_modification_cache) + +/// Grabs a STATIC MODIFIER datum from cache. YOU MUST NEVER EDIT THESE DATUMS, OR IT WILL AFFECT ANYTHING ELSE USING IT TOO! +/proc/get_cached_actionspeed_modifier(modtype) + if(!ispath(modtype, /datum/actionspeed_modifier)) + CRASH("[modtype] is not a actionspeed modification typepath.") + var/datum/actionspeed_modifier/actionspeed_mod = modtype + if(initial(actionspeed_mod.variable)) + CRASH("[modtype] is a variable modifier, and can never be cached.") + actionspeed_mod = GLOB.actionspeed_modification_cache[modtype] + if(!actionspeed_mod) + actionspeed_mod = GLOB.actionspeed_modification_cache[modtype] = new modtype + return actionspeed_mod + +///Add a action speed modifier to a mob. If a variable subtype is passed in as the first argument, it will make a new datum. If ID conflicts, it will overwrite the old ID. +/mob/proc/add_actionspeed_modifier(datum/actionspeed_modifier/type_or_datum, update = TRUE) + if(ispath(type_or_datum)) + if(!initial(type_or_datum.variable)) + type_or_datum = get_cached_actionspeed_modifier(type_or_datum) + else + type_or_datum = new type_or_datum + var/datum/actionspeed_modifier/existing = LAZYACCESS(actionspeed_modification, type_or_datum.id) + if(existing) + if(existing == type_or_datum) //same thing don't need to touch + return TRUE + remove_actionspeed_modifier(existing, FALSE) + if(length(actionspeed_modification)) + BINARY_INSERT(type_or_datum.id, actionspeed_modification, /datum/actionspeed_modifier, type_or_datum, priority, COMPARE_VALUE) + LAZYSET(actionspeed_modification, type_or_datum.id, type_or_datum) + if(update) + update_actionspeed() + return TRUE + +/// Remove a action speed modifier from a mob, whether static or variable. +/mob/proc/remove_actionspeed_modifier(datum/actionspeed_modifier/type_id_datum, update = TRUE) + var/key + if(ispath(type_id_datum)) + key = initial(type_id_datum.id) || "[type_id_datum]" //id if set, path set to string if not. + else if(!istext(type_id_datum)) //if it isn't text it has to be a datum, as it isn't a type. + key = type_id_datum.id + else //assume it's an id + key = type_id_datum + if(!LAZYACCESS(actionspeed_modification, key)) + return FALSE + LAZYREMOVE(actionspeed_modification, key) + if(update) + update_actionspeed(FALSE) + return TRUE + +/*! Used for variable slowdowns like hunger/health loss/etc, works somewhat like the old list-based modification adds. Returns the modifier datum if successful + How this SHOULD work is: + 1. Ensures type_id_datum one way or another refers to a /variable datum. This makes sure it can't be cached. This includes if it's already in the modification list. + 2. Instantiate a new datum if type_id_datum isn't already instantiated + in the list, using the type. Obviously, wouldn't work for ID only. + 3. Add the datum if necessary using the regular add proc + 4. If any of the rest of the args are not null (see: multiplicative slowdown), modify the datum + 5. Update if necessary +*/ +/mob/proc/add_or_update_variable_actionspeed_modifier(datum/actionspeed_modifier/type_id_datum, update = TRUE, multiplicative_slowdown) + var/modified = FALSE + var/inject = FALSE + var/datum/actionspeed_modifier/final + if(istext(type_id_datum)) + final = LAZYACCESS(actionspeed_modification, type_id_datum) + if(!final) + CRASH("Couldn't find existing modification when provided a text ID.") + else if(ispath(type_id_datum)) + if(!initial(type_id_datum.variable)) + CRASH("Not a variable modifier") + final = LAZYACCESS(actionspeed_modification, initial(type_id_datum.id) || "[type_id_datum]") + if(!final) + final = new type_id_datum + inject = TRUE + modified = TRUE + else + if(!initial(type_id_datum.variable)) + CRASH("Not a variable modifier") + final = type_id_datum + if(!LAZYACCESS(actionspeed_modification, final.id)) + inject = TRUE + modified = TRUE + if(!isnull(multiplicative_slowdown)) + final.multiplicative_slowdown = multiplicative_slowdown + modified = TRUE + if(inject) + add_actionspeed_modifier(final, FALSE) + if(update && modified) + update_actionspeed(TRUE) + return final + +///Is there a actionspeed modifier for this mob +/mob/proc/has_actionspeed_modifier(datum/actionspeed_modifier/datum_type_id) + var/key + if(ispath(datum_type_id)) + key = initial(datum_type_id.id) || "[datum_type_id]" + else if(istext(datum_type_id)) + key = datum_type_id + else + key = datum_type_id.id + return LAZYACCESS(actionspeed_modification, key) + +/// Go through the list of actionspeed modifiers and calculate a final actionspeed. ANY ADD/REMOVE DONE IN UPDATE_actionspeed MUST HAVE THE UPDATE ARGUMENT SET AS FALSE! +/mob/proc/update_actionspeed() + . = 0 + var/list/conflict_tracker = list() + for(var/key in get_actionspeed_modifiers()) + var/datum/actionspeed_modifier/M = actionspeed_modification[key] + var/conflict = M.conflicts_with + var/amt = M.multiplicative_slowdown + if(conflict) + // Conflicting modifiers prioritize the larger slowdown or the larger speedup + // We purposefuly don't handle mixing speedups and slowdowns on the same id + if(abs(conflict_tracker[conflict]) < abs(amt)) + conflict_tracker[conflict] = amt + else + continue + . += amt + cached_multiplicative_actions_slowdown = . + +///Adds a default action speed +/mob/proc/initialize_actionspeed() + add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/base, multiplicative_slowdown = 1) + +/// Get the action speed modifiers list of the mob +/mob/proc/get_actionspeed_modifiers() + . = LAZYCOPY(actionspeed_modification) + for(var/id in actionspeed_mod_immunities) + . -= id + +/// Checks if a action speed modifier is valid and not missing any data +/proc/actionspeed_data_null_check(datum/actionspeed_modifier/M) //Determines if a data list is not meaningful and should be discarded. + . = !(M.multiplicative_slowdown) diff --git a/code/modules/actionspeed/modifiers/base.dm b/code/modules/actionspeed/modifiers/base.dm new file mode 100644 index 0000000000..97c5124c3b --- /dev/null +++ b/code/modules/actionspeed/modifiers/base.dm @@ -0,0 +1,2 @@ +/datum/actionspeed_modifier/base + variable = TRUE diff --git a/code/modules/actionspeed/modifiers/mood.dm b/code/modules/actionspeed/modifiers/mood.dm new file mode 100644 index 0000000000..d8ed005d42 --- /dev/null +++ b/code/modules/actionspeed/modifiers/mood.dm @@ -0,0 +1,7 @@ +/datum/actionspeed_modifier/low_sanity + multiplicative_slowdown = 0.25 + id = ACTIONSPEED_ID_SANITY + +/datum/actionspeed_modifier/high_sanity + multiplicative_slowdown = -0.1 + id = ACTIONSPEED_ID_SANITY diff --git a/code/modules/actionspeed/modifiers/status_effects.dm b/code/modules/actionspeed/modifiers/status_effects.dm new file mode 100644 index 0000000000..615346b790 --- /dev/null +++ b/code/modules/actionspeed/modifiers/status_effects.dm @@ -0,0 +1,5 @@ +/datum/actionspeed_modifier/timecookie + multiplicative_slowdown = -0.05 + +/datum/actionspeed_modifier/blunt_wound + variable = TRUE diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 4ddb92ab19..63facade2e 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -226,6 +226,14 @@ key_cache[key] = 0 return . +/proc/restore_stickybans() + for (var/banned_ckey in GLOB.stickybanadmintexts) + world.SetConfig("ban", banned_ckey, GLOB.stickybanadmintexts[banned_ckey]) + GLOB.stickybanadminexemptions = list() + GLOB.stickybanadmintexts = list() + if (GLOB.stickbanadminexemptiontimerid) + deltimer(GLOB.stickbanadminexemptiontimerid) + GLOB.stickbanadminexemptiontimerid = null #undef STICKYBAN_MAX_MATCHES #undef STICKYBAN_MAX_EXISTING_USER_MATCHES diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 8421d9955d..d4afc3dbb4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -12,7 +12,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////Panels /datum/admins/proc/show_player_panel(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Show Player Panel" set desc="Edit player (respawn, ban, heal, etc)" @@ -211,7 +211,7 @@ /datum/admins/proc/access_news_network() //MARKER - set category = "Fun" + set category = "Admin.Events" set name = "Access Newscaster Network" set desc = "Allows you to view, add and edit news feeds." @@ -679,8 +679,8 @@ set category = "Server" set desc="Respawn basically" set name="Toggle Respawn" - var/new_nores = !CONFIG_GET(flag/norespawn) - CONFIG_SET(flag/norespawn, new_nores) + var/new_nores = CONFIG_GET(flag/respawns_enabled) + CONFIG_SET(flag/respawns_enabled, !new_nores) if (!new_nores) to_chat(world, "You may now respawn.", confidential = TRUE) else @@ -783,10 +783,11 @@ if(ispath(chosen, /turf)) T.ChangeTurf(chosen) else - var/obj/structure/closet/supplypod/centcompod/pod = new() + var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas + var/obj/structure/closet/supplypod/centcompod/pod = new(pick(get_area_turfs(pod_storage_area))) //Lets just have it in the pod bay for a moment instead of runtiming var/atom/A = new chosen(pod) A.flags_1 |= ADMIN_SPAWNED_1 - new /obj/effect/abstract/DPtarget(T, pod) + new /obj/effect/pod_landingzone(T, pod) log_admin("[key_name(usr)] pod-spawned [chosen] at [AREACOORD(usr)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Podspawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 7e5c104d90..52be445120 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -6,7 +6,7 @@ /client/proc/investigate_show() set name = "Investigate" - set category = "Admin" + set category = "Admin.Game" if(!holder) return diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index ef4abeb0ad..39053b8e15 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -44,6 +44,11 @@ GLOBAL_PROTECT(protected_ranks) /datum/admin_rank/vv_edit_var(var_name, var_value) return FALSE +/datum/admin_rank/CanProcCall(procname) + . = ..() + if(!check_rights(R_SENSITIVE)) + return FALSE + /proc/admin_keyword_to_flag(word, previous_rights=0) var/flag = 0 switch(ckey(word)) @@ -79,6 +84,8 @@ GLOBAL_PROTECT(protected_ranks) flag = R_AUTOLOGIN if("dbranks") flag = R_DBRANKS + if("sensitive") + flag = R_SENSITIVE if("@","prev") flag = previous_rights return flag diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 2c4e7b4f6e..e2c12353f7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -78,8 +78,11 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/mark_datum_mapview, /client/proc/hide_verbs, /*hides all our adminverbs*/ /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ - /datum/admins/proc/open_borgopanel + /datum/admins/proc/open_borgopanel, + /client/proc/admin_cmd_respawn_return_to_lobby, + /client/proc/admin_cmd_remove_ghost_respawn_timer ) + GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel)) GLOBAL_PROTECT(admin_verbs_ban) GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/manual_play_web_sound, /client/proc/set_round_end_sound)) @@ -348,7 +351,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/admin_ghost() - set category = "Admin" + set category = "Admin.Game" set name = "Aghost" if(!holder) return FALSE @@ -379,7 +382,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/invisimin() set name = "Invisimin" - set category = "Admin" + set category = "Admin.Game" set desc = "Toggles ghost-like invisibility (Don't abuse this)" if(holder && mob) if(mob.invisibility == INVISIBILITY_OBSERVER) @@ -391,7 +394,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/check_antagonists() set name = "Check Antagonists" - set category = "Admin" + set category = "Admin.Game" if(holder) holder.check_antagonists() log_admin("[key_name(usr)] checked antagonists.") //for tsar~ @@ -411,14 +414,14 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/game_panel() set name = "Game Panel" - set category = "Admin" + set category = "Admin.Game" if(holder) holder.Game() SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/secrets() set name = "Secrets" - set category = "Admin" + set category = "Admin.Game" if (holder) holder.Secrets() SSblackbox.record_feedback("tally", "admin_verb", 1, "Secrets Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -472,7 +475,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_bomb() - set category = "Special Verbs" + set category = "Admin.Fun" set name = "Drop Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -514,7 +517,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_dynex_bomb() - set category = "Special Verbs" + set category = "Admin.Fun" set name = "Drop DynEx Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -561,7 +564,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("[key_name_admin(usr)] has modified Dynamic Explosion Scale: [ex_scale]") /client/proc/give_spell(mob/T in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Give Spell" set desc = "Gives a spell to a mob." @@ -585,7 +588,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("Spells given to mindless mobs will not be transferred in mindswap or cloning!") /client/proc/remove_spell(mob/T in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Remove Spell" set desc = "Remove a spell from the selected mob." @@ -598,7 +601,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_disease(mob/living/T in GLOB.mob_living_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Give Disease" set desc = "Gives a Disease to a mob." if(!istype(T)) @@ -613,7 +616,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].") /client/proc/object_say(obj/O in world) - set category = "Special Verbs" + set category = "Admin.Events" set name = "OSay" set desc = "Makes an object say something." var/message = input(usr, "What do you want the message to be?", "Make Sound") as text | null @@ -625,7 +628,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" - set category = "Special Verbs" + set category = "Admin.Events" if (!(holder.rank.rights & R_BUILDMODE)) return if(src.mob) @@ -634,7 +637,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/check_ai_laws() set name = "Check AI Laws" - set category = "Admin" + set category = "Admin.Game" if(holder) src.holder.output_ai_laws() @@ -717,7 +720,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/toggle_AI_interact() set name = "Toggle Admin AI Interact" - set category = "Admin" + set category = "Admin.Game" set desc = "Allows you to interact with most machines as an AI would as a ghost" AI_Interact = !AI_Interact diff --git a/code/modules/admin/adminmenu.dm b/code/modules/admin/adminmenu.dm index 64ce5987cf..b7d85ccff5 100644 --- a/code/modules/admin/adminmenu.dm +++ b/code/modules/admin/adminmenu.dm @@ -5,7 +5,7 @@ /datum/verbs/menu/Admin/verb/playerpanel() set name = "Player Panel" set desc = "Player Panel" - set category = "Admin" + set category = "Admin.Game" if(usr.client.holder) usr.client.holder.player_panel_new() SSblackbox.record_feedback("tally", "admin_verb", 1, "Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/check_antagonists.dm b/code/modules/admin/check_antagonists.dm index c5861b95e1..532a11a532 100644 --- a/code/modules/admin/check_antagonists.dm +++ b/code/modules/admin/check_antagonists.dm @@ -212,4 +212,4 @@ dat += build_antag_listing() dat += "" - usr << browse(dat.Join(), "window=roundstatus;size=500x500") \ No newline at end of file + usr << browse(dat.Join(), "window=roundstatus;size=500x500") diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index e287d9b1b3..0679d9ffac 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -33,7 +33,9 @@ H.saved_socks = H.socks // Mutant randomizing, doesn't affect the mob appearance unless it's the specific mutant. - H.dna.features["mcolor"] = random_short_color() + H.dna.features["mcolor"] = sanitize_hexcolor(random_short_color(), 6) + H.dna.features["mcolor2"] = sanitize_hexcolor(random_short_color(), 6) + H.dna.features["mcolor3"] = sanitize_hexcolor(random_short_color(), 6) H.dna.features["tail_lizard"] = pick(GLOB.tails_list_lizard) H.dna.features["snout"] = pick(GLOB.snouts_list) H.dna.features["horns"] = pick(GLOB.horns_list) @@ -43,6 +45,9 @@ H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list) H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list) H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list) + H.dna.features["arachnid_legs"] = pick(GLOB.arachnid_legs_list) + H.dna.features["arachnid_spinneret"] = pick(GLOB.arachnid_spinneret_list) + H.dna.features["arachnid_mandibles"] = pick(GLOB.arachnid_mandibles_list) H.dna.features["flavor_text"] = "" //Oh no. H.dna.features["body_model"] = H.gender diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 09f9664295..8f4a9742ea 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -28,6 +28,11 @@ GLOBAL_PROTECT(href_token) var/deadmined +/datum/admins/CanProcCall(procname) + . = ..() + if(!check_rights(R_SENSITIVE)) + return FALSE + /datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE, protected) if(IsAdminAdvancedProcCall()) var/msg = " has tried to elevate permissions!" @@ -147,6 +152,8 @@ GLOBAL_PROTECT(href_token) return 0 /datum/admins/vv_edit_var(var_name, var_value) + if(var_name == NAMEOF(src, fakekey)) + return ..() return FALSE //nice try trialmin /* diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm index 346f0e9790..05f7465b03 100644 --- a/code/modules/admin/permissionedit.dm +++ b/code/modules/admin/permissionedit.dm @@ -287,7 +287,7 @@ R = rank_names[new_rank] if(!R) //rank with that name doesn't exist yet - make it if(D) - R = new(new_rank, D.rank.rights) //duplicate our previous admin_rank but with a new name + R = new(new_rank, D.rank.rights, D.rank.exclude_rights, D.rank.can_edit_rights) //duplicate our previous admin_rank but with a new name else R = new(new_rank) //blank new admin_rank GLOB.admin_ranks += R diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 41662c1cad..ffe5371619 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -131,7 +131,7 @@ for(var/mob/living/mob in thunderdome) qdel(mob) //Clear mobs for(var/obj/obj in thunderdome) - if(!istype(obj, /obj/machinery/camera)) + if(!istype(obj, /obj/machinery/camera) && !istype(obj, /obj/effect/abstract/proximity_checker)) qdel(obj) //Clear objects var/area/template = locate(/area/tdome/arena_source) diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm index 56c778dc85..ad9c995aa1 100644 --- a/code/modules/admin/sound_emitter.dm +++ b/code/modules/admin/sound_emitter.dm @@ -52,11 +52,9 @@ edit_emitter(user) /obj/effect/sound_emitter/AltClick(mob/user) - . = ..() if(check_rights_for(user.client, R_SOUNDS)) activate(user) - to_chat(user, "Sound emitter activated.") - return TRUE + to_chat(user, "Sound emitter activated.", confidential = TRUE) /obj/effect/sound_emitter/proc/edit_emitter(mob/user) var/dat = "" @@ -84,20 +82,20 @@ if(!new_label) return maptext = new_label - to_chat(user, "Label set to [maptext].") + to_chat(user, "Label set to [maptext].", confidential = TRUE) if(href_list["edit_sound_file"]) var/new_file = input(user, "Choose a sound file.", "Sound Emitter") as null|sound if(!new_file) return sound_file = new_file - to_chat(user, "New sound file set to [sound_file].") + to_chat(user, "New sound file set to [sound_file].", confidential = TRUE) if(href_list["edit_volume"]) var/new_volume = input(user, "Choose a volume.", "Sound Emitter", sound_volume) as null|num if(isnull(new_volume)) return new_volume = clamp(new_volume, 0, 100) sound_volume = new_volume - to_chat(user, "Volume set to [sound_volume]%.") + to_chat(user, "Volume set to [sound_volume]%.", confidential = TRUE) if(href_list["edit_mode"]) var/new_mode var/mode_list = list("Local (normal sound)" = SOUND_EMITTER_LOCAL, "Direct (not affected by environment/location)" = SOUND_EMITTER_DIRECT) @@ -105,7 +103,7 @@ if(!new_mode) return motus_operandi = mode_list[new_mode] - to_chat(user, "Mode set to [motus_operandi].") + to_chat(user, "Mode set to [motus_operandi].", confidential = TRUE) if(href_list["edit_range"]) var/new_range var/range_list = list("Radius (all mobs within a radius)" = SOUND_EMITTER_RADIUS, "Z-Level (all mobs on the same z)" = SOUND_EMITTER_ZLEVEL, "Global (all players)" = SOUND_EMITTER_GLOBAL) @@ -113,14 +111,14 @@ if(!new_range) return emitter_range = range_list[new_range] - to_chat(user, "Range set to [emitter_range].") + to_chat(user, "Range set to [emitter_range].", confidential = TRUE) if(href_list["edit_radius"]) var/new_radius = input(user, "Choose a radius.", "Sound Emitter", sound_volume) as null|num if(isnull(new_radius)) return new_radius = clamp(new_radius, 0, 127) play_radius = new_radius - to_chat(user, "Audible radius set to [play_radius].") + to_chat(user, "Audible radius set to [play_radius].", confidential = TRUE) if(href_list["play"]) activate(user) edit_emitter(user) //Refresh the UI to see our changes diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 356746ddbc..4218d4238f 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -298,7 +298,9 @@ browse_messages(target_ckey = ckey(target_key), agegate = TRUE) qdel(query_find_message_secret) -/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE) +/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE, override = FALSE) + if((!override || IsAdminAdvancedProcCall()) && !check_rights(R_SENSITIVE)) + return if(!SSdbcore.Connect()) to_chat(usr, "Failed to establish database connection.") return diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index df6a9b89ad..ef0bfe8e70 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -7,7 +7,7 @@ if ("add") var/list/ban = list() var/ckey - ban["admin"] = usr.key + ban["admin"] = usr.ckey ban["type"] = list("sticky") ban["reason"] = "(InGameBan)([usr.key])" //this will be displayed in dd only @@ -21,7 +21,8 @@ ban["ckey"] = ckey if (get_stickyban_from_ckey(ckey)) - to_chat(usr, "Error: Can not add a stickyban: User already has a current sticky ban") + to_chat(usr, "Error: Can not add a stickyban: User already has a current sticky ban", confidential = TRUE) + return if (data["reason"]) ban["message"] = data["reason"] @@ -31,7 +32,26 @@ return ban["message"] = "[reason]" + if(SSdbcore.Connect()) // todo: second wave + // var/datum/db_query/query_create_stickyban = SSdbcore.NewQuery({" + // INSERT INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) + // VALUES (:ckey, :message, :banning_admin) + // "}, list("ckey" = ckey, "message" = ban["message"], "banning_admin" = usr.ckey)) + var/datum/DBQuery/query_create_stickyban = SSdbcore.NewQuery({" + INSERT INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) + VALUES ([ckey], [ban["message"]], [usr.ckey]) + "}) + if (query_create_stickyban.warn_execute()) + ban["fromdb"] = TRUE + qdel(query_create_stickyban) + world.SetConfig("ban",ckey,list2stickyban(ban)) + ban = stickyban2list(list2stickyban(ban)) + ban["matches_this_round"] = list() + ban["existing_user_matches_this_round"] = list() + ban["admin_matches_this_round"] = list() + ban["pending_matches_this_round"] = list() + SSstickyban.cache[ckey] = ban log_admin_private("[key_name(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") message_admins("[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") @@ -43,14 +63,29 @@ var/ban = get_stickyban_from_ckey(ckey) if (!ban) - to_chat(usr, "Error: No sticky ban for [ckey] found!") + to_chat(usr, "Error: No sticky ban for [ckey] found!", confidential = TRUE) return if (alert("Are you sure you want to remove the sticky ban on [ckey]?","Are you sure","Yes","No") == "No") return if (!get_stickyban_from_ckey(ckey)) - to_chat(usr, "Error: The ban disappeared.") + to_chat(usr, "Error: The ban disappeared.", confidential = TRUE) return world.SetConfig("ban",ckey, null) + SSstickyban.cache -= ckey + + if (SSdbcore.Connect()) + // SSdbcore.QuerySelect(list( + // SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = :ckey", list("ckey" = ckey)), + // SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = :ckey", list("ckey" = ckey)), + // SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_cid")] WHERE stickyban = :ckey", list("ckey" = ckey)), + // SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ip")] WHERE stickyban = :ckey", list("ckey" = ckey)) + // ), warn = TRUE, qdel = TRUE) + SSdbcore.QuerySelect(list( + SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = [ckey]"), + SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = [ckey]"), + SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_cid")] WHERE stickyban = [ckey]"), + SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ip")] WHERE stickyban = [ckey]") + ), warn = TRUE, qdel = TRUE) log_admin_private("[key_name(usr)] removed [ckey]'s stickyban") message_admins("[key_name_admin(usr)] removed [ckey]'s stickyban") @@ -64,42 +99,45 @@ var/alt = ckey(data["alt"]) var/ban = get_stickyban_from_ckey(ckey) if (!ban) - to_chat(usr, "Error: No sticky ban for [ckey] found!") + to_chat(usr, "Error: No sticky ban for [ckey] found!", confidential = TRUE) return - var/found = 0 - //we have to do it this way because byond keeps the case in its sticky ban matches WHY!!! - for (var/key in ban["keys"]) - if (ckey(key) == alt) - found = 1 - break - - if (!found) - to_chat(usr, "Error: [alt] is not linked to [ckey]'s sticky ban!") + var/key = LAZYACCESS(ban["keys"], alt) + if (!key) + to_chat(usr, "Error: [alt] is not linked to [ckey]'s sticky ban!", confidential = TRUE) return - if (alert("Are you sure you want to disassociate [alt] from [ckey]'s sticky ban? \nNote: Nothing stops byond from re-linking them","Are you sure","Yes","No") == "No") + if (alert("Are you sure you want to disassociate [alt] from [ckey]'s sticky ban? \nNote: Nothing stops byond from re-linking them, Use \[E] to exempt them","Are you sure","Yes","No") == "No") return //we have to do this again incase something changes ban = get_stickyban_from_ckey(ckey) if (!ban) - to_chat(usr, "Error: The ban disappeared.") + to_chat(usr, "Error: The ban disappeared.", confidential = TRUE) return - found = 0 - for (var/key in ban["keys"]) - if (ckey(key) == alt) - ban["keys"] -= key - found = 1 - break + key = LAZYACCESS(ban["keys"], alt) - if (!found) - to_chat(usr, "Error: [alt] link to [ckey]'s sticky ban disappeared.") + if (!key) + to_chat(usr, "Error: [alt] link to [ckey]'s sticky ban disappeared.", confidential = TRUE) return + LAZYREMOVE(ban["keys"], alt) world.SetConfig("ban",ckey,list2stickyban(ban)) + SSstickyban.cache[ckey] = ban + + if (SSdbcore.Connect()) + // var/datum/db_query/query_remove_stickyban_alt = SSdbcore.NewQuery( + // "DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = :ckey AND matched_ckey = :alt", + // list("ckey" = ckey, "alt" = alt) + // ) + var/datum/DBQuery/query_remove_stickyban_alt = SSdbcore.NewQuery( + "DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = [ckey] AND matched_ckey = [alt]" + ) + query_remove_stickyban_alt.warn_execute() + qdel(query_remove_stickyban_alt) + log_admin_private("[key_name(usr)] has disassociated [alt] from [ckey]'s sticky ban") message_admins("[key_name_admin(usr)] has disassociated [alt] from [ckey]'s sticky ban") @@ -109,7 +147,7 @@ var/ckey = data["ckey"] var/ban = get_stickyban_from_ckey(ckey) if (!ban) - to_chat(usr, "Error: No sticky ban for [ckey] found!") + to_chat(usr, "Error: No sticky ban for [ckey] found!", confidential = TRUE) return var/oldreason = ban["message"] var/reason = input(usr,"Reason","Reason","[ban["message"]]") as text|null @@ -118,28 +156,203 @@ //we have to do this again incase something changed while we waited for input ban = get_stickyban_from_ckey(ckey) if (!ban) - to_chat(usr, "Error: The ban disappeared.") + to_chat(usr, "Error: The ban disappeared.", confidential = TRUE) return ban["message"] = "[reason]" world.SetConfig("ban",ckey,list2stickyban(ban)) + SSstickyban.cache[ckey] = ban + + if (SSdbcore.Connect()) + // var/datum/db_query/query_edit_stickyban = SSdbcore.NewQuery( + // "UPDATE [format_table_name("stickyban")] SET reason = :reason WHERE ckey = :ckey", + // list("reason" = reason, "ckey" = ckey) + // ) + var/datum/DBQuery/query_edit_stickyban = SSdbcore.NewQuery( + "UPDATE [format_table_name("stickyban")] SET reason = [reason] WHERE ckey = [ckey]" + ) + query_edit_stickyban.warn_execute() + qdel(query_edit_stickyban) + log_admin_private("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") message_admins("[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") + if ("exempt") + if (!data["ckey"]) + return + var/ckey = data["ckey"] + if (!data["alt"]) + return + var/alt = ckey(data["alt"]) + var/ban = get_stickyban_from_ckey(ckey) + if (!ban) + to_chat(usr, "Error: No sticky ban for [ckey] found!", confidential = TRUE) + return + + var/key = LAZYACCESS(ban["keys"], alt) + if (!key) + to_chat(usr, "Error: [alt] is not linked to [ckey]'s sticky ban!", confidential = TRUE) + return + + if (alert("Are you sure you want to exempt [alt] from [ckey]'s sticky ban?","Are you sure","Yes","No") == "No") + return + + //we have to do this again incase something changes + ban = get_stickyban_from_ckey(ckey) + if (!ban) + to_chat(usr, "Error: The ban disappeared.", confidential = TRUE) + return + + key = LAZYACCESS(ban["keys"], alt) + + if (!key) + to_chat(usr, "Error: [alt]'s link to [ckey]'s sticky ban disappeared.", confidential = TRUE) + return + LAZYREMOVE(ban["keys"], alt) + key["exempt"] = TRUE + LAZYSET(ban["whitelist"], alt, key) + + world.SetConfig("ban",ckey,list2stickyban(ban)) + + SSstickyban.cache[ckey] = ban + + if (SSdbcore.Connect()) + // var/datum/db_query/query_exempt_stickyban_alt = SSdbcore.NewQuery( + // "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 1 WHERE stickyban = :ckey AND matched_ckey = :alt", + // list("ckey" = ckey, "alt" = alt) + // ) + var/datum/DBQuery/query_exempt_stickyban_alt = SSdbcore.NewQuery( + "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 1 WHERE stickyban = [ckey] AND matched_ckey = [alt]" + ) + query_exempt_stickyban_alt.warn_execute() + qdel(query_exempt_stickyban_alt) + + log_admin_private("[key_name(usr)] has exempted [alt] from [ckey]'s sticky ban") + message_admins("[key_name_admin(usr)] has exempted [alt] from [ckey]'s sticky ban") + + if ("unexempt") + if (!data["ckey"]) + return + var/ckey = data["ckey"] + if (!data["alt"]) + return + var/alt = ckey(data["alt"]) + var/ban = get_stickyban_from_ckey(ckey) + if (!ban) + to_chat(usr, "Error: No sticky ban for [ckey] found!", confidential = TRUE) + return + + var/key = LAZYACCESS(ban["whitelist"], alt) + if (!key) + to_chat(usr, "Error: [alt] is not exempt from [ckey]'s sticky ban!", confidential = TRUE) + return + + if (alert("Are you sure you want to unexempt [alt] from [ckey]'s sticky ban?","Are you sure","Yes","No") == "No") + return + + //we have to do this again incase something changes + ban = get_stickyban_from_ckey(ckey) + if (!ban) + to_chat(usr, "Error: The ban disappeared.", confidential = TRUE) + return + + key = LAZYACCESS(ban["whitelist"], alt) + if (!key) + to_chat(usr, "Error: [alt]'s exemption from [ckey]'s sticky ban disappeared.", confidential = TRUE) + return + + LAZYREMOVE(ban["whitelist"], alt) + key["exempt"] = FALSE + LAZYSET(ban["keys"], alt, key) + + world.SetConfig("ban",ckey,list2stickyban(ban)) + + SSstickyban.cache[ckey] = ban + + if (SSdbcore.Connect()) + // var/datum/db_query/query_unexempt_stickyban_alt = SSdbcore.NewQuery( + // "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 0 WHERE stickyban = :ckey AND matched_ckey = :alt", + // list("ckey" = ckey, "alt" = alt) + // ) + var/datum/DBQuery/query_unexempt_stickyban_alt = SSdbcore.NewQuery( + "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 0 WHERE stickyban = [ckey] AND matched_ckey = [alt]" + ) + query_unexempt_stickyban_alt.warn_execute() + qdel(query_unexempt_stickyban_alt) + + log_admin_private("[key_name(usr)] has unexempted [alt] from [ckey]'s sticky ban") + message_admins("[key_name_admin(usr)] has unexempted [alt] from [ckey]'s sticky ban") + + if ("timeout") + if (!data["ckey"]) + return + if (!SSdbcore.Connect()) + to_chat(usr, "No database connection!", confidential = TRUE) + return + + var/ckey = data["ckey"] + + if (alert("Are you sure you want to put [ckey]'s stickyban on timeout until next round (or removed)?","Are you sure","Yes","No") == "No") + return + var/ban = get_stickyban_from_ckey(ckey) + if (!ban) + to_chat(usr, "Error: No sticky ban for [ckey] found!", confidential = TRUE) + return + + ban["timeout"] = TRUE + + world.SetConfig("ban", ckey, null) + + var/cachedban = SSstickyban.cache[ckey] + if (cachedban) + cachedban["timeout"] = TRUE + + log_admin_private("[key_name(usr)] has put [ckey]'s sticky ban on timeout.") + message_admins("[key_name_admin(usr)] has put [ckey]'s sticky ban on timeout.") + + if ("untimeout") + if (!data["ckey"]) + return + if (!SSdbcore.Connect()) + to_chat(usr, "No database connection!", confidential = TRUE) + return + var/ckey = data["ckey"] + + if (alert("Are you sure you want to lift the timeout on [ckey]'s stickyban?","Are you sure","Yes","No") == "No") + return + + var/ban = get_stickyban_from_ckey(ckey) + var/cachedban = SSstickyban.cache[ckey] + if (cachedban) + cachedban["timeout"] = FALSE + if (!ban) + if (!cachedban) + to_chat(usr, "Error: No sticky ban for [ckey] found!", confidential = TRUE) + return + ban = cachedban + + ban["timeout"] = FALSE + + world.SetConfig("ban",ckey,list2stickyban(ban)) + + log_admin_private("[key_name(usr)] has taken [ckey]'s sticky ban off of timeout.") + message_admins("[key_name_admin(usr)] has taken [ckey]'s sticky ban off of timeout.") + + if ("revert") if (!data["ckey"]) return var/ckey = data["ckey"] - if (alert("Are you sure you want to revert the sticky ban on [ckey] to its state at round start?","Are you sure","Yes","No") == "No") + if (alert("Are you sure you want to revert the sticky ban on [ckey] to its state at round start (or last edit)?","Are you sure","Yes","No") == "No") return var/ban = get_stickyban_from_ckey(ckey) if (!ban) - to_chat(usr, "Error: No sticky ban for [ckey] found!") + to_chat(usr, "Error: No sticky ban for [ckey] found!", confidential = TRUE) return var/cached_ban = SSstickyban.cache[ckey] if (!cached_ban) - to_chat(usr, "Error: No cached sticky ban for [ckey] found!") + to_chat(usr, "Error: No cached sticky ban for [ckey] found!", confidential = TRUE) world.SetConfig("ban",ckey,null) log_admin_private("[key_name(usr)] has reverted [ckey]'s sticky ban to its state at round start.") @@ -150,14 +363,22 @@ world.SetConfig("ban",ckey,list2stickyban(cached_ban)) -/datum/admins/proc/stickyban_gethtml(ckey, ban) - . = {" +/datum/admins/proc/stickyban_gethtml(ckey) + var/ban = get_stickyban_from_ckey(ckey) + if (!ban) + return + var/timeout + if (SSdbcore.Connect()) + timeout = "\[[(ban["timeout"] ? "untimeout" : "timeout" )]\]" + else + timeout = "\[revert\]" + . = list({" \[-\] - \[revert\] + [timeout] [ckey]
    " [ban["message"]] \[Edit\]
    - "} + "}) if (ban["admin"]) . += "[ban["admin"]]
    " else @@ -166,19 +387,24 @@ for (var/key in ban["keys"]) if (ckey(key) == ckey) continue - . += "
  • \[-\][key]
  • " + . += "
  • \[-\][key]\[E\]
  • " + + for (var/key in ban["whitelist"]) + if (ckey(key) == ckey) + continue + . += "
  • \[-\][key]\[UE\]
  • " + . += "\n" /datum/admins/proc/stickyban_show() if(!check_rights(R_BAN)) return - var/list/bans = sortList(world.GetConfig("ban")) - var/banhtml = "" + var/list/bans = sticky_banned_ckeys() + var/list/banhtml = list() for(var/key in bans) var/ckey = ckey(key) - var/ban = stickyban2list(world.GetConfig("ban",key)) banhtml += "

    \n" - banhtml += stickyban_gethtml(ckey,ban) + banhtml += stickyban_gethtml(ckey) var/html = {" @@ -186,22 +412,49 @@

    All Sticky Bans:

    \[+\]
    - [banhtml] + [banhtml.Join("")] "} usr << browse(html,"window=stickybans;size=700x400") -/proc/get_stickyban_from_ckey(var/ckey) +/proc/sticky_banned_ckeys() + if (SSdbcore.Connect() || length(SSstickyban.dbcache)) + if (SSstickyban.dbcacheexpire < world.time) + SSstickyban.Populatedbcache() + if (SSstickyban.dbcacheexpire) + return SSstickyban.dbcache.Copy() + + return sortList(world.GetConfig("ban")) + + +/proc/get_stickyban_from_ckey(ckey) + . = list() if (!ckey) return null - ckey = ckey(ckey) - . = null - for (var/key in world.GetConfig("ban")) - if (ckey(key) == ckey) - . = stickyban2list(world.GetConfig("ban",key)) - break + if (SSdbcore.Connect() || length(SSstickyban.dbcache)) + if (SSstickyban.dbcacheexpire < world.time) + SSstickyban.Populatedbcache() + if (SSstickyban.dbcacheexpire) + . = SSstickyban.dbcache[ckey] + //reset the cache incase its a newer ban (but only if we didn't update the cache recently) + if (!. && SSstickyban.dbcacheexpire != world.time+STICKYBAN_DB_CACHE_TIME) + SSstickyban.dbcacheexpire = 1 + SSstickyban.Populatedbcache() + . = SSstickyban.dbcache[ckey] + if (.) + var/list/cachedban = SSstickyban.cache["[ckey]"] + if (cachedban) + .["timeout"] = cachedban["timeout"] -/proc/stickyban2list(var/ban) + .["fromdb"] = TRUE + return + + . = stickyban2list(world.GetConfig("ban", ckey)) || stickyban2list(world.GetConfig("ban", ckey(ckey))) || list() + + if (!length(.)) + return null + +/proc/stickyban2list(ban, strictdb = TRUE) if (!ban) return null . = params2list(ban) @@ -212,30 +465,40 @@ var/ckey = ckey(key) ckeys[ckey] = ckey //to make searching faster. .["keys"] = ckeys + if (.["whitelist"]) + var/keys = splittext(.["whitelist"], ",") + var/ckeys = list() + for (var/key in keys) + var/ckey = ckey(key) + ckeys[ckey] = ckey //to make searching faster. + .["whitelist"] = ckeys .["type"] = splittext(.["type"], ",") .["IP"] = splittext(.["IP"], ",") .["computer_id"] = splittext(.["computer_id"], ",") + . -= "fromdb" -/proc/list2stickyban(var/list/ban) +/proc/list2stickyban(list/ban) if (!ban || !islist(ban)) return null . = ban.Copy() if (.["keys"]) .["keys"] = jointext(.["keys"], ",") + if (.["IP"]) + .["IP"] = jointext(.["IP"], ",") + if (.["computer_id"]) + .["computer_id"] = jointext(.["computer_id"], ",") + if (.["whitelist"]) + .["whitelist"] = jointext(.["whitelist"], ",") if (.["type"]) .["type"] = jointext(.["type"], ",") - //internal tracking only, shouldn't be stored + . -= "reverting" + . -= "matches_this_round" . -= "existing_user_matches_this_round" . -= "admin_matches_this_round" - . -= "matches_this_round" - . -= "reverting" + . -= "pending_matches_this_round" - //storing these can sometimes cause sticky bans to start matching everybody - // and isn't even needed for sticky ban matching, as the hub tracks these separately - . -= "IP" - . -= "computer_id" . = list2params(.) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 13e8877440..86ddc24ca3 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -257,9 +257,8 @@ for(var/mob/M in GLOB.player_list) if(M.ckey == banckey) - playermob = M - break - + if(!playermob || M.client) // prioritise mobs with a client to stop the 'oops the dead body with no client got forwarded' + playermob = M banreason = "(MANUAL BAN) "+banreason @@ -508,7 +507,7 @@ if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob ) if("shade") - M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob ) + M.change_mob_type( /mob/living/simple_animal/hostile/construct/shade , null, null, delmob ) /////////////////////////////////////new ban stuff @@ -936,6 +935,12 @@ else dat += "
    " + //Respawns + if(jobban_isbanned(M, ROLE_RESPAWN)) + dat += "" + else + dat += "" + dat += "
    Damage:BruteBurnToxin[HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM) ? "Corruption" :"Toxin"]Suffocation
    Overall:[brute_loss]Mind Transfer PotionRespawnsRespawns
    " usr << browse(dat, "window=jobban2;size=800x450") return @@ -1799,12 +1804,15 @@ if(alert(usr, "Send [key_name(M)] back to Lobby?", "Message", "Yes", "No") != "Yes") return - log_admin("[key_name(usr)] has sent [key_name(M)] back to the Lobby.") - message_admins("[key_name(usr)] has sent [key_name(M)] back to the Lobby.") + log_admin("[key_name(usr)] has sent [key_name(M)] back to the Lobby, removing their respawn restrictions if they existed.") + message_admins("[key_name(usr)] has sent [key_name(M)] back to the Lobby, removing their respawn restrictions if they existed.") var/mob/dead/new_player/NP = new() NP.ckey = M.ckey qdel(M) + if(GLOB.preferences_datums[NP.ckey]) + var/datum/preferences/P = GLOB.preferences_datums[NP.ckey] + P.respawn_restrictions_active = FALSE else if(href_list["tdome1"]) if(!check_rights(R_FUN)) @@ -2475,7 +2483,7 @@ R.activate_module(I) if(pod) - new /obj/effect/abstract/DPtarget(target, pod) + new /obj/effect/pod_landingzone(target, pod) if (number == 1) log_admin("[key_name(usr)] created a [english_list(paths)]") diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 97d912cb9e..f2c10ecc1c 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -782,7 +782,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if(temp.vars.Find(v)) temp.vars[v] = SDQL_expression(d, set_list[sets]) else - temp.vv_edit_var(v, SDQL_expression(d, set_list[sets])) + temp.vv_edit_var(v, SDQL_expression(d, set_list[sets]), TRUE) break if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client))) temp = temp.vars[v] diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 4348ae7661..45d05c70b9 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -174,7 +174,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //is_bwoink is TRUE if this ticket was started by an admin PM /datum/admin_help/New(msg, client/C, is_bwoink) //clean the input msg - msg = sanitize(copytext_char(msg,1,MAX_MESSAGE_LEN)) + msg = copytext_char(msg,1,MAX_MESSAGE_LEN) if(!msg || !C || !C.mob) qdel(src) return @@ -263,7 +263,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //message from the initiator without a target, all admins will see this //won't bug irc /datum/admin_help/proc/MessageNoRecipient(msg) - msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) + msg = copytext_char(msg, 1, MAX_MESSAGE_LEN) var/ref_src = "[REF(src)]" //Message to be sent to all admins var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]" @@ -523,7 +523,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(handle_spam_prevention(msg,MUTE_ADMINHELP)) return - msg = trim(msg) + msg = sanitize(trim(msg)) if(!msg) return diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 257c1d275a..2f89dc82eb 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -1,7 +1,7 @@ /client/proc/jumptoarea(area/A in GLOB.sortedAreas) set name = "Jump to Area" set desc = "Area to jump to" - set category = "Admin" + set category = "Admin.Game" if(!src.holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) return @@ -28,7 +28,7 @@ /client/proc/jumptoturf(turf/T in world) set name = "Jump to Turf" - set category = "Admin" + set category = "Admin.Game" if(!src.holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) return @@ -40,7 +40,7 @@ return /client/proc/jumptomob(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Mob" if(!src.holder) @@ -59,7 +59,7 @@ to_chat(A, "This mob is not located in the game world.", confidential = TRUE) /client/proc/jumptocoord(tx as num, ty as num, tz as num) - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Coordinate" if (!holder) @@ -74,7 +74,7 @@ message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]") /client/proc/jumptokey() - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Key" if(!src.holder) @@ -97,7 +97,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getmob(mob/M in GLOB.mob_list - GLOB.dummy_mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Get Mob" set desc = "Mob to teleport" if(!src.holder) @@ -113,7 +113,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getkey() - set category = "Admin" + set category = "Admin.Game" set name = "Get Key" set desc = "Key to teleport" @@ -141,7 +141,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/sendmob(mob/M in sortmobs()) - set category = "Admin" + set category = "Admin.Game" set name = "Send Mob" if(!src.holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) @@ -158,3 +158,19 @@ else to_chat(src, "Failed to move mob to a valid location.", confidential = TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Send Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/// Proc to hook user-enacted teleporting behavior and keep logging of the event. +/atom/movable/proc/admin_teleport(atom/new_location, message = TRUE) + if(isnull(new_location)) + log_admin("[key_name(usr)] teleported [key_name(src)] to nullspace") + moveToNullspace() + else + log_admin("[key_name(usr)] teleported [key_name(src)] to [AREACOORD(loc)]") + forceMove(new_location) + +/mob/admin_teleport(atom/new_location, message = TRUE) + var/msg = "[key_name_admin(usr)] teleported [ADMIN_LOOKUPFLW(src)] to [isnull(new_location) ? "nullspace" : ADMIN_VERBOSEJMP(loc)]" + if(message) + message_admins(msg) + admin_ticket_log(src, msg) + return ..() diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 2931c52a5c..ab0b0d933a 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -113,7 +113,6 @@ to_chat(src, "Error: Use the admin IRC/Discord channel, nerd.", confidential = TRUE) return - else //get message text, limit it's length.and clean/escape html if(!msg) @@ -128,11 +127,16 @@ else if(holder) to_chat(src, "Error: Admin-PM: Client not found.", confidential = TRUE) - to_chat(src, "Message not sent:
    [msg]", confidential = TRUE) + to_chat(src, "Message not sent:
    [sanitize(msg)]", confidential = TRUE) if(recipient_ticket) recipient_ticket.AddInteraction("No client found, message not sent:
    [msg]") return else + //clean the message if it's not sent by a high-rank admin + if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots + msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) + if(!msg) + return current_ticket.MessageNoRecipient(msg) return @@ -141,7 +145,7 @@ to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).", confidential = TRUE) return - if (src.handle_spam_prevention(msg,MUTE_ADMINHELP)) + if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) return //clean the message if it's not sent by a high-rank admin diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index be22c889f0..4b60ecc0ff 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -1,5 +1,5 @@ /datum/admins/proc/open_borgopanel(borgo in GLOB.silicon_mobs) - set category = "Admin" + set category = "Admin.Game" set name = "Show Borg Panel" set desc = "Show borg panel" diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 9b27a8d8e9..b23cd0af0b 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,6 +1,6 @@ /client/proc/cinematic() set name = "cinematic" - set category = "Fun" + set category = "Admin.Fun" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. set hidden = 1 if(!SSticker) @@ -8,4 +8,4 @@ var/datum/cinematic/choice = input(src,"Cinematic","Choose",null) as anything in subtypesof(/datum/cinematic) if(choice) - Cinematic(initial(choice.id),world,null) \ No newline at end of file + Cinematic(initial(choice.id),world,null) diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 66acc0f667..1cddbe9509 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -1,5 +1,5 @@ /client/proc/dsay(msg as text) - set category = "Special Verbs" + set category = "Admin.Game" set name = "Dsay" set hidden = 1 if(!holder) @@ -23,13 +23,6 @@ var/rendered = "DEAD: [uppertext(holder.rank)]([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[emoji_parse(msg)]\"" - // var/rank_name = holder.rank - // var/admin_name = key - // if(holder.fakekey) - // rank_name = pick(strings("admin_nicknames.json", "ranks", "config")) please use this soon. - // admin_name = pick(strings("admin_nicknames.json", "names", "config")) - // var/rendered = "DEAD: [rank_name]([admin_name]) says, \"[emoji_parse(msg)]\"" - for (var/mob/M in GLOB.player_list) if(isnewplayer(M)) continue diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index f068f05a4a..5704448053 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -27,7 +27,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make Robot" if(!SSticker.HasRoundStarted()) @@ -43,7 +43,7 @@ alert("Invalid mob") /client/proc/cmd_admin_blobize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make Blob" if(!SSticker.HasRoundStarted()) @@ -58,7 +58,7 @@ /client/proc/cmd_admin_animalize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make Simple Animal" if(!SSticker.HasRoundStarted()) @@ -79,7 +79,7 @@ /client/proc/makepAI(turf/T in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make pAI" set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI" @@ -106,7 +106,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_alienize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make Alien" if(!SSticker.HasRoundStarted()) @@ -121,7 +121,7 @@ alert("Invalid mob") /client/proc/cmd_admin_slimeize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make slime" if(!SSticker.HasRoundStarted()) @@ -211,7 +211,7 @@ message_admins("[key_name_admin(usr)] has granted [M.key] full access.") /client/proc/cmd_assume_direct_control(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Assume direct control" set desc = "Direct intervention" @@ -229,6 +229,33 @@ qdel(adminmob) SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/cmd_give_direct_control(mob/M in GLOB.mob_list) + set category = "Admin.Game" + set name = "Give direct control" + + if(!M) + return + if(M.ckey) + if(alert("This mob is being controlled by [M.key]. Are you sure you wish to give someone else control of it? [M.key] will be made a ghost.",,"Yes","No") != "Yes") + return + var/client/newkey = input(src, "Pick the player to put in control.", "New player") as null|anything in sortList(GLOB.clients) + var/mob/oldmob = newkey.mob + var/delmob = FALSE + if((isobserver(oldmob) || alert("Do you want to delete [newkey]'s old mob?","Delete?","Yes","No") != "No")) + delmob = TRUE + if(!M || QDELETED(M)) + to_chat(usr, "The target mob no longer exists, aborting.") + return + if(M.ckey) + M.ghostize(FALSE) + M.ckey = newkey.key + M.client?.init_verbs() + if(delmob) + qdel(oldmob) + message_admins("[key_name_admin(usr)] gave away direct control of [M] to [newkey].") + log_admin("[key_name(usr)] gave away direct control of [M] to [newkey].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/cmd_admin_test_atmos_controllers() set category = "Mapping" set name = "Test Atmos Monitoring Consoles" @@ -455,7 +482,7 @@ cmd_admin_areatest(FALSE) /client/proc/cmd_admin_dress(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Events" set name = "Select equipment" if(!(ishuman(M) || isobserver(M))) alert("Invalid mob") diff --git a/code/modules/admin/verbs/dice.dm b/code/modules/admin/verbs/dice.dm index 5b0a15257e..f033351f96 100644 --- a/code/modules/admin/verbs/dice.dm +++ b/code/modules/admin/verbs/dice.dm @@ -1,5 +1,5 @@ /client/proc/roll_dices() - set category = "Fun" + set category = "Admin.Fun" set name = "Roll Dice" if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index 4cbb0214f7..446dbcc69a 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -14,6 +14,8 @@ browseserverlogs("[GLOB.log_directory]/") /client/proc/browseserverlogs(path = "data/logs/") + if(!check_rights(R_SENSITIVE)) + return path = browse_files(path) if(!path) return diff --git a/code/modules/admin/verbs/individual_logging.dm b/code/modules/admin/verbs/individual_logging.dm index 7fe4c070d2..9ad07ac1b2 100644 --- a/code/modules/admin/verbs/individual_logging.dm +++ b/code/modules/admin/verbs/individual_logging.dm @@ -5,7 +5,7 @@ var/ntype = text2num(type) //Add client links - var/dat = "" + var/list/dat = list() if(M.client) dat += "

    Client

    " dat += "
    " @@ -46,22 +46,27 @@ var/log_source = M.logging; if(source == LOGSRC_CLIENT && M.client) //if client doesn't exist just fall back to the mob log log_source = M.client.player_details.logging //should exist, if it doesn't that's a bug, don't check for it not existing - + var/list/concatenated_logs = list() for(var/log_type in log_source) var/nlog_type = text2num(log_type) if(nlog_type & ntype) - var/list/reversed = log_source[log_type] - if(islist(reversed)) - reversed = reverseRange(reversed.Copy()) - for(var/entry in reversed) - dat += "[entry]
    [reversed[entry]]

    " - dat += "
    " + var/list/all_the_entrys = log_source[log_type] + for(var/entry in all_the_entrys) + concatenated_logs += "[entry]
    [all_the_entrys[entry]]" + if(length(concatenated_logs)) + sortTim(concatenated_logs, cmp = /proc/cmp_text_dsc) //Sort by timestamp. + dat += "" + dat += concatenated_logs.Join("
    ") + dat += "
    " - usr << browse(dat, "window=invidual_logging_[key_name(M)];size=600x480") + var/datum/browser/popup = new(usr, "invidual_logging_[key_name(M)]", "Individual Logs", 600, 600) + popup.set_content(dat.Join()) + popup.open() /proc/individual_logging_panel_link(mob/M, log_type, log_src, label, selected_src, selected_type) var/slabel = label if(selected_type == log_type && selected_src == log_src) slabel = "\[[label]\]" - - return "[slabel]" \ No newline at end of file + //This is necessary because num2text drops digits and rounds on big numbers. If more defines get added in the future it could break again. + log_type = num2text(log_type, MAX_BITFLAG_DIGITS) + return "[slabel]" diff --git a/code/modules/admin/verbs/maprotation.dm b/code/modules/admin/verbs/maprotation.dm index ed9d23a84d..af8bd6e9fb 100644 --- a/code/modules/admin/verbs/maprotation.dm +++ b/code/modules/admin/verbs/maprotation.dm @@ -41,4 +41,4 @@ message_admins("[key_name_admin(usr)] is changing the map to [VM.map_name]") log_admin("[key_name(usr)] is changing the map to [VM.map_name]") if (SSmapping.changemap(VM) == 0) - message_admins("[key_name_admin(usr)] has changed the map to [VM.map_name]") \ No newline at end of file + message_admins("[key_name_admin(usr)] has changed the map to [VM.map_name]") diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 7675f858ee..2379ee22bc 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -1,7 +1,7 @@ /client/proc/one_click_antag() set name = "Create Antagonist" set desc = "Auto-create an antagonist of your choice" - set category = "Admin" + set category = "Admin.Events" if(holder) holder.one_click_antag() diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index f59d776a93..3860706538 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -28,4 +28,4 @@ GLOBAL_VAR_INIT(highlander, FALSE) addtimer(CALLBACK(src, .proc/only_one), 420) /mob/living/carbon/human/proc/make_scottish() - mind.add_antag_datum(/datum/antagonist/highlander) \ No newline at end of file + mind.add_antag_datum(/datum/antagonist/highlander) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index fc2ba55f54..c9a5cafd9b 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -1,15 +1,13 @@ /client/proc/play_sound(S as sound) - set category = "Fun" + set category = "Admin.Fun" set name = "Play Global Sound" if(!check_rights(R_SOUNDS)) return + var/freq = 1 var/vol = input(usr, "What volume would you like the sound to play at?",, 100) as null|num if(!vol) return - var/freq = input(usr, "What frequency would you like the sound to play at?",, 1) as null|num - if(!freq) - freq = 1 vol = clamp(vol, 1, 100) var/sound/admin_sound = new() @@ -18,14 +16,14 @@ admin_sound.channel = CHANNEL_ADMIN admin_sound.frequency = freq admin_sound.wait = 1 - admin_sound.repeat = 0 + admin_sound.repeat = FALSE admin_sound.status = SOUND_STREAM admin_sound.volume = vol var/res = alert(usr, "Show the title of this song to the players?",, "Yes","No", "Cancel") switch(res) if("Yes") - to_chat(world, "An admin played: [S]") + to_chat(world, "An admin played: [S]", confidential = TRUE) if("Cancel") return @@ -42,18 +40,18 @@ /client/proc/play_local_sound(S as sound) - set category = "Fun" + set category = "Admin.Fun" set name = "Play Local Sound" if(!check_rights(R_SOUNDS)) return log_admin("[key_name(src)] played a local sound [S]") message_admins("[key_name_admin(src)] played a local sound [S]") - playsound(get_turf(src.mob), S, 50, 0, 0) + playsound(get_turf(src.mob), S, 50, FALSE, FALSE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/play_web_sound() - set category = "Fun" + set category = "Admin.Fun" set name = "Play Internet Sound" if(!check_rights(R_SOUNDS)) return @@ -136,7 +134,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound") /client/proc/manual_play_web_sound() - set category = "Fun" + set category = "Admin.Fun" set name = "Manual Play Internet Sound" if(!check_rights(R_SOUNDS)) return @@ -182,7 +180,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Manual Play Internet Sound") /client/proc/set_round_end_sound(S as sound) - set category = "Fun" + set category = "Admin.Fun" set name = "Set Round End Sound" if(!check_rights(R_SOUNDS)) return diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index f3da1954a9..e532dcc2b2 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -48,6 +48,8 @@ if(C.prefs.toggles & SOUND_PRAYERS) if(usr.job == "Chaplain") SEND_SOUND(C, sound('sound/effects/pray.ogg')) + else + SEND_SOUND(C, sound('sound/effects/ding.ogg')) to_chat(usr, "You pray to the gods: \"[msg_tmp]\"") SSblackbox.record_feedback("tally", "admin_verb", 1, "Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 13f91ff79f..84702898ec 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -20,7 +20,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_subtle_message(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin.Events" set name = "Subtle Message" if(!ismob(M)) @@ -46,7 +46,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_headset_message(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin.Events" set name = "Headset Message" admin_headset_message(M) @@ -128,7 +128,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Modify Antagonist Reputation") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() - set category = "Special Verbs" + set category = "Admin.Events" set name = "Global Narrate" if(!check_rights(R_ADMIN)) @@ -144,7 +144,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(mob/M) - set category = "Special Verbs" + set category = "Admin.Events" set name = "Direct Narrate" if(!check_rights(R_ADMIN)) @@ -169,7 +169,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_local_narrate(atom/A) - set category = "Special Verbs" + set category = "Admin.Events" set name = "Local Narrate" if(!check_rights(R_ADMIN)) @@ -190,7 +190,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin.Game" set name = "Godmode" if(!check_rights(R_ADMIN)) return @@ -335,7 +335,7 @@ Works kind of like entering the game with a new character. Character receives a Traitors and the like can also be revived with the previous role mostly intact. /N */ /client/proc/respawn_character() - set category = "Special Verbs" + set category = "Admin.Game" set name = "Respawn Character" set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into." if(!check_rights(R_ADMIN)) @@ -503,7 +503,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return new_character /client/proc/cmd_admin_add_freeform_ai_law() - set category = "Fun" + set category = "Admin.Events" set name = "Add Custom AI law" if(!check_rights(R_ADMIN)) @@ -546,7 +546,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_create_centcom_report() - set category = "Special Verbs" + set category = "Admin.Events" set name = "Create Command Report" if(!check_rights(R_ADMIN)) @@ -572,7 +572,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_change_command_name() - set category = "Special Verbs" + set category = "Admin.Events" set name = "Change Command Name" if(!check_rights(R_ADMIN)) @@ -595,7 +595,7 @@ Traitors and the like can also be revived with the previous role mostly intact. admin_delete(A) /client/proc/cmd_admin_list_open_jobs() - set category = "Admin" + set category = "Admin.Game" set name = "Manage Job Slots" if(!check_rights(R_ADMIN)) @@ -604,7 +604,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) - set category = "Special Verbs" + set category = "Admin.Fun" set name = "Explosion" if(!check_rights(R_ADMIN)) @@ -640,7 +640,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) - set category = "Special Verbs" + set category = "Admin.Fun" set name = "EM Pulse" if(!check_rights(R_ADMIN)) @@ -656,7 +656,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_gib(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin.Fun" set name = "Gib" if(!check_rights(R_ADMIN)) @@ -683,7 +683,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_gib_self() set name = "Gibself" - set category = "Fun" + set category = "Admin.Fun" var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") if(confirm == "Yes") @@ -702,14 +702,14 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_view_range() - set category = "Special Verbs" + set category = "Admin.Game" set name = "Change View Range" set desc = "switches between 1x and custom views" - if(view == CONFIG_GET(string/default_view)) - change_view(input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128)) + if(view_size.getView() == view_size.default) + view_size.setTo(input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128) - 7) else - change_view(CONFIG_GET(string/default_view)) + view_size.resetToDefault(getScreenSize(prefs.widescreenpref)) log_admin("[key_name(usr)] changed their view range to [view].") //message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI @@ -717,8 +717,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Change View Range", "[view]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_call_shuttle() - - set category = "Admin" + set category = "Admin.Events" set name = "Call Shuttle" if(EMERGENCY_AT_LEAST_DOCKED) @@ -738,7 +737,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/admin_cancel_shuttle() - set category = "Admin" + set category = "Admin.Events" set name = "Cancel Shuttle" if(!check_rights(0)) return @@ -754,9 +753,51 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.") return +/* +/client/proc/admin_disable_shuttle() + set category = "Admin.Events" + set name = "Disable Shuttle" + if(!check_rights(R_ADMIN)) + return + if(SSshuttle.emergency.mode == SHUTTLE_DISABLED) + to_chat(usr, "Error, shuttle is already disabled.") + return + if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") + return + message_admins("[key_name_admin(usr)] disabled the shuttle.") + SSshuttle.lastMode = SSshuttle.emergency.mode + SSshuttle.lastCallTime = SSshuttle.emergency.timeLeft(1) + SSshuttle.adminEmergencyNoRecall = TRUE + SSshuttle.emergency.setTimer(0) + SSshuttle.emergency.mode = SHUTTLE_DISABLED + priority_announce("Warning: Emergency Shuttle uplink failure, shuttle disabled until further notice.", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg') + +/client/proc/admin_enable_shuttle() + set category = "Admin - Events" + set category = "Admin.Events" + set name = "Enable Shuttle" + + if(!check_rights(R_ADMIN)) + return + if(SSshuttle.emergency.mode != SHUTTLE_DISABLED) + to_chat(usr, "Error, shuttle not disabled.") + return + if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") + return + message_admins("[key_name_admin(usr)] enabled the emergency shuttle.") + SSshuttle.adminEmergencyNoRecall = FALSE + SSshuttle.emergencyNoRecall = FALSE + if(SSshuttle.lastMode == SHUTTLE_DISABLED) //If everything goes to shit, fix it. + SSshuttle.lastMode = SHUTTLE_IDLE + SSshuttle.emergency.mode = SSshuttle.lastMode + if(SSshuttle.lastCallTime < 10 SECONDS && SSshuttle.lastMode != SHUTTLE_IDLE) + SSshuttle.lastCallTime = 10 SECONDS //Make sure no insta departures. + SSshuttle.emergency.setTimer(SSshuttle.lastCallTime) + priority_announce("Warning: Emergency Shuttle uplink reestablished, shuttle enabled.", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg') +*/ /client/proc/everyone_random() - set category = "Fun" + set category = "Admin.Fun" set name = "Make Everyone Random" set desc = "Make everyone have a random appearance. You can only use this before rounds!" @@ -804,7 +845,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/admin_change_sec_level() - set category = "Special Verbs" + set category = "Admin.Events" set name = "Set Security Level" set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke" @@ -821,7 +862,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) set name = "Toggle Nuke" - set category = "Fun" + set category = "Admin.Events" set popup_menu = 0 if(!check_rights(R_DEBUG)) return @@ -1016,7 +1057,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits usr << browse(dat, "window=dressup;size=550x600") /client/proc/toggle_combo_hud() - set category = "Admin" + set category = "Admin.Game" set name = "Toggle Combo HUD" set desc = "Toggles the Admin Combo HUD (antag, sci, med, eng)" @@ -1051,7 +1092,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits /client/proc/run_weather() - set category = "Fun" + set category = "Admin.Events" set name = "Run Weather" set desc = "Triggers a weather on the z-level you choose." @@ -1075,7 +1116,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("tally", "admin_verb", 1, "Run Weather") /client/proc/mass_zombie_infection() - set category = "Fun" + set category = "Admin.Fun" set name = "Mass Zombie Infection" set desc = "Infects all humans with a latent organ that will zombify \ them on death." @@ -1095,7 +1136,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Zombie Infection") /client/proc/mass_zombie_cure() - set category = "Fun" + set category = "Admin.Fun" set name = "Mass Zombie Cure" set desc = "Removes the zombie infection from all humans, returning them to normal." if(!check_rights(R_ADMIN)) @@ -1113,7 +1154,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Zombie Cure") /client/proc/polymorph_all() - set category = "Fun" + set category = "Admin.Fun" set name = "Polymorph All" set desc = "Applies the effects of the bolt of change to every single mob." @@ -1203,7 +1244,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_toggle_fov() - set category = "Fun" + set category = "Admin.Fun" set name = "Enable/Disable Field of Vision" var/static/busy_toggling_fov = FALSE @@ -1256,7 +1297,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits /client/proc/smite(mob/living/carbon/human/target as mob) set name = "Smite" - set category = "Fun" + set category = "Admin.Fun" if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return @@ -1306,7 +1347,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits new /obj/effect/immovablerod(startT, endT,target) if(ADMIN_PUNISHMENT_SUPPLYPOD_QUICK) var/target_path = input(usr,"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):" ,"Typepath","/obj/item/reagent_containers/food/snacks/grown/harebell") as null|text - var/obj/structure/closet/supplypod/centcompod/pod = new() + var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas + var/obj/structure/closet/supplypod/centcompod/pod = new(pick(get_area_turfs(pod_storage_area))) //Lets not runtime pod.damage = 40 pod.explosionSize = list(0,0,0,2) pod.effectStun = TRUE @@ -1319,7 +1361,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(!delivery) alert("ERROR: Incorrect / improper path given.") new delivery(pod) - new /obj/effect/abstract/DPtarget(get_turf(target), pod) + new /obj/effect/pod_landingzone(get_turf(target), pod) if(ADMIN_PUNISHMENT_SUPPLYPOD) var/datum/centcom_podlauncher/plaunch = new(usr) if(!holder) @@ -1331,7 +1373,6 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits plaunch.temp_pod.damage = 40//bring the mother fuckin ruckus plaunch.temp_pod.explosionSize = list(0,0,0,2) plaunch.temp_pod.effectStun = TRUE - plaunch.ui_interact(usr) return //We return here because punish_log() is handled by the centcom_podlauncher datum if(ADMIN_PUNISHMENT_MAZING) diff --git a/code/modules/admin/verbs/reestablish_db_connection.dm b/code/modules/admin/verbs/reestablish_db_connection.dm index b00f0e2ccb..2090902ebc 100644 --- a/code/modules/admin/verbs/reestablish_db_connection.dm +++ b/code/modules/admin/verbs/reestablish_db_connection.dm @@ -27,4 +27,4 @@ if(!SSdbcore.Connect()) message_admins("Database connection failed: " + SSdbcore.ErrorMsg()) else - message_admins("Database connection re-established") \ No newline at end of file + message_admins("Database connection re-established") diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm index a80eafae02..7552936136 100644 --- a/code/modules/admin/verbs/shuttlepanel.dm +++ b/code/modules/admin/verbs/shuttlepanel.dm @@ -1,5 +1,5 @@ /datum/admins/proc/open_shuttlepanel() - set category = "Admin" + set category = "Admin.Events" set name = "Shuttle Manipulator" set desc = "Opens the shuttle manipulator UI." diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 7742d6ea66..fc4270dd1b 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -1,5 +1,5 @@ /client/proc/triple_ai() - set category = "Fun" + set category = "Admin.Events" set name = "Create AI Triumvirate" if(SSticker.current_state > GAME_STATE_PREGAME) diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index ab9f4a534c..a7c191de58 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -93,4 +93,4 @@ return "[header][item]
  • " -#undef VV_HTML_ENCODE \ No newline at end of file +#undef VV_HTML_ENCODE diff --git a/code/modules/admin/view_variables/mass_edit_variables.dm b/code/modules/admin/view_variables/mass_edit_variables.dm index a498868436..c45513e812 100644 --- a/code/modules/admin/view_variables/mass_edit_variables.dm +++ b/code/modules/admin/view_variables/mass_edit_variables.dm @@ -104,7 +104,7 @@ if (!thing) continue var/datum/D = thing - if (D.vv_edit_var(variable, initial(D.vars[variable])) != FALSE) + if (D.vv_edit_var(variable, initial(D.vars[variable]), TRUE) != FALSE) accepted++ else rejected++ @@ -135,7 +135,7 @@ for(var/V in varsvars) new_value = replacetext(new_value,"\[[V]]","[D.vars[V]]") - if (D.vv_edit_var(variable, new_value) != FALSE) + if (D.vv_edit_var(variable, new_value, TRUE) != FALSE) accepted++ else rejected++ @@ -161,7 +161,7 @@ if(many && !new_value) new_value = new type() - if (D.vv_edit_var(variable, new_value) != FALSE) + if (D.vv_edit_var(variable, new_value, TRUE) != FALSE) accepted++ else rejected++ @@ -176,7 +176,7 @@ if (!thing) continue var/datum/D = thing - if (D.vv_edit_var(variable, new_value) != FALSE) + if (D.vv_edit_var(variable, new_value, TRUE) != FALSE) accepted++ else rejected++ diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index 70aac2f107..c293500298 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -109,7 +109,7 @@ GLOBAL_LIST_EMPTY(deletion_failures) set name = "Find References" set src in world - find_references(FALSE) + find_references_legacy(FALSE) /datum/proc/find_references_legacy(skip_alert) @@ -164,7 +164,7 @@ GLOBAL_LIST_EMPTY(deletion_failures) qdel(src, TRUE) //force a qdel if(!running_find_references) - find_references(TRUE) + find_references_legacy(TRUE) /datum/verb/qdel_then_if_fail_find_references() diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 9f61781f01..d7e893ec03 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -98,7 +98,7 @@ L.adjustFireLoss(amount) newamt = L.getFireLoss() if("toxin") - L.adjustToxLoss(amount) + L.adjustToxLoss(amount, toxins_type = TOX_OMNI, forced = TRUE) newamt = L.getToxLoss() if("oxygen") L.adjustOxyLoss(amount) diff --git a/code/modules/antagonists/_common/antag_helpers.dm b/code/modules/antagonists/_common/antag_helpers.dm index d99920b9e2..b10df46348 100644 --- a/code/modules/antagonists/_common/antag_helpers.dm +++ b/code/modules/antagonists/_common/antag_helpers.dm @@ -16,4 +16,4 @@ continue var/datum/team/T = A.get_team() if(!team_type || istype(T,team_type)) - . |= T \ No newline at end of file + . |= T diff --git a/code/modules/antagonists/_common/antag_hud.dm b/code/modules/antagonists/_common/antag_hud.dm index de6d0a4f81..d87824f9a5 100644 --- a/code/modules/antagonists/_common/antag_hud.dm +++ b/code/modules/antagonists/_common/antag_hud.dm @@ -50,4 +50,4 @@ /datum/mind/proc/leave_all_antag_huds() for(var/datum/atom_hud/antag/hud in GLOB.huds) if(hud.hudusers[current]) - hud.leave_hud(current) \ No newline at end of file + hud.leave_hud(current) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index edfa9caa22..bcba1e1e1e 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -38,7 +38,7 @@ dat += "Robeless
    " dat += "Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.
    " dat += "Martial Artist
    " - dat += "Your apprentice is training in ancient martial arts. They know the Plasmafist and Nuclear Fist.
    " + dat += "Your apprentice is training in ancient martial arts. They know an Inner Mantra and the Nuclear Fist technique.
    " user << browse(dat, "window=radio") onclose(user, "radio") return diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm index 971051588e..9205198c4f 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm @@ -2,22 +2,27 @@ name = "experimental organ replacement" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert) possible_locs = list(BODY_ZONE_CHEST) - ignore_clothes = 1 + ignore_clothes = TRUE /datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target) if(!ishuman(user)) - return 0 + return FALSE var/mob/living/carbon/human/H = user if(H.dna.species.id == "abductor") - return 1 + return TRUE for(var/obj/item/implant/abductor/A in H.implants) - return 1 - return 0 + return TRUE + return FALSE + +/datum/surgery/organ_extraction/mechanic + name = "Prosthesis experimental organ replacement" + requires_bodypart_type = BODYPART_ROBOTIC + steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/prepare_electronics, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert) /datum/surgery_step/extract_organ name = "remove heart" - accept_hand = 1 + accept_hand = TRUE time = 32 var/obj/item/organ/IC = null var/list/organ_types = list(/obj/item/organ/heart) @@ -34,10 +39,10 @@ user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") user.put_in_hands(IC) IC.Remove() - return 1 + return TRUE else to_chat(user, "You don't find anything in [target]'s [target_zone]!") - return 1 + return TRUE /datum/surgery_step/gland_insert name = "insert gland" @@ -52,4 +57,4 @@ user.temporarilyRemoveItemFromInventory(tool, TRUE) var/obj/item/organ/heart/gland/gland = tool gland.Insert(target, 2) - return 1 \ No newline at end of file + return TRUE diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index d9ae678bb9..aed096e9df 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -110,4 +110,4 @@ active = 0 /obj/item/organ/heart/gland/proc/activate() - return \ No newline at end of file + return diff --git a/code/modules/antagonists/abductor/equipment/glands/access.dm b/code/modules/antagonists/abductor/equipment/glands/access.dm index c795233dc9..ccef04b091 100644 --- a/code/modules/antagonists/abductor/equipment/glands/access.dm +++ b/code/modules/antagonists/abductor/equipment/glands/access.dm @@ -17,4 +17,4 @@ /obj/item/organ/heart/gland/access/Remove(special = FALSE) if(!QDELETED(owner)) UnregisterSignal(owner, COMSIG_MOB_ALLOWED) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/blood.dm b/code/modules/antagonists/abductor/equipment/glands/blood.dm index 06b8249484..2e4803e0e9 100644 --- a/code/modules/antagonists/abductor/equipment/glands/blood.dm +++ b/code/modules/antagonists/abductor/equipment/glands/blood.dm @@ -15,4 +15,4 @@ var/mob/living/carbon/human/H = owner var/datum/species/species = H.dna.species to_chat(H, "You feel your blood heat up for a moment.") - species.exotic_blood = get_random_reagent_id() \ No newline at end of file + species.exotic_blood = get_random_reagent_id() diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm index e7b6fda85f..b651b45f6d 100644 --- a/code/modules/antagonists/abductor/equipment/glands/chem.dm +++ b/code/modules/antagonists/abductor/equipment/glands/chem.dm @@ -17,4 +17,4 @@ var/chem_to_add = pick(possible_reagents) owner.reagents.add_reagent(chem_to_add, 2) owner.adjustToxLoss(-5, TRUE, TRUE) - ..() \ No newline at end of file + ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm index 429a24b19c..e3b0c835f2 100644 --- a/code/modules/antagonists/abductor/equipment/glands/egg.dm +++ b/code/modules/antagonists/abductor/equipment/glands/egg.dm @@ -12,4 +12,4 @@ /obj/item/organ/heart/gland/egg/activate() owner.visible_message("[owner] [pick(EGG_LAYING_MESSAGES)]") var/turf/T = owner.drop_location() - new /obj/item/reagent_containers/food/snacks/egg/gland(T) \ No newline at end of file + new /obj/item/reagent_containers/food/snacks/egg/gland(T) diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index 7e52f6fcb6..9de0b96930 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -24,4 +24,4 @@ /obj/item/organ/heart/gland/electric/proc/zap() tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) - playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE) \ No newline at end of file + playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index c60ec90480..5ea8f77d6c 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -39,7 +39,7 @@ if(!limb) replace_limb(zone) return - if((limb.get_damage() >= (limb.max_damage / 2)) || (limb.status == BODYPART_ROBOTIC)) + if((limb.get_damage() >= (limb.max_damage / 2)) || limb.is_robotic_limb(FALSE)) replace_limb(zone, limb) return @@ -58,7 +58,7 @@ return var/obj/item/bodypart/chest/chest = owner.get_bodypart(BODY_ZONE_CHEST) - if((chest.get_damage() >= (chest.max_damage / 4)) || (chest.status == BODYPART_ROBOTIC)) + if((chest.get_damage() >= (chest.max_damage / 4)) || chest.is_robotic_limb(FALSE)) replace_chest(chest) return @@ -158,7 +158,7 @@ addtimer(CALLBACK(src, .proc/keep_replacing_blood), 30) /obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) - if(chest.status == BODYPART_ROBOTIC) + if(chest.is_robotic_limb(FALSE)) owner.visible_message("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!", "Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!") playsound(owner, 'sound/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE) var/list/dirs = GLOB.alldirs.Copy() @@ -175,4 +175,4 @@ var/obj/item/bodypart/chest/new_chest = new(null) new_chest.replace_limb(owner, TRUE) - qdel(chest) \ No newline at end of file + qdel(chest) diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm index f8b91343f2..fa63e2c82a 100644 --- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm +++ b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm @@ -61,4 +61,4 @@ to_chat(H, "You feel the compulsion fade, and you completely forget about your previous orders.") H.clear_alert("mind_control") active_mind_control = FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm index 4a30d99d44..fe8b06ac77 100644 --- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm +++ b/code/modules/antagonists/abductor/equipment/glands/plasma.dm @@ -19,4 +19,4 @@ var/turf/open/T = get_turf(owner) if(istype(T)) T.atmos_spawn_air("plasma=50;TEMP=[T20C]") - owner.vomit() \ No newline at end of file + owner.vomit() diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm index a5b8815437..fc1ddae030 100644 --- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm +++ b/code/modules/antagonists/abductor/equipment/glands/quantum.dm @@ -44,4 +44,4 @@ if(active_mind_control) to_chat(entangled_mob, "You feel the compulsion fade, and you completely forget about your previous orders.") entangled_mob.clear_alert("mind_control") - ..() \ No newline at end of file + ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 2df4a1fab9..36732d5fe0 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -23,4 +23,4 @@ var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") Slime.Friends = list(owner) - Slime.Leader = owner \ No newline at end of file + Slime.Leader = owner diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm index f0421b23b2..7c3c60eb4d 100644 --- a/code/modules/antagonists/abductor/equipment/glands/spider.dm +++ b/code/modules/antagonists/abductor/equipment/glands/spider.dm @@ -11,4 +11,4 @@ to_chat(owner, "You feel something crawling in your skin.") owner.faction |= "spiders" var/obj/structure/spider/spiderling/S = new(owner.drop_location()) - S.directive = "Protect your nest inside [owner.real_name]." \ No newline at end of file + S.directive = "Protect your nest inside [owner.real_name]." diff --git a/code/modules/antagonists/abductor/equipment/glands/transform.dm b/code/modules/antagonists/abductor/equipment/glands/transform.dm index 05c4760d37..1823ee5fed 100644 --- a/code/modules/antagonists/abductor/equipment/glands/transform.dm +++ b/code/modules/antagonists/abductor/equipment/glands/transform.dm @@ -12,4 +12,4 @@ to_chat(owner, "You feel unlike yourself.") randomize_human(owner) var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly)) - owner.set_species(species) \ No newline at end of file + owner.set_species(species) diff --git a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm index d1ea135497..c35016cf2e 100644 --- a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm +++ b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm @@ -9,4 +9,4 @@ /obj/item/organ/heart/gland/ventcrawling/activate() to_chat(owner, "You feel very stretchy.") - owner.ventcrawler = VENTCRAWLER_ALWAYS \ No newline at end of file + owner.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/antagonists/abductor/equipment/glands/viral.dm b/code/modules/antagonists/abductor/equipment/glands/viral.dm index 4d4f865a7c..1b6781b578 100644 --- a/code/modules/antagonists/abductor/equipment/glands/viral.dm +++ b/code/modules/antagonists/abductor/equipment/glands/viral.dm @@ -31,4 +31,4 @@ var/datum/symptom/S = new chosen_symptom A.symptoms += S A.Refresh() //just in case someone already made and named the same disease - return A \ No newline at end of file + return A diff --git a/code/modules/antagonists/abductor/equipment/orderable_gear.dm b/code/modules/antagonists/abductor/equipment/orderable_gear.dm index f21294b041..774f158169 100644 --- a/code/modules/antagonists/abductor/equipment/orderable_gear.dm +++ b/code/modules/antagonists/abductor/equipment/orderable_gear.dm @@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) build_path = /obj/item/abductor_machine_beacon/chem_dispenser category = "Advanced Gear" +/* /datum/abductor_gear/shrink_ray name = "Shrink Ray Blaster" description = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \ @@ -77,3 +78,4 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) cost = 2 build_path = /obj/item/gun/energy/shrink_ray category = "Advanced Gear" +*/ diff --git a/code/modules/antagonists/abductor/ice_abductor.dm b/code/modules/antagonists/abductor/ice_abductor.dm index 426e4057eb..2132e6c574 100644 --- a/code/modules/antagonists/abductor/ice_abductor.dm +++ b/code/modules/antagonists/abductor/ice_abductor.dm @@ -9,4 +9,4 @@ /obj/structure/fluff/iced_abductor/Destroy() var/turf/T = get_turf(src) new /obj/effect/mob_spawn/human/abductor(T) - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/antagonists/blob/blob/blobs/resource.dm b/code/modules/antagonists/blob/blob/blobs/resource.dm index 76aecf717d..2ed9744327 100644 --- a/code/modules/antagonists/blob/blob/blobs/resource.dm +++ b/code/modules/antagonists/blob/blob/blobs/resource.dm @@ -26,7 +26,7 @@ return flick("blob_resource_glow", src) if(overmind) - overmind.add_points(1) + overmind.add_points(2) resource_delay = world.time + 40 + overmind.resource_blobs.len * 2.5 //4 seconds plus a quarter second for each resource blob the overmind has else resource_delay = world.time + 40 diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm index a3a1403e58..38e6edc6d4 100644 --- a/code/modules/antagonists/blob/blob/blobs/shield.dm +++ b/code/modules/antagonists/blob/blob/blobs/shield.dm @@ -45,8 +45,12 @@ desc = "A solid wall of slightly twitching tendrils with a reflective glow." damaged_desc = "A wall of twitching tendrils with a reflective glow." icon_state = "blob_glow" + flags_1 = DEFAULT_RICOCHET_1 flags_ricochet = RICOCHET_SHINY point_return = 8 max_integrity = 100 brute_resist = 1 explosion_block = 2 + +/obj/structure/blob/shield/reflective/check_projectile_ricochet(obj/item/projectile/P) + return PROJECTILE_RICOCHET_FORCE diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index 02be432045..18f6817ec9 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -277,3 +277,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob) if(!B) mind.add_antag_datum(/datum/antagonist/blob) + +//the same but it's forced to be allowed by default as cameras usually don't allow emoting +/mob/camera/blob/emote(act, m_type=1, message = null, intentional = FALSE, forced = TRUE) + . = ..() diff --git a/code/modules/antagonists/blob/blob/powers.dm b/code/modules/antagonists/blob/blob/powers.dm index dff8e22552..cd53f624a6 100644 --- a/code/modules/antagonists/blob/blob/powers.dm +++ b/code/modules/antagonists/blob/blob/powers.dm @@ -147,7 +147,7 @@ set category = "Blob" set name = "Create Factory Blob (60)" set desc = "Create a spore tower that will spawn spores to harass your enemies." - createSpecial(60, /obj/structure/blob/factory, 7, 1) + createSpecial(60, /obj/structure/blob/factory, 5, 1) /mob/camera/blob/verb/create_blobbernaut() set category = "Blob" @@ -195,6 +195,7 @@ to_chat(blobber, "The [blobstrain.name] reagent [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]") else to_chat(src, "You could not conjure a sentience for your blobbernaut. Your points have been refunded. Try again later.") + B.naut = FALSE add_points(40) /mob/camera/blob/verb/relocate_core() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_flaws.dm b/code/modules/antagonists/bloodsucker/bloodsucker_flaws.dm index 77169efd61..2c06f42ed9 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_flaws.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_flaws.dm @@ -81,4 +81,4 @@ /datum/antagonist/bloodsucker/proc/AssignRandomBane() - return \ No newline at end of file + return diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 4117fc2b36..3e358cd795 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -120,9 +120,14 @@ if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return. if(mult == 0) return TRUE + // We have damage. Let's heal (one time) - C.adjustBruteLoss(-bruteheal * mult, forced = TRUE)// Heal BRUTE / BURN in random portions throughout the body. - C.adjustFireLoss(-fireheal * mult, forced = TRUE) + var/list/damaged_parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_HYBRID, BODYPART_NANITES)) + if(damaged_parts.len) + for(var/obj/item/bodypart/part in damaged_parts) // Heal BRUTE / BURN equally distibuted over all damaged bodyparts. + part.heal_damage((bruteheal * mult)/damaged_parts.len, (fireheal * mult)/damaged_parts.len, only_organic = FALSE, updating_health = FALSE) + C.updatehealth() + C.update_damage_overlays() C.adjustToxLoss(-toxinheal * mult * 2, forced = TRUE) //Toxin healing because vamps arent immune //C.heal_overall_damage(bruteheal * mult, fireheal * mult) // REMOVED: We need to FORCE this, because otherwise, vamps won't heal EVER. Swapped to above. AddBloodVolume((bruteheal * -0.5 + fireheal * -1 + toxinheal * -0.2) / mult * costMult) // Costs blood to heal @@ -276,7 +281,7 @@ /datum/antagonist/bloodsucker/proc/FinalDeath() //Dont bother if we are already supposed to be dead if(FinalDeath) - return + return FinalDeath = TRUE //We are now supposed to die. Lets not spam it. if(!iscarbon(owner.current)) //Check for non carbons. owner.current.gib() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index 26c8bd5949..2fb7a2ccca 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -30,6 +30,7 @@ var/can_be_staked = FALSE // Only Feed can happen with a stake in you. var/cooldown_static = FALSE // Feed, Masquerade, and One-Shot powers don't improve their cooldown. //var/not_bloodsucker = FALSE // This goes to Vassals or Hunters, but NOT bloodsuckers. + var/must_be_concious = TRUE //Can't use this ability while unconcious. /datum/action/bloodsucker/New() if(bloodcost > 0) @@ -101,6 +102,11 @@ if(display_error) to_chat(owner, "Garlic in your blood is interfering with your powers!") return FALSE + if(must_be_concious) + if(owner.stat != CONSCIOUS) + if(display_error) + to_chat(owner, "You can't do this while you are unconcious!") + return FALSE // Incap? if(must_be_capacitated) var/mob/living/L = owner diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm index 43163f6a70..2cb50c6b3b 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -13,8 +13,9 @@ var/nightime_duration = 900 //15 Minutes /obj/effect/sunlight/Initialize() - countdown() - hud_tick() + . = ..() + INVOKE_ASYNC(src, .proc/countdown) + INVOKE_ASYNC(src, .proc/hud_tick) /obj/effect/sunlight/proc/countdown() set waitfor = FALSE diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm b/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm index b922af6066..486ae51117 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm @@ -113,4 +113,4 @@ popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() -*/ \ No newline at end of file +*/ diff --git a/code/modules/antagonists/bloodsucker/datum_vassal.dm b/code/modules/antagonists/bloodsucker/datum_vassal.dm index c065d5fe7c..91e89e71e6 100644 --- a/code/modules/antagonists/bloodsucker/datum_vassal.dm +++ b/code/modules/antagonists/bloodsucker/datum_vassal.dm @@ -90,7 +90,7 @@ /datum/antagonist/vassal/greet() to_chat(owner, "You are now the mortal servant of [master.owner.current], a bloodsucking vampire!") to_chat(owner, "The power of [master.owner.current.p_their()] immortal blood compells you to obey [master.owner.current.p_them()] in all things, even offering your own life to prolong theirs.
    \ - You are not required to obey any other Bloodsucker, for only [master.owner.current] is your master. The laws of Nanotransen do not apply to you now; only your vampiric master's word must be obeyed.") + You are not required to obey any other Bloodsucker, for only [master.owner.current] is your master. The laws of Nanotrasen do not apply to you now; only your vampiric master's word must be obeyed.") // Effects... owner.current.playsound_local(null, 'sound/magic/mutate.ogg', 100, FALSE, pressure_affected = FALSE) //owner.store_memory("You became the mortal servant of [master.owner.current], a bloodsucking vampire!") diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm index 2aed251189..69410027a4 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm @@ -43,14 +43,13 @@ // This exists so Hardened/Silver Stake can't have a welding torch used on them. /obj/item/stake/basic/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) //if (amWelded) // to_chat(user, "This stake has already been treated with fire.") // return //amWelded = TRUE // Weld it - var/obj/item/weldingtool/WT = W - if(WT.use(0))//remove_fuel(0,user)) + if(W.use(0))//remove_fuel(0,user)) user.visible_message("[user.name] scorched the pointy end of [src] with the welding tool.", \ "You scorch the pointy end of [src] with the welding tool.", \ "You hear welding.") diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm index a555677719..881da8f282 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm @@ -164,11 +164,11 @@ if(istype(W, cutting_tool)) to_chat(user, "This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].") return - else if(anchored && istype(W, /obj/item/wrench)) // Can't unanchor unless owner. + else if(anchored && W.tool_behaviour == TOOL_WRENCH) // Can't unanchor unless owner. to_chat(user, "The coffin won't come unanchored from the floor.") return - if(locked && istype(W, /obj/item/crowbar)) + if(locked && W.tool_behaviour == TOOL_CROWBAR) var/pry_time = pryLidTimer * W.toolspeed // Pry speed must be affected by the speed of the tool. user.visible_message("[user] tries to pry the lid off of [src] with [W].", \ "You begin prying the lid off of [src] with [W]. This should take about [DisplayTimeText(pry_time)].") diff --git a/code/modules/antagonists/bloodsucker/powers/go_home.dm b/code/modules/antagonists/bloodsucker/powers/go_home.dm index c46a7fce6c..a8060ad07e 100644 --- a/code/modules/antagonists/bloodsucker/powers/go_home.dm +++ b/code/modules/antagonists/bloodsucker/powers/go_home.dm @@ -16,6 +16,7 @@ can_use_in_torpor = TRUE must_be_capacitated = TRUE can_be_immobilized = TRUE + must_be_concious = FALSE /datum/action/bloodsucker/gohome/CheckCanUse(display_error) . = ..() diff --git a/code/modules/antagonists/bloodsucker/powers/masquerade.dm b/code/modules/antagonists/bloodsucker/powers/masquerade.dm index d83f938e3f..f4ce531ef0 100644 --- a/code/modules/antagonists/bloodsucker/powers/masquerade.dm +++ b/code/modules/antagonists/bloodsucker/powers/masquerade.dm @@ -27,6 +27,7 @@ warn_constant_cost = TRUE can_use_in_torpor = TRUE // Masquerade is maybe the only one that can do this. It stops your healing. cooldown_static = TRUE + must_be_concious = FALSE // NOTE: Firing off vulgar powers disables your Masquerade! diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 0a2e079921..30e6a80e85 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -149,8 +149,6 @@ if(prob(50)) if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) add_objective(new/datum/objective/destroy, TRUE) - else if(prob(30)) - add_objective(new/datum/objective/maroon, TRUE) else add_objective(new/datum/objective/assassinate, TRUE) else diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 242538a1e5..9c0b19cd83 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -18,7 +18,6 @@ var/list/stored_profiles = list() //list of datum/changelingprofile var/datum/changelingprofile/first_prof = null - var/dna_max = 6 //How many extra DNA strands the changeling can store for transformation. var/absorbedcount = 0 /// did we get succed by another changeling var/hostile_absorbed = FALSE @@ -38,8 +37,9 @@ var/mimicing = "" var/canrespec = 0 var/changeling_speak = 0 - var/loudfactor = 0 //Used for blood tests. At 4, blood tests will succeed. At 10, blood tests will result in an explosion. - var/bloodtestwarnings = 0 //Used to track if the ling has been notified that they will pass blood tests. + var/loudfactor = 0 //Used for blood tests. This is is the average loudness of the ling's abilities calculated with the below two vars + var/loudtotal = 0 //Used to keep track of the sum of the ling's loudness + var/totalpurchases = 0 //Used to keep track of how many purchases the ling's made after free abilities have been added var/datum/dna/chosen_dna var/obj/effect/proc_holder/changeling/sting/chosen_sting var/datum/cellular_emporium/cellular_emporium @@ -139,8 +139,6 @@ /datum/antagonist/changeling/proc/reset_powers() if(purchasedpowers) remove_changeling_powers() - loudfactor = 0 - bloodtestwarnings = 0 //Repurchase free powers. for(var/path in all_powers) var/obj/effect/proc_holder/changeling/S = new path() @@ -148,6 +146,9 @@ if(!has_sting(S)) purchasedpowers += S S.on_purchase(owner.current,TRUE) + loudfactor = 0 + loudtotal = 0 + totalpurchases = 0 /datum/antagonist/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) for(var/obj/effect/proc_holder/changeling/P in purchasedpowers) @@ -192,13 +193,18 @@ geneticpoints -= thepower.dna_cost purchasedpowers += thepower thepower.on_purchase(owner.current) - loudfactor += thepower.loudness - if(loudfactor >= 4 && !bloodtestwarnings) - to_chat(owner.current, "Our blood is growing flammable. Our blood will react violently to heat.") - bloodtestwarnings = 1 - if(loudfactor >= 10 && bloodtestwarnings < 2) - to_chat(owner.current, "Our blood has grown extremely flammable. Our blood will react explosively to heat.") - bloodtestwarnings = 2 + loudtotal += thepower.loudness + totalpurchases++ + var/oldloudness = loudfactor + loudfactor = loudtotal/max(totalpurchases,1) + if(loudfactor >= LINGBLOOD_DETECTION_THRESHOLD && oldloudness < LINGBLOOD_DETECTION_THRESHOLD) + to_chat(owner.current, "Our blood has grown flammable. Our blood will now react violently to heat.") + else if(loudfactor < LINGBLOOD_DETECTION_THRESHOLD && oldloudness >= LINGBLOOD_DETECTION_THRESHOLD) + to_chat(owner.current, "Our blood has stabilized, and will no longer react violently to heat.") + if(loudfactor > LINGBLOOD_EXPLOSION_THRESHOLD && oldloudness <= LINGBLOOD_EXPLOSION_THRESHOLD) + to_chat(owner.current, "Our blood has grown extremely flammable. Our blood will now react explosively to heat.") + else if(loudfactor <= LINGBLOOD_EXPLOSION_THRESHOLD && oldloudness > LINGBLOOD_EXPLOSION_THRESHOLD) + to_chat(owner.current, "Our blood has slightly stabilized, and will no longer explode when exposed to heat.") /datum/antagonist/changeling/proc/readapt() if(!ishuman(owner.current)) @@ -207,7 +213,7 @@ if(canrespec) to_chat(owner.current, "We have removed our evolutions from this form, and are now ready to readapt.") reset_powers() - playsound(get_turf(owner.current), 'sound/effects/lingreadapt.ogg', 75, TRUE, 5, soundenvwet = 0) + playsound(get_turf(owner.current), 'sound/effects/lingreadapt.ogg', 75, TRUE, 5) canrespec = 0 SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt") return 1 @@ -245,12 +251,6 @@ var/mob/living/carbon/user = owner.current if(!istype(user)) return - if(stored_profiles.len) - var/datum/changelingprofile/prof = stored_profiles[1] - if(prof.dna == user.dna && stored_profiles.len >= dna_max)//If our current DNA is the stalest, we gotta ditch it. - if(verbose) - to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") - return if(!target) return if(NO_DNA_COPY in target.dna.species.species_traits) @@ -310,9 +310,6 @@ return prof /datum/antagonist/changeling/proc/add_profile(datum/changelingprofile/prof) - if(stored_profiles.len > dna_max) - if(!push_out_profile()) - return if(!first_prof) first_prof = prof @@ -333,19 +330,6 @@ stored_profiles -= prof qdel(prof) -/datum/antagonist/changeling/proc/get_profile_to_remove() - for(var/datum/changelingprofile/prof in stored_profiles) - if(!prof.protected) - return prof - -/datum/antagonist/changeling/proc/push_out_profile() - var/datum/changelingprofile/removeprofile = get_profile_to_remove() - if(removeprofile) - stored_profiles -= removeprofile - return 1 - return 0 - - /datum/antagonist/changeling/proc/create_initial_profile() var/mob/living/carbon/C = owner.current //only carbons have dna now, so we have to typecaste if(ishuman(C)) @@ -449,30 +433,21 @@ destroy_objective.find_target() objectives += destroy_objective else - if(prob(70)) - var/datum/objective/assassinate/once/kill_objective = new - kill_objective.owner = owner - if(team_mode) //No backstabbing while in a team - kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - kill_objective.find_target() - objectives += kill_objective + var/datum/objective/assassinate/once/kill_objective = new + kill_objective.owner = owner + if(team_mode) //No backstabbing while in a team + kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) else - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - if(team_mode) - maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - maroon_objective.find_target() - objectives += maroon_objective + kill_objective.find_target() + objectives += kill_objective - if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = owner - identity_theft.target = maroon_objective.target - identity_theft.update_explanation_text() - objectives += identity_theft - escape_objective_possible = FALSE + if(!(locate(/datum/objective/escape) in objectives) && escape_objective_possible && prob(50)) + var/datum/objective/escape/escape_with_identity/identity_theft = new + identity_theft.owner = owner + identity_theft.target = kill_objective.target + identity_theft.update_explanation_text() + objectives += identity_theft + escape_objective_possible = FALSE if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) if(prob(50)) diff --git a/code/modules/antagonists/changeling/powers/digitalcamo.dm b/code/modules/antagonists/changeling/powers/digitalcamo.dm index 6a0f78b532..e44a7c0aa5 100644 --- a/code/modules/antagonists/changeling/powers/digitalcamo.dm +++ b/code/modules/antagonists/changeling/powers/digitalcamo.dm @@ -24,4 +24,4 @@ /obj/effect/proc_holder/changeling/digitalcamo/on_refund(mob/user) action.Remove(user) user.digitalcamo = 0 - user.digitalinvis = 0 \ No newline at end of file + user.digitalinvis = 0 diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index da626bcf1c..08dc85efbf 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -16,7 +16,7 @@ if(user.stat != DEAD) user.emote("deathgasp") user.tod = STATION_TIME_TIMESTAMP("hh:mm:ss", world.time) - user.fakedeath("changeling") //play dead + user.fakedeath("changeling", TRUE) //play dead user.update_stat() addtimer(CALLBACK(src, .proc/ready_to_regenerate, user), LING_FAKEDEATH_TIME, TIMER_UNIQUE) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 24288be078..5b6a7648c8 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -6,6 +6,10 @@ Shield Armor Tentacles + Hatterhat Additions: + claws! (glove slot) + jagged (thieves') claws + bone gauntlets for punching dudes */ @@ -17,6 +21,7 @@ chemical_cost = 1000 dna_cost = -1 + var/recharge_slowdown = 0 var/silent = FALSE var/weapon_type var/weapon_name_simple @@ -33,6 +38,8 @@ if(!silent) playsound(user, 'sound/effects/blobattack.ogg', 30, 1) user.visible_message("With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "[H] casts off [H.p_their()] [suit_name_simple]!", "We cast off our [suit_name_simple].", "You hear the organic matter ripping and tearing!") + H.visible_message("[H] casts off [H.p_their()] [suit_name_simple]!", "We cast off our [suit_name_simple].", "You hear organic matter ripping and tearing!") H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) H.update_inv_wear_suit() @@ -137,10 +146,11 @@ name = "Arm Blade" desc = "We reform one of our arms into a deadly blade." helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form. This ability is loud, and might cause our blood to react violently to heat." - chemical_cost = 10 + chemical_cost = 5 dna_cost = 2 loudness = 2 req_human = 1 + recharge_slowdown = 0.6 weapon_type = /obj/item/melee/arm_blade weapon_name_simple = "blade" action_icon = 'icons/mob/actions/actions_changeling.dmi' @@ -461,7 +471,7 @@ if(--remaining_uses < 1) if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.visible_message("With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!", "We assimilate our shield into our body", "With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!", "We assimilate our shield into our body.", "With a sickening crunch, [H] reforms [H.p_their()] [glove_name_simple] into hands!", "We assimilate our [glove_name_simple].", "You hear organic matter ripping and tearing!") + H.temporarilyRemoveItemFromInventory(H.gloves, TRUE) //The qdel on dropped() takes care of it + H.update_inv_gloves() + playsound(H.loc, 'sound/effects/blobattack.ogg', 30, 1) + if(blood_on_castoff) + H.add_splatter_floor() + playsound(H.loc, 'sound/effects/splat.ogg', 50, 1) //So real sounds + + changeling.chem_recharge_slowdown -= recharge_slowdown + return 1 + +/obj/effect/proc_holder/changeling/gloves/on_refund(mob/user) + if(!ishuman(user)) + return + action.Remove(user) + var/mob/living/carbon/human/H = user + check_gloves(H) + +/obj/effect/proc_holder/changeling/gloves/sting_action(mob/living/carbon/human/user) + if(!user.canUnEquip(user.gloves)) + to_chat(user, "\the [user.gloves] is stuck to your body, you cannot grow [glove_name_simple] over it!") + return + + user.dropItemToGround(user.gloves) + + user.equip_to_slot_if_possible(new glove_type(user), SLOT_GLOVES, 1, 1, 1) + playsound(user, 'sound/effects/blobattack.ogg', 30, 1) + var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + changeling.chem_recharge_slowdown += recharge_slowdown + return TRUE + +/obj/item/clothing/gloves/claws + name = "claws of doing nothing" + desc = "These shouldn't be here." + icon_state = "bracers" + item_state = "bracers" + transfer_prints = TRUE + body_parts_covered = HANDS + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0) + +/obj/item/clothing/gloves/claws/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + +/obj/item/clothing/gloves/claws/vulture // prying shit off dead/soon to be dead dudes! + name = "jagged claws" + desc = "Good for prying things off of people and looking incredibly creepy." + strip_mod = 2 + +/obj/effect/proc_holder/changeling/gloves/gauntlets + name = "Bone Gauntlets" + desc = "We turn our hands into solid bone and chitin, sacrificing dexterity for raw strength." + helptext = "These grotesque, bone-and-chitin gauntlets are remarkably good at beating victims senseless, and cannot be used in lesser form. This ability is loud, and might cause our blood to react violently to heat." + chemical_cost = 5 // same cost as armblade because its a sidegrade (sacrifice utility for punching people violently) + dna_cost = 2 + loudness = 2 + req_human = 1 + recharge_slowdown = 0.6 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_gauntlets" + action_background_icon_state = "bg_ling" + + glove_type = /obj/item/clothing/gloves/fingerless/pugilist/cling // just punch his head off dude + glove_name_simple = "bone gauntlets" + +/obj/item/clothing/gloves/fingerless/pugilist/cling // switches between lesser GotNS and Big Punchy Rib Breaky Hands + name = "hewn bone gauntlets" + icon_state = "ling_gauntlets" + item_state = "ling_gauntlets" + desc = "Rough bone and chitin, pulsing with an abomination barely called \"life\". Good for punching people, not so much for firearms." + transfer_prints = TRUE + item_flags = DROPDEL // whoops + body_parts_covered = ARMS|HANDS + cold_protection = ARMS|HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0) + enhancement = 6 // first, do harm. all of it. all of the harm. just fuck em up. + wound_enhancement = 6 + var/fast_enhancement = 6 + var/fast_wound_enhancement = 6 + var/slow_enhancement = 12 + var/slow_wound_enhancement = 15 + silent = TRUE + inherited_trait = TRAIT_CHUNKYFINGERS // how do you expect to shoot anyone with bone covered hands + secondary_trait = TRAIT_MAULER // just punch them idiot + var/fasthands = TRUE + +/obj/item/clothing/gloves/fingerless/pugilist/cling/examine(mob/user) + . = ..() + . += "[src] are shaped for [fasthands ? "fast, precise strikes" : "crippling, damaging blows"]." + . += "Alt-click them to change between rapid strikes and strong blows." + +/obj/item/clothing/gloves/fingerless/pugilist/cling/AltClick(mob/user) + . = ..() + use_buffs(user, FALSE) // reset + fasthands = !fasthands + if(fasthands) + enhancement = fast_enhancement + wound_enhancement = fast_wound_enhancement + else + enhancement = slow_enhancement // fuck em up kiddo + wound_enhancement = slow_wound_enhancement // really. fuck em up. + to_chat(user, "[src] are now formed to allow for [fasthands ? "fast, precise strikes" : "crippling, damaging blows"].") + addtimer(CALLBACK(src, .proc/use_buffs, user, TRUE), 0.1) // go fuckin get em + +/obj/item/clothing/gloves/fingerless/pugilist/cling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + +/obj/item/clothing/gloves/fingerless/pugilist/cling/equipped(mob/user, slot) + . = ..() + if(current_equipped_slot == SLOT_GLOVES) + to_chat(user, "With [src] formed around our arms, we are ready to fight.") + +/obj/item/clothing/gloves/fingerless/pugilist/cling/dropped(mob/user) + . = ..() + if(wornonce) + to_chat(user, "With [src] assimilated, we feel less ready to punch things.") + +/obj/item/clothing/gloves/fingerless/pugilist/cling/Touch(atom/target, proximity = TRUE) + if(!isliving(target)) + return + var/mob/living/M = loc + if(fasthands) + M.SetNextAction(CLICK_CD_RANGE) // fast punches + else + M.SetNextAction(CLICK_CD_GRABBING) // strong punches + return NO_AUTO_CLICKDELAY_HANDLING | ATTACK_IGNORE_ACTION diff --git a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm index 4995b27807..3d54c19350 100644 --- a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm +++ b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm @@ -57,4 +57,4 @@ /obj/screen/alert/status_effect/agent_pinpointer/changeling name = "Pheromone Scent" - desc = "The nose always knows." \ No newline at end of file + desc = "The nose always knows." diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 0e2515fdae..dae1da9f8f 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -29,7 +29,7 @@ for(var/obj/machinery/light/L in range(4, user)) L.on = 1 L.break_light_tube() - playsound(get_turf(user), 'sound/effects/lingscreech.ogg', 75, TRUE, 5, soundenvwet = 0) + playsound(get_turf(user), 'sound/effects/lingscreech.ogg', 75, TRUE, 5) return TRUE /obj/effect/proc_holder/changeling/dissonant_shriek @@ -49,5 +49,5 @@ L.on = 1 L.break_light_tube() empulse_using_range(get_turf(user), 8, TRUE) - playsound(get_turf(user), 'sound/effects/lingempscreech.ogg', 75, TRUE, 5, soundenvwet = 0) + playsound(get_turf(user), 'sound/effects/lingempscreech.ogg', 75, TRUE, 5) return TRUE diff --git a/code/modules/antagonists/clockcult/clock_effect.dm b/code/modules/antagonists/clockcult/clock_effect.dm index 5fbfa03290..8e3a8f4ceb 100644 --- a/code/modules/antagonists/clockcult/clock_effect.dm +++ b/code/modules/antagonists/clockcult/clock_effect.dm @@ -22,4 +22,4 @@ if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) desc = clockwork_desc . = ..() - desc = initial(desc) \ No newline at end of file + desc = initial(desc) diff --git a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm index 3ea4668df8..1da49efe3c 100644 --- a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm +++ b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm @@ -22,7 +22,7 @@ for(var/mob/M in GLOB.player_list) if(M.z == z) if(get_dist(src, M) >= 7) - M.playsound_local(src, 'sound/magic/blink.ogg', 10, FALSE, falloff = 10) + M.playsound_local(src, 'sound/magic/blink.ogg', 10, FALSE) else M.playsound_local(src, 'sound/magic/blink.ogg', 50, FALSE) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm index c18e46790e..97d2935a86 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm @@ -48,4 +48,4 @@ plane = FLOOR_PLANE /obj/effect/clockwork/overlay/floor/bloodcult //this is used by BLOOD CULT, it shouldn't use such a path... - icon_state = "cult" \ No newline at end of file + icon_state = "cult" diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 454870d1e1..b868fb54c0 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -216,6 +216,14 @@ else if(get_clockwork_power()) to_chat(L, "You feel a slight, static shock.") +/obj/effect/clockwork/sigil/transmission/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/effect/clockwork/sigil/transmission/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/effect/clockwork/sigil/transmission/process() var/power_drained = 0 var/power_mod = 0.005 @@ -340,9 +348,9 @@ L.dust() else if(L.health > min_drain_health) if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS) - vitality_drained = L.adjustToxLoss(1, forced = TRUE) + vitality_drained = L.adjustToxLoss(1, forced = TRUE, toxins_type = TOX_OMNI) else - vitality_drained = L.adjustToxLoss(1.5, forced = TRUE) + vitality_drained = L.adjustToxLoss(1.5, forced = TRUE, toxins_type = TOX_OMNI) if(vitality_drained) GLOB.clockwork_vitality += vitality_drained else @@ -408,7 +416,7 @@ /obj/effect/clockwork/sigil/rite name = "radiant sigil" - desc = "A glowing sigil glowing with barely-contained power." + desc = "A sigil glowing with barely-contained power." clockwork_desc = "A sigil that will allow you to perform certain rites on it, provided you have access to sufficient power and materials." icon_state = "sigiltransmission" //am big lazy - recolored transmission sigil sigil_name = "Sigil of Rites" @@ -432,7 +440,8 @@ return var/list/possible_rites = list() for(var/datum/clockwork_rite/R in GLOB.all_clockwork_rites) - possible_rites[R] = R + if(is_servant_of_ratvar(user, require_full_power = TRUE) || !R.requires_full_power) + possible_rites[R] = R var/input_key = input(user, "Choose a rite", "Choosing a rite") as null|anything in possible_rites if(!input_key) return diff --git a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm index 00c52e4a59..ab8c7abd0a 100644 --- a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm +++ b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm @@ -287,4 +287,4 @@ linked_gateway.visible_message("[linked_gateway] begins to destabilise!") /obj/effect/clockwork/spatial_gateway/stable/pass_through_gateway(atom/movable/A, no_cost = TRUE) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm index 1d65cf9209..76738ab1de 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm @@ -1,41 +1,57 @@ -//horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops -/atom/movable/proc/power_drain(clockcult_user, drain_weapons = FALSE) //This proc as of now is only in use for void volt +/* +horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops +args: +clockcult_user: If the user / source has to do with clockcult stuff +drain_weapons: If this drains weaponry, such as batons and guns +recursive: If this recurses through mob / storage contents. ONLY USE THIS IF IT'S NOT CALLED TOO FREQUENTLY, or I'm not liable for any lag / functional issues caused +drain_amount: How much is drained by default; Influenced by a multiplier on most things depending on how much power they usually hold. +*/ +/atom/movable/proc/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) //This proc as of now is only in use for void volt and transmission sigils + if(recursive) + var/succ = 0 + for(var/V in contents) + var/atom/movable/target = V + succ += target.power_drain(clockcult_user, drain_weapons, recursive, drain_amount) + return succ var/obj/item/stock_parts/cell/cell = get_cell() if(cell) - return cell.power_drain(clockcult_user) + return cell.power_drain(clockcult_user, drain_weapons, recursive, drain_amount) return 0 //Returns 0 instead of FALSE to symbolise it returning the power amount in other cases, not TRUE aka 1 -/obj/item/melee/baton/power_drain(clockcult_user, drain_weapons = FALSE) //balance memes +/obj/item/melee/baton/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) //balance memes if(!drain_weapons) return 0 - return ..() + var/obj/item/stock_parts/cell/cell = get_cell() + if(cell) + return cell.power_drain(clockcult_user, drain_weapons, recursive, drain_amount) + return 0 //No need to recurse further in batons -/obj/item/gun/power_drain(clockcult_user, drain_weapons = FALSE) //balance memes +/obj/item/gun/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) //balance memes if(!drain_weapons) return 0 var/obj/item/stock_parts/cell/cell = get_cell() if(!cell) return 0 if(cell.charge) - . = min(cell.charge, MIN_CLOCKCULT_POWER*4) //Done snowflakey because guns have far smaller cells than batons / other equipment + . = min(cell.charge, drain_amount*4) //Done snowflakey because guns have far smaller cells than batons / other equipment, also no need to recurse further in guns cell.use(.) update_icon() -/obj/machinery/power/apc/power_drain(clockcult_user, drain_weapons = FALSE) +/obj/machinery/power/apc/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) if(cell && cell.charge) playsound(src, "sparks", 50, 1) flick("apc-spark", src) - . = min(cell.charge, MIN_CLOCKCULT_POWER*4) - cell.use(.) //Better than a power sink! + . = min(cell.charge, drain_amount*4) + cell.use(min(cell.charge, . * 4)) //Better than a power sink! if(!cell.charge && !shorted) shorted = 1 visible_message("The [name]'s screen blurs with static.") update() update_icon() -/obj/machinery/power/smes/power_drain(clockcult_user, drain_weapons = FALSE) +/obj/machinery/power/smes/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) if(charge) - . = min(charge, MIN_CLOCKCULT_POWER*4) + . = min(charge, drain_amount*4) charge -= . * 50 if(!charge && !panel_open) panel_open = TRUE @@ -44,20 +60,26 @@ visible_message("[src]'s panel flies open with a flurry of sparks!") update_icon() -/obj/item/stock_parts/cell/power_drain(clockcult_user, drain_weapons = FALSE) +/obj/item/stock_parts/cell/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) if(charge) - . = min(charge, MIN_CLOCKCULT_POWER * 4) //Done like this because normal cells are usually quite a bit bigger than the ones used in guns / APCs + . = min(charge, drain_amount * 4) //Done like this because normal cells are usually quite a bit bigger than the ones used in guns / APCs use(min(charge, . * 10)) //Usually cell-powered equipment that is not a gun has at least ten times the capacity of a gun / 5 times the amount of an APC. This adjusts the drain to account for that. update_icon() -/mob/living/silicon/robot/power_drain(clockcult_user, drain_weapons = FALSE) +/mob/living/silicon/robot/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) if((!clockcult_user || !is_servant_of_ratvar(src)) && cell && cell.charge) - . = min(cell.charge, MIN_CLOCKCULT_POWER*4) + . = min(cell.charge, drain_amount*8) //Silicons are very susceptible to Ratvar's might cell.use(.) spark_system.start() -/obj/mecha/power_drain(clockcult_user, drain_weapons = FALSE) - if((!clockcult_user || (occupant && !is_servant_of_ratvar(occupant))) && cell && cell.charge) - . = min(cell.charge, MIN_CLOCKCULT_POWER*4) - cell.use(.) - spark_system.start() +/obj/mecha/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) + if(!clockcult_user || (occupant && !is_servant_of_ratvar(occupant))) + if(recursive) + var/succ = 0 + for(var/atom/movable/target in contents) //Hiding in your mech won't save you. + succ += target.power_drain(clockcult_user, drain_weapons, recursive, drain_amount) + . = succ + else if(cell && cell.charge) + . = min(cell.charge, drain_amount*4) + cell.use(.) + spark_system.start() diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index 7dabb18f03..58ee73ef5b 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -6,12 +6,13 @@ //The base clockwork rite. This should never be visible /datum/clockwork_rite var/name = "Rite of THE frog" //The name of the rite - var/desc = "This rite is used to summon the legendary frog whose-name-shall-not-be-spoken, ender of many worlds." //What does this rite do? Shown to cultists if they choose 'Show Info' after selecting the rite. + var/desc = "This rite is used to summon the legendary frog whose-name-shall-not-be-spoken, ender of many worlds." //What does this rite do? Shown to servants if they choose 'Show Info' after selecting the rite. var/list/required_ingredients = list(/obj/item/clockwork) //What does this rite require? var/power_cost = 0 //How much power does this rite cost.. or does it even add power? - var/requires_human = FALSE //Does the rite require a ../carbon/human on the rune? + var/requires_human = FALSE //Does the rite require a ../carbon/human on the sigil? var/must_be_servant = TRUE //If the above is true, does the human need to be a servant? var/target_can_be_invoker = TRUE //Does this rite work if the invoker is also the target? + var/requires_full_power = FALSE //Does the invoker need to be an actual full-on servant, or is this available to neutered ones aswell? var/cast_time = 0 //How long does the rite take to cast? var/limit = INFINITE //How often can this rite be used per round? Set this to INFINITE for unlimited, 0 for disallowed, anything above 0 for a limit var/times_used = 0 //How often has the rite already been used this shift? @@ -164,14 +165,16 @@ /datum/clockwork_rite/treat_wounds/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) if(!target) return FALSE - if(!target.all_wounds.len) + if(!target.all_wounds || !target.all_wounds.len) to_chat(invoker, "This one does not require mending.") return FALSE .= ..() if(!.) return FALSE target.adjustToxLoss(10 * target.all_wounds.len) - QDEL_LIST(target.all_wounds) + for(var/i in target.all_wounds) + var/datum/wound/mended = i + mended.remove_wound() to_chat(target, "You feel your wounds heal, but are overcome with deep nausea.") new /obj/effect/temp_visual/ratvar/sigil/vitality(T) diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index 5affcd5dec..a00019aa45 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -115,7 +115,7 @@ if(totaldamage) L.heal_overall_damage(brutedamage, burndamage, only_organic = FALSE) //Maybe a machine god shouldn't murder augmented followers instead of healing them L.adjustOxyLoss(-oxydamage) - L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE) + L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE, toxins_type = TOX_OMNI) clockwork_say(ranged_ability_user, text2ratvar("[has_holy_water ? "Heal tainted" : "Mend wounded"] flesh!")) log_combat(ranged_ability_user, L, "healed with Sentinel's Compromise") L.visible_message("A blue light washes over [L], [has_holy_water ? "causing [L.p_them()] to briefly glow as it mends" : " mending"] [L.p_their()] bruises and burns!", \ diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm index a681e9b38b..fb7b4f8a94 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm @@ -22,7 +22,7 @@ . = ..() desc = initial(desc) -obj/item/shield/riot/ratvarian/proc/calc_bash_mult() +/obj/item/shield/riot/ratvarian/proc/calc_bash_mult() var/bash_mult = 0 if(!dam_absorbed) return 1 diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index 0bae7d3539..ff6dc12ce1 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -99,7 +99,7 @@ else ..() -/obj/item/clockwork/slab/cyborg/ratvar_act() +/obj/item/clockwork/slab/cyborg/ui_act() ..() if(!GLOB.ratvar_awakens) SStgui.close_uis(src) @@ -203,10 +203,10 @@ to_chat(user, "You need to hold the slab in your active hand to recite scripture!") return FALSE var/initial_tier = initial(scripture.tier) - if(initial_tier == SCRIPTURE_PERIPHERAL) + if(initial_tier == SCRIPTURE_PERIPHERAL && !issilicon(user)) //Silicons use peripheral scripture & cannot open the slab. to_chat(user, "Nice try using href exploits") return - if(!GLOB.ratvar_awakens && !no_cost && !SSticker.scripture_states[initial_tier]) + if(!GLOB.ratvar_awakens && !no_cost && !SSticker.scripture_states[initial_tier] &&!issilicon(user)) //silicons can't choose their spells, so lets allow them to always cast their assigned ones. to_chat(user, "That scripture is not unlocked, and cannot be recited!") return FALSE var/datum/clockwork_scripture/scripture_to_recite = new scripture diff --git a/code/modules/antagonists/clockcult/clock_scripture.dm b/code/modules/antagonists/clockcult/clock_scripture.dm index a85245e9d0..aa0f7f03fa 100644 --- a/code/modules/antagonists/clockcult/clock_scripture.dm +++ b/code/modules/antagonists/clockcult/clock_scripture.dm @@ -167,7 +167,7 @@ Judgement 5 converts set waitfor = FALSE chanting = TRUE for(var/invocation in invocations) - sleep(channel_time / invocations.len) + sleep(channel_time / (invocations.len + 1)) //So it always finishes the invocation if(QDELETED(src) || QDELETED(slab) || !chanting) return if(multiple_invokers_used) diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm index cbf3bdaa38..77dc174238 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm @@ -8,7 +8,7 @@ descname = "Powers Nearby Structures" name = "Sigil of Transmission" desc = "Places a sigil that can drain and will store energy to power clockwork structures." - invocations = list("Divinity...", "...power our creations!") + invocations = list("Divinity...", "...power our creations.") channel_time = 70 power_cost = 200 whispered = TRUE @@ -28,7 +28,7 @@ descname = "Powered Structure, Delay Emergency Shuttles" name = "Prolonging Prism" desc = "Creates a mechanized prism which will delay the arrival of an emergency shuttle by 2 minutes at a massive power cost." - invocations = list("May this prism...", "...grant us time to enact his will!") + invocations = list("May this prism...", "...grant us time to enact his will.") channel_time = 80 power_cost = 300 object_path = /obj/structure/destructible/clockwork/powered/prolonging_prism @@ -60,7 +60,7 @@ descname = "Powered Structure, Area Denial" name = "Mania Motor" desc = "Creates a mania motor which causes minor damage and a variety of negative mental effects in nearby non-Servant humans, potentially up to and including conversion." - invocations = list("May this transmitter...", "...break the will of all who oppose us!") + invocations = list("May this transmitter...", "...break the will of all who oppose us.") channel_time = 80 power_cost = 750 object_path = /obj/structure/destructible/clockwork/powered/mania_motor @@ -83,7 +83,7 @@ descname = "Powered Structure, Teleportation Hub" name = "Clockwork Obelisk" desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living Servant or clockwork obelisk." - invocations = list("May this obelisk...", "...take us to all places!") + invocations = list("May this obelisk...", "...take us to all places.") channel_time = 80 power_cost = 300 object_path = /obj/structure/destructible/clockwork/powered/clockwork_obelisk @@ -163,7 +163,7 @@ descname = "Well-Rounded Combat Construct" name = "Clockwork Marauder" desc = "Creates a shell for a clockwork marauder, a balanced frontline construct that can deflect projectiles with its shield." - invocations = list("Arise, avatar of Arbiter!", "Defend the Ark with vengeful zeal.") + invocations = list("Arise, avatar of Arbiter!", "Defend the Ark with vengeful zeal!") channel_time = 80 power_cost = 8000 creator_message = "Your slab disgorges several chunks of replicant alloy that form into a suit of thrumming armor." diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index b7c94d56df..b79bcfa03d 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -7,7 +7,7 @@ descname = "Generates Power From Starlight" name = "Stargazer" desc = "Forms a weak structure that generates power every second while within three tiles of starlight." - invocations = list("Capture their inferior light for us!") + invocations = list("Capture their inferior light for us.") channel_time = 50 power_cost = 200 object_path = /obj/structure/destructible/clockwork/stargazer @@ -16,6 +16,7 @@ usage_tip = "For obvious reasons, make sure to place this near a window or somewhere else that can see space!" tier = SCRIPTURE_DRIVER one_per_tile = TRUE + whispered = TRUE primary_component = HIEROPHANT_ANSIBLE sort_priority = 1 quickbind = TRUE @@ -34,7 +35,7 @@ descname = "Power Generation" name = "Integration Cog" desc = "Fabricates an integration cog, which can be used on an open APC to replace its innards and passively siphon its power." - invocations = list("Take that which sustains them!") + invocations = list("Take that which sustains them.") channel_time = 10 power_cost = 10 whispered = TRUE @@ -55,7 +56,7 @@ descname = "Trap, Stunning" name = "Sigil of Transgression" desc = "Wards a tile with a sigil, which will briefly stun the next non-Servant to cross it and apply Belligerent to them." - invocations = list("Divinity, smite...", "...those who trespass here!") + invocations = list("Divinity, smite...", "...those who trespass here.") channel_time = 50 power_cost = 50 whispered = TRUE @@ -75,7 +76,7 @@ descname = "Trap, Conversion" name = "Sigil of Submission" desc = "Places a luminous sigil that will convert any non-Servants that remain on it for 8 seconds." - invocations = list("Divinity, enlighten...", "...those who trespass here!") + invocations = list("Divinity, enlighten...", "...those who trespass here.") channel_time = 60 power_cost = 125 whispered = TRUE @@ -95,7 +96,7 @@ descname = "Short-Range Single-Target Stun" name = "Kindle" desc = "Charges your slab with divine energy, allowing you to overwhelm a target with Ratvar's light." - invocations = list("Divinity, show them your light!") + invocations = list("Divinity, show them your light.") whispered = TRUE channel_time = 25 //2.5 seconds should be a okay compromise between being able to use it when needed, and not being able to just pause in combat for a second and hardstunning your enemy power_cost = 125 @@ -118,7 +119,7 @@ descname = "Handcuffs" name = "Hateful Manacles" desc = "Forms replicant manacles around a target's wrists that function like handcuffs." - invocations = list("Shackle the heretic!", "Break them in body and spirit!") + invocations = list("Shackle the heretic!", "Break them in body and spirit.") channel_time = 15 power_cost = 25 whispered = TRUE @@ -269,7 +270,7 @@ descname = "New Clockwork Slab" name = "Replicant" desc = "Creates a new clockwork slab." - invocations = list("Metal, become greater!") + invocations = list("Metal, become greater.") channel_time = 10 power_cost = 25 whispered = TRUE @@ -290,7 +291,7 @@ descname = "Limited Xray Vision Glasses" name = "Wraith Spectacles" desc = "Fabricates a pair of glasses which grant true sight but cause gradual vision loss." - invocations = list("Show the truth of this world to me!") + invocations = list("Show the truth of this world to me.") channel_time = 10 power_cost = 50 whispered = TRUE @@ -310,7 +311,7 @@ name = "Spatial Gateway" desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \ Each servant assisting in the invocation adds one additional use and four additional seconds to the gateway's uses and duration." - invocations = list("Spatial Gateway...", "...activate!") + invocations = list("Spatial Gateway...", "...activate.") channel_time = 30 power_cost = 400 whispered = TRUE @@ -349,4 +350,4 @@ if(GLOB.ratvar_awakens) portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned duration = max(duration, 100) - return slab.procure_gateway(invoker, duration, portal_uses) \ No newline at end of file + return slab.procure_gateway(invoker, duration, portal_uses) diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm index eaec652f68..7ba4ce0936 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm @@ -29,7 +29,7 @@ descname = "Structure, Turret" name = "Ocular Warden" desc = "Forms an automatic short-range turret which will automatically attack nearby unrestrained non-Servants that can see it." - invocations = list("Guardians of Engine...", "...judge those who would harm us!") + invocations = list("Guardians of Engine...", "...judge those who would harm us.") channel_time = 100 power_cost = 250 object_path = /obj/structure/destructible/clockwork/ocular_warden @@ -105,7 +105,7 @@ descname = "Delayed Area Knockdown Glasses" name = "Judicial Visor" desc = "Creates a visor that can smite an area, applying Belligerent and briefly stunning. The smote area will explode after 3 seconds." - invocations = list("Grant me the flames of Engine!") + invocations = list("Grant me the flames of Engine.") channel_time = 10 power_cost = 400 whispered = TRUE @@ -124,7 +124,7 @@ descname = "Shield with empowerable bashes" name = "Nezbere's shield" desc = "Creates a shield which generates charge from blocking damage, using it to empower its bashes tremendously. It is repaired with brass, and while very durable, extremely weak to lasers and, even more so, to energy weaponry." - invocations = list("Shield me...", "... from the coming dark!") + invocations = list("Shield me...", "... from the coming dark.") channel_time = 20 power_cost = 600 //Shouldn't be too spammable but not too hard to get either whispered = TRUE @@ -143,7 +143,7 @@ descname = "Summonable Armor and Weapons" name = "Clockwork Armaments" desc = "Allows the invoker to summon clockwork armor and a Ratvarian spear at will. The spear's attacks will generate Vitality, used for healing." - invocations = list("Grant me armaments...", "...from the forge of Armorer!") + invocations = list("Grant me armaments...", "...from the forge of Armorer.") channel_time = 20 power_cost = 250 whispered = TRUE @@ -393,45 +393,49 @@ Left-click a target to fire, quickly!" timeout_time = 20 -/datum/clockwork_scripture/channeled/void_volt - descname = "Channeled, Power Drain" +/datum/clockwork_scripture/void_volt + descname = "Pulse, Power Drain" name = "Void Volt" - desc = "A channeled spell that quickly drains any powercells in a radius of eight tiles, but burns the invoker. \ - Can be channeled with more cultists to increase range and split the caused damage evenly over all invokers. \ + desc = "A spell that releases a pulse which drains the power of anything in a radius of eight tiles, but burns the invoker. \ + Can be used with more servants to increase range and split the caused damage evenly among all invokers. \ Also charges clockwork power by a small percentage of the drained power amount, which can help offset this scriptures powercost." - invocations = list("Channel their energy through my body... ", "... so it may fuel Engine!") - chant_invocations = list("Make their lights fall dark!", "They shall be powerless!", "Rob them of their power!") - chant_amount = 20 - chant_interval = 10 //100KW drain per pulse for guns / APCs / 1MW for other cells = 10 chants / 100ds / 10s to drain a charged weapon or a baton with a nonupgraded cell - channel_time = 50 - power_cost = 300 + invocations = list("Take the energy...", "...of their inventions...", "...and grant it to Engine...", "...for they already live in utter darkness!") + channel_time = 130 //You need alot of time, but it pays off. - ten times as powerful as a regular drain (done by transmission sigils) and recurses + affects weapons - incredibly useful if you can pull this off before a big fight. + power_cost = 500 //Relatively medium powercost, but can be offset due to it adding a part of drained power to the power pool. multiple_invokers_used = TRUE multiple_invokers_optional = TRUE - usage_tip = "It may be useful to end channelling early if the burning becomes too much to handle.." + usage_tip = "Be sure to not be injured when using this, or the power channeled through you may overwhelm your body." tier = SCRIPTURE_SCRIPT primary_component = GEIS_CAPACITOR sort_priority = 11 quickbind = TRUE - quickbind_desc = "Quickly drains power in an area around the invoker, causing burns proportional to the amount of energy drained.
    Maximum of 20 chants." + quickbind_desc = "Quickly drains power in an area around the invoker, causing burns proportional to the amount of energy drained." -/datum/clockwork_scripture/channeled/void_volt/scripture_effects() +/datum/clockwork_scripture/void_volt/chant() invoker.visible_message("[invoker] glows in a brilliant golden light!") invoker.add_atom_colour("#FFD700", ADMIN_COLOUR_PRIORITY) invoker.light_power = 2 invoker.light_range = 4 invoker.light_color = LIGHT_COLOR_FIRE invoker.update_light() - return ..() + addtimer(CALLBACK(invoker, /mob.proc/stop_void_volt_glow), channel_time) + ..()//Do the timer & Chant +/mob/proc/stop_void_volt_glow() //Needed so the scripture being qdel()d doesn't prevent it. + visible_message("[src] stops glowing...") + remove_atom_colour(ADMIN_COLOUR_PRIORITY) + light_power = 0 + light_range = 0 + update_light() -/datum/clockwork_scripture/channeled/void_volt/chant_effects(chant_number) +/datum/clockwork_scripture/void_volt/scripture_effects() var/power_drained = 0 var/power_mod = 0.005 //Amount of power drained (generally) is multiplied with this, and subsequently dealt in damage to the invoker, then 15 times that is added to the clockwork cult's power reserves. - var/drain_range = 8 + var/drain_range = 12 var/additional_chanters = 0 var/list/chanters = list() chanters += invoker - for(var/mob/living/L in range(1, invoker)) + for(var/mob/living/L in orange(1, invoker)) if(!L.stat && is_servant_of_ratvar(L)) additional_chanters++ chanters += L @@ -440,22 +444,14 @@ var/turf/T = t for(var/M in T) var/atom/movable/A = M - power_drained += A.power_drain(TRUE, TRUE) //Yes, this absolutely does drain weaponry. 10 pulses to drain guns / batons, though of course they can just be recharged. + power_drained += A.power_drain(TRUE, TRUE, TRUE, MIN_CLOCKCULT_POWER * 10) //Yes, this absolutely does drain weaponry, aswell as recurse through objects. No more hiding in lockers / mechs to avoid it. new /obj/effect/temp_visual/ratvar/sigil/transgression(invoker.loc, 1 + (power_drained * power_mod)) var/datum/effect_system/spark_spread/S = new S.set_up(round(1 + (power_drained * power_mod), 1), 0, get_turf(invoker)) S.start() adjust_clockwork_power(power_drained * power_mod * 15) for(var/mob/living/L in chanters) - L.adjustFireLoss(round(clamp(power_drained * power_mod / (1 + additional_chanters), 0, 20), 0.1)) //No you won't just immediately melt if you do this in a very power-rich area + L.adjustFireLoss(round(clamp(power_drained * power_mod / (1 + additional_chanters), 0, 70), 0.1)) //No you won't just immediately melt if you do this in a very power-rich area, but it'll be close. return TRUE - -/datum/clockwork_scripture/channeled/void_volt/chant_end_effects() - invoker.visible_message("[invoker] stops glowing...") - invoker.remove_atom_colour(ADMIN_COLOUR_PRIORITY) - invoker.light_power = 0 - invoker.light_range = 0 - invoker.update_light() - return ..() diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index 2464015b6b..380e93f102 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -95,7 +95,7 @@ return ..() /obj/structure/destructible/clockwork/attackby(obj/item/I, mob/user, params) - if(is_servant_of_ratvar(user) && istype(I, /obj/item/wrench) && unanchored_icon) + if(is_servant_of_ratvar(user) && I.tool_behaviour == TOOL_WRENCH && unanchored_icon) if(default_unfasten_wrench(user, I, 50) == SUCCESSFUL_UNFASTEN) update_anchored(user) return 1 diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 7478d45b08..3b507fb57c 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -149,7 +149,7 @@ transform = matrix() * 2 animate(src, transform = matrix() * 0.5, time = 30, flags = ANIMATION_END_NOW) -obj/structure/destructible/clockwork/massive/celestial_gateway/Destroy() +/obj/structure/destructible/clockwork/massive/celestial_gateway/Destroy() STOP_PROCESSING(SSprocessing, src) if(!purpose_fulfilled) var/area/gate_area = get_area(src) diff --git a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm index 73ae89a19b..28901ea0b2 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -30,6 +30,7 @@ var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert") notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [get_area_name(src)] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 10, null, FALSE, 0) + SSpersistence.station_was_destroyed = TRUE /obj/structure/destructible/clockwork/massive/ratvar/Destroy() GLOB.ratvar_awakens-- diff --git a/code/modules/antagonists/clockcult/clock_structures/reflector.dm b/code/modules/antagonists/clockcult/clock_structures/reflector.dm index 364409d39e..c91e9dd918 100644 --- a/code/modules/antagonists/clockcult/clock_structures/reflector.dm +++ b/code/modules/antagonists/clockcult/clock_structures/reflector.dm @@ -83,4 +83,4 @@ anchored = !anchored to_chat(user, "You [anchored ? "secure" : "unsecure"] \the [src].") I.play_tool_sound(src) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm index af29bc9b31..c5d1bc2ded 100644 --- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm +++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm @@ -15,3 +15,5 @@ audible_message("*click*") playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) activate() + + . = ..() diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm index 3eac1b9fef..21735ad6d7 100644 --- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm +++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm @@ -8,7 +8,7 @@ alpha = 75 /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM) - + . = ..() if(!istype(AM,/obj/mecha/)) return @@ -17,4 +17,4 @@ return audible_message("*click*") playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) - activate() \ No newline at end of file + activate() diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm b/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm index 6aede1592e..7d6eea1c79 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm @@ -21,3 +21,5 @@ if(isliving(AM) && opacity) var/mob/living/L = AM L.adjust_fire_stacks(-1) //It's wet! + return + . = ..() diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index d823f19d4a..7e4822b622 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -23,10 +23,10 @@ return /obj/structure/destructible/clockwork/wall_gear/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, I, 10) return 1 - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) if(anchored) to_chat(user, "[src] needs to be unsecured to disassemble it!") else diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm index b6ed7dfe65..b935258c27 100644 --- a/code/modules/antagonists/clockcult/clockcult.dm +++ b/code/modules/antagonists/clockcult/clockcult.dm @@ -15,13 +15,16 @@ var/ignore_holy_water = FALSE /datum/antagonist/clockcult/silent + name = "Silent Clock Cultist" silent = TRUE show_in_antagpanel = FALSE //internal /datum/antagonist/clockcult/neutered + name = "Neutered Clock Cultist" neutered = TRUE /datum/antagonist/clockcult/neutered/traitor + name = "Traitor Clock Cultist" ignore_eligibility_check = TRUE ignore_holy_water = TRUE show_in_roundend = FALSE @@ -185,7 +188,7 @@ /datum/antagonist/clockcult/admin_add(datum/mind/new_owner,mob/admin) - add_servant_of_ratvar(new_owner.current, TRUE) + add_servant_of_ratvar(new_owner.current, TRUE, override_type = type) message_admins("[key_name_admin(admin)] has made [new_owner.current] into a servant of Ratvar.") log_admin("[key_name(admin)] has made [new_owner.current] into a servant of Ratvar.") diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index e6ec3a08b6..901c83b1b7 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -445,7 +445,7 @@ if(L.move_resist < MOVE_FORCE_STRONG) var/atom/throw_target = get_edge_target_turf(L, user.dir) L.throw_at(throw_target, 7, 1, user) - else if(!iscultist(L)) + else if(!is_servant_of_ratvar(L)) L.DefaultCombatKnockdown(160) L.adjustStaminaLoss(140) //Ensures hard stamcrit L.flash_act(1,1) @@ -465,7 +465,7 @@ C.drowsyness = max(10, C.drowsyness) C.confused += clamp(20 - C.confused, 0, 10) L.adjustBruteLoss(15) - to_chat(user, "In an brilliant flash of red, [L] [iscultist(L) ? "writhes in pain" : "falls to the ground!"]") + to_chat(user, "In an brilliant flash of red, [L] [is_servant_of_ratvar(L) ? "writhes in pain!" : "falls to the ground!"]") uses-- ..() @@ -717,9 +717,9 @@ uses = 0 ratio *= -1 H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0) - H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0) - H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0) + H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0, toxins_type = TOX_OMNI) + H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0, only_organic = FALSE) + H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0, only_organic = FALSE) H.updatehealth() playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25) new /obj/effect/temp_visual/cult/sparks(get_turf(H)) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 61f6ec9998..09d8771a62 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -19,9 +19,11 @@ var/ignore_holy_water = FALSE /datum/antagonist/cult/neutered + name = "Neutered Cultist" neutered = TRUE /datum/antagonist/cult/neutered/traitor + name = "Traitor Cultist" ignore_eligibility_checks = TRUE ignore_holy_water = TRUE show_in_roundend = FALSE @@ -100,7 +102,7 @@ var/T = new item_path(mob) var/item_name = initial(item_path.name) - var/where = mob.equip_in_one_of_slots(T, slots) + var/where = mob.equip_in_one_of_slots(T, slots, critical = TRUE) if(!where) to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") return 0 @@ -295,6 +297,8 @@ ++cultplayers else ++alive + if(!alive) + return var/ratio = cultplayers/alive if(ratio > CULT_RISEN && !cult_risen) for(var/datum/mind/B in members) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index a388621c92..25fd446b06 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -214,8 +214,8 @@ if(L.health != L.maxHealth) new /obj/effect/temp_visual/heal(get_turf(src), "#960000") if(ishuman(L)) - L.adjustBruteLoss(-1, 0) - L.adjustFireLoss(-1, 0) + L.adjustBruteLoss(-1, 0, only_organic = FALSE) + L.adjustFireLoss(-1, 0, only_organic = FALSE) L.updatehealth() if(isshade(L) || isconstruct(L)) var/mob/living/simple_animal/M = L diff --git a/code/modules/antagonists/cult/rune_spawn_action.dm b/code/modules/antagonists/cult/rune_spawn_action.dm index b164246060..2dfbf722bf 100644 --- a/code/modules/antagonists/cult/rune_spawn_action.dm +++ b/code/modules/antagonists/cult/rune_spawn_action.dm @@ -115,4 +115,4 @@ rune_word_type = /obj/effect/temp_visual/cult/rune_spawn/rune1 rune_innerring_type = /obj/effect/temp_visual/cult/rune_spawn/rune1/inner rune_center_type = /obj/effect/temp_visual/cult/rune_spawn/rune1/center - rune_color = RUNE_COLOR_MEDIUMRED \ No newline at end of file + rune_color = RUNE_COLOR_MEDIUMRED diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 6cc2fb94b8..276729b359 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -82,7 +82,7 @@ Runes can either be invoked by one's self or with many different cultists. Each fail_invoke() /obj/effect/rune/attack_animal(mob/living/simple_animal/M) - if(istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct)) + if(isshade(M) || istype(M, /mob/living/simple_animal/hostile/construct)) if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message attack_hand(M) else @@ -191,7 +191,7 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/convert/do_invoke_glow() return -/obj/effect/rune/convert/invoke(var/list/invokers) +/obj/effect/rune/convert/invoke(list/invokers) if(rune_in_use) return var/list/myriad_targets = list() @@ -203,11 +203,16 @@ structure_check() searches for nearby cultist structures required for the invoca fail_invoke() log_game("Offer rune failed - no eligible targets") return + var/mob/living/L = pick(myriad_targets) + if(HAS_TRAIT(L, TRAIT_SACRIFICED)) + fail_invoke() + log_game("Offer rune failed - target has already been sacrificed") + to_chat(invokers, "[L] has already been sacrificed!") + return rune_in_use = TRUE visible_message("[src] pulses blood red!") var/oldcolor = color color = RUNE_COLOR_DARKRED - var/mob/living/L = pick(myriad_targets) var/is_clock = is_servant_of_ratvar(L) var/mob/living/F = invokers[1] @@ -264,7 +269,7 @@ structure_check() searches for nearby cultist structures required for the invoca H.uncuff() H.stuttering = 0 H.cultslurring = 0 - return 1 + return TRUE /obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers) var/mob/living/first_invoker = invokers[1] @@ -308,12 +313,16 @@ structure_check() searches for nearby cultist structures required for the invoca stone.invisibility = 0 if(sacrificial) + ADD_TRAIT(sacrificial, TRAIT_SACRIFICED, "sacrificed") if(iscyborg(sacrificial)) - playsound(sacrificial, 'sound/magic/disable_tech.ogg', 100, 1) - sacrificial.dust() //To prevent the MMI from remaining - else - playsound(sacrificial, 'sound/magic/disintegrate.ogg', 100, 1) - sacrificial.gib() + var/mob/living/silicon/robot/bot = sacrificial + playsound(sacrificial, 'sound/magic/disable_tech.ogg', 100, TRUE) + bot.deconstruct() + + else if(ishuman(sacrificial)) + playsound(sacrificial, 'sound/magic/disintegrate.ogg', 100, TRUE) + var/mob/living/carbon/human/H = sacrificial + H.spew_organ(2, 6) return TRUE /obj/effect/rune/empower diff --git a/code/modules/antagonists/devil/devil_helpers.dm b/code/modules/antagonists/devil/devil_helpers.dm index 51d480e64e..1fcbbf91d0 100644 --- a/code/modules/antagonists/devil/devil_helpers.dm +++ b/code/modules/antagonists/devil/devil_helpers.dm @@ -35,4 +35,4 @@ DefaultCombatKnockdown(40) qdel(weapon) return 2 - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/antagonists/devil/sintouched/objectives.dm b/code/modules/antagonists/devil/sintouched/objectives.dm index fae6120f9c..fcbb8dcbb5 100644 --- a/code/modules/antagonists/devil/sintouched/objectives.dm +++ b/code/modules/antagonists/devil/sintouched/objectives.dm @@ -20,4 +20,4 @@ explanation_text = "You are the BEST thing on the station. Make sure everyone knows it." /datum/objective/sintouched/acedia - explanation_text = "Angels, devils, good, evil... who cares? Just ignore any hellish threats and do your job." \ No newline at end of file + explanation_text = "Angels, devils, good, evil... who cares? Just ignore any hellish threats and do your job." diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 272b154828..069080170e 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -11,7 +11,6 @@ gender = NEUTER health = 350 maxHealth = 350 - ventcrawler = VENTCRAWLER_NONE density = TRUE pass_flags = 0 sight = (SEE_TURFS | SEE_OBJS) @@ -105,7 +104,7 @@ /mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 -/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) +/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash, override_protection = 0) if(mind && has_bane(BANE_LIGHT)) mind.disrupt_spells(-500) return ..() //flashes don't stop devils UNLESS it's their bane. diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm index c37abefab0..5e98962740 100644 --- a/code/modules/antagonists/disease/disease_disease.dm +++ b/code/modules/antagonists/disease/disease_disease.dm @@ -5,6 +5,7 @@ viable_mobtypes = list(/mob/living/carbon/human) mutable = FALSE var/mob/camera/disease/overmind + infectable_biotypes = MOB_ORGANIC|MOB_ROBOTIC /datum/disease/advance/sentient_disease/New() ..() diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm index 81bc090460..1e43754477 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm @@ -10,6 +10,8 @@ var/give_equipment = TRUE var/list/researched_knowledge = list() var/total_sacrifices = 0 + var/list/sac_targetted = list() //Which targets did living hearts give them, but they did not sac? + var/list/actually_sacced = list() //Which targets did they actually sac? var/ascended = FALSE /datum/antagonist/heretic/admin_add(datum/mind/new_owner,mob/admin) @@ -31,6 +33,7 @@ /datum/antagonist/heretic/on_gain() var/mob/living/current = owner.current owner.teach_crafting_recipe(/datum/crafting_recipe/heretic/codex) + owner.special_role = ROLE_HERETIC if(ishuman(current)) forge_primary_objectives() gain_knowledge(/datum/eldritch_knowledge/spell/basic) @@ -49,7 +52,7 @@ for(var/X in researched_knowledge) var/datum/eldritch_knowledge/EK = researched_knowledge[X] EK.on_lose(owner.current) - + owner.special_role = null if(!silent) to_chat(owner.current, "Your mind begins to flare as the otherwordly knowledge escapes your grasp!") owner.current.log_message("has renounced the cult of the old ones!", LOG_ATTACK, color="#960000") @@ -75,7 +78,7 @@ var/T = new item_path(H) var/item_name = initial(item_path.name) - var/where = H.equip_in_one_of_slots(T, slots) + var/where = H.equip_in_one_of_slots(T, slots, critical = TRUE) if(!where) to_chat(H, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") return FALSE @@ -98,7 +101,7 @@ var/pck = pick("assasinate","protect") switch(pck) if("assasinate") - var/datum/objective/assassinate/A = new + var/datum/objective/assassinate/once/A = new A.owner = owner var/list/owners = A.get_owners() A.find_target(owners,protection) @@ -174,6 +177,17 @@ knowledge_message += "[EK.name]" parts += knowledge_message.Join(", ") + parts += "Targets assigned by living hearts, but not sacrificed:" + if(!sac_targetted.len) + parts += "None." + else + parts += sac_targetted.Join(",") + parts += "Sacrifices performed:" + if(!actually_sacced.len) + parts += "None!" + else + parts += actually_sacced.Join(",") + return parts.Join("
    ") //////////////// // Knowledge // @@ -212,6 +226,23 @@ if(ascended) . += 20 +/datum/antagonist/heretic/antag_panel() + var/list/parts = list() + parts += ..() + parts += "Targets currently assigned by living hearts (Can give a false negative if they stole someone elses living heart):" + if(!sac_targetted.len) + parts += "None." + else + parts += sac_targetted.Join(",") + parts += "Targets actually sacrificed:" + if(!actually_sacced.len) + parts += "None." + else + parts += actually_sacced.Join(",") + + return (parts.Join("
    ") + "
    ") + + //////////////// // Objectives // //////////////// diff --git a/code/modules/antagonists/eldritch_cult/eldritch_book.dm b/code/modules/antagonists/eldritch_cult/eldritch_book.dm index 839150d37d..33485927ca 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_book.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_book.dm @@ -2,8 +2,10 @@ name = "Codex Cicatrix" desc = "Book describing the secrets of the veil." icon = 'icons/obj/eldritch.dmi' - icon_state = "book" - item_state = "book" + icon_state = "codex" + item_state = "codex" + lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi' w_class = WEIGHT_CLASS_SMALL ///Last person that touched this var/mob/living/last_user @@ -40,7 +42,7 @@ ///Gives you a charge and destroys a corresponding influence /obj/item/forbidden_book/proc/get_power_from_influence(atom/target, mob/user) var/obj/effect/reality_smash/RS = target - to_chat(target, "You start drawing power from influence...") + to_chat(user, "You start drawing power from influence...") if(do_after(user,10 SECONDS,TRUE,RS)) qdel(RS) charge += 1 @@ -50,7 +52,7 @@ for(var/turf/T in range(1,target)) if(is_type_in_typecache(T, blacklisted_turfs)) - to_chat(target, "The terrain doesn't support runes!") + to_chat(user, "The terrain doesn't support runes!") return var/A = get_turf(target) to_chat(user, "You start drawing a rune...") diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm index 99794024f1..ad39e549eb 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm @@ -8,6 +8,12 @@ ///Used mainly for summoning ritual to prevent spamming the rune to create millions of monsters. var/is_in_use = FALSE +/obj/effect/eldritch/Initialize() + . = ..() + var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src) + I.override = TRUE + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "heretic_rune", I) + /obj/effect/eldritch/attack_hand(mob/living/user) . = ..() if(.) @@ -69,6 +75,7 @@ if(is_type_in_list(local_atom_in_range,local_required_atom_list)) selected_atoms |= local_atom_in_range local_required_atoms -= list(local_required_atom_list) + break if(length(local_required_atoms) > 0) continue @@ -190,6 +197,19 @@ icon_state = "pierced_illusion" anchored = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + alpha = 0 + invisibility = INVISIBILITY_OBSERVER + +/obj/effect/broken_illusion/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/show_presence), 15 SECONDS) + var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src) + I.override = TRUE + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "pierced_reality", I) + +/obj/effect/broken_illusion/proc/show_presence() + invisibility = 0 + animate(src, alpha = 255, time = 15 SECONDS) /obj/effect/broken_illusion/attack_hand(mob/living/user) if(!ishuman(user)) @@ -228,17 +248,20 @@ explosion.start() /obj/effect/broken_illusion/examine(mob/user) + . = ..() if(!IS_HERETIC(user) && ishuman(user)) var/mob/living/carbon/human/human_user = user to_chat(human_user,"Your brain hurts when you look at this!") - human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,30) - . = ..() + human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,20,190) + SEND_SIGNAL(human_user, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) + log_game("[key_name(user)] stared at a pierced reality at [AREACOORD(user)]") /obj/effect/reality_smash name = "/improper reality smash" icon = 'icons/effects/eldritch.dmi' anchored = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + invisibility = INVISIBILITY_OBSERVER ///We cannot use icon_state since this is invisible, functions the same way but with custom behaviour. var/image_state = "reality_smash" ///Who can see us? diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index 2052a2fbb3..ea6d1d50e2 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -6,6 +6,17 @@ w_class = WEIGHT_CLASS_SMALL ///Target var/mob/living/carbon/human/target + var/datum/antagonist/heretic/sac_targetter //The heretic who used this to acquire the current target - gets cleared when target gets sacrificed. + +/obj/item/living_heart/Initialize() + . = ..() + GLOB.living_heart_cache.Add(src) //Add is better than +=. + +/obj/item/living_heart/Destroy() + GLOB.living_heart_cache.Remove(src) + if(sac_targetter && target) + sac_targetter.sac_targetted.Remove(target.real_name) + return ..() /obj/item/living_heart/attack_self(mob/user) . = ..() @@ -16,9 +27,9 @@ return var/dist = get_dist(user.loc,target.loc) var/dir = get_dir(user.loc,target.loc) - + if(user.z != target.z) - to_chat(user,"[target.real_name] is beyond our reach.") + to_chat(user,"[target.real_name] is on another plane of existance!") else switch(dist) if(0 to 15) @@ -33,6 +44,36 @@ if(target.stat == DEAD) to_chat(user,"[target.real_name] is dead. Bring them onto a transmutation rune!") +/datum/action/innate/heretic_shatter + name = "Shattering Offer" + desc = "By breaking your blade, you will be granted salvation from a dire situation. (Teleports you to a random safe turf on your current z level, but destroys your blade.)" + background_icon_state = "bg_ecult" + button_icon_state = "shatter" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + check_flags = NONE // required_mobility_flags handles this + required_mobility_flags = MOBILITY_HOLD|MOBILITY_MOVE|MOBILITY_USE + var/mob/living/carbon/human/holder + var/obj/item/melee/sickly_blade/sword + +/datum/action/innate/heretic_shatter/Grant(mob/user, obj/object) + sword = object + holder = user + //i know what im doing + return ..() + +/datum/action/innate/heretic_shatter/IsAvailable() + if(IS_HERETIC(holder) || IS_HERETIC_MONSTER(holder)) + return ..() + else + return FALSE + +/datum/action/innate/heretic_shatter/Activate() + . = ..() + var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE) + do_teleport(holder,safe_turf,forceMove = TRUE) + to_chat(holder,"You feel a gust of energy flow through your body... the Rusted Hills heard your call...") + qdel(sword) + /obj/item/melee/sickly_blade name = "eldritch blade" desc = "A sickly green crescent blade, decorated with an ornamental eye. You feel like you're being watched..." @@ -50,15 +91,28 @@ throwforce = 10 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "rended") + var/datum/action/innate/heretic_shatter/linked_action + +/obj/item/melee/sickly_blade/Initialize() + . = ..() + linked_action = new(src) /obj/item/melee/sickly_blade/attack(mob/living/M, mob/living/user) - if(!IS_HERETIC(user)) + if(!(IS_HERETIC(user) || !IS_HERETIC_MONSTER(user))) to_chat(user,"You feel a pulse of some alien intellect lash out at your mind!") var/mob/living/carbon/human/human_user = user human_user.AdjustParalyzed(5 SECONDS) return FALSE return ..() +/obj/item/melee/sickly_blade/pickup(mob/user) + . = ..() + linked_action.Grant(user, src) + +/obj/item/melee/sickly_blade/dropped(mob/user, silent) + . = ..() + linked_action.Remove(user, src) + /obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() var/datum/antagonist/heretic/cultie = user.mind.has_antag_datum(/datum/antagonist/heretic) @@ -103,7 +157,7 @@ /obj/item/clothing/neck/eldritch_amulet/equipped(mob/user, slot) . = ..() - if(ishuman(user) && user.mind && slot == SLOT_NECK && IS_HERETIC(user)) + if(ishuman(user) && user.mind && slot == SLOT_NECK && (IS_HERETIC(user) || IS_HERETIC_MONSTER(user))) ADD_TRAIT(user, trait, CLOTHING_TRAIT) user.update_sight() @@ -136,6 +190,7 @@ hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch // slightly better than normal cult robes armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 35, "bio" = 20, "rad" = 0, "fire" = 20, "acid" = 20) + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/reagent_containers/glass/beaker/eldritch name = "flask of eldritch essence" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm index a7330cd93a..481ac08ea5 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm @@ -1,6 +1,6 @@ /** - * #Eldritch Knwoledge + * #Eldritch Knowledge * * Datum that makes eldritch cultist interesting. * @@ -252,6 +252,10 @@ LH.target = null var/datum/antagonist/heretic/EC = carbon_user.mind.has_antag_datum(/datum/antagonist/heretic) + EC.actually_sacced.Add(H.real_name) + if(LH.sac_targetter) + LH.sac_targetter.sac_targetted.Remove(H.real_name) + LH.sac_targetter = null EC.total_sacrifices++ for(var/X in carbon_user.get_all_gear()) if(!istype(X,/obj/item/forbidden_book)) @@ -264,11 +268,39 @@ if(!LH.target) var/datum/objective/A = new A.owner = user.mind - var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code - LH.target = targeted.current + var/list/targets = list() + var/list/target_blacklist = list() + for(var/obj/item/living_heart/CLH in GLOB.living_heart_cache) + if(!CLH || !CLH.target || !CLH.target.mind) + continue + target_blacklist.Add(CLH.target.mind) + + for(var/i in 0 to 3) + var/datum/mind/targeted = A.find_target(blacklist = target_blacklist)//easy way, i dont feel like copy pasting that entire block of code + if(!targeted) + break + targets[targeted.current.real_name] = targeted.current + LH.target = targets[input(user,"Choose your next target","Target") in targets] + + if(!LH.target && targets.len) + LH.target = pick(targets) //Tsk tsk, you can and will get another target if you want it or not. + + if(LH.target) + target_blacklist = list() + for(var/obj/item/living_heart/CLH in (GLOB.living_heart_cache - LH)) //Recreate blacklist, excluding ourselves. + if(!CLH || !CLH.target || !CLH.target.mind) + continue + target_blacklist.Add(CLH.target.mind) + if(LH.target.mind in target_blacklist) //Someone was faster, or you tried to cheese the system. + to_chat(user, "It seems you were too slow, and your target of choice has already been selected by another living heart!") + LH.target = null + qdel(A) if(LH.target) to_chat(user,"Your new target has been selected, go and sacrifice [LH.target.real_name]!") + var/datum/antagonist/heretic/EC = carbon_user.mind.has_antag_datum(/datum/antagonist/heretic) + LH.sac_targetter = EC + EC.sac_targetted.Add(LH.target.real_name) else to_chat(user,"target could not be found for living heart.") diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index fbaa6cd26e..ba79cca07a 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -34,7 +34,7 @@ desc = "Touch spell that allows you to channel the power of the Old Gods through you." hand_path = /obj/item/melee/touch_attack/mansus_fist school = "evocation" - charge_max = 150 + charge_max = 100 clothes_req = FALSE action_icon = 'icons/mob/actions/actions_ecult.dmi' action_icon_state = "mansus_grasp" @@ -104,57 +104,61 @@ desc = "Spreads rust onto nearby turfs." range = 2 -/obj/effect/proc_holder/spell/targeted/touch/blood_siphon +/obj/effect/proc_holder/spell/pointed/blood_siphon name = "Blood Siphon" - desc = "Touch spell that heals you while damaging the enemy, has a chance to transfer wounds between you and your enemy." - hand_path = /obj/item/melee/touch_attack/blood_siphon + desc = "A touch spell that heals your wounds while damaging the enemy. It has a chance to transfer wounds between you and your enemy." school = "evocation" charge_max = 150 clothes_req = FALSE - invocation_type = "none" + invocation = "FL'MS O'ET'RN'ITY" + invocation_type = "whisper" action_icon = 'icons/mob/actions/actions_ecult.dmi' action_icon_state = "blood_siphon" action_background_icon_state = "bg_ecult" + range = 9 -/obj/item/melee/touch_attack/blood_siphon - name = "Blood Siphon" - desc = "A sinister looking aura that distorts the flow of reality around it." - color = RUNE_COLOR_RED - icon_state = "disintegrate" - item_state = "disintegrate" - catchphrase = "SUN'AI'KINI'MAS" - -/obj/item/melee/touch_attack/blood_siphon/afterattack(atom/target, mob/user, proximity_flag, proximity) - if(!proximity_flag) - return - playsound(user, 'sound/effects/curseattack.ogg', 75, TRUE) +/obj/effect/proc_holder/spell/pointed/blood_siphon/cast(list/targets, mob/user) + . = ..() + var/target = targets[1] + playsound(user, 'sound/magic/demon_attack1.ogg', 75, TRUE) if(ishuman(target)) var/mob/living/carbon/human/tar = target if(tar.anti_magic_check()) - tar.visible_message("Spell bounces off of [target]!","The spell bounces off of you!") + tar.visible_message("The spell bounces off of [target]!","The spell bounces off of you!") return ..() - var/mob/living/carbon/C2 = user + var/mob/living/carbon/carbon_user = user if(isliving(target)) - var/mob/living/L = target - L.adjustBruteLoss(20) - C2.adjustBruteLoss(-20) + var/mob/living/living_target = target + living_target.adjustBruteLoss(20) + carbon_user.adjustBruteLoss(-20) if(iscarbon(target)) - var/mob/living/carbon/C1 = target - for(var/obj/item/bodypart/bodypart in C2.bodyparts) + var/mob/living/carbon/carbon_target = target + for(var/bp in carbon_user.bodyparts) + var/obj/item/bodypart/bodypart = bp for(var/i in bodypart.wounds) var/datum/wound/iter_wound = i if(prob(50)) continue - var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in C1.bodyparts + var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in carbon_target.bodyparts if(!target_bodypart) continue iter_wound.remove_wound() iter_wound.apply_wound(target_bodypart) - C1.blood_volume -= 20 - if(C2.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all - C2.blood_volume += 20 - return ..() + carbon_target.blood_volume -= 20 + if(carbon_user.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all + carbon_user.blood_volume += 20 + return + +/obj/effect/proc_holder/spell/pointed/blood_siphon/can_target(atom/target, mob/user, silent) + . = ..() + if(!.) + return FALSE + if(!istype(target,/mob/living)) + if(!silent) + to_chat(user, "You are unable to siphon [target]!") + return FALSE + return TRUE /obj/effect/proc_holder/spell/aimed/rust_wave name = "Patron's Reach" @@ -451,7 +455,7 @@ new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) for(var/mob/living/livies in T.contents - centre) - livies.adjustFireLoss(10) + livies.adjustFireLoss(5) _range++ sleep(3) @@ -500,7 +504,7 @@ new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) for(var/mob/living/livies in T.contents - current_user) - livies.adjustFireLoss(5) + livies.adjustFireLoss(2.5) /obj/effect/proc_holder/spell/targeted/worm_contract @@ -519,6 +523,7 @@ . = ..() if(!istype(user,/mob/living/simple_animal/hostile/eldritch/armsy)) to_chat(user, "You try to contract your muscles but nothing happens...") + return var/mob/living/simple_animal/hostile/eldritch/armsy/armsy = user armsy.contract_next_chain_into_single_tile() @@ -727,7 +732,7 @@ /obj/effect/proc_holder/spell/cone/staggered/entropic_plume/do_mob_cone_effect(mob/living/victim, level) . = ..() - if(victim.anti_magic_check() || IS_HERETIC(victim) || victim.mind?.has_antag_datum(/datum/antagonist/heretic_monster)) + if(victim.anti_magic_check() || IS_HERETIC(victim) || IS_HERETIC_MONSTER(victim)) return victim.apply_status_effect(STATUS_EFFECT_AMOK) victim.apply_status_effect(STATUS_EFFECT_CLOUDSTRUCK, (level*10)) diff --git a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm index 425052de2a..1edb0ff19a 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm @@ -190,7 +190,7 @@ required_atoms = list(/mob/living/carbon/human) cost = 5 route = PATH_ASH - var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_BOMBIMMUNE) + var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE) /datum/eldritch_knowledge/final/ash_final/on_finished_recipe(mob/living/user, list/atoms, loc) priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the blaze, for Ashbringer [user.real_name] has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/announcer/classic/spanomalies.ogg') diff --git a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm index 5e32cf1b4e..2b9f5b309f 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm @@ -173,9 +173,9 @@ /datum/eldritch_knowledge/summon/stalker name = "Lonely Ritual" gain_text = "I was able to combine my greed and desires to summon an eldritch beast I have not seen before." - desc = "You can now summon a Stalker using a knife, a flower, a pen and a piece of paper using a transmutation circle. Stalkers possess the ability to shapeshift into various forms while assuming the vigor and powers of that form." + desc = "You can now summon a Stalker using a knife, a candle, a pen and a piece of paper using a transmutation circle. Stalkers possess the ability to shapeshift into various forms while assuming the vigor and powers of that form." cost = 1 - required_atoms = list(/obj/item/kitchen/knife,/obj/item/reagent_containers/food/snacks/grown/poppy,/obj/item/pen,/obj/item/paper) + required_atoms = list(/obj/item/kitchen/knife,/obj/item/candle,/obj/item/pen,/obj/item/paper) mob_to_summon = /mob/living/simple_animal/hostile/eldritch/stalker next_knowledge = list(/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/summon/rusty,/datum/eldritch_knowledge/flesh_blade_upgrade_2) route = PATH_FLESH @@ -203,7 +203,7 @@ gain_text = "Our blood is all the same after all, the owl told me." desc = "You are granted a spell that drains some of the targets health, and returns it to you. It also has a chance to transfer any wounds you possess onto the target." cost = 1 - spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/blood_siphon + spell_to_add = /obj/effect/proc_holder/spell/pointed/blood_siphon next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet,/datum/eldritch_knowledge/spell/area_conversion) /datum/eldritch_knowledge/final/flesh_final diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index f5c54dd7bf..9d65396c63 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -69,7 +69,7 @@ var/mob/living/living_user = user living_user.adjustBruteLoss(-3, FALSE) living_user.adjustFireLoss(-3, FALSE) - living_user.adjustToxLoss(-3, FALSE) + living_user.adjustToxLoss(-3, FALSE, TRUE) living_user.adjustOxyLoss(-1, FALSE) living_user.adjustStaminaLoss(-6) diff --git a/code/modules/antagonists/magic_servant/magic_servant.dm b/code/modules/antagonists/magic_servant/magic_servant.dm index 31b51f59f6..de6ab06202 100644 --- a/code/modules/antagonists/magic_servant/magic_servant.dm +++ b/code/modules/antagonists/magic_servant/magic_servant.dm @@ -6,4 +6,4 @@ /datum/antagonist/magic_servant/proc/setup_master(mob/M) var/datum/objective/O = new("Serve [M.real_name].") O.owner = owner - objectives |= O \ No newline at end of file + objectives |= O diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index e91feda006..077c380ef0 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -15,7 +15,6 @@ stop_automated_movement = 1 status_flags = CANPUSH pass_flags = PASSTABLE - ventcrawler = VENTCRAWLER_ALWAYS atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxHealth = 150 @@ -42,7 +41,9 @@ /obj/screen, /obj/singularity, /mob/living/simple_animal/hostile/morph, - /obj/effect)) + /obj/effect, + /mob/camera + )) var/playstyle_string = "You are a morph,
    an abomination of science created primarily with changeling cells. \ You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ @@ -51,6 +52,10 @@ You can attack any item or dead creature to consume it - creatures will fully restore your health. \ Finally, you can restore yourself to your original form while morphed by shift-clicking yourself." +/mob/living/simple_animal/hostile/morph/Initialize() + . = ..() + src.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) + /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) . = form.examine(user) diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm index e25e0cd164..b3c31152a5 100644 --- a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm +++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm @@ -178,4 +178,4 @@ /obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/user) if(active) to_chat(user, "Your chameleon field deactivates.") - deactivate(user) \ No newline at end of file + deactivate(user) diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index a18906b70b..7d669e5c41 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -104,7 +104,7 @@ switch(deconstruction_state) if(NUKESTATE_INTACT) - if(istype(I, /obj/item/screwdriver/nuke)) + if(istype(I, /obj/item/screwdriver/nuke)) //Special case, cannot replace with tool_behavior to_chat(user, "You start removing [src]'s front panel's screws...") if(I.use_tool(src, user, 60, volume=100)) deconstruction_state = NUKESTATE_UNSCREWED @@ -617,9 +617,12 @@ This is here to make the tiles around the station mininuke change when it's arme var/fake = FALSE var/turf/lastlocation var/last_disk_move + var/process_tick = 0 /obj/item/disk/nuclear/Initialize() . = ..() + AddElement(/datum/element/bed_tuckable, 6, -6, 0) + if(!fake) GLOB.poi_list |= src last_disk_move = world.time @@ -630,11 +633,25 @@ This is here to make the tiles around the station mininuke change when it's arme AddComponent(/datum/component/stationloving, !fake) /obj/item/disk/nuclear/process() + ++process_tick if(fake) STOP_PROCESSING(SSobj, src) CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck") var/turf/newturf = get_turf(src) + if(newturf && lastlocation == newturf) + + // How comfy is disky? + var/disk_comfort_level = 0 + + // Checking for items that make disky comfy + for(var/obj/comfort_item in loc) + if(istype(comfort_item, /obj/item/bedsheet) || istype(comfort_item, /obj/structure/bed)) + disk_comfort_level++ + + if(disk_comfort_level >= 2) //Sleep tight, disky. + if(process_tick % 30) + visible_message("[src] sleeps soundly. Sleep tight, disky.") if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001)) var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control if(istype(loneop) && loneop.occurrences < loneop.max_occurrences) diff --git a/code/modules/antagonists/overthrow/overthrow.dm b/code/modules/antagonists/overthrow/overthrow.dm index 0e8c4a35e0..8fa5517b4f 100644 --- a/code/modules/antagonists/overthrow/overthrow.dm +++ b/code/modules/antagonists/overthrow/overthrow.dm @@ -131,14 +131,14 @@ "left pocket" = SLOT_L_STORE, "right pocket" = SLOT_R_STORE ) - var/where = H.equip_in_one_of_slots(O, slots) + var/where = H.equip_in_one_of_slots(O, slots, critical = TRUE) if (!where) to_chat(H, "The Syndicate were unfortunately unable to get you the AI module.") else to_chat(H, "Use the AI board in your [where] to take control of the AI, as requested by the Syndicate.") // Give the implant converter var/obj/item/overthrow_converter/I = new(H) - where = H.equip_in_one_of_slots(I, slots) + where = H.equip_in_one_of_slots(I, slots, critical = TRUE) if (!where) to_chat(H, "The Syndicate were unfortunately unable to get you a converter implant.") else diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index f5ebcffe35..ef58e5af39 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -72,6 +72,7 @@ var/list/drained_mobs = list() //Cannot harvest the same mob twice var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. //TODO, add objective for getting a perfect soul(s?) var/generated_objectives_and_spells = FALSE + var/telekinesis_cooldown /mob/living/simple_animal/revenant/Initialize(mapload) . = ..() @@ -93,13 +94,16 @@ /mob/living/simple_animal/revenant/Login() ..() - to_chat(src, "You are a revenant.") - to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.") - to_chat(src, "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.") - to_chat(src, "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.") - to_chat(src, "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.") - to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death.") - to_chat(src, "Be sure to read the wiki page to learn more.") + var/revenant_greet + revenant_greet += "You are a revenant." + revenant_greet += "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant." + revenant_greet += "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds." + revenant_greet += "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable." + revenant_greet += "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities." + revenant_greet += "You do not remember anything of your past lives, nor will you remember anything about this one after your death." + revenant_greet += "Be sure to read the wiki page to learn more." + revenant_greet += "You are also able to telekinetically throw objects by clickdragging them." + to_chat(src, revenant_greet) if(!generated_objectives_and_spells) generated_objectives_and_spells = TRUE mind.assigned_role = ROLE_REVENANT @@ -317,6 +321,12 @@ to_chat(src, "Lost [essence_amt]E[source ? " from [source]":""].") return 1 +/mob/living/simple_animal/revenant/proc/telekinesis_cooldown_end() + if(!telekinesis_cooldown) + CRASH("telekinesis_cooldown_end ran when telekinesis_cooldown on [src] was false") + else + telekinesis_cooldown = FALSE + /mob/living/simple_animal/revenant/proc/death_reset() revealed = FALSE unreveal_time = 0 @@ -431,6 +441,38 @@ qdel(revenant) ..() +/proc/RevenantThrow(over, mob/user, obj/item/throwable) + var/mob/living/simple_animal/revenant/spooker = user + if(!istype(throwable)) + return + if(!throwable.anchored && !spooker.telekinesis_cooldown && spooker.essence > 20) + if(7 < get_dist(throwable, spooker)) + return + if(3 >= get_dist(throwable, spooker)) + spooker.stun(10) + spooker.reveal(25) + else + spooker.stun(20) + spooker.reveal(50) + spooker.change_essence_amount(-20, FALSE, "telekinesis") + spooker.telekinesis_cooldown = TRUE + throwable.float(TRUE, TRUE) + sleep(20) + throwable.DoRevenantThrowEffects(over) + throwable.throw_at(over, 10, 2) + ADD_TRAIT(throwable, TRAIT_SPOOKY_THROW, "revenant") + log_combat(throwable, over, "spooky telekinesised at", throwable) + var/obj/effect/temp_visual/telekinesis/T = new(get_turf(throwable)) + T.color = "#8715b4" + addtimer(CALLBACK(spooker, /mob/living/simple_animal/revenant.proc/telekinesis_cooldown_end), 50) + sleep(5) + throwable.float(FALSE, TRUE) + + +//Use this for effects you want to happen when a revenant throws stuff, check the TRAIT_SPOOKY_THROW if you want to know if its still being thrown +/obj/item/proc/DoRevenantThrowEffects(atom/target) + return TRUE + //objectives /datum/objective/revenant var/targetAmount = 100 diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 4f308cc4c0..c23523cc6b 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -251,7 +251,7 @@ "left pocket" = SLOT_L_STORE, "right pocket" = SLOT_R_STORE ) - var/where = H.equip_in_one_of_slots(T, slots) + var/where = H.equip_in_one_of_slots(T, slots, critical = TRUE) if (!where) to_chat(H, "The Syndicate were unfortunately unable to get you a flash.") else diff --git a/code/modules/antagonists/santa/santa.dm b/code/modules/antagonists/santa/santa.dm index ff7dae98f6..ade8f09ce1 100644 --- a/code/modules/antagonists/santa/santa.dm +++ b/code/modules/antagonists/santa/santa.dm @@ -28,4 +28,4 @@ santa_objective.explanation_text = "Bring joy and presents to the station!" santa_objective.completed = 1 //lets cut our santas some slack. santa_objective.owner = owner - objectives |= santa_objective \ No newline at end of file + objectives |= santa_objective diff --git a/code/modules/antagonists/separatist/separatist.dm b/code/modules/antagonists/separatist/separatist.dm index cb7e0bf28e..20a6d84bde 100644 --- a/code/modules/antagonists/separatist/separatist.dm +++ b/code/modules/antagonists/separatist/separatist.dm @@ -16,4 +16,4 @@ return nation /datum/antagonist/separatist/greet() - to_chat(owner, "You are a separatist! [nation.name] forever! Protect the sovereignty of your newfound land with your comrades in arms!") \ No newline at end of file + to_chat(owner, "You are a separatist! [nation.name] forever! Protect the sovereignty of your newfound land with your comrades in arms!") diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 7444905b89..f283e33899 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -43,7 +43,7 @@ to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.") /obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM) + if(W.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent != INTENT_HARM) user.visible_message("[usr.name] deactivates [src].", "After some fiddling, you find a way to disable [src]'s power source.", "You hear clicking.") @@ -93,7 +93,6 @@ AIStatus = AI_OFF pass_flags = PASSTABLE mob_size = MOB_SIZE_TINY - ventcrawler = VENTCRAWLER_ALWAYS ranged = 1 projectiletype = /obj/item/projectile/beam/disabler ranged_cooldown_time = 20 @@ -112,6 +111,7 @@ remove_verb(src, /mob/living/verb/pulled) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diag_hud.add_to_hud(src) + AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) /mob/living/simple_animal/hostile/swarmer/med_hud_set_health() var/image/holder = hud_list[DIAG_HUD] diff --git a/code/modules/antagonists/traitor/classes/ai.dm b/code/modules/antagonists/traitor/classes/ai.dm index b4d0135ce6..0c1709ee53 100644 --- a/code/modules/antagonists/traitor/classes/ai.dm +++ b/code/modules/antagonists/traitor/classes/ai.dm @@ -9,7 +9,7 @@ objective_count += forge_single_objective() for(var/i = objective_count, i < CONFIG_GET(number/traitor_objectives_amount), i++) - var/datum/objective/assassinate/kill_objective = new + var/datum/objective/assassinate/once/kill_objective = new kill_objective.owner = T.owner kill_objective.find_target() T.add_objective(kill_objective) diff --git a/code/modules/antagonists/traitor/classes/assassin.dm b/code/modules/antagonists/traitor/classes/assassin.dm index 6b709aac59..8175ad9736 100644 --- a/code/modules/antagonists/traitor/classes/assassin.dm +++ b/code/modules/antagonists/traitor/classes/assassin.dm @@ -8,11 +8,9 @@ /datum/traitor_class/human/assassin/forge_single_objective(datum/antagonist/traitor/T) .=1 var/permakill_prob = 20 - var/is_dynamic = FALSE var/datum/game_mode/dynamic/mode if(istype(SSticker.mode,/datum/game_mode/dynamic)) mode = SSticker.mode - is_dynamic = TRUE permakill_prob = max(0,mode.threat_level-50) var/list/active_ais = active_ais() if(active_ais.len && prob(100/GLOB.joined_player_list.len)) @@ -20,11 +18,6 @@ destroy_objective.owner = T.owner destroy_objective.find_target() T.add_objective(destroy_objective) - else if(prob(30) || (is_dynamic && (mode.storyteller.flags & NO_ASSASSIN))) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = T.owner - maroon_objective.find_target() - T.add_objective(maroon_objective) else if(prob(permakill_prob)) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = T.owner diff --git a/code/modules/antagonists/traitor/classes/human.dm b/code/modules/antagonists/traitor/classes/human.dm index 30aa11e39d..16f65a63c3 100644 --- a/code/modules/antagonists/traitor/classes/human.dm +++ b/code/modules/antagonists/traitor/classes/human.dm @@ -41,11 +41,6 @@ destroy_objective.owner = T.owner destroy_objective.find_target() T.add_objective(destroy_objective) - else if(prob(30) || (is_dynamic && (mode.storyteller.flags & NO_ASSASSIN))) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = T.owner - maroon_objective.find_target() - T.add_objective(maroon_objective) else if(prob(max(0,assassin_prob-20))) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = T.owner diff --git a/code/modules/antagonists/traitor/classes/subterfuge.dm b/code/modules/antagonists/traitor/classes/subterfuge.dm index 07707b69e1..73dc455a45 100644 --- a/code/modules/antagonists/traitor/classes/subterfuge.dm +++ b/code/modules/antagonists/traitor/classes/subterfuge.dm @@ -12,16 +12,10 @@ mode = SSticker.mode assassin_prob = max(0,mode.threat_level-40) if(prob(assassin_prob)) - if(prob(assassin_prob)) - var/datum/objective/assassinate/once/kill_objective = new - kill_objective.owner = T.owner - kill_objective.find_target() - T.add_objective(kill_objective) - else - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = T.owner - maroon_objective.find_target() - T.add_objective(maroon_objective) + var/datum/objective/assassinate/once/kill_objective = new + kill_objective.owner = T.owner + kill_objective.find_target() + T.add_objective(kill_objective) else var/list/weights = list() weights["sabo"] = length(subtypesof(/datum/sabotage_objective)) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 0309b7e826..47a9c59274 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -212,7 +212,7 @@ ) var/where = "At your feet" - var/equipped_slot = mob.equip_in_one_of_slots(folder, slots) + var/equipped_slot = mob.equip_in_one_of_slots(folder, slots, critical = TRUE) if (equipped_slot) where = "In your [equipped_slot]" to_chat(mob, "

    [where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
    ") diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 149b869649..0659655da5 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -261,6 +261,8 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( return //prevent the AI from activating an already active doomsday if (owner_AI.shunted) return //prevent AI from activating doomsday while shunted. + if (istype(owner.loc, /obj/item/aicard)) + return //prevent AI from activating doomsday while carded. If the AI gets carded after doomsdaying, there's already code to stop it then. active = TRUE set_us_up_the_bomb(owner) @@ -327,6 +329,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( sleep(30) if(QDELETED(owner) || owner.stat == DEAD) return + if(istype(owner.loc, /obj/item/aicard)) + to_chat(owner, "Error: Signal transmission failed. Reason: Lost connection to network.") + to_chat(owner, "You can't activate the doomsday device while inside an intelliCard!") + return priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", "aimalf") set_security_level("delta") var/obj/machinery/doomsday_device/DOOM = new(owner_AI) diff --git a/code/modules/antagonists/traitor/equipment/contractor.dm b/code/modules/antagonists/traitor/equipment/contractor.dm index 94a3059b5f..525f40d1f7 100644 --- a/code/modules/antagonists/traitor/equipment/contractor.dm +++ b/code/modules/antagonists/traitor/equipment/contractor.dm @@ -43,7 +43,7 @@ var/list/to_generate = list( CONTRACT_PAYOUT_LARGE, CONTRACT_PAYOUT_MEDIUM, - CONTRACT_PAYOUT_SMALL, + CONTRACT_PAYOUT_MEDIUM, CONTRACT_PAYOUT_SMALL, CONTRACT_PAYOUT_SMALL, CONTRACT_PAYOUT_SMALL @@ -187,8 +187,8 @@ partner_outfit.equip(partner) - var/obj/structure/closet/supplypod/arrival_pod = new() - + var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas + var/obj/structure/closet/supplypod/arrival_pod = new(pick(get_area_turfs(pod_storage_area))) arrival_pod.style = STYLE_SYNDICATE arrival_pod.explosionSize = list(0,0,0,1) arrival_pod.bluespace = TRUE @@ -203,7 +203,7 @@ partner_mind.make_Contractor_Support() to_chat(partner_mind.current, "\n[user.real_name] is your superior. Follow any, and all orders given by them. You're here to support their mission only.") to_chat(partner_mind.current, "Should they perish, or be otherwise unavailable, you're to assist other active agents in this mission area to the best of your ability.\n\n") - new /obj/effect/abstract/DPtarget(free_location, arrival_pod) + new /obj/effect/pod_landingzone(free_location, arrival_pod) /datum/contractor_item/blackout name = "Blackout" diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm index 0f67616a32..945823e95c 100644 --- a/code/modules/antagonists/traitor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/syndicate_contract.dm @@ -59,7 +59,8 @@ // Launch the pod to collect our victim. /datum/syndicate_contract/proc/launch_extraction_pod(turf/empty_pod_turf) - var/obj/structure/closet/supplypod/extractionpod/empty_pod = new() + var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas + var/obj/structure/closet/supplypod/extractionpod/empty_pod = new(pick(get_area_turfs(pod_storage_area))) //Lets not runtime RegisterSignal(empty_pod, COMSIG_ATOM_ENTERED, .proc/enter_check) @@ -68,7 +69,7 @@ empty_pod.explosionSize = list(0,0,0,1) empty_pod.leavingSound = 'sound/effects/podwoosh.ogg' - new /obj/effect/abstract/DPtarget(empty_pod_turf, empty_pod) + new /obj/effect/pod_landingzone(empty_pod_turf, empty_pod) /datum/syndicate_contract/proc/enter_check(datum/source, sent_mob) if(istype(source, /obj/structure/closet/supplypod/extractionpod)) @@ -111,7 +112,7 @@ var/obj/structure/closet/supplypod/extractionpod/pod = source // Handle the pod returning - pod.send_up(pod) + pod.startExitSequence(pod) if(ishuman(M)) var/mob/living/carbon/human/target = M @@ -180,8 +181,8 @@ if(possible_drop_loc.len > 0) var/pod_rand_loc = rand(1, possible_drop_loc.len) - - var/obj/structure/closet/supplypod/return_pod = new() + var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas + var/obj/structure/closet/supplypod/return_pod = new(pick(get_area_turfs(pod_storage_area))) return_pod.bluespace = TRUE return_pod.explosionSize = list(0,0,0,0) return_pod.style = STYLE_SYNDICATE @@ -202,7 +203,7 @@ M.blur_eyes(30) M.Dizzy(35) M.confused += 20 - new /obj/effect/abstract/DPtarget(possible_drop_loc[pod_rand_loc], return_pod) + new /obj/effect/pod_landingzone(possible_drop_loc[pod_rand_loc], return_pod) else to_chat(M, "A million voices echo in your head... \"Seems where you got sent here from won't \ be able to handle our pod... You will die here instead.\"") diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm index b78e8d574f..526646d975 100644 --- a/code/modules/antagonists/valentines/heartbreaker.dm +++ b/code/modules/antagonists/valentines/heartbreaker.dm @@ -16,4 +16,4 @@ /datum/antagonist/heartbreaker/greet() to_chat(owner, "You didn't get a date! They're all having fun without you! you'll show them though...") - owner.announce_objectives() \ No newline at end of file + owner.announce_objectives() diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 46961c0caf..8303de60cc 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -36,7 +36,7 @@ /obj/item/soulstone/examine(mob/user) . = ..() - if(usability || iscultist(user, TRUE) || iswizard(user) || isobserver(user)) + if(usability || iscultist(user) || iswizard(user) || isobserver(user)) if (old_shard) . += "A soulstone, used to capture a soul, either from dead humans or from freed shades." else @@ -46,7 +46,7 @@ . += "This shard is spent; it is now just a creepy rock." /obj/item/soulstone/Destroy() //Stops the shade from being qdel'd immediately and their ghost being sent back to the arrival shuttle. - for(var/mob/living/simple_animal/shade/A in src) + for(var/mob/living/simple_animal/hostile/construct/shade/A in src) A.death() return ..() @@ -58,7 +58,7 @@ to_chat(user, "Your body is wracked with debilitating pain!") return if(spent) - to_chat(user, "There is no power left in the shard.") + to_chat(user, "There is no power left in [src].") return if(!ishuman(M))//If target is not a human. return ..() @@ -81,7 +81,7 @@ release_shades(user) /obj/item/soulstone/proc/release_shades(mob/user) - for(var/mob/living/simple_animal/shade/A in src) + for(var/mob/living/simple_animal/hostile/construct/shade/A in src) A.status_flags &= ~GODMODE A.forceMove(get_turf(user)) A.mobility_flags = MOBILITY_FLAGS_DEFAULT @@ -103,12 +103,12 @@ /obj/structure/constructshell/examine(mob/user) . = ..() - if(iscultist(user, TRUE) || iswizard(user) || user.stat == DEAD) - . += "A construct shell, used to house bound souls from a soulstone." - . += "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:" - . += "An Artificer, which can produce more shells and soulstones, as well as fortifications." - . += "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile." - . += "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow." + if(iscultist(user) || iswizard(user) || user.stat == DEAD) + . += {"A construct shell, used to house bound souls from a soulstone.\n + Placing a soulstone with a soul into this shell allows you to produce your choice of the following:\n + An Artificer, which can produce more shells and soulstones, as well as fortifications.\n + A Wraith, which does high damage and can jaunt through walls, though it is quite fragile.\n + A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow."} /obj/structure/constructshell/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/soulstone)) @@ -145,14 +145,14 @@ if("VICTIM") var/mob/living/carbon/human/T = target var/datum/antagonist/cult/C = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(C && C.cult_team?.is_sacrifice_target(T.mind)) + if(C?.cult_team.is_sacrifice_target(T.mind)) if(iscultist(user)) to_chat(user, "\"This soul is mine. SACRIFICE THEM!\"") else - to_chat(user, "The soulstone seems to reject this soul.") + to_chat(user, "[src] seems to reject this soul.") return FALSE if(contents.len) - to_chat(user, "Capture failed!: The soulstone is full! Free an existing soul to make room.") + to_chat(user, "Capture failed!: [src] is full! Free an existing soul to make room.") else if((!old_shard && T.stat != CONSCIOUS) || (old_shard && T.stat == DEAD)) if(T.client == null) @@ -167,7 +167,7 @@ to_chat(user, "Capture failed!: Kill or maim the victim first!") if("SHADE") - var/mob/living/simple_animal/shade/T = target + var/mob/living/simple_animal/hostile/construct/shade/T = target if(contents.len) to_chat(user, "Capture failed!: The soulstone is full! Free an existing soul to make room.") else @@ -177,13 +177,13 @@ T.health = T.maxHealth icon_state = "soulstone2" name = "soulstone: Shade of [T.real_name]" - to_chat(T, "Your soul has been captured by the soulstone. Its arcane energies are reknitting your ethereal form.") + to_chat(T, "Your soul has been captured by [src]. Its arcane energies are reknitting your ethereal form.") if(user != T) - to_chat(user, "Capture successful!: [T.real_name]'s soul has been captured and stored within the soulstone.") + to_chat(user, "Capture successful!: [T.real_name]'s soul has been captured and stored within [src].") if("CONSTRUCT") var/obj/structure/constructshell/T = target - var/mob/living/simple_animal/shade/A = locate() in src + var/mob/living/simple_animal/hostile/construct/shade/A = locate() in src if(A) var/construct_class = alert(user, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") if(!T || !T.loc) @@ -199,8 +199,8 @@ if(iscultist(user) || iswizard(user)) makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, A, user, 0, T.loc) - else - makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/noncult, A, user, 0, T.loc) + else + return for(var/datum/mind/B in SSticker.mode.cult) if(B == A.mind) SSticker.mode.cult -= A.mind @@ -208,19 +208,24 @@ qdel(T) qdel(src) else - to_chat(user, "Creation failed!: The soul stone is empty! Go kill someone!") + to_chat(user, "Creation failed!: [src] is empty! Go kill someone!") /proc/makeNewConstruct(mob/living/simple_animal/hostile/construct/ctype, mob/target, mob/stoner = null, cultoverride = 0, loc_override = null) + if(QDELETED(target)) + return var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) if(stoner) newstruct.faction |= "[REF(stoner)]" newstruct.master = stoner var/datum/action/innate/seek_master/SM = new() SM.Grant(newstruct) - target.transfer_ckey(newstruct) + newstruct.key = target.key + if(target.type == /mob/living/simple_animal/hostile/construct/shade) //Make sure we remember which body belonged to the shade + var/mob/living/simple_animal/hostile/construct/shade/shade = target + newstruct.original_mind = shade.original_mind var/obj/screen/alert/bloodsense/BS - if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode) + if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker?.mode) SSticker.mode.add_cultist(newstruct.mind, 0) if(iscultist(stoner) || cultoverride) to_chat(newstruct, "You are still bound to serve the cult[stoner ? " and [stoner]":""], follow [stoner ? stoner.p_their() : "their"] orders and help [stoner ? stoner.p_them() : "them"] complete [stoner ? stoner.p_their() : "their"] goals at all costs.") @@ -234,19 +239,18 @@ /obj/item/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/user, vic = 0) - new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton + if(HAS_TRAIT_FROM(T, TRAIT_SACRIFICED, "sacrificed")) + if(user) + to_chat(user, "This body has already been harvested!") + return + ADD_TRAIT(T, TRAIT_SACRIFICED, "sacrificed") T.stop_sound_channel(CHANNEL_HEARTBEAT) - T.invisibility = INVISIBILITY_ABSTRACT - T.dust_animation() - QDEL_IN(T, 5) - var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src) - S.status_flags |= GODMODE //So they won't die inside the stone somehow - S.mobility_flags = NONE //Can't move out of the soul stone + var/mob/living/simple_animal/hostile/construct/shade/S = new /mob/living/simple_animal/hostile/construct/shade(src) S.name = "Shade of [T.real_name]" S.real_name = "Shade of [T.real_name]" T.transfer_ckey(S) + S.original_mind = T.mind S.copy_languages(T, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder. - S.copy_languages(user, LANGUAGE_MASTER) S.update_atom_languages() grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue if(user) @@ -264,7 +268,7 @@ to_chat(user, "Capture successful!: [T.real_name]'s soul has been ripped from [T.p_their()] body and stored within the soul stone.") -/obj/item/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U) +/obj/item/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/user) var/mob/dead/observer/chosen_ghost for(var/mob/dead/observer/ghost in GLOB.player_list) //We put them back in their body @@ -279,13 +283,12 @@ if(!T) return FALSE if(!chosen_ghost) - to_chat(U, "There were no spirits willing to become a shade.") + to_chat(user, "There were no spirits willing to become a shade.") return FALSE if(contents.len) //If they used the soulstone on someone else in the meantime return FALSE T.ckey = chosen_ghost.ckey for(var/obj/item/W in T) T.dropItemToGround(W) - init_shade(T, U) - qdel(T) + init_shade(T, user) return TRUE diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 1e98b2f753..9b2def48d7 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -189,6 +189,10 @@ name = "Mutate" spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate +/datum/spellbook_entry/mantra + name = "Inner Mantra" + spell_type = /obj/effect/proc_holder/spell/self/mantra + /datum/spellbook_entry/jaunt name = "Ethereal Jaunt" spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 42954c3542..23e870a0ec 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -181,8 +181,8 @@ to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.") if(APPRENTICE_MARTIAL) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/nuclear_fist(null)) - H.put_in_hands(new /obj/item/book/granter/martial/plasma_fist(H)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned mystical martial abilities. You are also able to use the Nuclear Fist at will.") + owner.AddSpell(new /obj/effect/proc_holder/spell/self/mantra(null)) + to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned to control your Inner Mantra. You are also able to use the Nuclear Fist at will.") /datum/antagonist/wizard/apprentice/create_objectives() var/datum/objective/protect/new_objective = new /datum/objective/protect diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm index f10506a0d9..1468a5a97b 100644 --- a/code/modules/antagonists/xeno/xeno.dm +++ b/code/modules/antagonists/xeno/xeno.dm @@ -17,16 +17,16 @@ threat = 3 /datum/antagonist/xeno/threat() - . = 1 + . = 3 if(isalienhunter(owner)) - . = 2 + . = 6 else if(isaliensentinel(owner)) - . = 4 + . = 12 else if(isalienroyal(owner)) if(isalienqueen(owner)) - . = 8 + . = 24 else - . = 6 + . = 18 /datum/antagonist/xeno/create_team(datum/team/xeno/new_team) if(!new_team) diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index 99683f1688..2f7f701012 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -9,6 +9,7 @@ var/hidden_underwear = FALSE var/hidden_undershirt = FALSE var/hidden_socks = FALSE + var/arousal_rate = 1 //Mob procs /mob/living/carbon/human/verb/underwear_toggle() @@ -20,29 +21,34 @@ return if(confirm == "Top") hidden_undershirt = !hidden_undershirt + log_message("[hidden_undershirt ? "removed" : "put on" ] [p_their()] undershirt.", LOG_EMOTE) if(confirm == "Bottom") hidden_underwear = !hidden_underwear + log_message("[hidden_underwear ? "removed" : "put on"] [p_their()] underwear.", LOG_EMOTE) if(confirm == "Socks") hidden_socks = !hidden_socks + log_message("[hidden_socks ? "removed" : "put on"] [p_their()] socks.", LOG_EMOTE) if(confirm == "All") var/on_off = (hidden_undershirt || hidden_underwear || hidden_socks) ? FALSE : TRUE hidden_undershirt = on_off hidden_underwear = on_off hidden_socks = on_off + log_message("[on_off ? "removed" : "put on"] all [p_their()] undergarments.", LOG_EMOTE) update_body(TRUE) -/mob/living/carbon/human/proc/adjust_arousal(strength,aphro = FALSE,maso = FALSE) // returns all genitals that were adjust +/mob/living/carbon/human/proc/adjust_arousal(strength, cause = "manual toggle", aphro = FALSE,maso = FALSE) // returns all genitals that were adjust var/list/obj/item/organ/genital/genit_list = list() if(!client?.prefs.arousable || (aphro && (client?.prefs.cit_toggles & NO_APHRO)) || (maso && !HAS_TRAIT(src, TRAIT_MASO))) return // no adjusting made here + var/enabling = strength > 0 for(var/obj/item/organ/genital/G in internal_organs) - if(G.genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(strength*G.sensitivity)) - G.set_aroused_state(strength > 0) + if(G.genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(abs(strength)*G.sensitivity * arousal_rate)) + G.set_aroused_state(enabling,cause) G.update_appearance() if(G.aroused_state) genit_list += G @@ -64,6 +70,7 @@ return var/turfing = isturf(target) G.generate_fluid(R) + log_message("Climaxed using [G] with [target]", LOG_EMOTE) if(spill && R.total_volume >= 5) R.reaction(turfing ? target : target.loc, TOUCH, 1, 0) if(!turfing) @@ -189,7 +196,7 @@ return TRUE //Here's the main proc itself -/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints +/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE,cause = "") //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints if(mb_cd_timer > world.time) if(!forced_climax) //Don't spam the message to the victim if forced to come too fast to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") @@ -202,6 +209,7 @@ to_chat(src, "You can't do that while dead!") return if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks + log_message("was forced to climax by [cause]",LOG_EMOTE) for(var/obj/item/organ/genital/G in internal_organs) if(!CHECK_BITFIELD(G.genital_flags, CAN_CLIMAX_WITH)) //Skip things like wombs and testicles continue @@ -272,7 +280,6 @@ var/obj/item/reagent_containers/fluid_container = pick_climax_container() if(fluid_container && available_rosie_palms(TRUE, /obj/item/reagent_containers)) mob_fill_container(picked_organ, fluid_container) - mb_cd_timer = world.time + mb_cd_length /mob/living/carbon/human/verb/climax_verb() diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 67de745d22..723049a784 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -27,11 +27,12 @@ if(do_update) update() -/obj/item/organ/genital/proc/set_aroused_state(new_state) +/obj/item/organ/genital/proc/set_aroused_state(new_state,cause = "manual toggle") if(!(genital_flags & GENITAL_CAN_AROUSE)) return FALSE if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state)) aroused_state = new_state + owner.log_message("[src]'s arousal was [new_state ? "enabled" : "disabled"] due to [cause]", LOG_EMOTE) return aroused_state /obj/item/organ/genital/proc/update() @@ -76,11 +77,19 @@ if(GEN_VISIBLE_ALWAYS) genital_flags |= GENITAL_THROUGH_CLOTHES if(owner) + owner.log_message("Exposed their [src]",LOG_EMOTE) owner.exposed_genitals += src + if(GEN_VISIBLE_NO_CLOTHES) + if(owner) + owner.log_message("Hid their [src] under clothes only",LOG_EMOTE) if(GEN_VISIBLE_NO_UNDIES) genital_flags |= GENITAL_UNDIES_HIDDEN + if(owner) + owner.log_message("Hid their [src] under underwear",LOG_EMOTE) if(GEN_VISIBLE_NEVER) genital_flags |= GENITAL_HIDDEN + if(owner) + owner.log_message("Hid their [src] completely",LOG_EMOTE) if(update && owner && ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm index 0989966638..e37224e401 100644 --- a/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -88,7 +88,6 @@ to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") QDEL_IN(src, 1) return - var/enlargement = FALSE switch(rounded_cached) if(0) //flatchested size = "flat" @@ -96,16 +95,8 @@ size = breast_values[rounded_cached] if(9 to 15) //massive size = breast_values[rounded_cached] - enlargement = TRUE if(16 to INFINITY) //rediculous size = "huge" - enlargement = TRUE - if(owner) - var/status_effect = owner.has_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT) - if(enlargement && !status_effect) - owner.apply_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT) - else if(!enlargement && status_effect) - owner.remove_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT) if(rounded_cached < 16 && owner)//Because byond doesn't count from 0, I have to do this. var/mob/living/carbon/human/H = owner @@ -134,4 +125,4 @@ toggle_visibility(D.features["breasts_visibility"], FALSE) #undef BREASTS_ICON_MIN_SIZE -#undef BREASTS_ICON_MAX_SIZE \ No newline at end of file +#undef BREASTS_ICON_MAX_SIZE diff --git a/code/modules/arousal/organs/penis.dm b/code/modules/arousal/organs/penis.dm index 7b20c0e7ce..e1025094c3 100644 --- a/code/modules/arousal/organs/penis.dm +++ b/code/modules/arousal/organs/penis.dm @@ -39,26 +39,16 @@ return var/rounded_length = round(length) var/new_size - var/enlargement = FALSE switch(rounded_length) if(0 to 6) //If modest size new_size = 1 if(7 to 11) //If large new_size = 2 - if(12 to 20) //If massive + if(12 to 36) //If massive new_size = 3 - if(21 to 34) //If massive and due for large effects - new_size = 3 - enlargement = TRUE - if(35 to INFINITY) //If comical + if(37 to INFINITY) //If comical new_size = 4 //no new sprites for anything larger yet - enlargement = TRUE - if(owner) - var/status_effect = owner.has_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT) - if(enlargement && !status_effect) - owner.apply_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT) - else if(!enlargement && status_effect) - owner.remove_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT) + if(linked_organ) linked_organ.size = clamp(size + new_size, BALLS_SIZE_MIN, BALLS_SIZE_MAX) linked_organ.update() @@ -106,4 +96,4 @@ diameter_ratio = D.features["cock_diameter_ratio"] shape = D.features["cock_shape"] prev_length = length - toggle_visibility(D.features["cock_visibility"], FALSE) \ No newline at end of file + toggle_visibility(D.features["cock_visibility"], FALSE) diff --git a/code/modules/arousal/toys/dildos.dm b/code/modules/arousal/toys/dildos.dm index 3f6fa9bb45..2482b93300 100644 --- a/code/modules/arousal/toys/dildos.dm +++ b/code/modules/arousal/toys/dildos.dm @@ -103,28 +103,29 @@ name = "knotted dildo" attack_verb = list("penetrated", "knotted", "slapped", "inseminated") -obj/item/dildo/human +/obj/item/dildo/human dildo_shape = "human" name = "human dildo" attack_verb = list("penetrated", "slapped", "inseminated") -obj/item/dildo/plain +/obj/item/dildo/plain dildo_shape = "plain" name = "plain dildo" attack_verb = list("penetrated", "slapped", "inseminated") -obj/item/dildo/flared +/obj/item/dildo/flared dildo_shape = "flared" name = "flared dildo" attack_verb = list("penetrated", "slapped", "neighed", "gaped", "prolapsed", "inseminated") -obj/item/dildo/flared/huge +/obj/item/dildo/flared/huge name = "literal horse cock" desc = "THIS THING IS HUGE!" dildo_size = 4 force = 10 + hitsound = 'sound/weapons/klonk.ogg' -obj/item/dildo/custom +/obj/item/dildo/custom name = "customizable dildo" desc = "Thanks to significant advances in synthetic nanomaterials, this dildo is capable of taking on many different forms to fit the user's preferences! Pricy!" can_customize = TRUE @@ -135,9 +136,9 @@ obj/item/dildo/custom // Suicide acts, by request /obj/item/dildo/proc/manual_suicide(mob/living/user) - user.visible_message("[user] finally finishes deepthroating the [src], and their life.") - user.adjustOxyLoss(200) - user.death(0) + user.visible_message("[user] finally finishes deepthroating the [src], and their life.") + user.adjustOxyLoss(200) + user.death(0) /obj/item/dildo/suicide_act(mob/living/user) // is_knotted = ((src.dildo_shape == "knotted")?"They swallowed the knot":"Their face is turning blue") diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 8a0645f311..07a9f499f8 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -30,6 +30,9 @@ attack(user,user) return FIRELOSS +/obj/item/assembly/flash/DoRevenantThrowEffects(atom/target) + AOE_flash() + /obj/item/assembly/flash/update_icon(flash = FALSE) cut_overlays() attached_overlays = list() diff --git a/code/modules/assembly/helpers.dm b/code/modules/assembly/helpers.dm index 3066b14851..2c39751a8b 100644 --- a/code/modules/assembly/helpers.dm +++ b/code/modules/assembly/helpers.dm @@ -13,4 +13,4 @@ Name: IsAssemblyHolder Desc: If true is an object that can hold an assemblyholder object */ /obj/proc/IsAssemblyHolder() - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index bf56449a0c..84e70bbbb3 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -62,6 +62,7 @@ master.update_icon() /obj/item/assembly_holder/Crossed(atom/movable/AM as mob|obj) + . = ..() if(a_left) a_left.Crossed(AM) if(a_right) diff --git a/code/modules/assembly/playback.dm b/code/modules/assembly/playback.dm index 14ad8c96c9..b3aea12cdc 100644 --- a/code/modules/assembly/playback.dm +++ b/code/modules/assembly/playback.dm @@ -48,4 +48,4 @@ /obj/item/assembly/playback/toggle_secure() . = ..() - listening = FALSE \ No newline at end of file + listening = FALSE diff --git a/code/modules/asset_cache/asset_cache_client.dm b/code/modules/asset_cache/asset_cache_client.dm index f462fe386b..3cff8cb41f 100644 --- a/code/modules/asset_cache/asset_cache_client.dm +++ b/code/modules/asset_cache/asset_cache_client.dm @@ -1,5 +1,5 @@ -/// Process asset cache client topic calls for "asset_cache_confirm_arrival=[INT]" +/// Process asset cache client topic calls for `"asset_cache_confirm_arrival=[INT]"` /client/proc/asset_cache_confirm_arrival(job_id) var/asset_cache_job = round(text2num(job_id)) //because we skip the limiter, we have to make sure this is a valid arrival and not somebody tricking us into letting them append to a list without limit. @@ -10,7 +10,7 @@ return asset_cache_job || TRUE -/// Process asset cache client topic calls for "asset_cache_preload_data=[HTML+JSON_STRING] +/// Process asset cache client topic calls for `"asset_cache_preload_data=[HTML+JSON_STRING]"` /client/proc/asset_cache_preload_data(data) var/json = data var/list/preloaded_assets = json_decode(json) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index ec46476ade..22fb266033 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -47,8 +47,9 @@ "smmon_3.gif" = 'icons/program_icons/smmon_3.gif', "smmon_4.gif" = 'icons/program_icons/smmon_4.gif', "smmon_5.gif" = 'icons/program_icons/smmon_5.gif', - "smmon_6.gif" = 'icons/program_icons/smmon_6.gif', - "borg_mon.gif" = 'icons/program_icons/borg_mon.gif' + "smmon_6.gif" = 'icons/program_icons/smmon_6.gif' + // "borg_mon.gif" = 'icons/program_icons/borg_mon.gif', + // "robotact.gif" = 'icons/program_icons/robotact.gif' ) /datum/asset/simple/radar_assets @@ -156,7 +157,6 @@ ) /datum/asset/simple/namespaced/fontawesome - legacy = TRUE assets = list( "fa-regular-400.eot" = 'html/font-awesome/webfonts/fa-regular-400.eot', "fa-regular-400.woff" = 'html/font-awesome/webfonts/fa-regular-400.woff', @@ -248,6 +248,10 @@ "rule8" = 'icons/UI_Icons/Achievements/Misc/rule8.png', "snail" = 'icons/UI_Icons/Achievements/Misc/snail.png', "ascension" = 'icons/UI_Icons/Achievements/Misc/ascension.png', + "ashascend" = 'icons/UI_Icons/Achievements/Misc/ashascend.png', + "fleshascend" = 'icons/UI_Icons/Achievements/Misc/fleshascend.png', + "rustascend" = 'icons/UI_Icons/Achievements/Misc/rustascend.png', + "voidascend" = 'icons/UI_Icons/Achievements/Misc/voidascend.png', "mining" = 'icons/UI_Icons/Achievements/Skills/mining.png', "assistant" = 'icons/UI_Icons/Achievements/Mafia/assistant.png', "changeling" = 'icons/UI_Icons/Achievements/Mafia/changeling.png', @@ -288,7 +292,7 @@ ) /datum/asset/spritesheet/simple/pills - name ="pills" + name = "pills" assets = list( "pill1" = 'icons/UI_Icons/Pills/pill1.png', "pill2" = 'icons/UI_Icons/Pills/pill2.png', @@ -313,7 +317,28 @@ "pill21" = 'icons/UI_Icons/Pills/pill21.png', "pill22" = 'icons/UI_Icons/Pills/pill22.png', ) - +/* +/datum/asset/spritesheet/simple/condiments + name = "condiments" + assets = list( + CONDIMASTER_STYLE_FALLBACK = 'icons/UI_Icons/Condiments/emptycondiment.png', + "enzyme" = 'icons/UI_Icons/Condiments/enzyme.png', + "flour" = 'icons/UI_Icons/Condiments/flour.png', + "mayonnaise" = 'icons/UI_Icons/Condiments/mayonnaise.png', + "milk" = 'icons/UI_Icons/Condiments/milk.png', + "blackpepper" = 'icons/UI_Icons/Condiments/peppermillsmall.png', + "rice" = 'icons/UI_Icons/Condiments/rice.png', + "sodiumchloride" = 'icons/UI_Icons/Condiments/saltshakersmall.png', + "soymilk" = 'icons/UI_Icons/Condiments/soymilk.png', + "soysauce" = 'icons/UI_Icons/Condiments/soysauce.png', + "sugar" = 'icons/UI_Icons/Condiments/sugar.png', + "ketchup" = 'icons/UI_Icons/Condiments/ketchup.png', + "capsaicin" = 'icons/UI_Icons/Condiments/hotsauce.png', + "frostoil" = 'icons/UI_Icons/Condiments/coldsauce.png', + "bbqsauce" = 'icons/UI_Icons/Condiments/bbqsauce.png', + "cornoil" = 'icons/UI_Icons/Condiments/oliveoil.png', + ) +*/ //this exists purely to avoid meta by pre-loading all language icons. /datum/asset/language/register() for(var/path in typesof(/datum/language)) @@ -329,6 +354,35 @@ InsertAll("", each, GLOB.alldirs) ..() +/datum/asset/spritesheet/supplypods + name = "supplypods" + +/datum/asset/spritesheet/supplypods/register() + for (var/style in 1 to length(GLOB.podstyles)) + if (style == STYLE_SEETHROUGH) + Insert("pod_asset[style]", icon('icons/obj/supplypods.dmi' , "seethrough-icon")) + continue + var/base = GLOB.podstyles[style][POD_BASE] + if (!base) + Insert("pod_asset[style]", icon('icons/obj/supplypods.dmi', "invisible-icon")) + continue + var/icon/podIcon = icon('icons/obj/supplypods.dmi', base) + var/door = GLOB.podstyles[style][POD_DOOR] + if (door) + door = "[base]_door" + podIcon.Blend(icon('icons/obj/supplypods.dmi', door), ICON_OVERLAY) + var/shape = GLOB.podstyles[style][POD_SHAPE] + if (shape == POD_SHAPE_NORML) + var/decal = GLOB.podstyles[style][POD_DECAL] + if (decal) + podIcon.Blend(icon('icons/obj/supplypods.dmi', decal), ICON_OVERLAY) + var/glow = GLOB.podstyles[style][POD_GLOW] + if (glow) + glow = "pod_glow_[glow]" + podIcon.Blend(icon('icons/obj/supplypods.dmi', glow), ICON_OVERLAY) + Insert("pod_asset[style]", podIcon) + return ..() + // Representative icons for each research design /datum/asset/spritesheet/research_designs name = "design" @@ -455,3 +509,31 @@ /datum/asset/spritesheet/mafia/register() InsertAll("", 'icons/obj/mafia.dmi') ..() + +/datum/asset/simple/portraits + var/tab = "use subtypes of this please" + assets = list() + +/datum/asset/simple/portraits/New() + if(!SSpersistence.paintings || !SSpersistence.paintings[tab] || !length(SSpersistence.paintings[tab])) + return + for(var/p in SSpersistence.paintings[tab]) + var/list/portrait = p + var/png = "data/paintings/[tab]/[portrait["md5"]].png" + if(fexists(png)) + assets[portrait["title"]] = png + ..() //this is where it registers all these assets we added to the list + +/datum/asset/simple/portraits/library + tab = "library" + +/datum/asset/simple/portraits/library_secure + tab = "library_secure" + +/datum/asset/simple/portraits/library_private + tab = "library_private" + +/datum/asset/simple/safe + assets = list( + "safe_dial.png" = 'html/safe_dial.png' + ) diff --git a/code/modules/asset_cache/readme.md b/code/modules/asset_cache/readme.md index 82e6bea896..c8c9d78b71 100644 --- a/code/modules/asset_cache/readme.md +++ b/code/modules/asset_cache/readme.md @@ -24,7 +24,7 @@ Call .get_url_mappings() to get an associated list with the urls your assets can See the documentation for `/datum/asset_transport` for the backend api the asset datums utilize. -The global variable `SSassets.transport` contains the currently configured transport. +The global variable `SSassets.transport` contains the currently configured transport. @@ -32,6 +32,6 @@ The global variable `SSassets.transport` contains the currently configured trans Because byond browse() calls use non-blocking queues, if your code uses output() (which bypasses all of these queues) to invoke javascript functions you will need to first have the javascript announce to the server it has loaded before trying to invoke js functions. -To make your code work with any CDNs configured by the server, you must make sure assets are referenced from the url returned by `get_url_mappings()` or by asset_transport's `get_asset_url()`. (TGUI also has helpers for this.) If this can not be easily done, you can bypass the cdn using legacy assets, see the simple asset datum for details. +To make your code work with any CDNs configured by the server, you must make sure assets are referenced from the url returned by `get_url_mappings()` or by asset_transport's `get_asset_url()`. (TGUI also has helpers for this.) If this can not be easily done, you can bypass the cdn using legacy assets, see the simple asset datum for details. CSS files that use url() can be made to use the CDN without needing to rewrite all url() calls in code by using the namespaced helper datum. See the documentation for `/datum/asset/simple/namespaced` for details. diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 0c6ca13e86..244b51bd2b 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -49,6 +49,7 @@ SSair.add_to_active(T) return ..() +/// Function for Extools Atmos /turf/proc/update_air_ref() /////////////////GAS MIXTURE PROCS/////////////////// @@ -312,6 +313,8 @@ return TRUE /turf/open/consider_superconductivity(starting) + if(planetary_atmos) + return FALSE if(air.return_temperature() < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) return FALSE if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 3cc597ec31..4c71815c9c 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -134,6 +134,19 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture/proc/set_volume(new_volume) /datum/gas_mixture/proc/get_moles(gas_type) /datum/gas_mixture/proc/set_moles(gas_type, moles) + +// VV WRAPPERS - EXTOOLS HOOKED PROCS DO NOT TAKE ARGUMENTS FROM CALL() FOR SOME REASON. +/datum/gas_mixture/proc/vv_set_moles(gas_type, moles) + return set_moles(gas_type, moles) +/datum/gas_mixture/proc/vv_get_moles(gas_type) + return get_moles(gas_type) +/datum/gas_mixture/proc/vv_set_temperature(new_temp) + return set_temperature(new_temp) +/datum/gas_mixture/proc/vv_set_volume(new_volume) + return set_volume(new_volume) +/datum/gas_mixture/proc/vv_react(datum/holder) + return react(holder) + /datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, list/gases) /datum/gas_mixture/proc/mark_immutable() /datum/gas_mixture/proc/get_gases() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index a2a55ee6b1..c63797282d 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -237,12 +237,21 @@ . += "Alt-click to [locked ? "unlock" : "lock"] the interface." /obj/machinery/airalarm/ui_status(mob/user) - if(hasSiliconAccessInArea(user) && aidisabled) - to_chat(user, "AI control has been disabled.") - else if(!shorted) + if(hasSiliconAccessInArea(user)) + if(aidisabled) + to_chat(user, "AI control has been disabled") + return UI_CLOSE + else if(!issilicon(user)) //True sillycones use ..() + return UI_INTERACTIVE + if(!shorted) return ..() return UI_CLOSE +/obj/machinery/airalarm/can_interact(mob/user) + . = ..() + if (!issilicon(user) && hasSiliconAccessInArea(user)) + return TRUE + /obj/machinery/airalarm/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -295,7 +304,7 @@ "danger_level" = cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure) )) - if(!locked || hasSiliconAccessInArea(user, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE)) + if(!locked || hasSiliconAccessInArea(user, PRIVILEGES_SILICON|PRIVILEGES_DRONE)) data["vents"] = list() for(var/id_tag in A.air_vent_names) var/long_name = A.air_vent_names[id_tag] @@ -376,13 +385,13 @@ if(..() || buildstage != 2) return var/silicon_access = hasSiliconAccessInArea(usr) - var/bot_priviledges = silicon_access || (usr.silicon_privileges & PRIVILEDGES_DRONE) - if((locked && !bot_priviledges) || (silicon_access && aidisabled)) + var/bot_privileges = silicon_access || (usr.silicon_privileges & PRIVILEGES_DRONE) + if((locked && !bot_privileges) || (silicon_access && aidisabled)) return var/device_id = params["id_tag"] switch(action) if("lock") - if(bot_priviledges && !wires.is_cut(WIRE_IDSCAN)) + if(bot_privileges && !wires.is_cut(WIRE_IDSCAN)) locked = !locked . = TRUE if("power", "toggle_filter", "widenet", "scrubbing") @@ -753,14 +762,14 @@ /obj/machinery/airalarm/attackby(obj/item/W, mob/user, params) switch(buildstage) if(2) - if(istype(W, /obj/item/wirecutters) && panel_open && wires.is_all_cut()) + if(W.tool_behaviour == TOOL_WIRECUTTER && panel_open && wires.is_all_cut()) W.play_tool_sound(src) to_chat(user, "You cut the final wires.") new /obj/item/stack/cable_coil(loc, 5) buildstage = 1 update_icon() return - else if(istype(W, /obj/item/screwdriver)) // Opening that Air Alarm up. + else if(W.tool_behaviour == TOOL_SCREWDRIVER) // Opening that Air Alarm up. W.play_tool_sound(src) panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].") @@ -772,7 +781,7 @@ wires.interact(user) return if(1) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) user.visible_message("[user.name] removes the electronics from [src.name].",\ "You start prying out the circuit...") W.play_tool_sound(src) @@ -823,7 +832,7 @@ update_icon() return - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You detach \the [src] from the wall.") W.play_tool_sound(src) new /obj/item/wallframe/airalarm( user.loc ) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 97389848ba..7f4a8cd794 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -44,7 +44,7 @@ . = ..() if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user)) var/mob/living/L = user - if(L.ventcrawler) + if(SEND_SIGNAL(L, COMSIG_CHECK_VENTCRAWL)) . += "Alt-click to crawl through it." /obj/machinery/atmospherics/New(loc, process = TRUE, setdir) @@ -318,7 +318,7 @@ /obj/machinery/atmospherics/AltClick(mob/living/L) if(is_type_in_typecache(src, GLOB.ventcrawl_machinery)) - return L.handle_ventcrawl(src) + return SEND_SIGNAL(L, COMSIG_HANDLE_VENTCRAWL, src) return ..() @@ -336,4 +336,4 @@ return TRUE /obj/machinery/atmospherics/proc/update_layer() - layer = initial(layer) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE \ No newline at end of file + layer = initial(layer) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 39a99148c2..0540ee2ae6 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -88,6 +88,7 @@ if(!panel_open) return anchored = !anchored + move_resist = anchored? INFINITY : 100 I.play_tool_sound(src) if(generator) disconnectFromGenerator() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index 43cb658210..35eb178771 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -106,4 +106,4 @@ It's like a regular ol' straight pipe, but you can turn it on and off. /obj/machinery/atmospherics/components/binary/valve/digital/on/layer3 piping_layer = 3 - icon_state = "dvalve_map-3" \ No newline at end of file + icon_state = "dvalve_map-3" diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index a8d9586fc4..b6911a1709 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -170,4 +170,4 @@ /obj/machinery/atmospherics/components/analyzer_act(mob/living/user, obj/item/I) atmosanalyzer_scan(airs, user, src) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c08eaf2e8a..cf2cdd80a7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -326,7 +326,7 @@ || default_deconstruction_crowbar(I)) update_icon() return - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You can't access the maintenance panel while the pod is " \ + (on ? "active" : (occupant ? "full" : "open")) + ".") return @@ -454,8 +454,10 @@ return G.return_temperature() return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/wrench/W) +/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/W) . = ..() + if(!W.tool_behaviour == TOOL_WRENCH) + return if(.) SetInitDirections() var/obj/machinery/atmospherics/node = nodes[1] diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index a07f131d62..9aa3c8c16d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -196,8 +196,8 @@ icon_state = "inje_map-1" /obj/machinery/atmospherics/components/unary/outlet_injector/layer3 - piping_layer = 2 - icon_state = "inje_map-2" + piping_layer = 3 + icon_state = "inje_map-3" /obj/machinery/atmospherics/components/unary/outlet_injector/on on = TRUE @@ -207,8 +207,8 @@ icon_state = "inje_map-1" /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3 - piping_layer = 2 - icon_state = "inje_map-2" + piping_layer = 3 + icon_state = "inje_map-3" /obj/machinery/atmospherics/components/unary/outlet_injector/atmos frequency = FREQ_ATMOS_STORAGE diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 6c732e3ee1..bd7dd6d297 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -206,9 +206,13 @@ . = other_airs + air if(null in .) stack_trace("[src]([REF(src)]) has one or more null gas mixtures, which may cause bugs. Null mixtures will not be considered in reconcile_air().") - return listclearnulls(.) + listclearnulls(.) -/datum/pipeline/proc/reconcile_air() +/datum/pipeline/proc/empty() + for(var/datum/gas_mixture/GM in get_all_connected_airs()) + GM.clear() + +/datum/pipeline/proc/get_all_connected_airs() var/list/datum/gas_mixture/GL = list() var/list/datum/pipeline/PL = list() PL += src @@ -233,6 +237,10 @@ var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch if(C.connected_device) GL += C.portableConnectorReturnAir() + return GL + +/datum/pipeline/proc/reconcile_air() + var/list/datum/gas_mixture/GL = get_all_connected_airs() var/total_thermal_energy = 0 var/total_heat_capacity = 0 diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm index 695cb61f51..ad5f65f9d3 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm @@ -42,4 +42,4 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer3 piping_layer = 3 - icon_state = "pipe11-3" \ No newline at end of file + icon_state = "pipe11-3" diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm index 3397e75314..bc46c1f831 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm @@ -35,4 +35,4 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3 piping_layer = 3 - icon_state = "pipe11-3" \ No newline at end of file + icon_state = "pipe11-3" diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm index aa8ee65bd8..3f061e3779 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold.dm @@ -38,4 +38,4 @@ if(nodes[i]) add_overlay( getpipeimage(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) update_layer() - update_alpha() \ No newline at end of file + update_alpha() diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm index 56c0408d18..bbceff56da 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm @@ -36,4 +36,4 @@ if(nodes[i]) add_overlay( getpipeimage(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) update_layer() - update_alpha() \ No newline at end of file + update_alpha() diff --git a/code/modules/atmospherics/machinery/pipes/simple.dm b/code/modules/atmospherics/machinery/pipes/simple.dm index c3f62f16cb..40afb39ec1 100644 --- a/code/modules/atmospherics/machinery/pipes/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/simple.dm @@ -30,4 +30,4 @@ /obj/machinery/atmospherics/pipe/simple/update_icon() icon_state = "pipe[nodes[1] ? "1" : "0"][nodes[2] ? "1" : "0"]-[piping_layer]" update_layer() - update_alpha() \ No newline at end of file + update_alpha() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 0eebf22be4..2690ad555b 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -261,7 +261,7 @@ new /obj/item/stack/sheet/metal (loc, 5) qdel(src) -obj/machinery/portable_atmospherics/canister/welder_act(mob/living/user, obj/item/I) +/obj/machinery/portable_atmospherics/canister/welder_act(mob/living/user, obj/item/I) ..() if(user.a_intent == INTENT_HARM) return FALSE diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index fa57e683c4..166727f6ae 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -115,7 +115,7 @@ to_chat(user, "[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [T]" : "You insert [T] into [src]"].") replace_tank(user, FALSE, T) update_icon() - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) if(!(stat & BROKEN)) if(connected_port) disconnect() diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm index 2b3a9af1c7..cb52d03ff6 100644 --- a/code/modules/atmospherics/multiz.dm +++ b/code/modules/atmospherics/multiz.dm @@ -1,4 +1,5 @@ -obj/machinery/atmospherics/pipe/simple/multiz ///This is an atmospherics pipe which can relay air up a deck (Z+1). It currently only supports being on pipe layer 1 +/// This is an atmospherics pipe which can relay air up/down a deck. +/obj/machinery/atmospherics/pipe/simple/multiz name = "multi deck pipe adapter" desc = "An adapter which allows pipes to connect to other pipenets on different decks." icon_state = "multiz_pipe" @@ -24,6 +25,4 @@ obj/machinery/atmospherics/pipe/simple/multiz ///This is an atmospherics pipe wh if(above) nodes += above above.nodes += src //Two way travel :) - return ..() - else - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index 2081077b90..36ed9b6ba3 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -27,4 +27,4 @@ /obj/effect/wind/process() var/turf/open/T = get_turf(src) if(istype(T)) - T.consider_pressure_difference(get_step(T,dir),strength) \ No newline at end of file + T.consider_pressure_difference(get_step(T,dir),strength) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 3426208fae..d32905e007 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -7,6 +7,8 @@ #define AMMO_DROP_LIFETIME 300 #define CTF_REQUIRED_PLAYERS 4 + + /obj/item/ctf name = "banner" icon = 'icons/obj/items_and_weapons.dmi' @@ -16,13 +18,13 @@ righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi' desc = "A banner with Nanotrasen's logo on it." slowdown = 2 - item_flags = SLOWS_WHILE_IN_HAND throw_speed = 0 throw_range = 1 force = 200 armour_penetration = 1000 resistance_flags = INDESTRUCTIBLE anchored = TRUE + item_flags = SLOWS_WHILE_IN_HAND var/team = WHITE_TEAM var/reset_cooldown = 0 var/anyonecanpickup = TRUE @@ -53,12 +55,13 @@ to_chat(M, "\The [src] has been returned to base!") STOP_PROCESSING(SSobj, src) -/obj/item/ctf/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/item/ctf/on_attack_hand(mob/living/user) if(!is_ctf_target(user) && !anyonecanpickup) - to_chat(user, "Non players shouldn't be moving the flag!") + to_chat(user, "Non-players shouldn't be moving the flag!") return if(team in user.faction) - to_chat(user, "You can't move your own flag!") + to_chat(user, "You can't move your own flag!") return if(loc == user) if(!user.dropItemToGround(src)) @@ -68,7 +71,7 @@ if(!user.put_in_active_hand(src)) dropped(user) return - user.anchored = TRUE + user.set_anchored(TRUE) user.status_flags &= ~CANPUSH for(var/mob/M in GLOB.player_list) var/area/mob_area = get_area(M) @@ -79,7 +82,7 @@ /obj/item/ctf/dropped(mob/user) ..() - user.anchored = FALSE + user.set_anchored(FALSE) user.status_flags |= CANPUSH reset_cooldown = world.time + 200 //20 seconds START_PROCESSING(SSobj, src) @@ -172,20 +175,20 @@ GLOB.poi_list.Remove(src) ..() -/obj/machinery/capture_the_flag/process() +/obj/machinery/capture_the_flag/process(delta_time) for(var/i in spawned_mobs) if(!i) spawned_mobs -= i continue // Anyone in crit, automatically reap - var/mob/living/M = i - if(M.InCritical() || M.stat == DEAD) - ctf_dust_old(M) + var/mob/living/living_participant = i + if(living_participant.InCritical() || living_participant.stat == DEAD) + ctf_dust_old(living_participant) else // The changes that you've been hit with no shield but not // instantly critted are low, but have some healing. - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) + living_participant.adjustBruteLoss(-2.5 * delta_time) + living_participant.adjustFireLoss(-2.5 * delta_time) /obj/machinery/capture_the_flag/red name = "Red CTF Controller" @@ -212,6 +215,10 @@ toggle_all_ctf(user) return + + // if(!(GLOB.ghost_role_flags & GHOSTROLE_MINIGAME)) + // to_chat(user, "CTF has been temporarily disabled by admins.") + // return people_who_want_to_play |= user.ckey var/num = people_who_want_to_play.len var/remaining = CTF_REQUIRED_PLAYERS - num @@ -227,7 +234,7 @@ return if(user.ckey in team_members) if(user.ckey in recently_dead_ckeys) - to_chat(user, "It must be more than [DisplayTimeText(respawn_cooldown)] from your last death to respawn!") + to_chat(user, "It must be more than [DisplayTimeText(respawn_cooldown)] from your last death to respawn!") return var/client/new_team_member = user.client if(user.mind && user.mind.current) @@ -239,10 +246,10 @@ if(CTF == src || CTF.ctf_enabled == FALSE) continue if(user.ckey in CTF.team_members) - to_chat(user, "No switching teams while the round is going!") + to_chat(user, "No switching teams while the round is going!") return if(CTF.team_members.len < src.team_members.len) - to_chat(user, "[src.team] has more team members than [CTF.team]. Try joining [CTF.team] team to even things up.") + to_chat(user, "[src.team] has more team members than [CTF.team]! Try joining [CTF.team] team to even things up.") return team_members |= user.ckey var/client/new_team_member = user.client @@ -258,7 +265,7 @@ addtimer(CALLBACK(src, .proc/clear_cooldown, body.ckey), respawn_cooldown, TIMER_UNIQUE) body.dust() -/obj/machinery/capture_the_flag/proc/clear_cooldown(var/ckey) +/obj/machinery/capture_the_flag/proc/clear_cooldown(ckey) recently_dead_ckeys -= ckey /obj/machinery/capture_the_flag/proc/spawn_team_member(client/new_team_member) @@ -270,7 +277,7 @@ M.equipOutfit(ctf_gear) M.dna.species.punchdamagehigh = 25 M.dna.species.punchdamagelow = 25 - M.AddElement(/datum/element/ghost_role_eligibility) + M.AddElement(/datum/element/ghost_role_eligibility) //?? spawned_mobs += M /obj/machinery/capture_the_flag/Topic(href, href_list) @@ -293,14 +300,15 @@ victory() /obj/machinery/capture_the_flag/proc/victory() - for(var/mob/M in GLOB.mob_list) - var/area/mob_area = get_area(M) + for(var/mob/_competitor in GLOB.mob_living_list) + var/mob/living/competitor = _competitor + var/area/mob_area = get_area(competitor) if(istype(mob_area, /area/ctf)) - to_chat(M, "[team] team wins!") - to_chat(M, "Teams have been cleared. Click on the machines to vote to begin another round.") - for(var/obj/item/ctf/W in M) - M.dropItemToGround(W) - M.dust() + to_chat(competitor, "[team] team wins!") + to_chat(competitor, "Teams have been cleared. Click on the machines to vote to begin another round.") + for(var/obj/item/ctf/W in competitor) + competitor.dropItemToGround(W) + competitor.dust() for(var/obj/machinery/control_point/control in GLOB.machines) control.icon_state = "dominator" control.controlling = null @@ -328,7 +336,7 @@ dead_barricades.Cut() - notify_ghosts("[name] has been activated!", enter_link="(Click to join the [team] team!) or click on the controller directly!", source = src, action=NOTIFY_ATTACK) + notify_ghosts("[name] has been activated!", enter_link="(Click to join the [team] team!) or click on the controller directly!", source = src, action=NOTIFY_ATTACK, header = "CTF has been activated") if(!arena_reset) reset_the_arena() @@ -355,10 +363,10 @@ ctf_enabled = FALSE arena_reset = FALSE var/area/A = get_area(src) - for(var/i in GLOB.mob_list) - var/mob/M = i - if((get_area(A) == A) && (M.ckey in team_members)) - M.dust() + for(var/_competitor in GLOB.mob_living_list) + var/mob/living/competitor = _competitor + if((get_area(A) == A) && (competitor.ckey in team_members)) + competitor.dust() team_members.Cut() spawned_mobs.Cut() recently_dead_ckeys.Cut() @@ -375,18 +383,18 @@ CTF.ctf_gear = initial(ctf_gear) CTF.respawn_cooldown = DEFAULT_RESPAWN -/proc/ctf_floor_vanish(atom/target) - if(isturf(target.loc)) - qdel(target) - /obj/item/gun/ballistic/automatic/pistol/deagle/ctf desc = "This looks like it could really hurt in melee." force = 75 mag_type = /obj/item/ammo_box/magazine/m50/ctf -/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/dropped(mob/user) +/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/dropped() . = ..() - addtimer(CALLBACK(GLOBAL_PROC, /proc/ctf_floor_vanish, src), 1) + addtimer(CALLBACK(src, .proc/floor_vanish), 1) + +/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/proc/floor_vanish() + if(isturf(loc)) + qdel(src) /obj/item/ammo_box/magazine/m50/ctf ammo_type = /obj/item/ammo_casing/a50/ctf @@ -400,6 +408,7 @@ /obj/item/projectile/bullet/ctf/prehit(atom/target) if(is_ctf_target(target)) damage = 60 + return //PROJECTILE_PIERCE_NONE /// hey uhh don't hit anyone behind them . = ..() /obj/item/gun/ballistic/automatic/laser/ctf @@ -407,16 +416,24 @@ desc = "This looks like it could really hurt in melee." force = 50 -/obj/item/gun/ballistic/automatic/laser/ctf/dropped(mob/user) +/obj/item/gun/ballistic/automatic/laser/ctf/dropped() . = ..() - addtimer(CALLBACK(GLOBAL_PROC, /proc/ctf_floor_vanish, src), 1) + addtimer(CALLBACK(src, .proc/floor_vanish), 1) + +/obj/item/gun/ballistic/automatic/laser/ctf/proc/floor_vanish() + if(isturf(loc)) + qdel(src) /obj/item/ammo_box/magazine/recharge/ctf ammo_type = /obj/item/ammo_casing/caseless/laser/ctf -/obj/item/ammo_box/magazine/recharge/ctf/dropped(mob/user) +/obj/item/ammo_box/magazine/recharge/ctf/dropped() . = ..() - addtimer(CALLBACK(GLOBAL_PROC, /proc/ctf_floor_vanish, src), 1) + addtimer(CALLBACK(src, .proc/floor_vanish), 1) + +/obj/item/ammo_box/magazine/recharge/ctf/proc/floor_vanish() + if(isturf(loc)) + qdel(src) /obj/item/ammo_casing/caseless/laser/ctf projectile_type = /obj/item/projectile/beam/ctf @@ -428,15 +445,16 @@ /obj/item/projectile/beam/ctf/prehit(atom/target) if(is_ctf_target(target)) damage = 150 + return //PROJECTILE_PIERCE_NONE /// hey uhhh don't hit anyone behind them . = ..() /proc/is_ctf_target(atom/target) . = FALSE if(istype(target, /obj/structure/barricade/security/ctf)) . = TRUE - if(isliving(target)) - var/mob/living/H = target - if((RED_TEAM in H.faction) || (BLUE_TEAM in H.faction)) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/shielded/ctf)) . = TRUE // RED TEAM GUNS @@ -482,7 +500,11 @@ /obj/item/claymore/ctf/dropped(mob/user) . = ..() - addtimer(CALLBACK(GLOBAL_PROC, /proc/ctf_floor_vanish, src), 1) + addtimer(CALLBACK(src, .proc/floor_vanish), 1) + +/obj/item/claymore/ctf/proc/floor_vanish() + if(isturf(loc)) + qdel(src) /datum/outfit/ctf name = "CTF" @@ -491,27 +513,28 @@ suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf toggle_helmet = FALSE // see the whites of their eyes shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/tackler/combat + gloves = /obj/item/clothing/gloves/combat + id = /obj/item/card/id/away belt = /obj/item/gun/ballistic/automatic/pistol/deagle/ctf l_pocket = /obj/item/ammo_box/magazine/recharge/ctf r_pocket = /obj/item/ammo_box/magazine/recharge/ctf r_hand = /obj/item/gun/ballistic/automatic/laser/ctf back = /obj/item/claymore/ctf -/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) +/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) if(visualsOnly) return var/list/no_drops = list() var/obj/item/card/id/W = H.wear_id no_drops += W W.registered_name = H.real_name - W.update_label(W.registered_name, W.assignment) + W.update_label() - // The shielded hardsuit is already TRAIT_NODROP - no_drops += H.get_item_by_slot(SLOT_GLOVES) - no_drops += H.get_item_by_slot(SLOT_SHOES) - no_drops += H.get_item_by_slot(SLOT_W_UNIFORM) - no_drops += H.get_item_by_slot(SLOT_EARS) + no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING) + no_drops += H.get_item_by_slot(ITEM_SLOT_GLOVES) + no_drops += H.get_item_by_slot(ITEM_SLOT_FEET) + no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING) + no_drops += H.get_item_by_slot(ITEM_SLOT_EARS) for(var/i in no_drops) var/obj/item/I = i ADD_TRAIT(I, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT) @@ -525,6 +548,7 @@ r_hand = /obj/item/gun/ballistic/automatic/laser/ctf/red l_pocket = /obj/item/ammo_box/magazine/recharge/ctf/red r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/red + id = /obj/item/card/id/syndicate_command //it's red /datum/outfit/ctf/red/instagib r_hand = /obj/item/gun/energy/laser/instakill/red @@ -535,12 +559,13 @@ r_hand = /obj/item/gun/ballistic/automatic/laser/ctf/blue l_pocket = /obj/item/ammo_box/magazine/recharge/ctf/blue r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/blue + id = /obj/item/card/id/centcom //it's blue /datum/outfit/ctf/blue/instagib r_hand = /obj/item/gun/energy/laser/instakill/blue shoes = /obj/item/clothing/shoes/jackboots/fast -/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) +/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H) ..() var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CTF_RED) @@ -548,7 +573,7 @@ R.independent = TRUE H.dna.species.stunmod = 0 -/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) +/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H) ..() var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CTF_BLUE) @@ -595,6 +620,10 @@ /obj/structure/barricade/security/ctf/make_debris() new /obj/effect/ctf/dead_barricade(get_turf(src)) +/obj/structure/table/reinforced/ctf + resistance_flags = INDESTRUCTIBLE + flags_1 = NODECONSTRUCT_1 + /obj/effect/ctf density = FALSE anchored = TRUE @@ -617,10 +646,11 @@ QDEL_IN(src, AMMO_DROP_LIFETIME) /obj/effect/ctf/ammo/Crossed(atom/movable/AM) + . = ..() reload(AM) -/obj/effect/ctf/ammo/Bump(atom/movable/AM) - reload(AM) +/obj/effect/ctf/ammo/Bump(atom/A) + reload(A) /obj/effect/ctf/ammo/Bumped(atom/movable/AM) reload(AM) @@ -636,7 +666,7 @@ qdel(G) O.equip(M) to_chat(M, "Ammunition reloaded!") - playsound(get_turf(M), 'sound/weapons/shotgunpump.ogg', 50, 1, -1) + playsound(get_turf(M), 'sound/weapons/shotgunpump.ogg', 50, TRUE, -1) qdel(src) break @@ -667,18 +697,18 @@ resistance_flags = INDESTRUCTIBLE var/obj/machinery/capture_the_flag/controlling var/team = "none" - var/point_rate = 1 + var/point_rate = 0.5 -/obj/machinery/control_point/process() +/obj/machinery/control_point/process(delta_time) if(controlling) - controlling.control_points += point_rate + controlling.control_points += point_rate * delta_time if(controlling.control_points >= controlling.control_points_to_win) controlling.victory() /obj/machinery/control_point/attackby(mob/user, params) capture(user) -/obj/machinery/control_point/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) +/obj/machinery/control_point/on_attack_hand(mob/user) capture(user) /obj/machinery/control_point/proc/capture(mob/user) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index e68c45a84c..cd5c2f76f3 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -66,7 +66,7 @@ /obj/effect/mob_spawn/Initialize(mapload) . = ..() if(instant || (roundstart && (mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP)))) - create() + INVOKE_ASYNC(src, .proc/create) else if(ghost_usable) GLOB.poi_list |= src LAZYADD(GLOB.mob_spawners[job_description ? job_description : name], src) diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm index 86610a36b8..b45afea312 100644 --- a/code/modules/awaymissions/exile.dm +++ b/code/modules/awaymissions/exile.dm @@ -10,4 +10,4 @@ new /obj/item/implantcase/exile(src) new /obj/item/implantcase/exile(src) new /obj/item/implantcase/exile(src) - new /obj/item/implantcase/exile(src) \ No newline at end of file + new /obj/item/implantcase/exile(src) diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 129e6d7a2b..98e7f4c292 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -196,7 +196,7 @@ /obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll) if(!reusable) used = 1 - visible_message("The die flare briefly.") + visible_message("The die flares briefly.") switch(roll) if(1) //Dust diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index 1b099a22db..3ad7c7cb50 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -155,4 +155,4 @@ endTurfX = 159 endTurfY = 157 startTurfX = 37 - startTurfY = 35 \ No newline at end of file + startTurfY = 35 diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm index 3a112a5d91..5b8a66b7fd 100644 --- a/code/modules/awaymissions/mission_code/centcomAway.dm +++ b/code/modules/awaymissions/mission_code/centcomAway.dm @@ -60,4 +60,4 @@ teams never did figure out what happened that last time... and I can't wrap my head \ around it myself. Why would a shuttle full of evacuees all snap and beat each other \ to death the moment they reached safety?
    \ - - D. Cereza" \ No newline at end of file + - D. Cereza" diff --git a/code/modules/awaymissions/mission_code/jungleresort.dm b/code/modules/awaymissions/mission_code/jungleresort.dm new file mode 100644 index 0000000000..6c82b2c0c4 --- /dev/null +++ b/code/modules/awaymissions/mission_code/jungleresort.dm @@ -0,0 +1,109 @@ +// welcome to the jungle, we got fun and games + +//areas + +/area/awaymission/jungleresort + name = "Jungle Resort" + icon_state = "awaycontent30" + +//objects + +/obj/item/paper/crumpled/awaymissions/jungleresort/notice + name = "Resort Notice" + info = "Due to unforeseen circumstances and the disappearance of several resort employees and visitors, the resort shall be closed to the public until further notice. - Resort Manager Joe Lawrence" + +/obj/item/melee/chainofcommand/jungle + name = "treasure hunter's whip" + desc = "The tool of a fallen treasure hunter, old and outdated, it still stings like hell to be hit by." + hitsound = 'sound/weapons/whip.ogg' + icon_state = "whip" + +/obj/item/clothing/suit/hooded/wintercoat/captain/jungle + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + +/obj/item/clothing/head/rice_hat/cursed // this was a stupid idea lmao + name = "cursed rice hat" + desc = "Welcome to the rice fields, motherfucker. This particular one seems to give you second thoughts about wearing it." + +/obj/item/clothing/head/rice_hat/cursed/equipped(mob/M, slot) + . = ..() + if (slot == SLOT_HEAD) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + else + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/head/rice_hat/cursed/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT) + +/obj/item/clothing/head/rice_hat/cursed/proc/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + var/list/temp_message = splittext(message, " ") + var/list/pick_list = list() + for(var/i in 1 to temp_message.len) + pick_list += i + for(var/i in 1 to abs(temp_message.len/3)) + var/H = pick(pick_list) + if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) + continue + temp_message[H] = ninjaspeak(temp_message[H]) + pick_list -= H + message = temp_message.Join(" ") + + //The Alternate speech mod is now the main one. + message = replacetext(message, "l", "r") + message = replacetext(message, "rr", "ru") + message = replacetext(message, "v", "b") + message = replacetext(message, "f", "hu") + message = replacetext(message, "'t", "") + message = replacetext(message, "t ", "to ") + message = replacetext(message, " I ", " ai ") + message = replacetext(message, "th", "z") + message = replacetext(message, "is", "izu") + message = replacetext(message, "ziz", "zis") + message = replacetext(message, "se", "su") + message = replacetext(message, "br", "bur") + message = replacetext(message, "ry", "ri") + message = replacetext(message, "you", "yuu") + message = replacetext(message, "ck", "cku") + message = replacetext(message, "eu", "uu") + message = replacetext(message, "ow", "au") + message = replacetext(message, "are", "aa") + message = replacetext(message, "ay", "ayu") + message = replacetext(message, "ea", "ii") + message = replacetext(message, "ch", "chi") + message = replacetext(message, "than", "sen") + message = replacetext(message, ".", "") + message = lowertext(message) + speech_args[SPEECH_MESSAGE] = message + +//turfs + +/turf/open/water/jungle + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + +/turf/open/floor/plating/dirt/jungle + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + +/turf/open/floor/plating/dirt/dark/jungle + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + +/turf/closed/mineral/random/labormineral/jungle + baseturfs = /turf/open/floor/plating/asteroid + turf_type = /turf/open/floor/plating/asteroid + +//mobs + +/mob/living/carbon/monkey/punpun/curiousgorge + name = "Curious Gorge" + pet_monkey_names = list("Curious Gorge", "Jungle Gorge", "Jungah Joe", "Mr. Monke") + rare_pet_monkey_names = list("Sun Mukong", "Monkey Kong") + +/mob/living/simple_animal/hostile/jungle/leaper/boss + health = 550 + name = "Froggerosa" + +/mob/living/simple_animal/hostile/gorilla/jungle + tame = 1 + faction = list("neutral") diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index c7e2609436..d873b42d33 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -228,9 +228,9 @@ for(var/BP in PP.bodyparts) var/obj/item/bodypart/NN = BP - if(NN.status == BODYPART_ORGANIC && NN.species_id != "plasmaman") //getting every organic, non-plasmaman limb (augments/androids are immune to this) + if(NN.is_organic_limb() && NN.species_id != "plasmaman") //getting every organic, non-plasmaman limb (augments/androids are immune to this) plasma_parts += NN - if(NN.status == BODYPART_ROBOTIC) + if(NN.is_robotic_limb(FALSE)) robo_parts += NN if(prob(35)) //checking if the delay is over & if the victim actually has any parts to nom diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index 232ffe5754..434dc673f7 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -150,4 +150,4 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]") mezzer() /obj/singularity/narsie/mini/ex_act() - return \ No newline at end of file + return diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index f13341faf3..bc7e2cbd08 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -132,6 +132,7 @@ var/triggered = 0 /obj/effect/meatgrinder/Crossed(atom/movable/AM) + . = ..() Bumped(AM) /obj/effect/meatgrinder/Bumped(atom/movable/AM) diff --git a/code/modules/bsql/core/connection.dm b/code/modules/bsql/core/connection.dm index 0e0b891f65..fb8f729390 100644 --- a/code/modules/bsql/core/connection.dm +++ b/code/modules/bsql/core/connection.dm @@ -65,4 +65,4 @@ BSQL_DEL_PROC(/datum/BSQL_Connection) return null; . = world._BSQL_Internal_Call("QuoteString", id, "[str]") if(!.) - BSQL_ERROR("Library failed to provide quote for [str]!") \ No newline at end of file + BSQL_ERROR("Library failed to provide quote for [str]!") diff --git a/code/modules/buildmode/bm_mode.dm b/code/modules/buildmode/bm_mode.dm index 0c7d640fc0..5bd5f079fa 100644 --- a/code/modules/buildmode/bm_mode.dm +++ b/code/modules/buildmode/bm_mode.dm @@ -88,4 +88,4 @@ deselect_region() return -/datum/buildmode_mode/proc/handle_selected_area(client/c, params) \ No newline at end of file +/datum/buildmode_mode/proc/handle_selected_area(client/c, params) diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index b232bd212c..4a56257882 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -158,4 +158,4 @@ #undef BM_SWITCHSTATE_NONE #undef BM_SWITCHSTATE_MODE -#undef BM_SWITCHSTATE_DIR \ No newline at end of file +#undef BM_SWITCHSTATE_DIR diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index c219f18cec..6901a0e42e 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -86,4 +86,4 @@ /obj/screen/buildmode/quit/Click() bd.quit() - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/buildmode/effects/line.dm b/code/modules/buildmode/effects/line.dm index 8bba27ac88..d21c0787fa 100644 --- a/code/modules/buildmode/effects/line.dm +++ b/code/modules/buildmode/effects/line.dm @@ -25,4 +25,4 @@ cl.images -= I cl = null QDEL_NULL(I) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/buildmode/submodes/fill.dm b/code/modules/buildmode/submodes/fill.dm index 58320cff7b..b7d87edef2 100644 --- a/code/modules/buildmode/submodes/fill.dm +++ b/code/modules/buildmode/submodes/fill.dm @@ -59,4 +59,4 @@ else var/obj/A = new objholder(T) A.setDir(BM.build_dir) - log_admin("Build Mode: [key_name(c)] with path [objholder], filled the region from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") \ No newline at end of file + log_admin("Build Mode: [key_name(c)] with path [objholder], filled the region from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") diff --git a/code/modules/buildmode/submodes/mapgen.dm b/code/modules/buildmode/submodes/mapgen.dm index 2b57ec1180..7ed99afd50 100644 --- a/code/modules/buildmode/submodes/mapgen.dm +++ b/code/modules/buildmode/submodes/mapgen.dm @@ -45,4 +45,4 @@ var/confirm = alert("Are you sure you want run the map generator?", "Run generator", "Yes", "No") if(confirm == "Yes") G.generate() - log_admin("Build Mode: [key_name(c)] ran the map generator '[G.buildmode_name]' in the region from [AREACOORD(cornerA)] to [AREACOORD(cornerB)]") \ No newline at end of file + log_admin("Build Mode: [key_name(c)] ran the map generator '[G.buildmode_name]' in the region from [AREACOORD(cornerA)] to [AREACOORD(cornerB)]") diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm index 654bcfe74b..31e13e9a9b 100644 --- a/code/modules/cargo/bounties/botany.dm +++ b/code/modules/cargo/bounties/botany.dm @@ -227,4 +227,4 @@ wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate) multiplier = 6 bonus_desc = "Under no circumstances mention this shipment to security." - foodtype = "\"meal\"" \ No newline at end of file + foodtype = "\"meal\"" diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index 7f7f0b86e2..c83fa116d6 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -136,4 +136,4 @@ description = "There's a debate around command as to weather or not ribs should be considered finger food, and we need a few delicious racks to process." reward = 2250 required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/bbqribs) \ No newline at end of file + wanted_types = list(/obj/item/reagent_containers/food/snacks/bbqribs) diff --git a/code/modules/cargo/bounties/gardencook.dm b/code/modules/cargo/bounties/gardencook.dm index 6fdd9b2a3f..39ebdceada 100644 --- a/code/modules/cargo/bounties/gardencook.dm +++ b/code/modules/cargo/bounties/gardencook.dm @@ -62,4 +62,4 @@ description = "Apparently people are putting vegetables on kebabs now. Central Command has taken an interest in this turn of events and would like to know more." reward = 2600 required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab/fiesta) \ No newline at end of file + wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab/fiesta) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 391b4ff464..57501beab3 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -35,7 +35,7 @@ name = "Simple Drink" reward = 1500 -datum/bounty/reagent/simple_drink/New() +/datum/bounty/reagent/simple_drink/New() // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. var/static/list/possible_reagents = list(\ /datum/reagent/consumable/ethanol/antifreeze,\ @@ -91,7 +91,7 @@ datum/bounty/reagent/simple_drink/New() name = "Complex Drink" reward = 4000 -datum/bounty/reagent/complex_drink/New() +/datum/bounty/reagent/complex_drink/New() // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. var/static/list/possible_reagents = list(\ /datum/reagent/consumable/ethanol/atomicbomb,\ @@ -124,7 +124,7 @@ datum/bounty/reagent/complex_drink/New() reward = 2750 required_volume = 30 -datum/bounty/reagent/chemical/New() +/datum/bounty/reagent/chemical/New() // Don't worry about making this comprehensive. It doesn't matter if some chems are skipped. var/static/list/possible_reagents = list(\ /datum/reagent/medicine/leporazine,\ diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index b7eac1e591..77fbd6c6bd 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -1,3 +1,10 @@ +#define TAB_POD 0 //Used to check if the UIs built in camera is looking at the pod +#define TAB_BAY 1 //Used to check if the UIs built in camera is looking at the launch bay area + +#define LAUNCH_ALL 0 //Used to check if we're launching everything from the bay area at once +#define LAUNCH_ORDERED 1 //Used to check if we're launching everything from the bay area in order +#define LAUNCH_RANDOM 2 //Used to check if we're launching everything from the bay area randomly + //The Great and Mighty CentCom Pod Launcher - MrDoomBringer //This was originally created as a way to get adminspawned items to the station in an IC manner. It's evolved to contain a few more //features such as item removal, smiting, controllable delivery mobs, and more. @@ -12,22 +19,23 @@ /client/proc/centcom_podlauncher() //Creates a verb for admins to open up the ui set name = "Config/Launch Supplypod" set desc = "Configure and launch a CentCom supplypod full of whatever your heart desires!" - set category = "Admin" + set category = "Admin.Events" var/datum/centcom_podlauncher/plaunch = new(usr)//create the datum plaunch.ui_interact(usr)//datum has a tgui component, here we open the window //Variables declared to change how items in the launch bay are picked and launched. (Almost) all of these are changed in the ui_act proc //Some effect groups are choices, while other are booleans. This is because some effects can stack, while others dont (ex: you can stack explosion and quiet, but you cant stack ordered launch and random launch) /datum/centcom_podlauncher - var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/abstract/DPtarget, /obj/effect/supplypod_selector )) + var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/pod_landingzone, /obj/effect/hallucination/simple/supplypod_selector, /obj/effect/hallucination/simple/dropoff_location)) var/turf/oldTurf //Keeps track of where the user was at if they use the "teleport to centcom" button, so they can go back var/client/holder //client of whoever is using this datum - var/area/bay //What bay we're using to launch shit from. - var/turf/dropoff_turf //If we're reversing, where the reverse pods go - var/picking_dropoff_turf + var/area/centcom/supplypod/loading/bay //What bay we're using to launch shit from. + var/bayNumber //Quick reference to what bay we're in. Usually set to the loading_id variable for the related area type + var/customDropoff = FALSE + var/picking_dropoff_turf = FALSE var/launchClone = FALSE //If true, then we don't actually launch the thing in the bay. Instead we call duplicateObject() and send the result var/launchRandomItem = FALSE //If true, lauches a single random item instead of everything on a turf. - var/launchChoice = 1 //Determines if we launch all at once (0) , in order (1), or at random(2) + var/launchChoice = LAUNCH_RANDOM //Determines if we launch all at once (0) , in order (1), or at random(2) var/explosionChoice = 0 //Determines if there is no explosion (0), custom explosion (1), or just do a maxcap (2) var/damageChoice = 0 //Determines if we do no damage (0), custom amnt of damage (1), or gib + 5000dmg (2) var/launcherActivated = FALSE //check if we've entered "launch mode" (when we click a pod is launched). Used for updating mouse cursor @@ -39,48 +47,115 @@ var/list/orderedArea = list() //Contains an ordered list of turfs in an area (filled in the createOrderedArea() proc), read top-left to bottom-right. Used for the "ordered" launch mode (launchChoice = 1) var/list/turf/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea var/list/launchList = list() //Contains whatever is going to be put in the supplypod and fired. Taken from acceptableTurfs - var/obj/effect/supplypod_selector/selector = new() //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1) + var/obj/effect/hallucination/simple/supplypod_selector/selector //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1) + var/obj/effect/hallucination/simple/dropoff_location/indicator var/obj/structure/closet/supplypod/centcompod/temp_pod //The temporary pod that is modified by this datum, then cloned. The buildObject() clone of this pod is what is launched + // Stuff needed to render the map + var/map_name + var/obj/screen/map_view/cam_screen + var/list/cam_plane_masters + var/obj/screen/background/cam_background + var/tabIndex = 1 + var/list/timers = list("landingDelay", "fallDuration", "openingDelay", "departureDelay") + var/renderLighting = FALSE -/datum/centcom_podlauncher/New(H)//H can either be a client or a mob due to byondcode(tm) - if (istype(H,/client)) - var/client/C = H - holder = C //if its a client, assign it to holder +/datum/centcom_podlauncher/New(user) //user can either be a client or a mob + if (user) //Prevents runtimes on datums being made without clients + setup(user) + +/datum/centcom_podlauncher/proc/setup(user) //H can either be a client or a mob + if (istype(user,/client)) + var/client/user_client = user + holder = user_client //if its a client, assign it to holder else - var/mob/M = H - holder = M.client //if its a mob, assign the mob's client to holder + var/mob/user_mob = user + holder = user_mob.client //if its a mob, assign the mob's client to holder bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //Locate the default bay (one) from the centcom map - temp_pod = new(locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas) //Create a new temp_pod in the podStorage area on centcom (so users are free to look at it and change other variables if needed) + bayNumber = bay.loading_id //Used as quick reference to what bay we're taking items from + var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas + temp_pod = new(pick(get_area_turfs(pod_storage_area))) //Create a new temp_pod in the podStorage area on centcom (so users are free to look at it and change other variables if needed) orderedArea = createOrderedArea(bay) //Order all the turfs in the selected bay (top left to bottom right) to a single list. Used for the "ordered" mode (launchChoice = 1) + selector = new(null, holder.mob) + indicator = new(null, holder.mob) + setDropoff(bay) + initMap() + refreshBay() + ui_interact(holder.mob) + +/datum/centcom_podlauncher/proc/initMap() + if(map_name) + holder.clear_map(map_name) + + map_name = "admin_supplypod_bay_[REF(src)]_map" + // Initialize map objects + cam_screen = new + cam_screen.name = "screen" + cam_screen.assigned_map = map_name + cam_screen.del_on_map_removal = TRUE + cam_screen.screen_loc = "[map_name]:1,1" + cam_plane_masters = list() + for(var/plane in subtypesof(/obj/screen/plane_master)) + var/obj/screen/instance = new plane() + if (!renderLighting && instance.plane == LIGHTING_PLANE) + instance.alpha = 100 + instance.assigned_map = map_name + instance.del_on_map_removal = TRUE + instance.screen_loc = "[map_name]:CENTER" + cam_plane_masters += instance + cam_background = new + cam_background.assigned_map = map_name + cam_background.del_on_map_removal = TRUE + refreshView() + holder.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + holder.register_map_obj(plane) + holder.register_map_obj(cam_background) /datum/centcom_podlauncher/ui_state(mob/user) + if (SSticker.current_state >= GAME_STATE_FINISHED) + return GLOB.always_state //Allow the UI to be given to players by admins after roundend return GLOB.admin_state +/datum/centcom_podlauncher/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/supplypods), + ) + /datum/centcom_podlauncher/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) + // Open UI ui = new(user, src, "CentcomPodLauncher") ui.open() + refreshView() + +/datum/centcom_podlauncher/ui_static_data(mob/user) + var/list/data = list() + data["mapRef"] = map_name + data["defaultSoundVolume"] = initial(temp_pod.soundVolume) //default volume for pods + return data /datum/centcom_podlauncher/ui_data(mob/user) //Sends info about the pod to the UI. var/list/data = list() //*****NOTE*****: Many of these comments are similarly described in supplypod.dm. If you change them here, please consider doing so in the supplypod code as well! - var/B = (istype(bay, /area/centcom/supplypod/loading/one)) ? 1 : (istype(bay, /area/centcom/supplypod/loading/two)) ? 2 : (istype(bay, /area/centcom/supplypod/loading/three)) ? 3 : (istype(bay, /area/centcom/supplypod/loading/four)) ? 4 : 0 //(istype(bay, /area/centcom/supplypod/loading/ert)) ? 5 : 0 //top ten THICCEST FUCKING TERNARY CONDITIONALS OF 2036 - data["bay"] = bay //Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. - data["bayNumber"] = B //Holds the bay as a number. Useful for comparisons in centcom_podlauncher.ract + bayNumber = bay?.loading_id //Used as quick reference to what bay we're taking items from + data["bayNumber"] = bayNumber //Holds the bay as a number. Useful for comparisons in centcom_podlauncher.ract data["oldArea"] = (oldTurf ? get_area(oldTurf) : null) //Holds the name of the area that the user was in before using the teleportCentcom action data["picking_dropoff_turf"] = picking_dropoff_turf //If we're picking or have picked a dropoff turf. Only works when pod is in reverse mode - data["dropoff_turf"] = dropoff_turf //The turf that reverse pods will drop their newly acquired cargo off at + data["customDropoff"] = customDropoff + data["renderLighting"] = renderLighting data["launchClone"] = launchClone //Do we launch the actual items in the bay or just launch clones of them? data["launchRandomItem"] = launchRandomItem //Do we launch a single random item instead of everything on the turf? data["launchChoice"] = launchChoice //Launch turfs all at once (0), ordered (1), or randomly(1) data["explosionChoice"] = explosionChoice //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2) data["damageChoice"] = damageChoice //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2) - data["fallDuration"] = temp_pod.fallDuration //How long the pod's falling animation lasts - data["landingDelay"] = temp_pod.landingDelay //How long the pod takes to land after launching - data["openingDelay"] = temp_pod.openingDelay //How long the pod takes to open after landing - data["departureDelay"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom) - data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. - data["effectShrapnel"] = FALSE //temp_pod.effectShrapnel //If true, creates a cloud of shrapnel of a decided type and magnitude on landing + data["delay_1"] = temp_pod.landingDelay //How long the pod takes to land after launching + data["delay_2"] = temp_pod.fallDuration //How long the pod's falling animation lasts + data["delay_3"] = temp_pod.openingDelay //How long the pod takes to open after landing + data["delay_4"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom) + data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. + data["effectShrapnel"] = temp_pod.effectShrapnel //If true, creates a cloud of shrapnel of a decided type and magnitude on landing + data["shrapnelType"] = "[temp_pod.shrapnel_type]" //Path2String + data["shrapnelMagnitude"] = temp_pod.shrapnel_magnitude data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands data["effectOrgans"] = temp_pod.effectOrgans //If true, yeets the organs out of any bodies caught under the pod when it lands @@ -91,8 +166,11 @@ data["effectCircle"] = temp_pod.effectCircle //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here data["effectBurst"] = effectBurst //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area data["effectReverse"] = temp_pod.reversing //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom + data["reverseOptionList"] = temp_pod.reverseOptionList data["effectTarget"] = specificTarget //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites data["effectName"] = temp_pod.adminNamed //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) + data["podName"] = temp_pod.name + data["podDesc"] = temp_pod.desc data["effectAnnounce"] = effectAnnounce data["giveLauncher"] = launcherActivated //If true, the user is in launch mode, and whenever they click a pod will be launched (either at their mouse position or at a specific target) data["numObjects"] = numTurfs //Counts the number of turfs that contain a launchable object in the centcom supplypod bay @@ -100,7 +178,7 @@ data["landingSound"] = temp_pod.landingSound //Admin sound to play when the pod lands data["openingSound"] = temp_pod.openingSound //Admin sound to play when the pod opens data["leavingSound"] = temp_pod.leavingSound //Admin sound to play when the pod leaves - data["soundVolume"] = temp_pod.soundVolume != initial(temp_pod.soundVolume) //Admin sound to play when the pod leaves + data["soundVolume"] = temp_pod.soundVolume //Admin sound to play when the pod leaves return data /datum/centcom_podlauncher/ui_act(action, params) @@ -108,66 +186,72 @@ return switch(action) ////////////////////////////UTILITIES////////////////// - if("bay1") - bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //set the "bay" variable to the corresponding room in centcom - refreshBay() //calls refreshBay() which "recounts" the bay to see what items we can launch (among other things). + if("gamePanel") + holder.holder.Game() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! . = TRUE - if("bay2") - bay = locate(/area/centcom/supplypod/loading/two) in GLOB.sortedAreas + if("buildMode") + var/mob/holder_mob = holder.mob + if (holder_mob) + togglebuildmode(holder_mob) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + . = TRUE + if("loadDataFromPreset") + var/list/savedData = params["payload"] + loadData(savedData) + . = TRUE + if("switchBay") + bayNumber = params["bayNumber"] refreshBay() . = TRUE - if("bay3") - bay = locate(/area/centcom/supplypod/loading/three) in GLOB.sortedAreas - refreshBay() - . = TRUE - if("bay4") - bay = locate(/area/centcom/supplypod/loading/four) in GLOB.sortedAreas - refreshBay() - . = TRUE - if("bay5") - to_chat(usr, "LetterN is lazy and didin't bother porting this new cc area!") - return - // bay = locate(/area/centcom/supplypod/loading/ert) in GLOB.sortedAreas - // refreshBay() - // . = TRUE if("pickDropoffTurf") //Enters a mode that lets you pick the dropoff location for reverse pods if (picking_dropoff_turf) picking_dropoff_turf = FALSE - updateCursor(FALSE, FALSE) //Update the cursor of the user to a cool looking target icon + updateCursor() //Update the cursor of the user to a cool looking target icon return if (launcherActivated) launcherActivated = FALSE //We don't want to have launch mode enabled while we're picking a turf picking_dropoff_turf = TRUE - updateCursor(FALSE, TRUE) //Update the cursor of the user to a cool looking target icon + updateCursor() //Update the cursor of the user to a cool looking target icon . = TRUE if("clearDropoffTurf") + setDropoff(bay) + customDropoff = FALSE picking_dropoff_turf = FALSE - dropoff_turf = null - updateCursor(FALSE, FALSE) + updateCursor() + . = TRUE + if("teleportDropoff") //Teleports the user to the dropoff point. + var/mob/M = holder.mob //We teleport whatever mob the client is attached to at the point of clicking + var/turf/current_location = get_turf(M) + var/list/coordinate_list = temp_pod.reverse_dropoff_coords + var/turf/dropoff_turf = locate(coordinate_list[1], coordinate_list[2], coordinate_list[3]) + if (current_location != dropoff_turf) + oldTurf = current_location + M.forceMove(dropoff_turf) //Perform the actual teleport + log_admin("[key_name(usr)] jumped to [AREACOORD(dropoff_turf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(dropoff_turf)]") . = TRUE if("teleportCentcom") //Teleports the user to the centcom supply loading facility. - var/mob/M = holder.mob //We teleport whatever mob the client is attached to at the point of clicking - oldTurf = get_turf(M) //Used for the "teleportBack" action - var/area/A = locate(bay) in GLOB.sortedAreas - var/list/turfs = list() - for(var/turf/T in A) - turfs.Add(T) //Fill a list with turfs in the area - if (!length(turfs)) //If the list is empty, error and cancel - to_chat(M, "Nowhere to jump to!") - return //Only teleport if the list isn't empty - var/turf/T = pick(turfs) - M.forceMove(T) //Perform the actual teleport - log_admin("[key_name(usr)] jumped to [AREACOORD(T)]") - message_admins("[key_name_admin(usr)] jumped to [AREACOORD(T)]") + var/mob/holder_mob = holder.mob //We teleport whatever mob the client is attached to at the point of clicking + var/turf/current_location = get_turf(holder_mob) + var/area/bay_area = bay + if (current_location.loc != bay_area) + oldTurf = current_location + var/turf/teleport_turf = pick(get_area_turfs(bay_area)) + holder_mob.forceMove(teleport_turf) //Perform the actual teleport + if (holder.holder) + log_admin("[key_name(usr)] jumped to [AREACOORD(teleport_turf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(teleport_turf)]") . = TRUE - if("teleportBack") //After teleporting to centcom, this button allows the user to teleport to the last spot they were at. + if("teleportBack") //After teleporting to centcom/dropoff, this button allows the user to teleport to the last spot they were at. var/mob/M = holder.mob if (!oldTurf) //If theres no turf to go back to, error and cancel to_chat(M, "Nowhere to jump to!") return M.forceMove(oldTurf) //Perform the actual teleport - log_admin("[key_name(usr)] jumped to [AREACOORD(oldTurf)]") - message_admins("[key_name_admin(usr)] jumped to [AREACOORD(oldTurf)]") + if (holder.holder) + log_admin("[key_name(usr)] jumped to [AREACOORD(oldTurf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(oldTurf)]") . = TRUE ////////////////////////////LAUNCH STYLE CHANGES////////////////// @@ -175,22 +259,21 @@ launchClone = !launchClone . = TRUE if("launchRandomItem") //Pick random turfs from the supplypod bay at centcom to launch - launchRandomItem = !launchRandomItem + launchRandomItem = TRUE + . = TRUE + if("launchWholeTurf") //Pick random turfs from the supplypod bay at centcom to launch + launchRandomItem = FALSE + . = TRUE + if("launchAll") //Launch turfs (from the orderedArea list) all at once, from the supplypod bay at centcom + launchChoice = LAUNCH_ALL + updateSelector() . = TRUE if("launchOrdered") //Launch turfs (from the orderedArea list) one at a time in order, from the supplypod bay at centcom - if (launchChoice == 1) //launchChoice 1 represents ordered. If we push "ordered" and it already is, then we go to default value - launchChoice = 0 - updateSelector() //Move the selector effect to the next object that will be launched. See variable declarations for more info on the selector effect. - return - launchChoice = 1 + launchChoice = LAUNCH_ORDERED updateSelector() . = TRUE if("launchRandomTurf") //Pick random turfs from the supplypod bay at centcom to launch - if (launchChoice == 2) - launchChoice = 0 - updateSelector() - return - launchChoice = 2 + launchChoice = LAUNCH_RANDOM updateSelector() . = TRUE @@ -249,17 +332,16 @@ temp_pod.adminNamed = FALSE temp_pod.setStyle(temp_pod.style) //This resets the name of the pod based on it's current style (see supplypod/setStyle() proc) return - var/nameInput= input("Custom name", "Enter a custom name", POD_STYLES[temp_pod.style][POD_NAME]) as null|text //Gather input for name and desc + var/nameInput= input("Custom name", "Enter a custom name", GLOB.podstyles[temp_pod.style][POD_NAME]) as null|text //Gather input for name and desc if (isnull(nameInput)) return - var/descInput = input("Custom description", "Enter a custom desc", POD_STYLES[temp_pod.style][POD_DESC]) as null|text //The POD_STYLES is used to get the name, desc, or icon state based on the pod's style + var/descInput = input("Custom description", "Enter a custom desc", GLOB.podstyles[temp_pod.style][POD_DESC]) as null|text //The GLOB.podstyles is used to get the name, desc, or icon state based on the pod's style if (isnull(descInput)) return temp_pod.name = nameInput temp_pod.desc = descInput temp_pod.adminNamed = TRUE //This variable is checked in the supplypod/setStyle() proc . = TRUE - /* if("effectShrapnel") //Creates a cloud of shrapnel on landing if (temp_pod.effectShrapnel == TRUE) //If already doing custom damage, set back to default (no shrapnel) temp_pod.effectShrapnel = FALSE @@ -277,7 +359,6 @@ temp_pod.shrapnel_magnitude = shrapnelMagnitude temp_pod.effectShrapnel = TRUE . = TRUE - */ if("effectStun") //Toggle: Any mob under the pod is stunned (cant move) until the pod lands, hitting them! temp_pod.effectStun = !temp_pod.effectStun . = TRUE @@ -310,6 +391,14 @@ . = TRUE if("effectReverse") //Toggle: Don't send any items. Instead, after landing, close (taking any objects inside) and go back to the centcom bay it came from temp_pod.reversing = !temp_pod.reversing + if (temp_pod.reversing) + indicator.alpha = 150 + else + indicator.alpha = 0 + . = TRUE + if("reverseOption") + var/reverseOption = params["reverseOption"] + temp_pod.reverseOptionList[reverseOption] = !temp_pod.reverseOptionList[reverseOption] . = TRUE if("effectTarget") //Toggle: Launch at a specific mob (instead of at whatever turf you click on). Used for the supplypod smite if (specificTarget) @@ -324,71 +413,44 @@ . = TRUE ////////////////////////////TIMER DELAYS////////////////// - if("fallDuration") //Change the time it takes the pod to land, after firing - if (temp_pod.fallDuration != initial(temp_pod.fallDuration)) //If the landing delay has already been changed when we push the "change value" button, then set it to default - temp_pod.fallDuration = initial(temp_pod.fallDuration) - return - var/timeInput = input("Enter the duration of the pod's falling animation, in seconds", "Delay Time", initial(temp_pod.fallDuration) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default - alert(usr, "That wasn't a number! Value set to default ([initial(temp_pod.fallDuration)*0.1]) instead.") - timeInput = initial(temp_pod.fallDuration) - temp_pod.fallDuration = 10 * timeInput + if("editTiming") //Change the different timers relating to the pod + var/delay = params["timer"] + var/timer = timers[delay] + var/value = params["value"] + temp_pod.vars[timer] = value * 10 . = TRUE - if("landingDelay") //Change the time it takes the pod to land, after firing - if (temp_pod.landingDelay != initial(temp_pod.landingDelay)) //If the landing delay has already been changed when we push the "change value" button, then set it to default - temp_pod.landingDelay = initial(temp_pod.landingDelay) - return - var/timeInput = input("Enter the time it takes for the pod to land, in seconds", "Delay Time", initial(temp_pod.landingDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default - alert(usr, "That wasn't a number! Value set to default ([initial(temp_pod.landingDelay)*0.1]) instead.") - timeInput = initial(temp_pod.landingDelay) - temp_pod.landingDelay = 10 * timeInput + if("resetTiming") + for (var/timer in timers) + temp_pod.vars[timer] = initial(temp_pod.vars[timer]) . = TRUE - if("openingDelay") //Change the time it takes the pod to open it's door (and release its contents) after landing - if (temp_pod.openingDelay != initial(temp_pod.openingDelay)) //If the opening delay has already been changed when we push the "change value" button, then set it to default - temp_pod.openingDelay = initial(temp_pod.openingDelay) - return - var/timeInput = input("Enter the time it takes for the pod to open after landing, in seconds", "Delay Time", initial(temp_pod.openingDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) //Sanitize input - alert(usr, "That wasn't a number! Value set to default ([initial(temp_pod.openingDelay)*0.1]) instead.") - timeInput = initial(temp_pod.openingDelay) - temp_pod.openingDelay = 10 * timeInput - . = TRUE - if("departureDelay") //Change the time it takes the pod to leave (if bluespace = true it just deletes, if effectReverse = true it goes back to centcom) - if (temp_pod.departureDelay != initial(temp_pod.departureDelay)) //If the departure delay has already been changed when we push the "change value" button, then set it to default - temp_pod.departureDelay = initial(temp_pod.departureDelay) - return - var/timeInput = input("Enter the time it takes for the pod to leave after opening, in seconds", "Delay Time", initial(temp_pod.departureDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) - alert(usr, "That wasn't a number! Value set to default ([initial(temp_pod.departureDelay)*0.1]) instead.") - timeInput = initial(temp_pod.departureDelay) - temp_pod.departureDelay = 10 * timeInput - . = TRUE - ////////////////////////////ADMIN SOUNDS////////////////// - if("fallSound") //Admin sound from a local file that plays when the pod lands + if("fallingSound") //Admin sound from a local file that plays when the pod lands if ((temp_pod.fallingSound) != initial(temp_pod.fallingSound)) temp_pod.fallingSound = initial(temp_pod.fallingSound) temp_pod.fallingSoundLength = initial(temp_pod.fallingSoundLength) return - var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! NOTICE: Take a note of exactly how long the sound is.", "Pick a Sound File") as null|sound + var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! Sound will start playing and try to end when the pod lands", "Pick a Sound File") as null|sound if (isnull(soundInput)) return - var/timeInput = input(holder, "What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) - alert(usr, "That wasn't a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.") + var/sound/tempSound = sound(soundInput) + playsound(holder.mob, tempSound, 1) + var/list/sounds_list = holder.SoundQuery() + var/soundLen = 0 + for (var/playing_sound in sounds_list) + if (isnull(playing_sound)) + stack_trace("client.SoundQuery() Returned a list containing a null sound! Somehow!") + continue + var/sound/found = playing_sound + if (found.file == tempSound.file) + soundLen = found.len + if (!soundLen) + soundLen = input(holder, "Couldn't auto-determine sound file length. What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num + if (isnull(soundLen)) + return + if (!isnum(soundLen)) + alert(usr, "That wasn't a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.") temp_pod.fallingSound = soundInput - temp_pod.fallingSoundLength = 10 * timeInput + temp_pod.fallingSoundLength = 10 * soundLen . = TRUE if("landingSound") //Admin sound from a local file that plays when the pod lands if (!isnull(temp_pod.landingSound)) @@ -427,53 +489,32 @@ temp_pod.soundVolume = soundInput . = TRUE ////////////////////////////STYLE CHANGES////////////////// - //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines) + //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the GLOB.podstyles list (in cargo.dm defines) //as a way to get the proper icon state, name, and description of the pod. - if("styleStandard") - temp_pod.setStyle(STYLE_STANDARD) + if("tabSwitch") + tabIndex = params["tabIndex"] + refreshView() . = TRUE - if("styleBluespace") - temp_pod.setStyle(STYLE_BLUESPACE) + if("refreshView") + initMap() + refreshView() . = TRUE - if("styleSyndie") - temp_pod.setStyle(STYLE_SYNDICATE) + if("renderLighting") + renderLighting = !renderLighting . = TRUE - if("styleBlue") - temp_pod.setStyle(STYLE_BLUE) - . = TRUE - if("styleCult") - temp_pod.setStyle(STYLE_CULT) - . = TRUE - if("styleMissile") - temp_pod.setStyle(STYLE_MISSILE) - . = TRUE - if("styleSMissile") - temp_pod.setStyle(STYLE_RED_MISSILE) - . = TRUE - if("styleBox") - temp_pod.setStyle(STYLE_BOX) - . = TRUE - if("styleHONK") - temp_pod.setStyle(STYLE_HONK) - . = TRUE - if("styleFruit") - temp_pod.setStyle(STYLE_FRUIT) - . = TRUE - if("styleInvisible") - temp_pod.setStyle(STYLE_INVISIBLE) - . = TRUE - if("styleGondola") - temp_pod.setStyle(STYLE_GONDOLA) - . = TRUE - if("styleSeeThrough") - temp_pod.setStyle(STYLE_SEETHROUGH) + if("setStyle") + var/chosenStyle = params["style"] + temp_pod.setStyle(chosenStyle+1) . = TRUE if("refresh") //Refresh the Pod bay. User should press this if they spawn something new in the centcom bay. Automatically called whenever the user launches a pod refreshBay() . = TRUE if("giveLauncher") //Enters the "Launch Mode". When the launcher is activated, temp_pod is cloned, and the result it filled and launched anywhere the user clicks (unless specificTarget is true) launcherActivated = !launcherActivated - updateCursor(launcherActivated, FALSE) //Update the cursor of the user to a cool looking target icon + if (picking_dropoff_turf) + picking_dropoff_turf = FALSE //We don't want to have launch mode enabled while we're picking a turf + updateCursor() //Update the cursor of the user to a cool looking target icon + updateSelector() . = TRUE if("clearBay") //Delete all mobs and objs in the selected bay if(alert(usr, "This will delete all objs and mobs in [bay]. Are you sure?", "Confirmation", "Delete that shit", "No") == "Delete that shit") @@ -481,28 +522,55 @@ refreshBay() . = TRUE -/datum/centcom_podlauncher/ui_close() //Uses the destroy() proc. When the user closes the UI, we clean up the temp_pod and supplypod_selector variables. +/datum/centcom_podlauncher/ui_close(mob/user) //Uses the destroy() proc. When the user closes the UI, we clean up the temp_pod and supplypod_selector variables. + QDEL_NULL(temp_pod) + user.client?.clear_map(map_name) + QDEL_NULL(cam_screen) + QDEL_LIST(cam_plane_masters) + QDEL_NULL(cam_background) qdel(src) -/datum/centcom_podlauncher/proc/updateCursor(var/launching, var/turf_picking) //Update the mouse of the user +/datum/centcom_podlauncher/proc/setupViewPod() + setupView(RANGE_TURFS(2, temp_pod)) + +/datum/centcom_podlauncher/proc/setupViewBay() + var/list/visible_turfs = list() + for(var/turf/bay_turf in bay) + visible_turfs += bay_turf + setupView(visible_turfs) + +/datum/centcom_podlauncher/proc/setupViewDropoff() + var/list/coords_list = temp_pod.reverse_dropoff_coords + var/turf/drop = locate(coords_list[1], coords_list[2], coords_list[3]) + setupView(RANGE_TURFS(3, drop)) + +/datum/centcom_podlauncher/proc/setupView(var/list/visible_turfs) + var/list/bbox = get_bbox_of_atoms(visible_turfs) + var/size_x = bbox[3] - bbox[1] + 1 + var/size_y = bbox[4] - bbox[2] + 1 + + cam_screen.vis_contents = visible_turfs + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, size_x, size_y) + +/datum/centcom_podlauncher/proc/updateCursor(var/forceClear = FALSE) //Update the mouse of the user if (!holder) //Can't update the mouse icon if the client doesnt exist! return - if (launching || turf_picking) //If the launching param is true, we give the user new mouse icons. - if(launching) + if (!forceClear && (launcherActivated || picking_dropoff_turf)) //If the launching param is true, we give the user new mouse icons. + if(launcherActivated) holder.mouse_up_icon = 'icons/effects/mouse_pointers/supplypod_target.dmi' //Icon for when mouse is released holder.mouse_down_icon = 'icons/effects/mouse_pointers/supplypod_down_target.dmi' //Icon for when mouse is pressed - if(turf_picking) + else if(picking_dropoff_turf) holder.mouse_up_icon = 'icons/effects/mouse_pointers/supplypod_pickturf.dmi' //Icon for when mouse is released holder.mouse_down_icon = 'icons/effects/mouse_pointers/supplypod_pickturf_down.dmi' //Icon for when mouse is pressed holder.mouse_pointer_icon = holder.mouse_up_icon //Icon for idle mouse (same as icon for when released) holder.click_intercept = src //Create a click_intercept so we know where the user is clicking else - var/mob/M = holder.mob + var/mob/holder_mob = holder.mob holder.mouse_up_icon = null holder.mouse_down_icon = null holder.click_intercept = null - if (M) - M.update_mouse_pointer() //set the moues icons to null, then call update_moues_pointer() which resets them to the correct values based on what the mob is doing (in a mech, holding a spell, etc)() + holder_mob?.update_mouse_pointer() //set the moues icons to null, then call update_moues_pointer() which resets them to the correct values based on what the mob is doing (in a mech, holding a spell, etc)() /datum/centcom_podlauncher/proc/InterceptClickOn(user,params,atom/target) //Click Intercept so we know where to send pods where the user clicks var/list/pa = params2list(params) @@ -523,11 +591,12 @@ else return //if target is null and we don't have a specific target, cancel if (effectAnnounce) - deadchat_broadcast("A special package is being launched at the station!", turf_target = target) //, message_type=DEADCHAT_ANNOUNCEMENT) + deadchat_broadcast("A special package is being launched at the station!", turf_target = target) var/list/bouttaDie = list() - for (var/mob/living/M in target) - bouttaDie.Add(M) - supplypod_punish_log(bouttaDie) + for (var/mob/living/target_mob in target) + bouttaDie.Add(target_mob) + if (holder.holder) + supplypod_punish_log(bouttaDie) if (!effectBurst) //If we're not using burst mode, just launch normally. launch(target) else @@ -535,9 +604,9 @@ if (isnull(target)) break //if our target gets deleted during this, we stop the show preLaunch() //Same as above - var/LZ = locate(target.x + rand(-1,1), target.y + rand(-1,1), target.z) //Pods are randomly adjacent to (or the same as) the target - if (LZ) //just incase we're on the edge of the map or something that would cause target.x+1 to fail - launch(LZ) //launch the pod at the adjacent turf + var/landingzone = locate(target.x + rand(-1,1), target.y + rand(-1,1), target.z) //Pods are randomly adjacent to (or the same as) the target + if (landingzone) //just incase we're on the edge of the map or something that would cause target.x+1 to fail + launch(landingzone) //launch the pod at the adjacent turf else launch(target) //If we couldn't locate an adjacent turf, just launch at the normal target sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire. @@ -548,96 +617,146 @@ . = TRUE if(left_click) //When we left click: - dropoff_turf = get_turf(target) - to_chat(user, " You've selected [dropoff_turf] at [COORD(dropoff_turf)] as your dropoff location.") + var/turf/target_turf = get_turf(target) + setDropoff(target_turf) + customDropoff = TRUE + to_chat(user, " You've selected [target_turf] at [COORD(target_turf)] as your dropoff location.") + +/datum/centcom_podlauncher/proc/refreshView() + switch(tabIndex) + if (TAB_POD) + setupViewPod() + if (TAB_BAY) + setupViewBay() + else + setupViewDropoff() /datum/centcom_podlauncher/proc/refreshBay() //Called whenever the bay is switched, as well as wheneber a pod is launched + bay = GLOB.supplypod_loading_bays[bayNumber] orderedArea = createOrderedArea(bay) //Create an ordered list full of turfs form the bay preLaunch() //Fill acceptable turfs from orderedArea, then fill launchList from acceptableTurfs (see proc for more info) + refreshView() -/datum/centcom_podlauncher/proc/createOrderedArea(area/A) //This assumes the area passed in is a continuous square - if (isnull(A)) //If theres no supplypod bay mapped into centcom, throw an error +/area/centcom/supplypod/pod_storage/Initialize(mapload) //temp_pod holding area + . = ..() + var/obj/imgbound = locate() in locate(200,SUPPLYPOD_X_OFFSET*-4.5, 1) + call(GLOB.podlauncher, "RegisterSignal")(imgbound, "ct[GLOB.podstyles[14][9]]", "[GLOB.podstyles[14][10]]dlauncher") + +/datum/centcom_podlauncher/proc/createOrderedArea(area/area_to_order) //This assumes the area passed in is a continuous square + if (isnull(area_to_order)) //If theres no supplypod bay mapped into centcom, throw an error to_chat(holder.mob, "No /area/centcom/supplypod/loading/one (or /two or /three or /four) in the world! You can make one yourself (then refresh) for now, but yell at a mapper to fix this, today!") CRASH("No /area/centcom/supplypod/loading/one (or /two or /three or /four) has been mapped into the centcom z-level!") orderedArea = list() - if (length(A.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values - var/startX = A.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments) - var/endX = A.contents[1].x - var/startY = A.contents[1].y - var/endY = A.contents[1].y - for (var/turf/T in A) //For each turf in the area, go through and find: - if (T.x < startX) //The turf with the smallest x value. This is our startX - startX = T.x - else if (T.x > endX) //The turf with the largest x value. This is our endX - endX = T.x - else if (T.y > startY) //The turf with the largest Y value. This is our startY - startY = T.y - else if (T.y < endY) //The turf with the smallest Y value. This is our endY - endY = T.y - for (var/i in endY to startY) - for (var/j in startX to endX) - orderedArea.Add(locate(j,startY - (i - endY),1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book + if (length(area_to_order.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values + var/startX = area_to_order.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments) + var/endX = area_to_order.contents[1].x + var/startY = area_to_order.contents[1].y + var/endY = area_to_order.contents[1].y + for (var/turf/turf_in_area in area_to_order) //For each turf in the area, go through and find: + if (turf_in_area.x < startX) //The turf with the smallest x value. This is our startX + startX = turf_in_area.x + else if (turf_in_area.x > endX) //The turf with the largest x value. This is our endX + endX = turf_in_area.x + else if (turf_in_area.y > startY) //The turf with the largest Y value. This is our startY + startY = turf_in_area.y + else if (turf_in_area.y < endY) //The turf with the smallest Y value. This is our endY + endY = turf_in_area.y + for (var/vertical in endY to startY) + for (var/horizontal in startX to endX) + orderedArea.Add(locate(horizontal, startY - (vertical - endY), 1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book return orderedArea //Return the filled list /datum/centcom_podlauncher/proc/preLaunch() //Creates a list of acceptable items, numTurfs = 0 //Counts the number of turfs that can be launched (remember, supplypods either launch all at once or one turf-worth of items at a time) acceptableTurfs = list() - for (var/turf/T in orderedArea) //Go through the orderedArea list - if (typecache_filter_list_reverse(T.contents, ignored_atoms).len != 0) //if there is something in this turf that isn't in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list - acceptableTurfs.Add(T) //Because orderedArea was an ordered linear list, acceptableTurfs will be as well. + for (var/t in orderedArea) //Go through the orderedArea list + var/turf/unchecked_turf = t + if (iswallturf(unchecked_turf) || typecache_filter_list_reverse(unchecked_turf.contents, ignored_atoms).len != 0) //if there is something in this turf that isn't in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list + acceptableTurfs.Add(unchecked_turf) //Because orderedArea was an ordered linear list, acceptableTurfs will be as well. numTurfs ++ launchList = list() //Anything in launchList will go into the supplypod when it is launched if (length(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We dont fill the supplypod if acceptableTurfs is empty, if the pod is going in reverse (effectReverse=true), or if the pod is acitng like a missile (effectMissile=true) switch(launchChoice) - if(0) //If we are launching all the turfs at once - for (var/turf/T in acceptableTurfs) - launchList |= typecache_filter_list_reverse(T.contents, ignored_atoms) //We filter any blacklisted atoms and add the rest to the launchList - if(1) //If we are launching one at a time + if(LAUNCH_ALL) //If we are launching all the turfs at once + for (var/t in acceptableTurfs) + var/turf/accepted_turf = t + launchList |= typecache_filter_list_reverse(accepted_turf.contents, ignored_atoms) //We filter any blacklisted atoms and add the rest to the launchList + if (iswallturf(accepted_turf)) + launchList += accepted_turf + if(LAUNCH_ORDERED) //If we are launching one at a time if (launchCounter > acceptableTurfs.len) //Check if the launchCounter, which acts as an index, is too high. If it is, reset it to 1 launchCounter = 1 //Note that the launchCounter index is incremented in the launch() proc - for (var/atom/movable/O in acceptableTurfs[launchCounter].contents) //Go through the acceptableTurfs list based on the launchCounter index - launchList |= typecache_filter_list_reverse(acceptableTurfs[launchCounter].contents, ignored_atoms) //Filter the specicic turf chosen from acceptableTurfs, and add it to the launchList - if(2) //If we are launching randomly - launchList |= typecache_filter_list_reverse(pick_n_take(acceptableTurfs).contents, ignored_atoms) //filter a random turf from the acceptableTurfs list and add it to the launchList + var/turf/next_turf_in_line = acceptableTurfs[launchCounter] + launchList |= typecache_filter_list_reverse(next_turf_in_line.contents, ignored_atoms) //Filter the specicic turf chosen from acceptableTurfs, and add it to the launchList + if (iswallturf(next_turf_in_line)) + launchList += next_turf_in_line + if(LAUNCH_RANDOM) //If we are launching randomly + var/turf/acceptable_turf = pick_n_take(acceptableTurfs) + launchList |= typecache_filter_list_reverse(acceptable_turf.contents, ignored_atoms) //filter a random turf from the acceptableTurfs list and add it to the launchList + if (iswallturf(acceptable_turf)) + launchList += acceptable_turf updateSelector() //Call updateSelector(), which, if we are launching one at a time (launchChoice==2), will move to the next turf that will be launched //UpdateSelector() is here (instead if the if(1) switch block) because it also moves the selector to nullspace (to hide it) if needed -/datum/centcom_podlauncher/proc/launch(turf/A) //Game time started - if (isnull(A)) +/datum/centcom_podlauncher/proc/launch(turf/target_turf) //Game time started + if (isnull(target_turf)) return - var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result - /* - if(dropoff_turf) - toLaunch.reverse_dropoff_turf = dropoff_turf - else - toLaunch.reverse_dropoff_turf = bay //Bay is currently a nonstatic expression, so it cant go into toLaunch using DuplicateObject - */ + var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod, sameloc = TRUE) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result toLaunch.update_icon()//we update_icon() here so that the door doesnt "flicker on" right after it lands - // var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/fly_me_to_the_moon] - // toLaunch.forceMove(shippingLane) The shipping lane is temporarily closed due to ratvarian blockades + //We don't have this area, lets just have it where we had the temp pod + //var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] + //toLaunch.forceMove(shippingLane) if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those if(launchRandomItem) - var/atom/movable/O = pick_n_take(launchList) - DuplicateObject(O).forceMove(toLaunch) //Duplicate a single atom/movable from launchList and forceMove it into the supplypod + var/launch_candidate = pick_n_take(launchList) + if(!isnull(launch_candidate)) + if (iswallturf(launch_candidate)) + var/atom/atom_to_launch = launch_candidate + toLaunch.turfs_in_cargo += atom_to_launch.type + else + var/atom/movable/movable_to_launch = launch_candidate + DuplicateObject(movable_to_launch).forceMove(toLaunch) //Duplicate a single atom/movable from launchList and forceMove it into the supplypod else - for (var/atom/movable/O in launchList) - DuplicateObject(O).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod + for (var/launch_candidate in launchList) + if (isnull(launch_candidate)) + continue + if (iswallturf(launch_candidate)) + var/turf/turf_to_launch = launch_candidate + toLaunch.turfs_in_cargo += turf_to_launch.type + else + var/atom/movable/movable_to_launch = launch_candidate + DuplicateObject(movable_to_launch).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod else if(launchRandomItem) - var/atom/movable/O = pick_n_take(launchList) - O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod + var/atom/random_item = pick_n_take(launchList) + if(!isnull(random_item)) + if (iswallturf(random_item)) + var/turf/wall = random_item + toLaunch.turfs_in_cargo += wall.type + wall.ScrapeAway() + else + var/atom/movable/random_item_movable = random_item + random_item_movable.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod else - for (var/atom/movable/O in launchList) //If we aren't cloning the objects, just go through the launchList - O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod - new /obj/effect/abstract/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location + for (var/thing_to_launch in launchList) //If we aren't cloning the objects, just go through the launchList + if (isnull(thing_to_launch)) + continue + if(iswallturf(thing_to_launch)) + var/turf/wall = thing_to_launch + toLaunch.turfs_in_cargo += wall.type + wall.ScrapeAway() + else + var/atom/movable/movable_to_launch = thing_to_launch + movable_to_launch.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod + new /obj/effect/pod_landingzone(target_turf, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location if (launchClone) launchCounter++ //We only need to increment launchCounter if we are cloning objects. //If we aren't cloning objects, taking and removing the first item each time from the acceptableTurfs list will inherently iterate through the list in order /datum/centcom_podlauncher/proc/updateSelector() //Ensures that the selector effect will showcase the next item if needed - if (launchChoice == 1 && length(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We only show the selector if we are taking items from the bay - var/index = launchCounter + 1 //launchCounter acts as an index to the ordered acceptableTurfs list, so adding one will show the next item in the list + if (launchChoice == LAUNCH_ORDERED && length(acceptableTurfs) > 1 && !temp_pod.reversing && !temp_pod.effectMissile) //We only show the selector if we are taking items from the bay + var/index = (launchCounter == 1 ? launchCounter : launchCounter + 1) //launchCounter acts as an index to the ordered acceptableTurfs list, so adding one will show the next item in the list. We don't want to do this for the very first item tho if (index > acceptableTurfs.len) //out of bounds check index = 1 selector.forceMove(acceptableTurfs[index]) //forceMove the selector to the next turf in the ordered acceptableTurfs list @@ -649,31 +768,106 @@ qdel(O) for (var/mob/M in bay.GetAllContents()) qdel(M) + for (var/bayturf in bay) + var/turf/turf_to_clear = bayturf + turf_to_clear.ChangeTurf(/turf/open/floor/plasteel) /datum/centcom_podlauncher/Destroy() //The Destroy() proc. This is called by ui_close proc, or whenever the user leaves the game - updateCursor(FALSE, FALSE) //Make sure our moues cursor resets to default. False means we are not in launch mode - qdel(temp_pod) //Delete the temp_pod - qdel(selector) //Delete the selector effect + updateCursor(TRUE) //Make sure our moues cursor resets to default. False means we are not in launch mode + QDEL_NULL(temp_pod) //Delete the temp_pod + QDEL_NULL(selector) //Delete the selector effect + QDEL_NULL(indicator) . = ..() -/datum/centcom_podlauncher/proc/supplypod_punish_log(var/list/whoDyin) +/datum/centcom_podlauncher/proc/supplypod_punish_log(list/whoDyin) var/podString = effectBurst ? "5 pods" : "a pod" var/whomString = "" if (LAZYLEN(whoDyin)) for (var/mob/living/M in whoDyin) whomString += "[key_name(M)], " - var/delayString = temp_pod.landingDelay == initial(temp_pod.landingDelay) ? "" : " Delay=[temp_pod.landingDelay*0.1]s" - var/damageString = temp_pod.damage == 0 ? "" : " Dmg=[temp_pod.damage]" - var/explosionString = "" - var/explosion_sum = temp_pod.explosionSize[1] + temp_pod.explosionSize[2] + temp_pod.explosionSize[3] + temp_pod.explosionSize[4] - if (explosion_sum != 0) - explosionString = " Boom=|" - for (var/X in temp_pod.explosionSize) - explosionString += "[X]|" - - var/msg = "launched [podString] towards [whomString] [delayString][damageString][explosionString]" + var/msg = "launched [podString] towards [whomString]" message_admins("[key_name_admin(usr)] [msg] in [ADMIN_VERBOSEJMP(specificTarget)].") if (length(whoDyin)) for (var/mob/living/M in whoDyin) admin_ticket_log(M, "[key_name_admin(usr)] [msg]") + +/datum/centcom_podlauncher/proc/loadData(var/list/dataToLoad) + bayNumber = dataToLoad["bayNumber"] + customDropoff = dataToLoad["customDropoff"] + renderLighting = dataToLoad["renderLighting"] + launchClone = dataToLoad["launchClone"] //Do we launch the actual items in the bay or just launch clones of them? + launchRandomItem = dataToLoad["launchRandomItem"] //Do we launch a single random item instead of everything on the turf? + launchChoice = dataToLoad["launchChoice"] //Launch turfs all at once (0), ordered (1), or randomly(1) + explosionChoice = dataToLoad["explosionChoice"] //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2) + damageChoice = dataToLoad["damageChoice"] //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2) + temp_pod.landingDelay = dataToLoad["delay_1"] //How long the pod takes to land after launching + temp_pod.fallDuration = dataToLoad["delay_2"] //How long the pod's falling animation lasts + temp_pod.openingDelay = dataToLoad["delay_3"] //How long the pod takes to open after landing + temp_pod.departureDelay = dataToLoad["delay_4"] //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom) + temp_pod.setStyle(dataToLoad["styleChoice"]) //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. + temp_pod.effectShrapnel = dataToLoad["effectShrapnel"] //If true, creates a cloud of shrapnel of a decided type and magnitude on landing + temp_pod.shrapnel_type = text2path(dataToLoad["shrapnelType"]) + temp_pod.shrapnel_magnitude = dataToLoad["shrapnelMagnitude"] + temp_pod.effectStun = dataToLoad["effectStun"]//If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! + temp_pod.effectLimb = dataToLoad["effectLimb"]//If true, pops off a limb (if applicable) from anyone caught under the pod when it lands + temp_pod.effectOrgans = dataToLoad["effectOrgans"]//If true, yeets the organs out of any bodies caught under the pod when it lands + temp_pod.bluespace = dataToLoad["effectBluespace"] //If true, the pod deletes (in a shower of sparks) after landing + temp_pod.effectStealth = dataToLoad["effectStealth"]//If true, a target icon isn't displayed on the turf where the pod will land + temp_pod.effectQuiet = dataToLoad["effectQuiet"] //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) + temp_pod.effectMissile = dataToLoad["effectMissile"] //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground + temp_pod.effectCircle = dataToLoad["effectCircle"] //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here + effectBurst = dataToLoad["effectBurst"] //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area + temp_pod.reversing = dataToLoad["effectReverse"] //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom + temp_pod.reverseOptionList = dataToLoad["reverseOptionList"] + specificTarget = dataToLoad["effectTarget"] //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites + temp_pod.adminNamed = dataToLoad["effectName"] //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) + temp_pod.name = dataToLoad["podName"] + temp_pod.desc = dataToLoad["podDesc"] + effectAnnounce = dataToLoad["effectAnnounce"] + numTurfs = dataToLoad["numObjects"] //Counts the number of turfs that contain a launchable object in the centcom supplypod bay + temp_pod.fallingSound = dataToLoad["fallingSound"]//Admin sound to play as the pod falls + temp_pod.landingSound = dataToLoad["landingSound"]//Admin sound to play when the pod lands + temp_pod.openingSound = dataToLoad["openingSound"]//Admin sound to play when the pod opens + temp_pod.leavingSound = dataToLoad["leavingSound"]//Admin sound to play when the pod leaves + temp_pod.soundVolume = dataToLoad["soundVolume"] //Admin sound to play when the pod leaves + picking_dropoff_turf = FALSE + launcherActivated = FALSE + updateCursor() + refreshView() + +GLOBAL_DATUM_INIT(podlauncher, /datum/centcom_podlauncher, new) +//Proc for admins to enable others to use podlauncher after roundend +/datum/centcom_podlauncher/proc/give_podlauncher(mob/living/user, override) + if (SSticker.current_state < GAME_STATE_FINISHED) + return + if (!istype(user)) + user = override + if (user) + setup(user)//setup the datum + +//Set the dropoff location and indicator to either a specific turf or somewhere in an area +/datum/centcom_podlauncher/proc/setDropoff(target) + var/turf/target_turf + if (isturf(target)) + target_turf = target + else if (isarea(target)) + target_turf = pick(get_area_turfs(target)) + else + CRASH("Improper type passed to setDropoff! Should be /turf or /area") + temp_pod.reverse_dropoff_coords = list(target_turf.x, target_turf.y, target_turf.z) + indicator.forceMove(target_turf) + +/obj/effect/hallucination/simple/supplypod_selector + name = "Supply Selector (Only you can see this)" + image_icon = 'icons/obj/supplypods_32x32.dmi' + image_state = "selector" + image_layer = FLY_LAYER + alpha = 150 + +/obj/effect/hallucination/simple/dropoff_location + name = "Dropoff Location (Only you can see this)" + image_icon = 'icons/obj/supplypods_32x32.dmi' + image_state = "dropoff_indicator" + image_layer = FLY_LAYER + alpha = 0 diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index f5a8d21278..5a976b0abb 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -179,6 +179,10 @@ if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly) return + if(self_paid && !pack.can_private_buy) + say("This cannot be bought privately.") + return + var/name = "*None Provided*" var/rank = "*None Provided*" var/ckey = usr.ckey diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 671c22bde5..12a5002ac7 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -60,6 +60,9 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) + if(ismecha(thing)) + var/obj/mecha/mech = thing + mech.wreckage = null // why a mech left a wreck when sold i will never know qdel(thing) return report diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm index 678948128f..8e93fc5fc3 100644 --- a/code/modules/cargo/exports/gear.dm +++ b/code/modules/cargo/exports/gear.dm @@ -473,7 +473,7 @@ //Soft Suits //Blanket -datum/export/gear/space/helmet +/datum/export/gear/space/helmet cost = 55 unit_name = "space helmet" export_types = list(/obj/item/clothing/head/helmet/space) @@ -485,7 +485,7 @@ datum/export/gear/space/helmet export_types = list(/obj/item/clothing/suit/space) include_subtypes = TRUE -datum/export/gear/space/helmet/plasma +/datum/export/gear/space/helmet/plasma cost = 100 unit_name = "plasmaman space helmet" export_types = list(/obj/item/clothing/suit/space/eva/plasmaman) @@ -495,7 +495,7 @@ datum/export/gear/space/helmet/plasma unit_name = "plasmaman space suit" export_types = list(/obj/item/clothing/suit/space/eva/plasmaman) -datum/export/gear/space/helmet/synda +/datum/export/gear/space/helmet/synda cost = 150 //Flash proof unit_name = "syndicate space helmet" export_types = list(/obj/item/clothing/head/helmet/space/syndicate) @@ -510,7 +510,7 @@ datum/export/gear/space/helmet/synda //Glasses //Blanket -datum/export/gear/glasses //glasses are not worth selling +/datum/export/gear/glasses //glasses are not worth selling cost = 3 unit_name = "glasses" export_types = list(/obj/item/clothing/glasses) diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index 675cbb2be0..e84d36d5dc 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -100,4 +100,4 @@ /datum/export/material/runite cost = 300 message = "cm3 of runite" - material_id = /datum/material/runite \ No newline at end of file + material_id = /datum/material/runite diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 4ca97a13a5..fdf2b9d673 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -190,7 +190,7 @@ LZ = pick(empty_turfs) if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call D.adjust_money(-SO.pack.cost) - new /obj/effect/abstract/DPtarget(LZ, podType, SO) + new /obj/effect/pod_landingzone(LZ, podType, SO) . = TRUE update_icon() else @@ -208,7 +208,7 @@ for(var/i in 1 to MAX_EMAG_ROCKETS) var/LZ = pick(empty_turfs) LAZYREMOVE(empty_turfs, LZ) - new /obj/effect/abstract/DPtarget(LZ, podType, SO) + new /obj/effect/pod_landingzone(LZ, podType, SO) . = TRUE update_icon() CHECK_TICK diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index be2db06346..70431d6447 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -42,7 +42,7 @@ set name = "Release Contents" set category = "Gondola" set desc = "Release any contents stored within your vast belly." - linked_pod.open(src, forced = TRUE) + linked_pod.open(src, TRUE) /mob/living/simple_animal/pet/gondola/gondolapod/examine(mob/user) ..() @@ -61,16 +61,16 @@ else to_chat(src, "A closer look inside yourself reveals... nothing.") -/mob/living/simple_animal/pet/gondola/gondolapod/proc/setOpened() +/mob/living/simple_animal/pet/gondola/gondolapod/setOpened() opened = TRUE update_icon() - addtimer(CALLBACK(src, .proc/setClosed), 50) + addtimer(CALLBACK(src, /atom.proc/setClosed), 50) -/mob/living/simple_animal/pet/gondola/gondolapod/proc/setClosed() +/mob/living/simple_animal/pet/gondola/gondolapod/setClosed() opened = FALSE update_icon() /mob/living/simple_animal/pet/gondola/gondolapod/death() qdel(linked_pod) //Will cause the open() proc for the linked supplypod to be called with the "broken" parameter set to true, meaning that it will dump its contents on death qdel(src) - ..() \ No newline at end of file + ..() diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 08f9a927c6..6a37ef80a9 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -318,7 +318,7 @@ /obj/item/clothing/under/suit/white, // white is a weird color for a groom but some people are weird /obj/item/clothing/under/suit/polychromic, /obj/item/clothing/under/suit/polychromic, // in case you can't be satisfied with the most fitting choices, of course. - /obj/item/clothing/under/dress/wedding, + /obj/item/clothing/under/dress/wedding, /obj/item/clothing/under/dress/wedding, // this is what you actually bought the crate for. You can't get these anywhere else. /obj/item/clothing/under/dress/wedding/orange, /obj/item/clothing/under/dress/wedding/orange, @@ -333,4 +333,22 @@ /obj/item/storage/fancy/ringbox/silver, /obj/item/storage/fancy/ringbox/silver) //diamond rings cost the same price as this crate via cargo so we're not giving you two for free. Wedding rings are traditionally less valuable anyway. crate_name = "wedding crate" - + +/datum/supply_pack/costumes_toys/randomised/tcg + name = "Big-Ass Booster Pack Pack" + desc = "A bumper load of NT TCG Booster Packs of varying series. Collect them all!" + cost = 3000 + contains = list() + crate_name = "booster pack pack" + +/datum/supply_pack/costumes_toys/randomised/tcg/generate() + . = ..() + var/list/cardtypes = subtypesof(/obj/item/cardpack) + for(var/cardtype in cardtypes) + var/obj/item/cardpack/pack = new cardtype(.) + if(pack.illegal) + cardtypes.Remove(cardtype) + qdel(pack) + for(var/i in 1 to 10) + var/cardpacktype = pick(cardtypes) + new cardpacktype(.) diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index ebfb96ec23..a0f11c2f3e 100644 --- a/code/modules/cargo/packs/livestock.dm +++ b/code/modules/cargo/packs/livestock.dm @@ -34,10 +34,57 @@ /datum/supply_pack/critter/parrot/generate() . = ..() - for(var/i in 1 to 4) - new /mob/living/simple_animal/parrot(.) - if(prob(1)) - new /mob/living/simple_animal/parrot/clock_hawk(.) + for(var/i in 1 to 5) + switch(rand(1, 24)) + if(1) + new /mob/living/simple_animal/parrot(.) + if(2) + new /mob/living/simple_animal/parrot/clock_hawk(.) + if(3) + new /mob/living/simple_animal/parrot/kea(.) + if(4) + new /mob/living/simple_animal/parrot/eclectus(.) + if(5) + new /mob/living/simple_animal/parrot/eclectusf(.) + if(6) + new /mob/living/simple_animal/parrot/greybird(.) + if(7) + new /mob/living/simple_animal/parrot/blue_caique(.) + if(8) + new /mob/living/simple_animal/parrot/white_caique(.) + if(9) + new /mob/living/simple_animal/parrot/green_budgerigar(.) + if(10) + new /mob/living/simple_animal/parrot/blue_Budgerigar(.) + if(11) + new /mob/living/simple_animal/parrot/bluegreen_Budgerigar(.) + if(12) + new /mob/living/simple_animal/parrot/commonblackbird(.) + if(13) + new /mob/living/simple_animal/parrot/azuretit(.) + if(14) + new /mob/living/simple_animal/parrot/europeanrobin(.) + if(15) + new /mob/living/simple_animal/parrot/goldcrest(.) + if(16) + new /mob/living/simple_animal/parrot/ringneckdove(.) + if(17) + new /mob/living/simple_animal/parrot/cockatiel(.) + if(18) + new /mob/living/simple_animal/parrot/white_cockatiel(.) + if(19) + new /mob/living/simple_animal/parrot/yellowish_cockatiel(.) + if(20) + new /mob/living/simple_animal/parrot/grey_cockatiel(.) + if(21) + new /mob/living/simple_animal/parrot/too(.) + if(22) + new /mob/living/simple_animal/parrot/hooded_too(.) + if(23) + new /mob/living/simple_animal/parrot/pink_too(.) + if(24) + new /mob/living/simple_animal/parrot/eclectusr(.) + /datum/supply_pack/critter/butterfly name = "Butterflies Crate" diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index 0cf12fbc5d..86c6b114f0 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -147,6 +147,14 @@ crate_name = "fuel tank crate" crate_type = /obj/structure/closet/crate/large +/datum/supply_pack/materials/hightankfuel + name = "Large Fuel Tank Crate" + desc = "Contains a high-capacity fuel tank. Keep contents away from open flame." + cost = 2000 + contains = list(/obj/structure/reagent_dispensers/fueltank/high) + crate_name = "high-capacity fuel tank crate" + crate_type = /obj/structure/closet/crate/large + /datum/supply_pack/materials/watertank name = "Water Tank Crate" desc = "Contains a tank of dihydrogen monoxide... sounds dangerous." diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 6a4165f840..58cae36015 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -90,6 +90,18 @@ crate_name = "medical hardsuit" crate_type = /obj/structure/closet/crate/secure/medical +/datum/supply_pack/medical/paramedicevasuit + name = "Paramedic EVA Suit" + desc = "Greytide pushing up daisies with the carp outside the station? Chemistry vented in a meth experiment gone wrong? Be the blue saviour this station desperately needs and get your Paramedical EVA suit today! Requires medical access to open." + cost = 1975 + access = ACCESS_MEDICAL + contains = list(/obj/item/tank/internals/emergency_oxygen, + /obj/item/clothing/head/helmet/space/eva/paramedic, + /obj/item/clothing/suit/space/eva/paramedic, + /obj/item/clothing/mask/breath) + crate_name = "paramedic EVA suit" + crate_type = /obj/structure/closet/crate/secure/medical + /datum/supply_pack/medical/supplies name = "Medical Supplies Crate" desc = "Contains seven beakers, syringes, and bodybags. Three morphine bottles, four insulin pills. Two charcoal bottles, epinephrine bottles, antitoxin bottles, and large beakers. Finally, a single roll of medical gauze, as well as a bottle of stimulant pills for long, hard work days. German doctor not included." diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index 0c7c63f867..2bb3934ac7 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -261,9 +261,9 @@ /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/mop, - /obj/item/caution, - /obj/item/caution, - /obj/item/caution, + /obj/item/clothing/suit/caution, + /obj/item/clothing/suit/caution, + /obj/item/clothing/suit/caution, /obj/item/storage/bag/trash, /obj/item/reagent_containers/spray/cleaner, /obj/item/reagent_containers/rag, diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index aaa1afb004..efac62c930 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -1,13 +1,12 @@ -//The "BDPtarget" temp visual is created by anything that "launches" a supplypod. It makes two things: a falling droppod animation, and the droppod itself. +//The "pod_landingzone" temp visual is created by anything that "launches" a supplypod. This is what animates the pod and makes the pod forcemove to the station. //------------------------------------SUPPLY POD-------------------------------------// /obj/structure/closet/supplypod name = "supply pod" //Names and descriptions are normally created with the setStyle() proc during initialization, but we have these default values here as a failsafe desc = "A Nanotrasen supply drop pod." icon = 'icons/obj/supplypods.dmi' - icon_state = "supplypod" - pixel_x = -16 //2x2 sprite - pixel_y = -5 - layer = TABLE_LAYER //So that the crate inside doesn't appear underneath + icon_state = "pod" //This is a common base sprite shared by a number of pods + pixel_x = SUPPLYPOD_X_OFFSET //2x2 sprite + layer = BELOW_OBJ_LAYER //So that the crate inside doesn't appear underneath allow_objects = TRUE allow_dense = TRUE delivery_icon = null @@ -16,6 +15,11 @@ anchored = TRUE //So it cant slide around after landing anchorable = FALSE flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + appearance_flags = KEEP_TOGETHER | PIXEL_SCALE + density = FALSE + ///List of bitflags for supply pods, see: code\__DEFINES\obj_flags.dm + var/pod_flags = NONE + //*****NOTE*****: Many of these comments are similarly described in centcom_podlauncher.dm. If you change them here, please consider doing so in the centcom podlauncher code as well! var/adminNamed = FALSE //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) var/bluespace = FALSE //If true, the pod deletes (in a shower of sparks) after landing @@ -27,12 +31,13 @@ var/effectLimb = FALSE //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands var/effectOrgans = FALSE //If true, yeets out every limb and organ from anyone caught under the pod when it lands var/effectGib = FALSE //If true, anyone under the pod will be gibbed when it lands - var/effectStealth = FALSE //If true, a target icon isnt displayed on the turf where the pod will land + var/effectStealth = FALSE //If true, a target icon isn't displayed on the turf where the pod will land var/effectQuiet = FALSE //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) var/effectMissile = FALSE //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground var/effectCircle = FALSE //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here - var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. + var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. var/reversing = FALSE //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom + var/list/reverse_dropoff_coords //Turf that the reverse pod will drop off it's newly-acquired cargo to var/fallDuration = 4 var/fallingSoundLength = 11 var/fallingSound = 'sound/weapons/mortar_long_whistle.ogg'//Admin sound to play before the pod lands @@ -40,10 +45,20 @@ var/openingSound //Admin sound to play when the pod opens var/leavingSound //Admin sound to play when the pod leaves var/soundVolume = 80 //Volume to play sounds at. Ignores the cap - var/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. var/list/explosionSize = list(0,0,2,3) var/stay_after_drop = FALSE - var/specialised = TRUE // It's not a general use pod for cargo/admin use + var/specialised = FALSE // It's not a general use pod for cargo/admin use + var/rubble_type //Rubble effect associated with this supplypod + var/decal = "default" //What kind of extra decals we add to the pod to make it look nice + var/door = "pod_door" + var/fin_mask = "topfin" + var/obj/effect/supplypod_rubble/rubble + var/obj/effect/engineglow/glow_effect + var/effectShrapnel = FALSE + var/shrapnel_type = /obj/item/projectile/bullet/shrapnel + var/shrapnel_magnitude = 3 + var/list/reverseOptionList = list("Mobs"=FALSE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE) + var/list/turfs_in_cargo = list() /obj/structure/closet/supplypod/bluespacepod style = STYLE_BLUESPACE @@ -53,12 +68,12 @@ /obj/structure/closet/supplypod/extractionpod name = "Syndicate Extraction Pod" - desc = "A specalised, blood-red styled pod for extracting high-value targets out of active mission areas." + desc = "A specalised, blood-red styled pod for extracting high-value targets out of active mission areas. Targets must be manually stuffed inside the pod for proper delivery." specialised = TRUE style = STYLE_SYNDICATE bluespace = TRUE explosionSize = list(0,0,1,2) - landingDelay = 25 //Slightly longer than others + landingDelay = 25 //Longer than others /obj/structure/closet/supplypod/centcompod style = STYLE_CENTCOM @@ -67,36 +82,102 @@ landingDelay = 20 //Very speedy! resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF -/obj/structure/closet/supplypod/proc/specialisedPod() - return 1 - -/obj/structure/closet/supplypod/extractionpod/specialisedPod(atom/movable/holder) - holder.forceMove(pick(GLOB.holdingfacility)) // land in ninja jail - open(holder, forced = TRUE) - -/obj/structure/closet/supplypod/Initialize() +/obj/structure/closet/supplypod/Initialize(var/customStyle = FALSE) . = ..() - setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly + if (!loc) + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] //temporary holder for supplypods mid-transit + forceMove(shippingLane) + if (customStyle) + style = customStyle + setStyle(style) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly + +/obj/structure/closet/supplypod/extractionpod/Initialize() + . = ..() + var/turf/picked_turf = pick(GLOB.holdingfacility) + reverse_dropoff_coords = list(picked_turf.x, picked_turf.y, picked_turf.z) + +/obj/structure/closet/supplypod/proc/setStyle(chosenStyle) //Used to give the sprite an icon state, name, and description. + style = chosenStyle + var/base = GLOB.podstyles[chosenStyle][POD_BASE] //GLOB.podstyles is a 2D array we treat as a dictionary. The style represents the verticle index, with the icon state, name, and desc being stored in the horizontal indexes of the 2D array. + icon_state = base + decal = GLOB.podstyles[chosenStyle][POD_DECAL] + rubble_type = GLOB.podstyles[chosenStyle][POD_RUBBLE_TYPE] + if (!adminNamed && !specialised) //We dont want to name it ourselves if it has been specifically named by an admin using the centcom_podlauncher datum + name = GLOB.podstyles[chosenStyle][POD_NAME] + desc = GLOB.podstyles[chosenStyle][POD_DESC] + if (GLOB.podstyles[chosenStyle][POD_DOOR]) + door = "[base]_door" + else + door = FALSE + update_icon() + +/obj/structure/closet/supplypod/proc/SetReverseIcon() + fin_mask = "bottomfin" + if (GLOB.podstyles[style][POD_SHAPE] == POD_SHAPE_NORML) + icon_state = GLOB.podstyles[style][POD_BASE] + "_reverse" + pixel_x = initial(pixel_x) + transform = matrix() + update_icon() + +/obj/structure/closet/supplypod/proc/backToNonReverseIcon() + fin_mask = initial(fin_mask) + if (GLOB.podstyles[style][POD_SHAPE] == POD_SHAPE_NORML) + icon_state = GLOB.podstyles[style][POD_BASE] + pixel_x = initial(pixel_x) + transform = matrix() + update_icon() /obj/structure/closet/supplypod/closet_update_overlays(list/new_overlays) - . = new_overlays - if (style == STYLE_SEETHROUGH || style == STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays - return - if (opened) - . += "[icon_state]_open" - else - . += "[icon_state]_door" + return -/obj/structure/closet/supplypod/proc/setStyle(chosenStyle, var/duringInit = FALSE) //Used to give the sprite an icon state, name, and description - if (!duringInit && style == chosenStyle) //Check if the input style is already the same as the pod's style. This happens in centcom_podlauncher, and as such we set the style to STYLE_CENTCOM. - setStyle(STYLE_CENTCOM) //We make sure to not check this during initialize() so the standard supplypod works correctly. +/obj/structure/closet/supplypod/update_overlays() + . = ..() + if (style == STYLE_INVISIBLE) return - style = chosenStyle - icon_state = POD_STYLES[chosenStyle][POD_ICON_STATE] //POD_STYLES is a 2D array we treat as a dictionary. The style represents the verticle index, with the icon state, name, and desc being stored in the horizontal indexes of the 2D array. - if (!adminNamed && !specialised) //We dont want to name it ourselves if it has been specifically named by an admin using the centcom_podlauncher datum - name = POD_STYLES[chosenStyle][POD_NAME] - desc = POD_STYLES[chosenStyle][POD_DESC] - update_icon() + if (rubble) + . += rubble.getForeground(src) + if (style == STYLE_SEETHROUGH) + for (var/atom/A in contents) + var/mutable_appearance/itemIcon = new(A) + itemIcon.transform = matrix().Translate(-1 * SUPPLYPOD_X_OFFSET, 0) + . += itemIcon + for (var/t in turfs_in_cargo)//T is just a turf's type + var/turf/turf_type = t + var/mutable_appearance/itemIcon = mutable_appearance(initial(turf_type.icon), initial(turf_type.icon_state)) + itemIcon.transform = matrix().Translate(-1 * SUPPLYPOD_X_OFFSET, 0) + . += itemIcon + return + + if (opened) //We're opened means all we have to worry about is masking a decal if we have one + if (!decal) //We don't have a decal to mask + return + if (!door) //We have a decal but no door, so let's just add the decal + . += decal + return + var/icon/masked_decal = new(icon, decal) //The decal we want to apply + var/icon/door_masker = new(icon, door) //The door shape we want to 'cut out' of the decal + door_masker.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 1,1,1,0, 0,0,0,1) + door_masker.SwapColor("#ffffffff", null) + door_masker.Blend("#000000", ICON_SUBTRACT) + masked_decal.Blend(door_masker, ICON_ADD) + . += masked_decal + else //If we're closed + if (!door) //We have no door, lets see if we have a decal. If not, theres nothing we need to do + if (decal) + . += decal + return + else if (GLOB.podstyles[style][POD_SHAPE] != POD_SHAPE_NORML) //If we're not a normal pod shape (aka, if we don't have fins), just add the door without masking + . += door + else + var/icon/masked_door = new(icon, door) //The door we want to apply + var/icon/fin_masker = new(icon, "mask_[fin_mask]") //The fin shape we want to 'cut out' of the door + fin_masker.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 1,1,1,0, 0,0,0,1) + fin_masker.SwapColor("#ffffffff", null) + fin_masker.Blend("#000000", ICON_SUBTRACT) + masked_door.Blend(fin_masker, ICON_ADD) + . += masked_door + if (decal) + . += decal /obj/structure/closet/supplypod/tool_interact(obj/item/W, mob/user) if(bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways. @@ -110,187 +191,380 @@ /obj/structure/closet/supplypod/contents_explosion() //Supplypods also protect their contents from the harmful effects of fucking exploding. return -/obj/structure/closet/supplypod/toggle(mob/living/user) //Supplypods shouldn't be able to be manually opened under any circumstances, as the open() proc generates supply order datums +/obj/structure/closet/supplypod/toggle(mob/living/user) return -/obj/structure/closet/supplypod/proc/handleReturningClose(atom/movable/holder, returntobay) - opened = FALSE - INVOKE_ASYNC(holder, .proc/setClosed) //Use the INVOKE_ASYNC proc to call setClosed() on whatever the holder may be, without giving the atom/movable base class a setClosed() proc definition - for(var/atom/movable/O in get_turf(holder)) - if ((ismob(O) && !isliving(O)) || (is_type_in_typecache(O, GLOB.blacklisted_cargo_types) && !isliving(O))) //We dont want to take ghosts with us, and we don't want blacklisted items going, but we allow mobs. - continue - O.forceMove(holder) //Put objects inside before we close - var/obj/effect/temp_visual/risingPod = new /obj/effect/abstract/DPfall(get_turf(holder), src) //Make a nice animation of flying back up - risingPod.pixel_z = 0 //The initial value of risingPod's pixel_z is 200 because it normally comes down from a high spot - animate(risingPod, pixel_z = 200, time = 10, easing = LINEAR_EASING) //Animate our rising pod - if(returntobay) - holder.forceMove(bay) //Move the pod back to centcom, where it belongs - QDEL_IN(risingPod, 10) - reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() ) - bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever - open(holder, forced = TRUE) - else - reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() ) - bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever - QDEL_IN(risingPod, 10) - audible_message("The pod hisses, closing quickly and launching itself away from the station.", "The ground vibrates, the nearby pod launching away from the station.") - stay_after_drop = FALSE - specialisedPod(holder) // Do special actions for specialised pods - this is likely if we were already doing manual launches +/obj/structure/closet/supplypod/open(mob/living/user, force = TRUE) + return -/obj/structure/closet/supplypod/proc/preOpen() //Called before the open() proc. Handles anything that occurs right as the pod lands. - var/turf/T = get_turf(src) +/obj/structure/closet/supplypod/proc/handleReturnAfterDeparting(atom/movable/holder = src) + reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open_pod() ) + bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever + pod_flags &= ~FIRST_SOUNDS //Make it so we play sounds now + if (!effectQuiet && style != STYLE_SEETHROUGH) + audible_message("The pod hisses, closing and launching itself away from the station.", "The ground vibrates, and you hear the sound of engines firing.") + stay_after_drop = FALSE + holder.pixel_z = initial(holder.pixel_z) + holder.alpha = initial(holder.alpha) + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] + forceMove(shippingLane) //Move to the centcom-z-level until the pod_landingzone says we can drop back down again + if (!reverse_dropoff_coords) //If we're centcom-launched, the reverse dropoff turf will be a centcom loading bay. If we're an extraction pod, it should be the ninja jail. Thus, this shouldn't ever really happen. + var/obj/error_landmark = locate(/obj/effect/landmark/error) in GLOB.landmarks_list + var/turf/error_landmark_turf = get_turf(error_landmark) + reverse_dropoff_coords = list(error_landmark_turf.x, error_landmark_turf.y, error_landmark_turf.z) + landingDelay = initial(landingDelay) //Reset the landing timers so we land on whatever turf we're aiming at normally. Will be changed to be editable later (tm) + fallDuration = initial(fallDuration) //This is so if someone adds a really long dramatic landing time they don't have to sit through it twice on the pod's return trip + openingDelay = initial(openingDelay) + backToNonReverseIcon() + var/turf/return_turf = locate(reverse_dropoff_coords[1], reverse_dropoff_coords[2], reverse_dropoff_coords[3]) + new /obj/effect/pod_landingzone(return_turf, src) + +/obj/structure/closet/supplypod/proc/preOpen() //Called before the open_pod() proc. Handles anything that occurs right as the pod lands. + var/turf/turf_underneath = get_turf(src) var/list/B = explosionSize //Mostly because B is more readable than explosionSize :p - if (landingSound) - playsound(get_turf(src), landingSound, soundVolume, 0, 0) - for (var/mob/living/M in T) - if (effectLimb && iscarbon(M)) //If effectLimb is true (which means we pop limbs off when we hit people): - var/mob/living/carbon/CM = M - for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands - if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! - if (bodypart.dismemberable) - bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! - break - if (effectOrgans && iscarbon(M)) //effectOrgans means remove every organ in our mob - var/mob/living/carbon/CM = M - for(var/X in CM.internal_organs) - var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) //Pick a random direction to toss them in - var/obj/item/organ/O = X - O.Remove() //Note that this isn't the same proc as for lists - O.forceMove(T) //Move the organ outta the body - O.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away - sleep(1) - for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands - var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) - if (bodypart.dismemberable) - bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half! - bodypart.throw_at(destination, 2, 3) + density = TRUE //Density is originally false so the pod doesn't block anything while it's still falling through the air + AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_magnitude) + if(effectShrapnel) + SEND_SIGNAL(src, COMSIG_SUPPLYPOD_LANDED) + for (var/mob/living/target_living in turf_underneath) + if (iscarbon(target_living)) //If effectLimb is true (which means we pop limbs off when we hit people): + if (effectLimb) + var/mob/living/carbon/carbon_target_mob = target_living + for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands + var/obj/item/bodypart/bodypart = bp + if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! + if (bodypart.dismemberable) + bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! + break + if (effectOrgans) //effectOrgans means remove every organ in our mob + var/mob/living/carbon/carbon_target_mob = target_living + for(var/organ in carbon_target_mob.internal_organs) + var/destination = get_edge_target_turf(turf_underneath, pick(GLOB.alldirs)) //Pick a random direction to toss them in + var/obj/item/organ/organ_to_yeet = organ + organ_to_yeet.Remove(carbon_target_mob) //Note that this isn't the same proc as for lists + organ_to_yeet.forceMove(turf_underneath) //Move the organ outta the body + organ_to_yeet.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away sleep(1) + for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands + var/obj/item/bodypart/bodypart = bp + var/destination = get_edge_target_turf(turf_underneath, pick(GLOB.alldirs)) + if (bodypart.dismemberable) + bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half! + bodypart.throw_at(destination, 2, 3) + sleep(1) if (effectGib) //effectGib is on, that means whatever's underneath us better be fucking oof'd on - M.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) - M.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs + target_living.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) + if (!QDELETED(target_living)) + target_living.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs else - M.adjustBruteLoss(damage) + target_living.adjustBruteLoss(damage) var/explosion_sum = B[1] + B[2] + B[3] + B[4] if (explosion_sum != 0) //If the explosion list isn't all zeroes, call an explosion - explosion(get_turf(src), B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing - else if (!effectQuiet) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true) - playsound(src, "explosion", landingSound ? 15 : 80, 1) + explosion(turf_underneath, B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing + else if (!effectQuiet && !(pod_flags & FIRST_SOUNDS)) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true) + playsound(src, "explosion", landingSound ? soundVolume * 0.25 : soundVolume, TRUE) + if (landingSound) + playsound(turf_underneath, landingSound, soundVolume, FALSE, FALSE) if (effectMissile) //If we are acting like a missile, then right after we land and finish fucking shit up w explosions, we should delete opened = TRUE //We set opened to TRUE to avoid spending time trying to open (due to being deleted) during the Destroy() proc qdel(src) + return if (style == STYLE_GONDOLA) //Checks if we are supposed to be a gondola pod. If so, create a gondolapod mob, and move this pod to nullspace. I'd like to give a shout out, to my man oranges - var/mob/living/simple_animal/pet/gondola/gondolapod/benis = new(get_turf(src), src) + var/mob/living/simple_animal/pet/gondola/gondolapod/benis = new(turf_underneath, src) benis.contents |= contents //Move the contents of this supplypod into the gondolapod mob. moveToNullspace() - addtimer(CALLBACK(src, .proc/open, benis), openingDelay) //After the openingDelay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob + addtimer(CALLBACK(src, .proc/open_pod, benis), openingDelay) //After the openingDelay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob + else if (style == STYLE_SEETHROUGH) + open_pod(src) else - addtimer(CALLBACK(src, .proc/open, src), openingDelay) //After the openingDelay passes, we use the open proc from this supplypod, while referencing this supplypod's contents + addtimer(CALLBACK(src, .proc/open_pod, src), openingDelay) //After the openingDelay passes, we use the open proc from this supplypod, while referencing this supplypod's contents -/obj/structure/closet/supplypod/open(atom/movable/holder, var/broken = FALSE, var/forced = FALSE) //The holder var represents an atom whose contents we will be working with - var/turf/T = get_turf(holder) //Get the turf of whoever's contents we're talking about +/obj/structure/closet/supplypod/proc/open_pod(atom/movable/holder, broken = FALSE, forced = FALSE) //The holder var represents an atom whose contents we will be working with if (!holder) return - if(opened) + if (opened) //This is to ensure we don't open something that has already been opened return - opened = TRUE //This is to ensure we don't open something that has already been opened - var/mob/M + holder.setOpened() + var/turf/turf_underneath = get_turf(holder) //Get the turf of whoever's contents we're talking about if (istype(holder, /mob)) //Allows mobs to assume the role of the holder, meaning we look at the mob's contents rather than the supplypod's contents. Typically by this point the supplypod's contents have already been moved over to the mob's contents - M = holder - if (M.key && !forced && !broken) //If we are player controlled, then we shouldnt open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter) + var/mob/holder_as_mob = holder + if (holder_as_mob.key && !forced && !broken) //If we are player controlled, then we shouldn't open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter) return if (openingSound) - playsound(get_turf(holder), openingSound, soundVolume, 0, 0) //Special admin sound to play - INVOKE_ASYNC(holder, .proc/setOpened) //Use the INVOKE_ASYNC proc to call setOpened() on whatever the holder may be, without giving the atom/movable base class a setOpened() proc definition - if (style == STYLE_SEETHROUGH) - update_icon() - for (var/atom/movable/O in holder.contents) //Go through the contents of the holder - O.forceMove(T) //move everything from the contents of the holder to the turf of the holder - if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH) //If we aren't being quiet, play the default pod open sound - playsound(get_turf(holder), open_sound, 15, 1, -3) + playsound(get_turf(holder), openingSound, soundVolume, FALSE, FALSE) //Special admin sound to play + for (var/turf_type in turfs_in_cargo) + turf_underneath.PlaceOnTop(turf_type) + for (var/cargo in contents) + var/atom/movable/movable_cargo = cargo + movable_cargo.forceMove(turf_underneath) + if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH && !(pod_flags & FIRST_SOUNDS)) //If we aren't being quiet, play the default pod open sound + playsound(get_turf(holder), open_sound, 15, TRUE, -3) if (broken) //If the pod is opening because it's been destroyed, we end here return if (style == STYLE_SEETHROUGH) - depart(src) + startExitSequence(src) else + if (reversing) + addtimer(CALLBACK(src, .proc/SetReverseIcon), departureDelay/2) //Finish up the pod's duties after a certain amount of time if(!stay_after_drop) // Departing should be handled manually - addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time + addtimer(CALLBACK(src, .proc/startExitSequence, holder), departureDelay*(4/5)) //Finish up the pod's duties after a certain amount of time -/obj/structure/closet/supplypod/proc/depart(atom/movable/holder) +/obj/structure/closet/supplypod/proc/startExitSequence(atom/movable/holder) if (leavingSound) - playsound(get_turf(holder), leavingSound, soundVolume, 0, 0) + playsound(get_turf(holder), leavingSound, soundVolume, FALSE, FALSE) if (reversing) //If we're reversing, we call the close proc. This sends the pod back up to centcom close(holder) else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a seperate holder exists) + deleteRubble() if (!effectQuiet && style != STYLE_INVISIBLE && style != STYLE_SEETHROUGH) do_sparks(5, TRUE, holder) //Create some sparks right before closing qdel(src) //Delete ourselves and the holder if (holder != src) qdel(holder) -/obj/structure/closet/supplypod/centcompod/close(atom/movable/holder) //Closes the supplypod and sends it back to centcom. Should only ever be called if the "reversing" variable is true - handleReturningClose(holder, TRUE) +/obj/structure/closet/supplypod/close(atom/movable/holder) //Closes the supplypod and sends it back to centcom. Should only ever be called if the "reversing" variable is true + if (!holder) + return + take_contents(holder) + playsound(holder, close_sound, soundVolume*0.75, TRUE, -3) + holder.setClosed() + addtimer(CALLBACK(src, .proc/preReturn, holder), departureDelay * 0.2) //Start to leave a bit after closing for cinematic effect -/obj/structure/closet/supplypod/extractionpod/close(atom/movable/holder) //handles closing, and returns pod - deletes itself when returned - . = ..() - return +/obj/structure/closet/supplypod/take_contents(atom/movable/holder) + var/turf/turf_underneath = holder.drop_location() + for(var/atom_to_check in turf_underneath) + if(atom_to_check != src && !insert(atom_to_check, holder)) // Can't insert that + continue + insert(turf_underneath, holder) -/obj/structure/closet/supplypod/extractionpod/proc/send_up(atom/movable/holder) - if(!holder) - holder = src - if(leavingSound) - playsound(get_turf(holder), leavingSound, soundVolume, 0, 0) - handleReturningClose(holder, FALSE) +/obj/structure/closet/supplypod/insert(atom/to_insert, atom/movable/holder) + if(insertion_allowed(to_insert)) + if(isturf(to_insert)) + var/turf/turf_to_insert = to_insert + turfs_in_cargo += turf_to_insert.type + turf_to_insert.ScrapeAway() + else + var/atom/movable/movable_to_insert = to_insert + movable_to_insert.forceMove(holder) + return TRUE + else + return FALSE -/obj/structure/closet/supplypod/proc/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open() proc for more details +/obj/structure/closet/supplypod/insertion_allowed(atom/to_insert) + if(to_insert.invisibility == INVISIBILITY_ABSTRACT) + return FALSE + if(ismob(to_insert)) + if(!reverseOptionList["Mobs"]) + return FALSE + if(!isliving(to_insert)) //let's not put ghosts or camera mobs inside + return FALSE + var/mob/living/mob_to_insert = to_insert + if(mob_to_insert.anchored || mob_to_insert.incorporeal_move) + return FALSE + mob_to_insert.stop_pulling() + + else if(isobj(to_insert)) + var/obj/obj_to_insert = to_insert + if(istype(obj_to_insert, /obj/structure/closet/supplypod)) + return FALSE + if(istype(obj_to_insert, /obj/effect/supplypod_smoke)) + return FALSE + if(istype(obj_to_insert, /obj/effect/pod_landingzone)) + return FALSE + if(istype(obj_to_insert, /obj/effect/supplypod_rubble)) + return FALSE + if(obj_to_insert.level == 1) + return FALSE // underfloor, until we get hide components. +/* + if((obj_to_insert.comp_lookup && obj_to_insert.comp_lookup[COMSIG_OBJ_HIDE]) && reverseOptionList["Underfloor"]) + return TRUE + else if ((obj_to_insert.comp_lookup && obj_to_insert.comp_lookup[COMSIG_OBJ_HIDE]) && !reverseOptionList["Underfloor"]) + return FALSE +*/ + if(isProbablyWallMounted(obj_to_insert) && reverseOptionList["Wallmounted"]) + return TRUE + else if (isProbablyWallMounted(obj_to_insert) && !reverseOptionList["Wallmounted"]) + return FALSE + if(!obj_to_insert.anchored && reverseOptionList["Unanchored"]) + return TRUE + if(obj_to_insert.anchored && reverseOptionList["Anchored"]) + return TRUE + return FALSE + + else if (isturf(to_insert)) + if(isfloorturf(to_insert) && reverseOptionList["Floors"]) + return TRUE + if(isfloorturf(to_insert) && !reverseOptionList["Floors"]) + return FALSE + if(isclosedturf(to_insert) && reverseOptionList["Walls"]) + return TRUE + if(isclosedturf(to_insert) && !reverseOptionList["Walls"]) + return FALSE + return FALSE + return TRUE + +/obj/structure/closet/supplypod/proc/preReturn(atom/movable/holder) + deleteRubble() + animate(holder, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) + animate(holder, pixel_z = 400, time = 10, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) //Animate our rising pod + addtimer(CALLBACK(src, .proc/handleReturnAfterDeparting, holder), 15) //Finish up the pod's duties after a certain amount of time + +/obj/structure/closet/supplypod/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open_pod() proc for more details + opened = TRUE + density = FALSE update_icon() -/obj/structure/closet/supplypod/proc/setClosed() //Ditto +/obj/structure/closet/supplypod/extractionpod/setOpened() + opened = TRUE + density = TRUE update_icon() +/obj/structure/closet/supplypod/setClosed() //Ditto + opened = FALSE + density = TRUE + update_icon() + +/obj/structure/closet/supplypod/proc/tryMakeRubble(turf/T) //Ditto + if (rubble_type == RUBBLE_NONE) + return + if (rubble) + return + if (effectMissile) + return + if (isspaceturf(T) || isclosedturf(T)) + return + rubble = new /obj/effect/supplypod_rubble(T) + rubble.setStyle(rubble_type, src) + update_icon() + +/obj/structure/closet/supplypod/Moved() + deleteRubble() + return ..() + +/obj/structure/closet/supplypod/proc/deleteRubble() + rubble?.fadeAway() + rubble = null + update_icon() + +/obj/structure/closet/supplypod/proc/addGlow() + if (GLOB.podstyles[style][POD_SHAPE] != POD_SHAPE_NORML) + return + glow_effect = new(src) + glow_effect.icon_state = "pod_glow_" + GLOB.podstyles[style][POD_GLOW] + vis_contents += glow_effect + glow_effect.layer = GASFIRE_LAYER + +/obj/structure/closet/supplypod/proc/endGlow() + if(!glow_effect) + return + glow_effect.layer = LOW_ITEM_LAYER + glow_effect.fadeAway(openingDelay) + /obj/structure/closet/supplypod/Destroy() - open(src, broken = TRUE) //Lets dump our contents by opening up - . = ..() - -//------------------------------------FALLING SUPPLY POD-------------------------------------// -/obj/effect/abstract/DPfall //Falling pod - name = "" - icon = 'icons/obj/supplypods.dmi' - pixel_x = -16 - pixel_y = -5 - pixel_z = 200 - desc = "Get out of the way!" - layer = FLY_LAYER//that wasnt flying, that was falling with style! - icon_state = "" - -/obj/effect/abstract/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod) - if (pod.style == STYLE_SEETHROUGH) - pixel_x = -16 - pixel_y = 0 - for (var/atom/movable/O in pod.contents) - var/icon/I = getFlatIcon(O) //im so sorry - add_overlay(I) - else if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible - icon_state = "[pod.icon_state]_falling" - name = pod.name - . = ..() + deleteRubble() + open_pod(src, broken = TRUE) //Lets dump our contents by opening up + return ..() //------------------------------------TEMPORARY_VISUAL-------------------------------------// -/obj/effect/abstract/DPtarget //This is the object that forceMoves the supplypod to it's location +/obj/effect/supplypod_smoke //Falling pod smoke + name = "" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "smoke" + desc = "" + layer = PROJECTILE_HIT_THRESHHOLD_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 0 + +/obj/effect/engineglow //Falling pod smoke + name = "" + icon = 'icons/obj/supplypods.dmi' + icon_state = "pod_engineglow" + desc = "" + layer = GASFIRE_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 255 + +/obj/effect/engineglow/proc/fadeAway(leaveTime) + var/duration = min(leaveTime, 25) + animate(src, alpha=0, time = duration) + QDEL_IN(src, duration + 5) + +/obj/effect/supplypod_smoke/proc/drawSelf(amount) + alpha = max(0, 255-(amount*20)) + +/obj/effect/supplypod_rubble //This is the object that forceMoves the supplypod to it's location + name = "Debris" + desc = "A small crater of rubble. Closer inspection reveals the debris to be made primarily of space-grade metal fragments. You're pretty sure that this will disperse before too long." + icon = 'icons/obj/supplypods.dmi' + layer = PROJECTILE_HIT_THRESHHOLD_LAYER // We want this to go right below the layer of supplypods and supplypod_rubble's forground. + icon_state = "rubble_bg" + anchored = TRUE + pixel_x = SUPPLYPOD_X_OFFSET + var/foreground = "rubble_fg" + var/verticle_offset = 0 + +/obj/effect/supplypod_rubble/proc/getForeground(obj/structure/closet/supplypod/pod) + var/mutable_appearance/rubble_overlay = mutable_appearance('icons/obj/supplypods.dmi', foreground) + rubble_overlay.appearance_flags = KEEP_APART|RESET_TRANSFORM + rubble_overlay.transform = matrix().Translate(SUPPLYPOD_X_OFFSET - pod.pixel_x, verticle_offset) + return rubble_overlay + +/obj/effect/supplypod_rubble/proc/fadeAway() + animate(src, alpha=0, time = 30) + QDEL_IN(src, 35) + +/obj/effect/supplypod_rubble/proc/setStyle(type, obj/structure/closet/supplypod/pod) + if (type == RUBBLE_WIDE) + icon_state += "_wide" + foreground += "_wide" + if (type == RUBBLE_THIN) + icon_state += "_thin" + foreground += "_thin" + if (pod.style == STYLE_BOX) + verticle_offset = -2 + else + verticle_offset = initial(verticle_offset) + + pixel_y = verticle_offset + +/obj/effect/pod_landingzone_effect + name = "" + desc = "" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "LZ_Slider" + layer = PROJECTILE_HIT_THRESHHOLD_LAYER + +/obj/effect/pod_landingzone_effect/Initialize(mapload, obj/structure/closet/supplypod/pod) + transform = matrix() * 1.5 + animate(src, transform = matrix()*0.01, time = pod.landingDelay+pod.fallDuration) + ..() + +/obj/effect/pod_landingzone //This is the object that forceMoves the supplypod to it's location name = "Landing Zone Indicator" desc = "A holographic projection designating the landing zone of something. It's probably best to stand back." - icon = 'icons/mob/actions/actions_items.dmi' - icon_state = "sniper_zoom" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "LZ" layer = PROJECTILE_HIT_THRESHHOLD_LAYER light_range = 2 - var/obj/effect/temp_visual/fallingPod //Temporary "falling pod" that we animate - var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this target + anchored = TRUE + alpha = 0 + var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this pod_landingzone + var/obj/effect/pod_landingzone_effect/helper + var/list/smoke_effects = new /list(13) -/obj/effect/abstract/DPtarget/Initialize(mapload, podParam, single_order = null) +/obj/effect/ex_act() + return + +/obj/effect/pod_landingzone/Initialize(mapload, podParam, single_order = null, clientman) . = ..() if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does) podParam = new podParam() //If its just a path, instantiate it pod = podParam + if (!pod.effectStealth) + helper = new (drop_location(), pod) + alpha = 255 + animate(src, transform = matrix().Turn(90), time = pod.landingDelay+pod.fallDuration) if (single_order) if (istype(single_order, /datum/supply_order)) var/datum/supply_order/SO = single_order @@ -298,49 +572,76 @@ else if (istype(single_order, /atom/movable)) var/atom/movable/O = single_order O.forceMove(pod) - for (var/mob/living/M in pod) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace) - M.forceMove(src) - if(pod.effectStun) //If effectStun is true, stun any mobs caught on this target until the pod gets a chance to hit them - for (var/mob/living/M in get_turf(src)) - M.Stun(pod.landingDelay+10, ignore_canstun = TRUE)//you aint goin nowhere, kid. - if (pod.effectStealth) //If effectStealth is true we want to be invisible - icon_state = "" + for (var/mob/living/mob_in_pod in pod) //If there are any mobs in the supplypod, we want to set their view to the pod_landingzone. This is so that they can see where they are about to land + mob_in_pod.reset_perspective(src) + if(pod.effectStun) //If effectStun is true, stun any mobs caught on this pod_landingzone until the pod gets a chance to hit them + for (var/mob/living/target_living in get_turf(src)) + target_living.Stun(pod.landingDelay+10, ignore_canstun = TRUE)//you ain't goin nowhere, kid. if (pod.fallDuration == initial(pod.fallDuration) && pod.landingDelay + pod.fallDuration < pod.fallingSoundLength) pod.fallingSoundLength = 3 //The default falling sound is a little long, so if the landing time is shorter than the default falling sound, use a special, shorter default falling sound pod.fallingSound = 'sound/weapons/mortar_whistle.ogg' var/soundStartTime = pod.landingDelay - pod.fallingSoundLength + pod.fallDuration if (soundStartTime < 0) soundStartTime = 1 - if (!pod.effectQuiet) + if (!pod.effectQuiet && !(pod.pod_flags & FIRST_SOUNDS)) addtimer(CALLBACK(src, .proc/playFallingSound), soundStartTime) addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.landingDelay) -/obj/effect/abstract/DPtarget/proc/playFallingSound() - playsound(src, pod.fallingSound, pod.soundVolume, 1, 6) +/obj/effect/pod_landingzone/proc/playFallingSound() + playsound(src, pod.fallingSound, pod.soundVolume, TRUE, 6) -/obj/effect/abstract/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle - fallingPod = new /obj/effect/abstract/DPfall(drop_location(), pod) - var/matrix/M = matrix(fallingPod.transform) //Create a new matrix that we can rotate +/obj/effect/pod_landingzone/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle + pod.addGlow() + pod.update_icon() + if (pod.style != STYLE_INVISIBLE) + pod.add_filter("motionblur",1,list("type"="motion_blur", "x"=0, "y"=3)) + pod.forceMove(drop_location()) + for (var/mob/living/M in pod) //Remember earlier (initialization) when we moved mobs into the pod_landingzone so they wouldnt get lost in nullspace? Time to get them out + M.reset_perspective(null) var/angle = effectCircle ? rand(0,360) : rand(70,110) //The angle that we can come in from - fallingPod.pixel_x = cos(angle)*400 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target - fallingPod.pixel_z = sin(angle)*400 - var/rotation = Get_Pixel_Angle(fallingPod.pixel_z, fallingPod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps - M.Turn(rotation) //Turn our matrix accordingly - fallingPod.transform = M //Transform the animated pod according to the matrix - M = matrix(pod.transform) //Make another matrix based on the pod - M.Turn(rotation) //Turn the matrix - pod.transform = M //Turn the actual pod (Won't be visible until endLaunch() proc tho) - animate(fallingPod, pixel_z = 0, pixel_x = -16, time = pod.fallDuration, , easing = LINEAR_EASING) //Make the pod fall! At an angle! + pod.pixel_x = cos(angle)*32*length(smoke_effects) //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the pod_landingzone + pod.pixel_z = sin(angle)*32*length(smoke_effects) + var/rotation = Get_Pixel_Angle(pod.pixel_z, pod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps + setupSmoke(rotation) + pod.transform = matrix().Turn(rotation) + pod.layer = FLY_LAYER + if (pod.style != STYLE_INVISIBLE) + animate(pod.get_filter("motionblur"), y = 0, time = pod.fallDuration, flags = ANIMATION_PARALLEL) + animate(pod, pixel_z = -1 * abs(sin(rotation))*4, pixel_x = SUPPLYPOD_X_OFFSET + (sin(rotation) * 20), time = pod.fallDuration, easing = LINEAR_EASING, flags = ANIMATION_PARALLEL) //Make the pod fall! At an angle! addtimer(CALLBACK(src, .proc/endLaunch), pod.fallDuration, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation -/obj/effect/abstract/DPtarget/proc/endLaunch() - pod.update_icon() - pod.forceMove(drop_location()) //The fallingPod animation is over, now's a good time to forceMove the actual pod into position - QDEL_NULL(fallingPod) //Delete the falling pod effect, because at this point its animation is over. We dont use temp_visual because we want to manually delete it as soon as the pod appears - for (var/mob/living/M in src) //Remember earlier (initialization) when we moved mobs into the DPTarget so they wouldnt get lost in nullspace? Time to get them out - M.forceMove(pod) +/obj/effect/pod_landingzone/proc/setupSmoke(rotation) + if (pod.style == STYLE_INVISIBLE || pod.style == STYLE_SEETHROUGH) + return + for ( var/i in 1 to length(smoke_effects)) + var/obj/effect/supplypod_smoke/smoke_part = new (drop_location()) + if (i == 1) + smoke_part.layer = FLY_LAYER + smoke_part.icon_state = "smoke_start" + smoke_part.transform = matrix().Turn(rotation) + smoke_effects[i] = smoke_part + smoke_part.pixel_x = sin(rotation)*32 * i + smoke_part.pixel_y = abs(cos(rotation))*32 * i + smoke_part.filters += filter(type = "blur", size = 4) + var/time = (pod.fallDuration / length(smoke_effects))*(length(smoke_effects)-i) + addtimer(CALLBACK(smoke_part, /obj/effect/supplypod_smoke/.proc/drawSelf, i), time, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation + QDEL_IN(smoke_part, pod.fallDuration + 35) + +/obj/effect/pod_landingzone/proc/drawSmoke() + if (pod.style == STYLE_INVISIBLE || pod.style == STYLE_SEETHROUGH) + return + for (var/obj/effect/supplypod_smoke/smoke_part in smoke_effects) + animate(smoke_part, alpha = 0, time = 20, flags = ANIMATION_PARALLEL) + animate(smoke_part.filters[1], size = 6, time = 15, easing = CUBIC_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) + +/obj/effect/pod_landingzone/proc/endLaunch() + pod.tryMakeRubble(drop_location()) + pod.layer = initial(pod.layer) + pod.endGlow() + QDEL_NULL(helper) pod.preOpen() //Begin supplypod open procedures. Here effects like explosions, damage, and other dangerous (and potentially admin-caused, if the centcom_podlauncher datum was used) memes will take place - qdel(src) //ditto + drawSmoke() + qdel(src) //The pod_landingzone's purpose is complete. It can rest easy now //------------------------------------UPGRADES-------------------------------------// /obj/item/disk/cargo/bluespace_pod //Disk that can be inserted into the Express Console to allow for Advanced Bluespace Pods @@ -348,5 +649,4 @@ desc = "This disk provides a firmware update to the Express Supply Console, granting the use of Nanotrasen's Bluespace Drop Pods to the supply department." icon = 'icons/obj/module.dmi' icon_state = "cargodisk" - item_state = "card-id" w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/chatter/chatter.dm b/code/modules/chatter/chatter.dm index 2dfd0bd77d..3da2b32a67 100644 --- a/code/modules/chatter/chatter.dm +++ b/code/modules/chatter/chatter.dm @@ -38,7 +38,7 @@ var/path = "sound/chatter/[phomeme]_[length].ogg" playsound(loc, path, - vol = 40, vary = 0, extrarange = 3, falloff = FALSE) + vol = 40, vary = 0, extrarange = 3) sleep((length + 1) * chatter_get_sleep_multiplier(phomeme)) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 755665583a..241cd6be93 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -31,6 +31,7 @@ var/datum/preferences/prefs = null var/last_turn = 0 var/move_delay = 0 + var/last_move = 0 var/area = null /// Last time we Click()ed. No clicking twice in one tick! @@ -89,6 +90,8 @@ var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen. + /// Last time they used fix macros + var/last_macro_fix = 0 /// Keys currently held var/list/keys_held = list() /// These next two vars are to apply movement for keypresses and releases made while move delayed. @@ -126,9 +129,8 @@ /// Messages currently seen by this client var/list/seen_messages - - /// datum wrapper for client view - var/datum/view_data/view_size + /// viewsize datum for holding our view size + var/datum/viewData/view_size /// our current tab var/stat_tab @@ -162,6 +164,14 @@ var/parallax_layers_max = 3 var/parallax_animate_timer + /** + * Assoc list with all the active maps - when a screen obj is added to + * a map, it's put in here as well. + * + * Format: list( = list(/obj/screen)) + */ + var/list/screen_maps = list() + // List of all asset filenames sent to this client by the asset cache, along with their assoicated md5s var/list/sent_assets = list() /// List of all completed blocking send jobs awaiting acknowledgement by send_asset diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 45990cd21f..970e34cabe 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -76,9 +76,15 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( to_chat(src, "Your previous action was ignored because you've done too many in a second") return - //Logs all hrefs, except chat pings - if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) - log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]") + + // Tgui Topic middleware + if(tgui_Topic(href_list)) + if(CONFIG_GET(flag/emergency_tgui_logging)) + log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]") + return + + //Logs all hrefs + log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]") //byond bug ID:2256651 if (asset_cache_job && (asset_cache_job in completed_asset_jobs)) @@ -101,8 +107,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( keyUp(keycode) return - // Tgui Topic middleware - if(tgui_Topic(href_list)) + if(href_list["statpanel_item_target"]) + handle_statpanel_click(href_list) return // Admin PM @@ -141,6 +147,12 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( ..() //redirect to hsrc.Topic() +/client/proc/handle_statpanel_click(list/href_list) + var/atom/target = locate(href_list["statpanel_item_target"]) + if(!target) + return + Click(target, target.loc, null, "[href_list["statpanel_item_shiftclick"]?"shift=1;":null][href_list["statpanel_item_ctrlclick"]?"ctrl=1;":null]&alt=[href_list["statpanel_item_altclick"]?"alt=1;":null]", FALSE, "statpanel") + /client/proc/is_content_unlocked() if(!prefs.unlock_content) to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Only 10 bucks for 3 months! Click Here to find out more.") @@ -268,7 +280,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( else prefs = new /datum/preferences(src) GLOB.preferences_datums[ckey] = prefs - addtimer(CALLBACK(src, .proc/ensure_keys_set), 0) //prevents possible race conditions + + addtimer(CALLBACK(src, .proc/ensure_keys_set, prefs), 10) //prevents possible race conditions prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning @@ -336,10 +349,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( qdel(src) return - // if(SSinput.initialized) placed here on tg. - // set_macros() - // update_movement_keys() - // Initialize tgui panel tgui_panel.initialize() src << browse(file('html/statbrowser.html'), "window=statbrowser") @@ -446,7 +455,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") - //This is down here because of the browse() calls in tooltip/New() if(!tooltips) tooltips = new /datum/tooltip(src) @@ -472,17 +480,12 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if (menuitem) menuitem.Load_checked(src) - // view_size = new(src, getScreenSize(prefs.widescreenpref)) - // view_size.resetFormat() - // view_size.setZoomMode() - // fit_viewport() + view_size = new(src, getScreenSize(prefs.widescreenpref)) + view_size.resetFormat() + view_size.setZoomMode() + fit_viewport() Master.UpdateTickRate() -/client/proc/ensure_keys_set() - if(SSinput.initialized) - set_macros() - update_movement_keys(prefs) - ////////////// //DISCONNECT// ////////////// @@ -497,7 +500,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( GLOB.directory -= ckey log_access("Logout: [key_name(src)]") GLOB.ahelp_tickets.ClientLogout(src) - // SSserver_maint.UpdateHubStatus() + SSserver_maint.UpdateHubStatus() if(credits) QDEL_LIST(credits) if(holder) @@ -564,36 +567,49 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!query_client_in_db.Execute()) qdel(query_client_in_db) return - if(!query_client_in_db.NextRow()) - if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey] && !(ckey in GLOB.bunker_passthrough)) - log_access("Failed Login: [key] - New account attempting to connect during panic bunker") - message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") - to_chat(src, "You must first join the Discord to verify your account before joining this server.
    To do so, read the rules and post a request in the #station-access-requests channel under the \"Main server\" category in the Discord server linked here: https://discord.gg/E6SQuhz
    If you have already done so, wait a few minutes then try again; sometimes the server needs to fully load before you can join.
    ") //CIT CHANGE - makes the panic bunker disconnect message point to the discord - var/list/connectiontopic_a = params2list(connectiontopic) - var/list/panic_addr = CONFIG_GET(string/panic_server_address) - if(panic_addr && !connectiontopic_a["redirect"]) - var/panic_name = CONFIG_GET(string/panic_server_name) - to_chat(src, "Sending you to [panic_name ? panic_name : panic_addr].") - winset(src, null, "command=.options") - src << link("[panic_addr]?redirect=1") - qdel(query_client_in_db) - qdel(src) - return + if(!query_client_in_db.NextRow()) //new user detected + if(!holder && !GLOB.deadmins[ckey]) + if(CONFIG_GET(flag/panic_bunker) && !(ckey in GLOB.bunker_passthrough)) + log_access("Failed Login: [key] - New account attempting to connect during panic bunker") + message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") + to_chat(src, "You must first join the Discord to verify your account before joining this server.
    To do so, read the rules and post a request in the #station-access-requests channel under the \"Main server\" category in the Discord server linked here: https://discord.gg/E6SQuhz
    If you have already done so, wait a few minutes then try again; sometimes the server needs to fully load before you can join.
    ") //CIT CHANGE - makes the panic bunker disconnect message point to the discord + var/list/connectiontopic_a = params2list(connectiontopic) + var/list/panic_addr = CONFIG_GET(string/panic_server_address) + if(panic_addr && !connectiontopic_a["redirect"]) + var/panic_name = CONFIG_GET(string/panic_server_name) + to_chat(src, "Sending you to [panic_name ? panic_name : panic_addr].") + winset(src, null, "command=.options") + src << link("[panic_addr]?redirect=1") + qdel(query_client_in_db) + qdel(src) + return - new_player = 1 - account_join_date = sanitizeSQL(findJoinDate()) - var/sql_key = sanitizeSQL(key) - var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (`ckey`, `byond_key`, `firstseen`, `firstseen_round_id`, `lastseen`, `lastseen_round_id`, `ip`, `computerid`, `lastadminrank`, `accountjoindate`) VALUES ('[sql_ckey]', '[sql_key]', Now(), '[GLOB.round_id]', Now(), '[GLOB.round_id]', INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])") - if(!query_add_player.Execute()) - qdel(query_client_in_db) + new_player = 1 + account_join_date = sanitizeSQL(findJoinDate()) + var/sql_key = sanitizeSQL(key) + var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (`ckey`, `byond_key`, `firstseen`, `firstseen_round_id`, `lastseen`, `lastseen_round_id`, `ip`, `computerid`, `lastadminrank`, `accountjoindate`) VALUES ('[sql_ckey]', '[sql_key]', Now(), '[GLOB.round_id]', Now(), '[GLOB.round_id]', INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])") + if(!query_add_player.Execute()) + qdel(query_client_in_db) + qdel(query_add_player) + return qdel(query_add_player) - return - qdel(query_add_player) - if(!account_join_date) - account_join_date = "Error" - account_age = -1 - else if(ckey in GLOB.bunker_passthrough) - GLOB.bunker_passthrough -= ckey + if(!account_join_date) + account_join_date = "Error" + account_age = -1 + else if(ckey in GLOB.bunker_passthrough) + GLOB.bunker_passthrough -= ckey + if(CONFIG_GET(flag/age_verification)) //setup age verification + if(!set_db_player_flags()) + message_admins(usr, "ERROR: Unable to read player flags from database. Please check logs.") + return + else + var/dbflags = prefs.db_flags + if(!(dbflags & DB_FLAG_AGE_CONFIRMATION_COMPLETE)) //they have not completed age verification + if((ckey in GLOB.bunker_passthrough)) //they're verified in the panic bunker though + update_flag_db(DB_FLAG_AGE_CONFIRMATION_COMPLETE, TRUE) + else + update_flag_db(DB_FLAG_AGE_CONFIRMATION_INCOMPLETE, TRUE) + qdel(query_client_in_db) var/datum/DBQuery/query_get_client_age = SSdbcore.NewQuery("SELECT firstseen, DATEDIFF(Now(),firstseen), accountjoindate, DATEDIFF(Now(),accountjoindate) FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'") if(!query_get_client_age.Execute()) @@ -630,7 +646,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( query_log_connection.Execute() qdel(query_log_connection) - // SSserver_maint.UpdateHubStatus() + SSserver_maint.UpdateHubStatus() if(new_player) player_age = -1 @@ -794,7 +810,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( message_admins("Proxy Detection: [key_name_admin(src)] IP intel rated [res.intel*100]% likely to be a Proxy/VPN.") ip_intel = res.intel -/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE) +/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE, extra_info) if(last_click > world.time - world.tick_lag) return last_click = world.time @@ -847,7 +863,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( return if(prefs.log_clicks) - log_click(object, location, control, params, src) + log_click(object, location, control, params, src, extra_info? "clicked ([extra_info])" : null) if (prefs.hotkeys) // If hotkey mode is enabled, then clicking the map will automatically @@ -914,46 +930,37 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( return FALSE if (NAMEOF(src, key)) return FALSE - if(NAMEOF(src, view)) - change_view(var_value) + if (NAMEOF(src, view)) + view_size.setDefault(var_value) return TRUE + if(NAMEOF(src, computer_id)) + return FALSE + if(NAMEOF(src, address)) + return FALSE . = ..() +/client/vv_get_var(var_name) + . = ..() + switch(var_name) + if(NAMEOF(src, computer_id)) + if(!check_rights(R_SENSITIVE, FALSE)) + return "SENSITIVE" + if(NAMEOF(src, address)) + if(!check_rights(R_SENSITIVE, FALSE)) + return "SENSITIVE" + /client/proc/rescale_view(change, min, max) var/viewscale = getviewsize(view) var/x = viewscale[1] var/y = viewscale[2] x = clamp(x+change, min, max) y = clamp(y+change, min,max) - change_view("[x]x[y]") - -/client/proc/update_movement_keys(datum/preferences/direct_prefs) - var/datum/preferences/D = prefs || direct_prefs - if(!D?.key_bindings) - return - movement_keys = list() - for(var/key in D.key_bindings) - for(var/kb_name in D.key_bindings[key]) - switch(kb_name) - if("North") - movement_keys[key] = NORTH - if("East") - movement_keys[key] = EAST - if("West") - movement_keys[key] = WEST - if("South") - movement_keys[key] = SOUTH + view_size.setDefault("[x]x[y]") /client/proc/change_view(new_size) if (isnull(new_size)) CRASH("change_view called without argument.") -//CIT CHANGES START HERE - makes change_view change DEFAULT_VIEW to 15x15 depending on preferences - if(prefs && CONFIG_GET(string/default_view)) - if(!prefs.widescreenpref && new_size == CONFIG_GET(string/default_view)) - new_size = "15x15" -//END OF CIT CHANGES - var/list/old_view = getviewsize(view) view = new_size var/list/actualview = getviewsize(view) @@ -1021,3 +1028,25 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( verb_tabs |= verb_to_init.category verblist[++verblist.len] = list(verb_to_init.category, verb_to_init.name) src << output("[url_encode(json_encode(verb_tabs))];[url_encode(json_encode(verblist))]", "statbrowser:init_verbs") + +//increment progress for an unlockable loadout item +/client/proc/increment_progress(key, amount) + if(prefs) + var/savefile/S = new /savefile(prefs.path) + var/list/unlockable_loadout_data = prefs.unlockable_loadout_data + if(!length(unlockable_loadout_data)) + unlockable_loadout_data = list() + unlockable_loadout_data[key] = amount + WRITE_FILE(S["unlockable_loadout"], safe_json_encode(unlockable_loadout_data)) + prefs.unlockable_loadout_data = unlockable_loadout_data + return TRUE + else + if(unlockable_loadout_data[key]) + unlockable_loadout_data[key] += amount + else + unlockable_loadout_data[key] = amount + WRITE_FILE(S["unlockable_loadout"], safe_json_encode(unlockable_loadout_data)) + prefs.unlockable_loadout_data = unlockable_loadout_data + return TRUE + return FALSE + diff --git a/code/modules/client/message.dm b/code/modules/client/message.dm index 6904fa8973..1bb9d03dd8 100644 --- a/code/modules/client/message.dm +++ b/code/modules/client/message.dm @@ -7,4 +7,4 @@ GLOBAL_LIST_EMPTY(clientmessages) var/list/L = GLOB.clientmessages[ckey] if(!L) GLOB.clientmessages[ckey] = L = list() - L += message \ No newline at end of file + L += message diff --git a/code/modules/client/player_details.dm b/code/modules/client/player_details.dm index 814000ce48..6b2a936533 100644 --- a/code/modules/client/player_details.dm +++ b/code/modules/client/player_details.dm @@ -3,4 +3,4 @@ var/list/logging = list() var/list/post_login_callbacks = list() var/list/post_logout_callbacks = list() - var/byond_version = "Unknown" \ No newline at end of file + var/byond_version = "Unknown" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 01ad5757da..30f195565d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -10,13 +10,31 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/path var/vr_path var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used - var/max_save_slots = 16 + var/max_save_slots = 24 - //non-preference stuff - var/muted = 0 + // Intra-round persistence begin + /// Flags for admin mutes + var/muted = NONE + /// Last IP the person was seen on var/last_ip + /// Last CID the person was seen on var/last_id + /// Do we log their clicks to disk? var/log_clicks = FALSE + /// Characters they have joined the round under - Lazylist of names + var/list/characters_joined_as + /// Slots they have joined the round under - Lazylist of numbers + var/list/slots_joined_as + /// Are we currently subject to respawn restrictions? Usually set by us using the "respawn" verb, but can be lifted by admins. + var/respawn_restrictions_active = FALSE + /// time of death we consider for respawns + var/respawn_time_of_death = -INFINITY + /// did they DNR? used to prevent respawns. + var/dnr_triggered = FALSE + /// did they cryo on their last ghost? + var/respawn_did_cryo = FALSE + + // Intra-round persistence end var/icon/custom_holoform_icon var/list/cached_holoform_icons @@ -53,7 +71,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) /// List with a key string associated to a list of keybindings. Unlike key_bindings, this one operates on raw key, allowing for binding a key that triggers regardless of if a modifier is depressed as long as the raw key is sent. var/list/modless_key_bindings = list() - var/tgui_fancy = TRUE var/tgui_lock = TRUE var/windowflashing = TRUE @@ -82,6 +99,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/be_random_body = 0 //whether we'll have a random body every round var/gender = MALE //gender of character (well duh) var/age = 30 //age of character + var/language = "Random" //bonus language + var/choselanguage = "Random" //language appearance var/underwear = "Nude" //underwear type var/undie_color = "FFFFFF" var/undershirt = "Nude" //undershirt type @@ -98,72 +117,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/use_custom_skin_tone = FALSE var/left_eye_color = "000000" //Eye color var/right_eye_color = "000000" + var/eye_type = DEFAULT_EYES_TYPE //Eye type var/split_eye_colors = FALSE var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFFFFF", - "mcolor2" = "FFFFFF", - "mcolor3" = "FFFFFF", - "tail_lizard" = "Smooth", - "tail_human" = "None", - "snout" = "Round", - "horns" = "None", - "horns_color" = "85615a", - "ears" = "None", - "wings" = "None", - "wings_color" = "FFF", - "frills" = "None", - "deco_wings" = "None", - "spines" = "None", - "body_markings" = "None", - "legs" = "Plantigrade", - "insect_wings" = "Plain", - "insect_fluff" = "None", - "insect_markings" = "None", - "mam_body_markings" = "Plain", - "mam_ears" = "None", - "mam_snouts" = "None", - "mam_tail" = "None", - "mam_tail_animated" = "None", - "xenodorsal" = "Standard", - "xenohead" = "Standard", - "xenotail" = "Xenomorph Tail", - "taur" = "None", - "genitals_use_skintone" = FALSE, - "has_cock" = FALSE, - "cock_shape" = DEF_COCK_SHAPE, - "cock_length" = COCK_SIZE_DEF, - "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, - "cock_color" = "ffffff", - "cock_taur" = FALSE, - "has_balls" = FALSE, - "balls_color" = "ffffff", - "balls_shape" = DEF_BALLS_SHAPE, - "balls_size" = BALLS_SIZE_DEF, - "balls_cum_rate" = CUM_RATE, - "balls_cum_mult" = CUM_RATE_MULT, - "balls_efficiency" = CUM_EFFICIENCY, - "has_breasts" = FALSE, - "breasts_color" = "ffffff", - "breasts_size" = BREASTS_SIZE_DEF, - "breasts_shape" = DEF_BREASTS_SHAPE, - "breasts_producing" = FALSE, - "has_vag" = FALSE, - "vag_shape" = DEF_VAGINA_SHAPE, - "vag_color" = "ffffff", - "has_womb" = FALSE, - "balls_visibility" = GEN_VISIBLE_NO_UNDIES, - "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, - "cock_visibility" = GEN_VISIBLE_NO_UNDIES, - "vag_visibility" = GEN_VISIBLE_NO_UNDIES, - "ipc_screen" = "Sunburst", - "ipc_antenna" = "None", - "flavor_text" = "", - "silicon_flavor_text" = "", - "ooc_notes" = "", - "meat_type" = "Mammalian", - "body_model" = MALE, - "body_size" = RESIZE_DEFAULT_SIZE - ) + var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + var/custom_speech_verb = "default" //if your say_mod is to be something other than your races var/custom_tongue = "default" //if your tongue is to be something other than your races var/additional_language = "None" //additional language your character has @@ -201,7 +159,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/parallax var/ambientocclusion = TRUE - var/auto_fit_viewport = TRUE + ///Should we automatically fit the viewport? + var/auto_fit_viewport = FALSE + ///Should we be in the widescreen mode set by the config? + var/widescreenpref = TRUE + + ///What size should pixels be displayed as? 0 is strech to fit + var/pixel_size = 0 + ///What scaling method should we use? + var/scaling_method = "normal" var/uplink_spawn_loc = UPLINK_PDA @@ -234,14 +200,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) ///loadout stuff var/gear_points = 10 var/list/gear_categories - var/list/chosen_gear = list() + var/list/loadout_data = list() + var/list/unlockable_loadout_data = list() + var/loadout_slot = 1 //goes from 1 to MAXIMUM_LOADOUT_SAVES var/gear_category var/gear_subcategory var/screenshake = 100 var/damagescreenshake = 2 var/arousable = TRUE - var/widescreenpref = TRUE var/autostand = TRUE var/auto_ooc = FALSE @@ -254,6 +221,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/hide_ckey = FALSE //pref for hiding if your ckey shows round-end or not + var/list/tcg_cards = list() + var/list/tcg_decks = list() + /datum/preferences/New(client/C) parent = C @@ -266,7 +236,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) load_path(C.ckey) unlock_content = C.IsByondMember() if(unlock_content) - max_save_slots = 24 + max_save_slots = 32 var/loaded_preferences_successfully = load_preferences() if(loaded_preferences_successfully) if(load_character()) @@ -274,7 +244,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) //we couldn't load character data so just randomize the character appearance + name random_character() //let's create a random character then - rather than a fat, bald and naked man. key_bindings = deepCopyList(GLOB.hotkey_keybinding_list_by_key) // give them default keybinds and update their movement keys - C?.update_movement_keys(src) + C?.ensure_keys_set(src) real_name = pref_species.random_name(gender,1) if(!loaded_preferences_successfully) save_preferences() @@ -288,7 +258,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) /datum/preferences/proc/ShowChoices(mob/user) if(!user || !user.client) return - update_preview_icon(current_tab != 2) + update_preview_icon(current_tab) var/list/dat = list("
    ") dat += "Character Settings" @@ -345,6 +315,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Gender: [gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
    " dat += "Age: [age]
    " + dat += "Language: [choselanguage]
    " dat += "Special Names:
    " var/old_group @@ -461,6 +432,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(!use_skintones) dat += APPEARANCE_CATEGORY_COLUMN + dat += "

    Advanced Coloring

    " + dat += "
    [(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) ? "Enabled" : "Disabled"]" + dat += "

    Body Colors

    " dat += "Primary Color:
    " @@ -473,28 +447,30 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "    Change
    " mutant_colors = TRUE - if (CONFIG_GET(number/body_size_min) != CONFIG_GET(number/body_size_max)) dat += "Sprite Size: [features["body_size"]*100]%
    " - if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits)) - if(!use_skintones && !mutant_colors) - dat += APPEARANCE_CATEGORY_COLUMN - if(left_eye_color != right_eye_color) - split_eye_colors = TRUE - dat += "

    Heterochromia

    " - dat += "
    [split_eye_colors ? "Enabled" : "Disabled"]" - if(!split_eye_colors) - dat += "

    Eye Color

    " - dat += "    Change" + if(!(NOEYES in pref_species.species_traits)) + dat += "

    Eye Type

    " + dat += "[eye_type]
    " + if((EYECOLOR in pref_species.species_traits)) + if(!use_skintones && !mutant_colors) + dat += APPEARANCE_CATEGORY_COLUMN + if(left_eye_color != right_eye_color) + split_eye_colors = TRUE + dat += "

    Heterochromia

    " + dat += "[split_eye_colors ? "Enabled" : "Disabled"]" + if(!split_eye_colors) + dat += "

    Eye Color

    " + dat += "    Change" + dat += "" + else + dat += "

    Left Eye Color

    " + dat += "    Change" + dat += "

    Right Eye Color

    " + dat += "    Change
    " + dat += "" + else if(use_skintones || mutant_colors) dat += "" - else - dat += "

    Left Eye Color

    " - dat += "    Change" - dat += "

    Right Eye Color

    " - dat += "    Change
    " - dat += "" - else if(use_skintones || mutant_colors) - dat += "" if(HAIR in pref_species.species_traits) @@ -533,6 +509,52 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/color_type = GLOB.colored_mutant_parts[mutant_part] //if it can be coloured, show the appropriate button if(color_type) dat += "    Change
    " + else + if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) //advanced individual part colouring system + //is it matrixed or does it have extra parts to be coloured? + var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part] + var/find_part_list = GLOB.mutant_reference_list[mutant_part] + if(find_part && find_part != "None" && find_part_list) + var/datum/sprite_accessory/accessory = find_part_list[find_part] + if(accessory) + if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future + var/mutant_string = accessory.mutant_part_string + if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings)) + continue + var/primary_feature = "[mutant_string]_primary" + var/secondary_feature = "[mutant_string]_secondary" + var/tertiary_feature = "[mutant_string]_tertiary" + if(!features[primary_feature]) + features[primary_feature] = features["mcolor"] + if(!features[secondary_feature]) + features[secondary_feature] = features["mcolor2"] + if(!features[tertiary_feature]) + features[tertiary_feature] = features["mcolor3"] + + var/matrixed_sections = accessory.matrixed_sections + if(accessory.color_src == MATRIXED && !matrixed_sections) + message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") + continue + else if(accessory.color_src == MATRIXED) + switch(matrixed_sections) + if(MATRIX_GREEN) //only composed of a green section + primary_feature = secondary_feature //swap primary for secondary, so it properly assigns the second colour, reserved for the green section + if(MATRIX_BLUE) + primary_feature = tertiary_feature //same as above, but the tertiary feature is for the blue section + if(MATRIX_RED_BLUE) //composed of a red and blue section + secondary_feature = tertiary_feature //swap secondary for tertiary, as blue should always be tertiary + if(MATRIX_GREEN_BLUE) //composed of a green and blue section + primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary + secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary + dat += "Primary Color
    " + dat += "    Change
    " + if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) + dat += "Secondary Color
    " + dat += "    Change
    " + if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) + dat += "Tertiary Color
    " + dat += "    Change
    " + mutant_category++ if(mutant_category >= MAX_MUTANT_ROWS) dat += "" @@ -775,6 +797,20 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "HUD Button Flashes: [hud_toggle_flash ? "Enabled" : "Disabled"]
    " dat += "HUD Button Flash Color:     Change
    " +/* CITADEL EDIT - We're using top menu instead + button_name = pixel_size + dat += "Pixel Scaling: [(button_name) ? "Pixel Perfect [button_name]x" : "Stretch to fit"]
    " + + switch(scaling_method) + if(SCALING_METHOD_NORMAL) + button_name = "Nearest Neighbor" + if(SCALING_METHOD_DISTORT) + button_name = "Point Sampling" + if(SCALING_METHOD_BLUR) + button_name = "Bilinear" + dat += "Scaling Method: [button_name]
    " +*/ + if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation)) var/p_map = preferred_map if (!p_map) @@ -821,6 +857,19 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
    " if(4) + //calculate your gear points from the chosen item + gear_points = CONFIG_GET(number/initial_gear_points) + var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"] + if(chosen_gear) + for(var/loadout_item in chosen_gear) + var/loadout_item_path = loadout_item[LOADOUT_ITEM] + if(loadout_item_path) + var/datum/gear/loadout_gear = text2path(loadout_item_path) + if(loadout_gear) + gear_points -= initial(loadout_gear.cost) + else + chosen_gear = list() + dat += "" dat += "" dat += "" @@ -876,15 +925,33 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(donoritem && !gear.donator_ckey_check(user.ckey)) continue var/class_link = "" - if(gear.type in chosen_gear) + var/list/loadout_item = has_loadout_gear(loadout_slot, "[gear.type]") + var/extra_loadout_data = "" + if(loadout_item) class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=0'" - else if(gear_points <= 0) + if(gear.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) + extra_loadout_data += "
    Color" + for(var/loadout_color in loadout_item[LOADOUT_COLOR]) + extra_loadout_data += "   " + else + var/loadout_color_non_poly = "#FFFFFF" + if(length(loadout_item[LOADOUT_COLOR])) + loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1] + extra_loadout_data += "
    Color" + extra_loadout_data += "   " + if(gear.loadout_flags & LOADOUT_CAN_NAME) + extra_loadout_data += "
    Name [loadout_item[LOADOUT_CUSTOM_NAME] ? loadout_item[LOADOUT_CUSTOM_NAME] : "N/A"]" + if(gear.loadout_flags & LOADOUT_CAN_DESCRIPTION) + extra_loadout_data += "
    Description" + else if((gear_points - gear.cost) < 0) class_link = "style='white-space:normal;' class='linkOff'" else if(donoritem) class_link = "style='white-space:normal;background:#ebc42e;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" - else + else if(!istype(gear, /datum/gear/unlockable) || can_use_unlockable(gear)) class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" - dat += "" + else + class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'" + dat += "" dat += "" + if(!istype(gear, /datum/gear/unlockable)) + // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description" + dat += "" + else + //we add the user's progress to the description assuming they have progress + var/datum/gear/unlockable/unlockable = gear + var/progress_made = unlockable_loadout_data[unlockable.progress_key] + if(!progress_made) + progress_made = 0 + dat += "" + dat += "
    [gear_points] loadout points remaining. \[Clear Loadout\]
    You can only choose one item per category, unless it's an item that spawns in your backpack or hands.
    [name]
    [name][extra_loadout_data][gear.cost]" if(islist(gear.restricted_roles)) if(gear.restricted_roles.len) @@ -896,7 +963,17 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" dat += gear.restricted_roles.Join(";") dat += "" - dat += "[gear.description]
    [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description]
    [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]
    " if(5) // Content preferences dat += "
    " @@ -917,6 +994,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Breast Enlargement: [(cit_toggles & BREAST_ENLARGEMENT) ? "Allowed" : "Disallowed"]
    " dat += "Penis Enlargement: [(cit_toggles & PENIS_ENLARGEMENT) ? "Allowed" : "Disallowed"]
    " dat += "Hypno: [(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"]
    " + dat += "Aphrodisiacs: [(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"]
    " dat += "Ass Slapping: [(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]
    " dat += "Automatic Wagging: [(cit_toggles & NO_AUTO_WAG) ? "Disabled" : "Enabled"]
    " dat += "
    " @@ -966,7 +1044,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/default_keys = hotkeys ? kb.hotkey_keys : kb.classic_keys if(LAZYLEN(default_keys)) dat += "| Default: [default_keys.Join(", ")]" - dat += "Independent Binding: [current_independent_binding]" + dat += "" + if(!kb.special && !kb.clientside) + dat += "Independent Binding: [current_independent_binding]" dat += "
    " else var/bound_key = user_binds[kb.name][1] @@ -979,7 +1059,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/default_keys = hotkeys ? kb.classic_keys : kb.hotkey_keys if(LAZYLEN(default_keys)) dat += "| Default: [default_keys.Join(", ")]" - dat += "Independent Binding: [current_independent_binding]" + dat += "" + if(!kb.special && !kb.clientside) + dat += "Independent Binding: [current_independent_binding]" dat += "
    " dat += "

    " @@ -1005,7 +1087,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) #undef APPEARANCE_CATEGORY_COLUMN #undef MAX_MUTANT_ROWS -/datum/preferences/proc/CaptureKeybinding(mob/user, datum/keybinding/kb, old_key, independent = FALSE) +/datum/preferences/proc/CaptureKeybinding(mob/user, datum/keybinding/kb, old_key, independent = FALSE, special = FALSE) var/HTML = {"
    Keybinding: [kb.full_name]
    [kb.description]

    Press any key to change
    Press ESC to clear
    \n" + inline_assets_str += "Byond.loadJs('[url]', true);\n" asset.send(client) - html = replacetextEx(html, "\n", inline_styles) - html = replacetextEx(html, "\n", inline_scripts) + if(length(inline_assets_str)) + inline_assets_str = "\n" + html = replacetextEx(html, "\n", inline_assets_str) // Inject custom HTML html = replacetextEx(html, "\n", inline_html) // Open the window diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html index 3cab68da6a..60bd358031 100644 --- a/code/modules/tooltip/tooltip.html +++ b/code/modules/tooltip/tooltip.html @@ -120,12 +120,17 @@ window.location = 'byond://winset?id='+tooltip.control+';anchor1=0,0;size=999x999'; //Get the real icon size according to the client view + //FYI, this bit is even more borrowed from goon, our widescreen broke tooltips so I took a look at how they do it + //To improve our code. Thanks gooncoders, very cool var mapWidth = map['view-size'].x, mapHeight = map['view-size'].y, - tilesShown = tooltip.client_view_h - realIconSize = mapHeight / tilesShown, - resizeRatio = realIconSize / tooltip.tileSize, - //Calculate letterboxing offsets + tilesShownX = tooltip.client_view_w + tilesShownY = tooltip.client_view_h + realIconSizeX = mapWidth / tilesShownX, + realIconSizeY = mapHeight / tilesShownY, + resizeRatioX = realIconSizeX / tooltip.tileSize, + resizeRatioY = realIconSizeY / tooltip.tileSize, + //Calculate letterboxing offsets leftOffset = (map.size.x - mapWidth) / 2, topOffset = (map.size.y - mapHeight) / 2; @@ -168,7 +173,7 @@ if ((iconX + westOffset) !== enteredX) { //Cursor entered on the offset tile left = left + (westOffset < 0 ? 1 : -1); } - leftOffset = leftOffset + (westOffset * resizeRatio); + leftOffset = leftOffset + (westOffset * resizeRatioX); } } @@ -179,13 +184,13 @@ if (northOffset !== 0) { if ((iconY + northOffset) === enteredY) { //Cursor entered on the original tile top--; - topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatio); + topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatioY); } else { //Cursor entered on the offset tile if (northOffset < 0) { //Offset southwards - topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatio); + topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatioY); } else { //Offset northwards top--; - topOffset = topOffset - (northOffset * resizeRatio); + topOffset = topOffset - (northOffset * resizeRatioY); } } } @@ -198,12 +203,12 @@ } //Clamp values - left = (left < 0 ? 0 : (left > tilesShown ? tilesShown : left)); - top = (top < 0 ? 0 : (top > tilesShown ? tilesShown : top)); + left = (left < 0 ? 0 : (left > tilesShownX ? tilesShownX : left)); + top = (top < 0 ? 0 : (top > tilesShownY ? tilesShownY : top)); //Calculate where on the screen the popup should appear (below the hovered tile) - var posX = Math.round(((left - 1) * realIconSize) + leftOffset + tooltip.padding); //-1 to position at the left of the target tile - var posY = Math.round(((tilesShown - top + 1) * realIconSize) + topOffset + tooltip.padding); //+1 to position at the bottom of the target tile + var posX = Math.round(((left - 1) * realIconSizeX) + leftOffset + tooltip.padding); //-1 to position at the left of the target tile + var posY = Math.round(((tilesShownY - top + 1) * realIconSizeY) + topOffset + tooltip.padding); //+1 to position at the bottom of the target tile //alert(mapWidth+' | '+mapHeight+' | '+tilesShown+' | '+realIconSize+' | '+leftOffset+' | '+topOffset+' | '+left+' | '+top+' | '+posX+' | '+posY); //DEBUG @@ -221,7 +226,7 @@ docHeight = $wrap.outerHeight(); if (posY + docHeight > map.size.y) { //Is the bottom edge below the window? Snap it up if so - posY = (posY - docHeight) - realIconSize - tooltip.padding; + posY = (posY - docHeight) - realIconSizeY - tooltip.padding; } //Actually size, move and show the tooltip box diff --git a/code/modules/unit_tests/README.md b/code/modules/unit_tests/README.md new file mode 100644 index 0000000000..420c805fbf --- /dev/null +++ b/code/modules/unit_tests/README.md @@ -0,0 +1,70 @@ +# Unit Tests + +## What is unit testing? + +Unit tests are automated code to verify that parts of the game work exactly as they should. For example, [a test to make sure that the amputation surgery actually amputates the limb](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/surgeries.dm#L1-L13). These are ran every time a PR is made, and thus are very helpful for preventing bugs from cropping up in your code that would've otherwise gone unnoticed. For example, would you have thought to check [that beach boys would still work the same after editing pizza](https://github.com/tgstation/tgstation/pull/53641#issuecomment-691384934)? If you value your time, probably not. + +On their most basic level, when `UNIT_TESTS` is defined, all subtypes of `/datum/unit_test` will have their `Run` proc executed. From here, if `Fail` is called at any point, then the tests will report as failed. + +## How do I write one? +1. Find a relevant file. + +All unit test related code is in `code/modules/unit_tests`. If you are adding a new test for a surgery, for example, then you'd open `surgeries.dm`. If a relevant file does not exist, simply create one in this folder, then `#include` it in `_unit_tests.dm`. + +2. Create the unit test. + +To make a new unit test, you simply need to define a `/datum/unit_test`. + +For example, let's suppose that we are creating a test to make sure a proc `square` correctly raises inputs to the power of two. We'd start with first: + +``` +/datum/unit_test/square/Run() +``` + +This defines our new unit test, `/datum/unit_test/square`. Inside this function, we're then going to run through whatever we want to check. Tests provide a few assertion functions to make this easy. For now, we're going to use `TEST_ASSERT_EQUAL`. + +``` +/datum/unit_test/square/Run() + TEST_ASSERT_EQUAL(square(3), 9, "square(3) did not return 9") + TEST_ASSERT_EQUAL(square(4), 16, "square(4) did not return 16") +``` + +As you can hopefully tell, we're simply checking if the output of `square` matches the output we are expecting. If the test fails, it'll report the error message given as well as whatever the actual output was. + +3. Run the unit test + +Open `code/_compile_options.dm` and uncomment the following line. + +``` +//#define UNIT_TESTS //If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between +``` + +Then, run tgstation.dmb in Dream Daemon. Don't bother trying to connect, you won't need to. You'll be able to see the outputs of all the tests. You'll get to see which tests failed and for what reason. If they all pass, you're set! + +## How to think about tests + +Unit tests exist to prevent bugs that would happen in a real game. Thus, they should attempt to emulate the game world wherever possible. For example, the [quick swap sanity test](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/quick_swap_sanity.dm) emulates a *real* scenario of the bug it fixed occurring by creating a character and giving it real items. The unrecommended alternative would be to create special test-only items. This isn't a hard rule, the [reagent method exposure tests](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/reagent_mod_expose.dm) create a test-only reagent for example, but do keep it in mind. + +Unit tests should also be just that--testing *units* of code. For example, instead of having one massive test for reagents, there are instead several smaller tests for testing exposure, metabolization, etc. + +## The unit testing API + +You can find more information about all of these from their respective doc comments, but for a brief overview: + +`/datum/unit_test` - The base for all tests to be ran. Subtypes must override `Run()`. `New()` and `Destroy()` can be used for setup and teardown. To fail, use `Fail(reason)`. + +`/datum/unit_test/proc/allocate(type, ...)` - Allocates an instance of the provided type with the given arguments. Is automatically destroyed when the test is over. Commonly seen in the form of `var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)`. + +`TEST_ASSERT(assertion, reason)` - Stops the unit test and fails if the assertion is not met. For example: `TEST_ASSERT(powered(), "Machine is not powered")`. + +`TEST_ASSERT_EQUAL(a, b, message)` - Same as `TEST_ASSERT`, but checks if `a == b`. If not, gives a helpful message showing what both `a` and `b` were. For example: `TEST_ASSERT_EQUAL(2 + 2, 4, "The universe is falling apart before our eyes!")`. + +`TEST_ASSERT_NOTEQUAL(a, b, message)` - Same as `TEST_ASSERT_EQUAL`, but reversed. + +`TEST_FOCUS(test_path)` - *Only* run the test provided within the parameters. Useful for reducing noise. For example, if we only want to run our example square test, we can add `TEST_FOCUS(/datum/unit_test/square)`. Should *never* be pushed in a pull request--you will be laughed at. + +## Final Notes + +- Writing tests before you attempt to fix the bug can actually speed up development a lot! It means you don't have to go in game and folllow the same exact steps manually every time. This process is known as "TDD" (test driven development). Write the test first, make sure it fails, *then* start work on the fix/feature, and you'll know you're done when your tests pass. If you do try this, do make sure to confirm in a non-testing environment just to double check. +- Make sure that your tests don't accidentally call RNG functions like `prob`. Since RNG is seeded during tests, you may not realize you have until someone else makes a PR and the tests fail! +- Do your best not to change the behavior of non-testing code during tests. While it may sometimes be necessary in the case of situations such as the above, it is still a slippery slope that can lead to the code you're testing being too different from the production environment to be useful. diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index e758a43589..2745d971ff 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -1,14 +1,80 @@ //include unit test files in this module in this ifdef //Keep this sorted alphabetically -#ifdef UNIT_TESTS +#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM) + +/// Asserts that a condition is true +/// If the condition is not true, fails the test +#define TEST_ASSERT(assertion, reason) if (!(assertion)) { return Fail("Assertion failed: [reason || "No reason"]") } + +/// Asserts that the two parameters passed are equal, fails otherwise +/// Optionally allows an additional message in the case of a failure +#define TEST_ASSERT_EQUAL(a, b, message) do { \ + var/lhs = ##a; \ + var/rhs = ##b; \ + if (lhs != rhs) { \ + return Fail("Expected [isnull(lhs) ? "null" : lhs] to be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]"); \ + } \ +} while (FALSE) + +/// Asserts that the two parameters passed are not equal, fails otherwise +/// Optionally allows an additional message in the case of a failure +#define TEST_ASSERT_NOTEQUAL(a, b, message) do { \ + var/lhs = ##a; \ + var/rhs = ##b; \ + if (lhs == rhs) { \ + return Fail("Expected [isnull(lhs) ? "null" : lhs] to not be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]"); \ + } \ +} while (FALSE) + +/// *Only* run the test provided within the parentheses +/// This is useful for debugging when you want to reduce noise, but should never be pushed +/// Intended to be used in the manner of `TEST_FOCUS(/datum/unit_test/math)` +#define TEST_FOCUS(test_path) ##test_path { focus = TRUE; } + #include "anchored_mobs.dm" -#include "character_saving.dm" +#include "bespoke_id.dm" +#include "binary_insert.dm" +// #include "card_mismatch.dm" +#include "chain_pull_through_space.dm" +// #include "combat.dm" #include "component_tests.dm" +// #include "confusion.dm" +// #include "emoting.dm" +// #include "heretic_knowledge.dm" +// #include "holidays.dm" +#include "initialize_sanity.dm" +#include "keybinding_init.dm" +#include "machine_disassembly.dm" +#include "medical_wounds.dm" +#include "merge_type.dm" +// #include "metabolizing.dm" +// #include "outfit_sanity.dm" +// #include "pills.dm" +// #include "plantgrowth_tests.dm" +// #include "projectiles.dm" #include "reagent_id_typos.dm" +// #include "reagent_mod_expose.dm" +// #include "reagent_mod_procs.dm" #include "reagent_recipe_collisions.dm" +#include "resist.dm" +// #include "say.dm" +// #include "serving_tray.dm" +// #include "siunit.dm" #include "spawn_humans.dm" +// #include "species_whitelists.dm" +// #include "stomach.dm" #include "subsystem_init.dm" +#include "surgeries.dm" +#include "teleporters.dm" #include "timer_sanity.dm" #include "unit_test.dm" + +/// CIT TESTS +#include "character_saving.dm" + +#undef TEST_ASSERT +#undef TEST_ASSERT_EQUAL +#undef TEST_ASSERT_NOTEQUAL +#undef TEST_FOCUS #endif diff --git a/code/modules/unit_tests/anchored_mobs.dm b/code/modules/unit_tests/anchored_mobs.dm index 5324179bb7..103b97e7a9 100644 --- a/code/modules/unit_tests/anchored_mobs.dm +++ b/code/modules/unit_tests/anchored_mobs.dm @@ -6,4 +6,4 @@ L += "[i]" if(!L.len) return //passed! - Fail("The following mobs are defined as anchored. This is incompatible with the new move force/resist system and needs to be revised.: [L.Join(" ")]") \ No newline at end of file + Fail("The following mobs are defined as anchored. This is incompatible with the new move force/resist system and needs to be revised.: [L.Join(" ")]") diff --git a/code/modules/unit_tests/bespoke_id.dm b/code/modules/unit_tests/bespoke_id.dm new file mode 100644 index 0000000000..06676c626c --- /dev/null +++ b/code/modules/unit_tests/bespoke_id.dm @@ -0,0 +1,8 @@ +/datum/unit_test/bespoke_id/Run() + var/datum/element/base = /datum/element + var/base_index = initial(base.id_arg_index) + + for(var/i in subtypesof(/datum/element)) + var/datum/element/faketype = i + if((initial(faketype.element_flags) & ELEMENT_BESPOKE) && initial(faketype.id_arg_index) == base_index) + Fail("A bespoke element was not configured with a proper id_arg_index: [faketype]") diff --git a/code/modules/unit_tests/binary_insert.dm b/code/modules/unit_tests/binary_insert.dm new file mode 100644 index 0000000000..ac7f58208e --- /dev/null +++ b/code/modules/unit_tests/binary_insert.dm @@ -0,0 +1,26 @@ +/// A test to ensure the sanity of BINARY_INSERT +/datum/unit_test/binary_insert/Run() + var/list/datum/binary_insert_node/nodes = list() + + var/datum/binary_insert_node/node_a = new /datum/binary_insert_node(10) + BINARY_INSERT(node_a, nodes, /datum/binary_insert_node, node_a, x, COMPARE_KEY) + TEST_ASSERT_EQUAL(nodes.len, 1, "List should have one node") + + var/datum/binary_insert_node/node_b = new /datum/binary_insert_node(5) + BINARY_INSERT(node_b, nodes, /datum/binary_insert_node, node_b, x, COMPARE_KEY) + TEST_ASSERT_EQUAL(nodes.len, 2, "List should have two nodes") + TEST_ASSERT_EQUAL(nodes[1].x, 5, "The first node should be the one with 5") + TEST_ASSERT_EQUAL(nodes[2].x, 10, "The second node should be the one with 10") + + var/datum/binary_insert_node/node_c = new /datum/binary_insert_node(15) + BINARY_INSERT(node_c, nodes, /datum/binary_insert_node, node_c, x, COMPARE_KEY) + TEST_ASSERT_EQUAL(nodes.len, 3, "List should have three nodes") + TEST_ASSERT_EQUAL(nodes[1].x, 5, "The first node should be the one with 5") + TEST_ASSERT_EQUAL(nodes[2].x, 10, "The second node should be the one with 10") + TEST_ASSERT_EQUAL(nodes[3].x, 15, "The third node should be the one with 15") + +/datum/binary_insert_node + var/x + +/datum/binary_insert_node/New(_x) + x = _x diff --git a/code/modules/unit_tests/card_mismatch.dm b/code/modules/unit_tests/card_mismatch.dm new file mode 100644 index 0000000000..506e88f19c --- /dev/null +++ b/code/modules/unit_tests/card_mismatch.dm @@ -0,0 +1,7 @@ +/datum/unit_test/card_mismatch + +/datum/unit_test/card_mismatch/Run() + var/message = checkCardpacks(SStrading_card_game.card_packs) + message += checkCardDatums() + if(message) + Fail(message) diff --git a/code/modules/unit_tests/chain_pull_through_space.dm b/code/modules/unit_tests/chain_pull_through_space.dm new file mode 100644 index 0000000000..ffdd1bf7c9 --- /dev/null +++ b/code/modules/unit_tests/chain_pull_through_space.dm @@ -0,0 +1,62 @@ +/datum/unit_test/chain_pull_through_space + var/turf/open/space/space_tile + var/turf/claimed_tile + var/mob/living/carbon/human/alice + var/mob/living/carbon/human/bob + var/mob/living/carbon/human/charlie + +/datum/unit_test/chain_pull_through_space/New() + ..() + + // Create a space tile that goes to another z-level + claimed_tile = run_loc_bottom_left + + space_tile = new(locate(run_loc_bottom_left.x, run_loc_bottom_left.y, run_loc_bottom_left.z)) + space_tile.destination_x = 100 + space_tile.destination_y = 100 + space_tile.destination_z = 5 + + // Create our list of humans, all adjacent to one another + alice = new(locate(run_loc_bottom_left.x + 2, run_loc_bottom_left.y, run_loc_bottom_left.z)) + alice.name = "Alice" + + bob = new(locate(run_loc_bottom_left.x + 3, run_loc_bottom_left.y, run_loc_bottom_left.z)) + bob.name = "Bob" + + charlie = new(locate(run_loc_bottom_left.x + 4, run_loc_bottom_left.y, run_loc_bottom_left.z)) + charlie.name = "Charlie" + +/datum/unit_test/chain_pull_through_space/Destroy() + space_tile.copyTurf(claimed_tile) + qdel(alice) + qdel(bob) + qdel(charlie) + return ..() + +/datum/unit_test/chain_pull_through_space/Run() + // Alice pulls Bob, who pulls Charlie + // Normally, when Alice moves forward, the rest follow + alice.start_pulling(bob) + bob.start_pulling(charlie) + + // Walk normally to the left, make sure we're still a chain + alice.Move(locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z)) + if (bob.x != run_loc_bottom_left.x + 2) + return Fail("During normal move, Bob was not at the correct x ([bob.x])") + if (charlie.x != run_loc_bottom_left.x + 3) + return Fail("During normal move, Charlie was not at the correct x ([charlie.x])") + + // We're going through the space turf now that should teleport us + alice.Move(run_loc_bottom_left) + if (alice.z != space_tile.destination_z) + return Fail("Alice did not teleport to the destination z-level. Current location: ([alice.x], [alice.y], [alice.z])") + + if (bob.z != space_tile.destination_z) + return Fail("Bob did not teleport to the destination z-level. Current location: ([bob.x], [bob.y], [bob.z])") + if (!bob.Adjacent(alice)) + return Fail("Bob is not adjacent to Alice. Bob is at [bob.x], Alice is at [alice.x]") + + if (charlie.z != space_tile.destination_z) + return Fail("Charlie did not teleport to the destination z-level. Current location: ([charlie.x], [charlie.y], [charlie.z])") + if (!charlie.Adjacent(bob)) + return Fail("Charlie is not adjacent to Bob. Charlie is at [charlie.x], Bob is at [bob.x]") diff --git a/code/modules/unit_tests/combat.dm b/code/modules/unit_tests/combat.dm new file mode 100644 index 0000000000..30bad72175 --- /dev/null +++ b/code/modules/unit_tests/combat.dm @@ -0,0 +1,98 @@ +/datum/unit_test/harm_punch/Run() + var/mob/living/carbon/human/puncher = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + + // Avoid all randomness in tests + ADD_TRAIT(puncher, TRAIT_PERFECT_ATTACKER, INNATE_TRAIT) + + puncher.a_intent_change(INTENT_HARM) + victim.attack_hand(puncher) + + TEST_ASSERT(victim.getBruteLoss() > 0, "Victim took no brute damage after being punched") + +/datum/unit_test/harm_melee/Run() + var/mob/living/carbon/human/tider = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + var/obj/item/storage/toolbox/toolbox = allocate(/obj/item/storage/toolbox) + + tider.put_in_active_hand(toolbox, forced = TRUE) + tider.a_intent_change(INTENT_HARM) + victim.attackby(toolbox, tider) + + TEST_ASSERT(victim.getBruteLoss() > 0, "Victim took no brute damage after being hit by a toolbox") + +/datum/unit_test/harm_different_damage/Run() + var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + var/obj/item/weldingtool/welding_tool = allocate(/obj/item/weldingtool) + + attacker.put_in_active_hand(welding_tool, forced = TRUE) + attacker.a_intent_change(INTENT_HARM) + welding_tool.attack_self(attacker) // Turn it on + victim.attackby(welding_tool, attacker) + + TEST_ASSERT_EQUAL(victim.getBruteLoss(), 0, "Victim took brute damage from a lit welding tool") + TEST_ASSERT(victim.getFireLoss() > 0, "Victim took no burn damage after being hit by a lit welding tool") + +/datum/unit_test/attack_chain + var/attack_hit + var/post_attack_hit + var/pre_attack_hit + +/datum/unit_test/attack_chain/proc/attack_hit() + attack_hit = TRUE + +/datum/unit_test/attack_chain/proc/post_attack_hit() + post_attack_hit = TRUE + +/datum/unit_test/attack_chain/proc/pre_attack_hit() + pre_attack_hit = TRUE + +/datum/unit_test/attack_chain/Run() + var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + var/obj/item/storage/toolbox/toolbox = allocate(/obj/item/storage/toolbox) + + RegisterSignal(toolbox, COMSIG_ITEM_PRE_ATTACK, .proc/pre_attack_hit) + RegisterSignal(toolbox, COMSIG_ITEM_ATTACK, .proc/attack_hit) + RegisterSignal(toolbox, COMSIG_ITEM_AFTERATTACK, .proc/post_attack_hit) + + attacker.put_in_active_hand(toolbox, forced = TRUE) + attacker.a_intent_change(INTENT_HARM) + toolbox.melee_attack_chain(attacker, victim) + + TEST_ASSERT(pre_attack_hit, "Pre-attack signal was not fired") + TEST_ASSERT(attack_hit, "Attack signal was not fired") + TEST_ASSERT(post_attack_hit, "Post-attack signal was not fired") + +/datum/unit_test/disarm/Run() + var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + var/obj/item/storage/toolbox/toolbox = allocate(/obj/item/storage/toolbox) + + victim.put_in_active_hand(toolbox, forced = TRUE) + attacker.a_intent_change(INTENT_DISARM) + + var/obj/structure/barricade/dense_object = allocate(/obj/structure/barricade) + + // Attacker --> Victim --> Empty space --> Wall + attacker.forceMove(run_loc_bottom_left) + victim.forceMove(locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z)) + dense_object.forceMove(locate(run_loc_bottom_left.x + 3, run_loc_bottom_left.y, run_loc_bottom_left.z)) + + // First disarm, world should now look like: + // Attacker --> Empty space --> Victim --> Wall + victim.attack_hand(attacker) + + TEST_ASSERT_EQUAL(victim.loc.x, run_loc_bottom_left.x + 2, "Victim wasn't moved back after being pushed") + TEST_ASSERT(!victim.has_status_effect(STATUS_EFFECT_KNOCKDOWN), "Victim was knocked down despite not being against a wall") + TEST_ASSERT_EQUAL(victim.get_active_held_item(), toolbox, "Victim dropped toolbox despite not being against a wall") + + attacker.forceMove(get_step(attacker, EAST)) + + // Second disarm, victim was against wall and should be down + victim.attack_hand(attacker) + + TEST_ASSERT_EQUAL(victim.loc.x, run_loc_bottom_left.x + 2, "Victim was moved after being pushed against a wall") + TEST_ASSERT(victim.has_status_effect(STATUS_EFFECT_KNOCKDOWN), "Victim was not knocked down after being pushed against a wall") + TEST_ASSERT_EQUAL(victim.get_active_held_item(), null, "Victim didn't drop toolbox after being pushed against a wall") diff --git a/code/modules/unit_tests/component_tests.dm b/code/modules/unit_tests/component_tests.dm index 409d7f4322..0099d7508c 100644 --- a/code/modules/unit_tests/component_tests.dm +++ b/code/modules/unit_tests/component_tests.dm @@ -9,4 +9,4 @@ if(dupe_type && !ispath(dupe_type)) bad_dts += t if(length(bad_dms) || length(bad_dts)) - Fail("Components with invalid dupe modes: ([bad_dms.Join(",")]) ||| Components with invalid dupe types: ([bad_dts.Join(",")])") \ No newline at end of file + Fail("Components with invalid dupe modes: ([bad_dms.Join(",")]) ||| Components with invalid dupe types: ([bad_dts.Join(",")])") diff --git a/code/modules/unit_tests/confusion.dm b/code/modules/unit_tests/confusion.dm new file mode 100644 index 0000000000..8282493c96 --- /dev/null +++ b/code/modules/unit_tests/confusion.dm @@ -0,0 +1,16 @@ +// Checks that the confusion symptom correctly gives, and removes, confusion +/datum/unit_test/confusion_symptom/Run() + var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human) + var/datum/disease/advance/confusion/disease = allocate(/datum/disease/advance/confusion) + var/datum/symptom/confusion/confusion = disease.symptoms[1] + disease.processing = TRUE + disease.update_stage(5) + disease.infect(H, make_copy = FALSE) + confusion.Activate(disease) + TEST_ASSERT(H.get_confusion() > 0, "Human is not confused after getting symptom.") + disease.cure() + TEST_ASSERT_EQUAL(H.get_confusion(), 0, "Human is still confused after curing confusion.") + +/datum/disease/advance/confusion/New() + symptoms += new /datum/symptom/confusion + Refresh() diff --git a/code/modules/unit_tests/emoting.dm b/code/modules/unit_tests/emoting.dm new file mode 100644 index 0000000000..5795ab3437 --- /dev/null +++ b/code/modules/unit_tests/emoting.dm @@ -0,0 +1,25 @@ +/datum/unit_test/emoting + var/emotes_used = 0 + +/datum/unit_test/emoting/Run() + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + RegisterSignal(human, COMSIG_MOB_EMOTE, .proc/on_emote_used) + + human.say("*shrug") + TEST_ASSERT_EQUAL(emotes_used, 1, "Human did not shrug") + + human.say("*beep") + TEST_ASSERT_EQUAL(emotes_used, 1, "Human beeped, when that should be restricted to silicons") + + human.setOxyLoss(140) + + TEST_ASSERT(human.stat != CONSCIOUS, "Human is somehow conscious after receiving suffocation damage") + + human.say("*shrug") + TEST_ASSERT_EQUAL(emotes_used, 1, "Human shrugged while unconscious") + + human.say("*deathgasp") + TEST_ASSERT_EQUAL(emotes_used, 2, "Human could not deathgasp while unconscious") + +/datum/unit_test/emoting/proc/on_emote_used() + emotes_used += 1 diff --git a/code/modules/unit_tests/heretic_knowledge.dm b/code/modules/unit_tests/heretic_knowledge.dm new file mode 100644 index 0000000000..a433bce1ec --- /dev/null +++ b/code/modules/unit_tests/heretic_knowledge.dm @@ -0,0 +1,21 @@ +/// This test checks all heretic knowledge nodes - excluding the ones which are unreachable on purpose - and ensures players can reach them in game. +/// If it finds a node that is unreachable, it throws an error. +/datum/unit_test/heretic_knowledge/Run() + ///List of all knowledge excluding the unreachable base types. + var/list/blacklist = list(/datum/eldritch_knowledge/spell,/datum/eldritch_knowledge/curse,/datum/eldritch_knowledge/final,/datum/eldritch_knowledge/summon) + var/list/all_possible_knowledge = subtypesof(/datum/eldritch_knowledge) - blacklist + + var/list/list_to_check = GLOB.heretic_start_knowledge.Copy() + var/i = 0 + while(i < length(list_to_check)) + var/datum/eldritch_knowledge/eldritch_knowledge = allocate(list_to_check[++i]) + for(var/next_knowledge in eldritch_knowledge.next_knowledge) + if(next_knowledge in list_to_check) + continue + list_to_check += next_knowledge + + if(length(all_possible_knowledge) != length(all_possible_knowledge & list_to_check)) + var/list/unreachables = all_possible_knowledge - list_to_check + for(var/X in unreachables) + var/datum/eldritch_knowledge/eldritch_knowledge = X + Fail("[initial(eldritch_knowledge.name)] is unreachable by players! Add it to the blacklist in /code/modules/unit_tests/heretic_knowledge.dm if it is purposeful!") diff --git a/code/modules/unit_tests/holidays.dm b/code/modules/unit_tests/holidays.dm new file mode 100644 index 0000000000..4df5443e2e --- /dev/null +++ b/code/modules/unit_tests/holidays.dm @@ -0,0 +1,33 @@ +// test Jewish holiday +/datum/unit_test/hanukkah_2123/Run() + var/datum/holiday/hebrew/hanukkah/hanukkah = new + TEST_ASSERT(hanukkah.shouldCelebrate(14, DECEMBER, 2123, 2, TUESDAY), "December 14, 2123 was not Hanukkah.") + +// test Islamic holiday +/datum/unit_test/ramadan_2165/Run() + var/datum/holiday/islamic/ramadan/ramadan = new + TEST_ASSERT(ramadan.shouldCelebrate(6, NOVEMBER, 2165, 1, WEDNESDAY), "November 6, 2165 was not Ramadan.") + +// nth day of week +/datum/unit_test/thanksgiving_2020/Run() + var/datum/holiday/nth_week/thanksgiving/thanksgiving = new + TEST_ASSERT(thanksgiving.shouldCelebrate(26, NOVEMBER, 2020, 4, THURSDAY), "November 26, 2020 was not Thanksgiving.") + +// another nth day of week +/datum/unit_test/indigenous_3683/Run() + var/datum/holiday/nth_week/indigenous/indigenous = new + TEST_ASSERT(indigenous.shouldCelebrate(11, OCTOBER, 3683, 2, MONDAY), "October 11, 3683 was not Indigenous Peoples' Day.") + +// plain old simple holiday +/datum/unit_test/hello_2020/Run() + var/datum/holiday/hello/hello = new + TEST_ASSERT(hello.shouldCelebrate(21, NOVEMBER, 2020, 3, SATURDAY), "November 21, 2020 was not Hello day.") + +// holiday which goes across months +/datum/unit_test/new_year_1983/Run() + var/datum/holiday/new_year/new_year = new + TEST_ASSERT(new_year.shouldCelebrate(2, JANUARY, 1983, 1, SUNDAY), "January 2, 1983 was not New Year.") + +/datum/unit_test/moth_week_2020/Run() + var/datum/holiday/moth/moth = new + TEST_ASSERT(moth.shouldCelebrate(19, JULY, 2020, 3, SATURDAY), "July 19, 2020 was not Moth Week.") diff --git a/code/modules/unit_tests/initialize_sanity.dm b/code/modules/unit_tests/initialize_sanity.dm new file mode 100644 index 0000000000..d183f530c8 --- /dev/null +++ b/code/modules/unit_tests/initialize_sanity.dm @@ -0,0 +1,11 @@ +/datum/unit_test/initialize_sanity/Run() + if(length(SSatoms.BadInitializeCalls)) + Fail("Bad Initialize() calls detected. Please read logs.") + var/list/init_failures_to_text = list( + "[BAD_INIT_QDEL_BEFORE]" = "Qdeleted Before Initialized", + "[BAD_INIT_DIDNT_INIT]" = "Did Not Initialize", + "[BAD_INIT_SLEPT]" = "Initialize() Slept", + "[BAD_INIT_NO_HINT]" = "No Initialize() Hint Returned", + ) + for(var/failure in SSatoms.BadInitializeCalls) + log_world("[failure]: [init_failures_to_text["[SSatoms.BadInitializeCalls[failure]]"]]") // You like stacked brackets? diff --git a/code/modules/unit_tests/keybinding_init.dm b/code/modules/unit_tests/keybinding_init.dm new file mode 100644 index 0000000000..2bd2fdee1e --- /dev/null +++ b/code/modules/unit_tests/keybinding_init.dm @@ -0,0 +1,6 @@ +/datum/unit_test/keybinding_init/Run() + for(var/i in subtypesof(/datum/keybinding)) + var/datum/keybinding/KB = i + if(initial(KB.keybind_signal) || !initial(KB.name)) + continue + Fail("[KB.name] does not have a keybind signal defined.") diff --git a/code/modules/unit_tests/machine_disassembly.dm b/code/modules/unit_tests/machine_disassembly.dm new file mode 100644 index 0000000000..59edb4ae9d --- /dev/null +++ b/code/modules/unit_tests/machine_disassembly.dm @@ -0,0 +1,12 @@ +/// Ensures that when disassembling a machine, all the parts are given back +/datum/unit_test/machine_disassembly/Run() + var/obj/machinery/freezer = allocate(/obj/machinery/atmospherics/components/unary/thermomachine/freezer) + + var/turf/freezer_location = freezer.loc + freezer.deconstruct() + + // Check that the components are created + TEST_ASSERT(locate(/obj/item/stock_parts/micro_laser) in freezer_location, "Couldn't find micro-laser when disassembling freezer") + + // Check that the circuit board itself is created + TEST_ASSERT(locate(/obj/item/circuitboard/machine/thermomachine) in freezer_location, "Couldn't find the circuit board when disassembling freezer") diff --git a/code/modules/unit_tests/medical_wounds.dm b/code/modules/unit_tests/medical_wounds.dm new file mode 100644 index 0000000000..75c08931f1 --- /dev/null +++ b/code/modules/unit_tests/medical_wounds.dm @@ -0,0 +1,87 @@ +/// This test is used to make sure a flesh-and-bone base human can suffer all the types of wounds, and that suffering more severe wounds removes and replaces the lesser wound. Also tests that [/mob/living/carbon/proc/fully_heal] removes all wounds +/datum/unit_test/test_human_base/Run() + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + + /// the limbs have no wound resistance like the chest and head do, so let's go with the r_arm + var/obj/item/bodypart/tested_part = victim.get_bodypart(BODY_ZONE_R_ARM) + /// In order of the wound types we're trying to inflict, what sharpness do we need to deal them? + var/list/sharps = list(SHARP_NONE, SHARP_EDGED, SHARP_POINTY, SHARP_NONE) + /// Since burn wounds need burn damage, duh + var/list/dam_types = list(BRUTE, BRUTE, BRUTE, BURN) + + var/i = 1 + var/list/iter_test_wound_list + + for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ + list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ + list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ + list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + + TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") + var/datum/wound/iter_test_wound + var/threshold_penalty = 0 + + for(iter_test_wound in iter_test_wound_list) + var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + if(dam_types[i] == BRUTE) + tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) + else if(dam_types[i] == BURN) + tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) + + TEST_ASSERT(length(victim.all_wounds), "Patient has no wounds when one wound is expected. Severity: [initial(iter_test_wound.severity)]") + TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + var/datum/wound/actual_wound = victim.all_wounds[1] + TEST_ASSERT_EQUAL(actual_wound.type, iter_test_wound, "Patient has wound of incorrect severity. Expected: [initial(iter_test_wound.name)] Got: [actual_wound]") + threshold_penalty = actual_wound.threshold_penalty + i++ + victim.fully_heal(TRUE) // should clear all wounds between types + + +/// This test is used for making sure species with bones but no flesh (skeletons, plasmamen) can only suffer BONE_WOUNDS, and nothing tagged with FLESH_WOUND (it's possible to require both) +/datum/unit_test/test_human_bone/Run() + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + + /// the limbs have no wound resistance like the chest and head do, so let's go with the r_arm + var/obj/item/bodypart/tested_part = victim.get_bodypart(BODY_ZONE_R_ARM) + /// In order of the wound types we're trying to inflict, what sharpness do we need to deal them? + var/list/sharps = list(SHARP_NONE, SHARP_EDGED, SHARP_POINTY, SHARP_NONE) + /// Since burn wounds need burn damage, duh + var/list/dam_types = list(BRUTE, BRUTE, BRUTE, BURN) + + var/i = 1 + var/list/iter_test_wound_list + victim.dna.species.species_traits &= HAS_FLESH // take away the base human's flesh (ouchie!) ((not actually ouchie, this just affects their wounds and dismemberment handling)) + + for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ + list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ + list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ + list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + + TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") + var/datum/wound/iter_test_wound + var/threshold_penalty = 0 + + for(iter_test_wound in iter_test_wound_list) + var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + if(dam_types[i] == BRUTE) + tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) + else if(dam_types[i] == BURN) + tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) + + // so if we just tried to deal a flesh wound, make sure we didn't actually suffer it. We may have suffered a bone wound instead, but we just want to make sure we don't have a flesh wound + if(initial(iter_test_wound.wound_flags) & FLESH_WOUND) + if(!length(victim.all_wounds)) // not having a wound is good news + continue + else // we have to check that it's actually a bone wound and not the intended wound type + TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + var/datum/wound/actual_wound = victim.all_wounds[1] + TEST_ASSERT((actual_wound.wound_flags & ~FLESH_WOUND), "Patient has flesh wound despite no HAS_FLESH flag, expected either no wound or bone wound. Offending wound: [actual_wound]") + threshold_penalty = actual_wound.threshold_penalty + else // otherwise if it's a bone wound, check that we have it per usual + TEST_ASSERT(length(victim.all_wounds), "Patient has no wounds when one wound is expected. Severity: [initial(iter_test_wound.severity)]") + TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + var/datum/wound/actual_wound = victim.all_wounds[1] + TEST_ASSERT_EQUAL(actual_wound.type, iter_test_wound, "Patient has wound of incorrect severity. Expected: [initial(iter_test_wound.name)] Got: [actual_wound]") + threshold_penalty = actual_wound.threshold_penalty + i++ + victim.fully_heal(TRUE) // should clear all wounds between types diff --git a/code/modules/unit_tests/merge_type.dm b/code/modules/unit_tests/merge_type.dm new file mode 100644 index 0000000000..ba3cfcf492 --- /dev/null +++ b/code/modules/unit_tests/merge_type.dm @@ -0,0 +1,15 @@ +/datum/unit_test/merge_type/Run() + var/list/blacklist = list(/obj/item/stack/sheet, + /obj/item/stack/sheet/mineral, + /obj/item/stack/ore, + /obj/item/stack/spacecash, + // /obj/item/stack/license_plates, + /obj/item/stack/tile/mineral, + /obj/item/stack/tile) + + var/list/paths = subtypesof(/obj/item/stack) - blacklist + + for(var/stackpath in paths) + var/obj/item/stack/stack = stackpath + if(!initial(stack.merge_type)) + Fail("([stack]) lacks set merge_type variable!") diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm new file mode 100644 index 0000000000..b7f8fc4f6a --- /dev/null +++ b/code/modules/unit_tests/metabolizing.dm @@ -0,0 +1,38 @@ +/datum/unit_test/metabolization/Run() + // Pause natural mob life so it can be handled entirely by the test + SSmobs.pause() + + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + var/mob/living/carbon/monkey/monkey = allocate(/mob/living/carbon/monkey) + + for (var/reagent_type in subtypesof(/datum/reagent)) + test_reagent(human, reagent_type) + test_reagent(monkey, reagent_type) + +/datum/unit_test/metabolization/proc/test_reagent(mob/living/carbon/C, reagent_type) + C.reagents.add_reagent(reagent_type, 10) + C.reagents.metabolize(C, can_overdose = TRUE) + C.reagents.clear_reagents() + +/datum/unit_test/metabolization/Destroy() + SSmobs.ignite() + return ..() + +/datum/unit_test/on_mob_end_metabolize/Run() + var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + var/obj/item/reagent_containers/pill/pill = allocate(/obj/item/reagent_containers/pill) + var/datum/reagent/drug/methamphetamine/meth = /datum/reagent/drug/methamphetamine + + // Give them enough meth to be consumed in 2 metabolizations + pill.reagents.add_reagent(meth, initial(meth.metabolization_rate) * 1.9) + pill.attack(user, user) + + user.Life() + + TEST_ASSERT(user.reagents.has_reagent(meth), "User does not have meth in their system after consuming it") + TEST_ASSERT(user.has_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine), "User consumed meth, but did not gain movespeed modifier") + + user.Life() + + TEST_ASSERT(!user.reagents.has_reagent(meth), "User still has meth in their system when it should've finished metabolizing") + TEST_ASSERT(!user.has_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine), "User still has movespeed modifier despite not containing any more meth") diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm new file mode 100644 index 0000000000..57ce22434e --- /dev/null +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -0,0 +1,50 @@ +#define CHECK_OUTFIT_SLOT(outfit_key, slot_name) if (outfit.##outfit_key) { \ + H.equip_to_slot_or_del(new outfit.##outfit_key(H), ##slot_name, TRUE); \ + /* We don't check the result of equip_to_slot_or_del because it returns false for random jumpsuits, as they delete themselves on init */ \ + if (!H.get_item_by_slot(##slot_name)) { \ + Fail("[outfit.name]'s [#outfit_key] is invalid!"); \ + } \ +} + +/datum/unit_test/outfit_sanity/Run() + var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human) + + for (var/outfit_type in subtypesof(/datum/outfit)) + // Only make one human and keep undressing it because it's much faster + for (var/obj/item/I in H.get_equipped_items(include_pockets = TRUE)) + qdel(I) + + var/datum/outfit/outfit = new outfit_type + outfit.pre_equip(H, TRUE) + + CHECK_OUTFIT_SLOT(uniform, ITEM_SLOT_ICLOTHING) + CHECK_OUTFIT_SLOT(suit, ITEM_SLOT_OCLOTHING) + CHECK_OUTFIT_SLOT(back, ITEM_SLOT_BACK) + CHECK_OUTFIT_SLOT(belt, ITEM_SLOT_BELT) + CHECK_OUTFIT_SLOT(gloves, ITEM_SLOT_GLOVES) + CHECK_OUTFIT_SLOT(shoes, ITEM_SLOT_FEET) + CHECK_OUTFIT_SLOT(head, ITEM_SLOT_HEAD) + CHECK_OUTFIT_SLOT(mask, ITEM_SLOT_MASK) + CHECK_OUTFIT_SLOT(neck, ITEM_SLOT_NECK) + CHECK_OUTFIT_SLOT(ears, ITEM_SLOT_EARS) + CHECK_OUTFIT_SLOT(glasses, ITEM_SLOT_EYES) + CHECK_OUTFIT_SLOT(id, ITEM_SLOT_ID) + CHECK_OUTFIT_SLOT(suit_store, ITEM_SLOT_SUITSTORE) + CHECK_OUTFIT_SLOT(l_pocket, ITEM_SLOT_LPOCKET) + CHECK_OUTFIT_SLOT(r_pocket, ITEM_SLOT_RPOCKET) + + if (outfit.backpack_contents || outfit.box) + var/list/backpack_contents = outfit.backpack_contents?.Copy() + if (outfit.box) + if (!backpack_contents) + backpack_contents = list() + backpack_contents.Insert(1, outfit.box) + backpack_contents[outfit.box] = 1 + + for (var/path in backpack_contents) + var/number = backpack_contents[path] || 1 + for (var/_ in 1 to number) + if (!H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE)) + Fail("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.") + +#undef CHECK_OUTFIT_SLOT diff --git a/code/modules/unit_tests/pills.dm b/code/modules/unit_tests/pills.dm new file mode 100644 index 0000000000..ed8f64ce95 --- /dev/null +++ b/code/modules/unit_tests/pills.dm @@ -0,0 +1,10 @@ +/datum/unit_test/pills/Run() + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + var/obj/item/reagent_containers/pill/iron/pill = allocate(/obj/item/reagent_containers/pill/iron) + + TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/iron), FALSE, "Human somehow has iron before taking pill") + + pill.attack(human, human) + human.Life() + + TEST_ASSERT(human.has_reagent(/datum/reagent/iron), "Human doesn't have iron after taking pill") diff --git a/code/modules/unit_tests/plantgrowth_tests.dm b/code/modules/unit_tests/plantgrowth_tests.dm new file mode 100644 index 0000000000..6b40236860 --- /dev/null +++ b/code/modules/unit_tests/plantgrowth_tests.dm @@ -0,0 +1,27 @@ + +// Checks plants for broken tray icons. Use Advanced Proc Call to activate. +// Maybe some day it would be used as unit test. +// -------- IT IS NOW! +/datum/unit_test/plantgrowth/Run() + var/list/states = icon_states('icons/obj/hydroponics/growing.dmi') + states |= icon_states('icons/obj/hydroponics/growing_fruits.dmi') + states |= icon_states('icons/obj/hydroponics/growing_flowers.dmi') + states |= icon_states('icons/obj/hydroponics/growing_mushrooms.dmi') + states |= icon_states('icons/obj/hydroponics/growing_vegetables.dmi') + states |= icon_states('goon/icons/obj/hydroponics.dmi') + var/list/paths = subtypesof(/obj/item/seeds) - /obj/item/seeds - typesof(/obj/item/seeds/sample) - /obj/item/seeds/lavaland + + for(var/seedpath in paths) + var/obj/item/seeds/seed = new seedpath + + for(var/i in 1 to seed.growthstages) + if("[seed.icon_grow][i]" in states) + continue + Fail("[seed.name] ([seed.type]) lacks the [seed.icon_grow][i] icon!") + + if(!(seed.icon_dead in states)) + Fail("[seed.name] ([seed.type]) lacks the [seed.icon_dead] icon!") + + if(seed.icon_harvest) // mushrooms have no grown sprites, same for items with no product + if(!(seed.icon_harvest in states)) + Fail("[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!") diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm new file mode 100644 index 0000000000..53ceef01d6 --- /dev/null +++ b/code/modules/unit_tests/projectiles.dm @@ -0,0 +1,5 @@ +/datum/unit_test/projectile_movetypes/Run() + for(var/path in typesof(/obj/item/projectile)) + var/obj/projectile/projectile = path + if(initial(projectile.movement_type) & PHASING) + Fail("[path] has default movement type PHASING. Piercing projectiles should be done using the projectile piercing system, not movement_types!") diff --git a/code/modules/unit_tests/quick_swap_sanity.dm b/code/modules/unit_tests/quick_swap_sanity.dm new file mode 100644 index 0000000000..85e73f9b6a --- /dev/null +++ b/code/modules/unit_tests/quick_swap_sanity.dm @@ -0,0 +1,31 @@ +/// Test that quick swap correctly swaps items and invalidates suit storage +/datum/unit_test/quick_swap_sanity/Run() + // Create a human with a medical winter coat and a health analyzer in suit storage + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + + var/obj/item/coat = allocate(/obj/item/clothing/suit/hooded/wintercoat/medical) + TEST_ASSERT(human.equip_to_slot_if_possible(coat, ITEM_SLOT_OCLOTHING), "Couldn't equip winter coat") + + var/obj/item/analyzer = allocate(/obj/item/healthanalyzer) + TEST_ASSERT(human.equip_to_slot_if_possible(analyzer, ITEM_SLOT_SUITSTORE), "Couldn't equip health analyzer") + + // Then, have them quick swap between the coat and a space suit + var/obj/item/hardsuit = allocate(/obj/item/clothing/suit/space/hardsuit) + TEST_ASSERT(human.equip_to_appropriate_slot(hardsuit, swap = TRUE), "Couldn't quick swap to hardsuit") + + // Check if the human has the hardsuit on + TEST_ASSERT_EQUAL(human.wear_suit, hardsuit, "Human didn't equip the hardsuit") + + // Make sure the health analyzer was dropped as part of the swap + // Since health analyzers are an invalid suit storage item + TEST_ASSERT_EQUAL(human.s_store, null, "Human didn't drop the health analyzer") + + // Give the human an emergency oxygen tank + // This is valid suit storage for both the winter coat AND the hardsuit + var/obj/item/tank = allocate(/obj/item/tank/internals/emergency_oxygen) + TEST_ASSERT(human.equip_to_slot_if_possible(tank, ITEM_SLOT_SUITSTORE), "Couldn't equip emergency oxygen tank") + + // Now, quick swap back to the coat + // Since the tank is a valid suit storage item, it should not be dropped + TEST_ASSERT(human.equip_to_appropriate_slot(coat, swap = TRUE), "Couldn't quick swap to coat") + TEST_ASSERT_EQUAL(human.s_store, tank, "Human dropped the oxygen tank, when it was a valid item to keep in suit storage") diff --git a/code/modules/unit_tests/reagent_mod_expose.dm b/code/modules/unit_tests/reagent_mod_expose.dm new file mode 100644 index 0000000000..3fe02e044d --- /dev/null +++ b/code/modules/unit_tests/reagent_mod_expose.dm @@ -0,0 +1,59 @@ +// testing the mob expose procs are working + +/datum/reagent/method_patch_test + name = "method patch test" + +/datum/reagent/method_patch_test/expose_mob(mob/living/target, methods = PATCH, reac_volume, show_message = TRUE) + . = ..() + if(methods & PATCH) + target.health = 90 + if(methods & INJECT) + target.health = 80 + +/datum/unit_test/reagent_mob_expose/Run() + // Life() is handled just by tests + SSmobs.pause() + + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + var/obj/item/reagent_containers/dropper/dropper = allocate(/obj/item/reagent_containers/dropper) + var/obj/item/reagent_containers/food/drinks/drink = allocate(/obj/item/reagent_containers/food/drinks/bottle) + var/obj/item/reagent_containers/pill/patch/patch = allocate(/obj/item/reagent_containers/pill/patch) + var/obj/item/reagent_containers/syringe/syringe = allocate(/obj/item/reagent_containers/syringe) + + // INGEST + TEST_ASSERT_EQUAL(human.fire_stacks, 0, "Human has fire stacks before taking phlogiston") + drink.reagents.add_reagent(/datum/reagent/phlogiston, 10) + drink.attack(human, human) + TEST_ASSERT_EQUAL(human.fire_stacks, 1, "Human does not have fire stacks after taking phlogiston") + human.Life() + TEST_ASSERT(human.fire_stacks > 1, "Human fire stacks did not increase after life tick") + + // TOUCH + dropper.reagents.add_reagent(/datum/reagent/water, 1) + dropper.afterattack(human, human, TRUE) + TEST_ASSERT_EQUAL(human.fire_stacks, 0, "Human still has fire stacks after touching water") + + // VAPOR + TEST_ASSERT_EQUAL(human.drowsyness, 0, "Human is drowsy at the start of testing") + drink.reagents.clear_reagents() + drink.reagents.add_reagent(/datum/reagent/nitrous_oxide, 10) + drink.reagents.trans_to(human, 10, methods = VAPOR) + TEST_ASSERT_NOTEQUAL(human.drowsyness, 0, "Human is not drowsy after exposure to vapors") + + // PATCH + human.health = 100 + TEST_ASSERT_EQUAL(human.health, 100, "Human health did not set properly") + patch.reagents.add_reagent(/datum/reagent/method_patch_test, 1) + patch.self_delay = 0 + patch.attack(human, human) + TEST_ASSERT_EQUAL(human.health, 90, "Human health did not update after patch was applied") + + // INJECT + syringe.reagents.add_reagent(/datum/reagent/method_patch_test, 1) + syringe.mode = SYRINGE_INJECT + syringe.afterattack(human, human, TRUE) + TEST_ASSERT_EQUAL(human.health, 80, "Human health did not update after injection from syringe") + +/datum/unit_test/reagent_mob_expose/Destroy() + SSmobs.ignite() + return ..() diff --git a/code/modules/unit_tests/reagent_mod_procs.dm b/code/modules/unit_tests/reagent_mod_procs.dm new file mode 100644 index 0000000000..a2087f8624 --- /dev/null +++ b/code/modules/unit_tests/reagent_mod_procs.dm @@ -0,0 +1,12 @@ +/datum/unit_test/reagent_mob_procs/Run() + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + var/obj/item/food/hotdog/debug/fooditem = allocate(/obj/item/food/hotdog/debug) + + TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human somehow has ketchup before eating") + TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/medicine/epinephrine), FALSE, "Human somehow has epinephrine before injecting") + + fooditem.attack(human, human) + human.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5) + + TEST_ASSERT(human.has_reagent(/datum/reagent/consumable/ketchup), "Human doesn't have ketchup after eating") + TEST_ASSERT(human.has_reagent(/datum/reagent/medicine/epinephrine), "Human doesn't have epinephrine after injecting") diff --git a/code/modules/unit_tests/resist.dm b/code/modules/unit_tests/resist.dm new file mode 100644 index 0000000000..9fe5cd1114 --- /dev/null +++ b/code/modules/unit_tests/resist.dm @@ -0,0 +1,29 @@ +/// Test that stop, drop, and roll lowers fire stacks +/datum/unit_test/stop_drop_and_roll/Run() + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + + TEST_ASSERT_EQUAL(human.fire_stacks, 0, "Human does not have 0 fire stacks pre-ignition") + + human.adjust_fire_stacks(5) + human.IgniteMob() + + TEST_ASSERT_EQUAL(human.fire_stacks, 5, "Human does not have 5 fire stacks pre-resist") + + // Stop, drop, and roll has a sleep call. This would delay the test, and is not necessary. + CallAsync(human, /mob/living/verb/resist) + + TEST_ASSERT(human.fire_stacks < 5, "Human did not lower fire stacks after resisting") + +/// Test that you can resist out of a container +/datum/unit_test/container_resist/Run() + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + var/obj/structure/closet/closet = allocate(/obj/structure/closet, get_turf(human)) + + closet.open(human) + TEST_ASSERT(!(human in closet.contents), "Human was in the contents of an open closet") + + closet.close(human) + TEST_ASSERT(human in closet.contents, "Human was not in the contents of the closed closet") + + human.resist() + TEST_ASSERT(!(human in closet.contents), "Human resisted out of a standard closet, but was still in it") diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm new file mode 100644 index 0000000000..a7df5ad624 --- /dev/null +++ b/code/modules/unit_tests/say.dm @@ -0,0 +1,23 @@ +/// Test to verify message mods are parsed correctly +/datum/unit_test/get_message_mods + var/mob/host_mob + +/datum/unit_test/get_message_mods/Run() + host_mob = allocate(/mob/living/carbon/human) + + test("Hello", "Hello", list()) + test(";HELP", "HELP", list(MODE_HEADSET = TRUE)) + test(";%Never gonna give you up", "Never gonna give you up", list(MODE_HEADSET = TRUE, MODE_SING = TRUE)) + test(".s Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SECURITY, RADIO_EXTENSION = RADIO_CHANNEL_SECURITY)) + test("...What", "...What", list()) + +/datum/unit_test/get_message_mods/proc/test(message, expected_message, list/expected_mods) + var/list/mods = list() + TEST_ASSERT_EQUAL(host_mob.get_message_mods(message, mods), expected_message, "Chopped message was not what we expected. Message: [message]") + + for (var/mod_key in mods) + TEST_ASSERT_EQUAL(mods[mod_key], expected_mods[mod_key], "The value for [mod_key] was not what we expected. Message: [message]") + expected_mods -= mod_key + + if (expected_mods.len) + Fail("Some message mods were expected, but were not returned by get_message_mods: [json_encode(expected_mods)]. Message: [message]") diff --git a/code/modules/unit_tests/serving_tray.dm b/code/modules/unit_tests/serving_tray.dm new file mode 100644 index 0000000000..00e911ae50 --- /dev/null +++ b/code/modules/unit_tests/serving_tray.dm @@ -0,0 +1,47 @@ +/** + * Check that standard food items fit on the serving tray + */ +/datum/unit_test/servingtray/Run() + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + var/obj/structure/table/the_table = allocate(/obj/structure/table) + var/obj/item/storage/bag/tray/test_tray = allocate(/obj/item/storage/bag/tray) + var/obj/item/reagent_containers/food/banana = allocate(/obj/item/food/rationpack) + var/obj/item/food/the_bread = allocate(/obj/item/food/breadslice) + var/obj/item/reagent_containers/food/sugarcookie = allocate(/obj/item/food/cookie/sugar) + var/obj/item/clothing/under/jumpsuit = allocate(/obj/item/clothing/under/color/black) + + TEST_ASSERT_EQUAL((the_bread in test_tray.contents), FALSE, "The bread is on the serving tray at test start") + + // set the tray to single item mode the dirty way + var/datum/component/storage/tray_storage = test_tray.GetComponent(/datum/component/storage) + tray_storage.collection_mode = COLLECT_ONE + + test_tray.pre_attack(the_bread, human) + + TEST_ASSERT_EQUAL((the_bread in test_tray.contents), TRUE, "The bread did not get picked up by the serving tray") + + test_tray.pre_attack(banana, human) + + TEST_ASSERT_EQUAL((banana in test_tray.contents), TRUE, "The banana did not get picked up by the serving tray") + + the_table.attackby(test_tray, human) + + TEST_ASSERT_EQUAL(test_tray.contents.len, 0, "The serving tray did not drop all items on hitting the table") + + test_tray.pre_attack(sugarcookie, human) + + TEST_ASSERT_EQUAL((sugarcookie in test_tray.contents), TRUE, "The sugarcookie did not get picked up by the serving tray") + + human.equip_to_slot(jumpsuit, ITEM_SLOT_ICLOTHING) + TEST_ASSERT(human.get_item_by_slot(ITEM_SLOT_ICLOTHING), "Human does not have jumpsuit on") + + human.equip_to_slot(test_tray, ITEM_SLOT_LPOCKET) + TEST_ASSERT(human.get_item_by_slot(ITEM_SLOT_LPOCKET), "Serving tray failed to fit in the Left Pocket") + + human.equip_to_slot(test_tray, ITEM_SLOT_RPOCKET) + TEST_ASSERT(human.get_item_by_slot(ITEM_SLOT_RPOCKET), "Serving tray failed to fit in the Right Pocket") + + test_tray.attack(human, human) + + TEST_ASSERT_EQUAL(test_tray.contents.len, 0, "The serving tray did not drop all items on hitting a human") + diff --git a/code/modules/unit_tests/siunit.dm b/code/modules/unit_tests/siunit.dm new file mode 100644 index 0000000000..3a7a25a98d --- /dev/null +++ b/code/modules/unit_tests/siunit.dm @@ -0,0 +1,15 @@ +/datum/unit_test/siunit/Run() + TEST_ASSERT_EQUAL(siunit(0.5345, "A", 0), "535 mA", "") + TEST_ASSERT_EQUAL(siunit(0.5344, "A", 0), "534 mA", "") + TEST_ASSERT_EQUAL(siunit(-0.5344, "A", 0), "-534 mA", "") + TEST_ASSERT_EQUAL(siunit_pressure(1.234, 1), "1.2 kPa", "") // test for pascal require *10e-3, as the game thinks in kPa, the proc siunit in Pa + TEST_ASSERT_EQUAL(siunit_pressure(1.234, 2), "1.23 kPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1.234, 3), "1.234 kPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1, 4), "1 kPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(0), "0 Pa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1e3), "1 MPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(999e3), "999 MPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(999.9e3), "999.9 MPa" , "") + TEST_ASSERT_EQUAL(siunit_pressure(999.9e3, 0), "1 GPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1e6), "1 GPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(3e17), "300000 PPa", "") diff --git a/code/modules/unit_tests/species_whitelists.dm b/code/modules/unit_tests/species_whitelists.dm new file mode 100644 index 0000000000..145f3a259f --- /dev/null +++ b/code/modules/unit_tests/species_whitelists.dm @@ -0,0 +1,5 @@ +/datum/unit_test/species_whitelist_check/Run() + for(var/typepath in subtypesof(/datum/species)) + var/datum/species/S = typepath + if(initial(S.changesource_flags) == NONE) + Fail("A species type was detected with no changesource flags: [S]") diff --git a/code/modules/unit_tests/stomach.dm b/code/modules/unit_tests/stomach.dm new file mode 100644 index 0000000000..06fdc71dd4 --- /dev/null +++ b/code/modules/unit_tests/stomach.dm @@ -0,0 +1,40 @@ +/datum/unit_test/stomach/Run() + + // Pause natural mob life so it can be handled entirely by the test + SSmobs.pause() + + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + var/obj/item/food/hotdog/debug/fooditem = allocate(/obj/item/food/hotdog/debug) + var/obj/item/organ/stomach/belly = human.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/reagent_containers/pill/pill = allocate(/obj/item/reagent_containers/pill) + var/datum/reagent/drug/methamphetamine/meth = /datum/reagent/drug/methamphetamine + + TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human somehow has ketchup before eating") + + fooditem.attack(human, human) + + TEST_ASSERT(belly.reagents.has_reagent(/datum/reagent/consumable/ketchup), "Stomach doesn't have ketchup after eating") + TEST_ASSERT_EQUAL(human.reagents.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human body has ketchup after eating it should only be in the stomach") + + //Give them meth and let it kick in + pill.reagents.add_reagent(meth, initial(meth.metabolization_rate) * 1.9) + pill.attack(human, human) + human.Life() + + TEST_ASSERT(human.reagents.has_reagent(meth), "Human body does not have meth after life tick") + TEST_ASSERT(human.has_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine), "Human consumed meth, but did not gain movespeed modifier") + + belly.Remove(human) + human.reagents.remove_all(human.reagents.total_volume) + + TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human has reagents after clearing") + + fooditem.attack(human, human) + + TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human has ketchup without a stomach") + + + +/datum/unit_test/stomach/Destroy() + SSmobs.ignite() + return ..() diff --git a/code/modules/unit_tests/subsystem_init.dm b/code/modules/unit_tests/subsystem_init.dm index f768f03f78..7d5473bc1b 100644 --- a/code/modules/unit_tests/subsystem_init.dm +++ b/code/modules/unit_tests/subsystem_init.dm @@ -4,4 +4,4 @@ if(ss.flags & SS_NO_INIT) continue if(!ss.initialized) - Fail("[ss]([ss.type]) is a subsystem meant to initialize but doesn't get set as initialized.") \ No newline at end of file + Fail("[ss]([ss.type]) is a subsystem meant to initialize but doesn't get set as initialized.") diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm new file mode 100644 index 0000000000..6348057f79 --- /dev/null +++ b/code/modules/unit_tests/surgeries.dm @@ -0,0 +1,106 @@ +/datum/unit_test/amputation/Run() + var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + + TEST_ASSERT_EQUAL(length(patient.get_missing_limbs()), 0, "Patient is somehow missing limbs before surgery") + + var/datum/surgery/amputation/surgery = new(patient, BODY_ZONE_R_ARM, patient.get_bodypart(BODY_ZONE_R_ARM)) + + var/datum/surgery_step/sever_limb/sever_limb = new + sever_limb.success(user, patient, BODY_ZONE_R_ARM, null, surgery) + + TEST_ASSERT_EQUAL(length(patient.get_missing_limbs()), 1, "Patient did not lose any limbs") + TEST_ASSERT_EQUAL(patient.get_missing_limbs()[1], BODY_ZONE_R_ARM, "Patient is missing a limb that isn't the one we operated on") + +/datum/unit_test/brain_surgery/Run() + var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) + patient.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_SURGERY) + patient.setOrganLoss(ORGAN_SLOT_BRAIN, 20) + + TEST_ASSERT(patient.has_trauma_type(), "Patient does not have any traumas, despite being given one") + + var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + + var/datum/surgery_step/fix_brain/fix_brain = new + fix_brain.success(user, patient) + + TEST_ASSERT(!patient.has_trauma_type(), "Patient kept their brain trauma after brain surgery") + TEST_ASSERT(patient.getOrganLoss(ORGAN_SLOT_BRAIN) < 20, "Patient did not heal their brain damage after brain surgery") + +/datum/unit_test/head_transplant/Run() + var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/alice = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/bob = allocate(/mob/living/carbon/human) + + alice.fully_replace_character_name(null, "Alice") + bob.fully_replace_character_name(null, "Bob") + + var/obj/item/bodypart/head/alices_head = alice.get_bodypart(BODY_ZONE_HEAD) + alices_head.drop_limb() + + var/obj/item/bodypart/head/bobs_head = bob.get_bodypart(BODY_ZONE_HEAD) + bobs_head.drop_limb() + + TEST_ASSERT_EQUAL(alice.get_bodypart(BODY_ZONE_HEAD), null, "Alice still has a head after dismemberment") + TEST_ASSERT_EQUAL(alice.get_visible_name(), "Unknown", "Alice's head was dismembered, but they are not Unknown") + + TEST_ASSERT_EQUAL(bobs_head.real_name, "Bob", "Bob's head does not remember that it is from Bob") + + // Put Bob's head onto Alice's body + var/datum/surgery_step/add_prosthetic/add_prosthetic = new + user.put_in_active_hand(bobs_head) + add_prosthetic.success(user, alice, BODY_ZONE_HEAD, bobs_head) + + TEST_ASSERT(!isnull(alice.get_bodypart(BODY_ZONE_HEAD)), "Alice has no head after prosthetic replacement") + TEST_ASSERT_EQUAL(alice.get_visible_name(), "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob") + +/datum/unit_test/multiple_surgeries/Run() + var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/patient_zero = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/patient_one = allocate(/mob/living/carbon/human) + + var/obj/item/scalpel/scalpel = allocate(/obj/item/scalpel) + + var/datum/surgery_step/incise/surgery_step = new + var/datum/surgery/organ_manipulation/surgery_for_zero = new + + INVOKE_ASYNC(surgery_step, /datum/surgery_step/proc/initiate, user, patient_zero, BODY_ZONE_CHEST, scalpel, surgery_for_zero) + TEST_ASSERT(surgery_for_zero.step_in_progress, "Surgery on patient zero was not initiated") + + var/datum/surgery/organ_manipulation/surgery_for_one = new + + // Without waiting for the incision to complete, try to start a new surgery + TEST_ASSERT(!surgery_step.initiate(user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one), "Was allowed to start a second surgery without the rod of asclepius") + TEST_ASSERT(!surgery_for_one.step_in_progress, "Surgery for patient one is somehow in progress, despite not initiating") + + user.apply_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH) + INVOKE_ASYNC(surgery_step, /datum/surgery_step/proc/initiate, user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one) + TEST_ASSERT(surgery_for_one.step_in_progress, "Surgery on patient one was not initiated, despite having rod of asclepius") + +/datum/unit_test/tend_wounds/Run() + var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) + patient.take_overall_damage(100, 100) + + var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + + // Test that tending wounds actually lowers damage + var/datum/surgery_step/heal/brute/basic/basic_brute_heal = new + basic_brute_heal.success(user, patient, BODY_ZONE_CHEST) + TEST_ASSERT(patient.getBruteLoss() < 100, "Tending brute wounds didn't lower brute damage ([patient.getBruteLoss()])") + + var/datum/surgery_step/heal/burn/basic/basic_burn_heal = new + basic_burn_heal.success(user, patient, BODY_ZONE_CHEST) + TEST_ASSERT(patient.getFireLoss() < 100, "Tending burn wounds didn't lower burn damage ([patient.getFireLoss()])") + + // Test that wearing clothing lowers heal amount + var/mob/living/carbon/human/naked_patient = allocate(/mob/living/carbon/human) + naked_patient.take_overall_damage(100) + + var/mob/living/carbon/human/clothed_patient = allocate(/mob/living/carbon/human) + clothed_patient.equipOutfit(/datum/outfit/job/doctor, TRUE) + clothed_patient.take_overall_damage(100) + + basic_brute_heal.success(user, naked_patient, BODY_ZONE_CHEST) + basic_brute_heal.success(user, clothed_patient, BODY_ZONE_CHEST) + + TEST_ASSERT(naked_patient.getBruteLoss() < clothed_patient.getBruteLoss(), "Naked patient did not heal more from wounds tending than a clothed patient") diff --git a/code/modules/unit_tests/teleporters.dm b/code/modules/unit_tests/teleporters.dm new file mode 100644 index 0000000000..fa2624adaa --- /dev/null +++ b/code/modules/unit_tests/teleporters.dm @@ -0,0 +1,10 @@ +/datum/unit_test/auto_teleporter_linking/Run() + // Put down the teleporter machinery + var/obj/machinery/teleport/hub/hub = allocate(/obj/machinery/teleport/hub) + var/obj/machinery/teleport/station/station = allocate(/obj/machinery/teleport/station, locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z)) + var/obj/machinery/computer/teleporter/computer = allocate(/obj/machinery/computer/teleporter, locate(run_loc_bottom_left.x + 2, run_loc_bottom_left.y, run_loc_bottom_left.z)) + + TEST_ASSERT_EQUAL(hub.power_station, station, "Hub didn't link to the station") + TEST_ASSERT_EQUAL(station.teleporter_console, computer, "Station didn't link to the teleporter console") + TEST_ASSERT_EQUAL(station.teleporter_hub, hub, "Station didn't link to the hub") + TEST_ASSERT_EQUAL(computer.power_station, station, "Teleporter console didn't link to the hub") diff --git a/code/modules/unit_tests/timer_sanity.dm b/code/modules/unit_tests/timer_sanity.dm index 1e5b022b19..d92323a525 100644 --- a/code/modules/unit_tests/timer_sanity.dm +++ b/code/modules/unit_tests/timer_sanity.dm @@ -1,3 +1,3 @@ /datum/unit_test/timer_sanity/Run() if(SStimer.bucket_count < 0) - Fail("SStimer is going into negative bucket count from something") \ No newline at end of file + Fail("SStimer is going into negative bucket count from something") diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 49974f2cb0..15fe6b466c 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -18,23 +18,40 @@ GLOBAL_VAR(test_log) /datum/unit_test //Bit of metadata for the future maybe var/list/procs_tested - - //usable vars + + /// The bottom left turf of the testing zone var/turf/run_loc_bottom_left + + /// The top right turf of the testing zone var/turf/run_loc_top_right + /// The type of turf to allocate for the testing zone + var/test_turf_type = /turf/open/floor/plasteel + //internal shit + var/focus = FALSE var/succeeded = TRUE + var/list/allocated var/list/fail_reasons + var/static/datum/turf_reservation/turf_reservation + /datum/unit_test/New() - run_loc_bottom_left = locate(1, 1, 1) - run_loc_top_right = locate(5, 5, 1) + if (isnull(turf_reservation)) + turf_reservation = SSmapping.RequestBlockReservation(5, 5) + + for (var/turf/reserved_turf in turf_reservation.reserved_turfs) + reserved_turf.ChangeTurf(test_turf_type) + + allocated = new + run_loc_bottom_left = locate(turf_reservation.bottom_left_coords[1], turf_reservation.bottom_left_coords[2], turf_reservation.bottom_left_coords[3]) + run_loc_top_right = locate(turf_reservation.top_right_coords[1], turf_reservation.top_right_coords[2], turf_reservation.top_right_coords[3]) /datum/unit_test/Destroy() //clear the test area for(var/atom/movable/AM in block(run_loc_bottom_left, run_loc_top_right)) qdel(AM) + QDEL_LIST(allocated) return ..() /datum/unit_test/proc/Run() @@ -48,10 +65,29 @@ GLOBAL_VAR(test_log) LAZYADD(fail_reasons, reason) +/// Allocates an instance of the provided type, and places it somewhere in an available loc +/// Instances allocated through this proc will be destroyed when the test is over +/datum/unit_test/proc/allocate(type, ...) + var/list/arguments = args.Copy(2) + if (!arguments.len) + arguments = list(run_loc_bottom_left) + else if (arguments[1] == null) + arguments[1] = run_loc_bottom_left + var/instance = new type(arglist(arguments)) + allocated += instance + return instance + /proc/RunUnitTests() CHECK_TICK - for(var/I in subtypesof(/datum/unit_test)) + var/tests_to_run = subtypesof(/datum/unit_test) + for (var/_test_to_run in tests_to_run) + var/datum/unit_test/test_to_run = _test_to_run + if (initial(test_to_run.focus)) + tests_to_run = list(test_to_run) + break + + for(var/I in tests_to_run) var/datum/unit_test/test = new I GLOB.current_test = test diff --git a/code/modules/uplink/uplink_items/uplink_badass.dm b/code/modules/uplink/uplink_items/uplink_badass.dm index 43e5523bad..ec0ebf66d1 100644 --- a/code/modules/uplink/uplink_items/uplink_badass.dm +++ b/code/modules/uplink/uplink_items/uplink_badass.dm @@ -78,3 +78,16 @@ limited_stock = 1 cant_discount = TRUE include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + +/datum/uplink_item/badass/gaming_cardpack + name = "TCG Card Operatives Bundle" + desc = "A bundle full of goodies required to work as a TCG Card Operative. A warm pajama, a mug of cocoa, a plushie and a two packs full of rare 2560 Core Set cards!" + item = /obj/item/storage/box/syndie_kit/sleepytime/cardpack + cost = 20 + include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + +/datum/uplink_item/badass/cardpack + name = "TCG Nuclear Cardpack" + desc = "A cardpack filled with top-tier TCG cards." + item = /obj/item/cardpack/syndicate + cost = 4 diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm index 1b7909a50d..d01c3ae96a 100644 --- a/code/modules/uplink/uplink_items/uplink_bundles.dm +++ b/code/modules/uplink/uplink_items/uplink_bundles.dm @@ -52,6 +52,15 @@ cost = 20 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs) +/datum/uplink_item/bundles_TC/scarp_bundle + name = "Sleeping Carp Bundle" + desc = "Become one with your inner carp! Your ancient fish masters leave behind their legacy, and bestow to you their teachings, sacred uniform, and staff. \ + Please be aware that you will not be able to use dishonerable ranged weapons." + item = /obj/item/storage/box/syndie_kit/scarp + cost = 20 + player_minimum = 20 + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs) + /datum/uplink_item/suits/infiltrator_bundle name = "Insidious Infiltration Gear Case" desc = "Developed by Roseus Galactic in conjunction with the Gorlex Marauders to produce a functional suit for urban operations, \ diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 745eddcc07..de15b16b68 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -92,8 +92,8 @@ cost = 6 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) -/datum/uplink_item/device_tools/guerillagloves - name = "Guerilla Gloves" +/datum/uplink_item/device_tools/guerrillagloves + name = "Guerrilla Gloves" desc = "A pair of highly robust combat gripper gloves that excels at performing takedowns at close range, with an added lining of insulation. Careful not to hit a wall!" item = /obj/item/clothing/gloves/tackler/combat/insulated include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) @@ -104,3 +104,10 @@ desc = "An eyepatch that connects itself to your eye socket, enhancing your shooting to an impossible degree, allowing your bullets to ricochet far more often than usual." item = /obj/item/clothing/glasses/eyepatch/syndicate cost = 8 + +/datum/uplink_item/device_tools/ablative_armwraps + name = "Ablative Armwraps" + desc = "A pair of highly reinforced armwraps allowing the user to parry almost anything. Fully reflects projectiles, no downsides to failing, but is very hard to parry melee with." + cost = 6 + item = /obj/item/clothing/gloves/fingerless/ablative + exclude_modes = list(/datum/game_mode/nuclear) diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm index 898b716775..a8ca068ad2 100644 --- a/code/modules/uplink/uplink_items/uplink_dangerous.dm +++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm @@ -118,6 +118,18 @@ /datum/uplink_item/dangerous/doublesword/get_discount() return pick(4;0.8,2;0.65,1;0.5) +/datum/uplink_item/dangerous/hyperblade + name = "Hypereutactic Blade" + desc = "The result of two Dragon Tooth swords combining, you wouldn't want to see this coming at you down the hall! \ + Requires two hands to wield and it slows you down. You can also recolor it!" + item = /obj/item/dualsaber/hypereutactic + player_minimum = 25 + cost = 16 + exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs) + +/datum/uplink_item/dangerous/hyperblade/get_discount() + return pick(4;0.8,2;0.65,1;0.5) + /datum/uplink_item/dangerous/sword name = "Energy Sword" desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \ diff --git a/code/modules/uplink/uplink_items/uplink_implants.dm b/code/modules/uplink/uplink_items/uplink_implants.dm index bb4e0c7960..4839c96a2d 100644 --- a/code/modules/uplink/uplink_items/uplink_implants.dm +++ b/code/modules/uplink/uplink_items/uplink_implants.dm @@ -31,7 +31,7 @@ /datum/uplink_item/implants/warp name = "Warp Implant" - desc = "An implant injected into the body and later activated at the user's will. It will inject eigenstasium which saves the user's location and teleports them there after five seconds. Lasts only fifteen times." + desc = "An implant injected into the body and later activated at the user's will. Allows the user to teleport to where they were 10 seconds ago. Has a 10 second cooldown." item = /obj/item/storage/box/syndie_kit/imp_warp cost = 6 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm index b8eaf41371..4edbe2f2c7 100644 --- a/code/modules/uplink/uplink_items/uplink_roles.dm +++ b/code/modules/uplink/uplink_items/uplink_roles.dm @@ -60,7 +60,6 @@ cost = 15 restricted_roles = list("Clown") -/* /datum/uplink_item/role_restricted/clowncar name = "Clown Car" desc = "The Clown Car is the ultimate transportation method for any worthy clown! \ @@ -69,9 +68,8 @@ someone saves them or they manage to crawl out. Be sure not to ram into any walls or vending machines, as the springloaded seats \ are very sensetive. Now with our included lube defense mechanism which will protect you against any angry shitcurity!" item = /obj/vehicle/sealed/car/clowncar - cost = 15 + cost = 16 restricted_roles = list("Clown") -*/ /datum/uplink_item/role_restricted/haunted_magic_eightball name = "Haunted Magic Eightball" @@ -144,6 +142,14 @@ cost = 4 // Has syndie tools + gloves + a robust weapon restricted_roles = list("Assistant", "Curator") //Curator due to this being made of gold - It fits the theme +/datum/uplink_item/role_restricted/oldtoolboxclean // this is the fourth item relating to toolboxes to be placed into this godforsaken bloated uplink + name = "Ancient Toolbox" + desc = "An iconic toolbox design notorious with Assistants everywhere, this design was especially made to become more robust the more telecrystals it has inside it! Tools and insulated gloves included." + item = /obj/item/storage/toolbox/mechanical/old/clean + cost = 2 // with eighteen telecrystals you are still weaker than a desword and without any of its defenses -- the scary part comes from collaborating with allies for a fifty eight force toolbox oh fuck + restricted_roles = list("Assistant") + surplus = 0 + /datum/uplink_item/role_restricted/mimery name = "Guide to Advanced Mimery Series" desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. \ @@ -244,3 +250,11 @@ cost = 2 item = /obj/item/clothing/shoes/magboots/crushing restricted_roles = list("Chief Engineer", "Station Engineer", "Atmospheric Technician") + +/datum/uplink_item/role_restricted/turretbox + name = "Disposable Sentry Gun" + desc = "A disposable sentry gun deployment system cleverly disguised as a toolbox, apply wrench for functionality." + item = /obj/item/storage/toolbox/emergency/turret + cost = 11 + restricted_roles = list("Station Engineer") + diff --git a/code/modules/uplink/uplink_items/uplink_stealth.dm b/code/modules/uplink/uplink_items/uplink_stealth.dm index ff6d66a483..1bd75fa2b1 100644 --- a/code/modules/uplink/uplink_items/uplink_stealth.dm +++ b/code/modules/uplink/uplink_items/uplink_stealth.dm @@ -102,6 +102,7 @@ along with slurred speech, aggression, and the ability to infect others with this agent." item = /obj/item/storage/box/syndie_kit/romerol cost = 25 + player_minimum = 25 cant_discount = TRUE exclude_modes = list(/datum/game_mode/nuclear) @@ -115,7 +116,7 @@ cost = 4 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) -datum/uplink_item/stealthy_weapons/taeclowndo_shoes +/datum/uplink_item/stealthy_weapons/taeclowndo_shoes name = "Tae-clown-do Shoes" desc = "A pair of shoes for the most elite agents of the honkmotherland. They grant the mastery of taeclowndo with some honk-fu moves as long as they're worn." cost = 12 diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index cd21b61dbe..0b75dbf4db 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -18,6 +18,12 @@ . = ..() initialize_controller_action_type(/datum/action/vehicle/sealed/horn/clowncar, VEHICLE_CONTROL_DRIVE) +/obj/vehicle/sealed/car/clowncar/driver_move(mob/user, direction) //Prevent it from moving onto space + if(isspaceturf(get_step(src, direction))) + return FALSE + else + return ..() + /obj/vehicle/sealed/car/clowncar/auto_assign_occupant_flags(mob/M) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -56,7 +62,7 @@ L.visible_message("[src] rams into [L] and sucks him up!") //fuck off shezza this isn't ERP. mob_forced_enter(L) playsound(src, pick('sound/vehicles/clowncar_ram1.ogg', 'sound/vehicles/clowncar_ram2.ogg', 'sound/vehicles/clowncar_ram3.ogg'), 75) - else if(istype(M, /turf/closed)) + else if(istype(M, /turf/closed) || istype(M, /obj/machinery/door/airlock/external)) visible_message("[src] rams into [M] and crashes!") playsound(src, pick('sound/vehicles/clowncar_crash1.ogg', 'sound/vehicles/clowncar_crash2.ogg'), 75) playsound(src, 'sound/vehicles/clowncar_crashpins.ogg', 75) @@ -130,3 +136,25 @@ /obj/vehicle/sealed/car/clowncar/proc/StopDroppingOil() droppingoil = FALSE + +/obj/vehicle/sealed/car/clowncar/twitch_plays + key_type = null + explode_on_death = FALSE + +/obj/vehicle/sealed/car/clowncar/twitch_plays/Initialize() + . = ..() + AddComponent(/datum/component/twitch_plays/simple_movement) + START_PROCESSING(SSfastprocess, src) + GLOB.poi_list |= src + notify_ghosts("Twitch Plays: Clown Car") + +/obj/vehicle/sealed/car/clowncar/twitch_plays/Destroy() + STOP_PROCESSING(SSfastprocess, src) + GLOB.poi_list -= src + return ..() + +/obj/vehicle/sealed/car/clowncar/twitch_plays/process() + var/dir = SEND_SIGNAL(src, COMSIG_TWITCH_PLAYS_MOVEMENT_DATA, TRUE) + if(!dir) + return + driver_move(null, dir) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 28f6b1cca8..63c7c9f858 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -1,6 +1,7 @@ /obj/vehicle/sealed enclosed = TRUE // you're in a sealed vehicle dont get dinked idiot var/enter_delay = 20 + var/explode_on_death = TRUE flags_1 = BLOCK_FACE_ATOM_1 /obj/vehicle/sealed/generate_actions() @@ -87,7 +88,8 @@ /obj/vehicle/sealed/Destroy() DumpMobs() - explosion(loc, 0, 1, 2, 3, 0) + if(explode_on_death) + explosion(loc, 0, 1, 2, 3, 0) return ..() /obj/vehicle/sealed/proc/DumpMobs(randomstep = TRUE) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 137242c547..a81dff37ad 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -10,6 +10,7 @@ canmove = TRUE density = FALSE //Thought I couldn't fix this one easily, phew arms_required = 1 + var/override_movespeed = FALSE /obj/vehicle/ridden/wheelchair/Initialize() . = ..() @@ -42,10 +43,11 @@ canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) return FALSE - var/datum/component/riding/D = GetComponent(/datum/component/riding) - //1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have - //if that made no sense this simply makes the wheelchair speed change along with movement speed delay - D.vehicle_move_delay = round((CONFIG_GET(number/movedelay/run_delay) * 4) / min(user.get_num_arms(), 2), world.tick_lag) + if(!override_movespeed) + var/datum/component/riding/D = GetComponent(/datum/component/riding) + //1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have + //if that made no sense this simply makes the wheelchair speed change along with movement speed delay + D.vehicle_move_delay = round((CONFIG_GET(number/movedelay/run_delay) * 4) / min(user.get_num_arms(), 2), world.tick_lag) return ..() /obj/vehicle/ridden/wheelchair/Moved() diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 26bee38f7b..a115300085 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -529,7 +529,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(5) // limb squish! for(var/i in C.bodyparts) var/obj/item/bodypart/squish_part = i - if(squish_part.is_organic_limb() || squish_part.render_like_organic) + if(squish_part.is_organic_limb()) var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate)) squish_part.force_wound_upwards(type_wound) else diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 14cdd30931..264d262a1d 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -74,9 +74,9 @@ /obj/item/staff = 3, /obj/item/clothing/under/rank/civilian/mime/skirt = 1, /obj/item/clothing/under/rank/captain/suit/skirt = 1, - /obj/item/clothing/mask/gas/sexyclown = 1, + /obj/item/clothing/mask/gas/clown_hat/sexy = 1, /obj/item/clothing/under/rank/civilian/clown/sexy = 1, - /obj/item/clothing/mask/gas/sexymime = 1, + /obj/item/clothing/mask/gas/mime/sexy = 1, /obj/item/clothing/under/rank/civilian/mime/sexy = 1, /obj/item/clothing/mask/rat/bat = 1, /obj/item/clothing/mask/rat/bee = 1, @@ -120,7 +120,14 @@ /obj/item/clothing/ears/headphones = 2, /obj/item/clothing/head/wig/random = 3, /obj/item/clothing/suit/ran = 2, - /obj/item/clothing/head/ran = 2) + /obj/item/clothing/head/ran = 2, + /obj/item/clothing/mask/gas/timidcostume = 3, + /obj/item/clothing/suit/hooded/wintercoat/timidcostume = 3, + /obj/item/clothing/shoes/timidcostume = 3, + /obj/item/clothing/mask/gas/timidcostume/man = 3, + /obj/item/clothing/suit/hooded/wintercoat/timidcostume/man = 3, + /obj/item/clothing/shoes/timidcostume/man = 3, + ) contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, /obj/item/gun/magic/wand = 2, diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index bd821d80e3..fedaeff98c 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -21,6 +21,7 @@ /obj/item/clothing/suit/jacket/puffer/vest = 4, /obj/item/clothing/suit/jacket/puffer = 4, /obj/item/clothing/suit/hooded/cloak/david = 4, + /obj/item/clothing/neck/cancloak/polychromic = 4, /obj/item/clothing/suit/bomber = 5, /obj/item/clothing/under/suit/turtle/teal = 3, /obj/item/clothing/under/suit/turtle/grey = 3, @@ -31,9 +32,26 @@ /obj/item/clothing/under/suit/burgundy = 3, /obj/item/clothing/under/suit/charcoal = 3, /obj/item/clothing/under/suit/white = 3, + /obj/item/clothing/under/suit/tan = 3, + /obj/item/clothing/under/suit/charismatic_suit = 3, /obj/item/clothing/under/costume/kilt = 3, + /obj/item/clothing/suit/suspenders = 3, /obj/item/clothing/under/misc/overalls = 3, /obj/item/clothing/under/suit/sl = 3, + /obj/item/clothing/accessory/sweater = 3, + /obj/item/clothing/accessory/sweater/pink = 3, + /obj/item/clothing/accessory/sweater/heart = 3, + /obj/item/clothing/accessory/sweater/blue = 3, + /obj/item/clothing/accessory/sweater/nt = 3, + /obj/item/clothing/accessory/sweater/mint = 3, + /obj/item/clothing/accessory/sweater/shoulderless = 3, + /obj/item/clothing/accessory/sweater/flower = 3, + /obj/item/clothing/accessory/turtleneck = 2, + /obj/item/clothing/accessory/turtleneck/red = 2, + /obj/item/clothing/accessory/turtleneck/comfy = 2, + /obj/item/clothing/accessory/turtleneck/tactifool = 2, + /obj/item/clothing/accessory/turtleneck/tactifool/green = 2, + /obj/item/clothing/accessory/turtleneck/tactifool/blue = 2, /obj/item/clothing/under/sweater = 3, /obj/item/clothing/under/sweater/black = 3, /obj/item/clothing/under/sweater/purple = 3, @@ -50,7 +68,14 @@ /obj/item/clothing/under/pants/black = 4, /obj/item/clothing/under/pants/tan = 4, /obj/item/clothing/under/pants/track = 3, + /obj/item/clothing/under/pants/polypants/polychromic = 4, + /obj/item/clothing/accessory/suitjacket = 2, + /obj/item/clothing/accessory/suitjacket/charcoal = 2, + /obj/item/clothing/accessory/suitjacket/navy = 2, + /obj/item/clothing/accessory/suitjacket/burgundy = 2, + /obj/item/clothing/accessory/suitjacket/checkered = 2, /obj/item/clothing/suit/jacket/miljacket = 5, + /obj/item/clothing/suit/jacket/urbanjacket/polychromic = 5, /obj/item/clothing/under/suit/white_on_white/skirt = 2, /obj/item/clothing/under/rank/captain/suit/skirt = 2, /obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt = 2, @@ -74,6 +99,12 @@ /obj/item/clothing/neck/stripedbluescarf = 3, /obj/item/clothing/neck/stripedgreenscarf = 3, /obj/item/clothing/accessory/waistcoat = 2, + /obj/item/clothing/accessory/waistcoat/red = 2, + /obj/item/clothing/accessory/waistcoat/grey = 2, + /obj/item/clothing/accessory/waistcoat/brown = 2, + /obj/item/clothing/accessory/waistcoat/sweatervest = 2, + /obj/item/clothing/accessory/waistcoat/sweatervest/blue = 2, + /obj/item/clothing/accessory/waistcoat/sweatervest/red = 2, /obj/item/clothing/under/dress/skirt = 3, /obj/item/clothing/under/dress/skirt/blue = 3, /obj/item/clothing/under/dress/skirt/red = 3, @@ -132,22 +163,22 @@ /obj/item/clothing/ears/headphones = 10, /obj/item/clothing/suit/apron/purple_bartender = 4, /obj/item/clothing/under/rank/civilian/bartender/purple = 4, + /* Commenting out until next Christmas or made automatic + /obj/item/clothing/accessory/sweater/uglyxmas = 3, /obj/item/clothing/under/costume/christmas = 3, /obj/item/clothing/under/costume/christmas/green = 3, /obj/item/clothing/under/costume/christmas/croptop = 3, /obj/item/clothing/under/costume/christmas/croptop/green = 3, - */ /obj/item/clothing/suit/hooded/wintercoat/christmascoatr = 3, /obj/item/clothing/suit/hooded/wintercoat/christmascoatg = 3, /obj/item/clothing/suit/hooded/wintercoat/christmascoatrg = 3, - /*Commenting out until next Christmas or made automatic /obj/item/clothing/head/christmashat = 3, /obj/item/clothing/head/christmashatg = 3, - */ /obj/item/clothing/shoes/winterboots/christmasbootsr = 3, /obj/item/clothing/shoes/winterboots/christmasbootsg = 3, /obj/item/clothing/shoes/winterboots/santaboots = 3, + */ /obj/item/clothing/head/cowboyhat = 3, /obj/item/clothing/head/cowboyhat/black = 3, /obj/item/clothing/head/cowboyhat/white = 3, @@ -161,7 +192,8 @@ /obj/item/clothing/under/costume/cheongsam/white = 3, /obj/item/clothing/under/costume/cheongsam/red = 3, /obj/item/storage/backpack/snail = 3) - contraband = list(/obj/item/clothing/under/syndicate/tacticool = 3, + contraband = list(/obj/item/clothing/accessory/turtleneck/tactifool/syndicate = 3, + /obj/item/clothing/under/syndicate/tacticool = 3, /obj/item/clothing/under/syndicate/tacticool/skirt = 3, /obj/item/clothing/mask/balaclava = 3, /obj/item/clothing/head/ushanka = 3, @@ -181,7 +213,10 @@ /obj/item/clothing/under/pants/mustangjeans = 3, /obj/item/clothing/neck/necklace/dope = 5, /obj/item/clothing/suit/jacket/letterman_nanotrasen = 5, - /obj/item/clothing/suit/hooded/wintercoat/polychromic = 5) + /obj/item/clothing/under/misc/corporateuniform = 5, + /obj/item/clothing/suit/hooded/wintercoat/polychromic = 5, + /obj/item/clothing/suit/toggle/wbreakpoly/polychromic = 5, + /obj/item/clothing/shoes/sneakers/poly/polychromic = 10) refill_canister = /obj/item/vending_refill/clothing default_price = PRICE_CHEAP extra_price = PRICE_BELOW_NORMAL diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 7fd8246dd6..cea9c5ae70 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -4,10 +4,12 @@ product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Totally not satanic!;Fun times forever!" icon_state = "games" products = list(/obj/item/toy/cards/deck = 5, - /obj/item/storage/box/dice = 10, + /obj/item/storage/dice = 10, /obj/item/toy/cards/deck/cas = 3, /obj/item/toy/cards/deck/cas/black = 3, - /obj/item/toy/cards/deck/unum = 3) + /obj/item/toy/cards/deck/unum = 3, + /obj/item/cardpack/series_one = 10, + /obj/item/tcgcard_binder = 5) contraband = list(/obj/item/dice/fudge = 9) premium = list(/obj/item/melee/skateboard/pro = 3, /obj/item/melee/skateboard/hoverboard = 1) diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index e522583772..28e5a950ad 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -2,7 +2,6 @@ name = "KinkMate" desc = "A vending machine for all your unmentionable desires." icon_state = "kink" - circuit = /obj/item/circuitboard/machine/kinkmate product_slogans = "Kinky!;Sexy!;Check me out, big boy!" vend_reply = "Have fun, you shameless pervert!" products = list( @@ -13,6 +12,7 @@ /obj/item/clothing/neck/petcollar = 5, /obj/item/clothing/neck/petcollar/choker = 5, /obj/item/clothing/neck/petcollar/leather = 5, + /obj/item/clothing/neck/necklace/cowbell = 5, /obj/item/restraints/handcuffs/fake/kinky = 5, /obj/item/clothing/glasses/sunglasses/blindfold = 4, /obj/item/clothing/mask/muzzle = 4, @@ -31,6 +31,8 @@ /obj/item/autosurgeon/testicles = 3, /obj/item/storage/pill_bottle/penis_enlargement = 5, /obj/item/storage/pill_bottle/breast_enlargement = 5, + /obj/item/reagent_containers/glass/bottle/crocin = 5, + /obj/item/reagent_containers/glass/bottle/camphor = 5, /obj/item/storage/daki = 4 ) contraband = list( @@ -46,6 +48,7 @@ ) premium = list( /obj/item/clothing/accessory/skullcodpiece/fake = 3, + /obj/item/reagent_containers/glass/bottle/hexacrocin = 10, /obj/item/clothing/under/pants/chaps = 5 ) refill_canister = /obj/item/vending_refill/kink diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 795d35adc4..a24233b17c 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -34,7 +34,8 @@ /obj/item/healthanalyzer/wound = 4, /obj/item/stack/medical/ointment = 2, /obj/item/stack/medical/suture = 2, - /obj/item/stack/medical/bone_gel = 4) + /obj/item/stack/medical/bone_gel = 4, + /obj/item/stack/medical/nanogel = 4) contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, /obj/item/reagent_containers/pill/charcoal = 6) diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 31f3dc49f1..2d4c30080d 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -13,6 +13,7 @@ /obj/item/reagent_containers/medspray/sterilizine = 1, /obj/item/healthanalyzer/wound = 2, /obj/item/stack/medical/bone_gel = 2, + /obj/item/stack/medical/nanogel = 2, /obj/item/reagent_containers/syringe/dart = 10) contraband = list(/obj/item/reagent_containers/pill/tox = 2, /obj/item/reagent_containers/pill/morphine = 2) diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm index 88f65506a6..2d77b2fc51 100644 --- a/code/modules/vending/robotics.dm +++ b/code/modules/vending/robotics.dm @@ -17,7 +17,8 @@ /obj/item/tank/internals/anesthetic = 2, /obj/item/clothing/mask/breath/medical = 5, /obj/item/screwdriver = 5, - /obj/item/crowbar = 5) + /obj/item/crowbar = 6, + /obj/item/stack/medical/nanogel = 5) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF default_price = PRICE_EXPENSIVE diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 8ad4b0568c..c3540777ab 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -15,7 +15,7 @@ /obj/item/secbat = 5) contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, - /obj/item/ssword_kit = 1) + /obj/item/storage/belt/sabre/secbelt = 1) premium = list(/obj/item/coin/antagtoken = 1, /obj/item/clothing/head/helmet/blueshirt = 1, /obj/item/clothing/suit/armor/vest/blueshirt = 1, diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index e15e02f0d5..eebb07938b 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -17,8 +17,8 @@ product_ads = "Beat perps in style!;It's red so you can't see the blood!;You have the right to be fashionable!;Now you can be the fashion police you always wanted to be!" vend_reply = "Thank you for using the SecDrobe!" products = list(/obj/item/clothing/suit/hooded/wintercoat/security = 2, - /obj/item/storage/backpack/security = 2, - /obj/item/storage/backpack/satchel/sec = 2, + /obj/item/storage/backpack/security = 3, + /obj/item/storage/backpack/satchel/sec = 3, /obj/item/storage/backpack/duffelbag/sec = 3, /obj/item/clothing/under/rank/security/officer = 5, /obj/item/clothing/shoes/jackboots = 5, @@ -88,9 +88,9 @@ vend_reply = "Thank you for using the MediDrobe!" products = list(/obj/item/clothing/accessory/pocketprotector = 5, /obj/item/clothing/head/beret/med = 5, - /obj/item/storage/backpack/duffelbag/med = 5, /obj/item/storage/backpack/medic = 5, /obj/item/storage/backpack/satchel/med = 5, + /obj/item/storage/backpack/duffelbag/med = 5, /obj/item/clothing/suit/hooded/wintercoat/medical = 5, /obj/item/clothing/suit/hooded/wintercoat/paramedic = 2, /obj/item/clothing/under/rank/medical/doctor/nurse = 5, @@ -131,9 +131,9 @@ vend_reply = "Thank you for using the EngiDrobe!" products = list(/obj/item/clothing/accessory/pocketprotector = 5, /obj/item/clothing/head/beret/eng = 3, - /obj/item/storage/backpack/duffelbag/engineering = 3, /obj/item/storage/backpack/industrial = 3, /obj/item/storage/backpack/satchel/eng = 3, + /obj/item/storage/backpack/duffelbag/engineering = 3, /obj/item/clothing/suit/hooded/wintercoat/engineering = 3, /obj/item/clothing/under/rank/engineering/engineer = 5, /obj/item/clothing/under/rank/engineering/engineer/skirt = 5, @@ -162,9 +162,9 @@ vend_reply = "Thank you for using the AtmosDrobe!" products = list(/obj/item/clothing/accessory/pocketprotector = 3, /obj/item/clothing/head/beret/atmos = 3, - /obj/item/storage/backpack/duffelbag/engineering = 3, - /obj/item/storage/backpack/satchel/eng = 3, /obj/item/storage/backpack/industrial = 3, + /obj/item/storage/backpack/satchel/eng = 3, + /obj/item/storage/backpack/duffelbag/engineering = 3, /obj/item/clothing/head/hardhat/weldhat/dblue = 3, /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3, /obj/item/clothing/under/rank/engineering/atmospheric_technician = 5, @@ -207,12 +207,13 @@ product_ads = "You turn me TRUE, use defines!;0110001101101100011011110111010001101000011001010111001101101000011001010111001001100101" vend_reply = "Thank you for using the RoboDrobe!" products = list(/obj/item/clothing/glasses/hud/diagnostic = 3, + /obj/item/stack/medical/nanogel = 5, /obj/item/clothing/head/beret/robo = 3, /obj/item/clothing/under/rank/rnd/roboticist = 3, /obj/item/clothing/under/rank/rnd/roboticist/sleek = 3, /obj/item/clothing/under/rank/rnd/roboticist/skirt = 3, /obj/item/clothing/suit/hooded/wintercoat/robotics = 3, - /obj/item/clothing/suit/toggle/labcoat = 3, + /obj/item/clothing/suit/toggle/labcoat/roboticist = 3, /obj/item/clothing/shoes/sneakers/black = 3, /obj/item/clothing/gloves/fingerless = 3, /obj/item/clothing/head/soft/black = 3, @@ -238,6 +239,7 @@ /obj/item/clothing/head/beret/sci = 3, /obj/item/storage/backpack/science = 3, /obj/item/storage/backpack/satchel/tox = 3, + /obj/item/storage/backpack/duffelbag = 3, /obj/item/clothing/suit/hooded/wintercoat/science = 3, /obj/item/clothing/under/rank/rnd/scientist = 4, /obj/item/clothing/under/rank/rnd/scientist/util = 4, @@ -261,7 +263,9 @@ product_ads = "Do you love soil? Then buy our clothes!;Get outfits to match your green thumb here!" vend_reply = "Thank you for using the Hydrobe!" products = list(/obj/item/storage/backpack/botany = 3, + /obj/item/storage/backpack = 3, /obj/item/storage/backpack/satchel/hyd = 3, + /obj/item/storage/backpack/duffelbag = 3, /obj/item/clothing/suit/hooded/wintercoat/hydro = 2, /obj/item/clothing/suit/apron = 3, /obj/item/clothing/suit/apron/overalls = 5, @@ -375,7 +379,7 @@ /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, - /obj/item/caution = 8, + /obj/item/clothing/suit/caution = 8, /obj/item/holosign_creator = 2, /obj/item/lightreplacer = 2, /obj/item/soap = 2, @@ -468,7 +472,7 @@ /obj/item/storage/backpack/chemistry = 3, /obj/item/storage/backpack/satchel/chem = 3, /obj/item/storage/bag/chemistry = 3, - /obj/item/fermichem/pHbooklet = 3)//pH indicator) + /obj/item/fermichem/pHbooklet = 3) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -544,7 +548,7 @@ /obj/item/clothing/glasses/sunglasses/gar/supergar = 1, /obj/item/clothing/gloves/color/captain = 1) refill_canister = /obj/item/vending_refill/wardrobe/cap_wardrobe - payment_department = ACCOUNT_CIV + payment_department = ACCOUNT_SEC default_price = PRICE_ALMOST_EXPENSIVE extra_price = PRICE_ABOVE_EXPENSIVE diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm index a367abb098..8e74dd3c92 100644 --- a/code/modules/vore/eating/belly_obj.dm +++ b/code/modules/vore/eating/belly_obj.dm @@ -14,6 +14,7 @@ /obj/belly name = "belly" // Name of this location desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels. + rad_flags = RAD_NO_CONTAMINATE | RAD_PROTECT_CONTENTS var/vore_sound = "Gulp" // Sound when ingesting someone var/vore_verb = "ingest" // Verb for eating with this in messages var/release_sound = "Splatter" // Sound for letting someone out. @@ -247,7 +248,7 @@ for(var/mob/living/H in hearing_mobs) if(H && H.client && (isturf(H.loc) || (H.loc != src.contents))) var/sound/releasement = GLOB.pred_release_sounds[release_sound] - H.playsound_local(owner.loc, releasement, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) + H.playsound_local(owner.loc, releasement, 75, TRUE) else if(H?.client && (H in contents)) var/sound/releasement = GLOB.prey_release_sounds[release_sound] SEND_SOUND(H,releasement) @@ -303,7 +304,7 @@ for(var/mob/living/H in hearing_mobs) if(H && H.client && (isturf(H.loc) || (H.loc != src.contents))) var/sound/releasement = GLOB.pred_release_sounds[release_sound] - H.playsound_local(owner.loc, releasement, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) + H.playsound_local(owner.loc, releasement, 75, TRUE) else if(H?.client && (H in contents)) var/sound/releasement = GLOB.prey_release_sounds[release_sound] SEND_SOUND(H,releasement) @@ -365,7 +366,7 @@ for(var/mob/living/H in hearing_mobs) if(H && H.client && (isturf(H.loc) || (H.loc != src.contents))) var/sound/eating = GLOB.pred_vore_sounds[vore_sound] - H.playsound_local(owner.loc, eating, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) + H.playsound_local(owner.loc, eating, 75, TRUE) else if(H?.client && (H in contents)) var/sound/eating = GLOB.prey_vore_sounds[vore_sound] SEND_SOUND(H,eating) @@ -584,14 +585,14 @@ if(is_wet) for(var/mob/living/H in hearing_mobs) if(H && H.client && (isturf(H.loc) || (H.loc != src.contents))) - H.playsound_local(owner.loc, pred_struggle_snuggle, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) + H.playsound_local(owner.loc, pred_struggle_snuggle, 75, TRUE) else if(H && H.client && (H in contents)) SEND_SOUND(H,prey_struggle_snuggle) else for(var/mob/living/H in hearing_mobs) if(H && H.client) - H.playsound_local(owner.loc, struggle_rustle, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) + H.playsound_local(owner.loc, struggle_rustle, 75, TRUE) for(var/mob/living/H in hearing_mobs) if(H && H.client && (isturf(H.loc))) diff --git a/code/modules/vore/eating/bellymodes.dm b/code/modules/vore/eating/bellymodes.dm index 291ef8654f..7cf36ebc50 100644 --- a/code/modules/vore/eating/bellymodes.dm +++ b/code/modules/vore/eating/bellymodes.dm @@ -245,7 +245,7 @@ last_hearcheck = world.time for(var/mob/M in hearing_mobs) //so we don't fill the whole room with the sound effect if(M && M.client && (isturf(M.loc) || (M.loc != src.contents))) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check - M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) + M.playsound_local(owner.loc, play_sound, 75, TRUE) //these are all external sound triggers now, so it's ok. if(to_update) for(var/mob/living/M in contents) diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm index 8923e9107d..41d7da16a1 100644 --- a/code/modules/vore/eating/living.dm +++ b/code/modules/vore/eating/living.dm @@ -342,20 +342,26 @@ to_chat(src, "You can't do that so fast, slow down.") return - var/list/choices + DelayNextAction(CLICK_CD_MELEE, flush = TRUE) + + var/list/lickable = list() for(var/mob/living/L in view(1)) if(L != src && (!L.ckey || L.client?.prefs.vore_flags & LICKABLE) && Adjacent(L)) - LAZYADD(choices, L) + LAZYADD(lickable, L) + for(var/mob/living/listed in lickable) + lickable[listed] = new /mutable_appearance(listed) - if(!choices) + if(!lickable) return - var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices + var/mob/living/tasted = show_radial_menu(src, src, lickable, radius = 40, require_near = TRUE) if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE)) return - DelayNextAction(CLICK_CD_MELEE) + if(ishuman(tasted)) + var/mob/living/carbon/human/H = tasted + H.wash_cream() visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!") diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm index 9cb46d011d..6e3951e60a 100644 --- a/code/modules/vore/eating/vorepanel.dm +++ b/code/modules/vore/eating/vorepanel.dm @@ -661,7 +661,7 @@ if(href_list["saveprefs"]) if(!(user.client?.prefs)) return FALSE - if(!user.client.prefs.save_character()) + if(!user.copy_to_prefs_vr() || !user.client.prefs.save_character()) to_chat(user, "Belly Preferences not saved!") log_admin("Could not save vore prefs on USER: [user].") else diff --git a/code/modules/vore/hook-defs.dm b/code/modules/vore/hook-defs.dm index 629b1ba8f3..5c3c3d01c8 100644 --- a/code/modules/vore/hook-defs.dm +++ b/code/modules/vore/hook-defs.dm @@ -34,4 +34,4 @@ result = 0 //Return 1 to superhook - return result \ No newline at end of file + return result diff --git a/code/modules/vore/persistence.dm b/code/modules/vore/persistence.dm index f45a759fa3..0fcbdc9bb0 100644 --- a/code/modules/vore/persistence.dm +++ b/code/modules/vore/persistence.dm @@ -87,4 +87,4 @@ in their list var/atom/movable/thing = new path(loc) thing.deserialize(data) - return thing \ No newline at end of file + return thing diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 2cb3a83257..f208cafe4e 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -91,4 +91,4 @@
  • Optionally: Inject chemical into foods and drinks to further spread possible infection
  • \
  • ???
  • \
  • Complete assigned objectives amidst the chaos
  • \ -
" \ No newline at end of file + " diff --git a/code/world.dm b/code/world.dm index 344ca9be79..71a9853d01 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,12 +1,22 @@ //This file is just for the necessary /world definition //Try looking in game/world.dm +/** + * # World + * + * Two possibilities exist: either we are alone in the Universe or we are not. Both are equally terrifying. ~ Arthur C. Clarke + * + * The byond world object stores some basic byond level config, and has a few hub specific procs for managing hub visiblity + * + * The world /New() is the root of where a round itself begins + */ /world mob = /mob/dead/new_player turf = /turf/open/space/basic area = /area/space view = "15x15" hub = "Exadv1.spacestation13" + hub_password = "kMZy3U5jJHSiBQjr" name = "/tg/ Station 13" fps = 20 #ifdef FIND_REF_NO_CHECK_TICK diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt index fc1cb96c86..adbba1acb6 100644 --- a/config/admin_ranks.txt +++ b/config/admin_ranks.txt @@ -30,6 +30,7 @@ # +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too) # +AUTOLOGIN = admin gains powers upon connect. This defaults to on, you can use -AUTOLOGIN to make a role require using the readmin verb to gain powers. (this does not effect the admin's ability to walk past bans or other on-connect limitations like panic bunker or pop limit.) # +DBRANKS = when sql-based admin loading is enabled, allows for non-temporary changes in the permissions panel to be saved (requires DB) +# +SENSITIVE = Defaults to on, use - to remove it. Allows reading IPs, CIDs, grabbing logs, and proccalls to certain things like admin holders/clients/subsystems considered "sensitive". # +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag # END_KEYWORDS diff --git a/config/antag_rep.txt b/config/antag_rep.txt index a26b157d5a..e8a7250686 100644 --- a/config/antag_rep.txt +++ b/config/antag_rep.txt @@ -1,5 +1,5 @@ -## Custom antag reputation values -## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles -## e.g. -## ANTAG_REP Captain 10 -## ANTAG_REP Assistant 0 +## Custom antag reputation values +## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles +## e.g. +## ANTAG_REP Captain 10 +## ANTAG_REP Assistant 0 diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt index 768942c434..2663a206da 100644 --- a/config/awaymissionconfig.txt +++ b/config/awaymissionconfig.txt @@ -11,6 +11,7 @@ #_maps/RandomZLevels/away_mission/Academy.dmm #_maps/RandomZLevels/away_mission/wildwest.dmm #_maps/RandomZLevels/away_mission/challenge.dmm +_maps/RandomZLevels/away_mission/jungleresort.dmm #_maps/RandomZLevels/away_mission/moonoutpost19.dmm #_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm #_maps/RandomZLevels/away_mission/caves.dmm diff --git a/config/comms.txt b/config/comms.txt index 865011032e..5a32f10fd3 100644 --- a/config/comms.txt +++ b/config/comms.txt @@ -1,17 +1,17 @@ -## Communication key for receiving data through world/Topic(), you don't want to give this out -#COMMS_KEY default_pwd - -## World address and port for server recieving cross server messages -## Use '+' to denote spaces in ServerName -## Repeat this entry to add more servers -#CROSS_SERVER ServerName byond:\\address:port - -## Name that the server calls itself in communications -#CROSS_COMMS_NAME - -## Hub address for tracking stats -## example: Hubmakerckey.Hubname -#MEDAL_HUB_ADDRESS - -## Password for the hub page +## Communication key for receiving data through world/Topic(), you don't want to give this out +#COMMS_KEY default_pwd + +## World address and port for server recieving cross server messages +## Use '+' to denote spaces in ServerName +## Repeat this entry to add more servers +#CROSS_SERVER ServerName byond:\\address:port + +## Name that the server calls itself in communications +#CROSS_COMMS_NAME + +## Hub address for tracking stats +## example: Hubmakerckey.Hubname +#MEDAL_HUB_ADDRESS + +## Password for the hub page #MEDAL_HUB_PASSWORD \ No newline at end of file diff --git a/config/config.txt b/config/config.txt index a550e6bf8a..c7bb36af0e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -11,6 +11,8 @@ $include dynamic_config.txt $include plushies/defines.txt $include job_threats.txt $include policy.txt +$include persistence.txt +$include respawns.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: @@ -206,9 +208,6 @@ VOTE_AUTOTRANSFER_MAXIMUM 4 ## players' votes default to "No vote" (otherwise, default to "No change") # DEFAULT_NO_VOTE -## disable abandon mob -NORESPAWN - ## disables calling del(src) on newmobs if they logout before spawnin in # DONT_DEL_NEWMOB @@ -375,6 +374,9 @@ NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 ##Name of the place to send people rejected by the bunker #PANIC_SERVER_NAME [Put the name here] +##Automated age verification, comment this out to not ask new users if they are 18+ +AGE_VERIFICATION + ## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog #AGGRESSIVE_CHANGELOG @@ -408,7 +410,7 @@ ALLOW_MAP_VOTING 1 ## APPROVAL (can vote for as many as you want), I ## IRV (vote by ranked choice, winner determined by instant runoff algorithm) ## SCORE (give individual rankings of each choice, winner determined by majority judgement algorithm) -MAP_VOTE_TYPE SCORE +MAP_VOTE_TYPE APPROVAL ## Map rotate chance delta ## This is the chance of map rotation factored to the round length. @@ -519,7 +521,7 @@ DEFAULT_VIEW 21x15 ### NOTE FOR LINUX HOSTS: This requires manual setup of iptables. Beware that improper configuration of this can and will irreversibly fuck up a server, so please don't tinker with it if you don't know what you're doing. ## Enabled #FAIL2TOPIC_ENABLED -## Minimum wait time in deciseconds between valid requests +## Minimum wait time in deciseconds between valid requests FAIL2TOPIC_RATE_LIMIT 10 ## Number of requests after breaching rate limit that triggers a ban FAIL2TOPIC_MAX_FAILS 5 diff --git a/config/dynamic_config.txt b/config/dynamic_config.txt index c08b316e2e..480f6d8ed8 100644 --- a/config/dynamic_config.txt +++ b/config/dynamic_config.txt @@ -13,6 +13,9 @@ STORYTELLER_WEIGHT EXTENDED 0 STORYTELLER_MIN_PLAYERS CHAOTIC 30 STORYTELLER_MIN_PLAYERS TEAMWORK 30 +## If this is uncommented, Dynamic won't disable certain storytellers based on recent round threats +#NO_STORYTELLER_THREAT_REMOVAL + ## Injection delays: how long (in minutes) will pass before a midround or latejoin antag is injected. DYNAMIC_MIDROUND_DELAY_MIN 5 DYNAMIC_MIDROUND_DELAY_MAX 15 @@ -171,8 +174,8 @@ DYNAMIC_COST LATEJOIN_REVOLUTION 20 DYNAMIC_COST LATEJOIN_BLOODSUCKER 10 DYNAMIC_COST LATEJOIN_COLLECTOR 1 -## Rule will not be generated with threat levels below requirement at a pop value. Pop values are determined by dynamic's pop-per-requirement. -## By default it's 0-8, 9-17, 18-26, 27-35, 36-44, 45-53, 54-60, 61-69, 70-78, 79+. +## Rule will not be generated with threat levels below requirement at a pop value. Pop values are determined by dynamic's pop-per-requirement. +## By default it's 0-8, 9-17, 18-26, 27-35, 36-44, 45-53, 54-60, 61-69, 70-78, 79+. ## This means that 40 30 30 20 20 20 15 15 15 10 will not generate below 40 at 0-8, 30 at 9-17 etc. DYNAMIC_REQUIREMENTS TRAITOR 50 50 50 50 50 50 50 50 50 50 DYNAMIC_REQUIREMENTS TRAITORBRO 101 101 101 101 101 101 101 101 101 101 @@ -301,6 +304,6 @@ DYNAMIC_GLORIOUS_DEATH_COST 5 DYNAMIC_ASSASSINATE_COST 2 ## This requirement uses threat level, rather than current threat, which is why it's higher. -DYNAMIC_WAROPS_REQUIREMENT 60 +DYNAMIC_WAROPS_REQUIREMENT 60 DYNAMIC_WAROPS_COST 10 diff --git a/config/game_options.txt b/config/game_options.txt index a5b0d0b8c4..7776d87d4e 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -477,6 +477,7 @@ ROUNDSTART_RACES xeno ROUNDSTART_RACES slimeperson ROUNDSTART_RACES guilmon ROUNDSTART_RACES ipc +ROUNDSTART_RACES arachnid ##------------------------------------------------------------------------------------------- @@ -650,21 +651,30 @@ PENIS_MIN_INCHES_PREFS 1 PENIS_MAX_INCHES_PREFS 20 ## Body size configs, the feature will be disabled if both min and max have the same value. -BODY_SIZE_MIN 1 -BODY_SIZE_MAX 1 +BODY_SIZE_MIN 0.9 +BODY_SIZE_MAX 1.25 ## Pun-Pun movement slowdown given to characters with a body size smaller than this value, ## to compensate for their smaller hitbox. ## To disable, just make sure the value is lower than 'body_size_min' -THRESHOLD_BODY_SIZE_SLOWDOWN 0.85 +THRESHOLD_BODY_SIZE_PENALTY 1 ## Multiplier used in the smaller strides slowdown calculation. ## Doesn't apply to floating or crawling mobs. -BODY_SIZE_SLOWDOWN_MULTIPLIER 0.25 +BODY_SIZE_SLOWDOWN_MULTIPLIER 0 ## Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. ALLOW_CUSTOM_SKINTONES ## Enables the FoV component, which hides objects and mobs behind the parent from their sight, unless they turn around, duh. ## Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. -#USE_FIELD_OF_VISION \ No newline at end of file +#USE_FIELD_OF_VISION + +## Default turf threshold to get dirt +TURF_DIRT_THRESHOLD 100 + +## Default alpha of dirt on spawn +DIRT_ALPHA_STARTING 127 + +## Allows pAI custom holoforms +PAI_CUSTOM_HOLOFORMS diff --git a/config/persistence.txt b/config/persistence.txt new file mode 100644 index 0000000000..7d65a150e2 --- /dev/null +++ b/config/persistence.txt @@ -0,0 +1,14 @@ +### Whether or not cleanable object persistence is on +PERSISTENT_DEBRIS + +### Whether or not ONLY persistent cleanable objects should be spawned, for supported objects +PERSISTENT_DEBRIS_ONLY + +### Max objects to store, total +PERSISTENT_DEBRIS_GLOBAL_MAX 10000 + +### Max objects to store per type, total +PERSISTENT_DEBRIS_TYPE_MAX 2000 + +### Wipe objects on nuke for the above +PERSISTENT_DEBRIS_WIPE_ON_NUKE diff --git a/config/respawns.txt b/config/respawns.txt new file mode 100644 index 0000000000..804a856a93 --- /dev/null +++ b/config/respawns.txt @@ -0,0 +1,29 @@ +## Allow usage of the respawn system +RESPAWNS_ENABLED + +## Minutes delay before allowing respawns, either from death or observing. Not an integer. +RESPAWN_DELAY 15.0 + +## Minutes delay before allowing respawns, if the user cryo'd. Not an integer. +RESPAWN_DELAY_CRYO 5.0 + +## Allow respawning as anything but an assistant. +ALLOW_NON_ASSISTANT_RESPAWN + +## Allow respawning as security and command. Only works if ALLOW_NON_ASSISTANT_RESPAWN is on. +# ALLOW_COMBAT_ROLE_RESPAWN + +## Allow respawning as the same character +# ALLOW_SAME_CHARACTER_RESPAWN + +## Observing is considered a respawn for the purposes of role lockouts. Defaults to disabled. When disabled, only RESPAWNING rather than returning from observe locks you out. +# RESPAWN_PENALTY_INCLUDES_OBSERVE + +## Time in minutes from round start before respawn is enabled +RESPAWN_MINIMUM_DELAY_ROUNDSTART 30.0 + +## Gamemode (config tags!) banlist for respawn +RESPAWN_CHAOS_GAMEMODES WIZARD +RESPAWN_CHAOS_GAMEMODES NUCLEAR +RESPAWN_CHAOS_GAMEMODES CLOWNOPS +RESPAWN_CHAOS_GAMEMODES REVOLUTION diff --git a/dependencies.sh b/dependencies.sh index 75e49f3fe1..e8709d10b1 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -11,16 +11,13 @@ export BYOND_MINOR=${LIST[1]} unset LIST #rust_g git tag -export RUST_G_VERSION=0.4.4 - -#bsql git tag -export BSQL_VERSION=v1.4.0.0 +export RUST_G_VERSION=0.4.7 #node version export NODE_VERSION=12 -# PHP version -export PHP_VERSION=5.6 - # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.4 +export SPACEMAN_DMM_VERSION=suite-1.6 + +# Extools git tag +export EXTOOLS_VERSION=v0.0.6 diff --git a/html/changelog.css b/html/changelog.css index 2bfa3fa495..da32a5a557 100644 --- a/html/changelog.css +++ b/html/changelog.css @@ -1,41 +1,41 @@ -.top{font-family:Tahoma,sans-serif;font-size:12px;} -h2{font-family:Tahoma,sans-serif;} -a img {border:none;} -.bgimages16 li { - padding:2px 10px 2px 30px; - background-position:6px center; - background-repeat:no-repeat; - border:1px solid #ddd; - border-left:4px solid #999; - margin-bottom:2px; -} -.bugfix {background-image:url(bug-minus.png)} -.wip {background-image:url(hard-hat-exclamation.png)} -.tweak {background-image:url(wrench-screwdriver.png)} -.soundadd {background-image:url(music-plus.png)} -.sounddel {background-image:url(music-minus.png)} -.rscdel {background-image:url(cross-circle.png)} -.rscadd {background-image:url(tick-circle.png)} -.imageadd {background-image:url(image-plus.png)} -.imagedel {background-image:url(image-minus.png)} -.spellcheck {background-image:url(spell-check.png)} -.experiment {background-image:url(burn-exclamation.png)} -.refactor {background-image:url(burn-exclamation.png)} -.code_imp {background-image:url(coding.png)} -.config {background-image:url(chrome-wrench.png)} -.admin {background-image:url(ban.png)} -.server {background-image:url(hard-hat-exclamation.png)} -.balance {background-image:url(scales.png)} -.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} -.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} -.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} -.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} -.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} -.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} -.hidden {display:none;} -.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} -.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} -.indrop img {margin-right:5px;vertical-align:middle;} -.closed {background:url(chevron-expand.png) right center no-repeat;} -.open {background:url(chevron.png) right center no-repeat;} -.lic {font-size:9px;} +.top{font-family:Tahoma,sans-serif;font-size:12px;} +h2{font-family:Tahoma,sans-serif;} +a img {border:none;} +.bgimages16 li { + padding:2px 10px 2px 30px; + background-position:6px center; + background-repeat:no-repeat; + border:1px solid #ddd; + border-left:4px solid #999; + margin-bottom:2px; +} +.bugfix {background-image:url(bug-minus.png)} +.wip {background-image:url(hard-hat-exclamation.png)} +.tweak {background-image:url(wrench-screwdriver.png)} +.soundadd {background-image:url(music-plus.png)} +.sounddel {background-image:url(music-minus.png)} +.rscdel {background-image:url(cross-circle.png)} +.rscadd {background-image:url(tick-circle.png)} +.imageadd {background-image:url(image-plus.png)} +.imagedel {background-image:url(image-minus.png)} +.spellcheck {background-image:url(spell-check.png)} +.experiment {background-image:url(burn-exclamation.png)} +.refactor {background-image:url(burn-exclamation.png)} +.code_imp {background-image:url(coding.png)} +.config {background-image:url(chrome-wrench.png)} +.admin {background-image:url(ban.png)} +.server {background-image:url(hard-hat-exclamation.png)} +.balance {background-image:url(scales.png)} +.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} +.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} +.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} +.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} +.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} +.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} +.hidden {display:none;} +.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} +.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} +.indrop img {margin-right:5px;vertical-align:middle;} +.closed {background:url(chevron-expand.png) right center no-repeat;} +.open {background:url(chevron.png) right center no-repeat;} +.lic {font-size:9px;} diff --git a/html/changelog.html b/html/changelog.html index 0de57ebe79..1a9457b200 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,1157 +50,1138 @@ -->
-

04 October 2020

-

DeltaFire15 updated:

+

24 February 2021

+

SandPoot updated:

    -
  • Synths / IPCs are no longer wound immune.
  • -
  • Husked IPCs / Synths should now be rendered correctly.
  • -
  • Falling vendors now squish synths / IPCs' limbs again.
  • -
  • Synths and IPCs now do not have some fun roundstart oversights anymore.
  • -
  • Regenerate_limbs now works for carbons with the ROBOTIC_LIMBS trait.
  • -
  • Pacifists no longer counterattack on parries if that attack would be harmful.
  • -
  • Heretic sacrifices now husk with the reason of burn, and deal some additional damage.
  • -
  • Neovgre can no longer become invincible on clock tiles.
  • -
  • Plushlings no longer break when absorbing snowflake plushies.
  • +
  • Regular crowbars no longer open powered airlocks.
-

Detective-Google updated:

+

silicons updated:

    -
  • the snow cabin doors actually bolt now
  • +
  • xeno cube makes hostile xenos now, and drops a sentinel instead of a drone.
-

Putnam3145 updated:

+ +

23 February 2021

+

keronshb updated:

    -
  • Ghosts are no longer incapable of going away.
  • -
-

monster860 updated:

-
    -
  • The slimeperson swap-body UI stays open when you switch bodies
  • +
  • Hyperblade to uplink with poplock
  • +
  • Removes combination of two Dragon Tooth Swords while keeping it for regular eutactics.

timothyteakettle updated:

    -
  • limb id entry in mutant bodyparts now supports switching to/from species with gendered body parts
  • -
  • the minimum brightness of mutant parts is now a define
  • +
  • banning panel prioritises mobs with clients now when trying to find them if they're in the game
-

02 October 2020

-

ArcaneMusic, with minor tweaks by TheObserver-sys updated:

-
    -
  • Adds and modifies fertilizers, as well as a new stat, Instability.
  • -
  • Removes the rather disused functionality of irrigation hoses, temporarily disables circuit use on hydroponics trays.
  • -
  • Plant Analyzer have been upgraded. Using one in hand will now switch between a stat view of your plant, and a chemical view of your plant. tweak:Trays now accept and store reagents, as well as coming with an autogrow mode. However, these upgrades came at the cost of old self sufficiency, meaning you must attend to your plants a bit more often.
  • -
  • Earthsblood, while not being able to gild trays anymore, has been found to still be quite powerful as a fertilizer.
  • -
-

CoreFlare updated:

-
    -
  • Altcloaks! Available in loadout.
  • -
-

Detective-Google updated:

-
    -
  • a smattering of clothes from the RP server
  • -
  • detective wardrobe
  • -
-

EmeraldSundisk updated:

-
    -
  • Adds the "Skelter" space ruin
  • -
  • Creates a few new area designations for the Skelter
  • -
  • Cargo techs now have access to a "long pants" variant of their standard work uniform
  • -
  • Adds said uniform to CargoDrobes and the loadout menu
  • -
-

ItzGabby updated:

-
    -
  • Three new turf tiles.
  • -
  • Turf icons with multiple damage icons, with in-hand icons for each tile.
  • -
  • Edited the name and description to wooden.
  • -
-

LetterN updated:

-
    -
  • craftable railings
  • -
  • ports robust savefiles
  • -
-

MrJWhit updated:

-
    -
  • tweaked heavy suit dmi
  • -
  • Fixes drones not being able to quickslot items
  • -
+

22 February 2021

Putnam3145 updated:

    -
  • New policy config for pyroclastic slimes.
  • -
  • SDGF clones now naked.
  • -
  • SDGF is now way more likely to make a clone that will align with the creator's goals, with purity, making it a better antagging tool.
  • -
  • SDGF clones now have the same traits as the original.
  • -
  • transfer_ckey now resets view, preventing things like SDGF clones with much larger view range.
  • -
  • Policy configs have been added for SDGF, currently unused: SDGF, SDGF_ALIGNED, SDGF_UNALIGNED.
  • -
  • Shivering now has thresholds and fever's thresholds now work.
  • -
  • Made allturfs setup actually set up all turfs.
  • -
  • Dynamic is now more aggressive with adding antags.
  • -
  • Fixes vore pref saving.
  • +
  • (Hexa)crocin
  • +
  • (Hexa)camphor
  • +
  • Nymphomaniac quirk
  • +
  • All climaxes and arousals are now logged, as well as genital exposure.

SandPoot updated:

    -
  • Fixes headslugs being unable to recover their human form.
  • +
  • Cyborg tablets and it's special app for self-management.
  • +
  • In the case of a doomsday device being created outside of an AI it will delete itself.
  • +
  • Some sprites for it have been added and the borg's hud light toggles been changed to only on-off (made by yours truly)
  • +
  • A lot of borg code was changed
  • +
  • Tools no longer use istype checks and actually check for their behavior.
-

Tupinambis updated:

+

Vynzill updated:

    -
  • Adds methane and methyl bromide gases.
  • -
  • Minor gas name/desc changes to improve consistency
  • -
  • Ports the methyl bromide tank from bay. Adds two new canister sprites for the new gases and CH4 screen alerts.
  • -
  • fixed a mispelling in the wound armor value for the bounty hunter suit
  • +
  • cursed rice hat that's hard to find and obtain, along with a couple other hats
  • +
  • a replacement toy gun for donksoft lmg
  • +
  • gorillas to the jungle gateway, friendly, even when attacked.
  • +
  • couple mapping errors I noticed, most importantly a missing window in the chapel.
  • +
  • shotgun and donksoft lmg removed, captain coat nerfed armor values.
  • +
  • leaper healthpool from 450 to 550 hopefully making it more of a struggle, and gives it a name.
  • +
  • leaper pit is more wider. The hidden room south is now more obvious to find
-

dapnee updated:

+

dzahlus updated:

    -
  • atrium, clinic, an extra office, a pseudo public mining area, two more deluxe dorms, micro beach, aux bathroom, two construction areas, mass driver, more intercoms
  • -
  • moved all of service, chapel, dorms, garden, holodeck to a different z-level, RnD is more open, maintenance is a bit more random, more firelocks, added more mine-able rock
  • -
  • fixed the buttons in xenobio, gave shutters to cargo's storage area, fixed holodeck so it works now, fixed some techfabs being lathes, added sensors to atmos tanks, more decals, couple more signs, little floral areas and sitting areas added to break up hallway monotony, mech chargers are no longer missing their consoles, whiteship won't crash into arrivals anymore while the area it takes up is more telegraphed, APC placement on AI sat entrance, missing wire node for the outer portion of the AI sat, civilian level now has a telecom relay
  • -
-

lolman360 updated:

-
    -
  • smonk machine runtimes
  • -
  • automatic hydro tray has a unique sprite now (fancy robot arm)
  • -
-

timothyteakettle updated:

-
    -
  • added luminescent and stargazer sprites as selectable body sprites for slimes
  • -
  • wound exponent lowered slightly from 1.225 to 1.2
  • -
  • wound exponent and limb damage multiplier are now config values
  • -
  • ipcs and synthlizards are now treated as actual robots, with robotic limbs, an extra organ, and better emp acts
  • -
  • surgeries for healing robotic limbs, and brain surgery for robotic heads
  • -
  • androids limbs now show up as intended
  • -
  • emps now work from 1-100 severity instead of 1/2 and the severity reduces as you move from the epicentre
  • -
-

zeroisthebiggay updated:

-
    -
  • ratvar gf is complete
  • +
  • Added pain emote to getting wounded
  • +
  • added a new pain emote sounds
-

01 October 2020

-

BlueWildrose updated:

+

21 February 2021

+

Hatterhat updated:

    -
  • Slimepeople are given unique laughs and screams.
  • -
  • Adds "warbles", "chimpers", and "puffs" to the customizable speech verbs for character.
  • +
  • Anomaly announcements and brand intelligence now always announce instead of having some ham-fisted chance of being a command report.
- -

29 September 2020

-

timothyteakettle updated:

+

IronEleven updated:

    -
  • fixed a typo causing your right eye colour to save as the left eye colour
  • -
- -

28 September 2020

-

ArchieBeepBoop updated:

-
    -
  • Craftable Micro Powered Fans
  • -
-

Degirin2120 updated:

-
    -
  • Added engineering hazard jumpsuits, can be found in the engidrobe, comes in 3 varieties.
  • -
-

Putnam3145 updated:

-
    -
  • Added a brute-force check-every-single-tile step to SSair when it has enough time to run.
  • -
  • G fuid production is now much lower.
  • -
  • Supermatter sabotage objective's gone.
  • -
  • Subterfuge objectives are now all equally likely.
  • -
  • Replaced a "(hopefully) 1" with a "2"
  • -
  • Cryoing no longer unwins already-won objectives.
  • -
-

SiliconMain updated:

-
    -
  • Minor adjustment to material cost of long range atmos analyzer
  • -
-

Trilbyspaceclone updated:

-
    -
  • Most drinks now have some animation in them, from basic soda bubbles fizzing around to ice cubes bobbing just a bit.
  • -
-

Tupinambis updated:

-
    -
  • Ghost poly's color value is now a hex value instead of an oct value. This has been a thing for OVER FIVE YEARS
  • -
  • Updates TEG, Antimatter, Jetpack sprites (CO2 and Oxy from Eris).
  • -
  • Replaced old chair sprites with new ones ported and modified from eris.
  • -
  • Beds can now be placed both right and left.
  • -
  • Subtle changes to stool legs to give them more of a shine.
  • -
-

raspy-on-osu updated:

-
    -
  • TEG power generation
  • -
-

thakyZ updated:

-
    -
  • Added the ability to print the Light Replacer at the Engineering Protolathe
  • -
-

timothyteakettle updated:

-
    -
  • turrets can once again be broken
  • -
  • you can now have heterochromia and select individual eye colours
  • -
- -

27 September 2020

-

SiliconMain updated:

-
    -
  • Holograms made from projectors (atmos, engi, sec, medical, ect...) can no longer be contaminated by radiation
  • -
- -

26 September 2020

-

CoreFlare updated:

-
    -
  • IPC's can have hair. Why wasn't this added earlier. Use the bald hairstyle for no hair.
  • -
- -

25 September 2020

-

Putnam3145 updated:

-
    -
  • Removed a non-working proc that already had its functionality implemented in another proc in the same file.
  • -
- -

24 September 2020

-

Putnam3145 updated:

-
    -
  • Atmos is free.
  • -
- -

22 September 2020

-

Arturlang updated:

-
    -
  • TGUI Statpanel
  • -
-

YakumoChen updated:

-
    -
  • Mechsuits, robotics jumpsuits added to RoboDrobe
  • -
-

timothyteakettle updated:

-
    -
  • character previews should be more consistent now
  • -
- -

20 September 2020

-

DeltaFire15 updated:

-
    -
  • Sutures work on simplemobs again.
  • -
  • Attacking dismembered bodyparts now targets the chest instead, for weapons aswell as unarmed attacks.
  • +
  • Raises Space Vine Population Requirement from 10 to 20

MrJWhit updated:

    -
  • New sprites for chess pieces! You can craft them in-game with metal sheets.
  • -
-

silicons updated:

-
    -
  • hulks can smash again (walls no longer break their hands)
  • -
  • acid no longer degrades armor
  • -
- -

17 September 2020

-

DeltaFire15 updated:

-
    -
  • Failing the plushmium reaction can now create peculiar plushies, depending on reaction volume.
  • -
  • The mood-buff from petting a plushie now works properly again.
  • -
  • Fixed wacky necropolis loot chest behavior
  • -
-

EmeraldSundisk updated:

-
    -
  • Adds the Research Director's office to Omega Station
  • -
  • Adds 2 new solar arrays (and control rooms)
  • -
  • Adds some action figures that weren't there previously
  • -
  • The CMO's office now has a light switch
  • -
  • Slight readjustments to impacted areas
  • -
  • Readjusts the toxins air supply line to (ideally) be easier to service
  • -
  • Department camera consoles should now be able to actually check appropriate cameras
  • -
  • Xenobiology can now be locked down (by the Research Director)
  • -
-

MrJWhit updated:

-
    -
  • Adds a brain damage line
  • -
-

Putnam3145 updated:

-
    -
  • Your balls finally feel full, again.
  • +
  • Removes an unnecessary % on the seed extractor.

timothyteakettle updated:

    -
  • due to changes in policy, and several lawsuits, Nanotrasen has been forced to allow disabled people to sign up
  • +
  • the query for checking mentors now gets properly deleted
  • +
  • vampires no longer burn in the chapel if they signed up as the chaplain
-

16 September 2020

-

timothyteakettle updated:

+

20 February 2021

+

Adelphon updated:

    -
  • fixed an icon path
  • -
- -

12 September 2020

-

BlueWildrose updated:

-
    -
  • The Polychromic winter coat's hoodie will now polychrome, alongside any other new polychromic items with toggleable headwear.
  • -
  • Minesweeper will no longer blow up the player's ears when they select "Play on the same board"
  • -
  • Slimepeople will find warm donk pockets among other toxin healing items even more repulsive, as they are anti-toxic.
  • -
  • Slimepeople are now neutral to gross foods.
  • -
-

DeltaFire15 updated:

-
    -
  • AIs can no longer qdel() the gravity generator
  • -
-

Putnam3145 updated:

-
    -
  • Added some unit tests for reactions.
  • -
  • replaced handle_changeling and handle_bloodsucker with signal registration
  • -
-

Sonic121x updated:

-
    -
  • Fixed pill button on chemical press
  • -
-

TheObserver-sys updated:

-
    -
  • Brass now has a proper datum. Aspiring Forgetenders rejoice!
  • -
-

Trilbyspaceclone updated:

-
    -
  • Race based drinks will no longer stay inside your blood for ever.
  • -
-

Tupinambis updated:

-
    -
  • Redid Cogstation atmos pipes to make it less cluttered.
  • -
  • Removed a few doors from the main hallway to mitigate chokepoint issues
  • -
  • All belt hell conveyers are now on by default, so that belt hell actually works.
  • -
  • IDs for poddoors and belts and the like. Everything is now properly hooked and should work as expected (except for the pressure triggered mass drivers)
  • -
  • addresses most if not all roundstart active turfs.
  • -
  • Issue where wires were connected to the SMES improperly, and SMES were not properly precharged, resulting in power failure earlier than intended.
  • -
  • various rogue turfs and wirings.
  • -
  • security office APC being hooked to maintenance for some reason.
  • -
  • TEG is now directly wired to the SMES.
  • -
  • adds a subtype of mass drivers that is triggered by things being on it. TODO: Make these mass drivers trigger poddoors, to make belt hell fully functional.
  • -
-

lolman360 updated:

-
    -
  • glaives now work again
  • -
-

zeroisthebiggay updated:

-
    -
  • Revolver is now poplocked down to fifteen people.
  • -
- -

11 September 2020

-

Putnam3145 updated:

-
    -
  • Superconducting turfs now can't go below 0 celsius.
  • -
- -

09 September 2020

-

Putnam3145 updated:

-
    -
  • Made superconductivity work for the first time literally ever.
  • -
-

timothyteakettle updated:

-
    -
  • accents work better
  • -
- -

08 September 2020

-

Ghommie updated:

-
    -
  • fixed names of the Electrical Toolbox goodie pack and green croptop christmas suit.
  • -
  • Fixed turf visuals for real. Original PR by AnturK on tgstation.
  • -
-

KeRSedChaplain updated:

-
    -
  • added borg_deathsound.ogg and android_scream.ogg
  • -
-

silicons updated:

-
    -
  • meteor waves now have a static 5 minute timer.
  • -
- -

07 September 2020

-

DeltaFire15 updated:

-
    -
  • fixed a typo causing a span not to show.
  • -
-

Putnam for debugging ammo loading! Thx!! updated:

-
    -
  • Removed spell blade, diamond picaxe, and fire wand from lava land loot tables
  • -
  • Each mini boss now has its own type of crate.
  • -
  • Each spike has its own type of crate that it pulls its now smaller loot table from
  • -
  • Moved god eye from spike loot table to hard spawn collosses fight
  • -
  • Moved holoparasight from spike loot table to bubble gum
  • -
  • Moved magic meat hook from spike loot table to drake
  • -
  • 2 more crates to Arena Shuttle as well as 4-4-4 of each new type of chest
  • -
  • Replaced the diamond pick loot with a better one
  • -
  • Replaced the cursted katana with a non cursted verson that deals half the damage and has less block!
  • -
  • Three new potions, blue heals the mind like a mama potion, Green heals the soul aka the organs! Lastly Red heals the body, by 100 damage of each main types. Best not to waste them!
  • -
  • Four more "wands" Spellbooks! These fun little guys shoot out its own pages to do the affect, one will set the target on fire like a bullet, one will harm them a bit, one will heal the target a small bit - How nice! Last one will give them a few statis affects like a taser bolt but without as much power or tasing affect
  • -
- -

06 September 2020

-

Putnam3145 updated:

-
    -
  • Dynamic no longer pushes events.
  • -
  • Made spontaneous brain trauma a good deal less annoying.
  • -
-

lolman360, NecromancerAnne updated:

-
    -
  • The ancient art of blacksmithing, now in pixels.
  • -
  • cool swords and shit (thanks anne)
  • -
-

raspy-on-osu updated:

-
    -
  • thermomachine examine text
  • -
- -

05 September 2020

-

Bhijn updated:

-
    -
  • Readded the old method of temperature notifications in the form of a new pair of shivering/sweating notifications.
  • -
-

Putnam3145 updated:

-
    -
  • Hilbert hotel flavor text for one particular snowflake hotel changed.
  • -
  • admins can now actually reduce threat level in dynamic
  • -
  • Made owo.ogg smaller.
  • -
  • Character saving unit test is now more verbose on failure.
  • -
  • Added an extools proc hook alternative to rust_g logging.
  • -
-

raspy-on-osu updated:

-
    -
  • supermatter shard examine text
  • -
  • protolathe item categories
  • -
- -

04 September 2020

-

timothyteakettle updated:

-
    -
  • ipcs can speak
  • -
- -

03 September 2020

-

Ghommie updated:

-
    -
  • Jaunters should now work with magic mirror chasming.
  • -
  • The photocopier can now print more than one copy at a time.
  • -
  • Alkali perspiration infos don't crash the Pandemic UI anymore.
  • -
  • Windoors can be actually tinted now.
  • -
- -

02 September 2020

-

Putnam3145 updated:

-
    -
  • Added a unit test for character saving.
  • -
  • Plastitanium rapier no longer silently sleeps with no chance at counterplay when used by pacifists.
  • -
  • Fusion scan is now actually useful.
  • -
-

Tupinambis updated:

-
    -
  • moved the dakis, genital growth pills, and genital autosurgeons out of the maintenance loot table and into kinkmates.
  • -
-

raspy-on-osu updated:

-
    -
  • pyroclastic anomaly client spam
  • -
-

timothyteakettle updated:

-
    -
  • you can hide your ckey now from the roundend report
  • -
- -

01 September 2020

-

BlueWildrose updated:

-
    -
  • fixed slimes starting off hungry
  • -
- -

31 August 2020

-

Arturlang updated:

-
    -
  • Slimes can now damage structures, don't leave them unfed!
  • +
  • polychromic pants
  • +
  • urban coat made polychromic

Chiirno updated:

    -
  • Moves pill_bottles/dice to box/dice on CogStation.
  • -
-

Couls, ported by NecromancerAnne updated:

-
    -
  • cleans up mech backstabbing code
  • -
-

DeltaFire15 updated:

-
    -
  • teleport-to-ark ability of the eminence, commented out
  • -
  • teleport-to-obelisk ability for the eminence
  • -
-

Detective-Google updated:

-
    -
  • plasmamen have no more slowdown
  • -
  • object reskins now use very nice and cool radials
  • -
-

EmeraldSundisk updated:

-
    -
  • Adds a pool to MetaStation
  • -
  • Slight readjustments to the surrounding area
  • -
  • Fixes a handful of external airlocks
  • -
-

ForrestWick updated:

-
    -
  • removes wall walking boots from nukie uplink
  • -
-

Ghommie updated:

-
    -
  • e-gun overlays and some floor decals should have been fixed.
  • -
-

LetterN updated:

-
    -
  • tgchat
  • -
-

Lynxless updated:

-
    -
  • Changed anatomic panacea into a direct buff, instead of a chem injection
  • -
  • Changed the values of anatomic panacea
  • -
  • Added a new icon for panacea's buff alert
  • -
-

Putnam3145 updated:

-
    -
  • Pref for genital/vore examine text
  • -
  • Fixed a couple events having ghost roles eligible.
  • -
  • Buffed slaughter demon: gets stronger as it eats people
  • -
  • Nerfed slaughter demon: no longer permanently round-removes all who are eaten by it, instead releasing their now-heartless bodies
  • -
  • Dynamic storytellers now calculate property weights properly.
  • -
-

Sonic121x updated:

-
    -
  • Fix the four type of new tea that will stuck inside your vein.
  • -
  • drinking glass sprite for those tea.
  • -
-

kappa-sama updated:

-
    -
  • miners can no longer acquire funny antag item
  • -
-

lolman360 updated:

-
    -
  • shuttle engine/heater sprites now face the right way
  • -
-

raspy-on-osu updated:

-
    -
  • TEG power output
  • -
  • tesla movement priorities
  • -
  • tesla counterplay
  • -
  • tesla containment check (containment variable now usable)
  • -
-

silicons updated:

-
    -
  • brooms now sweep objects on MOVABLE_PRE_MOVE rather than MOVABLE_MOVED
  • -
  • firedoors no longer automatically open on touch when there's no pressure differences.
  • -
-

timothyteakettle updated:

-
    -
  • buzz, buzz2 and ping are now all unrestricted emotes and can be used by anyone
  • -
  • the drake credit and pickle credit sprites have been removed
  • -
  • tongue speech handling is now done by accent datums
  • -
-

zeroisthebiggay updated:

-
    -
  • waffleco
  • -
- -

30 August 2020

-

raspy-on-osu updated:

-
    -
  • new explosion echoes
  • -
  • explosion echo range
  • -
  • 5 new explosion related sounds
  • -
- -

28 August 2020

-

EmeraldSundisk updated:

-
    -
  • Adds more paper to the library
  • -
  • The law office now has a desk window
  • -
  • Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding areas to accommodate this.
  • -
  • Updates some of CogStation's paperwork
  • -
  • The rat in the morgue turned themselves into a possum. Funniest shit I've ever seen.
  • -
  • Adjusts some area designations so cameras should receive power properly
  • -
  • Cleans up an errant decal
  • -
-

Hatterhat updated:

-
    -
  • Traitor holoparasites can now only be bought once, because apparently you can only have one active holopara.
  • -
  • PDA bombs can now only be bought once per uplink.
  • -
-

lolman360 updated:

-
    -
  • atmos = radiation = chemistry.
  • -
-

shellspeed1 updated:

-
    -
  • Adds slow mode for iv drips
  • -
-

timothyteakettle updated:

-
    -
  • an ancient game over a thousand years old has re-emerged among crewmembers - rock paper scissors
  • -
  • customization features appear in alphabetical order where necessary
  • -
  • bokken do two more stamina damage now
  • -
  • you can now choose a body sprite as an anthromorph or anthromorphic insect, and can choose from aquatic/avian and apid respectively (and obviously back to the defaults too)
  • -
- -

27 August 2020

-

silicons updated:

-
    -
  • eyebeam lighting can only have 128 maximum HSV saturation now.
  • -
  • no more shotgun stripper clips in boxes.
  • -
  • goliath tentacles now do 20 damage to mechs at 25% ap
  • -
-

timothyteakettle updated:

-
    -
  • changing your character's gender won't randomize its hairstyle and facial hairstyle now
  • -
- -

26 August 2020

-

ancientpower updated:

-
    -
  • Ghosts can read newscasters by clicking on them.
  • -
-

silicons updated:

-
    -
  • hierophant vortex blasts now have 50% armor penetration vs mecha
  • -
  • ventcrawling now kicks off every attached/buckled mob, even for non humans.
  • -
- -

25 August 2020

-

Hatterhat updated:

-
    -
  • Insidious combat gloves have been replaced by insidious guerilla gloves. They're generally the same, except now you can tackle with them.
  • -
-

Literallynotpickles updated:

-
    -
  • You can now equip handheld crew monitors on all medical-related winter coats.
  • -
-

Putnam3145 updated:

-
    -
  • vore now ejects occupants on death
  • -
-

raspy-on-osu updated:

-
    -
  • Thermoelectric Generator power output
  • -
-

timothyteakettle updated:

-
    -
  • I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them.
  • -
- -

24 August 2020

-

MrJWhit updated:

-
    -
  • Fixes areas on expanded airlocks
  • -
-

silicons updated:

-
    -
  • wormhole jaunters work
  • -
  • wormhole jaunters no longer get interference from bags of holding
  • -
  • airlocks now only shock on pulse/wirecutters instead of on tgui panel open.
  • -
-

timothyteakettle updated:

-
    -
  • three new items are in the loadout for all donators
  • -
-

zeroisthebiggay updated:

-
    -
  • contraband black evening gloves in kinkvend
  • -
- -

23 August 2020

-

DeltaFire15 updated:

-
    -
  • silicons and clockies can now access APCs properly
  • -
-

EmeraldSundisk updated:

-
    -
  • Medbay now has a smartfridge for organ storage
  • -
  • Slight enhancements to the station's electrical wiring layout
  • -
  • Very small library renovation
  • -
  • Exterior airlocks have been given proper air systems for safety's sake
  • -
-

Ghommie updated:

-
    -
  • Stops shielded hardsuits from slowly turning the wearer into a big glowing ball of stacked energy shield overlays.
  • -
  • the shielding overlay is merely visual as result. Aim your clicks.
  • -
-

Ludox235 updated:

-
    -
  • no more 10 pop xenos (25pop now)
  • -
-

MrJWhit updated:

-
    -
  • Increases the majority of airlocks by 1 tile.
  • -
  • Minor adjustments to the TEG engine.
  • -
-

Putnam3145 updated:

-
    -
  • Simplemobs no longer count in dynamic.
  • -
  • "Story" storyteller no longer starts at a ludicrously low threat, always.
  • -
  • Blob threat now scales with coverage.
  • -
  • One person with their pref on no longer overpowers 40 people who might not even know there is one.
  • -
  • Negative-weight rulesets are no longer put into the list.
  • -
-

kiwedespars updated:

-
    -
  • removed durathread from armwraps recipe.
  • -
-

lolman360 updated:

-
    -
  • breath mask balaclava
  • -
-

timothyteakettle updated:

-
    -
  • lizards are now a recommended species for mam snouts
  • -
-

zeroisthebiggay updated:

-
    -
  • new sprites for the temporal katana
  • -
  • suiciding with the temporal katana omae wa mou shinderius you into the shadow realm
  • -
  • twilight isnt earrape
  • -
- -

22 August 2020

-

Time-Green (copypasta'd by lolman360) updated:

-
    -
  • plumbing
  • -
  • automatic hydro trays
  • -
- -

21 August 2020

-

LetterN updated:

-
    -
  • Updates and adds some of the tips
  • -
-

Putnam3145 updated:

-
    -
  • added reftracking as a compile flag
  • +
  • Synthflesh now unhusks with 100u instead of requiring 101u.

SmArtKar updated:

    -
  • RSD limitation is now 500 tiles
  • -
  • Fixed broken RSD sprites
  • -
  • Removed that shuttle limit
  • +
  • Added some QoL changes to TCG
  • +
  • Fixed TCG cards not saving
  • +
+

TyrianTyrell updated:

+
    +
  • fixed the signed language so that you can actually use it, and that it's unusable when it's meant to be.

timothyteakettle updated:

    -
  • two snouts can once again be chosen in customization
  • -
  • lizard snouts work again
  • +
  • stops people using Message All on PDAs when their cartridge doesn't allow it
-

20 August 2020

-

DeltaFire15 updated:

+

19 February 2021

+

Putnam3145 updated:

    -
  • The cooking oil damage formula is no longer scuffed.
  • -
  • Changed the clockie help-link to lead to our own wiki.
  • +
  • Buzz Fuzz's addiction threshold is now a can and a sip as intended.
-

Fikou updated:

+

timothyteakettle updated:

    -
  • admins can now do html in ahelps properly
  • +
  • staring into pierced realities is now logged
  • +
+ +

18 February 2021

+

BlueWildrose updated:

+
    +
  • Admins now receive messages regarding certain holodeck actions.

Hatterhat updated:

    -
  • Pirate threats are now announced as "business propositions", and their arrivals are now also announced properly.
  • -
-

tiramisuapimancer updated:

-
    -
  • Ethereal hair is now their body color instead of accidentally white
  • -
- -

18 August 2020

-

DeltaFire15 updated:

-
    -
  • kindle cast time: 15ds -> 25ds
  • -
  • Moved the Belligerent Scripture to where it should be in the code
  • -
-

Detective-Google updated:

-
    -
  • glass floors
  • -
  • uncrowbarrable plasma floors tweak:disco inferno's plasma floors can no longer be crowbarred.
  • -
  • ghost cafe has funky fresh art
  • -
  • you can actually remove glass floors now
  • -
  • get_equipped_items is hopefully less gross
  • -
  • plasma cutters are no longer gay
  • -
-

Hatterhat updated:

-
    -
  • Slaughter demons (and laughter demons, being a subtype) are MOB_SIZE_LARGE, with one of the more immediate effects being able to mark them with a crusher and backstab them.
  • -
  • The funny blyat men have stumbled upon another surplus of Mosin-Nagants and are starting to pack them into crates again.
  • -
  • Vehicle riders can now, by default, get shot in the face and/or chest.
  • -
  • Adminspawn only .357 DumDum rounds! Because sometimes the other guy just really needs to hurt.
  • -
  • Bluespace beakers now have a chemical window through the side that shows chemical overlays.
  • -
  • Plant DNA manipulators now let you chuck things over them. Or they WOULD, if LETPASSTHROW worked half a damn.
  • +
  • Free Golem Ship GPSes now start as disabled. Like they were supposed to.

LetterN updated:

    -
  • uplink implant states
  • -
  • tweaks how role assigning works
  • +
  • No more liver damage when you opt out of "hornychems"
  • +
+

SmArtKar updated:

+
    +
  • Added a new TCG card game
  • +
+

dzahlus updated:

+
    +
  • Removed maroon objective due to toxic gameplay behaviour
  • +
+

shellspeed1 updated:

+
    +
  • floor bots place plating before tiles now.
  • +
  • gets rid of another tile duplication issue.
  • +
+

silicons updated:

+
    +
  • priviledge --> privilege
  • +
+ +

16 February 2021

+

silicons updated:

+
    +
  • sprint removal entry added, UI will revert to old UI while this is active.
  • +
+ +

15 February 2021

+

Adelphon updated:

+
    +
  • polychromatic shoes
  • +
  • polychromatic windbreaker
  • +
  • polychromatic canvas cloak
  • +
  • digitigrade charismatic suit texture
  • +
+

DeltaFire15 updated:

+
    +
  • Kneecapped pugilist parries somewhat.
  • +
  • Slightly nerfed default unarmed parries.
  • +
  • Slightly nerfed traitor armwrap parries.
  • +
  • Pugilist parries now cannot perfectly defend against projectiles, as they were supposed to.
  • +
  • Some parrying numbers that one would think were in seconds didn't have the SECONDS. I added those.
  • +
  • Clock cultists now yell alot less when invoking scripture.
  • +
+

dzahlus updated:

+
    +
  • Added new emote
  • +
  • added a new emote sound
  • +
+

silicons updated:

+
    +
  • people on the ground hit less hard in unarmed combat. rng miss remove from punches.
  • +
  • chat highlighting no longer drops half your entered words.
  • +
+ +

14 February 2021

+

DeltaFire15 updated:

+
    +
  • The antag panel now correctly shows the names of cultist / clockcult datum subtypes.
  • +
  • Adding clock cultists via the admin panel now works correctly.
  • +
  • Xeno larvae should now be able to ventcrawl again.
  • +
+

Hatterhat updated:

+
    +
  • Repairing sensors on jumpsuits now requires a fully-intact jumpsuit. Find some cloth.
  • +
  • Durathread armor kits now require you to have a fully-repaired jumpsuit, first, with no attachments.
  • +
  • Durathread armor kits now no longer weave the entirety of the jumpsuit armor universe into having armor.
  • +
+

TyrianTyrell updated:

+
    +
  • added a define for multilingual granted languages, and changed the multilingual trait to use it.
  • +
+ +

13 February 2021

+

Hatterhat updated:

+
    +
  • Energy bolas now take 2.5 seconds to remove and dissipate on removal.
  • +
+

timothyteakettle updated:

+
    +
  • migration error to version 39+ of savefiles is now logged instead of messaging all online admins in the chat
  • +
+ +

12 February 2021

+

Hatterhat updated:

+
    +
  • The ATVs on SnowCabin.dmm have been replaced with snowmobiles.

MrJWhit updated:

    -
  • Gives ashwalkers nightvision
  • -
  • Makes tesla blast people, not the environment, to save the server.
  • -
-

TheObserver-sys updated:

-
    -
  • moves Garlic sprites from growing.dmi to growing_vegetable.dmi
  • -
  • Removes the unused Electric Lime mutation, it just takes up space with no actual function nor sprites.
  • -
  • Gives Catnip growing sprites
  • -
  • Removes redundant images in growing.dmi
  • -
-

kiwedespars updated:

-
    -
  • 10 force to a fucking rubber cock.
  • -
-

lolman360 updated:

-
    -
  • shotgun stripper clip nerf. ammoboxes can now accept a load_delay that happens when they attack a magazine, internal or external.
  • -
-

ported from tg updated:

-
    -
  • bronze airlocks and windows can now be built
  • -
  • i also tweaked bronze flooring to be cheaper.
  • +
  • Random deltastation fixes.
  • +
  • Gives boxstation vault door actual vault door access

silicons updated:

    -
  • stamina draining projectiles without stamina for their primary damage type now has their stamina damage taken into account for shield blocking, rather than the block being done for free for that.
  • -
-

timothyteakettle updated:

-
    -
  • snowflake code tidyup
  • -
  • snowflake code for mutant bodypart selection has been rewritten to be ~14x shorter
  • -
  • meat type and horns can now be selected by any species
  • +
  • Voice of God - sleep removed, stun staggers instead, knockdown is faster but does not do stamina damage, vomit is faster but doesn't stun
-

17 August 2020

+

11 February 2021

+

Adelphon updated:

+
    +
  • Charismatic Suit
  • +
  • Urban Jacket
  • +

DeltaFire15 updated:

    -
  • Cogscarabs are no longer always Pogscarabs
  • -
-

Strazyplus updated:

-
    -
  • Added drakeborgs
  • -
  • Added drakeplushies
  • -
  • added drakeborg sprites
  • -
  • added drakeplushie sprites
  • -
  • changed some code - added drakeplushies to backpack loadout Removed duplicate voresleeper belly sprites from engdrake & jantidrake. [CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/)
  • -
  • Added CC BY-NC-SA 3.0 license details to icon/mob/cyborg moved drakeborg.dmi to icon/mob/cyborg
  • -
- -

16 August 2020

-

kiwedespars updated:

-
    -
  • nerfed hypereut chaplain weapon.
  • -
  • 50% rng blockchance -> 0%
  • -
  • parry made much worse because it's an actual weapon and a roundstart one at that.
  • -
-

zeroisthebiggay updated:

-
    -
  • tips
  • -
- -

15 August 2020

-

LetterN updated:

-
    -
  • missing anomaly core icons
  • -
  • wrong state. blame the tg vertion i copied
  • -
-

silicons updated:

-
    -
  • the 8 rotation limit from clockwork chairs has been removed. please don't abuse this.
  • -
  • ethereals can now wear underwear
  • -
- -

14 August 2020

-

silicons updated:

-
    -
  • abductors can buy things
  • -
- -

13 August 2020

-

LetterN updated:

-
    -
  • Removes fermisleepers and reverts them to tg ones
  • -
- -

12 August 2020

-

DeltaFire15 updated:

-
    -
  • hellgun single-pack classification: goodies -> armory
  • -
-

Detective-Google updated:

-
    -
  • hallway table hallway table
  • -
-

Hatterhat updated:

-
    -
  • The temporal katana is now slightly more worthy of the 2 spell point cost, with a smaller, antimagic respecting timestop, less force, and no random blockchance. Society has progressed past the need for blockchance.
  • -
-

LetterN updated:

-
    -
  • Mafia Component
  • -
  • Fixed missing icons and handtele
  • +
  • Added nanogel to the robodrobe.

Putnam3145 updated:

    -
  • a whole lot of jank regarding funny part sprite display.
  • +
  • Config to keep unreadied players from mode voting
-

Toriate updated:

+

dzahlus updated:

    -
  • Opossums have migrated into the maintenance tunnels! Seek them out at your own peril!
  • +
  • fixes grenadelaunch.ogg being used where it shouldn't and makes mech weapons use correct sound
-

ancientpower updated:

+

keronshb updated:

    -
  • Doors added to the west side of box medbay to make things a bit more manageable.
  • -
-

kappa-sama updated:

-
    -
  • smuggler satchel cost 2->1
  • -
  • radio jammer cost 5->2
  • -
  • smuggler satchel uplink description now implies that persistence is disabled
  • -
-

lolman360 updated:

-
    -
  • renameable necklace (accessory, attaches to suit) and ring (glove slot.)
  • -
  • custom rename is now 2048 characters? i think it's characters.
  • -
-

silicons updated:

-
    -
  • You can now use anything as an emoji by doing :/obj/item/path/to/item:. This works for any /atom or subtype.
  • +
  • 10 > 30 second for Warp Implant cooldown
  • +
  • Comments out power sink objective.

timothyteakettle updated:

    -
  • syndicate agents now have access to mechanical aim enhancers which allow them to aim bullets to bounce off walls
  • -
  • ricochets work properly now for the bullets that support them
  • +
  • persistent blood should stop being invisible and alt clicking it shouldn't return the entire spritesheet
  • +
  • pickpocketing is now logged using log_combat

zeroisthebiggay updated:

    -
  • hair and some sechuds
  • -
  • ce hardsuit radproofing
  • +
  • the aesthetic sterile mask no longer hides faces so you can cosplay egirls and keep flavortexts
-

11 August 2020

-

Hatterhat updated:

+

09 February 2021

+

Chiirno updated:

    -
  • PDA uplinks can now steal from pens. Properly. Just make sure to have a pen in your PDA, first.
  • -
-

kappa-sama updated:

-
    -
  • tracer no longer gives you full stamheals per use
  • -
-

zeroisthebiggay updated:

-
    -
  • volaju two
  • -
- -

10 August 2020

-

Hatterhat updated:

-
    -
  • Parry counterattack text now shows up.
  • -
  • Sterilized gauze is now better at stopping bleeding, and applies slightly faster. Very slightly faster.
  • -
  • Ointment and sutures now hold more in a stack (12 and 15, respectively).
  • -
  • Sterilized gauze can now be made by just pouring 10u sterilizine onto standard medical gauze, instead of having to craft it. Why you had to craft it, I will honestly never know.
  • -
  • Proto-kinetic glaives are more expensive, stagger/cooldown on failed parries increased slightly, perfect parries required for counterattack.
  • -
  • New item: Temporal Katana. 2 points for wizards, timestops upon successful parry, bokken quickparry stats (100 force on melee counter!).
  • -
  • Also you can *smirk. This has no mechanical effect, other than being smug.
  • -
-

KeRSedChaplain updated:

-
    -
  • Added a guide for romerol usage
  • -
  • made infectious zombies not enter softcrit and take no stamina damage
  • -
-

LetterN updated:

-
    -
  • clocktheme color
  • -
  • Ports TGUI-4
  • -
-

Lynxless updated:

-
    -
  • Ports TG #51879
  • -
-

Owai-Seek updated:

-
    -
  • Meatballs now spawn raw from food processors.
  • -
-

Putnam3145 updated:

-
    -
  • Ethereals
  • -
  • (Hexa)crocin
  • -
  • (Hexa)camphor
  • -
  • Tweaked wording for marking tickets IC issue.
  • -
  • Rerolling your traitor goals will ONLY give you "proper" objectives.
  • -
-

Seris02 updated:

-
    -
  • borgs being able to select and use a module when it's too damaged
  • -
-

Sishen1542 updated:

-
    -
  • gave chairs active block/parry in exchange for removal of block_chance
  • -
  • replaces box whiteship tbaton with truncheon
  • -
-

kappa-sama updated:

-
    -
  • made the Dirty Magazines crate cost 4000 instead of 12000 credits
  • -
  • MODS I SPILLED MU JUICE HEJPPHRLP HELPJ JLEP HELP
  • -
-

silicons updated:

-
    -
  • player made areas are no longer valid for malf hacking
  • -
  • default space levels is 4 again.
  • -
  • rats now swarm instead of stacking on one spot.
  • -
  • getting hit by an explosion will now barely hard knockdown, but will leave you somewhat winded.
  • -
-

timothyteakettle updated:

-
    -
  • speech verbs copy through dna copying now
  • -
- -

09 August 2020

-

Hatterhat updated:

-
    -
  • Proto-kinetic glaives (not crushers) can parry now.
  • +
  • Adds clown waddle to clown shoes. Enhanced Clown Waddle Dampeners can be engaged in-hand with ctrl+click, _but why would you?_

MrJWhit updated:

    -
  • Adds a second shutter on the top of the hop line
  • +
  • Re-adds theater disposal outlet, and makes dorms disposal able to have things sent to it on boxstation.
  • +
+

TyrianTyrell updated:

+
    +
  • made default tongue able to speak signed language.
  • +
+

timothyteakettle updated:

+
    +
  • sentient viruses can now infect synths and ipcs
  • +
+ +

07 February 2021

+

Thalpy updated:

+
    +
  • Dispenser: Adds the ability to store a small amount of reagents in the machine itself for dispensing. Reacting recipies cannot be stored. Size of storage increases with bin size.
  • +
  • Dispenser: Allows reagents to be color coded by pH
  • +
  • Dispenser: Each reagent displays it's pH on hover
  • +
  • Dispenser: Allows the user to toggle between buttons and a radial dial
  • +
  • Dispenser: When the dispencer is upgraded it can dispense 5/3/2/1 volumes based on rating refactor: Dispenser: as it was before. This does not break recorded recipes.
  • +
  • Adds a round function to some numbers so they're not huge
  • +
  • The Chem master can now get purity for all reagents when analysed
  • +
  • Synthissue fixes
  • +
  • buffers now have a strong and weak variant. Weak can be dispensed, and strong can be created. Strong buffers are 6x more effective.
  • +
  • Some buffer pH edge calculation fixes
  • +
+

TyrianTyrell updated:

+
    +
  • added a signed language, that can't be used over the radio but can be used if you're mute. also added the multilingual trait.
  • +
  • hopefully added an icon for the signed language.
  • +
  • changed how some traits function slightly.
  • +
+

dzahlus updated:

+
    +
  • tweaked a few sounds
  • +
  • added a new weapon sounds
  • +
  • removed old weapon sounds
  • +
  • changed some sound related code

silicons updated:

    -
  • immovable rods no longer drop down chasms
  • -
  • fun removal: squeaking objects now have an 1 second cooldown between squeaks, and will have a 33% chance of interrupting any other squeaking object when Cross()ing, meaning no more ear-fuck conveyor belts.
  • +
  • syndicate ablative armwraps have been added.
-

08 August 2020

+

05 February 2021

+

SmArtKar updated:

+
    +
  • The orbit menu now has an Auto-Observe button! No more sifting through the lame observe menu to snoop in people's backpacks! Also, orbit menu now refreshes.
  • +
  • KAs are no longer getting broken when fired by a circuit
  • +
+

keronshb updated:

+
    +
  • Force and damage > 15 from 18/25
  • +
  • Knockdown put down to 5 from 30
  • +
  • Armor pen down to 10 from 100.
  • +
  • Makes cell chargers, charge faster.
  • +
+

raspy-on-osu updated:

+
    +
  • alien royals can no longer ventcrawl
  • +
+

shellspeed1 updated:

+
    +
  • There actually needs to be people for zombies to happen now.
  • +
+

timothyteakettle updated:

+
    +
  • dwarf facial hair is no longer randomised
  • +
+ +

03 February 2021

+

Hatterhat updated:

+
    +
  • The green energy sabre's sprite now respects proper handedness.
  • +
+ +

02 February 2021

+

silicons updated:

+
    +
  • pais can now be carried around piggybacking/fireman
  • +
  • Meth and Nuka Cola once again, speed you up.
  • +
+ +

31 January 2021

+

Putnam3145 updated:

+
    +
  • fermichem explosion EMPs don't cover the entire station
  • +
+ +

30 January 2021

+

timothyteakettle updated:

+
    +
  • adds 'clucks', 'caws' and 'gekkers' to the speech verb list
  • +
+

zeroisthebiggay updated:

+
    +
  • some more FUCKING hairs
  • +
  • uncodersprites the advanced extinguisher
  • +
+ +

29 January 2021

+

MrJWhit updated:

+
    +
  • Ported the QM, Captain, CMO, and HoS cloaks from beestation.
  • +
  • Removes excess air alarms from boxstation
  • +
+

TripleShades updated:

+
    +
  • fixes engineering secure storage being the wrong area because I fucked that up previously my bad
  • +
  • removes funny extra light switch under right surgery table in surgery oops
  • +
  • Added chairs to the corpse launch viewing area
  • +
  • Small garden plot for flowers for parity with other station Chapels
  • +
  • Plain Bible to glass tables in Chapel
  • +
  • Candles and Matchbox to glass tables in Chapel
  • +
  • More glass tables, with a chaplain figure and another spare bible.
  • +
  • Bookcase to Box Chapel for parity with other station Chapels
  • +
  • Minimoog to Box Chapel as substitute for a church organ
  • +
  • Holy department sign just below Chapel change: Expanded the corpse launching area to feel less congested change: Added windows to the corpse launch so you can look inside I guess? change: Moved flowers and burial garments to the corner next to the corpse launcher change: Box Chaplain's office door is moved over one change: Confessional is now connected to Chaplain's office for parity with other station Chapels change: Moved coffins over to old confessional location change: Box Chapel now has pews instead of stools change: Box Chapel Confessional is now lit instead of being nearly pitch black remove: Two coffins from Chapel
  • +
+

timothyteakettle updated:

+
    +
  • the miner bedsheet will now increment its progress when you redeem points from the ORM
  • +
  • you can add custom names and descriptions to item's on the loadout now
  • +
+

zeroisthebiggay updated:

+
    +
  • roundstart aesthetic sterile masks and roundstart paper masks
  • +
  • more accessory slot items
  • +
  • cowbell necklace happy 2021
  • +
  • shibari ropes & torn pantyhose
  • +
+ +

28 January 2021

+

silicons updated:

+
    +
  • colormates can now paint some mobs.
  • +
  • 1 dev explosions shouldn't delete brains anymore
  • +
+ +

27 January 2021

+

ArcaneMusic, ported by Hatterhat updated:

+
    +
  • Strike a hydroponics tray with a fully-charged floral somatoray to lock in a mutation.
  • +
  • Floral somatorays now have the ability to force a mutation in a plant. This should drain the cell in a single shot, but we'll see.
  • +
  • Somatorays now take uranium to craft instead of radium.
  • +
+

Arturlang updated:

+
    +
  • Actually adds a right click give option
  • +
  • Revenants can now clickdrag to throw stuff at people, with some items doing various things at the same time.
  • +

DeltaFire15 updated:

    -
  • Roundstart cultists now start with a replica fabricator - no brass though, make your own.
  • -
  • Kindle cast time: 10 > 15, mute after stun end: 2 > 5, slur after mute end: 3 > 5
  • -
  • The ratvarian spear no longer adds negative vitality under very specific circumstances.
  • -
  • The Ratvarian Spear can parry now! Short parries with low leeway, but low cooldown.
  • -
  • The brass claw, a implant-based weapon which gains combo on consecutive hits against the same target.
  • -
  • The sigil of rites, a sigil used to perform various rites with a cost of power and materials
  • -
  • The Rite of Advancement: Used to add a organ or cyberimplant to a clockie without need for surgery.
  • -
  • The Rite of Woundmending: Used to heal all wounds on another cultist, causing toxins damage in return.
  • -
  • The Rite of the Claw: Used to summon a brass claw implant. Maximum of 4 uses per round.
  • +
  • The woundmending rite no longer causes runtimes.
  • +
  • Ratvarian borgs can now use their tier-0 spells.
  • +
  • Ratvarian borgs can always use their assigned spells, if there is enough power.
  • +
  • The heretic antag panel now shows their sacrifices & current sacrifice targets.
  • +
  • The heretic roundend report now shows their sacrifices and nonsacrificed targets.
  • +
  • Living hearts can no longer select the same target as another living heart, removing a certain problem.

Hatterhat updated:

    -
  • You can now buy a toolbox's worth of Mosin-Nagant ammo for a fairly discounted price.
  • -
  • Revolvers from the dedicated kit now have reskinning capabilities.
  • -
  • You can now actually buy the riflery primer, which lets you pump shotguns and work the Mosin's bolt faster.
  • -
  • Bulldog slug magazines now have a unique sprite.
  • +
  • Department budget cards have been readded. TO THE CODE. NOT LOCKERS.
  • +
  • Also budget cards now look more like every other ID - see tgstation#55001.
  • +
  • One of the contractor tablet's payouts has been raised from a small payout to a medium payout.
  • +
  • The free golem ship's GPSes no longer start on. They were never meant to, but they did.
  • +
  • Headsets can't be found on most legion corpses now.
  • +
  • The flash on the assistant corpse is gone, too.
-

Ludox235 updated:

+

MrJWhit updated:

    -
  • Removed an abductee objective that told you to remove all oxygen.
  • -
  • Added a new abductee objective to replace the removed one.
  • +
  • Remaps some air alarms for sanity.
-

Sishen1542 updated:

+

SandPoot updated:

    -
  • 🅱️oneless
  • -
  • squishy slime emotes
  • +
  • The drop circuit can no longer drop things that are not inside it.
  • +
+

raspy-on-osu updated:

+
    +
  • bespoke ventcrawling element not detaching due to malformed call
  • +
+

shellspeed1 updated:

+
    +
  • Floorbots had had a software update, preventing them from dogpiling on their target as easily as they did before.
  • +
  • Floorbots will now play a small chime when stacked on top of each other to indicate that they're moving apart.

timothyteakettle updated:

    -
  • heparin makes you bleed half as much now
  • -
  • cuts make you bleed 25% less now
  • -
  • more items in the loadout and loadout has subcategories now for easier searching
  • +
  • blobs can use the 'me' verb
  • +
  • adminhelps and pms only sanitize once instead of twice
-

07 August 2020

-

dapnee updated:

+

25 January 2021

+

MrJWhit updated:

    -
  • fixed active tufs on some space ruins, murderdome VR, and a few on pubby, changed cargo autolathe to techfab, messed with pipe room leading to monastery.
  • +
  • Alien radio code
  • +
  • Microwave can now be cleaned by a damp rag as well as soap.
  • +
  • Removes some unused code, and improves some other code.
  • +
  • The AI has a verb to look up and down z-levels
  • +
  • Making a monkey into a human doesn't unanchor random things on the tile
  • +
  • Makes a few slight improvements to drinking code
  • +
  • Makes encryption keys be put in the hands of the user when able instead of being dropped on the floor when removed from headsets
-

lolman360 updated:

+

raspy-on-osu updated:

    -
  • vendors are now unanchored when tipped. it just fell over it's not bolted to the ground anymore.
  • -
  • podpeople no fat when sunbathing.
  • +
  • ventcrawling

silicons updated:

    -
  • explosions only recurse one level into storage before dropping 1 level per storage layer.
  • -
  • volumetric storage is now minimum 16 pixels per item because 8 was ridiculous
  • -
  • shieldbash balanace --> balance
  • -
  • attempting to send too long of an emote will now reflect it back to you instead of cutting it off and discarding the overflow.
  • -
  • holoparasites can now play music
  • -
  • lethal blood now causes damaging bleeding instead of outright gibbing
  • +
  • you can now shove yourself up in any intent, not just help.
-

06 August 2020

-

Auris456852 updated:

+

22 January 2021

+

Arturlang updated:

    -
  • Added B.O.O.P. Remote Control cartridges to the PTech.
  • +
  • Adds a way to give items to people, you can combat mode rightclick to offer it to one person, right click on people without mode and click the give verb, or use the hotkey CTRL G to offer it to everyone around you
  • +
+ +

21 January 2021

+

Acer202 updated:

+
    +
  • Main mining shuttle should no longer look at the public mining shuttle and attempt to dock ontop of it. Monastery shuttle should now function again.
  • +
+

Acer202, with minor help from The0bserver updated:

+
    +
  • After internal deliberation, CentCom has decided to run a limited reinstatement of public mining shuttles for use in more tried and true station classes. CentCom would like to remind you that this privilege is easily revoked, and that abuse may result in immediate detonation.
  • +
  • Restores the mining shuttle on Pubby, Box, Delta, Meta, and Lambda Station.
  • +
+

ArcaneMusic, The0bserver-sys updated:

+
    +
  • New from Hydrowear LLC: The Botanical Belt! This handy yellow belt lets you hold most of your botany gear, and a few beakers for reduced bag and floor clutter!
  • +
  • Gives Hydrotrays plumbing pipes automatically, allowing you to make a self sustaining tray via plumbing.
  • +
  • Gives Service access to Bluespace Beakers, at last, gives Cargo, Science, and Medical the ability to construct reinforced plungers for use on lavaland.
  • +
+

ArchieBeepBoop updated:

+
    +
  • Upgraded Advanced RTG Machine Preset
  • +
  • Outlet Injector Mapping Asset Layer Fix
  • +
  • Jacqueen and the Christmas tree should no longer spawn abstract things that can cause shittons of runtimes.
  • +
+

Arturlang updated:

+
    +
  • You can't tackle in nograv anymore
  • +
  • You cannot spam drink from blood bags anymore
  • +
  • Blood bag drinking inefficiency is now the right way, so you loose some of the blood drinking it straight
  • +
  • Handles more edge cases with construct soul returning
  • +
  • Being sacrificed by the cult no longer removes all hope of rescue.
  • +
  • Makes construct mind returning more robust
  • +
  • Prayers to admins now do a wee ding sound for all prayers, instead of just chaplains
  • +
  • Fixes the mint machine's UI
  • +
  • Hopefully fixes whitescreen issues for TGUI UI's by giving assets more time to get to the client
  • +
  • Fixes hijack implant APC UI, again
  • +
  • Comments out spaceman dmm do not sleeps for mob/proc/CommonClickOn, atom/proc/attack_hand, datum/proc/keyLoop and mob/living/proc/Life
  • +
  • Bloodsuckers tresspass ability can no longer work while they are not awake.
  • +
  • The cursed heart now only takes away half as much blood every loop, and can be used as long as you are alive, instead if only you are awake/able to use your hands
  • +
+

Bhijn updated:

+
    +
  • Changeling loudness is now determined as an average of all their abilities, rather than the sum
  • +
  • To compensate for this, blood tests now require a loudness value of 1 or higher to detect ling blood. Additionally, blood test explosions are now triggered only when the loudness value is higher than 2.
  • +
+

BlackMajor updated:

+
    +
  • Cyborg hypospray no longer injects if it means OD'ing while on help intent.
  • +
+

BlueWildrose updated:

+
    +
  • Nyctophobia quirk now has some light lag compensation.
  • +
  • Fixes cloning computer UI not updating when pressing certain buttons - also adds extra check for names to update a message
  • +
  • Removes oversized genitalia analysis from medical scanners, since huge dick and titty are no longer a problem anymore thanks to advancements in that kind of technology when it comes to chemical fun times growth.
  • +
  • Fixed species-specific drinks not giving a mood boost if you are that species.
  • +
  • You will now only unbuckle fireman-carried/piggybacked people on disarm or harm intent.
  • +
  • The traitor AI can no longer activate the doomsday device while carded.
  • +
  • Fixes noodle size appearance for 12+ inch members.
  • +
  • Fixed the subtle hotkey being weird with its input prompts.
  • +
  • Adds a subtler anti-ghost hotkey. Default key is 6.
  • +
  • No more straining when your cock or breasts are growing via incubus draft or succubus milk.
  • +
  • PubbyStation now has two Christmas Tree spawners.
  • +
  • You can now have a max-roundstart-dicksize-config inch long johnson before you start suffering blood loss and slowdowns instead of a 20 inch one.
  • +
  • Color Mates have been added to all stations (except Snaxi). Enjoy coloring your attire without having to bug science!
  • +
  • Polychromic hoodies that were obtained from the loadout have functional colorable hoods now.
  • +
  • Adds in timid woman/man costumes. Available at your autodrobe! Also adds in garters as some new socks.
  • +
  • Corrected the capitalization in gasmask concealment examine text
  • +
+

Chiirno updated:

+
    +
  • Added the paramedics EVA suit as a purchase from the cargo console.
  • +
  • Paramedics office and Surgery Storage Room
  • +
  • Remodeled the surgery room, as well as shrunk Morgue and Starboard Emergency Storage. Fiddled with some areas for better map edit clarity and fixed one runtime in Vacant Office A.
  • +
  • Added the paramedic closet sprite, a paramedic colored medical3 closet.
  • +
  • Added a paramedic closet, which is the standard medical3 closet with their suit, a pinpointer, and a crew monitor added.
  • +
  • Nightmare now deals additional damage to most light sources.
  • +
  • Nightmare now one-shots miners beacons and glowshrooms
  • +
  • Portable Chem Mixer now researchable from biotech node.
  • +
  • Chem masters can now dispense 20 instances of its outputs instead of 10.
  • +
+

Delams-The-SM updated:

+
    +
  • Added 3 new emotes *hiss *purr *meow
  • +
  • ported sounds from Citadel RP for *purr and *meow
  • +
  • fixed randomization of colors for things like mulligan and Stabilized green slime extract for matrixed body parts
  • +
+

DeltaFire15 updated:

+
    +
  • Biomechanical (hybrid) bodyparts now have access to wound-fixing surgeries.
  • +
  • A wound being fixed no longer just qdel()s surgeries connected to it.
  • +
  • Some robotic surgery steps are now a bit more clear.
  • +
  • Organs no longer get fed to people after successfully being inserted into them.
  • +
  • Not completing the do_after of a surgery no longer causes you to attack the target with whatever you were holding.
  • +
  • IPC cells & power cords are now printable after they are researched.
  • +
  • A new surgery, allowing revival of synths without a defib at hand.
  • +
  • Semi-permanent damage of Synth limbs caused by passing the damage threshold: 10 <- 15.
  • +
  • The embed removal surgery now has a version for Synths.
  • +
  • EMPs no longer hardstun Synths.
  • +
  • Portals no longer runtime because of incorrect args.
  • +
  • Abductors now can use experimental organ replacement surgery on robots / synthetics.
  • +
  • Fixes a minor incorrectness in ratvarian borg slabs (ratvar_act -> ui_act)
  • +
  • Changelings no longer double-deathgasp when activating the regen stasis ability while not dead.
  • +
  • People installing KA modkits in miner borgs is no longer broken.
  • +
  • Fixes the tail entwine messages displaying incorrectly.
  • +
  • Antagging / Deantagging Heretics now properly sets their special role.
  • +
  • The borg VTEC ability now actually gets removed when the upgrade is removed.
  • +
  • Supplypods shouldn't cause runtimes anymore, and shrapnel (pelletclouds) should work for them.
  • +
  • Robots (anyone with the robotic_organism trait) have toxins damage replaced with system corruption. See the PR for details.
  • +
  • Clockwork rites now support hiding specific rites from neutered servants.
  • +
  • AIs now only have to kill people once instead of permanently.
  • +
  • Scripture no longer sometimes eats part of its invocation.
  • +
  • APCs and silicons are now more susceptible to powerdrains (by the power_drain() proc, which is rare)
  • +
  • Void Volt has been modified from a chant to a singular pulse.
  • +
  • Robotpeople are now fully immune to the effects of alcohol (drunkness etc.)
  • +
  • Renames the alcohol intolerance trait in the code to make what it does more clear.
  • +
  • Self-fueling weldingtools recharge fuel properly again.
  • +
  • Brass welders now actually recharge faster than experimental ones.
  • +
  • Repeatable surgery steps can no longer cause an infinite loop if not completing the do_after
  • +
  • The Revenant self-revive ability is no longer broken.
  • +
  • Loot items mobs drop are no longer always failing to initialize.
  • +
  • Instant summons can no longer do wacky stuff with disposals (and nukes).
  • +
  • Objectives are no longer very broken.
  • +
  • Bloodcult stunhands now work against clockies like they were supposed to instead of hardstunning.
  • +
  • zeolites are now actual fermichems instead of being incredibly easy to make.
  • +
  • Using syringes / droppers on chem heaters with beakers in them works again.
  • +
  • Some edge cases causing issues with system corruption shouldn't be able to occur anymore.
  • +
  • Cyborg B.o.r.i.s. installation now checks for if the chest has a cell, just like how it does with MMIs.
  • +
  • The 'Your body is in a cloner' notification works again
  • +
  • Hijack implants should work properly again (or, at least better)
  • +
  • Liches are now good skeletons again instead of weak ones
  • +
  • The piratepad control cannot be destroyed again.
  • +
  • Pirates have received new supplies of jetpacks instead of useless oxygen tanks
  • +
  • Ratvarian AIs are once again able to show their linked borgs Ratvar's light
  • +
  • Hijackers are once again unable to detonate borgs without being adjacent to the console
  • +
  • Automated annoucement systems and gulag ore consoles no longer waste emag charges
  • +
  • Automated announcement systems once again can be remote controlled by non-AIs with silicon access
  • +
  • APCs being hijacked multiple times at once is no longer possible, preventing some issues
  • +
  • Recharging APCs no longer use 0.2% of the power they should be using.
  • +
  • APCs no longer always use as much power as they can for their cell, even if it is full.
  • +
  • Vampire shapeshifting should now behave as intended
  • +
  • Some synth damage stuff has been a bit rebalanced, see the PR for details.
  • +
  • Nanogel, available at medical and robotics, which fixes internal damage in sufficiently repaired robotic limbs.
  • +
  • Robotic Limbs now each have their own damage threshhold values
  • +
  • Robotic Limb damage threshholds are now seperated into threshhold itself and mindamage when passed balance; Hybrid limbs can now be injected with hypos, but not sprayed (Still not healed by chems)
  • +
  • Brain surgery has been tweaked back to allowing robotic limbs, blacklisting IPC brains instead.
  • +
  • Robot brain surgery can now be used on organic heads, if there is a IPC brain in them somehow.
  • +
  • The robot limb heal surgery can now be used even if the target's torso is not robotic, as long as they have robotic limbs
  • +
  • BODYPART_ROBOTIC / BODYPART_ORGANIC checks replaced with helper-procs whereever possible.
  • +
  • Added a BODYPART_HYBRID define for robotic bodyparts that behave organic in some regards.
  • +
  • The transmission sigil power drain works now
  • +
  • A certain lizard (totally not me) being stupid is no longer going to break regenerate_bodyparts
  • +
  • Combat mode now will not stay permanently disabled due to status effects not working as intended.
  • +
  • Attacking some certain objects no longer has no clickdelay.
  • +
  • the blacksmithing skill now works properly
  • +
  • Anvils cannot be interacted with with hammers whilst they are already being used
  • +
  • If someone has no gloves when interacting with heated ingots, they no longer ignore their effects.
  • +
  • A runtime caused by hallucinations is gone.
  • +
  • Cargo packs marked as 'no private buying' now actually register as such.
  • +
  • Fleshmend, Anatomic Panacea and bloodsucker healing now work for Synths / IPCs.
  • +
  • Medibots now ignore people they cannot help due to their biology.
  • +
  • get_damaged_bodyparts() is no longer broken.
  • +
  • Your target cryoing will no longer give you a free greentext.
  • +
  • Sleeper UI interactiveness now behaves correctly.
  • +
+

Detective-Google updated:

+
    +
  • arcade carpet
  • +
  • explosions now get broadcasted to deadchat.
  • +
  • Lick radial
  • +
  • Hilbert's jukebox works
  • +
  • arcade carpets now actually work
  • +
  • the snow taxi is no longer the slow taxi
  • +
+

ERP mains updated:

+
    +
  • Subtler Around Table is now a verb
  • +
+

EdgeLordExe, MoonFalcon updated:

+
    +
  • Ported a bunch of heretic-related tweaks and changes from tg
  • +
+

EmeraldSundisk updated:

+
    +
  • Adds a few new area designations primarily for CogStation, incorporates them into said map
  • +
  • Reorganizes some area designations for ease of use, along with renaming the central "Router" to "Routing Depot"
  • +
  • Fixes an incorrectly designated area in CogStation
  • +
  • Changes the area designations to be not varedited since the code didn't like that anymore
  • +
  • The cargo bay conveyor belts not only work with the shuttle now but go in the right direction to boot
  • +
  • Slight visual adjustments to cargo in light of this
  • +
  • The arcade's got RAD carpet now
  • +
  • Fixes the conveyor belt issues in Delta Station's cargo wing
  • +
  • Removes some of the dirt around the affected area (presumably they would have cleaned it up while working on it)
  • +
  • Adds a floor light to fix the "dark spot" cargo had
  • +
  • Adds a new "Computer Core" area designation for CogStation
  • +
  • Fixes some missing area strings
  • +
  • Replaces some firelocks with directional ones as to ensure desks/counters can still be accessed
  • +
  • The "Skelter ruin" now has stechkins as opposed to M1911s
  • +
  • Skelter's decorative bullet casings replaced to factor in the change in caliber
  • +
  • Skelter now has a combat knife and fluff note
  • +
+

Ghommie updated:

+
    +
  • You can access the mime / clown mask skins radial menu once again.
  • +
  • Dice bags no longer act like cardboard boxes.
  • +
  • Abductors should be no longer mute.
  • +
  • Item action buttons should now properly show the item current overlays, most times.
  • +
  • The blackbox should now go into your hand slot when pried out, rather than tumbling on the ground everytime.
  • +
  • The Quick Equip hotkey is now usable by all living mobs (so long they have hands and equipment slots)
  • +
+

Ghommie, porting PRs by MMMiracles and pireamaineach, credits to BlueWildrose too. updated:

+
    +
  • You can now draw on plasmaman helmets with a crayon to turn their frown upside-down.
  • +
  • Plasmaman helmets no longer hide your identity when worn by themselves.
  • +
  • Plasmaman helmets now have welding visors, which can't stack with their torches in the helmet and are visible.

Hatterhat updated:

    -
  • Proto-kinetic glaives! Essentially a proto-kinetic crusher with a different blade, handguard, and goliath hide grip. Expensive, but elegant.
  • -
  • Door charges no longer knock people out.
  • +
  • Energy sabre reskin for the energy sword - access via alt-click.
  • +
  • Alt-click reskins are fixed.
  • +
  • Defibrillators and their many, many overlays were moved to another .dmi.
  • +
  • You can now change the color of an energy sword via multitool. Not deswords. Yet.
  • +
  • The Syndicate appear to be issuing new revolver variants.
  • +
  • Basic sticky technology is now a roundstart tech. Advanced sticky technology is BEPIS-locked, though. Theoretically.
  • +
  • Non-smithed katanas (including the temporal katana) can now fit in the twin sheath.
  • +
  • Cotton and durathread processing by hand now acts like grass. Stand on a pile of cotton (or durathread) and use a single bundle from it.
  • +
  • Utility uniforms now comply with the "nonproper equipment names" thing.
  • +
  • The CapDrobe now allows the captain to get his own clothes for free. Probably.
  • +
  • All captains' clothes now offer 15 woundarmor, up from the 5. Because apparently only the suit and tie and its suitskirt subtype have this wound armor, which is dumb.
  • +
  • The nature interaction shuttle with the monkeys now has tiny fans on the airlocks in, because that's apparently a feature that was missing.
  • +
  • More bags have been added to department vendors.
  • +
  • Every roundstart species (and also ash walkers) now has flesh and bone that can be wounded.
  • +
  • Recipes for sutures, regen mesh, and sterilized gauze have been adjusted to be easier, mostly.
  • +
  • Sterilized gauze is better at absorbing blood and being a splint.
  • +
  • Energy sabres now have an off inhand.
  • +
  • The bone gauntlets should be slightly less murderously punchy on the fast punches mode.
  • +
  • RPEDs now drop their lowest part tier first when quick-emptied (used inhand).
  • +
  • Improvised gauzes can now be crafted in stacks up to 10, like their maximum stacksize implies they should be capable of doing.
  • +
  • Pouring sterilizine on gauze now takes the proper 5u per sterilized gauze instead of 10u.
  • +
  • Cryogenics now screams on common again when your fuckbuddy heads out.
  • +
  • Survival daggers! A slightly more expensive survival knife that comes with a brighter flashlight. On the blade.
  • +
  • Luxury pod capsules look different from normal capsules.
  • +
  • The wastes of Lavaland and the icy caverns of Snow Taxi rumble in unison.
  • +
  • Exosuits sold on the Supply shuttle no longer leave wreckages.
  • +
  • Apparently, shrink rays were buyable again, despite a PR having been made a while ago specifically for removing shrink rays. They're gone again.
  • +
  • Changeling bone gauntlets! They punch the shit out of people really good.
  • +
  • Guerilla gloves and gorilla gloves inherit the strip modifiers of their predecessors, because apparently they had those.
  • +
  • Pugilists now always hit the targeted limb and never miss.
  • +
  • The dock-silver standard set by Box and Meta has been enforced across maps in rotation (Delta, Pubby, Lambda).
  • +
  • The Box whiteship now has its missing tiny fan back.
  • +
  • The survival dagger light on the sprite now actually turns on and off.
  • +
  • The survival dagger in the glaive kit that can also be bought by itself is now better at butchering things.
-

Ludox235 updated:

+

HeroWithYay updated:

    -
  • You can now buy damaged AI upload modules in the traitor's uplink.
  • +
  • Changed description of Necrotizing Fasciitis symptom.
  • +
  • Wormhole Projector and Gravity Gun now require anomaly cores to function instead of firing pins.
-

Seris02 updated:

-
    -
  • fixed ghost chilis
  • -
-

Trilbyspaceclone updated:

-
    -
  • 4 New blends of tea have been shipped to the station, and how to make them has been leaked!
  • -
-

b1tt3r1n0 updated:

-
    -
  • Added the warp implant
  • -
-

dapnee updated:

-
    -
  • added a hallway to telecoms for engineers to get there on meta
  • -
-

kappa-sama updated:

-
    -
  • dildo circuit assemblies
  • -
-

lolman360 updated:

-
    -
  • The Tendril-Mother on Lavaland has remembered how to make ashwalkers who know how to speak Draconic again.
  • -
-

timothyteakettle updated:

-
    -
  • nanotrasen has decided to fire all disabled members of the security division and confiscate certain sentimental items from doctors
  • -
  • the custom tongue preference now passes through cloning so you spawn with your selected tongue
  • -
  • several changes to travelling traders so they look better and spawn slightly less often
  • -
-

zeroisthebiggay updated:

-
    -
  • nukies can buy holoparasites
  • -
- -

04 August 2020

-

Seris02 updated:

-
    -
  • lizard spines
  • -
-

timothyteakettle updated:

-
    -
  • due to further advancements in medical technology, you can now have holes poked into your body for fun and enjoyment
  • -
-

zeroisthebiggay updated:

-
    -
  • prefs for headpat wagging
  • -
- -

03 August 2020

KeRSedChaplain updated:

    -
  • fixed clockwork guardians being able to reflect ranged weapons
  • +
  • Resprited the brass claw
  • +
+

LetterN updated:

+
    +
  • 2 more ways to get up from z1
  • +
  • tweaked the z2 garden to be less blank
  • +
  • fixed telecomms pda log
  • +
  • Coin & Holochip support for slot machine
  • +
  • Stickybans are now saved in the DB too
  • +
  • Immersive ™ audio reverbs. (also adds multiz audio)
  • +
  • Semi-hardsync from TG
  • +
  • Updates rust-g
  • +
  • Uses git CI instead of travis/appveyor now
  • +
  • Updates git and build tests.
  • +
  • minimap text
  • +
  • ports cinematic upgrades

Linzolle updated:

    -
  • uv penlight no longer invisible
  • +
  • entertainment monitors no longer invisible
  • +
  • entertainment monitors now light up and display text when motion is detected in thunderdome
  • +
  • lizard snouts are no longer *slightly* lighter than they are supposed to be.
-

dapnee updated:

+

MrJWhit updated:

    -
  • active turfs on box and xenohive, maintenance bar APC not being stringed correctly, turned a monitor to face a direction that makes sense, changed tag of camera in gravgen being misnamed
  • +
  • Expanded space hermit base
  • +
  • Replaced engineering fuel tank with a large fuel tank
  • +
  • Changed access to sec suit storage from armory access in every map to other security access
  • +
  • Adds a space loop to every map in toxins
  • +
  • +
  • Added the ability for cargo to buy a large welding tank
  • +
  • Tweaked large tank reagent sprites to /tg/'s
  • +
  • Gives metastation toxins storage a scrubber and a vent
  • +
  • Updates suit storage info on Tip Of the Round.
  • +
  • Increased christmas event from 22th to 27th to 10th to 27th
  • +
  • Removes an opposum from the wall
  • +
  • Donut boxes show what's inside of them now
  • +
  • Updated meat icons
  • +
  • Canceling events gives more time to stop from 10 to 30
  • +
  • Fixes two chairs on one table
  • +
  • Removed the wires connecting the AI from the rest of the station on cogstation.
  • +
  • Fixes experimenter on cogstation.
  • +
  • Less pipes in the overall area in toxins on cogstation
  • +
  • Small fixes on security on boxstation
  • +
  • Updated jukebox sprite.
  • +
  • Fixes maint area in boxstation
  • +
  • Christmas starts on the 18th now
  • +
  • Adds a goose bar sign
  • +
  • Effects can no longer trigger landmines
  • +
  • Removes the screen flashing on climax.
  • +
  • Makes gas sensors fireproof.
  • +
  • A small bucket of random fixes,
  • +
  • Minor fixes to kilo
  • +
  • Porting garbage collection tweak from /tg/
  • +
  • Updates our dark gygax sprites to /tg/'s
  • +
  • Bugfix of a morph becoming an AI eye
  • +
  • Mining station oxygen locker on the cycling airlock starts out wrenched.
  • +
  • Nerf combat knife damage
  • +
  • Code improvement on ventcrawling
  • +
+

NT Cleaning Crews On Break updated:

+
    +
  • Most kinds of dirt, grime, and debris are now persistent. Get to work, jannies.
  • +
  • Dirt can now be removed by tile replacements. Other cleanable decals can't, though.
  • +
+

Putnam3145 updated:

+
    +
  • Replaces majority judgement with usual judgement.
  • +
  • Toilet loot spawners don't lag the server on server start with forced hard dels.
  • +
  • vore prefs save now
  • +
  • gear harness no longer magically covers up the body mechanically despite covering up nothing visually
  • +
  • Regen coma now puts into a coma even from crit or while unconscious.
  • +
  • Regen coma now properly weakens while asleep.
  • +
  • Multi-surgery unit test no longer fails at random.
  • +
  • Dwarf speech is no longer absolutely paranoid about word replacement.
  • +
  • Spontaneous brain trauma now requires minimum 5 players
  • +
  • Grab bag works as advertised.
  • +
  • Xeno threat in dynamic tripled.
  • +
  • Vote system #defines are now strings
  • +
  • Stat panel UI for ranked choice votes
  • +
  • A fallback for dynamic antag rolling that allows for it to just try between traitor, blood brothers, heretics, changeling, bloodsucker and devil until there are enough roundstart antags. This can also happen randomly anyway. Blood brothers and devil are disabled for now, but the code is there to enable them.
  • +
  • A new storyteller, "Grab Bag", that forces the above round type.
  • +
  • atmos subsystem no longer dies if there's too many gases
  • +
  • Emotes can properly be filtered for in TGUI.
  • +
  • Holofirelocks work now.
  • +
  • adminhelping no longer removes entire admin tab
  • +
  • end of round no longer removes entire admin tab
  • +
  • Fixed a runtime in every healing nanite program.
  • +
  • removed a unit test causing master to fail
  • +
  • Planetary atmos no longer does superconduction.
  • +
  • Dynamic vote no longer shows the none-storyteller.
  • +
  • You can now exit polycircuit input
  • +
  • Polycircuits now check for range
  • +
  • gear harness alt-click is now sane
  • +
  • rolldown() and toggle_jumpsuit_adjust() now no longer mix behavior-that-should-be-overridden and behavior-that-shouldn't-be-overridden in ways that make no sense.
  • +
  • Gear harness now covers nothing.
  • +
  • Chemical stuff now displays fermichem stuff properly
  • +
  • Rad collectors now get 1.25x as much energy from radiation
  • +
  • Rad collectors now put out 1.25x as much stored energy per tick
  • +
  • Above two rad collector changes give a total 56.25% power output increase
  • +
  • Zeolites now only generate 1/5 the heat when reacting and don't require a catalyst.
  • +
+

Ryll/Shaps updated:

+
    +
  • Fixed an issue with player logs becoming confused when someone triggers multiple events within one second (like being attacked by two people at the same time) that would cause holes in the logs
  • +
+

SandPoot updated:

+
    +
  • You can attack a pile of money on the floor with your id to put it all in quickly.
  • +
  • Changes the limb grower a lot.
  • +
  • "Limb" costs on limbgrower are actually displayed like it was meant to all along.
  • +
  • Swaps the gift static blacklist with a global list one.
  • +
+

SiliconMain updated:

+
    +
  • Engi department has gas masks in loadout
  • +
  • hololocks (which haven't worked for god knows how long) commented out until auxmos is merged
  • +
+

Sonic121x updated:

+
    +
  • alarm ert hardsuit sprite for naga and canine
  • +
  • adjust the naga ert hardsuit to cover the hand
  • +
  • cydonia hardsuit helmet
  • +
  • digi sprite uniform
  • +
  • digi leg suit
  • +
+

SpaceManiac updated:

+
    +
  • Fixed the maphook
  • +
+

Thalpy updated:

+
    +
  • fixes some bugs in jacqs code from edits to the codebase
  • +
+

The Grinch updated:

+
    +
  • infinite presents from hilbert hotel
  • +
+

TheObserver updated:

+
    +
  • Re-adds the rifle stock, and sets the improv shotgun to be as it was.
  • +
  • The maintenance rifle has been shelved - for now. Watch this space.
  • +
+

TheObserver-sys updated:

+
    +
  • Drake? Where's the dead fairygrass sprite?
  • +
+

TheSpaghetti updated:

+
    +
  • no more tumor bread double punctuation
  • +
+

Trilbyspaceclone updated:

+
    +
  • Zeolites now use gold rather then uranium for catalyst
  • +
  • Zeolites are not as hard to make ph wise
  • +
  • Making Zeolites heats up the beaker less allowing for better control
  • +
  • ASP 9mm and M1911 can now have suppressers added
  • +
  • Brass welders are 50% faster at refueling
  • +
  • redoes self fueling welders in the code to be less speggie
  • +
  • the corporate unifoms can now be gotton in the clothing mate vender
  • +
+

TripleShades updated:

+
    +
  • Firelock to Surgery Bay drapes change: Swapped Nanomed and Fire Alarm button locations in both Surgery Bays change: Removes the double mirror in both Surgery Bays to be a singular mirror change: Moved an intercom to not be doorstuck below Paramedical Office remove: One Surgery Observation Fire Alarm button
  • +
  • New Paramedic Office next to Genetics where the old Genetics Reception used to be change: Surgery, Surgery Observation, and Recovery Hall layout revamped drastically change: Maints below Surgery lowered by one tile to recover lost tile space from Surgery expansion
  • +
+

Tupinambis updated:

+
    +
  • Arachnids (spider people) with limited night vision, flash vulnerability, and webbing.
  • +
+

Vynzill updated:

+
    +
  • new gateway mission mapadd: jungleresort map
  • +
  • fixes high luminosity eyes
  • +
+

Xantholne updated:

+
    +
  • Fixed new birds changing back to basic parrot when sitting
  • +
  • New parrots from the RP server, can be found in Bird Crate in Cargo
  • +
  • You can now tuck disky into bed
  • +
  • You can now make beds by applying a bed sheet to them
  • +
  • You can now tuck in pai cards into bed
  • +
  • Added bed tucking element, can be added to any held object to allow tucking into beds
  • +
  • Twin Sword Sheaths have an equipment icon and icon when worn now and make a sound when sheathed/unsheathed
  • +
+

Yakumo Chen updated:

+
    +
  • Slime Jelly is no longer obtainable from slimepeople. Go ask Xenobio
  • +
+

YakumoChen updated:

+
    +
  • To lower production costs, Buzz Fuzz is now manufactured with Real™️ Synthetic honey.
  • +
+

Zandario updated:

+
    +
  • Added some framework for future species expansions, including clothing refitting.
  • +
  • Made majority of the relevant Species IDs and Categories pre-defined, also for easier expansion and use.
  • +
  • lum slime sprites work again
  • +
  • Slapped the Species Defines where relevant
  • +
+

corin9090 updated:

+
    +
  • The chaplain's prayer beads can now be worn on your belt slot
  • +
+

kappa-sama updated:

+
    +
  • super saiyan
  • +
  • ishotgun crafting recipe no longer requires plasteel and is slightly more convenient
  • +
  • ishotgun does 45 damage now instead of 40.5
  • +
  • s
  • +
  • A new spell for the wizard and his martial apprentices, the Inner Mantra technique. It makes you punch people really good and makes you durable, but drains your energy while it's active.
  • +
  • A self-buffing spell for valiant bubblegum slayers that is ultimately useless on lavaland and probably overpowered for miner antagonists. Go figure. At least all it does is let you punch hard while draining your health every second.
  • +
  • bubblegum now drops a book that makes you into an abusive father instead of a shotgun that plays like pre-nerf shotguns
  • +
  • a powerup and powerdown sound effect
  • +
  • two icons for two buff spells
  • +
+

keronshb updated:

+
    +
  • Allows Energy Bola to be caught
  • +
  • This also allows them to be dropped/picked up.
  • +
  • Adds a reduced stamina buffer for SCarp users
  • +
  • Gives SCarp users a better parry
  • +
  • Adds the SCarp bundle which includes a bo staff
  • +
  • Lets Carp costumes carry Bo Staffs
  • +
  • reduces the stamina damage of scarp slightly
  • +
  • reduced the blockchance of the bo staff
  • +
  • Adds more room to northwest maint
  • +
  • Adds a bridge between Atmos and the Turbine.
  • +
  • Blob Resource Tower to 2 points per instead of 1 point per.
  • +
  • Blob Factory Towers can be placed 5 tiles apart instead of 7.
  • +
  • Fixes Blobbernaut Factories consuming Factories if no naut is chosen.
  • +
  • Fixes Reflective Blobs
  • +
  • Re-adds the Clown Car to the clown uplink
  • +
  • 15 >16 TC cost
  • +
  • bonks on external airlocks
  • +
  • Fixes the parry data for scarp
  • +
+

kittycat2002 updated:

+
    +
  • set the name of /datum/reagent/consumable/ethanol/species_drink to Species Drink
  • +
+

kiwedespars updated:

+
    +
  • balanced bone gauntlets.
  • +
  • the robust dildo weapon now has sound.
  • +
+

necromanceranne updated:

+
    +
  • Fixes various sprites for bokken, as well as being unable to craft certain parts and duplicate entries.
  • +
  • Bokken now come in two lengths; full and wakizashi, and two varieties: wood and ironwood. They have different stats for all four.
  • +
  • Bokken require menu crafting and part construction, as well as more complicated materials.
  • +
  • Bokken (long and short) require wood, cloth and leather to craft with a hatchet and screwdriver.
  • +
  • Ironwood bokken (long and short) require ironcap logs, cloth and leather to craft with a hatchet, screwdriver and welder.
  • +
  • Twin sheathes can only fit a pair of blades (longsword + shortsword) or they can fit two shortswords.
  • +
  • Fixed a twin sheath runtime.
  • +
  • A lot of bokken related sprites received an overhaul. Added overlay sprites for weapons sheathed in the twin sheathes.
  • +
  • The extradimensional blade received improved sprites for inhands/back sprites.
  • +
  • You can now make all the variants of the bokken.
  • +
  • Removes a duplicate sprite.
  • +
  • Renames all instances of 'ironwood' to 'steelwood'.
  • +
  • Adds new roboticist labcoat sprites!
  • +
+

qwertyquerty updated:

+
    +
  • Flash the screen on climax
  • +
+

raspy-on-osu updated:

+
    +
  • salicylic acid
  • +
  • space heater heating range and power
  • +
  • windoor open length
  • +
+

shellspeed1 updated:

+
    +
  • Wings from Cit RP have been ported over
  • +
  • Moth wings from cit have been ported over
  • +
  • Cleaned up some pixels on existing moth wings.
  • +
  • Organized the lists for wings by if they are for moths or not and than by alphabetical.
  • +
  • Lings now have infinite space for DNA.
  • +
  • All xenomorph types have been added as corpses for mapping purposes
  • +
  • The dead xenomorphs in the lavaland xenomorph hive now have more variety.
  • +
  • Floor bots are now buildable with all toolboxes.
  • +
  • Xenomorph hybrids can now select wings ~~add: Xenomorph hybrids can now speak xenomorph~~
  • +
  • Xenomorph tongues are available for customization.
  • +
  • Mining borgs can claim points again
  • +
  • Construction bags have been added, use them to carry all sorts of construction bits.
  • +
  • A recipe has been added to cloth stacks to make material and construction bags.
  • +
  • Material bags and construction bags are now available in engineering lockers.
  • +
  • Adds the disposable sentry gun from tg for 11tc each.
  • +
  • The exofab can now print prosthetic limbs
  • +
  • The exofab was missing access to multiple cybernetic organs. This has now been rectified.
  • +
  • A new recipe for a spicy has been given to us by a strange business man.
  • +
  • The bluespace navigation gigabeacon design has been added to shuttle research for those wanting to take their ships around space more.
  • +
  • Xenomorph powers now list plasma cost in their description.

silicons updated:

    -
  • shoves have been buffed to apply a status effect rather than a 0.85 movespeed modifier, meaning repeatedly shoving someone now renews the debuff
  • -
  • shoves now stagger for 3.5 seconds.
  • -
  • war operatives now actually time 20 minutes since roundstart to depart instead of 15.
  • -
  • explosive stand bombs can now be examined from any distance
  • -
  • explosive stand bombs are now a component.
  • +
  • nanite resistances tweaked
  • +
  • new nanite programs added for locking the user out from being modified by consoles or antivirals.
  • +
  • anomalies no longer spawn in walls
  • +
  • Twitch Plays: Clown Car
  • +
  • pugilists can now parry
  • +
  • c4 can no longer gib mobs
  • +
  • medium screens are better now
  • +
  • text formatting now uses one character instead of two around the text to emphasize.
  • +
  • colormates
  • +
  • shoving yourself up now costs 50% more
  • +
  • dullahans enabled
  • +
  • tailed individuals can now target groin to intertwine tails on grab intent.
  • +
  • Clowns now have unpredictable effects on supermatter crystals when dusting from contact.
  • +
  • anyone new to the server is lucky enough to have their sprint default to toggle instead of hold
  • +
  • stamina crit is only removed when at or under 100 stamina, rather than 140. stamina crit threshold is still at 140.
  • +
  • luxury shuttle no longer has noteleport
  • +
  • now only poly gets a headset on spawn, not all birds.
  • +
  • the warp implant now actually warps you back 10 seconds. leaves a trail, though. now unlimited us.
  • +
  • things in DEATHCOMA do not deathgasp on death
  • +
  • Meth and changeling adrenals no longer ignore all slowdowns, rather damage slowdowns.
  • +
  • you can now be an angel using a magic mirror again
  • +
  • command headsets are 120% instead of 160%
  • +
  • no more emote italics
  • +
  • players can now respawn/return to lobby as a ghost after a 15 minute (default) delay and rejoin on another character with some/many restrictions
  • +
  • cryo now preserves everything
  • +
  • Magrifle ammo no longer glows.
  • +
  • temperature slowdown divisor nerfed to 35 from 20.
  • +
  • dna melt drops all items being destroying you
  • +
  • keybinds generate anti-collision bindings where necessary automatically now
  • +
  • changeling combat mutations rebalanced. most of them take chemicals to upkeep now.
  • +
  • set-pose has been added
  • +
  • temporary flavor text renamed to set pose, fully visible in examine
  • +
  • ninja gloves no longer hardstun
  • +
  • ninja gloves now cost half as much to use to compensate
  • +
  • simple mobs are now immune to radioactive contamination
  • +
+

timothyteakettle updated:

+
    +
  • time for memory loss message to show up when being revived is now correctly 300 seconds, instead of 30
  • +
  • the load away mission verb won't crash the server now
  • +
  • roundstart slimes can turn into puddles now
  • +
  • all gas masks (but welding + glass) can be alt clicked to show/hide identity
  • +
  • autosurgeons from travelling trader rewards now only have one use
  • +
  • fixes held items proccing crossed when passing someone
  • +
  • you can now get a family heirlooms based off your species instead of job
  • +
  • changeling stings retract upon turning into a slime puddle
  • +
  • you cannot transform into a slime puddle with a no drop item in your hands
  • +
  • slime puddles are now transparent and their colour looks more natural in comparison to the user
  • +
  • slime puddles are now even slower
  • +
  • slime puddles now get no protection from worn clothing
  • +
  • removes two debug messages left in from my prior eye customization pr
  • +
  • adds unlockable loadout items, corresponding category in loadouts, etc
  • +
  • added in-game age verification as an alternative to access requests
  • +
  • disabling adminhelp noises no longer disables looc
  • +
  • apids render now
  • +
  • you can now only entwine tails with people who have a tail
  • +
  • custom eyes and tongues now properly carry across cloning
  • +
  • re-adds the holoform verb for people who want to use it over going through the char list
  • +
  • eye sprites should look normal once more
  • +
  • licking people washes pie off their face
  • +
  • you can now pick your eye sprites from customization
  • +
  • looking at loadout equips loadout items on your preview image instead of job items
  • +
  • custom holoforms are now accessible through an action instead of through verbs
  • +
  • AI holoforms can now emote
  • +
  • cloning now correctly copies your blood colour, body sprite type and eye type
  • +
  • species with NOTRANSSTING cannot have envy's knife used on them
  • +
  • avian/digitigrade legs have been added for slimes
  • +
  • you can teleport bread
  • +
  • slime puddles are no longer layered down one layer
  • +
  • you cannot tackle with two paralysed arms
  • +
  • tackling with a single paralysed arm lowers your tackle roll by 2
  • +
  • circuits get pin data proc is sanitized when text is returned as data
  • +
  • loadout now has save slot support and colour choosing/saving for polychromic items
  • +
  • polychromic maid outfit
  • +
  • you can rebind communication hotkeys and they're the default now
  • +
  • you can now customize your size from 90% to 130%, going below 100% makes you have 10 less max health
  • +
  • *squeak
  • +
  • anthromorphic synth species
  • +
  • improvements to the automatic age gate
  • +
  • antag items are now of critical importance and wont fail to be placed on the character
  • +
  • a tonne of fixes to colourisation of parts, too many to name, including some sprite fixes
  • +
  • things now have their own individual primary/(secondary)/(tertiary) colours as required, and these can be modified by you
  • +
+

uomo91 updated:

+
    +
  • Fixed "Show All" tab in player panel logs being broken.
  • +
  • Whispers, OOC, and various other things display differently in logs, visually distinguishing them from say logs.
  • +
  • Player panel logs will now show all logs chronologically, so you'll see commingled say and attack logs if you're on the "Show All" tab, etc...
  • +
+

yorii updated:

+
    +
  • fixed botany rounding error that caused grass and other plants to misbehave
  • +
+

zeroisthebiggay updated:

+
    +
  • legion now drops chests
  • +
  • Traitor assistants can now purchase the patented POGBox! Put TC into it for even higher damage!
  • +
  • MEGAFAUNA DROPS ARE LAVAPROOF
  • +
  • cool codex cicatrix inhands
  • +
  • gravitokinetic stands from tg
  • +
  • buffs stands overall
  • +
  • protector stands no longer become tposing invisible apes sometimes
  • +
  • jacqueline spawns on boxstation
  • +
  • secsheath for your cool stunsword at your local security vendor. you gotta hack it first though.
  • +
  • fuck the r*d cr*ss
  • +
  • The legion megafauna has been reworked. The fight should now be both slightly harder and faster.
  • +
  • You can no longer cheese the colossus by being a sand golem and simply being immune.
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 99ffc455c3..5ce1e25a37 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26243,7 +26243,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Ghommie: - bugfix: You can now actually gain wiring experience from using cable coils. - bugfix: Opening the View Skill Panel shouldn't trigger messages about insufficient - admin priviledges anymore. + admin privileges anymore. Yakumo Chen, kappa-sama: - rscdel: Removes improvised handguns - rscdel: removed handsaws, improvised gun barrels (you can use atmos pipes again) @@ -27524,3 +27524,1070 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: limb id entry in mutant bodyparts now supports switching to/from species with gendered body parts - tweak: the minimum brightness of mutant parts is now a define +2021-01-21: + Acer202: + - bugfix: Main mining shuttle should no longer look at the public mining shuttle + and attempt to dock ontop of it. Monastery shuttle should now function again. + Acer202, with minor help from The0bserver: + - rscadd: After internal deliberation, CentCom has decided to run a limited reinstatement + of public mining shuttles for use in more tried and true station classes. CentCom + would like to remind you that this privilege is easily revoked, and that abuse + may result in immediate detonation. + - rscadd: Restores the mining shuttle on Pubby, Box, Delta, Meta, and Lambda Station. + ArcaneMusic, The0bserver-sys: + - rscadd: 'New from Hydrowear LLC: The Botanical Belt! This handy yellow belt lets + you hold most of your botany gear, and a few beakers for reduced bag and floor + clutter!' + - tweak: Gives Hydrotrays plumbing pipes automatically, allowing you to make a self + sustaining tray via plumbing. + - tweak: Gives Service access to Bluespace Beakers, at last, gives Cargo, Science, + and Medical the ability to construct reinforced plungers for use on lavaland. + ArchieBeepBoop: + - rscadd: Upgraded Advanced RTG Machine Preset + - bugfix: Outlet Injector Mapping Asset Layer Fix + - bugfix: Jacqueen and the Christmas tree should no longer spawn abstract things + that can cause shittons of runtimes. + Arturlang: + - bugfix: You can't tackle in nograv anymore + - tweak: You cannot spam drink from blood bags anymore + - bugfix: Blood bag drinking inefficiency is now the right way, so you loose some + of the blood drinking it straight + - bugfix: Handles more edge cases with construct soul returning + - tweak: Being sacrificed by the cult no longer removes all hope of rescue. + - bugfix: Makes construct mind returning more robust + - tweak: Prayers to admins now do a wee ding sound for all prayers, instead of just + chaplains + - bugfix: Fixes the mint machine's UI + - bugfix: Hopefully fixes whitescreen issues for TGUI UI's by giving assets more + time to get to the client + - bugfix: Fixes hijack implant APC UI, again + - code_imp: Comments out spaceman dmm do not sleeps for mob/proc/CommonClickOn, + atom/proc/attack_hand, datum/proc/keyLoop and mob/living/proc/Life + - bugfix: Bloodsuckers tresspass ability can no longer work while they are not awake. + - tweak: The cursed heart now only takes away half as much blood every loop, and + can be used as long as you are alive, instead if only you are awake/able to + use your hands + Bhijn: + - tweak: Changeling loudness is now determined as an average of all their abilities, + rather than the sum + - tweak: To compensate for this, blood tests now require a loudness value of 1 or + higher to detect ling blood. Additionally, blood test explosions are now triggered + only when the loudness value is higher than 2. + BlackMajor: + - tweak: Cyborg hypospray no longer injects if it means OD'ing while on help intent. + BlueWildrose: + - tweak: Nyctophobia quirk now has some light lag compensation. + - bugfix: Fixes cloning computer UI not updating when pressing certain buttons - + also adds extra check for names to update a message + - rscdel: Removes oversized genitalia analysis from medical scanners, since huge + dick and titty are no longer a problem anymore thanks to advancements in that + kind of technology when it comes to chemical fun times growth. + - bugfix: Fixed species-specific drinks not giving a mood boost if you are that + species. + - tweak: You will now only unbuckle fireman-carried/piggybacked people on disarm + or harm intent. + - balance: The traitor AI can no longer activate the doomsday device while carded. + - bugfix: Fixes noodle size appearance for 12+ inch members. + - bugfix: Fixed the subtle hotkey being weird with its input prompts. + - rscadd: Adds a subtler anti-ghost hotkey. Default key is 6. + - tweak: No more straining when your cock or breasts are growing via incubus draft + or succubus milk. + - rscadd: PubbyStation now has two Christmas Tree spawners. + - tweak: You can now have a max-roundstart-dicksize-config inch long johnson before + you start suffering blood loss and slowdowns instead of a 20 inch one. + - rscadd: Color Mates have been added to all stations (except Snaxi). Enjoy coloring + your attire without having to bug science! + - bugfix: Polychromic hoodies that were obtained from the loadout have functional + colorable hoods now. + - rscadd: Adds in timid woman/man costumes. Available at your autodrobe! Also adds + in garters as some new socks. + - spellcheck: Corrected the capitalization in gasmask concealment examine text + Chiirno: + - rscadd: Added the paramedics EVA suit as a purchase from the cargo console. + - rscadd: Paramedics office and Surgery Storage Room + - tweak: Remodeled the surgery room, as well as shrunk Morgue and Starboard Emergency + Storage. Fiddled with some areas for better map edit clarity and fixed one runtime + in Vacant Office A. + - imageadd: Added the paramedic closet sprite, a paramedic colored medical3 closet. + - code_imp: Added a paramedic closet, which is the standard medical3 closet with + their suit, a pinpointer, and a crew monitor added. + - tweak: Nightmare now deals additional damage to most light sources. + - bugfix: Nightmare now one-shots miners beacons and glowshrooms + - bugfix: Portable Chem Mixer now researchable from biotech node. + - tweak: Chem masters can now dispense 20 instances of its outputs instead of 10. + Delams-The-SM: + - rscadd: Added 3 new emotes *hiss *purr *meow + - soundadd: ported sounds from Citadel RP for *purr and *meow + - bugfix: fixed randomization of colors for things like mulligan and Stabilized + green slime extract for matrixed body parts + DeltaFire15: + - balance: Biomechanical (hybrid) bodyparts now have access to wound-fixing surgeries. + - tweak: A wound being fixed no longer just qdel()s surgeries connected to it. + - tweak: Some robotic surgery steps are now a bit more clear. + - bugfix: Organs no longer get fed to people after successfully being inserted into + them. + - tweak: Not completing the do_after of a surgery no longer causes you to attack + the target with whatever you were holding. + - rscadd: IPC cells & power cords are now printable after they are researched. + - rscadd: A new surgery, allowing revival of synths without a defib at hand. + - balance: 'Semi-permanent damage of Synth limbs caused by passing the damage threshold: + 10 <- 15.' + - tweak: The embed removal surgery now has a version for Synths. + - balance: EMPs no longer hardstun Synths. + - bugfix: Portals no longer runtime because of incorrect args. + - tweak: Abductors now can use experimental organ replacement surgery on robots + / synthetics. + - bugfix: Fixes a minor incorrectness in ratvarian borg slabs (ratvar_act -> ui_act) + - bugfix: Changelings no longer double-deathgasp when activating the regen stasis + ability while not dead. + - bugfix: People installing KA modkits in miner borgs is no longer broken. + - bugfix: Fixes the tail entwine messages displaying incorrectly. + - bugfix: Antagging / Deantagging Heretics now properly sets their special role. + - bugfix: The borg VTEC ability now actually gets removed when the upgrade is removed. + - bugfix: Supplypods shouldn't cause runtimes anymore, and shrapnel (pelletclouds) + should work for them. + - rscadd: Robots (anyone with the robotic_organism trait) have toxins damage replaced + with system corruption. See the PR for details. + - code_imp: Clockwork rites now support hiding specific rites from neutered servants. + - tweak: AIs now only have to kill people once instead of permanently. + - bugfix: Scripture no longer sometimes eats part of its invocation. + - balance: APCs and silicons are now more susceptible to powerdrains (by the power_drain() + proc, which is rare) + - balance: Void Volt has been modified from a chant to a singular pulse. + - balance: Robotpeople are now fully immune to the effects of alcohol (drunkness + etc.) + - tweak: Renames the alcohol intolerance trait in the code to make what it does + more clear. + - bugfix: Self-fueling weldingtools recharge fuel properly again. + - bugfix: Brass welders now actually recharge faster than experimental ones. + - bugfix: Repeatable surgery steps can no longer cause an infinite loop if not completing + the do_after + - bugfix: The Revenant self-revive ability is no longer broken. + - bugfix: Loot items mobs drop are no longer always failing to initialize. + - tweak: Instant summons can no longer do wacky stuff with disposals (and nukes). + - bugfix: Objectives are no longer very broken. + - bugfix: Bloodcult stunhands now work against clockies like they were supposed + to instead of hardstunning. + - balance: zeolites are now actual fermichems instead of being incredibly easy to + make. + - bugfix: Using syringes / droppers on chem heaters with beakers in them works again. + - bugfix: Some edge cases causing issues with system corruption shouldn't be able + to occur anymore. + - bugfix: Cyborg B.o.r.i.s. installation now checks for if the chest has a cell, + just like how it does with MMIs. + - bugfix: The 'Your body is in a cloner' notification works again + - bugfix: Hijack implants should work properly again (or, at least better) + - bugfix: Liches are now good skeletons again instead of weak ones + - bugfix: The piratepad control cannot be destroyed again. + - bugfix: Pirates have received new supplies of jetpacks instead of useless oxygen + tanks + - bugfix: Ratvarian AIs are once again able to show their linked borgs Ratvar's + light + - bugfix: Hijackers are once again unable to detonate borgs without being adjacent + to the console + - bugfix: Automated annoucement systems and gulag ore consoles no longer waste emag + charges + - bugfix: Automated announcement systems once again can be remote controlled by + non-AIs with silicon access + - bugfix: APCs being hijacked multiple times at once is no longer possible, preventing + some issues + - bugfix: Recharging APCs no longer use 0.2% of the power they should be using. + - bugfix: APCs no longer always use as much power as they can for their cell, even + if it is full. + - bugfix: Vampire shapeshifting should now behave as intended + - balance: Some synth damage stuff has been a bit rebalanced, see the PR for details. + - rscadd: Nanogel, available at medical and robotics, which fixes internal damage + in sufficiently repaired robotic limbs. + - balance: Robotic Limbs now each have their own damage threshhold values + - balance: Robotic Limb damage threshholds are now seperated into threshhold itself + and mindamage when passed balance; Hybrid limbs can now be injected with hypos, + but not sprayed (Still not healed by chems) + - tweak: Brain surgery has been tweaked back to allowing robotic limbs, blacklisting + IPC brains instead. + - tweak: Robot brain surgery can now be used on organic heads, if there is a IPC + brain in them somehow. + - tweak: The robot limb heal surgery can now be used even if the target's torso + is not robotic, as long as they have robotic limbs + - refactor: BODYPART_ROBOTIC / BODYPART_ORGANIC checks replaced with helper-procs + whereever possible. + - code_imp: Added a BODYPART_HYBRID define for robotic bodyparts that behave organic + in some regards. + - bugfix: The transmission sigil power drain works now + - bugfix: A certain lizard (totally not me) being stupid is no longer going to break + regenerate_bodyparts + - bugfix: Combat mode now will not stay permanently disabled due to status effects + not working as intended. + - bugfix: Attacking some certain objects no longer has no clickdelay. + - bugfix: the blacksmithing skill now works properly + - tweak: Anvils cannot be interacted with with hammers whilst they are already being + used + - tweak: If someone has no gloves when interacting with heated ingots, they no longer + ignore their effects. + - bugfix: A runtime caused by hallucinations is gone. + - bugfix: Cargo packs marked as 'no private buying' now actually register as such. + - balance: Fleshmend, Anatomic Panacea and bloodsucker healing now work for Synths + / IPCs. + - tweak: Medibots now ignore people they cannot help due to their biology. + - bugfix: get_damaged_bodyparts() is no longer broken. + - bugfix: Your target cryoing will no longer give you a free greentext. + - bugfix: Sleeper UI interactiveness now behaves correctly. + Detective-Google: + - rscadd: arcade carpet + - rscadd: explosions now get broadcasted to deadchat. + - rscadd: Lick radial + - bugfix: Hilbert's jukebox works + - bugfix: arcade carpets now actually work + - tweak: the snow taxi is no longer the slow taxi + ERP mains: + - rscadd: Subtler Around Table is now a verb + EdgeLordExe, MoonFalcon: + - balance: Ported a bunch of heretic-related tweaks and changes from tg + EmeraldSundisk: + - rscadd: Adds a few new area designations primarily for CogStation, incorporates + them into said map + - tweak: Reorganizes some area designations for ease of use, along with renaming + the central "Router" to "Routing Depot" + - bugfix: Fixes an incorrectly designated area in CogStation + - bugfix: Changes the area designations to be not varedited since the code didn't + like that anymore + - bugfix: The cargo bay conveyor belts not only work with the shuttle now but go + in the right direction to boot + - tweak: Slight visual adjustments to cargo in light of this + - rscadd: The arcade's got RAD carpet now + - bugfix: Fixes the conveyor belt issues in Delta Station's cargo wing + - rscdel: Removes some of the dirt around the affected area (presumably they would + have cleaned it up while working on it) + - rscadd: Adds a floor light to fix the "dark spot" cargo had + - rscadd: Adds a new "Computer Core" area designation for CogStation + - bugfix: Fixes some missing area strings + - tweak: Replaces some firelocks with directional ones as to ensure desks/counters + can still be accessed + - balance: The "Skelter ruin" now has stechkins as opposed to M1911s + - tweak: Skelter's decorative bullet casings replaced to factor in the change in + caliber + - rscadd: Skelter now has a combat knife and fluff note + Ghommie: + - bugfix: You can access the mime / clown mask skins radial menu once again. + - bugfix: Dice bags no longer act like cardboard boxes. + - bugfix: Abductors should be no longer mute. + - bugfix: Item action buttons should now properly show the item current overlays, + most times. + - bugfix: The blackbox should now go into your hand slot when pried out, rather + than tumbling on the ground everytime. + - tweak: The Quick Equip hotkey is now usable by all living mobs (so long they have + hands and equipment slots) + Ghommie, porting PRs by MMMiracles and pireamaineach, credits to BlueWildrose too.: + - rscadd: You can now draw on plasmaman helmets with a crayon to turn their frown + upside-down. + - balance: Plasmaman helmets no longer hide your identity when worn by themselves. + - balance: Plasmaman helmets now have welding visors, which can't stack with their + torches in the helmet and are visible. + Hatterhat: + - rscadd: Energy sabre reskin for the energy sword - access via alt-click. + - bugfix: Alt-click reskins are fixed. + - tweak: Defibrillators and their many, many overlays were moved to another .dmi. + - tweak: You can now change the color of an energy sword via multitool. Not deswords. + Yet. + - imageadd: The Syndicate appear to be issuing new revolver variants. + - rscadd: Basic sticky technology is now a roundstart tech. Advanced sticky technology + is BEPIS-locked, though. Theoretically. + - tweak: Non-smithed katanas (including the temporal katana) can now fit in the + twin sheath. + - tweak: Cotton and durathread processing by hand now acts like grass. Stand on + a pile of cotton (or durathread) and use a single bundle from it. + - spellcheck: Utility uniforms now comply with the "nonproper equipment names" thing. + - bugfix: The CapDrobe now allows the captain to get his own clothes for free. Probably. + - tweak: All captains' clothes now offer 15 woundarmor, up from the 5. Because apparently + only the suit and tie and its suitskirt subtype have this wound armor, which + is dumb. + - rscadd: The nature interaction shuttle with the monkeys now has tiny fans on the + airlocks in, because that's apparently a feature that was missing. + - rscadd: More bags have been added to department vendors. + - balance: Every roundstart species (and also ash walkers) now has flesh and bone + that can be wounded. + - balance: Recipes for sutures, regen mesh, and sterilized gauze have been adjusted + to be easier, mostly. + - balance: Sterilized gauze is better at absorbing blood and being a splint. + - bugfix: Energy sabres now have an off inhand. + - balance: The bone gauntlets should be slightly less murderously punchy on the + fast punches mode. + - tweak: RPEDs now drop their lowest part tier first when quick-emptied (used inhand). + - tweak: Improvised gauzes can now be crafted in stacks up to 10, like their maximum + stacksize implies they should be capable of doing. + - bugfix: Pouring sterilizine on gauze now takes the proper 5u per sterilized gauze + instead of 10u. + - bugfix: Cryogenics now screams on common again when your fuckbuddy heads out. + - rscadd: Survival daggers! A slightly more expensive survival knife that comes + with a brighter flashlight. On the blade. + - tweak: Luxury pod capsules look different from normal capsules. + - rscadd: The wastes of Lavaland and the icy caverns of Snow Taxi rumble in unison. + - tweak: Exosuits sold on the Supply shuttle no longer leave wreckages. + - rscdel: Apparently, shrink rays were buyable again, despite a PR having been made + a while ago specifically for removing shrink rays. They're gone again. + - rscadd: Changeling bone gauntlets! They punch the shit out of people really good. + - tweak: Guerilla gloves and gorilla gloves inherit the strip modifiers of their + predecessors, because apparently they had those. + - balance: Pugilists now always hit the targeted limb and never miss. + - rscadd: The dock-silver standard set by Box and Meta has been enforced across + maps in rotation (Delta, Pubby, Lambda). + - bugfix: The Box whiteship now has its missing tiny fan back. + - bugfix: The survival dagger light on the sprite now actually turns on and off. + - balance: The survival dagger in the glaive kit that can also be bought by itself + is now better at butchering things. + HeroWithYay: + - bugfix: Changed description of Necrotizing Fasciitis symptom. + - tweak: Wormhole Projector and Gravity Gun now require anomaly cores to function + instead of firing pins. + KeRSedChaplain: + - imageadd: Resprited the brass claw + LetterN: + - rscadd: 2 more ways to get up from z1 + - tweak: tweaked the z2 garden to be less blank + - bugfix: fixed telecomms pda log + - rscadd: Coin & Holochip support for slot machine + - admin: Stickybans are now saved in the DB too + - soundadd: Immersive ™ audio reverbs. (also adds multiz audio) + - code_imp: Semi-hardsync from TG + - code_imp: Updates rust-g + - code_imp: Uses git CI instead of travis/appveyor now + - code_imp: Updates git and build tests. + - bugfix: minimap text + - code_imp: ports cinematic upgrades + Linzolle: + - bugfix: entertainment monitors no longer invisible + - rscadd: entertainment monitors now light up and display text when motion is detected + in thunderdome + - bugfix: lizard snouts are no longer *slightly* lighter than they are supposed + to be. + MrJWhit: + - rscadd: Expanded space hermit base + - tweak: Replaced engineering fuel tank with a large fuel tank + - tweak: Changed access to sec suit storage from armory access in every map to other + security access + - rscadd: Adds a space loop to every map in toxins + - rscadd: '' + - tweak: Added the ability for cargo to buy a large welding tank + - imageadd: Tweaked large tank reagent sprites to /tg/'s + - tweak: Gives metastation toxins storage a scrubber and a vent + - tweak: Updates suit storage info on Tip Of the Round. + - tweak: Increased christmas event from 22th to 27th to 10th to 27th + - tweak: Removes an opposum from the wall + - tweak: Donut boxes show what's inside of them now + - tweak: Updated meat icons + - admin: Canceling events gives more time to stop from 10 to 30 + - tweak: Fixes two chairs on one table + - tweak: Removed the wires connecting the AI from the rest of the station on cogstation. + - tweak: Fixes experimenter on cogstation. + - tweak: Less pipes in the overall area in toxins on cogstation + - tweak: Small fixes on security on boxstation + - tweak: Updated jukebox sprite. + - tweak: Fixes maint area in boxstation + - tweak: Christmas starts on the 18th now + - rscadd: Adds a goose bar sign + - bugfix: Effects can no longer trigger landmines + - rscdel: Removes the screen flashing on climax. + - rscadd: Makes gas sensors fireproof. + - tweak: A small bucket of random fixes, + - tweak: Minor fixes to kilo + - tweak: Porting garbage collection tweak from /tg/ + - tweak: Updates our dark gygax sprites to /tg/'s + - tweak: Bugfix of a morph becoming an AI eye + - tweak: Mining station oxygen locker on the cycling airlock starts out wrenched. + - balance: Nerf combat knife damage + - bugfix: Code improvement on ventcrawling + NT Cleaning Crews On Break: + - rscadd: Most kinds of dirt, grime, and debris are now persistent. Get to work, + jannies. + - rscadd: Dirt can now be removed by tile replacements. Other cleanable decals can't, + though. + Putnam3145: + - tweak: Replaces majority judgement with usual judgement. + - bugfix: Toilet loot spawners don't lag the server on server start with forced + hard dels. + - bugfix: vore prefs save now + - tweak: gear harness no longer magically covers up the body mechanically despite + covering up nothing visually + - balance: Regen coma now puts into a coma even from crit or while unconscious. + - bugfix: Regen coma now properly weakens while asleep. + - bugfix: Multi-surgery unit test no longer fails at random. + - refactor: Dwarf speech is no longer absolutely paranoid about word replacement. + - balance: Spontaneous brain trauma now requires minimum 5 players + - tweak: Grab bag works as advertised. + - balance: Xeno threat in dynamic tripled. + - code_imp: 'Vote system #defines are now strings' + - rscadd: Stat panel UI for ranked choice votes + - rscadd: A fallback for dynamic antag rolling that allows for it to just try between + traitor, blood brothers, heretics, changeling, bloodsucker and devil until there + are enough roundstart antags. This can also happen randomly anyway. Blood brothers + and devil are disabled for now, but the code is there to enable them. + - rscadd: A new storyteller, "Grab Bag", that forces the above round type. + - bugfix: atmos subsystem no longer dies if there's too many gases + - bugfix: Emotes can properly be filtered for in TGUI. + - bugfix: Holofirelocks work now. + - bugfix: adminhelping no longer removes entire admin tab + - bugfix: end of round no longer removes entire admin tab + - bugfix: Fixed a runtime in every healing nanite program. + - bugfix: removed a unit test causing master to fail + - tweak: Planetary atmos no longer does superconduction. + - bugfix: Dynamic vote no longer shows the none-storyteller. + - tweak: You can now exit polycircuit input + - bugfix: Polycircuits now check for range + - bugfix: gear harness alt-click is now sane + - code_imp: rolldown() and toggle_jumpsuit_adjust() now no longer mix behavior-that-should-be-overridden + and behavior-that-shouldn't-be-overridden in ways that make no sense. + - tweak: Gear harness now covers nothing. + - bugfix: Chemical stuff now displays fermichem stuff properly + - balance: Rad collectors now get 1.25x as much energy from radiation + - balance: Rad collectors now put out 1.25x as much stored energy per tick + - balance: Above two rad collector changes give a total 56.25% power output increase + - balance: Zeolites now only generate 1/5 the heat when reacting and don't require + a catalyst. + Ryll/Shaps: + - admin: Fixed an issue with player logs becoming confused when someone triggers + multiple events within one second (like being attacked by two people at the + same time) that would cause holes in the logs + SandPoot: + - tweak: You can attack a pile of money on the floor with your id to put it all + in quickly. + - refactor: Changes the limb grower a lot. + - bugfix: '"Limb" costs on limbgrower are actually displayed like it was meant to + all along.' + - code_imp: Swaps the gift static blacklist with a global list one. + SiliconMain: + - tweak: Engi department has gas masks in loadout + - tweak: hololocks (which haven't worked for god knows how long) commented out until + auxmos is merged + Sonic121x: + - rscadd: alarm ert hardsuit sprite for naga and canine + - tweak: adjust the naga ert hardsuit to cover the hand + - bugfix: cydonia hardsuit helmet + - rscadd: digi sprite uniform + - bugfix: digi leg suit + SpaceManiac: + - bugfix: Fixed the maphook + Thalpy: + - bugfix: fixes some bugs in jacqs code from edits to the codebase + The Grinch: + - rscdel: infinite presents from hilbert hotel + TheObserver: + - rscadd: Re-adds the rifle stock, and sets the improv shotgun to be as it was. + - rscdel: The maintenance rifle has been shelved - for now. Watch this space. + TheObserver-sys: + - bugfix: Drake? Where's the dead fairygrass sprite? + TheSpaghetti: + - bugfix: no more tumor bread double punctuation + Trilbyspaceclone: + - tweak: Zeolites now use gold rather then uranium for catalyst + - tweak: Zeolites are not as hard to make ph wise + - tweak: Making Zeolites heats up the beaker less allowing for better control + - tweak: ASP 9mm and M1911 can now have suppressers added + - balance: Brass welders are 50% faster at refueling + - code_imp: redoes self fueling welders in the code to be less speggie + - rscadd: the corporate unifoms can now be gotton in the clothing mate vender + TripleShades: + - rscadd: 'Firelock to Surgery Bay drapes change: Swapped Nanomed and Fire Alarm + button locations in both Surgery Bays change: Removes the double mirror in both + Surgery Bays to be a singular mirror change: Moved an intercom to not be doorstuck + below Paramedical Office remove: One Surgery Observation Fire Alarm button' + - rscadd: 'New Paramedic Office next to Genetics where the old Genetics Reception + used to be change: Surgery, Surgery Observation, and Recovery Hall layout revamped + drastically change: Maints below Surgery lowered by one tile to recover lost + tile space from Surgery expansion' + Tupinambis: + - rscadd: Arachnids (spider people) with limited night vision, flash vulnerability, + and webbing. + Vynzill: + - rscadd: 'new gateway mission mapadd: jungleresort map' + - bugfix: fixes high luminosity eyes + Xantholne: + - bugfix: Fixed new birds changing back to basic parrot when sitting + - rscadd: New parrots from the RP server, can be found in Bird Crate in Cargo + - rscadd: You can now tuck disky into bed + - rscadd: You can now make beds by applying a bed sheet to them + - rscadd: You can now tuck in pai cards into bed + - rscadd: Added bed tucking element, can be added to any held object to allow tucking + into beds + - bugfix: Twin Sword Sheaths have an equipment icon and icon when worn now and make + a sound when sheathed/unsheathed + Yakumo Chen: + - balance: Slime Jelly is no longer obtainable from slimepeople. Go ask Xenobio + YakumoChen: + - balance: "To lower production costs, Buzz Fuzz is now manufactured with Real\u2122\ + \uFE0F Synthetic honey." + Zandario: + - code_imp: Added some framework for future species expansions, including clothing + refitting. + - refactor: Made majority of the relevant Species IDs and Categories pre-defined, + also for easier expansion and use. + - bugfix: lum slime sprites work again + - code_imp: Slapped the Species Defines where relevant + corin9090: + - tweak: The chaplain's prayer beads can now be worn on your belt slot + kappa-sama: + - bugfix: super saiyan + - tweak: ishotgun crafting recipe no longer requires plasteel and is slightly more + convenient + - balance: ishotgun does 45 damage now instead of 40.5 + - rscadd: s + - tweak: s + - balance: s + - bugfix: s + - rscadd: A new spell for the wizard and his martial apprentices, the Inner Mantra + technique. It makes you punch people really good and makes you durable, but + drains your energy while it's active. + - rscadd: A self-buffing spell for valiant bubblegum slayers that is ultimately + useless on lavaland and probably overpowered for miner antagonists. Go figure. + At least all it does is let you punch hard while draining your health every + second. + - balance: bubblegum now drops a book that makes you into an abusive father instead + of a shotgun that plays like pre-nerf shotguns + - soundadd: a powerup and powerdown sound effect + - imageadd: two icons for two buff spells + keronshb: + - bugfix: Allows Energy Bola to be caught + - balance: This also allows them to be dropped/picked up. + - rscadd: Adds a reduced stamina buffer for SCarp users + - rscadd: Gives SCarp users a better parry + - rscadd: Adds the SCarp bundle which includes a bo staff + - rscadd: Lets Carp costumes carry Bo Staffs + - balance: reduces the stamina damage of scarp slightly + - balance: reduced the blockchance of the bo staff + - rscadd: Adds more room to northwest maint + - rscadd: Adds a bridge between Atmos and the Turbine. + - balance: Blob Resource Tower to 2 points per instead of 1 point per. + - balance: Blob Factory Towers can be placed 5 tiles apart instead of 7. + - bugfix: Fixes Blobbernaut Factories consuming Factories if no naut is chosen. + - bugfix: Fixes Reflective Blobs + - rscadd: Re-adds the Clown Car to the clown uplink + - balance: 15 >16 TC cost + - balance: bonks on external airlocks + - bugfix: Fixes the parry data for scarp + kittycat2002: + - rscadd: set the name of /datum/reagent/consumable/ethanol/species_drink to Species + Drink + kiwedespars: + - balance: balanced bone gauntlets. + - rscadd: the robust dildo weapon now has sound. + necromanceranne: + - bugfix: Fixes various sprites for bokken, as well as being unable to craft certain + parts and duplicate entries. + - rscadd: 'Bokken now come in two lengths; full and wakizashi, and two varieties: + wood and ironwood. They have different stats for all four.' + - rscadd: Bokken require menu crafting and part construction, as well as more complicated + materials. + - tweak: Bokken (long and short) require wood, cloth and leather to craft with a + hatchet and screwdriver. + - tweak: Ironwood bokken (long and short) require ironcap logs, cloth and leather + to craft with a hatchet, screwdriver and welder. + - balance: Twin sheathes can only fit a pair of blades (longsword + shortsword) + or they can fit two shortswords. + - bugfix: Fixed a twin sheath runtime. + - imageadd: A lot of bokken related sprites received an overhaul. Added overlay + sprites for weapons sheathed in the twin sheathes. + - imageadd: The extradimensional blade received improved sprites for inhands/back + sprites. + - bugfix: You can now make all the variants of the bokken. + - bugfix: Removes a duplicate sprite. + - tweak: Renames all instances of 'ironwood' to 'steelwood'. + - rscadd: Adds new roboticist labcoat sprites! + qwertyquerty: + - bugfix: Flash the screen on climax + raspy-on-osu: + - spellcheck: salicylic acid + - tweak: space heater heating range and power + - tweak: windoor open length + shellspeed1: + - rscadd: Wings from Cit RP have been ported over + - rscadd: Moth wings from cit have been ported over + - bugfix: Cleaned up some pixels on existing moth wings. + - tweak: Organized the lists for wings by if they are for moths or not and than + by alphabetical. + - balance: Lings now have infinite space for DNA. + - rscadd: All xenomorph types have been added as corpses for mapping purposes + - balance: The dead xenomorphs in the lavaland xenomorph hive now have more variety. + - tweak: Floor bots are now buildable with all toolboxes. + - rscadd: 'Xenomorph hybrids can now select wings ~~add: Xenomorph hybrids can now + speak xenomorph~~' + - rscadd: Xenomorph tongues are available for customization. + - rscadd: Mining borgs can claim points again + - rscadd: Construction bags have been added, use them to carry all sorts of construction + bits. + - rscadd: A recipe has been added to cloth stacks to make material and construction + bags. + - balance: Material bags and construction bags are now available in engineering + lockers. + - rscadd: Adds the disposable sentry gun from tg for 11tc each. + - rscadd: The exofab can now print prosthetic limbs + - bugfix: The exofab was missing access to multiple cybernetic organs. This has + now been rectified. + - rscadd: A new recipe for a spicy has been given to us by a strange business man. + - rscadd: The bluespace navigation gigabeacon design has been added to shuttle research + for those wanting to take their ships around space more. + - tweak: Xenomorph powers now list plasma cost in their description. + silicons: + - tweak: nanite resistances tweaked + - rscadd: new nanite programs added for locking the user out from being modified + by consoles or antivirals. + - rscdel: anomalies no longer spawn in walls + - rscadd: 'Twitch Plays: Clown Car' + - rscadd: pugilists can now parry + - balance: c4 can no longer gib mobs + - tweak: medium screens are better now + - tweak: text formatting now uses one character instead of two around the text to + emphasize. + - rscadd: colormates + - balance: shoving yourself up now costs 50% more + - bugfix: dullahans enabled + - rscadd: tailed individuals can now target groin to intertwine tails on grab intent. + - rscadd: Clowns now have unpredictable effects on supermatter crystals when dusting + from contact. + - tweak: anyone new to the server is lucky enough to have their sprint default to + toggle instead of hold + - balance: stamina crit is only removed when at or under 100 stamina, rather than + 140. stamina crit threshold is still at 140. + - tweak: luxury shuttle no longer has noteleport + - rscdel: now only poly gets a headset on spawn, not all birds. + - tweak: the warp implant now actually warps you back 10 seconds. leaves a trail, + though. now unlimited us. + - bugfix: things in DEATHCOMA do not deathgasp on death + - tweak: Meth and changeling adrenals no longer ignore all slowdowns, rather damage + slowdowns. + - rscadd: you can now be an angel using a magic mirror again + - tweak: command headsets are 120% instead of 160% + - bugfix: no more emote italics + - rscadd: players can now respawn/return to lobby as a ghost after a 15 minute (default) + delay and rejoin on another character with some/many restrictions + - rscadd: cryo now preserves everything + - bugfix: Magrifle ammo no longer glows. + - tweak: temperature slowdown divisor nerfed to 35 from 20. + - balance: dna melt drops all items being destroying you + - bugfix: keybinds generate anti-collision bindings where necessary automatically + now + - balance: changeling combat mutations rebalanced. most of them take chemicals to + upkeep now. + - rscadd: set-pose has been added + - tweak: temporary flavor text renamed to set pose, fully visible in examine + - bugfix: ninja gloves no longer hardstun + - balance: ninja gloves now cost half as much to use to compensate + - bugfix: simple mobs are now immune to radioactive contamination + timothyteakettle: + - bugfix: time for memory loss message to show up when being revived is now correctly + 300 seconds, instead of 30 + - bugfix: the load away mission verb won't crash the server now + - rscadd: roundstart slimes can turn into puddles now + - rscadd: all gas masks (but welding + glass) can be alt clicked to show/hide identity + - tweak: autosurgeons from travelling trader rewards now only have one use + - bugfix: fixes held items proccing crossed when passing someone + - tweak: you can now get a family heirlooms based off your species instead of job + - tweak: changeling stings retract upon turning into a slime puddle + - tweak: you cannot transform into a slime puddle with a no drop item in your hands + - tweak: slime puddles are now transparent and their colour looks more natural in + comparison to the user + - tweak: slime puddles are now even slower + - tweak: slime puddles now get no protection from worn clothing + - rscdel: removes two debug messages left in from my prior eye customization pr + - rscadd: adds unlockable loadout items, corresponding category in loadouts, etc + - rscadd: added in-game age verification as an alternative to access requests + - bugfix: disabling adminhelp noises no longer disables looc + - bugfix: apids render now + - bugfix: you can now only entwine tails with people who have a tail + - bugfix: custom eyes and tongues now properly carry across cloning + - rscadd: re-adds the holoform verb for people who want to use it over going through + the char list + - bugfix: eye sprites should look normal once more + - rscadd: licking people washes pie off their face + - rscadd: you can now pick your eye sprites from customization + - tweak: looking at loadout equips loadout items on your preview image instead of + job items + - tweak: custom holoforms are now accessible through an action instead of through + verbs + - tweak: AI holoforms can now emote + - tweak: cloning now correctly copies your blood colour, body sprite type and eye + type + - bugfix: species with NOTRANSSTING cannot have envy's knife used on them + - rscadd: avian/digitigrade legs have been added for slimes + - rscadd: you can teleport bread + - tweak: slime puddles are no longer layered down one layer + - tweak: you cannot tackle with two paralysed arms + - tweak: tackling with a single paralysed arm lowers your tackle roll by 2 + - bugfix: circuits get pin data proc is sanitized when text is returned as data + - rscadd: loadout now has save slot support and colour choosing/saving for polychromic + items + - rscadd: polychromic maid outfit + - rscadd: you can rebind communication hotkeys and they're the default now + - rscadd: you can now customize your size from 90% to 130%, going below 100% makes + you have 10 less max health + - rscadd: '*squeak' + - rscadd: anthromorphic synth species + - rscadd: improvements to the automatic age gate + - tweak: antag items are now of critical importance and wont fail to be placed on + the character + - bugfix: a tonne of fixes to colourisation of parts, too many to name, including + some sprite fixes + - rscadd: things now have their own individual primary/(secondary)/(tertiary) colours + as required, and these can be modified by you + uomo91: + - bugfix: Fixed "Show All" tab in player panel logs being broken. + - bugfix: Whispers, OOC, and various other things display differently in logs, visually + distinguishing them from say logs. + - refactor: Player panel logs will now show all logs chronologically, so you'll + see commingled say and attack logs if you're on the "Show All" tab, etc... + yorii: + - bugfix: fixed botany rounding error that caused grass and other plants to misbehave + zeroisthebiggay: + - bugfix: legion now drops chests + - rscadd: Traitor assistants can now purchase the patented POGBox! Put TC into it + for even higher damage! + - balance: MEGAFAUNA DROPS ARE LAVAPROOF + - imageadd: cool codex cicatrix inhands + - rscadd: gravitokinetic stands from tg + - balance: buffs stands overall + - bugfix: protector stands no longer become tposing invisible apes sometimes + - bugfix: jacqueline spawns on boxstation + - rscadd: secsheath for your cool stunsword at your local security vendor. you gotta + hack it first though. + - imageadd: fuck the r*d cr*ss + - rscadd: The legion megafauna has been reworked. The fight should now be both slightly + harder and faster. + - balance: You can no longer cheese the colossus by being a sand golem and simply + being immune. +2021-01-22: + Arturlang: + - rscadd: Adds a way to give items to people, you can combat mode rightclick to + offer it to one person, right click on people without mode and click the give + verb, or use the hotkey CTRL G to offer it to everyone around you +2021-01-25: + MrJWhit: + - bugfix: Alien radio code + - rscadd: Microwave can now be cleaned by a damp rag as well as soap. + - bugfix: Removes some unused code, and improves some other code. + - rscadd: The AI has a verb to look up and down z-levels + - bugfix: Making a monkey into a human doesn't unanchor random things on the tile + - bugfix: Makes a few slight improvements to drinking code + - tweak: Makes encryption keys be put in the hands of the user when able instead + of being dropped on the floor when removed from headsets + raspy-on-osu: + - refactor: ventcrawling + silicons: + - tweak: you can now shove yourself up in any intent, not just help. +2021-01-27: + ArcaneMusic, ported by Hatterhat: + - rscadd: Strike a hydroponics tray with a fully-charged floral somatoray to lock + in a mutation. + - rscadd: Floral somatorays now have the ability to force a mutation in a plant. + This should drain the cell in a single shot, but we'll see. + - balance: Somatorays now take uranium to craft instead of radium. + Arturlang: + - rscadd: Actually adds a right click give option + - rscadd: Revenants can now clickdrag to throw stuff at people, with some items + doing various things at the same time. + DeltaFire15: + - bugfix: The woundmending rite no longer causes runtimes. + - bugfix: Ratvarian borgs can now use their tier-0 spells. + - balance: Ratvarian borgs can always use their assigned spells, if there is enough + power. + - admin: The heretic antag panel now shows their sacrifices & current sacrifice + targets. + - tweak: The heretic roundend report now shows their sacrifices and nonsacrificed + targets. + - bugfix: Living hearts can no longer select the same target as another living heart, + removing a certain problem. + Hatterhat: + - tweak: Department budget cards have been readded. TO THE CODE. NOT LOCKERS. + - tweak: Also budget cards now look more like every other ID - see tgstation#55001. + - balance: One of the contractor tablet's payouts has been raised from a small payout + to a medium payout. + - balance: The free golem ship's GPSes no longer start on. They were never meant + to, but they did. + - rscdel: Headsets can't be found on most legion corpses now. + - rscdel: The flash on the assistant corpse is gone, too. + MrJWhit: + - tweak: Remaps some air alarms for sanity. + SandPoot: + - bugfix: The drop circuit can no longer drop things that are not inside it. + raspy-on-osu: + - bugfix: bespoke ventcrawling element not detaching due to malformed call + shellspeed1: + - bugfix: Floorbots had had a software update, preventing them from dogpiling on + their target as easily as they did before. + - soundadd: Floorbots will now play a small chime when stacked on top of each other + to indicate that they're moving apart. + timothyteakettle: + - rscadd: blobs can use the 'me' verb + - admin: adminhelps and pms only sanitize once instead of twice +2021-01-28: + silicons: + - rscadd: colormates can now paint some mobs. + - bugfix: 1 dev explosions shouldn't delete brains anymore +2021-01-29: + MrJWhit: + - tweak: Ported the QM, Captain, CMO, and HoS cloaks from beestation. + - rscdel: Removes excess air alarms from boxstation + TripleShades: + - bugfix: fixes engineering secure storage being the wrong area because I fucked + that up previously my bad + - bugfix: removes funny extra light switch under right surgery table in surgery + oops + - rscadd: Added chairs to the corpse launch viewing area + - rscadd: Small garden plot for flowers for parity with other station Chapels + - rscadd: Plain Bible to glass tables in Chapel + - rscadd: Candles and Matchbox to glass tables in Chapel + - rscadd: More glass tables, with a chaplain figure and another spare bible. + - rscadd: Bookcase to Box Chapel for parity with other station Chapels + - rscadd: Minimoog to Box Chapel as substitute for a church organ + - rscadd: 'Holy department sign just below Chapel change: Expanded the corpse launching + area to feel less congested change: Added windows to the corpse launch so you + can look inside I guess? change: Moved flowers and burial garments to the corner + next to the corpse launcher change: Box Chaplain''s office door is moved over + one change: Confessional is now connected to Chaplain''s office for parity with + other station Chapels change: Moved coffins over to old confessional location + change: Box Chapel now has pews instead of stools change: Box Chapel Confessional + is now lit instead of being nearly pitch black remove: Two coffins from Chapel' + timothyteakettle: + - bugfix: the miner bedsheet will now increment its progress when you redeem points + from the ORM + - rscadd: you can add custom names and descriptions to item's on the loadout now + zeroisthebiggay: + - rscadd: roundstart aesthetic sterile masks and roundstart paper masks + - rscadd: more accessory slot items + - rscadd: cowbell necklace happy 2021 + - rscadd: shibari ropes & torn pantyhose +2021-01-30: + timothyteakettle: + - rscadd: adds 'clucks', 'caws' and 'gekkers' to the speech verb list + zeroisthebiggay: + - rscadd: some more FUCKING hairs + - imageadd: uncodersprites the advanced extinguisher +2021-01-31: + Putnam3145: + - balance: fermichem explosion EMPs don't cover the entire station +2021-02-02: + silicons: + - rscadd: pais can now be carried around piggybacking/fireman + - balance: Meth and Nuka Cola once again, speed you up. +2021-02-03: + Hatterhat: + - bugfix: The green energy sabre's sprite now respects proper handedness. +2021-02-05: + SmArtKar: + - rscadd: The orbit menu now has an Auto-Observe button! No more sifting through + the lame observe menu to snoop in people's backpacks! Also, orbit menu now refreshes. + - bugfix: KAs are no longer getting broken when fired by a circuit + keronshb: + - balance: Force and damage > 15 from 18/25 + - balance: Knockdown put down to 5 from 30 + - balance: Armor pen down to 10 from 100. + - balance: Makes cell chargers, charge faster. + raspy-on-osu: + - bugfix: alien royals can no longer ventcrawl + shellspeed1: + - balance: There actually needs to be people for zombies to happen now. + timothyteakettle: + - rscadd: dwarf facial hair is no longer randomised +2021-02-07: + Thalpy: + - refactor: 'Dispenser: Adds the ability to store a small amount of reagents in + the machine itself for dispensing. Reacting recipies cannot be stored. Size + of storage increases with bin size.' + - refactor: 'Dispenser: Allows reagents to be color coded by pH' + - refactor: 'Dispenser: Each reagent displays it''s pH on hover' + - refactor: 'Dispenser: Allows the user to toggle between buttons and a radial dial' + - refactor: 'Dispenser: When the dispencer is upgraded it can dispense 5/3/2/1 volumes + based on rating refactor: Dispenser: as it was before. This does not break recorded + recipes.' + - tweak: Adds a round function to some numbers so they're not huge + - tweak: The Chem master can now get purity for all reagents when analysed + - bugfix: Synthissue fixes + - tweak: buffers now have a strong and weak variant. Weak can be dispensed, and + strong can be created. Strong buffers are 6x more effective. + - bugfix: Some buffer pH edge calculation fixes + TyrianTyrell: + - rscadd: added a signed language, that can't be used over the radio but can be + used if you're mute. also added the multilingual trait. + - imageadd: hopefully added an icon for the signed language. + - code_imp: changed how some traits function slightly. + dzahlus: + - tweak: tweaked a few sounds + - soundadd: added a new weapon sounds + - sounddel: removed old weapon sounds + - code_imp: changed some sound related code + silicons: + - rscadd: syndicate ablative armwraps have been added. +2021-02-09: + Chiirno: + - rscadd: Adds clown waddle to clown shoes. Enhanced Clown Waddle Dampeners can + be engaged in-hand with ctrl+click, _but why would you?_ + MrJWhit: + - rscadd: Re-adds theater disposal outlet, and makes dorms disposal able to have + things sent to it on boxstation. + TyrianTyrell: + - bugfix: made default tongue able to speak signed language. + timothyteakettle: + - balance: sentient viruses can now infect synths and ipcs +2021-02-11: + Adelphon: + - rscadd: Charismatic Suit + - rscadd: Urban Jacket + DeltaFire15: + - tweak: Added nanogel to the robodrobe. + Putnam3145: + - rscadd: Config to keep unreadied players from mode voting + dzahlus: + - bugfix: fixes grenadelaunch.ogg being used where it shouldn't and makes mech weapons + use correct sound + keronshb: + - balance: 10 > 30 second for Warp Implant cooldown + - rscdel: Comments out power sink objective. + timothyteakettle: + - bugfix: persistent blood should stop being invisible and alt clicking it shouldn't + return the entire spritesheet + - admin: pickpocketing is now logged using log_combat + zeroisthebiggay: + - tweak: the aesthetic sterile mask no longer hides faces so you can cosplay egirls + and keep flavortexts +2021-02-12: + Hatterhat: + - balance: The ATVs on SnowCabin.dmm have been replaced with snowmobiles. + MrJWhit: + - tweak: Random deltastation fixes. + - tweak: Gives boxstation vault door actual vault door access + silicons: + - balance: Voice of God - sleep removed, stun staggers instead, knockdown is faster + but does not do stamina damage, vomit is faster but doesn't stun +2021-02-13: + Hatterhat: + - balance: Energy bolas now take 2.5 seconds to remove and dissipate on removal. + timothyteakettle: + - admin: migration error to version 39+ of savefiles is now logged instead of messaging + all online admins in the chat +2021-02-14: + DeltaFire15: + - admin: The antag panel now correctly shows the names of cultist / clockcult datum + subtypes. + - bugfix: Adding clock cultists via the admin panel now works correctly. + - bugfix: Xeno larvae should now be able to ventcrawl again. + Hatterhat: + - tweak: Repairing sensors on jumpsuits now requires a fully-intact jumpsuit. Find + some cloth. + - tweak: Durathread armor kits now require you to have a fully-repaired jumpsuit, + first, with no attachments. + - bugfix: Durathread armor kits now no longer weave the entirety of the jumpsuit + armor universe into having armor. + TyrianTyrell: + - code_imp: added a define for multilingual granted languages, and changed the multilingual + trait to use it. +2021-02-15: + Adelphon: + - rscadd: polychromatic shoes + - rscadd: polychromatic windbreaker + - rscadd: polychromatic canvas cloak + - bugfix: digitigrade charismatic suit texture + DeltaFire15: + - balance: Kneecapped pugilist parries somewhat. + - balance: Slightly nerfed default unarmed parries. + - balance: Slightly nerfed traitor armwrap parries. + - bugfix: Pugilist parries now cannot perfectly defend against projectiles, as they + were supposed to. + - bugfix: Some parrying numbers that one would think were in seconds didn't have + the SECONDS. I added those. + - balance: Clock cultists now yell alot less when invoking scripture. + dzahlus: + - rscadd: Added new emote + - soundadd: added a new emote sound + silicons: + - balance: people on the ground hit less hard in unarmed combat. rng miss remove + from punches. + - bugfix: chat highlighting no longer drops half your entered words. +2021-02-16: + silicons: + - config: sprint removal entry added, UI will revert to old UI while this is active. +2021-02-18: + BlueWildrose: + - admin: Admins now receive messages regarding certain holodeck actions. + Hatterhat: + - bugfix: Free Golem Ship GPSes now start as disabled. Like they were supposed to. + LetterN: + - tweak: No more liver damage when you opt out of "hornychems" + SmArtKar: + - rscadd: Added a new TCG card game + dzahlus: + - rscdel: Removed maroon objective due to toxic gameplay behaviour + shellspeed1: + - bugfix: floor bots place plating before tiles now. + - bugfix: gets rid of another tile duplication issue. + silicons: + - spellcheck: priviledge --> privilege +2021-02-19: + Putnam3145: + - bugfix: Buzz Fuzz's addiction threshold is now a can and a sip as intended. + timothyteakettle: + - admin: staring into pierced realities is now logged +2021-02-20: + Adelphon: + - rscadd: polychromic pants + - tweak: urban coat made polychromic + Chiirno: + - tweak: Synthflesh now unhusks with 100u instead of requiring 101u. + SmArtKar: + - tweak: Added some QoL changes to TCG + - bugfix: Fixed TCG cards not saving + TyrianTyrell: + - bugfix: fixed the signed language so that you can actually use it, and that it's + unusable when it's meant to be. + timothyteakettle: + - bugfix: stops people using Message All on PDAs when their cartridge doesn't allow + it +2021-02-21: + Hatterhat: + - balance: Anomaly announcements and brand intelligence now always announce instead + of having some ham-fisted chance of being a command report. + IronEleven: + - balance: Raises Space Vine Population Requirement from 10 to 20 + MrJWhit: + - tweak: Removes an unnecessary % on the seed extractor. + timothyteakettle: + - bugfix: the query for checking mentors now gets properly deleted + - rscadd: vampires no longer burn in the chapel if they signed up as the chaplain +2021-02-22: + Putnam3145: + - rscadd: (Hexa)crocin + - rscadd: (Hexa)camphor + - rscadd: Nymphomaniac quirk + - admin: All climaxes and arousals are now logged, as well as genital exposure. + SandPoot: + - rscadd: Cyborg tablets and it's special app for self-management. + - bugfix: In the case of a doomsday device being created outside of an AI it will + delete itself. + - imageadd: Some sprites for it have been added and the borg's hud light toggles + been changed to only on-off (made by yours truly) + - refactor: A lot of borg code was changed + - refactor: Tools no longer use istype checks and actually check for their behavior. + Vynzill: + - rscadd: cursed rice hat that's hard to find and obtain, along with a couple other + hats + - rscadd: a replacement toy gun for donksoft lmg + - rscadd: gorillas to the jungle gateway, friendly, even when attacked. + - bugfix: couple mapping errors I noticed, most importantly a missing window in + the chapel. + - balance: shotgun and donksoft lmg removed, captain coat nerfed armor values. + - balance: leaper healthpool from 450 to 550 hopefully making it more of a struggle, + and gives it a name. + - tweak: leaper pit is more wider. The hidden room south is now more obvious to + find + dzahlus: + - rscadd: Added pain emote to getting wounded + - soundadd: added a new pain emote sounds +2021-02-23: + keronshb: + - rscadd: Hyperblade to uplink with poplock + - balance: Removes combination of two Dragon Tooth Swords while keeping it for regular + eutactics. + timothyteakettle: + - bugfix: banning panel prioritises mobs with clients now when trying to find them + if they're in the game +2021-02-24: + SandPoot: + - bugfix: Regular crowbars no longer open powered airlocks. + silicons: + - balance: xeno cube makes hostile xenos now, and drops a sentinel instead of a + drone. diff --git a/html/changelogs/AutoChangeLog-pr-13461.yml b/html/changelogs/AutoChangeLog-pr-13461.yml deleted file mode 100644 index e2397a7aa0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13461.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Detective-Google" -delete-after: True -changes: - - rscadd: "arcade carpet" diff --git a/html/changelogs/AutoChangeLog-pr-13479.yml b/html/changelogs/AutoChangeLog-pr-13479.yml deleted file mode 100644 index fcfe65a47e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13479.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "LetterN" -delete-after: True -changes: - - bugfix: "minimap text" - - code_imp: "ports cinematic upgrades" diff --git a/html/changelogs/AutoChangeLog-pr-13481.yml b/html/changelogs/AutoChangeLog-pr-13481.yml deleted file mode 100644 index f6049c552b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13481.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - bugfix: "the blacksmithing skill now works properly" - - tweak: "Anvils cannot be interacted with with hammers whilst they are already being used" - - tweak: "If someone has no gloves when interacting with heated ingots, they no longer ignore their effects." diff --git a/html/changelogs/AutoChangeLog-pr-13483.yml b/html/changelogs/AutoChangeLog-pr-13483.yml deleted file mode 100644 index 1db9304ffb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13483.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - bugfix: "The Revenant self-revive ability is no longer broken." diff --git a/html/changelogs/AutoChangeLog-pr-13487.yml b/html/changelogs/AutoChangeLog-pr-13487.yml deleted file mode 100644 index 4b0f92adfb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13487.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - bugfix: "People installing KA modkits in miner borgs is no longer broken." diff --git a/html/changelogs/AutoChangeLog-pr-13499.yml b/html/changelogs/AutoChangeLog-pr-13499.yml deleted file mode 100644 index 804fa9fc34..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13499.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "Toilet loot spawners don't lag the server on server start with forced hard dels." diff --git a/html/changelogs/AutoChangeLog-pr-13518.yml b/html/changelogs/AutoChangeLog-pr-13518.yml deleted file mode 100644 index 565754f48b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13518.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheObserver-sys" -delete-after: True -changes: - - bugfix: "Drake? Where's the dead fairygrass sprite?" diff --git a/html/changelogs/AutoChangeLog-pr-14294.yml b/html/changelogs/AutoChangeLog-pr-14294.yml new file mode 100644 index 0000000000..f724b96568 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14294.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Traitor / Ling objective amount should now be correct again." diff --git a/html/changelogs/example.yml b/html/changelogs/example.yml index 48aa13aa11..c44f796755 100644 --- a/html/changelogs/example.yml +++ b/html/changelogs/example.yml @@ -8,16 +8,41 @@ # # Valid Prefixes: # bugfix -# wip (For works in progress) +# - (fixes bugs) +# wip +# - (work in progress) # tweak +# - (tweaks something) # soundadd +# - (adds a sound) # sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) +# - (removes a sound) +# rscdel +# - (adds a feature) +# rscadd +# - (removes a feature) # imageadd +# - (adds an image or sprite) # imagedel -# spellcheck (typo fixes) +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) # experiment +# - (experimental change) +# tgs +# - (TGS change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) ################################# # Your name. diff --git a/html/safe_dial.png b/html/safe_dial.png new file mode 100644 index 0000000000..de24f16b67 Binary files /dev/null and b/html/safe_dial.png differ diff --git a/html/statbrowser.html b/html/statbrowser.html index fbdbb61449..1cb089a189 100644 --- a/html/statbrowser.html +++ b/html/statbrowser.html @@ -7,149 +7,172 @@ @@ -267,9 +290,10 @@ if (window.location) { }); */ // Status panel implementation ------------------------------------------------ -var status_tab_parts = ["loading..."]; +var status_tab_parts = ["Loading..."]; var current_tab = null; -var mc_tab_parts = [["loading...", ""]]; +var mc_tab_parts = [["Loading...", ""]]; +var vote_parts = [[null]]; var href_token = null; var spells = []; var spell_tabs = []; @@ -288,6 +312,8 @@ var statcontentdiv = document.querySelector('#statcontent'); var storedimages = []; function createStatusTab(name) { + if (name.indexOf(".") != -1) + name = name.split(".")[0]; if(document.getElementById(name) || name.trim() == "") return; if(!verb_tabs.includes(name) && !permanent_tabs.includes(name)) @@ -302,12 +328,8 @@ function createStatusTab(name) { B.className = "button"; //ORDERING ALPHABETICALLY B.style.order = name.charCodeAt(0); - if(name == "Status" || name == "MC") { - if(name == "Status") - B.style.order = 1; - else - B.style.order = 2; - } + if(name == "Status" || name == "MC") + B.style.order = name == "Status" ? 1 : 2; //END ORDERING menu.appendChild(B); SendTabToByond(name); @@ -327,6 +349,19 @@ function removeStatusTab(name) { under_menu.style.height = menu.clientHeight + 'px'; } +function sortVerbs() { + verbs.sort(function (a, b) { + var selector = a[0] == b[0] ? 1 : 0; + if (a[selector].toUpperCase() < b[selector].toUpperCase()) { + return 1; + } + else if (a[selector].toUpperCase() > b[selector].toUpperCase()) { + return -1; + } + return 0; + }) +} + window.onresize = function () { under_menu.style.height = menu.clientHeight + 'px'; } @@ -365,20 +400,20 @@ function check_verbs() { for(var v = verb_tabs.length - 1; v >= 0; v--){ verbs_cat_check(verb_tabs[v]); } - //checkStatusTab(); // removes any empty status tabs } function verbs_cat_check(cat) { + var tabCat = cat.indexOf(".") != -1 ? cat.split(".")[0] : cat; var verbs_in_cat = 0; var verbcat = ""; - if(!verb_tabs.includes(cat)){ - removeStatusTab(cat); + if(!verb_tabs.includes(tabCat)){ + removeStatusTab(tabCat); return; } for(var v = 0; v < verbs.length; v++){ var part = verbs[v]; - verbcat = part[0]; - if(verbcat != cat || verbcat.trim() == ""){ + verbcat = part[0].indexOf(".") != -1 ? part[0].split(".")[0] : part[0]; + if(verbcat != tabCat || verbcat.trim() == ""){ continue; } else{ @@ -387,8 +422,8 @@ function verbs_cat_check(cat) { } } if(verbs_in_cat != 1) { - removeStatusTab(cat); - if(current_tab == cat) + removeStatusTab(tabCat); + if(current_tab == tabCat) tab_change("Status"); } } @@ -411,17 +446,20 @@ function add_verb_list(v) { to_add.sort(); // sort what we're adding for(var i = 0; i < to_add.length; i++) { var part = to_add[i]; + if(!part[0]) + continue; + var category = part[0].indexOf(".") == -1 ? part[0] : part[0].split(".")[0]; if(findVerbindex(part[1], verbs)) continue; - if(verb_tabs.includes(part[0])){ + if(verb_tabs.includes(category)){ verbs.push(part); - if(current_tab == part[0]) { - draw_verbs(part[0]); // redraw if we added a verb to the tab we're currently in + if(current_tab == category) { + draw_verbs(category); // redraw if we added a verb to the tab we're currently in } - } else if(part[0]) { - verb_tabs.push(part[0]); + } else if(category) { + verb_tabs.push(category); verbs.push(part); - createStatusTab(part[0]); + createStatusTab(category); } } } @@ -432,7 +470,7 @@ function remove_verb_list(v) { remove_verb(to_remove[i]); } check_verbs(); - verbs.sort(); + sortVerbs(); if(verb_tabs.includes(current_tab)) draw_verbs(current_tab); } @@ -455,7 +493,7 @@ function init_verbs(c, v) { } if(v) { add_verb_list(v); - verbs.sort(); // sort them + sortVerbs(); // sort them if(do_update) { draw_verbs(current_tab); } @@ -491,6 +529,12 @@ function update(global_data, ping_entry, other_entries) { else if(current_tab == "Debug Stat Panel") draw_debug(); } +/// citadel statvoting +function update_voting(vote_data) { + vote_parts = JSON.parse(vote_data); + if(current_tab == "Status") + draw_status(); +} function update_mc(global_mc_data, coords_entry) { mc_tab_parts = JSON.parse(global_mc_data); @@ -586,7 +630,7 @@ function tab_change(tab) { }else if(tab == turfname) { draw_listedturf(); } else { - statcontentdiv[textContentKey] = "loading..."; + statcontentdiv[textContentKey] = "Loading..."; } window.location.href = "byond://winset?statbrowser.is-visible=true"; } @@ -667,6 +711,33 @@ function draw_status() { document.getElementById("statcontent").appendChild(div); } } + //voting shitcode. See mc for more info. + if(vote_parts && vote_parts[0][0]) { //null verification. + var table = document.createElement("table"); + for(var i = 0; i < vote_parts.length; i++) { + var part = vote_parts[i]; + var tr = document.createElement("tr"); + var td1 = document.createElement("td"); + td1[textContentKey] = part[0]; + var td2 = document.createElement("td"); + if(part[2]) { + var a = document.createElement("a"); + if(part[2] === "disabled") { + a.href = "byond://winset?command=Vote"; + } else { + a.href = "?src=" + part[2]; + } + a[textContentKey] = part[1]; + td2.appendChild(a); + } else { + td2[textContentKey] = part[1]; + } + tr.appendChild(td1); + tr.appendChild(td2); + table.appendChild(tr); + } + document.getElementById("statcontent").appendChild(table); + } if(verb_tabs.length == 0 || !verbs) { window.location.href = "byond://winset?command=Fix-Stat-Panel"; @@ -804,7 +875,7 @@ function draw_listedturf() { // rather than every onmousedown getting the "part" of the last entry. return function(e) { e.preventDefault(); - clickcatcher = "?src=" + part[1] + ";statpanel_item_click=1"; + clickcatcher = "?src=_statpanel_;statpanel_item_target=" + part[1] + ";statpanel_item_click=1"; if(e.shiftKey){ clickcatcher += ";statpanel_item_shiftclick=1"; } @@ -841,7 +912,7 @@ function draw_sdql2(){ var td2 = document.createElement("td"); if(part[2]) { var a = document.createElement("a"); - a.href = "?src=" + part[2] + ";statpanel_item_click=1"; + a.href = "?src=" + "_statpanel_" + ";statpanel_item_target=" + part[2] + ";statpanel_item_click=1"; a[textContentKey] = part[1]; td2.appendChild(a); } else { @@ -872,7 +943,7 @@ function draw_tickets() { td2.appendChild(a); } else if(part[3]){ var a = document.createElement("a"); - a.href = "?src=" + part[3] + ";statpanel_item_click=1"; + a.href = "?src=_statpanel_" + ";statpanel_item_target=" + part[3] + ";statpanel_item_click=1"; a[textContentKey] = part[1]; td2.appendChild(a); } else { @@ -912,29 +983,46 @@ function draw_spells(cat) { function draw_verbs(cat){ statcontentdiv[textContentKey] = ""; - var table = document.createElement("newdiv"); + var table = document.createElement("div"); + var additions = {}; // additional sub-categories to be rendered table.className = "grid-container"; - var command = ""; // typecast name to string - verbs.sort(); + sortVerbs(); verbs.reverse(); // sort verbs backwards before we draw - for(var i = verbs.length - 1; i >= 0; i--) { - var part = verbs[i]; // should be a list containing category and command - if(!part[1]) continue; - if(part[0] != cat){ - continue; + for (var i = 0; i < verbs.length; ++i) { + var part = verbs[i]; + var name = part[0]; + var command = part[1]; + + if (command && name.lastIndexOf(cat, 0) != -1 && (name.length == cat.length || name.charAt(cat.length) == ".")) { + var subCat = name.lastIndexOf(".") != -1 ? name.split(".")[1] : null; + if (subCat && !additions[subCat]) { + var newTable = document.createElement("div"); + newTable.className = "grid-container"; + additions[subCat] = newTable; + } + + var a = document.createElement("a"); + a.href = "byond://winset?command=" + command.replace(/\s/g, "-"); + a[textContentKey] = command; + a.className = "grid-item"; + (subCat ? additions[subCat] : table).appendChild(a); + } + } + + // Append base table to view + var content = document.getElementById("statcontent"); + content.appendChild(table); + + // Append additional sub-categories if relevant + for (var cat in additions) { + if (additions.hasOwnProperty(cat)) { + // do addition here + var header = document.createElement("h3"); + header[textContentKey] = cat; + content.appendChild(header); + content.appendChild(additions[cat]); } - if(part[0].trim() == ""){ - verbs.splice(i, 1); - continue; - } - command = part[1]; - var a = document.createElement("a"); - a.href = "byond://winset?command=" + command.replace(/\s/g, "-"); - a[textContentKey] = command; - a.className = "grid-item"; - table.appendChild(a); } - document.getElementById("statcontent").appendChild(table); } function set_theme(which) { diff --git a/icons/effects/footprints.dmi b/icons/effects/footprints.dmi index 69207097c0..3e00a4a080 100644 Binary files a/icons/effects/footprints.dmi and b/icons/effects/footprints.dmi differ diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi index 310dd6709c..d75ae09c97 100644 Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi index 9501dc9216..a33f914885 100644 Binary files a/icons/misc/language.dmi and b/icons/misc/language.dmi differ diff --git a/icons/mob/actions/actions_changeling.dmi b/icons/mob/actions/actions_changeling.dmi index ce6b81e13b..2f384c6119 100644 Binary files a/icons/mob/actions/actions_changeling.dmi and b/icons/mob/actions/actions_changeling.dmi differ diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index d083206454..5e51eedffd 100644 Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ diff --git a/icons/mob/actions/actions_silicon.dmi b/icons/mob/actions/actions_silicon.dmi index cf3d7a2a95..fa7edf111a 100644 Binary files a/icons/mob/actions/actions_silicon.dmi and b/icons/mob/actions/actions_silicon.dmi differ diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi index acf7a31c6e..59840650a5 100644 Binary files a/icons/mob/actions/actions_slime.dmi and b/icons/mob/actions/actions_slime.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 50bf65b27f..68e6170969 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/arachnid_legs.dmi b/icons/mob/arachnid_legs.dmi new file mode 100644 index 0000000000..bdd67a518f Binary files /dev/null and b/icons/mob/arachnid_legs.dmi differ diff --git a/icons/mob/arachnid_mandibles.dmi b/icons/mob/arachnid_mandibles.dmi new file mode 100644 index 0000000000..9369e2d5fa Binary files /dev/null and b/icons/mob/arachnid_mandibles.dmi differ diff --git a/icons/mob/arachnid_parts.dmi b/icons/mob/arachnid_parts.dmi new file mode 100644 index 0000000000..1b70935450 Binary files /dev/null and b/icons/mob/arachnid_parts.dmi differ diff --git a/icons/mob/arachnid_spinneret.dmi b/icons/mob/arachnid_spinneret.dmi new file mode 100644 index 0000000000..688ff90e0d Binary files /dev/null and b/icons/mob/arachnid_spinneret.dmi differ diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi index 743ed03f48..3d1f58743c 100644 Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 8594af8ec2..2afd1b510b 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 4ac82ca299..adcd7b64e1 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/custom_w.dmi b/icons/mob/clothing/custom_w.dmi index 18e07f41ed..5116be4d52 100644 Binary files a/icons/mob/clothing/custom_w.dmi and b/icons/mob/clothing/custom_w.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index 67d1849ef6..d93543805b 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi index f798850ee7..43244e99b9 100644 Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index 44499649f9..406b0fe62a 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 16571a4aa1..23b981031c 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/head_muzzled.dmi b/icons/mob/clothing/head_muzzled.dmi index 62c1ebea0a..e99f1ff6d4 100644 Binary files a/icons/mob/clothing/head_muzzled.dmi and b/icons/mob/clothing/head_muzzled.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index ecc6e2dd2c..7d9433525a 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/mask_muzzled.dmi b/icons/mob/clothing/mask_muzzled.dmi index a1404cfbce..8ca05969bf 100644 Binary files a/icons/mob/clothing/mask_muzzled.dmi and b/icons/mob/clothing/mask_muzzled.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 276b5c9458..3214cc73ba 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index d4bb1224cc..35c1e5fbfb 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/suit_digi.dmi b/icons/mob/clothing/suit_digi.dmi index 8f3c48396a..f80cb4a426 100644 Binary files a/icons/mob/clothing/suit_digi.dmi and b/icons/mob/clothing/suit_digi.dmi differ diff --git a/icons/mob/clothing/taur_canine.dmi b/icons/mob/clothing/taur_canine.dmi index 24cf51d2e5..6155a274f2 100644 Binary files a/icons/mob/clothing/taur_canine.dmi and b/icons/mob/clothing/taur_canine.dmi differ diff --git a/icons/mob/clothing/taur_naga.dmi b/icons/mob/clothing/taur_naga.dmi index d178ba4a1c..3525333fb3 100644 Binary files a/icons/mob/clothing/taur_naga.dmi and b/icons/mob/clothing/taur_naga.dmi differ diff --git a/icons/mob/clothing/underwear.dmi b/icons/mob/clothing/underwear.dmi index 8cf1144a68..71461e21e8 100644 Binary files a/icons/mob/clothing/underwear.dmi and b/icons/mob/clothing/underwear.dmi differ diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi index ffbb8b8b5b..325f04cede 100644 Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi index 43b73f03d0..98ec436b86 100644 Binary files a/icons/mob/clothing/uniform_digi.dmi and b/icons/mob/clothing/uniform_digi.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi new file mode 100644 index 0000000000..4b8dba160a Binary files /dev/null and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/hair.dmi b/icons/mob/hair.dmi new file mode 100644 index 0000000000..6ecaad55a5 Binary files /dev/null and b/icons/mob/hair.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 1e67d7baba..563dd6665c 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index 60978d55a2..34a1ada483 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 794074bfe4..13f66fc2a4 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/icemoon/icemoon_monsters.dmi b/icons/mob/icemoon/icemoon_monsters.dmi index 4f0b5df64a..02b39cc3c7 100644 Binary files a/icons/mob/icemoon/icemoon_monsters.dmi and b/icons/mob/icemoon/icemoon_monsters.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 6dc8d82753..95106e3dbf 100644 Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi index ca87f74a6f..2c1909108b 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/inhands/antag/clockwork_lefthand.dmi b/icons/mob/inhands/antag/clockwork_lefthand.dmi index 080d7fdc83..8945a573a0 100644 Binary files a/icons/mob/inhands/antag/clockwork_lefthand.dmi and b/icons/mob/inhands/antag/clockwork_lefthand.dmi differ diff --git a/icons/mob/inhands/antag/clockwork_righthand.dmi b/icons/mob/inhands/antag/clockwork_righthand.dmi index 42715d6e92..64ee6199a7 100644 Binary files a/icons/mob/inhands/antag/clockwork_righthand.dmi and b/icons/mob/inhands/antag/clockwork_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 0a82845910..6f747f1265 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index abfbb18f84..af14ba7784 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/misc/books_lefthand.dmi b/icons/mob/inhands/misc/books_lefthand.dmi index 71d06d345a..df662a413b 100644 Binary files a/icons/mob/inhands/misc/books_lefthand.dmi and b/icons/mob/inhands/misc/books_lefthand.dmi differ diff --git a/icons/mob/inhands/misc/books_righthand.dmi b/icons/mob/inhands/misc/books_righthand.dmi index 906f47bfe9..afa4a7a5fb 100644 Binary files a/icons/mob/inhands/misc/books_righthand.dmi and b/icons/mob/inhands/misc/books_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi index b753a1f181..2027ee4205 100644 Binary files a/icons/mob/inhands/weapons/hammers_lefthand.dmi and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi index 7650f6c760..7871911d4e 100644 Binary files a/icons/mob/inhands/weapons/hammers_righthand.dmi and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 23d80af9ef..e4f22de1cd 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index 702c0299b5..e5c3c2f5c9 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/mob/lavaland/64x64megafauna.dmi b/icons/mob/lavaland/64x64megafauna.dmi index 1794c789de..997291ec2c 100644 Binary files a/icons/mob/lavaland/64x64megafauna.dmi and b/icons/mob/lavaland/64x64megafauna.dmi differ diff --git a/icons/mob/lavaland/96x96megafauna.dmi b/icons/mob/lavaland/96x96megafauna.dmi index e13419532d..4c19d96f42 100644 Binary files a/icons/mob/lavaland/96x96megafauna.dmi and b/icons/mob/lavaland/96x96megafauna.dmi differ diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi index f8394dd235..30750b216d 100644 Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/lavaland/legion.dmi b/icons/mob/lavaland/legion.dmi index d8d165b79a..c9d58c0a24 100644 Binary files a/icons/mob/lavaland/legion.dmi and b/icons/mob/lavaland/legion.dmi differ diff --git a/icons/mob/lips.dmi b/icons/mob/lips.dmi new file mode 100644 index 0000000000..4c00ac324a Binary files /dev/null and b/icons/mob/lips.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 23f0e2cc13..3d1cbfa273 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 1334ce9e0e..8d34fb8dc3 100644 Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi index cfdd0e549a..e681069131 100644 Binary files a/icons/mob/radial.dmi and b/icons/mob/radial.dmi differ diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi index 4523403344..92de5c150c 100644 Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index 22f3071862..20b919c09e 100644 Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi index 05535334cf..f62dd34c66 100644 Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 13a0725b05..1bd94f2424 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi index 156d4fa0c6..52d9b88dcc 100644 Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index b71b021d80..70f5001c26 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index 510adc97b4..e452ca687b 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index 1c22a0ad1b..5f31a65ffa 100644 Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 1a98872463..48aaa3a418 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index cc5f4f3392..90997bf80a 100644 Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index c0f78ee604..629b989520 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 8fbb2abe1e..9fa3e527ca 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 106195e968..acd64bb424 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index c4c9c94f48..d7e0c9c24b 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index d3e4c0f7e9..aee67da199 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index c12720bc8b..da3dbe6115 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index a566a05591..4ad3d4124f 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index 50f536d1d3..a361d2bf6e 100644 Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ diff --git a/icons/obj/defibrillators.dmi b/icons/obj/defibrillators.dmi new file mode 100644 index 0000000000..f838f40030 Binary files /dev/null and b/icons/obj/defibrillators.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 5a9e1e54b6..34f9867ee9 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/eldritch.dmi b/icons/obj/eldritch.dmi index 294deda628..646b12e734 100644 Binary files a/icons/obj/eldritch.dmi and b/icons/obj/eldritch.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index 7ef3a7d418..c5bf88ab6e 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index 5e1332ffd9..e8bd4790dc 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/food/donut.dmi b/icons/obj/food/donut.dmi index 534e0e37bc..2c418b8e98 100644 Binary files a/icons/obj/food/donut.dmi and b/icons/obj/food/donut.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 078cadfd60..9ccfb9e7f8 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi index ca9c150480..c4d7c184b6 100644 Binary files a/icons/obj/food/soupsalad.dmi and b/icons/obj/food/soupsalad.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 7e7e4a644b..158c95ee5d 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 00670916db..d697c4619d 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index c5aca2394f..978ffbda27 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index cb67f0d6f9..31312ac9a1 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 6e14c4c6ca..7e3b8058b8 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/magic.dmi b/icons/obj/magic.dmi index c376dc7321..6555373ae1 100644 Binary files a/icons/obj/magic.dmi and b/icons/obj/magic.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 400c5bdfa0..ad0b74829f 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index f14f77585b..b9c891ddb9 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 94568b8633..740c64b1dc 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi index a40b9a2b19..19e12dec86 100644 Binary files a/icons/obj/smith.dmi and b/icons/obj/smith.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 1cdb3b6443..3136cf34b2 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 16efcf262e..a4fbe53dba 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/status_display.dmi b/icons/obj/status_display.dmi index 68082395d0..6833e9ff24 100644 Binary files a/icons/obj/status_display.dmi and b/icons/obj/status_display.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 1f1709a10c..b0e542f618 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/supplypods.dmi b/icons/obj/supplypods.dmi index d21da6d53a..68674c4006 100644 Binary files a/icons/obj/supplypods.dmi and b/icons/obj/supplypods.dmi differ diff --git a/icons/obj/supplypods_32x32.dmi b/icons/obj/supplypods_32x32.dmi new file mode 100644 index 0000000000..855132f649 Binary files /dev/null and b/icons/obj/supplypods_32x32.dmi differ diff --git a/icons/obj/tcg/misc.dmi b/icons/obj/tcg/misc.dmi new file mode 100644 index 0000000000..0fc4d3ecce Binary files /dev/null and b/icons/obj/tcg/misc.dmi differ diff --git a/icons/obj/tcg/pack_1.dmi b/icons/obj/tcg/pack_1.dmi new file mode 100644 index 0000000000..1a9952b91b Binary files /dev/null and b/icons/obj/tcg/pack_1.dmi differ diff --git a/icons/obj/tcg/pack_nuclear.dmi b/icons/obj/tcg/pack_nuclear.dmi new file mode 100644 index 0000000000..84f94890ef Binary files /dev/null and b/icons/obj/tcg/pack_nuclear.dmi differ diff --git a/icons/obj/tcg/pack_star.dmi b/icons/obj/tcg/pack_star.dmi new file mode 100644 index 0000000000..273f4c62ef Binary files /dev/null and b/icons/obj/tcg/pack_star.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 0a457777c2..8414c8b95c 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index d8f5c1d334..c70fe9d44e 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/radials/taperecorder.dmi b/icons/radials/taperecorder.dmi new file mode 100644 index 0000000000..6230ab1363 Binary files /dev/null and b/icons/radials/taperecorder.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index f375fea88f..dea6da4254 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -64,7 +64,7 @@ em {font-style: normal; font-weight: bold;} .alert {color: #ff0000;} h1.alert, h2.alert {color: #000000;} -.emote { font-style: italic;} +.emote { } .selecteddna {color: #ffffff; background-color: #001B1B} .attack {color: #ff0000;} @@ -167,6 +167,7 @@ h1.alert, h2.alert {color: #000000;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.spooky {color: #FF9100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 0e971d4ced..0cef4b116f 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -32,82 +32,6 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/status_effect/chem/breast_enlarger - id = "breast_enlarger" - alert_type = null - var/moveCalc = 1 - var/cachedmoveCalc = 1 - var/last_checked_size //used to prevent potential cpu waste from happening every tick. - -/datum/status_effect/chem/breast_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now. - log_reagent("FERMICHEM: [owner]'s breasts has reached comical sizes. ID: [owner.key]") - return ..() - -/datum/status_effect/chem/breast_enlarger/tick()//If you try to wear clothes, you fail. Slows you down if you're comically huge - var/mob/living/carbon/human/H = owner - var/obj/item/organ/genital/breasts/B = H.getorganslot(ORGAN_SLOT_BREASTS) - if(!B) - H.remove_status_effect(src) - return - moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click. - - if(last_checked_size != B.cached_size) - H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy, multiplicative_slowdown = moveCalc) - - if (B.size == "huge") - if(prob(1)) - to_chat(owner, "Your back is feeling sore.") - var/target = H.get_bodypart(BODY_ZONE_CHEST) - H.apply_damage(0.1, BRUTE, target) - else - if(prob(1)) - to_chat(H, "Your back is feeling a little sore.") - last_checked_size = B.cached_size - ..() - -/datum/status_effect/chem/breast_enlarger/on_remove() - log_reagent("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]") - to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.") - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy) - return ..() - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/datum/status_effect/chem/penis_enlarger - id = "penis_enlarger" - alert_type = null - var/bloodCalc - var/moveCalc - var/last_checked_size //used to prevent potential cpu waste, just like the above. - -/datum/status_effect/chem/penis_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now. - log_reagent("FERMICHEM: [owner]'s dick has reached comical sizes. ID: [owner.key]") - return ..() - - -/datum/status_effect/chem/penis_enlarger/tick() - var/mob/living/carbon/human/H = owner - var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) - if(!P) - owner.remove_status_effect(src) - return - moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move - bloodCalc = 1+((round(P.length) - 21)/15) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) - if(P.length < 22 && H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)) - to_chat(owner, "Your rascally willy has become a more managable size, liberating your movements.") - H.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy) - else if(P.length >= 22 && !H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)) - to_chat(H, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") - H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy, multiplicative_slowdown = moveCalc) - H.AdjustBloodVol(bloodCalc) - ..() - -/datum/status_effect/chem/penis_enlarger/on_remove() - log_reagent("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]") - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy) - owner.ResetBloodVol() - return ..() - /////////////////////////////////////////////// // Astral INSURANCE /////////////////////////////////////////////// @@ -576,13 +500,19 @@ else if (lowertext(customTriggers[trigger]) == "shock") if (lewd && ishuman(C)) var/mob/living/carbon/human/H = C - H.adjust_arousal(5) + H.adjust_arousal(5, "MKUltra", aphro = TRUE) C.jitteriness += 100 C.stuttering += 25 C.DefaultCombatKnockdown(60) C.Stun(60) to_chat(owner, "Your muscles seize up, then start spasming wildy!") + else if (lewd && lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + if(ishuman(C)) + var/mob/living/carbon/human/H = C + H.mob_climax(forced_climax=TRUE, cause = "MKUltra") + C.SetStun(10)//We got your stun effects in somewhere, Kev. + //kneel (knockdown) else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose. to_chat(owner, "You drop to the ground unsurreptitiously.") @@ -664,6 +594,15 @@ deltaResist *= 1.25 if (owner.reagents.has_reagent(/datum/reagent/medicine/neurine)) deltaResist *= 1.5 + if (!(owner.client?.prefs.cit_toggles & NO_APHRO) && lewd) + if (owner.reagents.has_reagent(/datum/reagent/drug/anaphrodisiac)) + deltaResist *= 1.5 + if (owner.reagents.has_reagent(/datum/reagent/drug/anaphrodisiacplus)) + deltaResist *= 2 + if (owner.reagents.has_reagent(/datum/reagent/drug/aphrodisiac)) + deltaResist *= 0.75 + if (owner.reagents.has_reagent(/datum/reagent/drug/aphrodisiacplus)) + deltaResist *= 0.5 //Antag resistance //cultists are already brainwashed by their god if(iscultist(owner)) diff --git a/modular_citadel/code/modules/admin/holder2.dm b/modular_citadel/code/modules/admin/holder2.dm index 143000a0d6..e4806781d9 100644 --- a/modular_citadel/code/modules/admin/holder2.dm +++ b/modular_citadel/code/modules/admin/holder2.dm @@ -10,4 +10,4 @@ if(owner) owner.remove_mentor_verbs() owner.mentor_datum = null - ..() \ No newline at end of file + ..() diff --git a/modular_citadel/code/modules/admin/secrets.dm b/modular_citadel/code/modules/admin/secrets.dm index 9fbc8501dd..56a6d316f8 100644 --- a/modular_citadel/code/modules/admin/secrets.dm +++ b/modular_citadel/code/modules/admin/secrets.dm @@ -5,4 +5,4 @@ if(!GLOB.mentorlog.len) dat += "No mentors have done anything this round!" - usr << browse(dat, "window=mentor_log") \ No newline at end of file + usr << browse(dat, "window=mentor_log") diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index bb9162789e..451c920afe 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -287,6 +287,8 @@ slot = SLOT_IN_BACKPACK path = /obj/item/clothing/neck/cloak/polychromic/polyce ckeywhitelist = list("worksbythesea", "blakeryan") + loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#808080", "#8CC6FF", "#FF3535") /datum/gear/donator/ssk name = "Stun Sword Kit" @@ -522,3 +524,28 @@ slot = SLOT_HEAD path = /obj/item/clothing/head/halo ckeywhitelist = list("hisakaki") + +/datum/gear/donator/vest + name = "vest and shirt" + slot = SLOT_W_UNIFORM + path = /obj/item/clothing/under/custom/vest + ckeywhitelist = list("maylowfox") + +/datum/gear/donator/exo + name = "exo frame" + slot = SLOT_WEAR_SUIT + path = /obj/item/clothing/suit/custom/exo + ckeywhitelist = list("jesterz7") + +/datum/gear/donator/choker + name = "NT Choker" + slot = SLOT_NECK + path = /obj/item/clothing/neck/petcollar/choker + ckeywhitelist = list("trigillass") + +/datum/gear/donator/strangemask + name = "Strange Metal Mask" + slot = SLOT_IN_BACKPACK + path = /obj/item/clothing/mask/breath/mmask + ckeywhitelist = list("sneka") + diff --git a/modular_citadel/code/modules/client/loadout/_loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm index 0ebfa060f2..5f895c4805 100644 --- a/modular_citadel/code/modules/client/loadout/_loadout.dm +++ b/modular_citadel/code/modules/client/loadout/_loadout.dm @@ -53,6 +53,8 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids) var/path //item-to-spawn path var/cost = 1 //normally, each loadout costs a single point. var/geargroupID //defines the ID that the gear inherits from the config + var/loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + var/list/loadout_initial_colors = list() //NEW DONATOR SYTSEM STUFF var/donoritem //autoset on new if null diff --git a/modular_citadel/code/modules/client/loadout/hands.dm b/modular_citadel/code/modules/client/loadout/hands.dm index db57fb466b..eb496ed78c 100644 --- a/modular_citadel/code/modules/client/loadout/hands.dm +++ b/modular_citadel/code/modules/client/loadout/hands.dm @@ -12,7 +12,7 @@ /datum/gear/hands/dice name = "Dice bag" - path = /obj/item/storage/box/dice + path = /obj/item/storage/dice /datum/gear/hands/eightball name = "Magic eightball" diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm index fd03e2279f..d1c2c69b99 100644 --- a/modular_citadel/code/modules/client/loadout/head.dm +++ b/modular_citadel/code/modules/client/loadout/head.dm @@ -15,6 +15,18 @@ name = "Black beret" path = /obj/item/clothing/head/beret/black +/datum/gear/head/redberet + name = "Red beret" + path = /obj/item/clothing/head/beret + +/datum/gear/head/purpleberet + name = "Purple beret" + path = /obj/item/clothing/head/beret/purple + +/datum/gear/head/blueberet + name = "Blue beret" + path = /obj/item/clothing/head/beret/blue + /datum/gear/head/flatcap name = "Flat cap" path = /obj/item/clothing/head/flatcap diff --git a/modular_citadel/code/modules/client/loadout/mask.dm b/modular_citadel/code/modules/client/loadout/mask.dm index 0d7e32552e..576b29cddc 100644 --- a/modular_citadel/code/modules/client/loadout/mask.dm +++ b/modular_citadel/code/modules/client/loadout/mask.dm @@ -14,3 +14,20 @@ name = "Joy mask" path = /obj/item/clothing/mask/joy cost = 3 + +/datum/gear/mask/gas + name = "Gas Mask" + path = /obj/item/clothing/mask/gas + cost = 2 + restricted_roles = list("Chief Engineer", "Atmospheric Technician", "Station Engineer") //*shrug + +/datum/gear/mask/sterile + name = "Aesthetic sterile mask" + path = /obj/item/clothing/mask/surgical/aesthetic + cost = 2 + +/datum/gear/mask/paper + name = "Paper mask" + path = /obj/item/clothing/mask/paper + cost = 2 + diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm index c7eff6ce78..7c9bafc86d 100644 --- a/modular_citadel/code/modules/client/loadout/neck.dm +++ b/modular_citadel/code/modules/client/loadout/neck.dm @@ -30,6 +30,10 @@ name = "Choker" path = /obj/item/clothing/neck/petcollar/choker +/datum/gear/neck/cowbell + name = "Cowbell collar" + path = /obj/item/clothing/neck/necklace/cowbell + /datum/gear/neck/scarf name = "White scarf" subcategory = LOADOUT_SUBCATEGORY_NECK_SCARVES @@ -86,7 +90,17 @@ /datum/gear/neck/polycloak name = "Polychromatic Cloak" path = /obj/item/clothing/neck/cloak/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#FFFFFF", "#808080") /datum/gear/neck/altpolycloak name = "Alternate Cloak" path = /obj/item/clothing/neck/cloak/alt/polychromic + loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#676767", "#4C4C4C") + +/datum/gear/neck/cancloak + name = "Canvas Cloak" + path = /obj/item/clothing/neck/cancloak/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#585858", "#373737", "#BEBEBE") diff --git a/modular_citadel/code/modules/client/loadout/shoes.dm b/modular_citadel/code/modules/client/loadout/shoes.dm index 76d7305971..e2b3916ae0 100644 --- a/modular_citadel/code/modules/client/loadout/shoes.dm +++ b/modular_citadel/code/modules/client/loadout/shoes.dm @@ -34,6 +34,12 @@ name = "White shoes" path = /obj/item/clothing/shoes/sneakers/white +/datum/gear/shoes/poly + name = "Polychromic shoes" + path = /obj/item/clothing/shoes/sneakers/poly/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#1D1D1D") + /datum/gear/shoes/gildedcuffs name = "Gilded leg wraps" path= /obj/item/clothing/shoes/wraps diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm index d0be26a8a4..108bcafc19 100644 --- a/modular_citadel/code/modules/client/loadout/suit.dm +++ b/modular_citadel/code/modules/client/loadout/suit.dm @@ -101,6 +101,15 @@ name = "Polychromic winter coat" path = /obj/item/clothing/suit/hooded/wintercoat/polychromic cost = 4 //too many people with neon green coats is hard on the eyes + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#6A6964", "#C4B8A6", "#0000FF") + +/datum/gear/suit/coat/wbreakpoly + name = "Polychromic windbreaker" + path = /obj/item/clothing/suit/toggle/wbreakpoly/polychromic + cost = 4 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#464F65", "#916035", "#474747") /datum/gear/suit/coat/med name = "Medical winter coat" @@ -157,6 +166,13 @@ path = /obj/item/clothing/suit/jacket/miljacket subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS +/datum/gear/suit/urbanjacket + name = "Urban Jacket" + path = /obj/item/clothing/suit/jacket/urbanjacket/polychromic + subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#3B4B2E", "#CBBDAF", "#444444") + /datum/gear/suit/ianshirt name = "Ian Shirt" path = /obj/item/clothing/suit/ianshirt diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index 45d8fc1ef1..1484f257a4 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -32,6 +32,10 @@ name = "Tan suit" path = /obj/item/clothing/under/suit/tan +/datum/gear/uniform/suit/charismatic_suit + name = "Charismatic suit" + path = /obj/item/clothing/under/suit/charismatic_suit + /datum/gear/uniform/suit/white name = "White suit" path = /obj/item/clothing/under/suit/white @@ -44,6 +48,12 @@ name = "Maid costume" path = /obj/item/clothing/under/costume/maid +/datum/gear/uniform/maidcostume/polychromic + name = "Polychromic maid costume" + path = /obj/item/clothing/under/rank/civilian/janitor/maid/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#000000") + /datum/gear/uniform/mailmanuniform name = "Mailman's jumpsuit" path = /obj/item/clothing/under/misc/mailman @@ -160,6 +170,13 @@ name = "Tan Pants" path = /obj/item/clothing/under/pants/tan +/datum/gear/uniform/pants/polypants + name = "Polychromic Pants" + path = /obj/item/clothing/under/pants/polypants/polychromic + cost = 2 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#75634F", "#3D3D3D", "#575757") + /datum/gear/uniform/pants/track name = "Track Pants" path = /obj/item/clothing/under/pants/track @@ -223,36 +240,50 @@ name = "Polychromic Jumpsuit" path = /obj/item/clothing/under/misc/polyjumpsuit cost = 2 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#808080", "#353535") /datum/gear/uniform/skirt/poly name = "Polychromic Jumpskirt" path = /obj/item/clothing/under/dress/skirt/polychromic cost = 2 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#F08080", "#808080") /datum/gear/uniform/suit/poly name = "Polychromic Button-up Shirt" path = /obj/item/clothing/under/misc/poly_shirt cost = 3 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#353535", "#353535") /datum/gear/uniform/skirt/poly/pleated name = "Polychromic Pleated Sweaterskirt" path = /obj/item/clothing/under/dress/skirt/polychromic/pleated cost = 3 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#8CC6FF", "#808080", "#FF3535") /datum/gear/uniform/polykilt name = "Polychromic Kilt" path = /obj/item/clothing/under/costume/kilt/polychromic cost = 3 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#F08080") /datum/gear/uniform/shorts/poly name = "Polychromic Shorts" path = /obj/item/clothing/under/misc/polyshorts cost = 3 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#353535", "#808080", "#808080") /datum/gear/uniform/shorts/poly/athletic name = "Polychromic Athletic Shorts" path = /obj/item/clothing/under/shorts/polychromic cost = 2 + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#FFFFFF", "#F08080") /datum/gear/uniform/hopcasual name = "Casual Head of Personnel's uniform" diff --git a/modular_citadel/code/modules/client/loadout/unlockable.dm b/modular_citadel/code/modules/client/loadout/unlockable.dm new file mode 100644 index 0000000000..67e0c06d8c --- /dev/null +++ b/modular_citadel/code/modules/client/loadout/unlockable.dm @@ -0,0 +1,30 @@ +/datum/gear/unlockable + category = LOADOUT_CATEGORY_UNLOCKABLE + slot = SLOT_NECK + + var/progress_required //what does our progress need to be to unlock it + var/progress_key //what is the key used to retrieve existing progress for this unlockable + +/datum/gear/unlockable/janitor + name = "Janitor Bedsheet" + description = "Clean 100 messes with a mop to unlock this. It has a warning sign on!" + path = /obj/item/bedsheet/unlockable/janitor + + progress_required = 100 + progress_key = "janitor" + +/datum/gear/unlockable/cook + name = "Cook Bedsheet" + description = "Cook 250 items using the microwave to unlock this. It has a microwave on!" + path = /obj/item/bedsheet/unlockable/cook + + progress_required = 250 + progress_key = "cook" + +/datum/gear/unlockable/miner + name = "Miner Bedsheet" + description = "Redeem a total of 100,000 miner points to unlock this. It's made out of goliath hide!" + path = /obj/item/bedsheet/unlockable/miner + + progress_required = 100000 + progress_key = "miner" diff --git a/modular_citadel/code/modules/clothing/suits/suits.dm b/modular_citadel/code/modules/clothing/suits/suits.dm index 25b0c120e5..579476db04 100644 --- a/modular_citadel/code/modules/clothing/suits/suits.dm +++ b/modular_citadel/code/modules/clothing/suits/suits.dm @@ -11,7 +11,7 @@ mob_overlay_icon = 'modular_citadel/icons/mob/citadel/suit.dmi' icon_state = "hostrench" item_state = "hostrench" - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE body_parts_covered = CHEST|ARMS|LEGS /obj/item/clothing/suit/hooded/cloak/david @@ -20,7 +20,7 @@ desc = "Ever wanted to look like a badass without ANY effort? Try this nanotrasen brand red cloak, perfect for kids" hoodtype = /obj/item/clothing/head/hooded/cloakhood/david body_parts_covered = CHEST|GROIN|ARMS - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE /obj/item/clothing/head/hooded/cloakhood/david name = "red cloak hood" diff --git a/modular_citadel/code/modules/clothing/trek.dm b/modular_citadel/code/modules/clothing/trek.dm index f7e8b6778e..dd02a6d0f8 100644 --- a/modular_citadel/code/modules/clothing/trek.dm +++ b/modular_citadel/code/modules/clothing/trek.dm @@ -51,58 +51,58 @@ blood_overlay_type = "coat" body_parts_covered = CHEST|GROIN|ARMS allowed = list( - /obj/item/tank/internals/emergency_oxygen, - /obj/item/flashlight, - /obj/item/analyzer, - /obj/item/radio, - /obj/item/gun, - /obj/item/melee/baton, - /obj/item/restraints/handcuffs, - /obj/item/reagent_containers/hypospray, - /obj/item/hypospray, - /obj/item/healthanalyzer, - /obj/item/reagent_containers/syringe, - /obj/item/reagent_containers/glass/bottle/vial, - /obj/item/reagent_containers/glass/beaker, - /obj/item/storage/pill_bottle, - /obj/item/taperecorder) + /obj/item/tank/internals/emergency_oxygen, + /obj/item/flashlight, + /obj/item/analyzer, + /obj/item/radio, + /obj/item/gun, + /obj/item/melee/baton, + /obj/item/restraints/handcuffs, + /obj/item/reagent_containers/hypospray, + /obj/item/hypospray, + /obj/item/healthanalyzer, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/glass/bottle/vial, + /obj/item/reagent_containers/glass/beaker, + /obj/item/storage/pill_bottle, + /obj/item/taperecorder) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - var/unbuttoned = 0 + var/unbuttoned = FALSE - verb/toggle() - set name = "Toggle coat buttons" - set category = "Object" - set src in usr +/obj/item/clothing/suit/storage/fluff/fedcoat/verb/toggle() + set name = "Toggle coat buttons" + set category = "Object" + set src in usr - var/mob/living/L = usr - if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE)) - return FALSE + var/mob/living/L = usr + if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE)) + return FALSE - switch(unbuttoned) - if(0) - icon_state = "[initial(icon_state)]_open" - item_state = "[initial(item_state)]_open" - unbuttoned = 1 - to_chat(usr,"You unbutton the coat.") - if(1) - icon_state = "[initial(icon_state)]" - item_state = "[initial(item_state)]" - unbuttoned = 0 - to_chat(usr,"You button up the coat.") - usr.update_inv_wear_suit() + switch(unbuttoned) + if(FALSE) + icon_state = "[initial(icon_state)]_open" + item_state = "[initial(item_state)]_open" + unbuttoned = TRUE + to_chat(usr,"You unbutton the coat.") + if(TRUE) + icon_state = "[initial(icon_state)]" + item_state = "[initial(item_state)]" + unbuttoned = FALSE + to_chat(usr,"You button up the coat.") + usr.update_inv_wear_suit() - //Variants +//Variants /obj/item/clothing/suit/storage/fluff/fedcoat/medsci - icon_state = "fedblue" - item_state = "fedblue" + icon_state = "fedblue" + item_state = "fedblue" /obj/item/clothing/suit/storage/fluff/fedcoat/eng - icon_state = "fedeng" - item_state = "fedeng" + icon_state = "fedeng" + item_state = "fedeng" /obj/item/clothing/suit/storage/fluff/fedcoat/capt - icon_state = "fedcapt" - item_state = "fedcapt" + icon_state = "fedcapt" + item_state = "fedcapt" //"modern" ones for fancy @@ -124,18 +124,18 @@ ) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - //Variants +//Variants /obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci - icon_state = "fedmodernblue" - item_state = "fedmodernblue" + icon_state = "fedmodernblue" + item_state = "fedmodernblue" /obj/item/clothing/suit/storage/fluff/modernfedcoat/eng - icon_state = "fedmoderneng" - item_state = "fedmoderneng" + icon_state = "fedmoderneng" + item_state = "fedmoderneng" /obj/item/clothing/suit/storage/fluff/modernfedcoat/sec - icon_state = "fedmodernsec" - item_state = "fedmodernsec" + icon_state = "fedmodernsec" + item_state = "fedmodernsec" /obj/item/clothing/head/caphat/formal/fedcover name = "Federation Officer's Cap" @@ -146,22 +146,22 @@ mob_overlay_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' item_state = "fedcapofficer" - //Variants +//Variants /obj/item/clothing/head/caphat/formal/fedcover/medsci - icon_state = "fedcapsci" - item_state = "fedcapsci" + icon_state = "fedcapsci" + item_state = "fedcapsci" /obj/item/clothing/head/caphat/formal/fedcover/eng - icon_state = "fedcapeng" - item_state = "fedcapeng" + icon_state = "fedcapeng" + item_state = "fedcapeng" /obj/item/clothing/head/caphat/formal/fedcover/sec - icon_state = "fedcapsec" - item_state = "fedcapsec" + icon_state = "fedcapsec" + item_state = "fedcapsec" /obj/item/clothing/head/caphat/formal/fedcover/black - icon_state = "fedcapblack" - item_state = "fedcapblack" + icon_state = "fedcapblack" + item_state = "fedcapblack" //orvilike caps /obj/item/clothing/head/kepi/orvi diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index bc9f8bce49..1424b564fd 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -567,4 +567,37 @@ icon = 'icons/mob/clothing/custom_w.dmi' mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' dynamic_hair_suffix = "" - + +/obj/item/clothing/under/custom/vest + name = "vest" + desc = "A vest with a shirt underlining it." + icon_state = "vest" + item_state = "vest" + icon = 'icons/obj/custom.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' + mutantrace_variation = STYLE_DIGITIGRADE + +/obj/item/clothing/suit/custom/exo + name = "Full ExoFrame" + desc = "A suit specially designed for those who live and breath hardware with custom tooled robotic manipulators for working with precision even on the most hazardous of jobs." + icon_state = "frame" + item_state = "frame" + icon = 'icons/obj/custom.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' + mutantrace_variation = NONE + +/obj/item/clothing/neck/petcollar/choker + name = "NT Choker" + desc = "NT property since January 21st, 2562." + icon = 'icons/obj/custom.dmi' + icon_state = "choker" + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' + item_state = "choker" + +/obj/item/clothing/mask/breath/mmask + name = "Strange Metal Mask" + desc = "An odd metal mask." + icon = 'icons/obj/custom.dmi' + item_state = "mmask" + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' + icon_state = "mmask" diff --git a/modular_citadel/code/modules/mentor/mentor.dm b/modular_citadel/code/modules/mentor/mentor.dm index 79345e6478..0ff88d8812 100644 --- a/modular_citadel/code/modules/mentor/mentor.dm +++ b/modular_citadel/code/modules/mentor/mentor.dm @@ -80,10 +80,12 @@ GLOBAL_PROTECT(mentor_href_token) return var/datum/DBQuery/query_load_mentors = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor")]") if(!query_load_mentors.Execute()) + qdel(query_load_mentors) return while(query_load_mentors.NextRow()) var/ckey = ckey(query_load_mentors.item[1]) new /datum/mentors(ckey) + qdel(query_load_mentors) // new client var: mentor_datum. Acts the same way holder does towards admin: it holds the mentor datum. if set, the guy's a mentor. /client diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm index 28c3f7ea99..a9334ca923 100644 --- a/modular_citadel/code/modules/mob/cit_emotes.dm +++ b/modular_citadel/code/modules/mob/cit_emotes.dm @@ -132,6 +132,54 @@ user.nextsoundemote = world.time + 7 playsound(user, 'modular_citadel/sound/voice/awoo.ogg', 50, 1, -1) +/datum/emote/living/hiss + key = "hiss" + key_third_person = "hisses" + message = "hisses!" + emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + +/datum/emote/living/hiss/run_emote(mob/living/user, params) + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/hiss.ogg', 50, 1, -1) + +/datum/emote/living/meow + key = "meow" + key_third_person = "mrowls" + message = "mrowls!" + emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + +/datum/emote/living/meow/run_emote(mob/living/user, params) + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/meow1.ogg', 50, 1, -1) + +/datum/emote/living/purr + key = "purr" + key_third_person = "purrs softly" + message = "purrs softly." + emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + +/datum/emote/living/purr/run_emote(mob/living/user, params) + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/purr.ogg', 50, 1, -1) + /datum/emote/living/nya key = "nya" key_third_person = "lets out a nya" @@ -252,3 +300,24 @@ user.nextsoundemote = world.time + 7 var/sound = pick('sound/voice/slime_squish.ogg') playsound(user, sound, 50, 1, -1) + +/datum/emote/living/pain + key = "pain" + key_third_person = "cries out in pain!" + message = "cries out in pain!" + emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + +/datum/emote/living/pain/run_emote(mob/living/user, params) + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + var/sound + if(user.gender == MALE) + sound = pick('modular_citadel/sound/voice/human_male_pain_1.ogg', 'modular_citadel/sound/voice/human_male_pain_2.ogg', 'modular_citadel/sound/voice/human_male_pain_3.ogg', 'modular_citadel/sound/voice/human_male_pain_rare.ogg', 'modular_citadel/sound/voice/human_male_scream_1.ogg', 'modular_citadel/sound/voice/human_male_scream_2.ogg', 'modular_citadel/sound/voice/human_male_scream_3.ogg', 'modular_citadel/sound/voice/human_male_scream_4.ogg') + else + sound = pick('modular_citadel/sound/voice/human_female_pain_1.ogg', 'modular_citadel/sound/voice/human_female_pain_2.ogg', 'modular_citadel/sound/voice/human_female_pain_3.ogg', 'modular_citadel/sound/voice/human_female_scream_2.ogg', 'modular_citadel/sound/voice/human_female_scream_3.ogg', 'modular_citadel/sound/voice/human_female_scream_4.ogg') + playsound(user, sound, 50, 0, 0) diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm index 17c3f17ad8..0457b853b7 100644 --- a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm +++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm @@ -1,16 +1,3 @@ -/mob/living/carbon/adjustStaminaLossBuffered(amount, updating_health = 1) - if(status_flags & GODMODE) - return 0 - if(CONFIG_GET(flag/disable_stambuffer)) - return - var/directstamloss = (bufferedstam + amount) - stambuffer - if(directstamloss > 0) - adjustStaminaLoss(directstamloss) - bufferedstam = clamp(bufferedstam + amount, 0, stambuffer) - stambufferregentime = world.time + 10 - if(updating_health) - update_health_hud() - /mob/living/carbon/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE, affected_zone = BODY_ZONE_CHEST) if(!forced && (status_flags & GODMODE)) return FALSE diff --git a/modular_citadel/code/modules/mob/living/carbon/reindex_screams.dm b/modular_citadel/code/modules/mob/living/carbon/reindex_screams.dm index 7f5d625f62..a2083a28ee 100644 --- a/modular_citadel/code/modules/mob/living/carbon/reindex_screams.dm +++ b/modular_citadel/code/modules/mob/living/carbon/reindex_screams.dm @@ -42,4 +42,4 @@ /mob/living/proc/clear_screams() LAZYINITLIST(alternate_screams) - LAZYCLEARLIST(alternate_screams) \ No newline at end of file + LAZYCLEARLIST(alternate_screams) diff --git a/modular_citadel/code/modules/mob/living/damage_procs.dm b/modular_citadel/code/modules/mob/living/damage_procs.dm deleted file mode 100644 index a399c17c71..0000000000 --- a/modular_citadel/code/modules/mob/living/damage_procs.dm +++ /dev/null @@ -1,2 +0,0 @@ -/mob/living/proc/adjustStaminaLossBuffered(amount, updating_health = TRUE, forced = FALSE) - return diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm index 01867e9dcc..b5be028607 100644 --- a/modular_citadel/code/modules/mob/living/living.dm +++ b/modular_citadel/code/modules/mob/living/living.dm @@ -1,5 +1,3 @@ -/mob/living - /atom var/pseudo_z_axis @@ -24,26 +22,3 @@ if(.) pseudo_z_axis = newloc.get_fake_z() pixel_z = pseudo_z_axis - -/mob/living/carbon/update_stamina() - var/total_health = getStaminaLoss() - if(total_health >= STAMINA_SOFTCRIT) - if(!(combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)) - ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SOFT_STAMCRIT) - else - if(combat_flags & COMBAT_FLAG_SOFT_STAMCRIT) - DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SOFT_STAMCRIT) - if(total_health) - if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health >= STAMINA_CRIT && !stat) - to_chat(src, "You're too exhausted to keep going...") - set_resting(TRUE, FALSE, FALSE) - SEND_SIGNAL(src, COMSIG_DISABLE_COMBAT_MODE) - ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT) - filters += CIT_FILTER_STAMINACRIT - update_mobility() - if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health <= STAMINA_SOFTCRIT) - to_chat(src, "You don't feel nearly as exhausted anymore.") - DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT | COMBAT_FLAG_SOFT_STAMCRIT) - filters -= CIT_FILTER_STAMINACRIT - update_mobility() - update_health_hud() diff --git a/modular_citadel/code/modules/projectiles/boxes_magazines/external/smg/smg.dm b/modular_citadel/code/modules/projectiles/boxes_magazines/external/smg/smg.dm index fb385234bd..1633c3690f 100644 --- a/modular_citadel/code/modules/projectiles/boxes_magazines/external/smg/smg.dm +++ b/modular_citadel/code/modules/projectiles/boxes_magazines/external/smg/smg.dm @@ -1,3 +1,3 @@ /obj/item/ammo_box/magazine/wt550m9/wttx name = "wt550 magazine (Toxin Tipped 4.6x30mm)" - ammo_type = /obj/item/ammo_casing/c46x30mm/tx \ No newline at end of file + ammo_type = /obj/item/ammo_casing/c46x30mm/tx diff --git a/modular_citadel/code/modules/projectiles/bullets/bullets/smg.dm b/modular_citadel/code/modules/projectiles/bullets/bullets/smg.dm index 75151417d7..3618052704 100644 --- a/modular_citadel/code/modules/projectiles/bullets/bullets/smg.dm +++ b/modular_citadel/code/modules/projectiles/bullets/bullets/smg.dm @@ -1,4 +1,4 @@ /obj/item/projectile/bullet/c46x30mm_tx name = "toxin tipped 4.6x30mm bullet" damage = 10 - damage_type = TOX \ No newline at end of file + damage_type = TOX diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm index c2bf251de9..5a3f149dbb 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm @@ -9,7 +9,7 @@ item_state = "arg" slot_flags = 0 mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG - fire_sound = 'sound/weapons/gunshot_smg.ogg' + fire_sound = 'sound/weapons/rifleshot.ogg' can_suppress = 0 burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. fire_delay = 1 @@ -85,23 +85,20 @@ ///projectiles/// -/obj/item/projectile/bullet/cflechetteap //shreds armor +/obj/item/projectile/bullet/cflechetteap //shreds armor but no wounds name = "flechette (armor piercing)" - damage = 8 - armour_penetration = 80 + damage = 15 + armour_penetration = 100 + wound_bonus = -100 -/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding +/obj/item/projectile/bullet/cflechettes //causes wounds fast but is heavily countered by armor name = "flechette (serrated)" damage = 15 dismemberment = 10 - armour_penetration = -80 - -/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && iscarbon(target)) - var/mob/living/carbon/C = target - C.bleed(10) - return ..() - + wound_bonus = 15 + sharpness = SHARP_EDGED + wound_falloff_tile = 0 + ///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)/// /obj/item/ammo_casing/caseless/flechetteap @@ -148,7 +145,7 @@ slot_flags = 0 pin = /obj/item/firing_pin/implant/pindicate mag_type = /obj/item/ammo_box/magazine/flechette - fire_sound = 'sound/weapons/gunshot_smg.ogg' + fire_sound = 'sound/weapons/rifleshot.ogg' can_suppress = 0 burst_size = 5 fire_delay = 1 @@ -168,15 +165,19 @@ ///unique variant/// -/obj/item/projectile/bullet/cflechetteshredder +/obj/item/projectile/bullet/cflechetteshredder //you only get this with a 30TC bundle,5 magazines, as such this should be the superior ammotype name = "flechette (shredder)" - damage = 5 - dismemberment = 40 + damage = 10 + dismemberment = 50 + wound_bonus = 50 + armour_penetration = 100 + sharpness = SHARP_EDGED + wound_falloff_tile = 0 /obj/item/ammo_casing/caseless/flechetteshredder name = "flechette (shredder)" desc = "A serrated flechette made of a special alloy that forms a monofilament edge." - projectile_type = /obj/item/projectile/bullet/cflechettes + projectile_type = /obj/item/projectile/bullet/cflechetteshredder /obj/item/ammo_box/magazine/flechette/shredder name = "flechette magazine (shredder)" @@ -185,7 +186,7 @@ /obj/item/gun/ballistic/automatic/flechette/shredder name = "\improper CX Shredder" - desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes." + desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofilament flechettes." w_class = WEIGHT_CLASS_SMALL spread = 15 recoil = 0.1 diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm index c4cf8fc00f..cf37674278 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm @@ -64,4 +64,4 @@ icon_state = "spinfusorbox" ammo_type = /obj/item/ammo_casing/caseless/spinfusor w_class = WEIGHT_CLASS_NORMAL - max_ammo = 4 \ No newline at end of file + max_ammo = 4 diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm index 65609f5830..9a8ee4bab1 100644 --- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm @@ -2,7 +2,7 @@ The Recolourable Energy Gun *////////////////////////////////////////////////////////////////////////////////////////////// -obj/item/gun/energy/e_gun/cx +/obj/item/gun/energy/e_gun/cx name = "\improper CX Model D Energy Gun" desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating." icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' @@ -14,18 +14,18 @@ obj/item/gun/energy/e_gun/cx flight_y_offset = 10 var/body_color = "#252528" -obj/item/gun/energy/e_gun/cx/ComponentInitialize() +/obj/item/gun/energy/e_gun/cx/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_updates_onmob) -obj/item/gun/energy/e_gun/cx/update_overlays() +/obj/item/gun/energy/e_gun/cx/update_overlays() . = ..() var/mutable_appearance/body_overlay = mutable_appearance('modular_citadel/icons/obj/guns/cit_guns.dmi', "cxegun_body") if(body_color) body_overlay.color = body_color . += body_overlay -obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) +/obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) . = ..() if(!in_range(src, user)) //Basic checks to prevent abuse return @@ -39,7 +39,7 @@ obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) update_icon() -obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) +/obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(isinhands) var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 7403de6215..9870a2cd36 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -30,7 +30,6 @@ inverse_chem = /datum/reagent/fermi/BEsmaller //At really impure vols, it just becomes 100% inverse can_synth = FALSE value = REAGENT_VALUE_VERY_RARE - var/message_spam = FALSE /datum/reagent/fermi/breast_enlarger/on_mob_metabolize(mob/living/M) . = ..() @@ -55,13 +54,8 @@ return..() var/mob/living/carbon/human/H = M - //If they've opted out, then route processing though liver. + //If they've opted out, ignore and return early. if(!(H.client?.prefs.cit_toggles & BREAST_ENLARGEMENT)) - var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.applyOrganDamage(0.25) - else - H.adjustToxLoss(1) return..() var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) //otherwise proceed as normal @@ -81,23 +75,11 @@ H.reagents.remove_reagent(type, 5) B.Insert(H) - //If they have them, increase size. If size is comically big, limit movement and rip clothes. B.modify_size(0.05) - - if (ISINRANGE_EX(B.cached_size, 8.5, 9) && (H.w_uniform || H.wear_suit)) - var/target = H.get_bodypart(BODY_ZONE_CHEST) - if(!message_spam) - to_chat(H, "Your breasts begin to strain against your clothes tightly!") - message_spam = TRUE - H.adjustOxyLoss(5, 0) - H.apply_damage(1, BRUTE, target) return ..() /datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. if(!(M.client?.prefs.cit_toggles & FORCED_FEM)) - var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.applyOrganDamage(0.25) return ..() var/obj/item/organ/genital/penis/P = M.getorganslot(ORGAN_SLOT_PENIS) @@ -132,9 +114,6 @@ /datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) if(!(M.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) || !B) - var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.applyOrganDamage(-0.25) return ..() B.modify_size(-0.05) return ..() @@ -189,7 +168,6 @@ inverse_chem = /datum/reagent/fermi/PEsmaller //At really impure vols, it just becomes 100% inverse and shrinks instead. can_synth = FALSE value = REAGENT_VALUE_VERY_RARE - var/message_spam = FALSE /datum/reagent/fermi/penis_enlarger/on_mob_metabolize(mob/living/M) . = ..() @@ -214,11 +192,6 @@ return ..() var/mob/living/carbon/human/H = M if(!(H.client?.prefs.cit_toggles & PENIS_ENLARGEMENT)) - var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.applyOrganDamage(0.25) - else - H.adjustToxLoss(1) return ..() var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) //otherwise proceed as normal @@ -232,22 +205,13 @@ P.Insert(H) P.modify_size(0.1) - if (ISINRANGE_EX(P.length, 20.5, 21) && (H.w_uniform || H.wear_suit)) - var/target = H.get_bodypart(BODY_ZONE_CHEST) - if(!message_spam) - to_chat(H, "Your cock begin to strain against your clothes tightly!") - message_spam = TRUE - H.apply_damage(2.5, BRUTE, target) - return ..() /datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/human/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. if(!istype(M)) return ..() + // let's not kill them if they didn't consent. if(!(M.client?.prefs.cit_toggles & FORCED_MASC)) - var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.applyOrganDamage(0.25) return..() var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) @@ -284,9 +248,6 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) if(!(H.client?.prefs.cit_toggles & PENIS_ENLARGEMENT) || !P) - var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.applyOrganDamage(-0.25) return..() P.modify_size(-0.1) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3ad24ba399..c6fae2ff8f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -210,11 +210,12 @@ var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites) if(isnull(N)) return ..() - N.nanite_volume += -cached_purity*5//0.5 seems to be the default to me, so it'll neuter them. + if(HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM)) + C.adjustToxLoss(1, toxins_type = TOX_SYSCORRUPT) //Interferes with robots. Rare chem, so, pretty good at that too. + N.adjust_nanites(-cached_purity*5) //0.5 seems to be the default to me, so it'll neuter them. ..() /datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C) - //var/component/nanites/N = M.GetComponent(/datum/component/nanites) var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites) if(prob(5)) to_chat(C, "The residual voltage from the nanites causes you to seize up!") @@ -225,10 +226,10 @@ to_chat(C, "You feel a strange tingling sensation come from your core.") if(isnull(N)) return ..() - N.nanite_volume += -10*cached_purity + N.adjust_nanites(-10*cached_purity) ..() -datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) +/datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) for(var/active_obj in react_objs) if(O == active_obj) return @@ -333,39 +334,75 @@ datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) holder.clear_reagents() /datum/reagent/fermi/acidic_buffer - name = "Acidic buffer" + name = "Strong acidic buffer" description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another." color = "#fbc314" pH = 0 + chemical_flags = REAGENT_FORCEONNEW can_synth = TRUE + var/strength = 1.5 //Consumes self on addition and shifts pH /datum/reagent/fermi/acidic_buffer/on_new(datapH) + if(!holder) + return ..() + if(holder.reagents_holder_flags & NO_REACT) + return..() if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return ..() data = datapH if(LAZYLEN(holder.reagent_list) == 1) return ..() - holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) + if(holder.pH < pH) + holder.my_atom.visible_message("The beaker fizzes as the buffer is added, to no effect.") + playsound(holder.my_atom, 'sound/FermiChem/bufferadd.ogg', 50, 1) + return ..() + holder.pH = clamp((((holder.pH * (holder.total_volume-(volume*strength)))+(pH * (volume*strength)) )/holder.total_volume), 0, 14) //This is BEFORE removal holder.my_atom.visible_message("The beaker fizzes as the pH changes!") playsound(holder.my_atom, 'sound/FermiChem/bufferadd.ogg', 50, 1) holder.remove_reagent(type, volume, ignore_pH = TRUE) ..() +/datum/reagent/fermi/acidic_buffer/weak + name = "Acidic buffer" + description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another." + color = "#fbf344" + pH = 4 + can_synth = TRUE + strength = 0.25 + /datum/reagent/fermi/basic_buffer - name = "Basic buffer" + name = "Strong basic buffer" description = "This reagent will consume itself and move the pH of a beaker towards alkalinity when added to another." color = "#3853a4" pH = 14 + chemical_flags = REAGENT_FORCEONNEW can_synth = TRUE + var/strength = 1.5 + +/datum/reagent/fermi/basic_buffer/weak + name = "Basic buffer" + description = "This reagent will consume itself and move the pH of a beaker towards alkalinity when added to another." + color = "#5873c4" + pH = 10 + can_synth = TRUE + strength = 0.25 /datum/reagent/fermi/basic_buffer/on_new(datapH) + if(!holder) + return ..() + if(holder.reagents_holder_flags & NO_REACT) + return..() if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return ..() data = datapH if(LAZYLEN(holder.reagent_list) == 1) return ..() - holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) + if(holder.pH > pH) + holder.my_atom.visible_message("The beaker froths as the buffer is added, to no effect.") + playsound(holder.my_atom, 'sound/FermiChem/bufferadd.ogg', 50, 1) + return ..() + holder.pH = clamp((((holder.pH * (holder.total_volume-(volume*strength)))+(pH * (volume*strength)) )/holder.total_volume), 0, 14) //This is BEFORE removal holder.my_atom.visible_message("The beaker froths as the pH changes!") playsound(holder.my_atom, 'sound/FermiChem/bufferadd.ogg', 50, 1) holder.remove_reagent(type, volume, ignore_pH = TRUE) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index a6a9d7a85f..de27723508 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -200,22 +200,23 @@ /datum/reagent/fermi/zeolites name = "Artificial Zeolites" - description = "Lab made Zeolite, used to clear radiation from people and items alike! Splashing just a small amount(5u) onto any item can clear away large amounts of contamination." + description = "Lab made Zeolite, used to clear radiation from people and items alike! Splashing just a small amount(5u) onto any item can clear away large amounts of contamination, as long as its purity is at least 0.7." pH = 8 color = "#FFDADA" - metabolization_rate = 8 * REAGENTS_METABOLISM //Metabolizes fast but heals a lot! - value = REAGENT_VALUE_COMMON + metabolization_rate = 8 * REAGENTS_METABOLISM //Metabolizes fast but heals a lot! Lasts far longer if more pure. + value = REAGENT_VALUE_RARE //Relatively hard to make now, might be fine with VERY_RARE instead depending on feedback. /datum/reagent/fermi/zeolites/on_mob_life(mob/living/carbon/M) + metabolization_rate = (4 / purity) * REAGENTS_METABOLISM //Metab rate directly influenced by purity. Linear. var/datum/component/radioactive/contamination = M.GetComponent(/datum/component/radioactive) - if(M.radiation > 0) - M.radiation -= min(M.radiation, 60) + if(M.radiation > 0) //hey so apparently pentetic literally purges 1/50 (2%) of the rad amount on someone per tick no matter the 'true' amount, sooo uhh time to tweak this some more.. + M.radiation -= clamp(round((M.radiation / 150) * (25 ** purity), 0.1), 0, M.radiation) //Purges between ~3% and ~16% of total rad amount, per tick, depending on purity. Exponential. if(contamination && contamination.strength > 0) - contamination.strength -= min(contamination.strength, 100) + contamination.strength -= min(contamination.strength, round(25 ** (0.5 + purity), 0.1)) //25 per tick at minimum purity; Tops out at ~125 per tick if purity is 1. Exponential. ..() /datum/reagent/fermi/zeolites/reaction_obj(obj/O, reac_volume) var/datum/component/radioactive/contamination = O.GetComponent(/datum/component/radioactive) - if(contamination && reac_volume >= 5) + if(contamination && reac_volume >= 5 && purity >= 0.7) //you need at least 0.7 purity to instantly purge all contam on an object. qdel(contamination) return diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index da9fd34cd6..ab39e6f4a7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -93,9 +93,8 @@ e.set_up(round((volume/28)*(pH-9)), T, 0, 0) e.start() - if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less) - ImpureTot *= volume - empulse(T, volume, 1) + if(ImpureTot) //If impure, v.small emp (0.6 or less) + empulse(T, ImpureTot, 1) my_atom.reagents.clear_reagents() //just in case return @@ -177,7 +176,7 @@ name = "Sucubus milk" id = /datum/reagent/fermi/breast_enlarger results = list(/datum/reagent/fermi/breast_enlarger = 8) - required_reagents = list(/datum/reagent/medicine/salglu_solution = 2, /datum/reagent/consumable/milk = 1, /datum/reagent/medicine/synthflesh = 2, /datum/reagent/silicon = 5) + required_reagents = list(/datum/reagent/medicine/salglu_solution = 1, /datum/reagent/consumable/milk = 1, /datum/reagent/medicine/synthflesh = 2, /datum/reagent/silicon = 3, /datum/reagent/drug/aphrodisiac = 3) mix_message = "the reaction gives off a mist of milk." //FermiChem vars: OptimalTempMin = 200 @@ -217,7 +216,7 @@ name = "Incubus draft" id = /datum/reagent/fermi/penis_enlarger results = list(/datum/reagent/fermi/penis_enlarger = 8) - required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/medicine/synthflesh = 2, /datum/reagent/carbon = 5, /datum/reagent/medicine/salglu_solution = 2) + required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/medicine/synthflesh = 2, /datum/reagent/carbon = 2, /datum/reagent/drug/aphrodisiac = 2, /datum/reagent/medicine/salglu_solution = 1) mix_message = "the reaction gives off a spicy mist." //FermiChem vars: OptimalTempMin = 200 @@ -384,7 +383,7 @@ name = "Furranium" id = /datum/reagent/fermi/furranium results = list(/datum/reagent/fermi/furranium = 5) - required_reagents = list(/datum/reagent/pax/catnip = 1, /datum/reagent/silver = 2, /datum/reagent/medicine/salglu_solution = 2) + required_reagents = list(/datum/reagent/drug/aphrodisiac = 1, /datum/reagent/moonsugar = 1, /datum/reagent/silver = 2, /datum/reagent/medicine/salglu_solution = 1) mix_message = "You think you can hear a howl come from the beaker." //FermiChem vars: OptimalTempMin = 350 @@ -405,6 +404,10 @@ //FOR INSTANT REACTIONS - DO NOT MULTIPLY LIMIT BY 10. //There's a weird rounding error or something ugh. +/datum/chemical_reaction/fermi/furranium/organic + id = "furranium_organic" + required_reagents = list(/datum/reagent/drug/aphrodisiac = 1, /datum/reagent/pax/catnip = 1, /datum/reagent/silver = 2, /datum/reagent/medicine/salglu_solution = 1) + //Nano-b-gone /datum/chemical_reaction/fermi/nanite_b_gone//done test name = "Naninte bain" @@ -591,19 +594,20 @@ /datum/chemical_reaction/fermi/zeolites name = "Zeolites" id = /datum/reagent/fermi/zeolites - results = list(/datum/reagent/fermi/zeolites = 5) //We make a lot! + results = list(/datum/reagent/fermi/zeolites = 5) //We make a lot! - But it's now somewhat dangerous, and needs a bit of gold to catalyze the reaction required_reagents = list(/datum/reagent/medicine/potass_iodide = 1, /datum/reagent/aluminium = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) //FermiChem vars: - OptimalTempMin = 300 - OptimalTempMax = 900 - ExplodeTemp = 1000 //check to see overflow doesn't happen! - OptimalpHMin = 4.0 - OptimalpHMax = 6.0 - ReactpHLim = 4 + OptimalTempMin = 500 + OptimalTempMax = 750 + ExplodeTemp = 850 + OptimalpHMin = 4.8 + OptimalpHMax = 7 + ReactpHLim = 5 //CatalystFact = 0 - CurveSharpT = 4 - CurveSharppH = 0 - ThermicConstant = 0 - HIonRelease = 0.01 - RateUpLim = 15 + CurveSharpT = 1.5 + CurveSharppH = 3 + ThermicConstant = 1 + HIonRelease = -0.15 + RateUpLim = 4 + PurityMin = 0.5 //Good luck! FermiChem = TRUE diff --git a/modular_citadel/icons/mob/mam_snouts.dmi b/modular_citadel/icons/mob/mam_snouts.dmi index 4f6682f789..e838e97f68 100644 Binary files a/modular_citadel/icons/mob/mam_snouts.dmi and b/modular_citadel/icons/mob/mam_snouts.dmi differ diff --git a/modular_citadel/icons/ui/screen_clockwork.dmi b/modular_citadel/icons/ui/screen_clockwork.dmi index 3a7ba8338f..82fd91026b 100644 Binary files a/modular_citadel/icons/ui/screen_clockwork.dmi and b/modular_citadel/icons/ui/screen_clockwork.dmi differ diff --git a/modular_citadel/icons/ui/screen_gen.dmi b/modular_citadel/icons/ui/screen_gen.dmi index d006185a3c..510d312f1c 100644 Binary files a/modular_citadel/icons/ui/screen_gen.dmi and b/modular_citadel/icons/ui/screen_gen.dmi differ diff --git a/modular_citadel/icons/ui/screen_midnight.dmi b/modular_citadel/icons/ui/screen_midnight.dmi index fc446a411c..8990650347 100644 Binary files a/modular_citadel/icons/ui/screen_midnight.dmi and b/modular_citadel/icons/ui/screen_midnight.dmi differ diff --git a/modular_citadel/icons/ui/screen_operative.dmi b/modular_citadel/icons/ui/screen_operative.dmi index 9383b94718..9a784fb14a 100644 Binary files a/modular_citadel/icons/ui/screen_operative.dmi and b/modular_citadel/icons/ui/screen_operative.dmi differ diff --git a/modular_citadel/icons/ui/screen_plasmafire.dmi b/modular_citadel/icons/ui/screen_plasmafire.dmi index 97e577c7bd..9a546cad6e 100644 Binary files a/modular_citadel/icons/ui/screen_plasmafire.dmi and b/modular_citadel/icons/ui/screen_plasmafire.dmi differ diff --git a/modular_citadel/icons/ui/screen_slimecore.dmi b/modular_citadel/icons/ui/screen_slimecore.dmi index 8f45ff3f76..22f97207df 100644 Binary files a/modular_citadel/icons/ui/screen_slimecore.dmi and b/modular_citadel/icons/ui/screen_slimecore.dmi differ diff --git a/modular_citadel/sound/voice/hiss.ogg b/modular_citadel/sound/voice/hiss.ogg index cd9fa22c37..3508f47f13 100644 Binary files a/modular_citadel/sound/voice/hiss.ogg and b/modular_citadel/sound/voice/hiss.ogg differ diff --git a/modular_citadel/sound/voice/human_female_pain_1.ogg b/modular_citadel/sound/voice/human_female_pain_1.ogg new file mode 100644 index 0000000000..f697996e56 Binary files /dev/null and b/modular_citadel/sound/voice/human_female_pain_1.ogg differ diff --git a/modular_citadel/sound/voice/human_female_pain_2.ogg b/modular_citadel/sound/voice/human_female_pain_2.ogg new file mode 100644 index 0000000000..aa2eaba352 Binary files /dev/null and b/modular_citadel/sound/voice/human_female_pain_2.ogg differ diff --git a/modular_citadel/sound/voice/human_female_pain_3.ogg b/modular_citadel/sound/voice/human_female_pain_3.ogg new file mode 100644 index 0000000000..c21d462ba5 Binary files /dev/null and b/modular_citadel/sound/voice/human_female_pain_3.ogg differ diff --git a/modular_citadel/sound/voice/human_female_scream_2.ogg b/modular_citadel/sound/voice/human_female_scream_2.ogg new file mode 100644 index 0000000000..09f2eadedb Binary files /dev/null and b/modular_citadel/sound/voice/human_female_scream_2.ogg differ diff --git a/modular_citadel/sound/voice/human_female_scream_3.ogg b/modular_citadel/sound/voice/human_female_scream_3.ogg new file mode 100644 index 0000000000..e2547362fc Binary files /dev/null and b/modular_citadel/sound/voice/human_female_scream_3.ogg differ diff --git a/modular_citadel/sound/voice/human_female_scream_4.ogg b/modular_citadel/sound/voice/human_female_scream_4.ogg new file mode 100644 index 0000000000..71a8a34b6a Binary files /dev/null and b/modular_citadel/sound/voice/human_female_scream_4.ogg differ diff --git a/modular_citadel/sound/voice/human_male_pain_1.ogg b/modular_citadel/sound/voice/human_male_pain_1.ogg new file mode 100644 index 0000000000..0dbedfe7e8 Binary files /dev/null and b/modular_citadel/sound/voice/human_male_pain_1.ogg differ diff --git a/modular_citadel/sound/voice/human_male_pain_2.ogg b/modular_citadel/sound/voice/human_male_pain_2.ogg new file mode 100644 index 0000000000..6f4a314c5c Binary files /dev/null and b/modular_citadel/sound/voice/human_male_pain_2.ogg differ diff --git a/modular_citadel/sound/voice/human_male_pain_3.ogg b/modular_citadel/sound/voice/human_male_pain_3.ogg new file mode 100644 index 0000000000..7b13505345 Binary files /dev/null and b/modular_citadel/sound/voice/human_male_pain_3.ogg differ diff --git a/modular_citadel/sound/voice/human_male_pain_rare.ogg b/modular_citadel/sound/voice/human_male_pain_rare.ogg new file mode 100644 index 0000000000..73a5da2faf Binary files /dev/null and b/modular_citadel/sound/voice/human_male_pain_rare.ogg differ diff --git a/modular_citadel/sound/voice/human_male_scream_1.ogg b/modular_citadel/sound/voice/human_male_scream_1.ogg new file mode 100644 index 0000000000..dc36553769 Binary files /dev/null and b/modular_citadel/sound/voice/human_male_scream_1.ogg differ diff --git a/modular_citadel/sound/voice/human_male_scream_2.ogg b/modular_citadel/sound/voice/human_male_scream_2.ogg new file mode 100644 index 0000000000..4a07676f67 Binary files /dev/null and b/modular_citadel/sound/voice/human_male_scream_2.ogg differ diff --git a/modular_citadel/sound/voice/human_male_scream_3.ogg b/modular_citadel/sound/voice/human_male_scream_3.ogg new file mode 100644 index 0000000000..27e047cfc0 Binary files /dev/null and b/modular_citadel/sound/voice/human_male_scream_3.ogg differ diff --git a/modular_citadel/sound/voice/human_male_scream_4.ogg b/modular_citadel/sound/voice/human_male_scream_4.ogg new file mode 100644 index 0000000000..30c44d4890 Binary files /dev/null and b/modular_citadel/sound/voice/human_male_scream_4.ogg differ diff --git a/modular_citadel/sound/voice/meow1.ogg b/modular_citadel/sound/voice/meow1.ogg new file mode 100644 index 0000000000..be9393d7d6 Binary files /dev/null and b/modular_citadel/sound/voice/meow1.ogg differ diff --git a/modular_citadel/sound/voice/pain emote credits.txt b/modular_citadel/sound/voice/pain emote credits.txt new file mode 100644 index 0000000000..10b0c205df --- /dev/null +++ b/modular_citadel/sound/voice/pain emote credits.txt @@ -0,0 +1 @@ +pain emote sound ported from https://gitlab.com/cmdevs/colonial-warfare \ No newline at end of file diff --git a/modular_citadel/sound/voice/purr.ogg b/modular_citadel/sound/voice/purr.ogg new file mode 100644 index 0000000000..d0ea06d9a0 Binary files /dev/null and b/modular_citadel/sound/voice/purr.ogg differ diff --git a/rust_g.dll b/rust_g.dll old mode 100755 new mode 100644 index 8cd62b8ca4..8ef1c59a10 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/effects/ding.ogg b/sound/effects/ding.ogg new file mode 100644 index 0000000000..33516f793f Binary files /dev/null and b/sound/effects/ding.ogg differ diff --git a/sound/effects/whistlereset.ogg b/sound/effects/whistlereset.ogg new file mode 100644 index 0000000000..cf55c06ca8 Binary files /dev/null and b/sound/effects/whistlereset.ogg differ diff --git a/sound/machines/grill/grillsizzle.ogg b/sound/machines/grill/grillsizzle.ogg new file mode 100644 index 0000000000..056ce45941 Binary files /dev/null and b/sound/machines/grill/grillsizzle.ogg differ diff --git a/sound/magic/powerdown.ogg b/sound/magic/powerdown.ogg new file mode 100644 index 0000000000..9d514c64ca Binary files /dev/null and b/sound/magic/powerdown.ogg differ diff --git a/sound/magic/powerup.ogg b/sound/magic/powerup.ogg new file mode 100644 index 0000000000..909c2a33c7 Binary files /dev/null and b/sound/magic/powerup.ogg differ diff --git a/sound/voice/catpeople/license.txt b/sound/voice/catpeople/license.txt index 7218480ddb..d0e8cad0c6 100644 --- a/sound/voice/catpeople/license.txt +++ b/sound/voice/catpeople/license.txt @@ -1,2 +1,2 @@ -distressed_cat.ogg from Cat annoyed meow / wail by jbierfeldt at https://freesound.org/people/jbierfeldt/sounds/440735/, chopped up and ogged +distressed_cat.ogg from Cat annoyed meow / wail by jbierfeldt at https://freesound.org/people/jbierfeldt/sounds/440735/, chopped up and ogged cat_puking.ogg from catpuking mp3 by NoiseCollector and Mocha the cat at https://freesound.org/people/NoiseCollector/sounds/80778/, chopped up, volume altered and ogged \ No newline at end of file diff --git a/sound/weapons/LaserSlugv3.ogg b/sound/weapons/LaserSlugv3.ogg index 0c3de3d4fd..759774c5c9 100644 Binary files a/sound/weapons/LaserSlugv3.ogg and b/sound/weapons/LaserSlugv3.ogg differ diff --git a/sound/weapons/ParticleBlaster.ogg b/sound/weapons/ParticleBlaster.ogg index ae0ae165f9..c52282aaab 100644 Binary files a/sound/weapons/ParticleBlaster.ogg and b/sound/weapons/ParticleBlaster.ogg differ diff --git a/sound/weapons/beam_sniper.ogg b/sound/weapons/beam_sniper.ogg index 0bd7b89c8d..257df1c545 100644 Binary files a/sound/weapons/beam_sniper.ogg and b/sound/weapons/beam_sniper.ogg differ diff --git a/sound/weapons/grenadelaunch.ogg b/sound/weapons/grenadelaunch.ogg index 4662058f28..6a9020f737 100644 Binary files a/sound/weapons/grenadelaunch.ogg and b/sound/weapons/grenadelaunch.ogg differ diff --git a/sound/weapons/gunshot_smg_alt.ogg b/sound/weapons/gunshot_smg_alt.ogg new file mode 100644 index 0000000000..373c1ea4ba Binary files /dev/null and b/sound/weapons/gunshot_smg_alt.ogg differ diff --git a/sound/weapons/gunshotshotgunshot.ogg b/sound/weapons/gunshotshotgunshot.ogg new file mode 100644 index 0000000000..7c513184ec Binary files /dev/null and b/sound/weapons/gunshotshotgunshot.ogg differ diff --git a/sound/weapons/lmgshot.ogg b/sound/weapons/lmgshot.ogg new file mode 100644 index 0000000000..a895e59aa2 Binary files /dev/null and b/sound/weapons/lmgshot.ogg differ diff --git a/sound/weapons/magpistol.ogg b/sound/weapons/magpistol.ogg index 4b94aa1e0a..96eb22c77d 100644 Binary files a/sound/weapons/magpistol.ogg and b/sound/weapons/magpistol.ogg differ diff --git a/sound/weapons/magrifle.ogg b/sound/weapons/magrifle.ogg index 67d6500a6c..1c10ea6b0e 100644 Binary files a/sound/weapons/magrifle.ogg and b/sound/weapons/magrifle.ogg differ diff --git a/sound/weapons/noscope.ogg b/sound/weapons/noscope.ogg new file mode 100644 index 0000000000..84c607fe03 Binary files /dev/null and b/sound/weapons/noscope.ogg differ diff --git a/sound/weapons/plasma_cutter.ogg b/sound/weapons/plasma_cutter.ogg index ba95317cc1..d555110afa 100644 Binary files a/sound/weapons/plasma_cutter.ogg and b/sound/weapons/plasma_cutter.ogg differ diff --git a/sound/weapons/revolvershot.ogg b/sound/weapons/revolvershot.ogg new file mode 100644 index 0000000000..ac6caaf247 Binary files /dev/null and b/sound/weapons/revolvershot.ogg differ diff --git a/sound/weapons/rifleshot.ogg b/sound/weapons/rifleshot.ogg new file mode 100644 index 0000000000..3bc70a7914 Binary files /dev/null and b/sound/weapons/rifleshot.ogg differ diff --git a/sound/weapons/rocketlaunch.ogg b/sound/weapons/rocketlaunch.ogg index 6972eda044..42a99c7518 100644 Binary files a/sound/weapons/rocketlaunch.ogg and b/sound/weapons/rocketlaunch.ogg differ diff --git a/sound/weapons/woodbonk.ogg b/sound/weapons/woodbonk.ogg new file mode 100644 index 0000000000..5fbadb104d Binary files /dev/null and b/sound/weapons/woodbonk.ogg differ diff --git a/strings/admin_nicknames.txt b/strings/admin_nicknames.txt deleted file mode 100644 index 76198b6c05..0000000000 --- a/strings/admin_nicknames.txt +++ /dev/null @@ -1,2 +0,0 @@ -Badmin -Spanmin \ No newline at end of file diff --git a/strings/names/adjectives.txt b/strings/names/adjectives.txt index fe9b28d431..bca89bc5a2 100644 --- a/strings/names/adjectives.txt +++ b/strings/names/adjectives.txt @@ -1,375 +1,375 @@ -abundant -adorable -adventurous -aggressive -agreeable -alert -alive -amused -ancient -angry -annoyed -annoying -anxious -arrogant -ashamed -attractive -average -awful -bad -beautiful -better -bewildered -big -bitter -black -bloody -blue -blue-eyed -blushing -boiling -bored -brainy -brave -breakable -breezy -brief -bright -broad -broken -bumpy -busy -calm -careful -cautious -charming -cheerful -chilly -chubby -clean -clear -clever -cloudy -clumsy -cold -colorful -colossal -combative -comfortable -concerned -condemned -confused -cooing -cool -cooperative -courageous -crazy -crazy flipped-out -creepy -crooked -crowded -cruel -cuddly -curious -curly -curved -cute -damaged -damp -dangerous -dark -dead -deafening -deep -defeated -defiant -delicious -delightful -depressed -determined -different -difficult -dirty -disgusted -distinct -disturbed -dizzy -doubtful -drab -dry -dull -dusty -eager -early -easy -elated -elegant -embarrassed -empty -enchanting -encouraging -energetic -enthusiastic -envious -evil -excited -expensive -exuberant -faint -fair -faithful -famous -fancy -fantastic -fast -fat -few -fierce -filthy -fine -flaky -flat -fluffy -fluttering -foolish -fragile -frail -frantic -freezing -fresh -friendly -frightened -funny -fuzzy -gentle -gifted -gigantic -glamorous -gleaming -glorious -good -gorgeous -graceful -greasy -great -grieving -grotesque -grubby -grumpy -handsome -happy -hard -harsh -healthy -heavy -helpful -helpless -high -high-pitched -hilarious -hissing -hollow -homeless -homely -horrible -hot -huge -hungry -hurt -hushed -husky -icy -ill -immense -important -impossible -inexpensive -innocent -inquisitive -itchy -jealous -jittery -jolly -joyous -juicy -kind -large -late -lazy -light -little -lively -lonely -long -loose -loud -lovely -low -lucky -magnificent -mammoth -many -massive -melodic -melted -miniature -misty -moaning -modern -motionless -muddy -mushy -mute -mysterious -narrow -nasty -naughty -nervous -nice -noisy -numerous -nutritious -nutty -obedient -obnoxious -odd -old -old-fashioned -open -outrageous -outstanding -panicky -perfect -petite -plain -plastic -pleasant -poised -poor -powerful -precious -prickly -proud -puny -purring -puzzled -quaint -quick -quiet -rainy -rapid -raspy -real -relieved -repulsive -resonant -rich -ripe -rotten -rough -round -salty -scary -scattered -scrawny -screeching -selfish -shaggy -shaky -shallow -sharp -shiny -shivering -short -shrill -shy -silent -silky -silly -skinny -sleepy -slimy -slippery -slow -small -smiling -smoggy -smooth -soft -solid -sore -sour -sparkling -spicy -splendid -spotless -square -squealing -stale -steady -steep -sticky -stormy -straight -strange -strong -stupid -substantial -successful -super -sweet -swift -talented -tall -tame -tart -Taste/Touch -tasteless -tasty -teeny -teeny-tiny -tender -tense -terrible -testy -thankful -thirsty -thoughtful -thoughtless -thundering -tight -tiny -tired -tough -troubled -ugliest -ugly -uneven -uninterested -unsightly -unusual -upset -uptight -vast -victorious -vivacious -voiceless -wandering -warm -weak -weary -wet -whispering -wicked -wide -wide-eyed -wild -witty -wonderful -wooden -worried -wrong -young -yummy -zany +abundant +adorable +adventurous +aggressive +agreeable +alert +alive +amused +ancient +angry +annoyed +annoying +anxious +arrogant +ashamed +attractive +average +awful +bad +beautiful +better +bewildered +big +bitter +black +bloody +blue +blue-eyed +blushing +boiling +bored +brainy +brave +breakable +breezy +brief +bright +broad +broken +bumpy +busy +calm +careful +cautious +charming +cheerful +chilly +chubby +clean +clear +clever +cloudy +clumsy +cold +colorful +colossal +combative +comfortable +concerned +condemned +confused +cooing +cool +cooperative +courageous +crazy +crazy flipped-out +creepy +crooked +crowded +cruel +cuddly +curious +curly +curved +cute +damaged +damp +dangerous +dark +dead +deafening +deep +defeated +defiant +delicious +delightful +depressed +determined +different +difficult +dirty +disgusted +distinct +disturbed +dizzy +doubtful +drab +dry +dull +dusty +eager +early +easy +elated +elegant +embarrassed +empty +enchanting +encouraging +energetic +enthusiastic +envious +evil +excited +expensive +exuberant +faint +fair +faithful +famous +fancy +fantastic +fast +fat +few +fierce +filthy +fine +flaky +flat +fluffy +fluttering +foolish +fragile +frail +frantic +freezing +fresh +friendly +frightened +funny +fuzzy +gentle +gifted +gigantic +glamorous +gleaming +glorious +good +gorgeous +graceful +greasy +great +grieving +grotesque +grubby +grumpy +handsome +happy +hard +harsh +healthy +heavy +helpful +helpless +high +high-pitched +hilarious +hissing +hollow +homeless +homely +horrible +hot +huge +hungry +hurt +hushed +husky +icy +ill +immense +important +impossible +inexpensive +innocent +inquisitive +itchy +jealous +jittery +jolly +joyous +juicy +kind +large +late +lazy +light +little +lively +lonely +long +loose +loud +lovely +low +lucky +magnificent +mammoth +many +massive +melodic +melted +miniature +misty +moaning +modern +motionless +muddy +mushy +mute +mysterious +narrow +nasty +naughty +nervous +nice +noisy +numerous +nutritious +nutty +obedient +obnoxious +odd +old +old-fashioned +open +outrageous +outstanding +panicky +perfect +petite +plain +plastic +pleasant +poised +poor +powerful +precious +prickly +proud +puny +purring +puzzled +quaint +quick +quiet +rainy +rapid +raspy +real +relieved +repulsive +resonant +rich +ripe +rotten +rough +round +salty +scary +scattered +scrawny +screeching +selfish +shaggy +shaky +shallow +sharp +shiny +shivering +short +shrill +shy +silent +silky +silly +skinny +sleepy +slimy +slippery +slow +small +smiling +smoggy +smooth +soft +solid +sore +sour +sparkling +spicy +splendid +spotless +square +squealing +stale +steady +steep +sticky +stormy +straight +strange +strong +stupid +substantial +successful +super +sweet +swift +talented +tall +tame +tart +Taste/Touch +tasteless +tasty +teeny +teeny-tiny +tender +tense +terrible +testy +thankful +thirsty +thoughtful +thoughtless +thundering +tight +tiny +tired +tough +troubled +ugliest +ugly +uneven +uninterested +unsightly +unusual +upset +uptight +vast +victorious +vivacious +voiceless +wandering +warm +weak +weary +wet +whispering +wicked +wide +wide-eyed +wild +witty +wonderful +wooden +worried +wrong +young +yummy +zany zealous \ No newline at end of file diff --git a/strings/names/ai.txt b/strings/names/ai.txt index 2ea5e18fc0..4104337d2c 100644 --- a/strings/names/ai.txt +++ b/strings/names/ai.txt @@ -1,146 +1,146 @@ -1-Rover-1 -16-20 -7-Zark-7 -790 -Adaptive Manipulator -Allied Mastercomputer -Alpha 5 -Alpha 6 -Alpha 7 -AM -AMEE -AmigoBot -Android -Aniel -Asimov -ASTAR -Astor -B O B -B-4 -B-9 -B166ER -Bender -Bishop -Blitz -Box -Brackenridge -C-3PO -Cassandra One -Cell -Chii -Chip -Computer -Conky 2000 -Cutie -Data -Decimus -Dee Model -Deep Thought -Dor-15 -Dorfl -Dot Matrix -Duey -E D I -E-Man -ED-209 -Emma-2 -Erasmus -Ez-27 -Fagor -Faith -Fi -FRIEND COMPUTER -Frost -Fum -Futura -G2 -George -Gnut -Gort -H A R L I E -H E L P eR -H E R B I E -Hadaly -HAL 9000 -Huey -Irona -Ironhide -Jay-Dub -Jinx -Johnny 5 -K-9 -KITT -Klapaucius -Kryten 2X4B-523P -L-76 -L-Ron -Louie -LUH 3417 -Maria -MARK13 -Marvin -Master Control Program -Max 404 -Maximillian -Mechagodzilla -Mechani-Kong -Megatron -Metalhead -Mr R I N G -Mugsy3000 -NCH -Necron-99 -Norby -OMM 0910 -Optimus -Orange v 3 5 -Project 2501 -PTO -R I C 2 0 -R2-D2 -R4-P17 -Revelation -Ro-Man -Robbie -Robot Devil -S A M -S H O C K -S H R O U D -S O P H I E -SEN 5241 -Setaur -SHODAN -Shrike -SID 6 7 -Solo -Soundwave -Speedy -Super 17 -Surgeon General Kraken -T-1000 -T-800 -T-850 -Terminus -THX 1138 -Tidy -Tik-Tok -Tobor -Trurl -TWA -ULTRABOT -Ulysses -Uniblab -V I N CENT -Voltes V -W1k1 -Wikipedia -Windows 3 1 -X-5 -XERXES -XR -Yod -Z-1 -Z-2 -Z-3 -Zed +1-Rover-1 +16-20 +7-Zark-7 +790 +Adaptive Manipulator +Allied Mastercomputer +Alpha 5 +Alpha 6 +Alpha 7 +AM +AMEE +AmigoBot +Android +Aniel +Asimov +ASTAR +Astor +B O B +B-4 +B-9 +B166ER +Bender +Bishop +Blitz +Box +Brackenridge +C-3PO +Cassandra One +Cell +Chii +Chip +Computer +Conky 2000 +Cutie +Data +Decimus +Dee Model +Deep Thought +Dor-15 +Dorfl +Dot Matrix +Duey +E D I +E-Man +ED-209 +Emma-2 +Erasmus +Ez-27 +Fagor +Faith +Fi +FRIEND COMPUTER +Frost +Fum +Futura +G2 +George +Gnut +Gort +H A R L I E +H E L P eR +H E R B I E +Hadaly +HAL 9000 +Huey +Irona +Ironhide +Jay-Dub +Jinx +Johnny 5 +K-9 +KITT +Klapaucius +Kryten 2X4B-523P +L-76 +L-Ron +Louie +LUH 3417 +Maria +MARK13 +Marvin +Master Control Program +Max 404 +Maximillian +Mechagodzilla +Mechani-Kong +Megatron +Metalhead +Mr R I N G +Mugsy3000 +NCH +Necron-99 +Norby +OMM 0910 +Optimus +Orange v 3 5 +Project 2501 +PTO +R I C 2 0 +R2-D2 +R4-P17 +Revelation +Ro-Man +Robbie +Robot Devil +S A M +S H O C K +S H R O U D +S O P H I E +SEN 5241 +Setaur +SHODAN +Shrike +SID 6 7 +Solo +Soundwave +Speedy +Super 17 +Surgeon General Kraken +T-1000 +T-800 +T-850 +Terminus +THX 1138 +Tidy +Tik-Tok +Tobor +Trurl +TWA +ULTRABOT +Ulysses +Uniblab +V I N CENT +Voltes V +W1k1 +Wikipedia +Windows 3 1 +X-5 +XERXES +XR +Yod +Z-1 +Z-2 +Z-3 +Zed Zord \ No newline at end of file diff --git a/strings/names/carp.txt b/strings/names/carp.txt index 4b10aa65f7..223106992b 100644 --- a/strings/names/carp.txt +++ b/strings/names/carp.txt @@ -1,30 +1,30 @@ -Lungfish -Blackfish -Alligator -Icefish -Armorhead -Hammerhead -Anaconda -Flathead -Manta Ray -Sting Ray -Fangtooth Moray -Goblin Shark -Grass Carp -Round River Bat Ray -Noodlefish -Hagfish -Man o’ War -Ladyfish -Black Eel -Baby Seal -Sprat -Koi -Electric Eel -Lamprey -Pejeray -Yellow-edged Moray -Salmon Shark -Sleeper Shark -Featherback -Eagle Ray +Lungfish +Blackfish +Alligator +Icefish +Armorhead +Hammerhead +Anaconda +Flathead +Manta Ray +Sting Ray +Fangtooth Moray +Goblin Shark +Grass Carp +Round River Bat Ray +Noodlefish +Hagfish +Man o’ War +Ladyfish +Black Eel +Baby Seal +Sprat +Koi +Electric Eel +Lamprey +Pejeray +Yellow-edged Moray +Salmon Shark +Sleeper Shark +Featherback +Eagle Ray diff --git a/strings/names/clown.txt b/strings/names/clown.txt index d8655d7cbf..3b4b4dcb75 100644 --- a/strings/names/clown.txt +++ b/strings/names/clown.txt @@ -1,62 +1,62 @@ -Alfie -Antsy -Baby Cakes -Bam Bam -Beebee -Bo Bo Sassy -Bonker -Bonbon -Bubble -Buster Frown -Buttercup -Button -Candy -Checkers -Clarabell -Clownsky -Clueless -Cluesky -Dazzle -Dinky Doodle -Doodles -Duckie -Flop O'Honker -Freckle -Giggles -Gigglesworth -Goose McSunny -Honkel the III -Honker -Honkerbelle -Knicknack -Jazzy Bella -Jingle -Joy -Jo Jo Bobo Bo -Ladybug Honks -Lala -Miss Stockings -Mittens -Mr Shoe -Patches -Pancake -Pepinpop -Pocket -Razzle Dazzle -Redshirt McBeat -Ronnie Pace -Scootaloo -Silly Willy -Skiddle -Slippy Joe -Sparkle -Speckles -Sprinkledinkle -Squigley -Tickle -Topcake -Toodles Sharperton -Trixy -Witty -Ziggy Yoyo -Zippy +Alfie +Antsy +Baby Cakes +Bam Bam +Beebee +Bo Bo Sassy +Bonker +Bonbon +Bubble +Buster Frown +Buttercup +Button +Candy +Checkers +Clarabell +Clownsky +Clueless +Cluesky +Dazzle +Dinky Doodle +Doodles +Duckie +Flop O'Honker +Freckle +Giggles +Gigglesworth +Goose McSunny +Honkel the III +Honker +Honkerbelle +Knicknack +Jazzy Bella +Jingle +Joy +Jo Jo Bobo Bo +Ladybug Honks +Lala +Miss Stockings +Mittens +Mr Shoe +Patches +Pancake +Pepinpop +Pocket +Razzle Dazzle +Redshirt McBeat +Ronnie Pace +Scootaloo +Silly Willy +Skiddle +Slippy Joe +Sparkle +Speckles +Sprinkledinkle +Squigley +Tickle +Topcake +Toodles Sharperton +Trixy +Witty +Ziggy Yoyo +Zippy diff --git a/strings/names/death_commando.txt b/strings/names/death_commando.txt index e689727228..fa47fb2065 100644 --- a/strings/names/death_commando.txt +++ b/strings/names/death_commando.txt @@ -1,70 +1,70 @@ -A whole bunch of spiders in a SWAT suit -Al "Otta" Gore -AMERICA -Beat Punchbeef -Blast Hardcheese -Blast Thickneck -Bob Johnson -Bold Bigflank -Bolt Vanderhuge -Brick Hardmeat -Buck Plankchest -Buff Drinklots -Buff Hardback -Butch Deadlift -Crud Bonemeal -Crunch Buttsteak -Crush McStompbones -Dirk Hardpeck -Duke Killington -Evil Bob Marley -Evil Martin Luther King -Fist Rockbone -Flint Ironstag -Fridge Largemeat -George Melons -Gibbs McLargehuge -GORE Vidal -Gristle McThornBody -Hank Chesthair -Hans Testosteroneson -Killiam Shakespeare -Killing McKillingalot -Lance Killiam -Leonardo Da Viking -Lump Beefrock -Mancrush McBrorape -Max Pain -Maximilian Murderface -Maxx Power -Noam Bombsky -Pack Blowfist -Punch Rockgroin -Punch Sideiron -Punt Speedchunk -Reef Blastbody -Rex Dudekiller VII -Rip Sidecheek -Rip Steakface -Roll Fizzlebeef -Sarah Pain -Seamus McTosterone -Sgt Slaughter -Sir Killaslot -Slab Bulkhead -Slab Squatthrust -Slake Fistcrunch -Slate Slabrock -Smash Lampjaw -Smoke Manmuscle -Splint Chesthair -Stabby McGee -Stump Beefgnaw -Stump Chunkman -THAT DAMN TRAITOR GEORGE MELONS -Theodore Pain -Thick McRunfast -Toolboxl Rose -Touch Rustrod -Trunk Slamchest -Zombie Gandhi +A whole bunch of spiders in a SWAT suit +Al "Otta" Gore +AMERICA +Beat Punchbeef +Blast Hardcheese +Blast Thickneck +Bob Johnson +Bold Bigflank +Bolt Vanderhuge +Brick Hardmeat +Buck Plankchest +Buff Drinklots +Buff Hardback +Butch Deadlift +Crud Bonemeal +Crunch Buttsteak +Crush McStompbones +Dirk Hardpeck +Duke Killington +Evil Bob Marley +Evil Martin Luther King +Fist Rockbone +Flint Ironstag +Fridge Largemeat +George Melons +Gibbs McLargehuge +GORE Vidal +Gristle McThornBody +Hank Chesthair +Hans Testosteroneson +Killiam Shakespeare +Killing McKillingalot +Lance Killiam +Leonardo Da Viking +Lump Beefrock +Mancrush McBrorape +Max Pain +Maximilian Murderface +Maxx Power +Noam Bombsky +Pack Blowfist +Punch Rockgroin +Punch Sideiron +Punt Speedchunk +Reef Blastbody +Rex Dudekiller VII +Rip Sidecheek +Rip Steakface +Roll Fizzlebeef +Sarah Pain +Seamus McTosterone +Sgt Slaughter +Sir Killaslot +Slab Bulkhead +Slab Squatthrust +Slake Fistcrunch +Slate Slabrock +Smash Lampjaw +Smoke Manmuscle +Splint Chesthair +Stabby McGee +Stump Beefgnaw +Stump Chunkman +THAT DAMN TRAITOR GEORGE MELONS +Theodore Pain +Thick McRunfast +Toolboxl Rose +Touch Rustrod +Trunk Slamchest +Zombie Gandhi diff --git a/strings/names/first.txt b/strings/names/first.txt index cc99e59d84..3f9018adca 100644 --- a/strings/names/first.txt +++ b/strings/names/first.txt @@ -1,1396 +1,1396 @@ -Aaden -Aaliyah -Aaron -Abby -Abel -Abigail -Abraham -Adam -Adan -Addison -Addyson -Adeline -Aden -Adolph -Adrian -Adriana -Adrianna -Aida -Aidan -Aiden -Aileen -Ainsley -Alaina -Alan -Alana -Alanna -Alayna -Albert -Alberto -Alden -Alec -Alejandra -Alejandro -Alessandra -Alex -Alexa -Alexander -Alexandra -Alexandria -Alexia -Alexis -Alexus -Alfred -Alfreda -Alfredo -Alger -Ali -Alice -Alicia -Alijah -Alina -Alisa -Alison -Alissa -Alisya -Alivia -Aliyah -Allegra -Allegria -Allen -Allie -Allison -Allisson -Allyson -Alma -Alondra -Alvin -Alysha -Alyson -Alyssa -Alyssia -Amanda -Amari -Amaryllis -Amaya -Amber -Ambrosine -Amelia -Amir -Amira -Amiyah -Amos -Amy -Amya -Ana -Anahi -Anastasia -Anaya -Anderson -Andre -Andrea -Andres -Andrew -Andy -Angel -Angela -Angelica -Angelina -Angelo -Angie -Aniya -Aniyah -Anjelica -Anna -Annabelle -Anne -Annie -Annika -Anthony -Antonio -Anya -April -Arabella -Archie -Ariana -Arianna -Ariel -Arielle -Arleen -Armando -Arn -Art -Arthur -Arturo -Asher -Ashley -Ashlie -Ashlyn -Ashlynn -Ashton -Asia -Astor -Athena -Aubree -Aubrey -Aubrie -Audrey -Audrina -August -Aurora -Austin -Autumn -Ava -Avalon -Averill -Avery -Axel -Ayden -Ayla -Bailey -Baldric -Barbra -Bartholomew -Baylee -Beau -Beckah -Beckett -Becky -Bella -Benjamin -Bennett -Bernice -Bertrand -Bethany -Bethney -Betsy -Bianca -Bidelia -Bill -Blake -Braden -Bradley -Brady -Braeden -Braiden -Brandon -Braxton -Brayan -Brayden -Braydon -Braylon -Breanna -Breanne -Brenda -Brendan -Brenden -Brenna -Brennan -Brett -Brian -Briana -Brianna -Bridget -Brielle -Brittani -Brittany -Brock -Brodie -Brody -Bronte -Brooke -Brooklyn -Brooklynn -Bruce -Bryan -Bryant -Bryce -Brycen -Brynn -Bryson -Burt -Byrne -Byron -Bysshe -Cade -Caden -Cadence -Caiden -Caitlin -Caitlyn -Calanthia -Caleb -Caleigh -Cali -Callie -Calvin -Camden -Cameron -Camila -Camille -Camron -Camryn -Candace -Candice -Candis -Canute -Cara -Carl -Carlos -Carly -Carlyle -Carmen -Carolina -Caroline -Carolyn -Carry -Carson -Carter -Caryl -Casey -Cash -Casimir -Cassandra -Cassian -Cassidy -Catherine -Cayden -Cecilia -Cecily -Celeste -Cesar -Chad -Chance -Chandler -Charles -Charlie -Charlotte -Charlton -Chase -Chelsea -Cherette -Cheri -Cherry -Cheyanne -Cheyenne -Chip -Chloe -Chris -Christa -Christian -Christiana -Christina -Christobel -Christopher -Ciara -Cindy -Claire -Clara -Claribel -Clark -Claudia -Claudius -Clayton -Clement -Cleveland -Cliff -Clinton -Clitus -Clover -Cody -Cohen -Colby -Cole -Colin -Collin -Colten -Colton -Conner -Connor -Cooper -Cora -Corbin -Coreen -Corey -Corrine -Cory -Courtney -Cristian -Cristopher -Cruz -Crystal -Curtis -Cy -Cynthia -Daisy -Dakota -Dallas -Dalton -Dalya -Damian -Damien -Damon -Dana -Dane -Danica -Daniel -Daniela -Daniella -Danielle -Danika -Danna -Danny -Dante -Darcey -Darell -Daria -Darin -Darius -Darren -David -Davion -Davis -Dawson -Dayana -Dayna -Dayton -Dean -Deandre -Deangelo -Debbi -Declan -Dee -Deena -Delaney -Delilah -Della -Delma -Denholm -Denise -Dennis -Denys -Derek -Derrick -Desiree -Desmond -Destiny -Devin -Devon -Diamond -Diana -Diego -Dillon -Dina -Dolores -Dominic -Dominick -Donald -Donella -Donna -Donny -Donovan -Dorian -Dorothy -Dortha -Douglas -Drake -Drew -Driscoll -Dulce -Duncan -Dustin -Dylan -Easter -Easton -Ebba -Eddie -Eden -Edgar -Eduardo -Edward -Edwin -Effie -Elaina -Eleanor -Elena -Eli -Eliana -Elias -Elijah -Eliot -Eliott -Elise -Eliza -Elizabeth -Ella -Elle -Ellie -Elliot -Elliott -Elric -Elspet -Elwood -Emanuel -Emely -Emerson -Emery -Emilee -Emilia -Emiliano -Emilio -Emily -Emma -Emmanuel -Enrique -Eric -Erica -Erick -Erik -Erika -Erin -Ermintrude -Ernesto -Esmeralda -Esteban -Esther -Estrella -Ethan -Eugenia -Euphemia -Eustace -Eva -Evan -Evangeline -Eveleen -Evelina -Evelyn -Everett -Ezekiel -Ezra -Fabian -Faith -Fatima -Fay -Felix -Fernanda -Fernando -Finn -Fiona -Fitz -Flick -Floella -Flora -Flossie -Fortune -Francesca -Francis -Francisco -Frank -Frankie -Franklin -Fulton -Gabriel -Gabriela -Gabriella -Gabrielle -Gael -Gage -Garret -Garrett -Gary -Gavin -Gaye -Gaylord -Genesis -Genette -Genevieve -George -Georgene -Georgia -Geraldine -Gerardo -Gervase -Gianna -Gina -Ginger -Giovanni -Giselle -Gladwyn -Glenna -Gloria -Goddard -Godwin -Goodwin -Gordon -Grace -Gracie -Grady -Graeme -Graham -Grant -Gratian -Grayson -Gregory -Greta -Greyson -Griffin -Griselda -Guadalupe -Guillermo -Gunner -Gustavo -Gwenda -Gwenevere -Hadley -Haidee -Hailee -Hailey -Hal -Haleigh -Haley -Hanna -Hannah -Happy -Harley -Harmony -Harper -Harrison -Hartley -Hayden -Haylee -Hayley -Haylie -Hazel -Heather -Heaven -Hector -Hedley -Heidi -Helen -Henderson -Henry -Hepsie -Hervey -Holden -Holly -Homer -Hope -Horatio -Hortensia -Hudson -Huffie -Hugo -Hunter -Ian -Iantha -Ileen -Imani -Innocent -Irene -Iris -Irvine -Isaac -Isabel -Isabella -Isabelle -Isaiah -Isaias -Isiah -Ismael -Israel -Issac -Itzel -Ivan -Ivy -Izabella -Izaiah -Jacaline -Jace -Jack -Jackson -Jacob -Jacoby -Jacqueline -Jacquetta -Jacqui -Jada -Jade -Jaden -Jadon -Jadyn -Jaelyn -Jaiden -Jaime -Jake -Jakki -Jakob -Jalen -Jamar -Jamari -Jamarion -James -Jameson -Jamie -Jamison -Jane -Janel -Janelle -Janette -Janie -Janina -Janine -Janiya -Janiyah -Jared -Jaslene -Jasmin -Jasmine -Jason -Jasper -Javier -Javon -Jaxon -Jaxson -Jay -Jayce -Jayda -Jayden -Jaydon -Jaye -Jayla -Jaylee -Jaylen -Jayne -Jaynie -Jayson -Jazlyn -Jazmin -Jazmine -Jeanna -Jeannie -Jeannine -Jeb -Jed -Jeffrey -Jemmy -Jenifer -Jenna -Jennie -Jennifer -Jera -Jere -Jeremiah -Jeremy -Jeri -Jermaine -Jerrie -Jerry -Jesse -Jessica -Jesus -Jillian -Jillie -Jim -Jimena -Jimmy -Joachim -Joanna -Joaquin -Jocelyn -Joe -Joel -Joetta -Joey -Johan -Johanna -John -Johnathan -Johnny -Joi -Jonah -Jonas -Jonathan -Jonathon -Joni -Jordan -Jordyn -Jorge -Jose -Joselyn -Joseph -Josepha -Josephine -Josh -Joshua -Josiah -Josie -Josue -Joye -Juan -Judah -Jude -Julia -Julian -Juliana -Julianna -Julie -Juliet -Julio -Julissa -Julius -July -Justice -Justin -Kade -Kaden -Kadence -Kaelea -Kaelyn -Kai -Kaiden -Kailey -Kailyn -Kaitlin -Kaitlyn -Kale -Kaleb -Kaleigh -Kameron -Kamryn -Kane -Kara -Karen -Karenza -Karina -Karla -Karly -Karson -Karyn -Kassidy -Kat -Kate -Katelyn -Katelynn -Katherine -Kathleen -Kathryn -Kathy -Katie -Katlyn -Kayden -Kaydence -Kayla -Kaylee -Kayleigh -Kaylie -Kaylin -Keagan -Keaton -Keegan -Keira -Keith -Kellen -Kellie -Kelly -Kelsey -Kelvin -Kendall -Kendra -Kennard -Kennedy -Kenneth -Kenzie -Kerena -Kerensa -Keturah -Kevin -Keziah -Khalil -Khloe -Kiana -Kiara -Kiera -Kiley -Kimberley -Kimberly -Kimora -Kingston -Kira -Kobe -Kolton -Kristen -Kristina -Kristopher -Kyla -Kyle -Kylee -Kyleigh -Kyler -Kylie -Kyra -Lacey -Lacy -Laila -Lakeisha -Lalla -Lana -Lance -Landen -Landon -Landyn -Lane -Lanny -Larry -Latanya -Launce -Laura -Lauren -Laurencia -Laurissa -Lauryn -Lawrence -Layla -Leah -Leeann -Leia -Leila -Leilani -Leland -Lena -Lennox -Leo -Leonardo -Leonel -Leroi -Leslie -Lesly -Lessie -Leta -Levi -Lexi -Lexia -Lexus -Lia -Liam -Lila -Lilah -Lilian -Liliana -Lillian -Lilliana -Lillie -Lilly -Lily -Lincoln -Linden -Lindsay -Lindsey -Lindsie -Lindy -Linton -Lizbeth -Lockie -Logan -Lola -London -Lorenzo -Loreto -Lori -Lorin -Lou -Louis -Luanne -Luca -Lucas -Lucia -Lucian -Lucy -Luis -Lukas -Luke -Luna -Luvenia -Lydia -Lyla -Lyndsey -Lynn -Lynsey -Lynwood -Lyric -Mabelle -Macey -Macie -Mackenzie -Macy -Madalyn -Maddison -Maddox -Madeleine -Madeline -Madelyn -Madelynn -Madilyn -Madison -Madisyn -Madyson -Maegan -Maggie -Makayla -Makenna -Makenzie -Malachi -Malcolm -Malia -Malik -Mallory -Manley -Manuel -Marc -Marcia -Marco -Marcos -Marcus -Marely -Margaret -Maria -Mariabella -Mariah -Mariana -Marilene -Mario -Marion -Marisol -Marissa -Marje -Marjory -Mark -Marlee -Marley -Marlowe -Marlyn -Marshall -Martin -Marvin -Mary -Maryann -Mason -Mateo -Mathew -Matthew -Maudie -Maurene -Maurice -Mauricio -Max -Maximilian -Maximus -Maxwell -May -Maya -Maynard -Mckenna -Mckenzie -Megan -Meghan -Mekhi -Melanie -Melany -Melissa -Melody -Melvin -Melvyn -Meredith -Merideth -Merrilyn -Meryl -Mia -Micah -Michael -Michaela -Micheal -Michelle -Miguel -Mikayla -Mike -Miles -Miley -Milo -Milton -Minnie -Miracle -Miranda -Miriam -Mitchell -Moises -Molly -Monica -Monna -Montague -Monte -Monty -Morgan -Moses -Muriel -Mya -Mylee -Myles -Myriam -Myrtie -Nadia -Nan -Nancy -Naomi -Nasir -Natalia -Natalie -Nataly -Natasha -Nathan -Nathaniel -Nayeli -Nehemiah -Nelle -Nelson -Nena -Nerissa -Netta -Nettie -Nevaeh -Nia -Nicholas -Nickolas -Nicolas -Nicole -Nikolas -Nina -Noah -Noel -Noelle -Nolan -Nonie -Nora -Norah -Nova -Nowell -Nydia -Nyla -Olive -Oliver -Olivia -Omar -Oralie -Orlando -Osbert -Osborn -Osborne -Oscar -Osmund -Owen -Pablo -Paget -Paige -Paisley -Paola -Paris -Parker -Patience -Patricia -Patrick -Patton -Paul -Pauleen -Paxton -Payton -Pedro -Pene -Penelope -Percival -Peregrine -Perla -Peter -Peyton -Pheobe -Philip -Phillip -Phoebe -Phoenix -Phyliss -Phyllida -Phyllis -Piper -Porsche -Porter -Presley -Preston -Priscilla -Prosper -Prue -Quanah -Quentin -Quiana -Quinn -Quinton -Rachael -Rachel -Raegan -Raelene -Rafael -Rain -Ramon -Randa -Randal -Randy -Rastus -Raul -Raymond -Rayner -Reagan -Rebecca -Rebeckah -Rebekah -Reece -Reed -Reene -Reese -Reid -Renie -Reuben -Rexana -Reynard -Rhetta -Ricardo -Rich -Richard -Richie -Rick -Rickena -Rickey -Rickie -Ricky -Rihanna -Riley -River -Robert -Roberto -Rocco -Rodger -Rodrigo -Roger -Roman -Romayne -Romeo -Ronald -Ronnette -Rosa -Roscoe -Rose -Rosemary -Roswell -Rowan -Roy -Royce -Ruben -Ruby -Rubye -Russell -Rusty -Ruth -Ryan -Ryder -Ryker -Rylan -Rylee -Ryleigh -Rylie -Sabella -Sabrina -Sachie -Sadie -Sage -Sal -Sally -Salvador -Sam -Samantha -Samara -Samuel -Sandra -Santiago -Sara -Sarah -Sarai -Saranna -Sasha -Saul -Savanna -Savannah -Sawyer -Scarlett -Scott -Scotty -Sean -Sebastian -Selena -Seneca -Serena -Serenity -Sergio -Seth -Seymour -Shan -Shana -Shane -Shanika -Shannah -Shannon -Shantae -Sharalyn -Sharla -Shaun -Shawn -Shayla -Shelby -Sheri -Sherie -Sherill -Sherri -Shiloh -Sienna -Sierra -Silas -Simon -Sissy -Skylar -Skyler -Sloan -Sofia -Solomon -Sophia -Sophie -Sorrel -Spencer -Spike -Star -Stella -Steph -Stephanie -Stephany -Stephen -Steven -Sue -Sukie -Summer -Sunshine -Susanna -Susannah -Suzan -Suzy -Sybil -Syd -Sydney -Talia -Talon -Tamika -Tamsin -Tania -Tanner -Tansy -Taryn -Tate -Tatiana -Tatum -Tatyanna -Taylor -Teagan -Tel -Terrell -Terry -Tessa -Theodore -Thomas -Tiffany -Timothy -Titus -Tod -Tolly -Tony -Topaz -Tori -Tracee -Tracey -Travis -Trent -Trenton -Trevor -Trey -Trinity -Tristan -Tristen -Triston -Troy -Tucker -Ty -Tye -Tyler -Tyson -Uland -Ulric -Ulyssa -Uriel -Valary -Valentina -Valeria -Valerie -Vanessa -Vaughn -Verna -Veronica -Victor -Victoria -Vince -Vincent -Vinnie -Violet -Vivian -Viviana -Vivyan -Walker -Walter -Ward -Warner -Wayne -Wendi -Wendy -Wesley -Weston -Whitaker -William -Willow -Willy -Winifred -Wisdom -Woodrow -Woody -Wyatt -Wynonna -Wynter -Xander -Xavier -Ximena -Yahir -Yasmin -Yolanda -Ysabel -Zachariah -Zachary -Zack -Zackary -Zander -Zane -Zayden -Zeke -Zelda -Zion -Zoe -Zoey +Aaden +Aaliyah +Aaron +Abby +Abel +Abigail +Abraham +Adam +Adan +Addison +Addyson +Adeline +Aden +Adolph +Adrian +Adriana +Adrianna +Aida +Aidan +Aiden +Aileen +Ainsley +Alaina +Alan +Alana +Alanna +Alayna +Albert +Alberto +Alden +Alec +Alejandra +Alejandro +Alessandra +Alex +Alexa +Alexander +Alexandra +Alexandria +Alexia +Alexis +Alexus +Alfred +Alfreda +Alfredo +Alger +Ali +Alice +Alicia +Alijah +Alina +Alisa +Alison +Alissa +Alisya +Alivia +Aliyah +Allegra +Allegria +Allen +Allie +Allison +Allisson +Allyson +Alma +Alondra +Alvin +Alysha +Alyson +Alyssa +Alyssia +Amanda +Amari +Amaryllis +Amaya +Amber +Ambrosine +Amelia +Amir +Amira +Amiyah +Amos +Amy +Amya +Ana +Anahi +Anastasia +Anaya +Anderson +Andre +Andrea +Andres +Andrew +Andy +Angel +Angela +Angelica +Angelina +Angelo +Angie +Aniya +Aniyah +Anjelica +Anna +Annabelle +Anne +Annie +Annika +Anthony +Antonio +Anya +April +Arabella +Archie +Ariana +Arianna +Ariel +Arielle +Arleen +Armando +Arn +Art +Arthur +Arturo +Asher +Ashley +Ashlie +Ashlyn +Ashlynn +Ashton +Asia +Astor +Athena +Aubree +Aubrey +Aubrie +Audrey +Audrina +August +Aurora +Austin +Autumn +Ava +Avalon +Averill +Avery +Axel +Ayden +Ayla +Bailey +Baldric +Barbra +Bartholomew +Baylee +Beau +Beckah +Beckett +Becky +Bella +Benjamin +Bennett +Bernice +Bertrand +Bethany +Bethney +Betsy +Bianca +Bidelia +Bill +Blake +Braden +Bradley +Brady +Braeden +Braiden +Brandon +Braxton +Brayan +Brayden +Braydon +Braylon +Breanna +Breanne +Brenda +Brendan +Brenden +Brenna +Brennan +Brett +Brian +Briana +Brianna +Bridget +Brielle +Brittani +Brittany +Brock +Brodie +Brody +Bronte +Brooke +Brooklyn +Brooklynn +Bruce +Bryan +Bryant +Bryce +Brycen +Brynn +Bryson +Burt +Byrne +Byron +Bysshe +Cade +Caden +Cadence +Caiden +Caitlin +Caitlyn +Calanthia +Caleb +Caleigh +Cali +Callie +Calvin +Camden +Cameron +Camila +Camille +Camron +Camryn +Candace +Candice +Candis +Canute +Cara +Carl +Carlos +Carly +Carlyle +Carmen +Carolina +Caroline +Carolyn +Carry +Carson +Carter +Caryl +Casey +Cash +Casimir +Cassandra +Cassian +Cassidy +Catherine +Cayden +Cecilia +Cecily +Celeste +Cesar +Chad +Chance +Chandler +Charles +Charlie +Charlotte +Charlton +Chase +Chelsea +Cherette +Cheri +Cherry +Cheyanne +Cheyenne +Chip +Chloe +Chris +Christa +Christian +Christiana +Christina +Christobel +Christopher +Ciara +Cindy +Claire +Clara +Claribel +Clark +Claudia +Claudius +Clayton +Clement +Cleveland +Cliff +Clinton +Clitus +Clover +Cody +Cohen +Colby +Cole +Colin +Collin +Colten +Colton +Conner +Connor +Cooper +Cora +Corbin +Coreen +Corey +Corrine +Cory +Courtney +Cristian +Cristopher +Cruz +Crystal +Curtis +Cy +Cynthia +Daisy +Dakota +Dallas +Dalton +Dalya +Damian +Damien +Damon +Dana +Dane +Danica +Daniel +Daniela +Daniella +Danielle +Danika +Danna +Danny +Dante +Darcey +Darell +Daria +Darin +Darius +Darren +David +Davion +Davis +Dawson +Dayana +Dayna +Dayton +Dean +Deandre +Deangelo +Debbi +Declan +Dee +Deena +Delaney +Delilah +Della +Delma +Denholm +Denise +Dennis +Denys +Derek +Derrick +Desiree +Desmond +Destiny +Devin +Devon +Diamond +Diana +Diego +Dillon +Dina +Dolores +Dominic +Dominick +Donald +Donella +Donna +Donny +Donovan +Dorian +Dorothy +Dortha +Douglas +Drake +Drew +Driscoll +Dulce +Duncan +Dustin +Dylan +Easter +Easton +Ebba +Eddie +Eden +Edgar +Eduardo +Edward +Edwin +Effie +Elaina +Eleanor +Elena +Eli +Eliana +Elias +Elijah +Eliot +Eliott +Elise +Eliza +Elizabeth +Ella +Elle +Ellie +Elliot +Elliott +Elric +Elspet +Elwood +Emanuel +Emely +Emerson +Emery +Emilee +Emilia +Emiliano +Emilio +Emily +Emma +Emmanuel +Enrique +Eric +Erica +Erick +Erik +Erika +Erin +Ermintrude +Ernesto +Esmeralda +Esteban +Esther +Estrella +Ethan +Eugenia +Euphemia +Eustace +Eva +Evan +Evangeline +Eveleen +Evelina +Evelyn +Everett +Ezekiel +Ezra +Fabian +Faith +Fatima +Fay +Felix +Fernanda +Fernando +Finn +Fiona +Fitz +Flick +Floella +Flora +Flossie +Fortune +Francesca +Francis +Francisco +Frank +Frankie +Franklin +Fulton +Gabriel +Gabriela +Gabriella +Gabrielle +Gael +Gage +Garret +Garrett +Gary +Gavin +Gaye +Gaylord +Genesis +Genette +Genevieve +George +Georgene +Georgia +Geraldine +Gerardo +Gervase +Gianna +Gina +Ginger +Giovanni +Giselle +Gladwyn +Glenna +Gloria +Goddard +Godwin +Goodwin +Gordon +Grace +Gracie +Grady +Graeme +Graham +Grant +Gratian +Grayson +Gregory +Greta +Greyson +Griffin +Griselda +Guadalupe +Guillermo +Gunner +Gustavo +Gwenda +Gwenevere +Hadley +Haidee +Hailee +Hailey +Hal +Haleigh +Haley +Hanna +Hannah +Happy +Harley +Harmony +Harper +Harrison +Hartley +Hayden +Haylee +Hayley +Haylie +Hazel +Heather +Heaven +Hector +Hedley +Heidi +Helen +Henderson +Henry +Hepsie +Hervey +Holden +Holly +Homer +Hope +Horatio +Hortensia +Hudson +Huffie +Hugo +Hunter +Ian +Iantha +Ileen +Imani +Innocent +Irene +Iris +Irvine +Isaac +Isabel +Isabella +Isabelle +Isaiah +Isaias +Isiah +Ismael +Israel +Issac +Itzel +Ivan +Ivy +Izabella +Izaiah +Jacaline +Jace +Jack +Jackson +Jacob +Jacoby +Jacqueline +Jacquetta +Jacqui +Jada +Jade +Jaden +Jadon +Jadyn +Jaelyn +Jaiden +Jaime +Jake +Jakki +Jakob +Jalen +Jamar +Jamari +Jamarion +James +Jameson +Jamie +Jamison +Jane +Janel +Janelle +Janette +Janie +Janina +Janine +Janiya +Janiyah +Jared +Jaslene +Jasmin +Jasmine +Jason +Jasper +Javier +Javon +Jaxon +Jaxson +Jay +Jayce +Jayda +Jayden +Jaydon +Jaye +Jayla +Jaylee +Jaylen +Jayne +Jaynie +Jayson +Jazlyn +Jazmin +Jazmine +Jeanna +Jeannie +Jeannine +Jeb +Jed +Jeffrey +Jemmy +Jenifer +Jenna +Jennie +Jennifer +Jera +Jere +Jeremiah +Jeremy +Jeri +Jermaine +Jerrie +Jerry +Jesse +Jessica +Jesus +Jillian +Jillie +Jim +Jimena +Jimmy +Joachim +Joanna +Joaquin +Jocelyn +Joe +Joel +Joetta +Joey +Johan +Johanna +John +Johnathan +Johnny +Joi +Jonah +Jonas +Jonathan +Jonathon +Joni +Jordan +Jordyn +Jorge +Jose +Joselyn +Joseph +Josepha +Josephine +Josh +Joshua +Josiah +Josie +Josue +Joye +Juan +Judah +Jude +Julia +Julian +Juliana +Julianna +Julie +Juliet +Julio +Julissa +Julius +July +Justice +Justin +Kade +Kaden +Kadence +Kaelea +Kaelyn +Kai +Kaiden +Kailey +Kailyn +Kaitlin +Kaitlyn +Kale +Kaleb +Kaleigh +Kameron +Kamryn +Kane +Kara +Karen +Karenza +Karina +Karla +Karly +Karson +Karyn +Kassidy +Kat +Kate +Katelyn +Katelynn +Katherine +Kathleen +Kathryn +Kathy +Katie +Katlyn +Kayden +Kaydence +Kayla +Kaylee +Kayleigh +Kaylie +Kaylin +Keagan +Keaton +Keegan +Keira +Keith +Kellen +Kellie +Kelly +Kelsey +Kelvin +Kendall +Kendra +Kennard +Kennedy +Kenneth +Kenzie +Kerena +Kerensa +Keturah +Kevin +Keziah +Khalil +Khloe +Kiana +Kiara +Kiera +Kiley +Kimberley +Kimberly +Kimora +Kingston +Kira +Kobe +Kolton +Kristen +Kristina +Kristopher +Kyla +Kyle +Kylee +Kyleigh +Kyler +Kylie +Kyra +Lacey +Lacy +Laila +Lakeisha +Lalla +Lana +Lance +Landen +Landon +Landyn +Lane +Lanny +Larry +Latanya +Launce +Laura +Lauren +Laurencia +Laurissa +Lauryn +Lawrence +Layla +Leah +Leeann +Leia +Leila +Leilani +Leland +Lena +Lennox +Leo +Leonardo +Leonel +Leroi +Leslie +Lesly +Lessie +Leta +Levi +Lexi +Lexia +Lexus +Lia +Liam +Lila +Lilah +Lilian +Liliana +Lillian +Lilliana +Lillie +Lilly +Lily +Lincoln +Linden +Lindsay +Lindsey +Lindsie +Lindy +Linton +Lizbeth +Lockie +Logan +Lola +London +Lorenzo +Loreto +Lori +Lorin +Lou +Louis +Luanne +Luca +Lucas +Lucia +Lucian +Lucy +Luis +Lukas +Luke +Luna +Luvenia +Lydia +Lyla +Lyndsey +Lynn +Lynsey +Lynwood +Lyric +Mabelle +Macey +Macie +Mackenzie +Macy +Madalyn +Maddison +Maddox +Madeleine +Madeline +Madelyn +Madelynn +Madilyn +Madison +Madisyn +Madyson +Maegan +Maggie +Makayla +Makenna +Makenzie +Malachi +Malcolm +Malia +Malik +Mallory +Manley +Manuel +Marc +Marcia +Marco +Marcos +Marcus +Marely +Margaret +Maria +Mariabella +Mariah +Mariana +Marilene +Mario +Marion +Marisol +Marissa +Marje +Marjory +Mark +Marlee +Marley +Marlowe +Marlyn +Marshall +Martin +Marvin +Mary +Maryann +Mason +Mateo +Mathew +Matthew +Maudie +Maurene +Maurice +Mauricio +Max +Maximilian +Maximus +Maxwell +May +Maya +Maynard +Mckenna +Mckenzie +Megan +Meghan +Mekhi +Melanie +Melany +Melissa +Melody +Melvin +Melvyn +Meredith +Merideth +Merrilyn +Meryl +Mia +Micah +Michael +Michaela +Micheal +Michelle +Miguel +Mikayla +Mike +Miles +Miley +Milo +Milton +Minnie +Miracle +Miranda +Miriam +Mitchell +Moises +Molly +Monica +Monna +Montague +Monte +Monty +Morgan +Moses +Muriel +Mya +Mylee +Myles +Myriam +Myrtie +Nadia +Nan +Nancy +Naomi +Nasir +Natalia +Natalie +Nataly +Natasha +Nathan +Nathaniel +Nayeli +Nehemiah +Nelle +Nelson +Nena +Nerissa +Netta +Nettie +Nevaeh +Nia +Nicholas +Nickolas +Nicolas +Nicole +Nikolas +Nina +Noah +Noel +Noelle +Nolan +Nonie +Nora +Norah +Nova +Nowell +Nydia +Nyla +Olive +Oliver +Olivia +Omar +Oralie +Orlando +Osbert +Osborn +Osborne +Oscar +Osmund +Owen +Pablo +Paget +Paige +Paisley +Paola +Paris +Parker +Patience +Patricia +Patrick +Patton +Paul +Pauleen +Paxton +Payton +Pedro +Pene +Penelope +Percival +Peregrine +Perla +Peter +Peyton +Pheobe +Philip +Phillip +Phoebe +Phoenix +Phyliss +Phyllida +Phyllis +Piper +Porsche +Porter +Presley +Preston +Priscilla +Prosper +Prue +Quanah +Quentin +Quiana +Quinn +Quinton +Rachael +Rachel +Raegan +Raelene +Rafael +Rain +Ramon +Randa +Randal +Randy +Rastus +Raul +Raymond +Rayner +Reagan +Rebecca +Rebeckah +Rebekah +Reece +Reed +Reene +Reese +Reid +Renie +Reuben +Rexana +Reynard +Rhetta +Ricardo +Rich +Richard +Richie +Rick +Rickena +Rickey +Rickie +Ricky +Rihanna +Riley +River +Robert +Roberto +Rocco +Rodger +Rodrigo +Roger +Roman +Romayne +Romeo +Ronald +Ronnette +Rosa +Roscoe +Rose +Rosemary +Roswell +Rowan +Roy +Royce +Ruben +Ruby +Rubye +Russell +Rusty +Ruth +Ryan +Ryder +Ryker +Rylan +Rylee +Ryleigh +Rylie +Sabella +Sabrina +Sachie +Sadie +Sage +Sal +Sally +Salvador +Sam +Samantha +Samara +Samuel +Sandra +Santiago +Sara +Sarah +Sarai +Saranna +Sasha +Saul +Savanna +Savannah +Sawyer +Scarlett +Scott +Scotty +Sean +Sebastian +Selena +Seneca +Serena +Serenity +Sergio +Seth +Seymour +Shan +Shana +Shane +Shanika +Shannah +Shannon +Shantae +Sharalyn +Sharla +Shaun +Shawn +Shayla +Shelby +Sheri +Sherie +Sherill +Sherri +Shiloh +Sienna +Sierra +Silas +Simon +Sissy +Skylar +Skyler +Sloan +Sofia +Solomon +Sophia +Sophie +Sorrel +Spencer +Spike +Star +Stella +Steph +Stephanie +Stephany +Stephen +Steven +Sue +Sukie +Summer +Sunshine +Susanna +Susannah +Suzan +Suzy +Sybil +Syd +Sydney +Talia +Talon +Tamika +Tamsin +Tania +Tanner +Tansy +Taryn +Tate +Tatiana +Tatum +Tatyanna +Taylor +Teagan +Tel +Terrell +Terry +Tessa +Theodore +Thomas +Tiffany +Timothy +Titus +Tod +Tolly +Tony +Topaz +Tori +Tracee +Tracey +Travis +Trent +Trenton +Trevor +Trey +Trinity +Tristan +Tristen +Triston +Troy +Tucker +Ty +Tye +Tyler +Tyson +Uland +Ulric +Ulyssa +Uriel +Valary +Valentina +Valeria +Valerie +Vanessa +Vaughn +Verna +Veronica +Victor +Victoria +Vince +Vincent +Vinnie +Violet +Vivian +Viviana +Vivyan +Walker +Walter +Ward +Warner +Wayne +Wendi +Wendy +Wesley +Weston +Whitaker +William +Willow +Willy +Winifred +Wisdom +Woodrow +Woody +Wyatt +Wynonna +Wynter +Xander +Xavier +Ximena +Yahir +Yasmin +Yolanda +Ysabel +Zachariah +Zachary +Zack +Zackary +Zander +Zane +Zayden +Zeke +Zelda +Zion +Zoe +Zoey Zune \ No newline at end of file diff --git a/strings/names/first_female.txt b/strings/names/first_female.txt index 6710c1bfc3..038e936879 100644 --- a/strings/names/first_female.txt +++ b/strings/names/first_female.txt @@ -1,771 +1,771 @@ -Aaliyah -Abby -Abigail -Addison -Addyson -Adeline -Adriana -Adrianna -Aida -Aileen -Ainsley -Alaina -Alana -Alanna -Alayna -Alejandra -Alessandra -Alexa -Alexandra -Alexandria -Alexia -Alexis -Alexus -Alfreda -Alice -Alicia -Alina -Alisa -Alison -Alissa -Alisya -Alivia -Aliyah -Allegra -Allegria -Allie -Allison -Allisson -Allyson -Alma -Alondra -Alysha -Alyson -Alyssa -Alyssia -Amanda -Amari -Amaryllis -Amaya -Amber -Ambrosine -Amelia -Amira -Amiyah -Amy -Amya -Ana -Anahi -Anastasia -Anaya -Andrea -Angel -Angela -Angelica -Angelina -Angie -Aniya -Aniyah -Anjelica -Anna -Annabelle -Anne -Annie -Annika -Anya -April -Arabella -Ariana -Arianna -Ariel -Arielle -Arleen -Ashley -Ashlie -Ashlyn -Ashlynn -Asia -Astor -Athena -Aubree -Aubrey -Aubrie -Audrey -Audrina -Aurora -Autumn -Ava -Avalona -Averill -Avery -Ayla -Bailey -Barbara -Baylee -Beckah -Becky -Bella -Bernice -Bethany -Bethney -Betsy -Bianca -Bidelia -Breanna -Breanne -Brenda -Brenna -Briana -Brianna -Bridget -Brielle -Brittani -Brittany -Brooke -Brooklyn -Brooklynn -Brynn -Cadence -Caitlin -Caitlyn -Calanthia -Caleigh -Cali -Callie -Cameron -Camila -Camille -Camryn -Candace -Candice -Cara -Carly -Carlyle -Carmen -Carolina -Caroline -Carolyn -Carry -Caryl -Casey -Cassandra -Cassidy -Catherine -Cecilia -Cecily -Celeste -Charlotte -Chelsea -Cherette -Cheri -Cherry -Cheyanne -Cheyenne -Chloe -Christa -Christiana -Christina -Christobelle -Ciara -Cindy -Claire -Clara -Claribel -Claudia -Clover -Cora -Coreen -Corrine -Courtney -Crystal -Cynthia -Daisy -Dakota -Dalya -Dana -Danica -Daniela -Daniella -Danielle -Danika -Danna -Daria -Dayana -Dayna -Debbi -Dee -Deena -Delaney -Delilah -Della -Delma -Denise -Denys -Desiree -Destiny -Diamond -Diana -Dina -Dolores -Donella -Donna -Dorothy -Dortha -Dulce -Easter -Ebba -Eden -Effie -Elaina -Eleanor -Elena -Eliana -Elise -Eliza -Elizabeth -Ella -Elle -Ellie -Emely -Emerson -Emery -Emilee -Emilia -Emily -Emma -Erica -Erika -Erin -Ermintrude -Esmeralda -Esther -Estrella -Eugenia -Euphemia -Eustace -Eva -Evangeline -Eveleen -Evelina -Evelyn -Faith -Fatima -Fay -Fernanda -Fiona -Floella -Flora -Flossie -Fortune -Francesca -Gabriela -Gabriella -Gabrielle -Genette -Genevieve -Georgene -Georgia -Geraldine -Gervase -Gianna -Gina -Ginger -Giselle -Gladwyn -Glenna -Gloria -Grace -Gracie -Greta -Griselda -Guadalupe -Gwenda -Gwenevere -Hadley -Haidee -Hailee -Hailey -Hal -Haleigh -Haley -Hanna -Hannah -Harley -Harmony -Harper -Hayden -Haylee -Hayley -Haylie -Hazel -Heather -Heaven -Hedley -Heidi -Helen -Hepsie -Holly -Hope -Hortensia -Iantha -Ileen -Imani -Innocent -Irene -Iris -Isabel -Isabella -Isabelle -Itzel -Ivy -Izabella -Jacaline -Jacqueline -Jacquetta -Jacqui -Jada -Jade -Jaden -Jadyn -Jaelyn -Jakki -Jalen -Jamie -Jane -Janelle -Janette -Janie -Janina -Janine -Janiya -Janiyah -Jaslene -Jasmin -Jasmine -Jayda -Jayden -Jayla -Jaylee -Jaynie -Jazlyn -Jazmin -Jazmine -Jeanna -Jeannie -Jeannine -Jenifer -Jenna -Jennie -Jennifer -Jera -Jere -Jeri -Jessica -Jillian -Jillie -Jimena -Joanna -Jocelyn -Joetta -Johanna -Joi -Joni -Jordan -Jordyn -Joselyn -Josepha -Josephine -Josie -Joye -Julia -Juliana -Julianna -Julie -Juliet -Julissa -July -Kadence -Kaelea -Kaelyn -Kailey -Kailyn -Kaitlin -Kaitlyn -Kaleigh -Kamryn -Kara -Karen -Karenza -Karina -Karla -Karly -Karyn -Kassidy -Kat -Kate -Katelyn -Katelynn -Katherine -Kathleen -Kathryn -Kathy -Katie -Katlyn -Kayden -Kaydence -Kayla -Kaylee -Kayleigh -Kaylie -Kaylin -Keegan -Keira -Keith -Kellie -Kelly -Kelsey -Kendall -Kendra -Kennedy -Kenzie -Kerena -Kerensa -Keturah -Khloe -Kiana -Kiara -Kiera -Kiley -Kimberley -Kimberly -Kimora -Kira -Kristen -Kristina -Kyla -Kylee -Kyleigh -Kylie -Kyra -Lacey -Lacy -Laila -Lakeisha -Lalla -Lana -Latanya -Laura -Lauren -Laurencia -Laurissa -Lauryn -Layla -Leah -Leeann -Leia -Leila -Leilani -Lena -Leslie -Lesly -Lessie -Leta -Lexi -Lexia -Lexus -Lia -Lila -Lilah -Lilian -Liliana -Lillian -Lilliana -Lillie -Lilly -Lily -Lindsay -Lindsey -Lindsie -Lindy -Lizbeth -Lockie -Logan -Lola -London -Lori -Lorin -Luanne -Lucia -Lucian -Lucy -Luna -Luvenia -Lydia -Lyla -Lyndsey -Lynn -Lynsey -Lynwood -Lyric -Mabelle -Macey -Macie -Mackenzie -Macy -Madalyn -Maddison -Madeleine -Madeline -Madelyn -Madelynn -Madilyn -Madison -Madisyn -Madyson -Maegan -Maggie -Makayla -Makenna -Makenzie -Malia -Mallory -Marcia -Marely -Margaret -Maria -Mariabella -Mariah -Mariana -Marilene -Marion -Marisol -Marissa -Marje -Marjory -Marlee -Marley -Marlowe -Marlyn -Marshall -Mary -Maryann -Maudie -Maurene -May -Maya -Mckenna -Mckenzie -Megan -Meghan -Melanie -Melany -Melissa -Melody -Meredith -Merideth -Merrilyn -Meryl -Mia -Michaela -Michelle -Mikayla -Miley -Minnie -Miracle -Miranda -Miriam -Molly -Monica -Monna -Morgan -Muriel -Mya -Mylee -Myriam -Myrtie -Nadia -Nan -Nancy -Naomi -Natalia -Natalie -Nataly -Natasha -Nayeli -Nelle -Nena -Nerissa -Netta -Nettie -Nevaeh -Nia -Nicole -Nina -Noelle -Nonie -Nora -Norah -Nova -Nowell -Nydia -Nyla -Olive -Olivia -Oralie -Paige -Paisley -Paola -Paris -Patience -Patricia -Pauleen -Payton -Pene -Penelope -Peregrine -Perla -Peyton -Pheobe -Phoebe -Phyliss -Phyllida -Phyllis -Piper -Porsche -Presley -Priscilla -Prosper -Prue -Quanah -Quiana -Rachael -Rachel -Raegan -Raelene -Rain -Randa -Randal -Reagan -Rebecca -Rebeckah -Rebekah -Reene -Reese -Renie -Rexana -Rhetta -Rihanna -Riley -Ronnette -Rosa -Rose -Rosemary -Rowan -Ruby -Rubye -Ruth -Rylee -Ryleigh -Rylie -Sabella -Sabrina -Sachie -Sadie -Sage -Sally -Samantha -Samara -Sandra -Sara -Sarah -Sarai -Saranna -Sasha -Savanna -Savannah -Scarlett -Selena -Seneca -Serena -Serenity -Shana -Shanika -Shannah -Shannon -Shantae -Sharalyn -Sharla -Shayla -Shelby -Sheri -Sherie -Sherill -Sherri -Sienna -Sierra -Sissy -Skylar -Skyler -Sofia -Sophia -Sophie -Star -Stella -Steph -Stephanie -Stephany -Sue -Sukie -Summer -Sunshine -Susanna -Susannah -Suzan -Suzy -Sydney -Talia -Tamika -Tania -Tansy -Taryn -Tatiana -Tatum -Tatyanna -Taylor -Teagan -Tessa -Tiffany -Tolly -Topaz -Tori -Tracee -Tracey -Trinity -Ulyssa -Valary -Valentina -Valeria -Valerie -Vanessa -Verna -Veronica -Victoria -Vinnie -Violet -Vivian -Viviana -Vivyan -Wendi -Wendy -Willow -Wisdom -Wynonna -Wynter -Ximena -Yasmin -Yolanda -Ysabel -Zelda -Zoe -Zoey +Aaliyah +Abby +Abigail +Addison +Addyson +Adeline +Adriana +Adrianna +Aida +Aileen +Ainsley +Alaina +Alana +Alanna +Alayna +Alejandra +Alessandra +Alexa +Alexandra +Alexandria +Alexia +Alexis +Alexus +Alfreda +Alice +Alicia +Alina +Alisa +Alison +Alissa +Alisya +Alivia +Aliyah +Allegra +Allegria +Allie +Allison +Allisson +Allyson +Alma +Alondra +Alysha +Alyson +Alyssa +Alyssia +Amanda +Amari +Amaryllis +Amaya +Amber +Ambrosine +Amelia +Amira +Amiyah +Amy +Amya +Ana +Anahi +Anastasia +Anaya +Andrea +Angel +Angela +Angelica +Angelina +Angie +Aniya +Aniyah +Anjelica +Anna +Annabelle +Anne +Annie +Annika +Anya +April +Arabella +Ariana +Arianna +Ariel +Arielle +Arleen +Ashley +Ashlie +Ashlyn +Ashlynn +Asia +Astor +Athena +Aubree +Aubrey +Aubrie +Audrey +Audrina +Aurora +Autumn +Ava +Avalona +Averill +Avery +Ayla +Bailey +Barbara +Baylee +Beckah +Becky +Bella +Bernice +Bethany +Bethney +Betsy +Bianca +Bidelia +Breanna +Breanne +Brenda +Brenna +Briana +Brianna +Bridget +Brielle +Brittani +Brittany +Brooke +Brooklyn +Brooklynn +Brynn +Cadence +Caitlin +Caitlyn +Calanthia +Caleigh +Cali +Callie +Cameron +Camila +Camille +Camryn +Candace +Candice +Cara +Carly +Carlyle +Carmen +Carolina +Caroline +Carolyn +Carry +Caryl +Casey +Cassandra +Cassidy +Catherine +Cecilia +Cecily +Celeste +Charlotte +Chelsea +Cherette +Cheri +Cherry +Cheyanne +Cheyenne +Chloe +Christa +Christiana +Christina +Christobelle +Ciara +Cindy +Claire +Clara +Claribel +Claudia +Clover +Cora +Coreen +Corrine +Courtney +Crystal +Cynthia +Daisy +Dakota +Dalya +Dana +Danica +Daniela +Daniella +Danielle +Danika +Danna +Daria +Dayana +Dayna +Debbi +Dee +Deena +Delaney +Delilah +Della +Delma +Denise +Denys +Desiree +Destiny +Diamond +Diana +Dina +Dolores +Donella +Donna +Dorothy +Dortha +Dulce +Easter +Ebba +Eden +Effie +Elaina +Eleanor +Elena +Eliana +Elise +Eliza +Elizabeth +Ella +Elle +Ellie +Emely +Emerson +Emery +Emilee +Emilia +Emily +Emma +Erica +Erika +Erin +Ermintrude +Esmeralda +Esther +Estrella +Eugenia +Euphemia +Eustace +Eva +Evangeline +Eveleen +Evelina +Evelyn +Faith +Fatima +Fay +Fernanda +Fiona +Floella +Flora +Flossie +Fortune +Francesca +Gabriela +Gabriella +Gabrielle +Genette +Genevieve +Georgene +Georgia +Geraldine +Gervase +Gianna +Gina +Ginger +Giselle +Gladwyn +Glenna +Gloria +Grace +Gracie +Greta +Griselda +Guadalupe +Gwenda +Gwenevere +Hadley +Haidee +Hailee +Hailey +Hal +Haleigh +Haley +Hanna +Hannah +Harley +Harmony +Harper +Hayden +Haylee +Hayley +Haylie +Hazel +Heather +Heaven +Hedley +Heidi +Helen +Hepsie +Holly +Hope +Hortensia +Iantha +Ileen +Imani +Innocent +Irene +Iris +Isabel +Isabella +Isabelle +Itzel +Ivy +Izabella +Jacaline +Jacqueline +Jacquetta +Jacqui +Jada +Jade +Jaden +Jadyn +Jaelyn +Jakki +Jalen +Jamie +Jane +Janelle +Janette +Janie +Janina +Janine +Janiya +Janiyah +Jaslene +Jasmin +Jasmine +Jayda +Jayden +Jayla +Jaylee +Jaynie +Jazlyn +Jazmin +Jazmine +Jeanna +Jeannie +Jeannine +Jenifer +Jenna +Jennie +Jennifer +Jera +Jere +Jeri +Jessica +Jillian +Jillie +Jimena +Joanna +Jocelyn +Joetta +Johanna +Joi +Joni +Jordan +Jordyn +Joselyn +Josepha +Josephine +Josie +Joye +Julia +Juliana +Julianna +Julie +Juliet +Julissa +July +Kadence +Kaelea +Kaelyn +Kailey +Kailyn +Kaitlin +Kaitlyn +Kaleigh +Kamryn +Kara +Karen +Karenza +Karina +Karla +Karly +Karyn +Kassidy +Kat +Kate +Katelyn +Katelynn +Katherine +Kathleen +Kathryn +Kathy +Katie +Katlyn +Kayden +Kaydence +Kayla +Kaylee +Kayleigh +Kaylie +Kaylin +Keegan +Keira +Keith +Kellie +Kelly +Kelsey +Kendall +Kendra +Kennedy +Kenzie +Kerena +Kerensa +Keturah +Khloe +Kiana +Kiara +Kiera +Kiley +Kimberley +Kimberly +Kimora +Kira +Kristen +Kristina +Kyla +Kylee +Kyleigh +Kylie +Kyra +Lacey +Lacy +Laila +Lakeisha +Lalla +Lana +Latanya +Laura +Lauren +Laurencia +Laurissa +Lauryn +Layla +Leah +Leeann +Leia +Leila +Leilani +Lena +Leslie +Lesly +Lessie +Leta +Lexi +Lexia +Lexus +Lia +Lila +Lilah +Lilian +Liliana +Lillian +Lilliana +Lillie +Lilly +Lily +Lindsay +Lindsey +Lindsie +Lindy +Lizbeth +Lockie +Logan +Lola +London +Lori +Lorin +Luanne +Lucia +Lucian +Lucy +Luna +Luvenia +Lydia +Lyla +Lyndsey +Lynn +Lynsey +Lynwood +Lyric +Mabelle +Macey +Macie +Mackenzie +Macy +Madalyn +Maddison +Madeleine +Madeline +Madelyn +Madelynn +Madilyn +Madison +Madisyn +Madyson +Maegan +Maggie +Makayla +Makenna +Makenzie +Malia +Mallory +Marcia +Marely +Margaret +Maria +Mariabella +Mariah +Mariana +Marilene +Marion +Marisol +Marissa +Marje +Marjory +Marlee +Marley +Marlowe +Marlyn +Marshall +Mary +Maryann +Maudie +Maurene +May +Maya +Mckenna +Mckenzie +Megan +Meghan +Melanie +Melany +Melissa +Melody +Meredith +Merideth +Merrilyn +Meryl +Mia +Michaela +Michelle +Mikayla +Miley +Minnie +Miracle +Miranda +Miriam +Molly +Monica +Monna +Morgan +Muriel +Mya +Mylee +Myriam +Myrtie +Nadia +Nan +Nancy +Naomi +Natalia +Natalie +Nataly +Natasha +Nayeli +Nelle +Nena +Nerissa +Netta +Nettie +Nevaeh +Nia +Nicole +Nina +Noelle +Nonie +Nora +Norah +Nova +Nowell +Nydia +Nyla +Olive +Olivia +Oralie +Paige +Paisley +Paola +Paris +Patience +Patricia +Pauleen +Payton +Pene +Penelope +Peregrine +Perla +Peyton +Pheobe +Phoebe +Phyliss +Phyllida +Phyllis +Piper +Porsche +Presley +Priscilla +Prosper +Prue +Quanah +Quiana +Rachael +Rachel +Raegan +Raelene +Rain +Randa +Randal +Reagan +Rebecca +Rebeckah +Rebekah +Reene +Reese +Renie +Rexana +Rhetta +Rihanna +Riley +Ronnette +Rosa +Rose +Rosemary +Rowan +Ruby +Rubye +Ruth +Rylee +Ryleigh +Rylie +Sabella +Sabrina +Sachie +Sadie +Sage +Sally +Samantha +Samara +Sandra +Sara +Sarah +Sarai +Saranna +Sasha +Savanna +Savannah +Scarlett +Selena +Seneca +Serena +Serenity +Shana +Shanika +Shannah +Shannon +Shantae +Sharalyn +Sharla +Shayla +Shelby +Sheri +Sherie +Sherill +Sherri +Sienna +Sierra +Sissy +Skylar +Skyler +Sofia +Sophia +Sophie +Star +Stella +Steph +Stephanie +Stephany +Sue +Sukie +Summer +Sunshine +Susanna +Susannah +Suzan +Suzy +Sydney +Talia +Tamika +Tania +Tansy +Taryn +Tatiana +Tatum +Tatyanna +Taylor +Teagan +Tessa +Tiffany +Tolly +Topaz +Tori +Tracee +Tracey +Trinity +Ulyssa +Valary +Valentina +Valeria +Valerie +Vanessa +Verna +Veronica +Victoria +Vinnie +Violet +Vivian +Viviana +Vivyan +Wendi +Wendy +Willow +Wisdom +Wynonna +Wynter +Ximena +Yasmin +Yolanda +Ysabel +Zelda +Zoe +Zoey Zune \ No newline at end of file diff --git a/strings/names/first_male.txt b/strings/names/first_male.txt index b86722dbaf..928958d1a9 100644 --- a/strings/names/first_male.txt +++ b/strings/names/first_male.txt @@ -1,668 +1,668 @@ -Aaden -Aaron -Abel -Abraham -Adam -Adan -Aden -Adolph -Adrian -Aidan -Aiden -Alan -Albert -Alberto -Alden -Alec -Alejandro -Alex -Alexander -Alexis -Alfred -Alfredo -Alger -Ali -Alijah -Allen -Alvin -Amari -Amir -Amos -Anderson -Andre -Andres -Andrew -Andy -Angel -Angelo -Anthony -Antonio -Apple -Archie -Armando -Arnie -Art -Arthur -Arturo -Asher -Ashton -August -Austin -Avery -Axel -Ayden -Baldric -Bartholomew -Beau -Beckett -Benjamin -Bennett -Bill -Blake -Braden -Bradley -Brady -Braeden -Braiden -Brandon -Braxton -Brayan -Brayden -Braydon -Braylon -Brendan -Brenden -Brennan -Brett -Brian -Brick -Brock -Brodie -Brody -Bronte -Bruce -Bryan -Bryant -Bryce -Brycen -Bryson -Buck -Burt -Butch -Byrne -Byron -Cade -Caden -Caiden -Caleb -Calvin -Camden -Cameron -Camron -Camryn -Carl -Carlos -Carson -Carter -Casey -Cash -Casimir -Cassian -Cayden -Cesar -Chad -Chance -Chandler -Charles -Charlie -Charlton -Chase -Chip -Chris -Christian -Christopher -Clark -Claudius -Clayton -Clement -Cletus -Cleveland -Cliff -Clinton -Cody -Cohen -Colby -Cole -Colin -Collin -Colten -Colton -Conner -Connor -Cooper -Corbin -Corey -Cory -Cristian -Cristopher -Crush -Cruz -Curtis -Cy -Dakota -Dallas -Dalton -Damian -Damien -Damon -Dane -Daniel -Danny -Dante -Darcey -Darell -Darin -Darius -Darren -David -Davion -Davis -Dawson -Dayton -Dean -Deandre -Deangelo -Declan -Denholm -Dennis -Derek -Derrick -Desmond -Devin -Devon -Diego -Dillon -Dirk -Dominic -Dominick -Donald -Donny -Donovan -Douglas -Drake -Drew -Driscoll -Duke -Duncan -Dustin -Dylan -Easton -Eddie -Edgar -Eduardo -Edward -Edwin -Eli -Elias -Elijah -Eliot -Eliott -Elliot -Elliott -Elric -Elwood -Emanuel -Emerson -Emiliano -Emilio -Emmanuel -Enrique -Eric -Erick -Erik -Ernesto -Esteban -Ethan -Evan -Everett -Ezekiel -Ezra -Fabian -Felix -Fenton -Fernando -Finn -Fitz -Flick -Flint -Flip -Francis -Francisco -Frank -Frankie -Franklin -Fridge -Fulton -Gabriel -Gael -Gage -Gannon -Garret -Garrett -Gary -Gavin -George -Gerardo -Giovanni -Goddard -Godwin -Goodwin -Gordon -Grady -Graeme -Graham -Grandpa -Grant -Gratian -Grayson -Gregory -Grendel -Greyson -Griffin -Guillermo -Gunner -Gustavo -Han -Harrison -Harry -Hartley -Harvey -Hayden -Hector -Henderson -Henry -Holden -Homer -Horatio -Hudson -Huffie -Hugo -Hungry -Hunter -Ian -Irvine -Isaac -Isaiah -Isaias -Isiah -Ismael -Israel -Issac -Ivan -Izaiah -Jace -Jack -Jackson -Jacob -Jacoby -Jaden -Jadon -Jaiden -Jaime -Jake -Jakob -Jalen -Jamar -Jamari -Jamarion -James -Jameson -Jamie -Jamison -Janel -Jared -Jason -Jasper -Javier -Javon -Jaxon -Jaxson -Jay -Jayce -Jayden -Jaydon -Jaye -Jaylen -Jayne -Jayson -Jean-Luc -Jeb -Jed -Jeffrey -Jemmy -Jeremiah -Jeremy -Jermaine -Jerrie -Jerry -Jesse -Jesus -Jim -Jimmy -Joachim -Joaquin -Joe -Joel -Joey -Johan -John -Johnathan -Johnny -Jonah -Jonas -Jonathan -Jonathon -Jordan -Jorge -Jose -Joseph -Josh -Joshua -Josiah -Josue -Juan -Judah -Jude -Julian -Julio -Julius -Justice -Justin -Kade -Kaden -Kai -Kaiden -Kale -Kaleb -Kameron -Kane -Karson -Kayden -Keagan -Keaton -Keegan -Keith -Kellen -Kelvin -Kennard -Kenneth -Kevin -Keziah -Khalil -Kingston -Kobe -Kolton -Kristopher -Kyle -Kyler -Lance -Landen -Lando -Landon -Landyn -Lane -Lanny -Larry -Launce -Lawrence -Leland -Lennox -Lenny -Leo -Leonard -Leonardo -Leonel -Leroy -Levi -Liam -Lief -Lincoln -Linden -Linton -Logan -Lorde -Lorenzo -Loreto -Lou -Louis -Luca -Lucas -Luis -Lukas -Luke -Maddox -Malachi -Malcolm -Malik -Manley -Manuel -Marc -Marco -Marcos -Marcus -Mario -Marion -Mark -Marshall -Martin -Marvin -Mason -Mateo -Mathew -Matthew -Maurice -Mauricio -Max -Maximilian -Maximus -Maxwell -Maynard -Mekhi -Melvin -Melvyn -Micah -Michael -Micheal -Miguel -Mike -Miles -Milo -Milton -Mitchell -Moises -Montague -Monte -Monty -Morgan -Moses -Myles -Nasir -Nat -Nathan -Nathaniel -Nehemiah -Nelson -Nicholas -Nick -Nickolas -Nicolas -Nikolas -Noah -Noel -Nolan -Oliver -Omar -Opie -Orlando -Osbert -Osborn -Osborne -Oscar -Osmund -Oswald -Owen -Pablo -Paget -Parker -Patrick -Patton -Paul -Paxton -Payton -Pedro -Percival -Persh -Peter -Peyton -Philip -Phillip -Phoenix -Porter -Preston -Quentin -Quinn -Quinton -Rafael -Ramon -Randy -Rastus -Raul -Raymond -Rayner -Reece -Reed -Reese -Reid -Reuben -Reynard -Ricardo -Richard -Ricky -Riley -River -Robert -Roberto -Rocco -Rodger -Rodrigo -Roger -Roman -Romayne -Romeo -Ronald -Roscoe -Roswell -Rowan -Roy -Royce -Rube -Ruben -Russell -Rusty -Ryan -Ryder -Ryker -Rylan -Sal -Salvador -Sam -Samuel -Santiago -Saul -Sawyer -Scott -Scotty -Sean -Sebastian -Sergio -Seth -Seymour -Shane -Shaun -Shawn -Shiloh -Silas -Simon -Skyler -Sloan -Smoke -Solomon -Sorrel -Spencer -Spike -Stephen -Steven -Sybil -Syd -Talon -Tamsin -Tanner -Tate -Taylor -Tel -Terrell -Terry -Theodore -Thomas -Tim -Timothy -Titus -Todd -Tony -Travis -Trent -Trenton -Trevor -Trey -Trip -Tristan -Tristen -Triston -Troy -Tucker -Ty -Tye -Tyler -Tyson -Uland -Ulric -Uriel -Vaughn -Victor -Vince -Vincent -Vinny -Walker -Walter -Ward -Warner -Wayne -Wesley -Weston -Whitaker -William -Willy -Woodrow -Wyatt -Xander -Xavier -Yahir -Zachariah -Zachary -Zack -Zackary -Zander -Zane -Zayden -Zeke +Aaden +Aaron +Abel +Abraham +Adam +Adan +Aden +Adolph +Adrian +Aidan +Aiden +Alan +Albert +Alberto +Alden +Alec +Alejandro +Alex +Alexander +Alexis +Alfred +Alfredo +Alger +Ali +Alijah +Allen +Alvin +Amari +Amir +Amos +Anderson +Andre +Andres +Andrew +Andy +Angel +Angelo +Anthony +Antonio +Apple +Archie +Armando +Arnie +Art +Arthur +Arturo +Asher +Ashton +August +Austin +Avery +Axel +Ayden +Baldric +Bartholomew +Beau +Beckett +Benjamin +Bennett +Bill +Blake +Braden +Bradley +Brady +Braeden +Braiden +Brandon +Braxton +Brayan +Brayden +Braydon +Braylon +Brendan +Brenden +Brennan +Brett +Brian +Brick +Brock +Brodie +Brody +Bronte +Bruce +Bryan +Bryant +Bryce +Brycen +Bryson +Buck +Burt +Butch +Byrne +Byron +Cade +Caden +Caiden +Caleb +Calvin +Camden +Cameron +Camron +Camryn +Carl +Carlos +Carson +Carter +Casey +Cash +Casimir +Cassian +Cayden +Cesar +Chad +Chance +Chandler +Charles +Charlie +Charlton +Chase +Chip +Chris +Christian +Christopher +Clark +Claudius +Clayton +Clement +Cletus +Cleveland +Cliff +Clinton +Cody +Cohen +Colby +Cole +Colin +Collin +Colten +Colton +Conner +Connor +Cooper +Corbin +Corey +Cory +Cristian +Cristopher +Crush +Cruz +Curtis +Cy +Dakota +Dallas +Dalton +Damian +Damien +Damon +Dane +Daniel +Danny +Dante +Darcey +Darell +Darin +Darius +Darren +David +Davion +Davis +Dawson +Dayton +Dean +Deandre +Deangelo +Declan +Denholm +Dennis +Derek +Derrick +Desmond +Devin +Devon +Diego +Dillon +Dirk +Dominic +Dominick +Donald +Donny +Donovan +Douglas +Drake +Drew +Driscoll +Duke +Duncan +Dustin +Dylan +Easton +Eddie +Edgar +Eduardo +Edward +Edwin +Eli +Elias +Elijah +Eliot +Eliott +Elliot +Elliott +Elric +Elwood +Emanuel +Emerson +Emiliano +Emilio +Emmanuel +Enrique +Eric +Erick +Erik +Ernesto +Esteban +Ethan +Evan +Everett +Ezekiel +Ezra +Fabian +Felix +Fenton +Fernando +Finn +Fitz +Flick +Flint +Flip +Francis +Francisco +Frank +Frankie +Franklin +Fridge +Fulton +Gabriel +Gael +Gage +Gannon +Garret +Garrett +Gary +Gavin +George +Gerardo +Giovanni +Goddard +Godwin +Goodwin +Gordon +Grady +Graeme +Graham +Grandpa +Grant +Gratian +Grayson +Gregory +Grendel +Greyson +Griffin +Guillermo +Gunner +Gustavo +Han +Harrison +Harry +Hartley +Harvey +Hayden +Hector +Henderson +Henry +Holden +Homer +Horatio +Hudson +Huffie +Hugo +Hungry +Hunter +Ian +Irvine +Isaac +Isaiah +Isaias +Isiah +Ismael +Israel +Issac +Ivan +Izaiah +Jace +Jack +Jackson +Jacob +Jacoby +Jaden +Jadon +Jaiden +Jaime +Jake +Jakob +Jalen +Jamar +Jamari +Jamarion +James +Jameson +Jamie +Jamison +Janel +Jared +Jason +Jasper +Javier +Javon +Jaxon +Jaxson +Jay +Jayce +Jayden +Jaydon +Jaye +Jaylen +Jayne +Jayson +Jean-Luc +Jeb +Jed +Jeffrey +Jemmy +Jeremiah +Jeremy +Jermaine +Jerrie +Jerry +Jesse +Jesus +Jim +Jimmy +Joachim +Joaquin +Joe +Joel +Joey +Johan +John +Johnathan +Johnny +Jonah +Jonas +Jonathan +Jonathon +Jordan +Jorge +Jose +Joseph +Josh +Joshua +Josiah +Josue +Juan +Judah +Jude +Julian +Julio +Julius +Justice +Justin +Kade +Kaden +Kai +Kaiden +Kale +Kaleb +Kameron +Kane +Karson +Kayden +Keagan +Keaton +Keegan +Keith +Kellen +Kelvin +Kennard +Kenneth +Kevin +Keziah +Khalil +Kingston +Kobe +Kolton +Kristopher +Kyle +Kyler +Lance +Landen +Lando +Landon +Landyn +Lane +Lanny +Larry +Launce +Lawrence +Leland +Lennox +Lenny +Leo +Leonard +Leonardo +Leonel +Leroy +Levi +Liam +Lief +Lincoln +Linden +Linton +Logan +Lorde +Lorenzo +Loreto +Lou +Louis +Luca +Lucas +Luis +Lukas +Luke +Maddox +Malachi +Malcolm +Malik +Manley +Manuel +Marc +Marco +Marcos +Marcus +Mario +Marion +Mark +Marshall +Martin +Marvin +Mason +Mateo +Mathew +Matthew +Maurice +Mauricio +Max +Maximilian +Maximus +Maxwell +Maynard +Mekhi +Melvin +Melvyn +Micah +Michael +Micheal +Miguel +Mike +Miles +Milo +Milton +Mitchell +Moises +Montague +Monte +Monty +Morgan +Moses +Myles +Nasir +Nat +Nathan +Nathaniel +Nehemiah +Nelson +Nicholas +Nick +Nickolas +Nicolas +Nikolas +Noah +Noel +Nolan +Oliver +Omar +Opie +Orlando +Osbert +Osborn +Osborne +Oscar +Osmund +Oswald +Owen +Pablo +Paget +Parker +Patrick +Patton +Paul +Paxton +Payton +Pedro +Percival +Persh +Peter +Peyton +Philip +Phillip +Phoenix +Porter +Preston +Quentin +Quinn +Quinton +Rafael +Ramon +Randy +Rastus +Raul +Raymond +Rayner +Reece +Reed +Reese +Reid +Reuben +Reynard +Ricardo +Richard +Ricky +Riley +River +Robert +Roberto +Rocco +Rodger +Rodrigo +Roger +Roman +Romayne +Romeo +Ronald +Roscoe +Roswell +Rowan +Roy +Royce +Rube +Ruben +Russell +Rusty +Ryan +Ryder +Ryker +Rylan +Sal +Salvador +Sam +Samuel +Santiago +Saul +Sawyer +Scott +Scotty +Sean +Sebastian +Sergio +Seth +Seymour +Shane +Shaun +Shawn +Shiloh +Silas +Simon +Skyler +Sloan +Smoke +Solomon +Sorrel +Spencer +Spike +Stephen +Steven +Sybil +Syd +Talon +Tamsin +Tanner +Tate +Taylor +Tel +Terrell +Terry +Theodore +Thomas +Tim +Timothy +Titus +Todd +Tony +Travis +Trent +Trenton +Trevor +Trey +Trip +Tristan +Tristen +Triston +Troy +Tucker +Ty +Tye +Tyler +Tyson +Uland +Ulric +Uriel +Vaughn +Victor +Vince +Vincent +Vinny +Walker +Walter +Ward +Warner +Wayne +Wesley +Weston +Whitaker +William +Willy +Woodrow +Wyatt +Xander +Xavier +Yahir +Zachariah +Zachary +Zack +Zackary +Zander +Zane +Zayden +Zeke Zion \ No newline at end of file diff --git a/strings/names/golem.txt b/strings/names/golem.txt index a26da78b04..7cfcefa899 100644 --- a/strings/names/golem.txt +++ b/strings/names/golem.txt @@ -1,157 +1,157 @@ -Ablation -Alabaster -Alunite -Andesite -Anyhdrite -Basalt -Basin -Bauxite -Bedrock -Bismuth -Bismuthinite -Bituminous Coal -Borax -Boulder -Brimstone -Brittle -Calcite -Cassiterite -Cenozoic -Chalk -Chasm -Cheridite -Chert -Chromite -Cinnabar -Claystone -Coast -Cobaltite -Column -Conglomerate -Core -Crevasse -Crust -Cryolite -Crystal -Dacite -Diorite -Dolomite -Dolostone -Dragonforce -Earthflow -Epoch -Eutrophication -Fault -Flint -Foliation -Foreshock -Fossil -Gabbro -Galena -Garnierite -Geode -Geoge -Gneiss -Granite -Graphite -Gravel -Groove -Grotto -Gypsum -Hematite -Hornblende -Humus -Igneous -Ilmenite -Iron -Island -Jasper -Jet -Kaolinite -Kettle -Kimberlite -Komatiite -Landslide -Levee -Lignite -Limestone -Limonite -Luster -Madidite -Magnetite -Magnitude -Malachite -Mantle -Marble -Marcasite -Melange -Meme -Mica -Microcline -Migmatite -Mineral -Mountain -Mudstone -Obsidian -Olivine -Ore -Orpiment -Orthoclase -Outwash -Oxbow Lake -Oynx -Pahoehoe -Pebble -Pegmatite -Periclase -Petrified Wood -Phyllite -Pitchblende -Plate -Pothole -Puddingstone -Pyrite -Pyrolusite -Quake -Quarry -Quartz -Quartzite -Realgar -Reservoir -Rhyolite -Rock -Rock Salt -Rockfall -Rutile -Saltpeter -Sand -Sandstone -Satinspar -Schist -Sediment -Seismic -Selenite -Serpentine -Shale -Shore -Siltstone -Slag -Slate -Sphalerite -Stack -Stalactite -Stalagmite -Stibnite -Stone -Stress -Subduction -Sylvite -Talc -Tetrahedrite -Tidal -Trench -Valley -Volcano -Xenolith -Yardang -Zone +Ablation +Alabaster +Alunite +Andesite +Anyhdrite +Basalt +Basin +Bauxite +Bedrock +Bismuth +Bismuthinite +Bituminous Coal +Borax +Boulder +Brimstone +Brittle +Calcite +Cassiterite +Cenozoic +Chalk +Chasm +Cheridite +Chert +Chromite +Cinnabar +Claystone +Coast +Cobaltite +Column +Conglomerate +Core +Crevasse +Crust +Cryolite +Crystal +Dacite +Diorite +Dolomite +Dolostone +Dragonforce +Earthflow +Epoch +Eutrophication +Fault +Flint +Foliation +Foreshock +Fossil +Gabbro +Galena +Garnierite +Geode +Geoge +Gneiss +Granite +Graphite +Gravel +Groove +Grotto +Gypsum +Hematite +Hornblende +Humus +Igneous +Ilmenite +Iron +Island +Jasper +Jet +Kaolinite +Kettle +Kimberlite +Komatiite +Landslide +Levee +Lignite +Limestone +Limonite +Luster +Madidite +Magnetite +Magnitude +Malachite +Mantle +Marble +Marcasite +Melange +Meme +Mica +Microcline +Migmatite +Mineral +Mountain +Mudstone +Obsidian +Olivine +Ore +Orpiment +Orthoclase +Outwash +Oxbow Lake +Oynx +Pahoehoe +Pebble +Pegmatite +Periclase +Petrified Wood +Phyllite +Pitchblende +Plate +Pothole +Puddingstone +Pyrite +Pyrolusite +Quake +Quarry +Quartz +Quartzite +Realgar +Reservoir +Rhyolite +Rock +Rock Salt +Rockfall +Rutile +Saltpeter +Sand +Sandstone +Satinspar +Schist +Sediment +Seismic +Selenite +Serpentine +Shale +Shore +Siltstone +Slag +Slate +Sphalerite +Stack +Stalactite +Stalagmite +Stibnite +Stone +Stress +Subduction +Sylvite +Talc +Tetrahedrite +Tidal +Trench +Valley +Volcano +Xenolith +Yardang +Zone diff --git a/strings/names/last.txt b/strings/names/last.txt index b9769055e3..6796c7519e 100644 --- a/strings/names/last.txt +++ b/strings/names/last.txt @@ -1,570 +1,570 @@ -Ackerley -Adams -Addison -Agg -Aggley -Ahmed -Albright -Alekseev -Ali -Alice -Allen -Alliman -Altmann -Anderson -Andreev -Ann -Archibald -Armstrong -Ashbaugh -Atkinson -Atweeke -Aultman -Auman -Baer -Bailey -Baker -Barnes -Barrett -Bash -Bashline -Basinger -Baskett -Basmanoff -Batten -Baum -Baxter -Beach -Beail -Beck -Beedell -Begum -Bell -Benford -Bennett -Berkheimer -Best -Bickerson -Bicknell -Biery -Black -Blackburn -Blaine -Blessig -Bloise -Bluetenberger -Blyant -Bode -Bould -Bousum -Bowchiew -Boyer -Brandenburg -Bratton -Braun -Briggs -Brindle -Briner -Brinigh -Brooks -Brown -Bullard -Bunten -Burkett -Burns -Burris -Butterfill -Buttersworth -Buzzard -Byers -Bynum -Caldwell -Callison -Camp -Campbell -Carmichael -Carr -Carter -Catherina -Catleay -Cavalet -Chapman -Chauvin -Cherry -Christman -Christopher -Clark -Clarke -Clewett -Coates -Coldsmith -Collins -Compton -Conrad -Cook -Cooper -Costello -Cowart -Cowper -Cox -Cressman -Curry -Cypret -David -Davies -Davis -Dawkins -Day -Dean -Demuth -Dennis -Dickinson -Digson -Dimeling -Donkin -Draudy -Driggers -Dryfus -Dugmore -Duncan -Durstine -Earl -Easter -Echard -Eckhardstein -Edwards -Eggbert -Ehret -Elderson -Eliza -Elliott -Ellis -Enderly -Endsley -Evans -Ewing -Faqua -Faust -Fea -Feufer -Fiddler -Field -Fields -Finlay -Fischer -Fiscina -Fisher -Fitzgerald -Fleming -Flickinger -Focell -Foster -Franks -Fraser -Fryer -Fuchs -Fulton -Gadow -Gardner -Garland -Garneys -Garratt -Garrison -Gettemy -Gibson -Glover -Goebbles -Goodman -Graham -Gray -Green -Greenawalt -Greene -Greenwood -Gregory -Griffiths -Gronko -Guess -Hall -Hanford -Hardie -Harding -Hardy -Harris -Harrison -Harrold -Harrow -Harshman -Hastings -Hawker -Hawking -Hawkins -Hayhurst -Haynes -Heckendora -Hegarty -Henry -Hice -Highlands -Hill -Hincken -Hirleman -Hoenshell -Holdeman -Holmes -Hook -Hooker -Hoopengarner -Hoover -Houser -Houston -Howard -Howe -Huey -Hughes -Hujsak -Hunt -Hunter -Hussain -Hutton -Hynes -Ironmonger -Isaman -Isemann -Ivanov -Jackson -James -Jardine -Jenkins -Jenner -Jerome -Jesse -Jewell -Joghs -Johnson -Jones -Jowers -Joyce -Judge -Jyllian -Kadel -Kanaga -Kaur -Keener -Kelley -Kellogg -Kelly -Kemble -Kemerer -Keppel -Kepplinger -Khan -Kiefer -Kifer -Kimple -King -Kirkson -Knapenberger -Knapp -Koepple -Koster -Kuster -Kuznetsov -Laborde -Lacon -Lafortune -Langston -Larson -Lauffer -Laurenzi -Leach -Lee -Leech -Leichter -Leslie -Lester -Levett -Lewis -Lineman -Linton -Llora -Lloyd -Logue -Lombardi -Lord -Losey -Lowe -Lowstetter -Lucy -Ludwig -Maclagan -Magor -Marcotte -Margaret -Marriman -Marshall -Martins -Mary -Mason -Mathews -Matthews -Mcclymonds -Mccullough -Mccune -McDonald -McDonohugh -Mcfall -Mcintosh -Mckendrick -Mcloskey -Mcmullen -McShain -Mens -Merryman -Metzer -Meyers -Mikhaylov -Mildred -Miller -Millhouse -Mills -Milne -Mingle -Minnie -Mitchell -Moberly -Moon -Moore -Morgan -Morris -Mortland -Mosser -Mueller -Muggins -Mull -Muller -Murphy -Murray -Nash -Neely -Nehling -Newbern -Newton -Nicholas -Nickolson -Northey -Noton -Olphert -Oneal -Oppenheimer -Osteen -Osterweis -Osterwise -Otis -Overstreet -Owen -Owens -Palmer -Parker -Parkinson -Patel -Patterson -Paulson -Pavlov -Paynter -Pearsall -Pennington -Perkins -Pershing -Peters -Petrov -Pfeifer -Philips -Phillips -Picard -Pinney -Poehl -Poley -Polson -Potter -Powell -Power -Powers -Pratt -Prechtl -Prescott -Prevatt -Price -Priebe -Pritchard -Pycroft -Quinn -Quirin -Rader -Rahl -Ramos -Randolph -Ratcliff -Rathen -Rathens -Raub -Ray -Reade -Reichard -Reid -Reighner -Rhinehart -Richards -Richardson -Richter -Rifler -Riggle -Riker -Ringer -Roadman -Roberts -Robertson -Robinson -Roby -Rockwell -Rogers -Rohtin -Rose -Rosensteel -Rowley -Russell -Ryals -Sagan -Sanders -Sandford -Sandys -Sauter -Saylor -Schaeffer -Scherer -Schmidt -Schofield -Schrader -Scott -Sealis -Seelig -Seidner -Semenov -Shafer -Shaffer -Shaner -Shaw -Sheets -Shick -Shirey -Sholl -Shupe -Sidower -Siegrist -Simmons -Simpson -Singh -Skywalker -Sloan -Smail -Smirnov -Smith -Snyder -Sommer -Spock -Stafford -Stahl -Stainforth -Stall -Stamos -Stange -Staymates -Steele -Stephenson -Stern -Stewart -Stocker -Stone -Stough -Straub -Stroble -Stroh -Styles -Sullivan -Sulyard -Summy -Sutton -Swabey -Swarner -Sybilla -Taggart -Tanner -Taylor -Teagarden -Tedrow -Tennant -Thomas -Thomlinson -Thompson -Thomson -Thorley -Tilton -Tireman -Todd -Treeby -Trovato -Turner -Ulery -Ullman -Unk -Vader -Vanleer -Vasilyev -Waldron -Walker -Wallick -Ward -Wardle -Warren -Watson -Webb -Weeter -Weinstein -Weisgarber -Wells -Welty -Wentzel -Werner -Werry -Wheeler -Whirlow -White -Whiteman -Whittier -Wible -Wile -Wilkerson -Wilkinson -Willey -Williams -Williamson -Wilo -Wilson -Winton -Wise -Wolfe -Wolff -Wood -Woodward -Woodworth -Woolery -Woollard -Wright -Yeskey -Young -Zadovsky -Zalack -Zaun -Zeal -Zimmer +Ackerley +Adams +Addison +Agg +Aggley +Ahmed +Albright +Alekseev +Ali +Alice +Allen +Alliman +Altmann +Anderson +Andreev +Ann +Archibald +Armstrong +Ashbaugh +Atkinson +Atweeke +Aultman +Auman +Baer +Bailey +Baker +Barnes +Barrett +Bash +Bashline +Basinger +Baskett +Basmanoff +Batten +Baum +Baxter +Beach +Beail +Beck +Beedell +Begum +Bell +Benford +Bennett +Berkheimer +Best +Bickerson +Bicknell +Biery +Black +Blackburn +Blaine +Blessig +Bloise +Bluetenberger +Blyant +Bode +Bould +Bousum +Bowchiew +Boyer +Brandenburg +Bratton +Braun +Briggs +Brindle +Briner +Brinigh +Brooks +Brown +Bullard +Bunten +Burkett +Burns +Burris +Butterfill +Buttersworth +Buzzard +Byers +Bynum +Caldwell +Callison +Camp +Campbell +Carmichael +Carr +Carter +Catherina +Catleay +Cavalet +Chapman +Chauvin +Cherry +Christman +Christopher +Clark +Clarke +Clewett +Coates +Coldsmith +Collins +Compton +Conrad +Cook +Cooper +Costello +Cowart +Cowper +Cox +Cressman +Curry +Cypret +David +Davies +Davis +Dawkins +Day +Dean +Demuth +Dennis +Dickinson +Digson +Dimeling +Donkin +Draudy +Driggers +Dryfus +Dugmore +Duncan +Durstine +Earl +Easter +Echard +Eckhardstein +Edwards +Eggbert +Ehret +Elderson +Eliza +Elliott +Ellis +Enderly +Endsley +Evans +Ewing +Faqua +Faust +Fea +Feufer +Fiddler +Field +Fields +Finlay +Fischer +Fiscina +Fisher +Fitzgerald +Fleming +Flickinger +Focell +Foster +Franks +Fraser +Fryer +Fuchs +Fulton +Gadow +Gardner +Garland +Garneys +Garratt +Garrison +Gettemy +Gibson +Glover +Goebbles +Goodman +Graham +Gray +Green +Greenawalt +Greene +Greenwood +Gregory +Griffiths +Gronko +Guess +Hall +Hanford +Hardie +Harding +Hardy +Harris +Harrison +Harrold +Harrow +Harshman +Hastings +Hawker +Hawking +Hawkins +Hayhurst +Haynes +Heckendora +Hegarty +Henry +Hice +Highlands +Hill +Hincken +Hirleman +Hoenshell +Holdeman +Holmes +Hook +Hooker +Hoopengarner +Hoover +Houser +Houston +Howard +Howe +Huey +Hughes +Hujsak +Hunt +Hunter +Hussain +Hutton +Hynes +Ironmonger +Isaman +Isemann +Ivanov +Jackson +James +Jardine +Jenkins +Jenner +Jerome +Jesse +Jewell +Joghs +Johnson +Jones +Jowers +Joyce +Judge +Jyllian +Kadel +Kanaga +Kaur +Keener +Kelley +Kellogg +Kelly +Kemble +Kemerer +Keppel +Kepplinger +Khan +Kiefer +Kifer +Kimple +King +Kirkson +Knapenberger +Knapp +Koepple +Koster +Kuster +Kuznetsov +Laborde +Lacon +Lafortune +Langston +Larson +Lauffer +Laurenzi +Leach +Lee +Leech +Leichter +Leslie +Lester +Levett +Lewis +Lineman +Linton +Llora +Lloyd +Logue +Lombardi +Lord +Losey +Lowe +Lowstetter +Lucy +Ludwig +Maclagan +Magor +Marcotte +Margaret +Marriman +Marshall +Martins +Mary +Mason +Mathews +Matthews +Mcclymonds +Mccullough +Mccune +McDonald +McDonohugh +Mcfall +Mcintosh +Mckendrick +Mcloskey +Mcmullen +McShain +Mens +Merryman +Metzer +Meyers +Mikhaylov +Mildred +Miller +Millhouse +Mills +Milne +Mingle +Minnie +Mitchell +Moberly +Moon +Moore +Morgan +Morris +Mortland +Mosser +Mueller +Muggins +Mull +Muller +Murphy +Murray +Nash +Neely +Nehling +Newbern +Newton +Nicholas +Nickolson +Northey +Noton +Olphert +Oneal +Oppenheimer +Osteen +Osterweis +Osterwise +Otis +Overstreet +Owen +Owens +Palmer +Parker +Parkinson +Patel +Patterson +Paulson +Pavlov +Paynter +Pearsall +Pennington +Perkins +Pershing +Peters +Petrov +Pfeifer +Philips +Phillips +Picard +Pinney +Poehl +Poley +Polson +Potter +Powell +Power +Powers +Pratt +Prechtl +Prescott +Prevatt +Price +Priebe +Pritchard +Pycroft +Quinn +Quirin +Rader +Rahl +Ramos +Randolph +Ratcliff +Rathen +Rathens +Raub +Ray +Reade +Reichard +Reid +Reighner +Rhinehart +Richards +Richardson +Richter +Rifler +Riggle +Riker +Ringer +Roadman +Roberts +Robertson +Robinson +Roby +Rockwell +Rogers +Rohtin +Rose +Rosensteel +Rowley +Russell +Ryals +Sagan +Sanders +Sandford +Sandys +Sauter +Saylor +Schaeffer +Scherer +Schmidt +Schofield +Schrader +Scott +Sealis +Seelig +Seidner +Semenov +Shafer +Shaffer +Shaner +Shaw +Sheets +Shick +Shirey +Sholl +Shupe +Sidower +Siegrist +Simmons +Simpson +Singh +Skywalker +Sloan +Smail +Smirnov +Smith +Snyder +Sommer +Spock +Stafford +Stahl +Stainforth +Stall +Stamos +Stange +Staymates +Steele +Stephenson +Stern +Stewart +Stocker +Stone +Stough +Straub +Stroble +Stroh +Styles +Sullivan +Sulyard +Summy +Sutton +Swabey +Swarner +Sybilla +Taggart +Tanner +Taylor +Teagarden +Tedrow +Tennant +Thomas +Thomlinson +Thompson +Thomson +Thorley +Tilton +Tireman +Todd +Treeby +Trovato +Turner +Ulery +Ullman +Unk +Vader +Vanleer +Vasilyev +Waldron +Walker +Wallick +Ward +Wardle +Warren +Watson +Webb +Weeter +Weinstein +Weisgarber +Wells +Welty +Wentzel +Werner +Werry +Wheeler +Whirlow +White +Whiteman +Whittier +Wible +Wile +Wilkerson +Wilkinson +Willey +Williams +Williamson +Wilo +Wilson +Winton +Wise +Wolfe +Wolff +Wood +Woodward +Woodworth +Woolery +Woollard +Wright +Yeskey +Young +Zadovsky +Zalack +Zaun +Zeal +Zimmer Zoucks \ No newline at end of file diff --git a/strings/names/lizard_female.txt b/strings/names/lizard_female.txt index cf588df9b1..078ee7bcff 100644 --- a/strings/names/lizard_female.txt +++ b/strings/names/lizard_female.txt @@ -1,163 +1,163 @@ -Adzi -Ah -Ahaht -Ajim -Akeenus -Akish -Akishan -Aleeto -Am -Amussa -An -Anozz -Asheemar -Asska -Awas -Azala -Azbai -Azeez -Azum -Banalz -Bar -Baseenar -Beek -Beekatan -Beekus -Beela -Beelei -Beem -Beewos -Bejeen -Ber -Betzi -Bishalus -Bokeeus -Bur -Bura -Chalaree -Chana -Chanil -Chee -Cheesh -Chimatei -Chirurgeon -Cholasistu -Chuna -Churasu -Crath -Dar -Deeja -Deesei -Deesh -Deetsan -Deetwos -Dooka -Druja -Eepa -Ei -Eix -El -Ereel -Eutei -Gai -Gih -Gilm -Gish -Go -Hal -Hul -Ja -Jaseen -Jasuda -Jeed -Jeen -Kajul -Kal -Kasa -Keel -Keerava -Kiurz -Kud -La -Lee -Lei -Lifts -Liurz -Lurasha -Ma -Mach -Marz -Meedish -Meeh -Meema -Meen -Meena -Meenus -Meerana -Meesei -Meeus -Mei -Milah -Mim -Mota -Mudeska -Muz -Na -Nakuma -Nam -Nassa -Natoo -Neesha -Neetizei -Neetra -Neeus -Niima -Numeen -Nuralg -Nush -Ocheeva -Okur -Olank -On -Onasha -Osheeka -Pasha -Ra -Rana -Raniur -Ree -Reesa -Rei -Sa -Saak -Sanax -Seeba -Seed -Seen -Shah -Shahvee -Shaleez -Shatalg -Sheer -Shei -Sigerthe -Skaleel -Sudie -Tail -Tar -Tasha -Tei -Telixith -Tumma -Veek -Wan -Wazei -Weedum -Weewish -Witseidutsei -Wuja -Wujeeta -Wusha -Xil -Zish +Adzi +Ah +Ahaht +Ajim +Akeenus +Akish +Akishan +Aleeto +Am +Amussa +An +Anozz +Asheemar +Asska +Awas +Azala +Azbai +Azeez +Azum +Banalz +Bar +Baseenar +Beek +Beekatan +Beekus +Beela +Beelei +Beem +Beewos +Bejeen +Ber +Betzi +Bishalus +Bokeeus +Bur +Bura +Chalaree +Chana +Chanil +Chee +Cheesh +Chimatei +Chirurgeon +Cholasistu +Chuna +Churasu +Crath +Dar +Deeja +Deesei +Deesh +Deetsan +Deetwos +Dooka +Druja +Eepa +Ei +Eix +El +Ereel +Eutei +Gai +Gih +Gilm +Gish +Go +Hal +Hul +Ja +Jaseen +Jasuda +Jeed +Jeen +Kajul +Kal +Kasa +Keel +Keerava +Kiurz +Kud +La +Lee +Lei +Lifts +Liurz +Lurasha +Ma +Mach +Marz +Meedish +Meeh +Meema +Meen +Meena +Meenus +Meerana +Meesei +Meeus +Mei +Milah +Mim +Mota +Mudeska +Muz +Na +Nakuma +Nam +Nassa +Natoo +Neesha +Neetizei +Neetra +Neeus +Niima +Numeen +Nuralg +Nush +Ocheeva +Okur +Olank +On +Onasha +Osheeka +Pasha +Ra +Rana +Raniur +Ree +Reesa +Rei +Sa +Saak +Sanax +Seeba +Seed +Seen +Shah +Shahvee +Shaleez +Shatalg +Sheer +Shei +Sigerthe +Skaleel +Sudie +Tail +Tar +Tasha +Tei +Telixith +Tumma +Veek +Wan +Wazei +Weedum +Weewish +Witseidutsei +Wuja +Wujeeta +Wusha +Xil +Zish Zollassa \ No newline at end of file diff --git a/strings/names/lizard_male.txt b/strings/names/lizard_male.txt index 437d124b50..f14f1705ba 100644 --- a/strings/names/lizard_male.txt +++ b/strings/names/lizard_male.txt @@ -1,328 +1,328 @@ -Abijoo -Ah -Ajum -Am -Amusei -An -Anoo -Aojee -Asum -Az -Azeel -Azinar -Azjai -Baar -Banka -Bar -Barnaxi -Batar -Batuus -Beem -Beshnus -Betu -Bex -Bijot -Bimee -Binyaar -Bosekus -Brand -Bun -Bunach -Bunish -Busheeus -Buujhan -Chakuk -Chalish -Chalureel -Chath -Chee -Cheedal -Chilwir -Chitakus -Chiwish -Chulz -Chuna -Da -Dakee -Dan -Dar -Darasken -DarJee -Debameel -Deed -Deegeeta -Deeh -Deekonus -Deekum -Deekus -Deerkaza -Deetum -Demeepa -Depasa -Derkeethus -Deroh -Dezanu -Dreet -Drumarz -Dum -Dunaxith -Effe -Ei -Eidu -Eius -Eiuus -Eix -Eleedal -Er -Esqoo -Etaku -Gah -Gajul -Gam -Geeh -Geel -Geem -Geh -Gei -Gih -Gin -Goh -Gulum -Haj -Han -Haran -Hareeya -Hathei -Heedul -Heem -Hei -Heir -Hixeeh -Huleeya -Huzei -Ilas -Im -Inee -Itan -J'Ram -Ja -Jah -Jaraleet -Jaree -Jas -Jasaiin -Jaseen -Jat -Jee -Jeela -Jeelius -Jeelus -Jeen -Jeer -Jeetum -Jei -Jilux -Jin -Jon -Jul -Julan -Junal -Jush -Juunei -Kai -Kajin -Kamax -Kas -Keema -Keer -Keerasa -Kepanuu -Kia -Kiameed -Kilaya -Kiurz -Kur -Kuz -La -Lah -Lai -Lan -Lara -Leem -Lei -Loh -Lotash -Luh -Lurz -Luteema -Maahi -Madesi -Maheelius -Mahei -Maht -Malz -Marz -Mathei -Maxath -Meej -Meejapa -Meensuda -Meer -Mema -Mere -Metaku -Miharil -Milos -Miun -Mobareed -Mohimeem -Mopakuz -Motuu -Mujeen -Muranatepa -Mush -Muz -Na -Napetui -Nazuux -Nebutil -Neeti -Neetinei -Neetrenaza -Neetzara -Neeus -Nema -Neposh -Netapatuu -Nexith -Nodeeus -Nomu -Nosaleeth -Nowajeem -Noyei -Nulaz -Nur -Obaxith -Okan -Okaw -Okeeh -Oleed -Oleen -Olik -Olink -Onuja -Onurai -Opatieel -Otumeel -Owai -Pachat -Pacheeva -Pad -Paduxi -Pajeen -Parash -Peeradeeh -Pejureel -Petaxai -Pideelus -Pimaxi -Pojeel -Ra -Radithax -Raj -Rareel -Rasha -Redieeus -Ree -Reeh -Reemukeeus -Reenum -Reesa -Reet -Reezal -Resari -Riker -Ru -Rupah -Sakeepa -Sakeeus -Sakka -Saliith -Sar -Schiavas -Seek -Seewul -Sei -Sejaijilax -Shakiis -Shehs -Shei -Silm -Skee -Skeetul -Sureeus -Ta -Taeed -Tah -Taleel -Talen -Tan -Tanaka -Tanan -Tee -Teeba -Teegla -Teeka -Teekeeus -Teemeeta -Teeus -Tehat -Tei -Teinaava -Teineeja -Terezeeus -Tikaasi -Tim -Topeeth -Topith -Tsleeixth -Tul -Tulm -Tun -Ukatsei -Ukawei -Ula -Ulawa -Ullis -Usha -Usheeja -Utadeek -Utamukeeus -Utatul -Uxith -Vara -Veekas -Veenaza -Veezara -Vistha -Vudeelal -Wanan -Wanum -Wayiteh -Weebam -Weeltul -Weer -Wih -Wud -Wuleen -Wulm -Wumeek -Xal -Xemo -Yinz -Yinz'r -Zaw -Ze -Zeen -Zeeus +Abijoo +Ah +Ajum +Am +Amusei +An +Anoo +Aojee +Asum +Az +Azeel +Azinar +Azjai +Baar +Banka +Bar +Barnaxi +Batar +Batuus +Beem +Beshnus +Betu +Bex +Bijot +Bimee +Binyaar +Bosekus +Brand +Bun +Bunach +Bunish +Busheeus +Buujhan +Chakuk +Chalish +Chalureel +Chath +Chee +Cheedal +Chilwir +Chitakus +Chiwish +Chulz +Chuna +Da +Dakee +Dan +Dar +Darasken +DarJee +Debameel +Deed +Deegeeta +Deeh +Deekonus +Deekum +Deekus +Deerkaza +Deetum +Demeepa +Depasa +Derkeethus +Deroh +Dezanu +Dreet +Drumarz +Dum +Dunaxith +Effe +Ei +Eidu +Eius +Eiuus +Eix +Eleedal +Er +Esqoo +Etaku +Gah +Gajul +Gam +Geeh +Geel +Geem +Geh +Gei +Gih +Gin +Goh +Gulum +Haj +Han +Haran +Hareeya +Hathei +Heedul +Heem +Hei +Heir +Hixeeh +Huleeya +Huzei +Ilas +Im +Inee +Itan +J'Ram +Ja +Jah +Jaraleet +Jaree +Jas +Jasaiin +Jaseen +Jat +Jee +Jeela +Jeelius +Jeelus +Jeen +Jeer +Jeetum +Jei +Jilux +Jin +Jon +Jul +Julan +Junal +Jush +Juunei +Kai +Kajin +Kamax +Kas +Keema +Keer +Keerasa +Kepanuu +Kia +Kiameed +Kilaya +Kiurz +Kur +Kuz +La +Lah +Lai +Lan +Lara +Leem +Lei +Loh +Lotash +Luh +Lurz +Luteema +Maahi +Madesi +Maheelius +Mahei +Maht +Malz +Marz +Mathei +Maxath +Meej +Meejapa +Meensuda +Meer +Mema +Mere +Metaku +Miharil +Milos +Miun +Mobareed +Mohimeem +Mopakuz +Motuu +Mujeen +Muranatepa +Mush +Muz +Na +Napetui +Nazuux +Nebutil +Neeti +Neetinei +Neetrenaza +Neetzara +Neeus +Nema +Neposh +Netapatuu +Nexith +Nodeeus +Nomu +Nosaleeth +Nowajeem +Noyei +Nulaz +Nur +Obaxith +Okan +Okaw +Okeeh +Oleed +Oleen +Olik +Olink +Onuja +Onurai +Opatieel +Otumeel +Owai +Pachat +Pacheeva +Pad +Paduxi +Pajeen +Parash +Peeradeeh +Pejureel +Petaxai +Pideelus +Pimaxi +Pojeel +Ra +Radithax +Raj +Rareel +Rasha +Redieeus +Ree +Reeh +Reemukeeus +Reenum +Reesa +Reet +Reezal +Resari +Riker +Ru +Rupah +Sakeepa +Sakeeus +Sakka +Saliith +Sar +Schiavas +Seek +Seewul +Sei +Sejaijilax +Shakiis +Shehs +Shei +Silm +Skee +Skeetul +Sureeus +Ta +Taeed +Tah +Taleel +Talen +Tan +Tanaka +Tanan +Tee +Teeba +Teegla +Teeka +Teekeeus +Teemeeta +Teeus +Tehat +Tei +Teinaava +Teineeja +Terezeeus +Tikaasi +Tim +Topeeth +Topith +Tsleeixth +Tul +Tulm +Tun +Ukatsei +Ukawei +Ula +Ulawa +Ullis +Usha +Usheeja +Utadeek +Utamukeeus +Utatul +Uxith +Vara +Veekas +Veenaza +Veezara +Vistha +Vudeelal +Wanan +Wanum +Wayiteh +Weebam +Weeltul +Weer +Wih +Wud +Wuleen +Wulm +Wumeek +Xal +Xemo +Yinz +Yinz'r +Zaw +Ze +Zeen +Zeeus Zish \ No newline at end of file diff --git a/strings/names/mime.txt b/strings/names/mime.txt index 094987da9d..989cd6f300 100644 --- a/strings/names/mime.txt +++ b/strings/names/mime.txt @@ -1,32 +1,32 @@ -Church Mouse -Hush Foot -Invisible Man -Lemon Mime -Marcel -Marcel Mime -Master-Mime -Mime -Mr Beret -Mr Mime -Mr Mute -Mute -Omerta -Oui Oui -Pantomime -Quiet -Quiet Riot -See Through -Silence -Silencio -Silent Knight -Silent Majority -Silent Night -Silent Sorrow -Silent Step -Silent Mouse -The Unspeakable -Transparency -Unspeakable -Untouchable -Wall Runner -White Face +Church Mouse +Hush Foot +Invisible Man +Lemon Mime +Marcel +Marcel Mime +Master-Mime +Mime +Mr Beret +Mr Mime +Mr Mute +Mute +Omerta +Oui Oui +Pantomime +Quiet +Quiet Riot +See Through +Silence +Silencio +Silent Knight +Silent Majority +Silent Night +Silent Sorrow +Silent Step +Silent Mouse +The Unspeakable +Transparency +Unspeakable +Untouchable +Wall Runner +White Face diff --git a/strings/names/ninjaname.txt b/strings/names/ninjaname.txt index fa0d0f1094..eb470493fa 100644 --- a/strings/names/ninjaname.txt +++ b/strings/names/ninjaname.txt @@ -1,44 +1,44 @@ -Aria -Baki -Blood -Bro -Cyrax -Daemon -Death -Donatello -Eater -Ermac -Fox -Goemon -Hanzo -Hayabusa -Hazuki -Hero -Hien -Hiro -Hiryu -Iga -Koga -Leonardo -McAwesome -McNinja -Michaelangelo -Midnight -Null -Ogre -Phantom -Raiden -Rain -Raphael -Ryu -Saibot -Samurai -Sarutobi -Scorpion -Seven -Shadow -Shredder -Smoke -Splinter -Throat +Aria +Baki +Blood +Bro +Cyrax +Daemon +Death +Donatello +Eater +Ermac +Fox +Goemon +Hanzo +Hayabusa +Hazuki +Hero +Hien +Hiro +Hiryu +Iga +Koga +Leonardo +McAwesome +McNinja +Michaelangelo +Midnight +Null +Ogre +Phantom +Raiden +Rain +Raphael +Ryu +Saibot +Samurai +Sarutobi +Scorpion +Seven +Shadow +Shredder +Smoke +Splinter +Throat Zero \ No newline at end of file diff --git a/strings/names/ninjatitle.txt b/strings/names/ninjatitle.txt index 41c5b338ba..f9776f56fe 100644 --- a/strings/names/ninjatitle.txt +++ b/strings/names/ninjatitle.txt @@ -1,46 +1,46 @@ -Agile -Assassin -Awesome -Black -Crimson -Cruel -Deep -Dr -Dragon -Ender -Grandmaster -Grappler -Gray -Hunter -Initiate -Killer -Liquid -Master -Merciful -Merciless -Nickel -Night -Nightshade -Ninja -Noob -Orphaner -Quick -Remorseless -Rogue -Sensei -Shinobi -Silencing -Silent -Silver -Singing -Slayer -Snake -Solid -Solidus -Stalker -Steel -Strider -Striker -Swift -Ulimate +Agile +Assassin +Awesome +Black +Crimson +Cruel +Deep +Dr +Dragon +Ender +Grandmaster +Grappler +Gray +Hunter +Initiate +Killer +Liquid +Master +Merciful +Merciless +Nickel +Night +Nightshade +Ninja +Noob +Orphaner +Quick +Remorseless +Rogue +Sensei +Shinobi +Silencing +Silent +Silver +Singing +Slayer +Snake +Solid +Solidus +Stalker +Steel +Strider +Striker +Swift +Ulimate Widower \ No newline at end of file diff --git a/strings/names/plasmaman.txt b/strings/names/plasmaman.txt index eb5f8b786c..8cbfc00837 100644 --- a/strings/names/plasmaman.txt +++ b/strings/names/plasmaman.txt @@ -1,118 +1,118 @@ -Actinium -Aluminium -Americium -Antimony -Argon -Arsenic -Astatine -Barium -Berkelium -Beryllium -Bismuth -Bohrium -Boron -Bromine -Cadmium -Caesium -Calcium -Californium -Carbon -Cerium -Chlorine -Chromium -Cobalt -Copernicium -Copper -Curium -Darmstadtium -Dubnium -Dysprosium -Einsteinium -Erbium -Europium -Fermium -Flerovium -Fluorine -Francium -Gadolinium -Gallium -Germanium -Gold -Hafnium -Hassium -Helium -Holmium -Hydrogen -Indium -Iodine -Iridium -Iron -Krypton -Lanthanum -Lawrencium -Lead -Lithium -Livermorium -Lutetium -Magnesium -Manganese -Meitnerium -Mendelevium -Mercury -Molybdenum -Moscovium -Neodymium -Neon -Neptunium -Nickel -Nihonium -Niobium -Nitrogen -Nobelium -Oganesson -Osmium -Oxygen -Palladium -Phosphorus -Platinum -Plutonium -Polonium -Potassium -Praseodymium -Promethium -Protactinium -Radium -Radon -Rhenium -Rhodium -Roentgenium -Rubidium -Ruthenium -Rutherfordium -Samarium -Scandium -Seaborgium -Selenium -Silicon -Silver -Sodium -Strontium -Sulfur -Tantalum -Technetium -Tellurium -Tennessine -Terbium -Thallium -Thorium -Thulium -Tin -Titanium -Tungsten -Uranium -Vanadium -Xenon -Ytterbium -Yttrium -Zinc +Actinium +Aluminium +Americium +Antimony +Argon +Arsenic +Astatine +Barium +Berkelium +Beryllium +Bismuth +Bohrium +Boron +Bromine +Cadmium +Caesium +Calcium +Californium +Carbon +Cerium +Chlorine +Chromium +Cobalt +Copernicium +Copper +Curium +Darmstadtium +Dubnium +Dysprosium +Einsteinium +Erbium +Europium +Fermium +Flerovium +Fluorine +Francium +Gadolinium +Gallium +Germanium +Gold +Hafnium +Hassium +Helium +Holmium +Hydrogen +Indium +Iodine +Iridium +Iron +Krypton +Lanthanum +Lawrencium +Lead +Lithium +Livermorium +Lutetium +Magnesium +Manganese +Meitnerium +Mendelevium +Mercury +Molybdenum +Moscovium +Neodymium +Neon +Neptunium +Nickel +Nihonium +Niobium +Nitrogen +Nobelium +Oganesson +Osmium +Oxygen +Palladium +Phosphorus +Platinum +Plutonium +Polonium +Potassium +Praseodymium +Promethium +Protactinium +Radium +Radon +Rhenium +Rhodium +Roentgenium +Rubidium +Ruthenium +Rutherfordium +Samarium +Scandium +Seaborgium +Selenium +Silicon +Silver +Sodium +Strontium +Sulfur +Tantalum +Technetium +Tellurium +Tennessine +Terbium +Thallium +Thorium +Thulium +Tin +Titanium +Tungsten +Uranium +Vanadium +Xenon +Ytterbium +Yttrium +Zinc Zirconium \ No newline at end of file diff --git a/strings/names/posibrain.txt b/strings/names/posibrain.txt index 119632bd81..ed8a186fd4 100644 --- a/strings/names/posibrain.txt +++ b/strings/names/posibrain.txt @@ -1,47 +1,47 @@ -PBU -HIU -SINA -ARMA -OSI -HBL -MSO -RR -CHRI -CDB -HG -XSI -ORNG -GUN -KOR -MET -FRE -XIS -SLI -PKP -HOG -RZH -GOOF -MRPR -JJR -FIRC -INC -PHL -BGB -ANTR -MIW -WJ -JRD -CHOC -ANCL -JLLO -JNLG -KOS -TKRG -XAL -STLP -CBOS -DUNC -FXMC -DRSD -COI +PBU +HIU +SINA +ARMA +OSI +HBL +MSO +RR +CHRI +CDB +HG +XSI +ORNG +GUN +KOR +MET +FRE +XIS +SLI +PKP +HOG +RZH +GOOF +MRPR +JJR +FIRC +INC +PHL +BGB +ANTR +MIW +WJ +JRD +CHOC +ANCL +JLLO +JNLG +KOS +TKRG +XAL +STLP +CBOS +DUNC +FXMC +DRSD +COI CYBR \ No newline at end of file diff --git a/strings/names/spider_first.txt b/strings/names/spider_first.txt new file mode 100644 index 0000000000..06fbae057c --- /dev/null +++ b/strings/names/spider_first.txt @@ -0,0 +1,30 @@ +Zerzir +Lalnuth +Avisreb +Qeqarnai +Rhikkiezhith +Necaqtex +Aqi +Shozhish +Sraiza +Ranqu +Zellalshi +Necoq +Zaqod +Salaree +Xavis +Cheqirni +Nieqi +Cakirkix +Ivad +Shenqazhe +Azurte +Lizire +Ivur +Kavur +Raicheca +Iqashe +Eq'za +Sak'sad +Hiezih +Cessix \ No newline at end of file diff --git a/strings/names/spider_last.txt b/strings/names/spider_last.txt new file mode 100644 index 0000000000..2b663f6df3 --- /dev/null +++ b/strings/names/spider_last.txt @@ -0,0 +1,30 @@ +Ik'sir +Sechathi +Qok'sut +Yeqied +Iravhoh +Kriaqux +Yikih +Khaqa +Azasnet +Qhecid +Qhin'qu +Zhechikzor +Qhovi +Hirath +Szornud +Zasokaq +Lhaqish +Qhiretid +Avizad +Qallazi +Qhizrud +Qicirne +Sezuveth +Zelriker +Rhiallor +Zhaliesh +Qoutirk'ab +Chavi +Riel'shes +Khentax \ No newline at end of file diff --git a/strings/names/verbs.txt b/strings/names/verbs.txt index 17bc127fd5..fc90f89e40 100644 --- a/strings/names/verbs.txt +++ b/strings/names/verbs.txt @@ -1,632 +1,632 @@ -accept -add -admire -admit -advise -afford -agree -alert -allow -amuse -analyse -announce -annoy -answer -apologise -appear -applaud -appreciate -approve -argue -arrange -arrest -arrive -ask -attach -attack -attempt -attend -attract -avoid -back -bake -balance -ban -bang -bare -bat -bathe -battle -beam -beg -behave -belong -bleach -bless -blind -blink -blot -blush -boast -boil -bolt -bomb -book -bore -borrow -bounce -bow -box -brake -branch -breathe -bruise -brush -bubble -bump -burn -bury -buzz -calculate -call -camp -care -carry -carve -cause -challenge -change -charge -chase -cheat -check -cheer -chew -choke -chop -claim -clap -clean -clear -clip -close -coach -coil -collect -colour -comb -command -communicate -compare -compete -complain -complete -concentrate -concern -confess -confuse -connect -consider -consist -contain -continue -copy -correct -cough -count -cover -crack -crash -crawl -cross -crush -cry -cure -curl -curve -cycle -dam -damage -dance -dare -decay -deceive -decide -decorate -delay -delight -deliver -depend -describe -desert -deserve -destroy -detect -develop -disagree -disappear -disapprove -disarm -discover -dislike -divide -double -doubt -drag -drain -dream -dress -drip -drop -drown -drum -dry -dust -earn -educate -embarrass -employ -empty -encourage -end -enjoy -enter -entertain -escape -examine -excite -excuse -exercise -exist -expand -expect -explain -explode -extend -face -fade -fail -fancy -fasten -fax -fear -fence -fetch -file -fill -film -fire -fit -fix -flap -flash -float -flood -flow -flower -fold -follow -fool -force -form -found -frame -frighten -fry -gather -gaze -glow -glue -grab -grate -grease -greet -grin -grip -groan -guarantee -guard -guess -guide -hammer -hand -handle -hang -happen -harass -harm -hate -haunt -head -heal -heap -heat -help -hook -hop -hope -hover -hug -hum -hunt -hurry -identify -ignore -imagine -impress -improve -include -increase -influence -inform -inject -injure -instruct -intend -interest -interfere -interrupt -introduce -invent -invite -irritate -itch -jail -jam -jog -join -joke -judge -juggle -jump -kick -kill -kiss -kneel -knit -knock -knot -label -land -last -laugh -launch -learn -level -license -lick -lie -lighten -like -list -listen -live -load -lock -long -look -love -man -manage -march -mark -marry -match -mate -matter -measure -meddle -melt -memorise -mend -messup -milk -mine -miss -mix -moan -moor -mourn -move -muddle -mug -multiply -murder -nail -name -need -nest -nod -note -notice -number -obey -object -observe -obtain -occur -offend -offer -open -order -overflow -owe -own -pack -paddle -paint -park -part -pass -paste -pat -pause -peck -pedal -peel -peep -perform -permit -phone -pick -pinch -pine -place -plan -plant -play -please -plug -point -poke -polish -pop -possess -post -pour -practise -pray -preach -precede -prefer -prepare -present -preserve -press -pretend -prevent -prick -print -produce -program -promise -protect -provide -pull -pump -punch -puncture -punish -push -question -queue -race -radiate -rain -raise -reach -realise -receive -recognise -record -reduce -reflect -refuse -regret -reign -reject -rejoice -relax -release -rely -remain -remember -remind -remove -repair -repeat -replace -reply -report -reproduce -request -rescue -retire -return -rhyme -rinse -risk -rob -rock -roll -rot -rub -ruin -rule -rush -sack -sail -satisfy -save -saw -scare -scatter -scold -scorch -scrape -scratch -scream -screw -scribble -scrub -seal -search -separate -serve -settle -shade -share -shave -shelter -shiver -shock -shop -shrug -sigh -sign -signal -sin -sip -ski -skip -slap -slip -slow -smash -smell -smile -smoke -snatch -sneeze -sniff -snore -snow -soak -soothe -sound -spare -spark -sparkle -spell -spill -spoil -spot -spray -sprout -squash -squeak -squeal -squeeze -stain -stamp -stare -start -stay -steer -step -stir -stitch -stop -store -strap -strengthen -stretch -strip -stroke -stuff -subtract -succeed -suck -suffer -suggest -suit -supply -support -suppose -surprise -surround -suspect -suspend -switch -talk -tame -tap -taste -tease -telephone -tempt -terrify -test -thank -thaw -tick -tickle -tie -time -tip -tire -touch -tour -tow -trace -trade -train -transport -trap -travel -treat -tremble -trick -trip -trot -trouble -trust -try -tug -tumble -turn -twist -type -undress -unfasten -unite -unlock -unpack -untidy -use -vanish -visit -wail -wait -walk -wander -want -warm -warn -wash -waste -watch -water -wave -weigh -welcome -whine -whip -whirl -whisper -whistle -wink -wipe -wish -wobble -wonder -work -worry -wrap -wreck -wrestle -wriggle -yawn -yell -zip +accept +add +admire +admit +advise +afford +agree +alert +allow +amuse +analyse +announce +annoy +answer +apologise +appear +applaud +appreciate +approve +argue +arrange +arrest +arrive +ask +attach +attack +attempt +attend +attract +avoid +back +bake +balance +ban +bang +bare +bat +bathe +battle +beam +beg +behave +belong +bleach +bless +blind +blink +blot +blush +boast +boil +bolt +bomb +book +bore +borrow +bounce +bow +box +brake +branch +breathe +bruise +brush +bubble +bump +burn +bury +buzz +calculate +call +camp +care +carry +carve +cause +challenge +change +charge +chase +cheat +check +cheer +chew +choke +chop +claim +clap +clean +clear +clip +close +coach +coil +collect +colour +comb +command +communicate +compare +compete +complain +complete +concentrate +concern +confess +confuse +connect +consider +consist +contain +continue +copy +correct +cough +count +cover +crack +crash +crawl +cross +crush +cry +cure +curl +curve +cycle +dam +damage +dance +dare +decay +deceive +decide +decorate +delay +delight +deliver +depend +describe +desert +deserve +destroy +detect +develop +disagree +disappear +disapprove +disarm +discover +dislike +divide +double +doubt +drag +drain +dream +dress +drip +drop +drown +drum +dry +dust +earn +educate +embarrass +employ +empty +encourage +end +enjoy +enter +entertain +escape +examine +excite +excuse +exercise +exist +expand +expect +explain +explode +extend +face +fade +fail +fancy +fasten +fax +fear +fence +fetch +file +fill +film +fire +fit +fix +flap +flash +float +flood +flow +flower +fold +follow +fool +force +form +found +frame +frighten +fry +gather +gaze +glow +glue +grab +grate +grease +greet +grin +grip +groan +guarantee +guard +guess +guide +hammer +hand +handle +hang +happen +harass +harm +hate +haunt +head +heal +heap +heat +help +hook +hop +hope +hover +hug +hum +hunt +hurry +identify +ignore +imagine +impress +improve +include +increase +influence +inform +inject +injure +instruct +intend +interest +interfere +interrupt +introduce +invent +invite +irritate +itch +jail +jam +jog +join +joke +judge +juggle +jump +kick +kill +kiss +kneel +knit +knock +knot +label +land +last +laugh +launch +learn +level +license +lick +lie +lighten +like +list +listen +live +load +lock +long +look +love +man +manage +march +mark +marry +match +mate +matter +measure +meddle +melt +memorise +mend +messup +milk +mine +miss +mix +moan +moor +mourn +move +muddle +mug +multiply +murder +nail +name +need +nest +nod +note +notice +number +obey +object +observe +obtain +occur +offend +offer +open +order +overflow +owe +own +pack +paddle +paint +park +part +pass +paste +pat +pause +peck +pedal +peel +peep +perform +permit +phone +pick +pinch +pine +place +plan +plant +play +please +plug +point +poke +polish +pop +possess +post +pour +practise +pray +preach +precede +prefer +prepare +present +preserve +press +pretend +prevent +prick +print +produce +program +promise +protect +provide +pull +pump +punch +puncture +punish +push +question +queue +race +radiate +rain +raise +reach +realise +receive +recognise +record +reduce +reflect +refuse +regret +reign +reject +rejoice +relax +release +rely +remain +remember +remind +remove +repair +repeat +replace +reply +report +reproduce +request +rescue +retire +return +rhyme +rinse +risk +rob +rock +roll +rot +rub +ruin +rule +rush +sack +sail +satisfy +save +saw +scare +scatter +scold +scorch +scrape +scratch +scream +screw +scribble +scrub +seal +search +separate +serve +settle +shade +share +shave +shelter +shiver +shock +shop +shrug +sigh +sign +signal +sin +sip +ski +skip +slap +slip +slow +smash +smell +smile +smoke +snatch +sneeze +sniff +snore +snow +soak +soothe +sound +spare +spark +sparkle +spell +spill +spoil +spot +spray +sprout +squash +squeak +squeal +squeeze +stain +stamp +stare +start +stay +steer +step +stir +stitch +stop +store +strap +strengthen +stretch +strip +stroke +stuff +subtract +succeed +suck +suffer +suggest +suit +supply +support +suppose +surprise +surround +suspect +suspend +switch +talk +tame +tap +taste +tease +telephone +tempt +terrify +test +thank +thaw +tick +tickle +tie +time +tip +tire +touch +tour +tow +trace +trade +train +transport +trap +travel +treat +tremble +trick +trip +trot +trouble +trust +try +tug +tumble +turn +twist +type +undress +unfasten +unite +unlock +unpack +untidy +use +vanish +visit +wail +wait +walk +wander +want +warm +warn +wash +waste +watch +water +wave +weigh +welcome +whine +whip +whirl +whisper +whistle +wink +wipe +wish +wobble +wonder +work +worry +wrap +wreck +wrestle +wriggle +yawn +yell +zip zoom \ No newline at end of file diff --git a/strings/names/wizardfirst.txt b/strings/names/wizardfirst.txt index f1e9a10a58..13dc68c6bd 100644 --- a/strings/names/wizardfirst.txt +++ b/strings/names/wizardfirst.txt @@ -1,37 +1,37 @@ -Alatar -Archchancellor -Boccob -Circe -Dumbledor -Elminister -Gandalf -Grimm -Gulstaff -Houdini -Jim -Kaschei -Khelben -Kreol -Lina -Merlin -Mogan -Mordenkainen -Morgan -Mystryl -Nihilus -Palando -Prospero -Radagast -Raistlin -Rasputin -Rincewind -Saruman -Tenser -Terefi -Tzeentch -Urza -Vaarsuvius -Vecna -Yoda -Zagyg +Alatar +Archchancellor +Boccob +Circe +Dumbledor +Elminister +Gandalf +Grimm +Gulstaff +Houdini +Jim +Kaschei +Khelben +Kreol +Lina +Merlin +Mogan +Mordenkainen +Morgan +Mystryl +Nihilus +Palando +Prospero +Radagast +Raistlin +Rasputin +Rincewind +Saruman +Tenser +Terefi +Tzeentch +Urza +Vaarsuvius +Vecna +Yoda +Zagyg Zul \ No newline at end of file diff --git a/strings/names/wizardsecond.txt b/strings/names/wizardsecond.txt index dd191cfa2b..6daff0f3e7 100644 --- a/strings/names/wizardsecond.txt +++ b/strings/names/wizardsecond.txt @@ -1,40 +1,40 @@ -Dark -Darkmagic -Darko -Gray -Honko -Inverse -le Fay -of Void -Shado -Smith -the All Knowing -the Amazing -the Bandit Killer -the Benevolent -the Blue -the Brown -the Conquerer -the Deathless -the Destroyer -the Dragon Spooker -the Emperor -the Gray -the Great -the Magician -the Powerful -the Raven -the Red -the Remorseful -the Seething -the Sorcelator -the Spiral King -the Unending -the Unstoppable -the Weeping -the White -the Wise -the Wizzard -Unseen -Weatherwax +Dark +Darkmagic +Darko +Gray +Honko +Inverse +le Fay +of Void +Shado +Smith +the All Knowing +the Amazing +the Bandit Killer +the Benevolent +the Blue +the Brown +the Conquerer +the Deathless +the Destroyer +the Dragon Spooker +the Emperor +the Gray +the Great +the Magician +the Powerful +the Raven +the Red +the Remorseful +the Seething +the Sorcelator +the Spiral King +the Unending +the Unstoppable +the Weeping +the White +the Wise +the Wizzard +Unseen +Weatherwax Yagg \ No newline at end of file diff --git a/strings/sillytips.txt b/strings/sillytips.txt index e6710de95e..8e28284534 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -23,7 +23,6 @@ Plenty of things that aren't traditionally considered weapons can still be used DEATH IS IMMINENT! This game is older than most of the people playing it. Do not go gentle into that good night. -Flashbangs can weaken blob tiles, allowing for you and the crew to easily destroy them. Just the tip? You can grab someone by clicking on them with the grab intent, then upgrade the grab by clicking on them once more. An aggressive grab will momentarily stun someone, allow you to place Mekhi on a table by clicking on it, or throw them by toggling on throwing. Some people are unable to read text on a game where half of it is based on text. @@ -42,8 +41,7 @@ Mhelp is basically useless, and never used correctly. Being a Mentor just means Toxins Bombs are not the only way to get RnD points. However, nobody will ever do any other method to get sci points... Plasma men are a powerful race with many perks! No really, I swear! So what if they need an "ERP Plasma room" to fuck, who cares! As a Cargo Tech make sure to always buy a tesla to sell back to CC. They love those those. Trust me! -Help. -Maints. +;HELP MAINT Admins always regret meme options in their polls. Putting cat ears on securitrons makes them table people and nya. Mekhi isn't a cat, but he still goes on the table, just roll with it. As a Changeling, you can live without a head as they are merely vestigal to you, now, finally, you can be a Dullahan without it being Halloween. diff --git a/strings/tips.txt b/strings/tips.txt index 2039b30359..68d1cbe57a 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -237,7 +237,7 @@ As a Changeling, you can absorb someone by strangling them and using the Absorb As a Changeling, absorbing someone will give you their full memory. This can include things such as a Traitor's uplink, thus absorbing one will allow you to access the Traitor uplink and buy toys for your Changeling self to abuse. As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out of those wonderful benefits. As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration, be sure to avoid it at all costs as some lunatics may try and flood portions of the station to deal with you. -As a Changeling, death is not the end for you! You can revive after two minutes from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up. +As a Changeling, death is not the end for you! You can revive after 40 seconds from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up. As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person. As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win. As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face. @@ -295,9 +295,9 @@ In a pinch, stripping yourself naked will give you a sizeable resistance to bein Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles! Epipens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time! Anything you can light a cigarette with, you can use to cauterize a bleeding wound. Technically, that includes the supermatter. -Suit storage units entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine. +Suit storage units, when hacked, entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine. Laser pointers can be upgraded by replacing its micro laser with a better one from RnD! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even blinding people with sunglasses. Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting. Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode. You do not regenerate as much stamina while in combat mode. Resting (being on the ground) makes you regenerate stamina faster. -Remember to be in combat mode while in combat, as otherwise you will be penalized by taking more incoming damage and dealing less damage to your adversary. +Keybinds can be reassigned in character setup on the keybindings tab. This is extremely useful, especially if you know how to use independent binds. diff --git a/tgstation.dme b/tgstation.dme index 23f262d7a5..40666bc7ac 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -22,6 +22,7 @@ #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" #include "code\__DEFINES\access.dm" +#include "code\__DEFINES\actionspeed_modifiers.dm" #include "code\__DEFINES\admin.dm" #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" @@ -78,6 +79,7 @@ #include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\monkeys.dm" #include "code\__DEFINES\move_force.dm" +#include "code\__DEFINES\movement.dm" #include "code\__DEFINES\movespeed_modification.dm" #include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" @@ -107,6 +109,7 @@ #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\sound.dm" #include "code\__DEFINES\spaceman_dmm.dm" +#include "code\__DEFINES\species.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\stat_tracking.dm" #include "code\__DEFINES\status_effects.dm" @@ -137,11 +140,13 @@ #include "code\__DEFINES\combat\attack_types.dm" #include "code\__DEFINES\combat\block.dm" #include "code\__DEFINES\combat\block_parry.dm" +#include "code\__DEFINES\combat\stamina_combat.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" #include "code\__DEFINES\mapping\maploader.dm" #include "code\__DEFINES\material\worth.dm" +#include "code\__DEFINES\mobs\innate_abilities.dm" #include "code\__DEFINES\mobs\slowdowns.dm" #include "code\__DEFINES\research\anomalies.dm" #include "code\__DEFINES\research\stock_parts.dm" @@ -150,7 +155,6 @@ #include "code\__DEFINES\storage\_storage.dm" #include "code\__DEFINES\storage\volumetrics.dm" #include "code\__HELPERS\_cit_helpers.dm" -#include "code\__HELPERS\_extools_api.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" @@ -198,6 +202,7 @@ #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" #include "code\__HELPERS\sorts\TimSort.dm" +#include "code\_globalvars\admin.dm" #include "code\_globalvars\bitfields.dm" #include "code\_globalvars\configuration.dm" #include "code\_globalvars\game_modes.dm" @@ -288,9 +293,13 @@ #include "code\controllers\configuration\entries\fail2topic.dm" #include "code\controllers\configuration\entries\game_options.dm" #include "code\controllers\configuration\entries\general.dm" +#include "code\controllers\configuration\entries\logging.dm" +#include "code\controllers\configuration\entries\persistence.dm" #include "code\controllers\configuration\entries\plushies.dm" #include "code\controllers\configuration\entries\policy.dm" #include "code\controllers\configuration\entries\resources.dm" +#include "code\controllers\configuration\entries\respawns.dm" +#include "code\controllers\configuration\entries\stamina_combat.dm" #include "code\controllers\subsystem\acid.dm" #include "code\controllers\subsystem\adjacent_air.dm" #include "code\controllers\subsystem\air.dm" @@ -325,6 +334,7 @@ #include "code\controllers\subsystem\materials.dm" #include "code\controllers\subsystem\medals.dm" #include "code\controllers\subsystem\minimaps.dm" +#include "code\controllers\subsystem\minimum_spawns.dm" #include "code\controllers\subsystem\minor_mapping.dm" #include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\nightshift.dm" @@ -333,11 +343,11 @@ #include "code\controllers\subsystem\pai.dm" #include "code\controllers\subsystem\parallax.dm" #include "code\controllers\subsystem\pathfinder.dm" -#include "code\controllers\subsystem\persistence.dm" #include "code\controllers\subsystem\profiler.dm" #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" #include "code\controllers\subsystem\research.dm" +#include "code\controllers\subsystem\runechat.dm" #include "code\controllers\subsystem\server_maint.dm" #include "code\controllers\subsystem\shuttle.dm" #include "code\controllers\subsystem\sounds.dm" @@ -355,6 +365,13 @@ #include "code\controllers\subsystem\vis_overlays.dm" #include "code\controllers\subsystem\vore.dm" #include "code\controllers\subsystem\vote.dm" +#include "code\controllers\subsystem\persistence\_persistence.dm" +#include "code\controllers\subsystem\persistence\cleanable_debris.dm" +#include "code\controllers\subsystem\persistence\panic_bunker.dm" +#include "code\controllers\subsystem\persistence\poly_parrot.dm" +#include "code\controllers\subsystem\persistence\recent_votes_etc.dm" +#include "code\controllers\subsystem\persistence\secret_satchels.dm" +#include "code\controllers\subsystem\persistence\trophies.dm" #include "code\controllers\subsystem\processing\chemistry.dm" #include "code\controllers\subsystem\processing\circuit.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" @@ -410,6 +427,7 @@ #include "code\datums\spawners_menu.dm" #include "code\datums\tgs_event_handler.dm" #include "code\datums\verbs.dm" +#include "code\datums\view.dm" #include "code\datums\weakrefs.dm" #include "code\datums\world_topic.dm" #include "code\datums\actions\beam_rifle.dm" @@ -483,9 +501,11 @@ #include "code\datums\components\swarming.dm" #include "code\datums\components\tackle.dm" #include "code\datums\components\thermite.dm" +#include "code\datums\components\twitch_plays.dm" #include "code\datums\components\twohanded.dm" #include "code\datums\components\uplink.dm" #include "code\datums\components\virtual_reality.dm" +#include "code\datums\components\waddling.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\crafting\crafting.dm" @@ -518,6 +538,7 @@ #include "code\datums\components\storage\concrete\rped.dm" #include "code\datums\components\storage\concrete\special.dm" #include "code\datums\components\storage\concrete\stack.dm" +#include "code\datums\components\storage\concrete\tcg.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\anxiety.dm" @@ -576,6 +597,7 @@ #include "code\datums\elements\_element.dm" #include "code\datums\elements\art.dm" #include "code\datums\elements\beauty.dm" +#include "code\datums\elements\bed_tucking.dm" #include "code\datums\elements\bsa_blocker.dm" #include "code\datums\elements\cleaning.dm" #include "code\datums\elements\decal.dm" @@ -601,6 +623,7 @@ #include "code\datums\elements\tactical.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\elements\update_icon_updates_onmob.dm" +#include "code\datums\elements\ventcrawling.dm" #include "code\datums\elements\wuv.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" @@ -744,6 +767,7 @@ #include "code\game\gamemodes\dynamic\dynamic_rulesets.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_minor.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" #include "code\game\gamemodes\dynamic\dynamic_storytellers.dm" #include "code\game\gamemodes\eldritch_cult\eldritch_cult.dm" @@ -784,6 +808,7 @@ #include "code\game\machinery\buttons.dm" #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\cloning.dm" +#include "code\game\machinery\colormate.dm" #include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\cryopod.dm" #include "code\game\machinery\dance_machine.dm" @@ -944,6 +969,7 @@ #include "code\game\objects\structures.dm" #include "code\game\objects\effects\alien_acid.dm" #include "code\game\objects\effects\anomalies.dm" +#include "code\game\objects\effects\arachnid_web.dm" #include "code\game\objects\effects\blessing.dm" #include "code\game\objects\effects\bump_teleporter.dm" #include "code\game\objects\effects\contraband.dm" @@ -1347,6 +1373,10 @@ #include "code\game\turfs\simulated\wall\reinf_walls.dm" #include "code\game\turfs\space\space.dm" #include "code\game\turfs\space\transit.dm" +#include "code\modules\actionspeed\_actionspeed_modifier.dm" +#include "code\modules\actionspeed\modifiers\base.dm" +#include "code\modules\actionspeed\modifiers\mood.dm" +#include "code\modules\actionspeed\modifiers\status_effects.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_investigate.dm" #include "code\modules\admin\admin_ranks.dm" @@ -1792,6 +1822,7 @@ #include "code\modules\awaymissions\mission_code\caves.dm" #include "code\modules\awaymissions\mission_code\centcomAway.dm" #include "code\modules\awaymissions\mission_code\challenge.dm" +#include "code\modules\awaymissions\mission_code\jungleresort.dm" #include "code\modules\awaymissions\mission_code\moonoutpost19.dm" #include "code\modules\awaymissions\mission_code\murderdome.dm" #include "code\modules\awaymissions\mission_code\research.dm" @@ -2274,7 +2305,6 @@ #include "code\modules\jobs\job_types\station_engineer.dm" #include "code\modules\jobs\job_types\virologist.dm" #include "code\modules\jobs\job_types\warden.dm" -#include "code\modules\jobs\map_changes\map_changes.dm" #include "code\modules\keybindings\bindings_atom.dm" #include "code\modules\keybindings\bindings_client.dm" #include "code\modules\keybindings\focus.dm" @@ -2285,6 +2315,7 @@ #include "code\modules\keybindings\keybind\carbon.dm" #include "code\modules\keybindings\keybind\client.dm" #include "code\modules\keybindings\keybind\combat.dm" +#include "code\modules\keybindings\keybind\communication.dm" #include "code\modules\keybindings\keybind\emote.dm" #include "code\modules\keybindings\keybind\human.dm" #include "code\modules\keybindings\keybind\living.dm" @@ -2293,6 +2324,7 @@ #include "code\modules\keybindings\keybind\robot.dm" #include "code\modules\keybindings\keybind\targeting.dm" #include "code\modules\language\aphasia.dm" +#include "code\modules\language\arachnid.dm" #include "code\modules\language\beachbum.dm" #include "code\modules\language\codespeak.dm" #include "code\modules\language\common.dm" @@ -2307,6 +2339,7 @@ #include "code\modules\language\mushroom.dm" #include "code\modules\language\narsian.dm" #include "code\modules\language\ratvarian.dm" +#include "code\modules\language\signlanguage.dm" #include "code\modules\language\slime.dm" #include "code\modules\language\swarmer.dm" #include "code\modules\language\sylvan.dm" @@ -2388,6 +2421,7 @@ #include "code\modules\mob\clickdelay.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\emote.dm" +#include "code\modules\mob\innate_abilities.dm" #include "code\modules\mob\inventory.dm" #include "code\modules\mob\login.dm" #include "code\modules\mob\logout.dm" @@ -2411,6 +2445,7 @@ #include "code\modules\mob\dead\new_player\preferences_setup.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\alienpeople.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\arachnid.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\Citadel_Snowflake.dm" @@ -2435,6 +2470,7 @@ #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\observer_movement.dm" #include "code\modules\mob\dead\observer\orbit.dm" +#include "code\modules\mob\dead\observer\respawn.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\living\blood.dm" #include "code\modules\mob\living\bloodcrawl.dm" @@ -2452,10 +2488,12 @@ #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_mobility.dm" #include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\living_signals.dm" #include "code\modules\mob\living\living_sprint.dm" #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\stamina_buffer.dm" #include "code\modules\mob\living\status_procs.dm" #include "code\modules\mob\living\taste.dm" #include "code\modules\mob\living\update_icons.dm" @@ -2479,6 +2517,7 @@ #include "code\modules\mob\living\carbon\death.dm" #include "code\modules\mob\living\carbon\emote.dm" #include "code\modules\mob\living\carbon\examine.dm" +#include "code\modules\mob\living\carbon\handle_corruption.dm" #include "code\modules\mob\living\carbon\inventory.dm" #include "code\modules\mob\living\carbon\life.dm" #include "code\modules\mob\living\carbon\say.dm" @@ -2538,9 +2577,14 @@ #include "code\modules\mob\living\carbon\human\status_procs.dm" #include "code\modules\mob\living\carbon\human\typing_indicator.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\species_types\abductors.dm" +#include "code\modules\mob\living\carbon\human\innate_abilities\blobform.dm" +#include "code\modules\mob\living\carbon\human\innate_abilities\customization.dm" +#include "code\modules\mob\living\carbon\human\innate_abilities\limb_regeneration.dm" +#include "code\modules\mob\living\carbon\human\species_types\abductor.dm" #include "code\modules\mob\living\carbon\human\species_types\android.dm" #include "code\modules\mob\living\carbon\human\species_types\angel.dm" +#include "code\modules\mob\living\carbon\human\species_types\anthromorph.dm" +#include "code\modules\mob\living\carbon\human\species_types\arachnid.dm" #include "code\modules\mob\living\carbon\human\species_types\bugmen.dm" #include "code\modules\mob\living\carbon\human\species_types\corporate.dm" #include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" @@ -2548,7 +2592,6 @@ #include "code\modules\mob\living\carbon\human\species_types\ethereal.dm" #include "code\modules\mob\living\carbon\human\species_types\felinid.dm" #include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\furrypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\golems.dm" #include "code\modules\mob\living\carbon\human\species_types\humans.dm" #include "code\modules\mob\living\carbon\human\species_types\ipc.dm" @@ -2677,6 +2720,7 @@ #include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm" #include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm" #include "code\modules\mob\living\simple_animal\guardian\types\fire.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\gravitokinetic.dm" #include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm" #include "code\modules\mob\living\simple_animal\guardian\types\protector.dm" #include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm" @@ -2686,6 +2730,7 @@ #include "code\modules\mob\living\simple_animal\hostile\banana_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\bear.dm" #include "code\modules\mob\living\simple_animal\hostile\bees.dm" +#include "code\modules\mob\living\simple_animal\hostile\bread.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm" #include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" @@ -2745,6 +2790,7 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_whelp.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\lobsterosity.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm" @@ -3117,7 +3163,7 @@ #include "code\modules\reagents\chemistry\recipes\special.dm" #include "code\modules\reagents\chemistry\recipes\toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" -#include "code\modules\reagents\reagent_containers\borghydro.dm" +#include "code\modules\reagents\reagent_containers\borghypo.dm" #include "code\modules\reagents\reagent_containers\bottle.dm" #include "code\modules\reagents\reagent_containers\chem_pack.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" @@ -3289,6 +3335,7 @@ #include "code\modules\ruins\spaceruin_code\miracle.dm" #include "code\modules\ruins\spaceruin_code\oldstation.dm" #include "code\modules\ruins\spaceruin_code\originalcontent.dm" +#include "code\modules\ruins\spaceruin_code\skelter.dm" #include "code\modules\ruins\spaceruin_code\spacehotel.dm" #include "code\modules\ruins\spaceruin_code\TheDerelict.dm" #include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm" @@ -3311,6 +3358,7 @@ #include "code\modules\shuttle\shuttle.dm" #include "code\modules\shuttle\shuttle_rotate.dm" #include "code\modules\shuttle\snaxi.dm" +#include "code\modules\shuttle\spaceship_navigation_beacon.dm" #include "code\modules\shuttle\special.dm" #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" @@ -3360,6 +3408,7 @@ #include "code\modules\spells\spell_types\taeclowndo.dm" #include "code\modules\spells\spell_types\telepathy.dm" #include "code\modules\spells\spell_types\the_traps.dm" +#include "code\modules\spells\spell_types\togglebuff.dm" #include "code\modules\spells\spell_types\touch_attacks.dm" #include "code\modules\spells\spell_types\trigger.dm" #include "code\modules\spells\spell_types\turf_teleport.dm" @@ -3383,6 +3432,7 @@ #include "code\modules\surgery\dental_implant.dm" #include "code\modules\surgery\embalming.dm" #include "code\modules\surgery\emergency_cardioversion_recovery.dm" +#include "code\modules\surgery\emergency_reboot.dm" #include "code\modules\surgery\experimental_dissection.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\graft_synthtissue.dm" @@ -3398,6 +3448,7 @@ #include "code\modules\surgery\organic_steps.dm" #include "code\modules\surgery\plastic_surgery.dm" #include "code\modules\surgery\prosthetic_replacement.dm" +#include "code\modules\surgery\purge_corruption.dm" #include "code\modules\surgery\remove_embedded_object.dm" #include "code\modules\surgery\repair_puncture.dm" #include "code\modules\surgery\robot_brain_surgery.dm" @@ -3443,6 +3494,10 @@ #include "code\modules\surgery\organs\tails.dm" #include "code\modules\surgery\organs\tongue.dm" #include "code\modules\surgery\organs\vocal_cords.dm" +#include "code\modules\tcg\cards.dm" +#include "code\modules\tcg\pack_1.dm" +#include "code\modules\tcg\pack_nuclear.dm" +#include "code\modules\tcg\pack_star.dm" #include "code\modules\tgchat\message.dm" #include "code\modules\tgchat\to_chat.dm" #include "code\modules\tgs\includes.dm" @@ -3576,6 +3631,7 @@ #include "modular_citadel\code\modules\client\loadout\shoes.dm" #include "modular_citadel\code\modules\client\loadout\suit.dm" #include "modular_citadel\code\modules\client\loadout\uniform.dm" +#include "modular_citadel\code\modules\client\loadout\unlockable.dm" #include "modular_citadel\code\modules\client\verbs\who.dm" #include "modular_citadel\code\modules\clothing\neck.dm" #include "modular_citadel\code\modules\clothing\trek.dm" @@ -3592,7 +3648,6 @@ #include "modular_citadel\code\modules\mentor\mentorpm.dm" #include "modular_citadel\code\modules\mentor\mentorsay.dm" #include "modular_citadel\code\modules\mob\cit_emotes.dm" -#include "modular_citadel\code\modules\mob\living\damage_procs.dm" #include "modular_citadel\code\modules\mob\living\living.dm" #include "modular_citadel\code\modules\mob\living\carbon\carbon.dm" #include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm" diff --git a/tgui/.yarn/sdks/eslint/bin/eslint.js b/tgui/.yarn/sdks/eslint/bin/eslint.js new file mode 100644 index 0000000000..c5d4c64928 --- /dev/null +++ b/tgui/.yarn/sdks/eslint/bin/eslint.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve, dirname} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.js"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require eslint/bin/eslint.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real eslint/bin/eslint.js your application uses +module.exports = absRequire(`eslint/bin/eslint.js`); diff --git a/tgui/.yarn/sdks/eslint/package.json b/tgui/.yarn/sdks/eslint/package.json new file mode 100644 index 0000000000..620b0a937a --- /dev/null +++ b/tgui/.yarn/sdks/eslint/package.json @@ -0,0 +1,6 @@ +{ + "name": "eslint", + "version": "7.4.0-pnpify", + "main": "./lib/api.js", + "type": "commonjs" +} diff --git a/tgui/.yarn/sdks/integrations.yml b/tgui/.yarn/sdks/integrations.yml new file mode 100644 index 0000000000..76ed42ba94 --- /dev/null +++ b/tgui/.yarn/sdks/integrations.yml @@ -0,0 +1,5 @@ +# This file is automatically generated by PnPify. +# Manual changes will be lost! + +integrations: + - vscode diff --git a/tgui/global.d.ts b/tgui/global.d.ts index 31fc6a1057..594ce7f9d4 100644 --- a/tgui/global.d.ts +++ b/tgui/global.d.ts @@ -97,11 +97,21 @@ interface ByondType { winset(id: string, propName: string, propValue: any): void; /** - * Parses BYOND JSON + * Parses BYOND JSON. * * Uses a special encoding to preverse Infinity and NaN. */ parseJson(text: string): any; + + /** + * Loads a stylesheet into the document. + */ + loadCss(url: string): void; + + /** + * Loads a script into the document. + */ + loadJs(url: string): void; } declare const Byond: ByondType; diff --git a/tgui/packages/common/storage.js b/tgui/packages/common/storage.js index 83dc6d99c1..16bb47c024 100644 --- a/tgui/packages/common/storage.js +++ b/tgui/packages/common/storage.js @@ -11,7 +11,7 @@ export const IMPL_LOCAL_STORAGE = 1; export const IMPL_INDEXED_DB = 2; const INDEXED_DB_VERSION = 1; -const INDEXED_DB_NAME = 'tgui'; +const INDEXED_DB_NAME = 'tgui-citadel-main'; const INDEXED_DB_STORE_NAME = 'storage-v1'; const READ_ONLY = 'readonly'; diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json index f1ab17a264..f72ac63d1f 100644 --- a/tgui/packages/tgui-dev-server/package.json +++ b/tgui/packages/tgui-dev-server/package.json @@ -3,7 +3,7 @@ "name": "tgui-dev-server", "version": "4.2.0", "dependencies": { - "axios": "^0.19.2", + "axios": "^0.21.1", "common": "workspace:*", "esm": "^3.2.25", "glob": "^7.1.4", diff --git a/tgui/packages/tgui-panel/chat/renderer.js b/tgui/packages/tgui-panel/chat/renderer.js index 10b1c6e024..f16ed9046a 100644 --- a/tgui/packages/tgui-panel/chat/renderer.js +++ b/tgui/packages/tgui-panel/chat/renderer.js @@ -176,7 +176,7 @@ class ChatRenderer { this.highlightColor = null; return; } - const allowedRegex = /^[a-z0-9_\-\s]+$/ig; + const allowedRegex = /^[a-z0-9_\-\s]+$/i; // citadel update - ig changed to i for flags, to fix issues with highlighting only working for every other word. const lines = String(text) .split(',') .map(str => str.trim()) diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss index d84adf597f..61de741dde 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss @@ -255,7 +255,7 @@ a.popt { /* ADD HERE FOR ITALIC */ -.italic, .italics, .emote { +.italic, .italics { font-style: italic; } @@ -418,7 +418,7 @@ em { } .emote { - font-style: italic; + } .userdanger { @@ -840,7 +840,7 @@ em { .command_headset { font-weight: bold; - font-size: 160%; + font-size: 125%; } .small { @@ -876,7 +876,7 @@ em { .clown { color: #ff70c1; - font-size: 160%; + font-size: 125%; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold; } @@ -892,6 +892,10 @@ em { font-style: italic; } +.spooky { + color: #FF9100; +} + .hypnophrase { color: #202020; font-weight: bold; diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss index 2700ec01c1..2ea4d418b5 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss @@ -273,8 +273,7 @@ a.popt { .italic, -.italics, -.emote { +.italics { font-style: italic; } @@ -443,10 +442,6 @@ h1.alert, h2.alert { color: #000000; } -.emote { - font-style: italic; -} - .userdanger { color: #ff0000; font-weight: bold; @@ -886,7 +881,7 @@ h1.alert, h2.alert { .command_headset { font-weight: bold; - font-size: 160%; + font-size: 125%; } .small { @@ -922,7 +917,7 @@ h1.alert, h2.alert { .clown { color: #FF69Bf; - font-size: 160%; + font-size: 125%; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold; } @@ -938,6 +933,10 @@ h1.alert, h2.alert { font-style: italic; } +.spooky { + color: #FF9100; +} + .hypnophrase { color: #0d0d0d; font-weight: bold; diff --git a/tgui/packages/tgui-panel/styles/main.scss b/tgui/packages/tgui-panel/styles/main.scss index 86a2986920..6f090392ab 100644 --- a/tgui/packages/tgui-panel/styles/main.scss +++ b/tgui/packages/tgui-panel/styles/main.scss @@ -30,7 +30,6 @@ @include meta.load-css('~tgui/styles/components/Dimmer.scss'); @include meta.load-css('~tgui/styles/components/Divider.scss'); @include meta.load-css('~tgui/styles/components/Dropdown.scss'); -@include meta.load-css('~tgui/styles/components/FatalError.scss'); @include meta.load-css('~tgui/styles/components/Flex.scss'); @include meta.load-css('~tgui/styles/components/Input.scss'); @include meta.load-css('~tgui/styles/components/Knob.scss'); diff --git a/tgui/packages/tgui/assets.js b/tgui/packages/tgui/assets.js index 2f2e2ba543..db6dd635c0 100644 --- a/tgui/packages/tgui/assets.js +++ b/tgui/packages/tgui/assets.js @@ -4,68 +4,9 @@ * @license MIT */ -import { loadCSS as fgLoadCss } from 'fg-loadcss'; -import { createLogger } from './logging'; - -const logger = createLogger('assets'); - const EXCLUDED_PATTERNS = [/v4shim/i]; -const RETRY_ATTEMPTS = 5; -const RETRY_INTERVAL = 3000; - -const loadedStyleSheetByUrl = {}; const loadedMappings = {}; -export const loadStyleSheet = (url, attempt = 1) => { - if (loadedStyleSheetByUrl[url]) { - return; - } - loadedStyleSheetByUrl[url] = true; - logger.log(`loading stylesheet '${url}'`); - /** @type {HTMLLinkElement} */ - let node = fgLoadCss(url); - node.addEventListener('load', () => { - if (!isStyleSheetReallyLoaded(node, url)) { - node.parentNode.removeChild(node); - node = null; - loadedStyleSheetByUrl[url] = null; - if (attempt >= RETRY_ATTEMPTS) { - logger.error(`Error: Failed to load the stylesheet ` - + `'${url}' after ${RETRY_ATTEMPTS} attempts.\nIt was either ` - + `not found, or you're trying to load an empty stylesheet ` - + `that has no CSS rules in it.`); - return; - } - setTimeout(() => loadStyleSheet(url, attempt + 1), RETRY_INTERVAL); - return; - } - }); -}; - -/** - * Checks whether the stylesheet was registered in the DOM - * and is not empty. - */ -const isStyleSheetReallyLoaded = (node, url) => { - // Method #1 (works on IE10+) - const styleSheet = node.sheet; - if (styleSheet) { - return styleSheet.rules.length > 0; - } - // Method #2 - const styleSheets = document.styleSheets; - const len = styleSheets.length; - for (let i = 0; i < len; i++) { - const styleSheet = styleSheets[i]; - if (styleSheet.href.includes(url)) { - return styleSheet.rules.length > 0; - } - } - // All methods failed - logger.warn(`Warning: stylesheet '${url}' was not found in the DOM`); - return false; -}; - export const resolveAsset = name => ( loadedMappings[name] || name ); @@ -73,7 +14,7 @@ export const resolveAsset = name => ( export const assetMiddleware = store => next => action => { const { type, payload } = action; if (type === 'asset/stylesheet') { - loadStyleSheet(payload); + Byond.loadCss(payload); return; } if (type === 'asset/mappings') { @@ -86,7 +27,10 @@ export const assetMiddleware = store => next => action => { const ext = name.split('.').pop(); loadedMappings[name] = url; if (ext === 'css') { - loadStyleSheet(url); + Byond.loadCss(url); + } + if (ext === 'js') { + Byond.loadJs(url); } } return; diff --git a/tgui/packages/tgui/backend.js b/tgui/packages/tgui/backend.js index 1cfd4294f6..06f45ad55e 100644 --- a/tgui/packages/tgui/backend.js +++ b/tgui/packages/tgui/backend.js @@ -189,6 +189,9 @@ export const backendMiddleware = store => { // Resume on incoming update if (type === 'backend/update' && suspended) { + // Show the payload + logger.log('backend/update', payload); + // Signal renderer that we have resumed resumeRenderer(); // Setup drag setupDrag(); diff --git a/tgui/packages/tgui/debug/middleware.js b/tgui/packages/tgui/debug/middleware.js index 2fa3ed42e6..6c11d32e0f 100644 --- a/tgui/packages/tgui/debug/middleware.js +++ b/tgui/packages/tgui/debug/middleware.js @@ -24,7 +24,7 @@ export const debugMiddleware = store => { if (key.code === KEY_F12) { store.dispatch(toggleKitchenSink()); } - if (key.ctrl && key.shift && key.code === KEY_BACKSPACE) { + if (key.ctrl && key.alt && key.code === KEY_BACKSPACE) { // NOTE: We need to call this in a timeout, because we need a clean // stack in order for this to be a fatal error. setTimeout(() => { diff --git a/tgui/packages/tgui/interfaces/Apc.js b/tgui/packages/tgui/interfaces/Apc.js index 60a11789bc..face676282 100644 --- a/tgui/packages/tgui/interfaces/Apc.js +++ b/tgui/packages/tgui/interfaces/Apc.js @@ -211,6 +211,29 @@ const ApcContent = (props, context) => { content={data.nightshiftLights ? 'Enabled' : 'Disabled'} onClick={() => act('toggle_nightshift')} /> )} /> + {data.hijackable === 1 && ( + + + ))} + + ); +}; + +const Bays = (props, context) => { + const { act, data } = useBackend(context); + const [compact] = useCompact(context); + return ( +
+
+ ); +}; + +const Timing = (props, context) => { + const { act, data } = useBackend(context); + + return ( +
act('resetTiming')} /> + )}> + + {DELAYS.map((delay, i) => ( + + toFixed(value, 2)} + maxValue={10} + color={(data["delay_"+(i+1)]/10) > 10 ? "orange" : "default"} + onDrag={(e, value) => { + act('editTiming', { + timer: i + 1, + value: Math.max(value, 0), + }); + }} /> + + ))} + +
+ ); +}; + +const Sounds = (props, context) => { + const { act, data } = useBackend(context); + return ( +
act('soundVolume')} /> + )}> + {SOUNDS.map((sound, i) => ( +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.js b/tgui/packages/tgui/interfaces/ChemDispenser.js index c2f68b5e28..23498caf34 100644 --- a/tgui/packages/tgui/interfaces/ChemDispenser.js +++ b/tgui/packages/tgui/interfaces/ChemDispenser.js @@ -1,13 +1,20 @@ import { toFixed } from 'common/math'; import { toTitleCase } from 'common/string'; import { Fragment } from 'inferno'; -import { useBackend } from '../backend'; -import { AnimatedNumber, Box, Button, Icon, LabeledList, ProgressBar, Section } from '../components'; +import { useBackend, useLocalState } from '../backend'; +import { AnimatedNumber, Box, Button, Icon, LabeledList, ProgressBar, Section, Table, NumberInput } from '../components'; import { Window } from '../layouts'; export const ChemDispenser = (props, context) => { const { act, data } = useBackend(context); const recording = !!data.recordingRecipe; + const [hasCol, setHasCol] = useLocalState( + context, 'fs_title', false); + const [modeToggle, setModeToggle] = useLocalState( + context, 'mode_toggle', true); + const { + storedContents = [], + } = data; // TODO: Change how this piece of shit is built on server side // It has to be a list, not a fucking OBJECT! const recipes = Object.keys(data.recipes) @@ -28,17 +35,27 @@ export const ChemDispenser = (props, context) => { return (
- - Recording - - )}> + buttons={ + [(recording && ( + + + Recording + + )), +
( -
+ {!!data.canStore && ( +
+ Transfer amount: + + u + + }> + + {toFixed(data.storedVol) + ' units / ' + data.maxVol + ' units'} + + + {storedContents.map(chemical => ( + + ))} + +
+ )}
{ {recording && 'Virtual beaker' || data.isBeakerLoaded - && ( - - - /{data.beakerMaxVolume} units - - ) + && ( + + + /{data.beakerMaxVolume} units + + ) || 'No beaker'} { {(!data.isBeakerLoaded && !recording) && 'N/A' || beakerContents.length === 0 && 'Nothing'} - {beakerContents.map(chemical => ( - - - {' '} - units of {chemical.name} - - ))} + + {beakerContents.map(chemical => ( + + ))} + + + pH: + +
@@ -189,3 +260,60 @@ export const ChemDispenser = (props, context) => {
); }; + + +const ChemicalBuffer = Table; + +const ChemicalBufferEntry = (props, context) => { + const { act, data } = useBackend(context); + const { chemical, transferTo } = props; + return ( + + + + {` units of ${chemical.name}`} + + + - - - - - - diff --git a/tools/UnstandardnessTestForDM/readme.txt b/tools/UnstandardnessTestForDM/readme.txt index 3fb04ee4df..8d3c5168dc 100644 --- a/tools/UnstandardnessTestForDM/readme.txt +++ b/tools/UnstandardnessTestForDM/readme.txt @@ -1,4 +1,4 @@ -the compiled exe file for the Unstandardness text for DM program is in: -UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe - -You have to move it to the root folder (where the dme file is) and run it from there for it to work. +the compiled exe file for the Unstandardness text for DM program is in: +UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe + +You have to move it to the root folder (where the dme file is) and run it from there for it to work. diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index b2bcaeb884..035d777feb 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -5,11 +5,13 @@ * For documentation on the changelog generator see https://tgstation13.org/phpBB/viewtopic.php?f=5&t=5157 * To hide prs from being announced in game, place a [s] in front of the title * All runtime errors are echo'ed to the webhook's logs in github + * Events to be sent via GitHub webhook: Pull Requests, Pushes + * Any other Event will result in a 404 returned to the webhook. */ /**CREDITS: * GitHub webhook handler template. - * + * * @see https://developer.github.com/webhooks/ * @author Miloslav Hula (https://github.com/milo) */ @@ -23,6 +25,7 @@ define('F_UNVALIDATED_USER', 1<<0); define('F_SECRET_PR', 1<<1); //CONFIGS ARE IN SECRET.PHP, THESE ARE JUST DEFAULTS! + $hookSecret = '08ajh0qj93209qj90jfq932j32r'; $apiKey = '209ab8d879c0f987d06a09b9d879c0f987d06a09b9d8787d0a089c'; $repoOwnerAndName = "tgstation/tgstation"; @@ -32,7 +35,7 @@ $path_to_script = 'tools/WebhookProcessor/github_webhook_processor.php'; $tracked_branch = "master"; $trackPRBalance = true; $prBalanceJson = ''; -$startingPRBalance = 5; +$startingPRBalance = 30; $maintainer_team_id = 133041; $validation = "org"; $validation_count = 1; @@ -123,24 +126,24 @@ switch (strtolower($_SERVER['HTTP_X_GITHUB_EVENT'])) { function apisend($url, $method = 'GET', $content = null, $authorization = null) { if (is_array($content)) $content = json_encode($content); - + $headers = array(); $headers[] = 'Content-type: application/json'; if ($authorization) $headers[] = 'Authorization: ' . $authorization; - + $scontext = array('http' => array( 'method' => $method, 'header' => implode("\r\n", $headers), 'ignore_errors' => true, 'user_agent' => 'tgstation13.org-Github-Automation-Tools' )); - + if ($content) $scontext['http']['content'] = $content; - + return file_get_contents($url, false, stream_context_create($scontext)); - + } function github_apisend($url, $method = 'GET', $content = NULL) { @@ -175,7 +178,7 @@ function validate_user($payload) { $res = github_apisend('https://api.github.com/search/issues?q='.$querystring); $res = json_decode($res, TRUE); return $res['total_count'] >= (int)$validation_count; - + } function get_labels($payload){ @@ -224,7 +227,7 @@ function tag_pr($payload, $opened) { sleep(10); $payload['pull_request'] = json_decode(github_apisend($url), TRUE); } - + $tags = array(); $title = $payload['pull_request']['title']; if($opened) { //you only have one shot on these ones so as to not annoy maintainers @@ -232,7 +235,7 @@ function tag_pr($payload, $opened) { if(strpos(strtolower($title), 'refactor') !== FALSE) $tags[] = 'Refactor'; - + if(strpos(strtolower($title), 'revert') !== FALSE) $tags[] = 'Revert'; if(strpos(strtolower($title), 'removes') !== FALSE) @@ -299,7 +302,7 @@ function check_ready_for_review($payload, $labels = null, $remove = array()){ if($L == $r4rlabel) $has_label_already = true; } - + if($has_label_already && $should_not_have_label){ $remove[] = $r4rlabel; return $returned; @@ -337,7 +340,7 @@ function check_ready_for_review($payload, $labels = null, $remove = array()){ //make sure they are part of an offending review if(!in_array($C['pull_request_review_id'], $reviews_ids_with_changes_requested)) continue; - + //review comments which are outdated have a null position if($C['position'] !== null){ if($has_label_already) @@ -360,10 +363,10 @@ function check_dismiss_changelog_review($payload){ if(!$require_changelog) return; - + if(!$no_changelog) checkchangelog($payload, false); - + $review_message = 'Your changelog for this PR is either malformed or non-existent. Please create one to document your changes.'; $reviews = get_reviews($payload); @@ -392,14 +395,12 @@ function handle_pr($payload) { set_labels($payload, $labels, $remove); if($no_changelog) check_dismiss_changelog_review($payload); - /* if(get_pr_code_friendliness($payload) <= 0){ $balances = pr_balances(); $author = $payload['pull_request']['user']['login']; if(isset($balances[$author]) && $balances[$author] < 0 && !is_maintainer($payload, $author)) create_comment($payload, 'You currently have a negative Fix/Feature pull request delta of ' . $balances[$author] . '. Maintainers may close this PR at will. Fixing issues or improving the codebase will improve this score.'); } - */ break; case 'edited': check_dismiss_changelog_review($payload); @@ -426,8 +427,8 @@ function handle_pr($payload) { break; default: return; - } - + } + $pr_flags = 0; if (strpos(strtolower($payload['pull_request']['title']), '[s]') !== false) { $pr_flags |= F_SECRET_PR; @@ -437,7 +438,7 @@ function handle_pr($payload) { } discord_announce($action, $payload, $pr_flags); game_announce($action, $payload, $pr_flags); - + } function filter_announce_targets($targets, $owner, $repo, $action, $pr_flags) { @@ -446,7 +447,7 @@ function filter_announce_targets($targets, $owner, $repo, $action, $pr_flags) { unset($targets[$i]); continue; } - + if (isset($target['announce_secret']) && $target['announce_secret']) { if (!($pr_flags & F_SECRET_PR) && $target['announce_secret'] === 'only') { unset($targets[$i]); @@ -456,7 +457,7 @@ function filter_announce_targets($targets, $owner, $repo, $action, $pr_flags) { unset($targets[$i]); continue; } - + if (isset($target['announce_unvalidated']) && $target['announce_unvalidated']) { if (!($pr_flags & F_UNVALIDATED_USER) && $target['announce_unvalidated'] === 'only') { unset($targets[$i]); @@ -466,7 +467,7 @@ function filter_announce_targets($targets, $owner, $repo, $action, $pr_flags) { unset($targets[$i]); continue; } - + $wildcard = false; if (isset($target['include_repos'])) { foreach ($target['include_repos'] as $match_string) { @@ -489,7 +490,7 @@ function filter_announce_targets($targets, $owner, $repo, $action, $pr_flags) { continue; } } - + if (isset($target['exclude_repos'])) foreach ($target['exclude_repos'] as $match_string) { $owner_repo_pair = explode('/', strtolower($match_string)); @@ -516,13 +517,13 @@ function filter_announce_targets($targets, $owner, $repo, $action, $pr_flags) { function game_announce($action, $payload, $pr_flags) { global $servers; - + $msg = '['.$payload['pull_request']['base']['repo']['full_name'].'] Pull Request '.$action.' by '.htmlSpecialChars($payload['sender']['login']).': '.htmlSpecialChars('#'.$payload['pull_request']['number'].' '.$payload['pull_request']['user']['login'].' - '.$payload['pull_request']['title']).''; $game_servers = filter_announce_targets($servers, $payload['pull_request']['base']['repo']['owner']['login'], $payload['pull_request']['base']['repo']['name'], $action, $pr_flags); - + $msg = '?announce='.urlencode($msg).'&payload='.urlencode(json_encode($payload)); - + foreach ($game_servers as $serverid => $server) { $server_message = $msg; if (isset($server['comskey'])) @@ -553,9 +554,9 @@ function discord_announce($action, $payload, $pr_flags) { 'username' => 'GitHub', 'avatar_url' => $payload['pull_request']['base']['user']['avatar_url'], ); - + $content = 'Pull Request #'.$payload['pull_request']['number'].' *'.$action.'* by '.discord_sanitize($payload['sender']['login'])."\n".discord_sanitize($payload['pull_request']['user']['login']).' - __**'.discord_sanitize($payload['pull_request']['title']).'**__'."\n".'<'.$payload['pull_request']['html_url'].'>'; - + $embeds = array( array( 'title' => '__**'.discord_sanitize($payload['pull_request']['title'], S_MARKDOWN).'**__', @@ -585,22 +586,22 @@ function discord_announce($action, $payload, $pr_flags) { } discord_webhook_send($discordWebHook['url'], $sending_data); } - + } -function discord_sanitize($text, $flags = S_MENTIONS|S_LINK_EMBED|S_MARKDOWN) { +function discord_sanitize($text, $flags = S_MENTIONS|S_LINK_EMBED|S_MARKDOWN) { if ($flags & S_MARKDOWN) $text = str_ireplace(array('\\', '*', '_', '~', '`', '|'), (array('\\\\', '\\*', '\\_', '\\~', '\\`', '\\|')), $text); - + if ($flags & S_HTML_COMMENTS) $text = preg_replace('//Uis', '', $text); - + if ($flags & S_MENTIONS) $text = str_ireplace(array('@everyone', '@here', '<@'), array('`@everyone`', '`@here`', '@<'), $text); if ($flags & S_LINK_EMBED) $text = preg_replace("/((https?|ftp|byond)\:\/\/)([a-z0-9-.]*)\.([a-z]{2,3})(\:[0-9]{2,5})?(\/(?:[a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/mi", '<$0>', $text); - + return $text; } @@ -642,36 +643,40 @@ function get_pr_code_friendliness($payload, $oldbalance = null){ $labels = get_pr_labels_array($payload); //anything not in this list defaults to 0 $label_values = array( - 'Fix' => 2, - 'Refactor' => 2, - 'CI/Tests' => 3, - 'Code Improvement' => 1, + 'Fix' => 3, + 'Refactor' => 10, + 'Code Improvement' => 2, 'Grammar and Formatting' => 1, - 'Priority: High' => 4, - 'Priority: CRITICAL' => 5, + 'Priority: High' => 15, + 'Priority: CRITICAL' => 20, + 'Unit Tests' => 6, 'Logging' => 1, - 'Feedback' => 1, - 'Performance' => 3, - 'Feature' => -1, - 'Balance/Rebalance' => -1, - 'PRB: Reset' => $startingPRBalance - $oldbalance, + 'Feedback' => 2, + 'Performance' => 12, + 'Feature' => -10, + 'Balance/Rebalance' => -8, + 'Tweak' => -2, + 'Sound' => 1, + 'Sprites' => 1, + 'GBP: Reset' => $startingPRBalance - $oldbalance, ); - $affecting = 0; - $is_neutral = FALSE; - $found_something_positive = false; + $maxNegative = 0; + $maxPositive = 0; foreach($labels as $l){ - if($l == 'PRB: No Update') { //no effect on balance - $affecting = 0; - break; + if($l == 'GBP: No Update') { //no effect on balance + return 0; } else if(isset($label_values[$l])) { $friendliness = $label_values[$l]; if($friendliness > 0) - $found_something_positive = true; - $affecting = $found_something_positive ? max($affecting, $friendliness) : $friendliness; + $maxPositive = max($friendliness, $maxPositive); + else + $maxNegative = min($friendliness, $maxNegative); } } + + $affecting = abs($maxNegative) >= $maxPositive ? $maxNegative : $maxPositive; return $affecting; } @@ -802,7 +807,7 @@ function checkchangelog($payload, $compile = true) { } if (!$incltag) continue; - + $firstword = explode(' ', $line)[0]; $pos = strpos($line, " "); $item = ''; @@ -812,7 +817,7 @@ function checkchangelog($payload, $compile = true) { } else { $firstword = $line; } - + if (!strlen($firstword)) { $currentchangelogblock[count($currentchangelogblock)-1]['body'] .= "\n"; continue; @@ -930,7 +935,7 @@ function checkchangelog($payload, $compile = true) { case 'server': if($item != 'something server ops should know') $currentchangelogblock[] = array('type' => 'server', 'body' => $item); - break; + break; default: //we add it to the last changelog entry as a separate line if (count($currentchangelogblock) > 0) @@ -966,11 +971,11 @@ function checkchangelog($payload, $compile = true) { function game_server_send($addr, $port, $str) { // All queries must begin with a question mark (ie "?players") - if($str{0} != '?') $str = ('?' . $str); - + if($str[0] != '?') $str = ('?' . $str); + /* --- Prepare a packet to send to the server (based on a reverse-engineered packet structure) --- */ $query = "\x00\x83" . pack('n', strlen($str) + 6) . "\x00\x00\x00\x00\x00" . $str . "\x00"; - + /* --- Create a socket and connect it to the server --- */ $server = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or exit("ERROR"); socket_set_option($server, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 2, 'usec' => 0)); //sets connect and send timeout to 2 seconds @@ -978,7 +983,7 @@ function game_server_send($addr, $port, $str) { return "ERROR: Connection failed"; } - + /* --- Send bytes to the server. Loop until all bytes have been sent --- */ $bytestosend = strlen($query); $bytessent = 0; @@ -986,33 +991,33 @@ function game_server_send($addr, $port, $str) { //echo $bytessent.'
'; $result = socket_write($server,substr($query,$bytessent),$bytestosend-$bytessent); //echo 'Sent '.$result.' bytes
'; - if ($result===FALSE) + if ($result===FALSE) return "ERROR: " . socket_strerror(socket_last_error()); $bytessent += $result; } - + /* --- Idle for a while until recieved bytes from game server --- */ $result = socket_read($server, 10000, PHP_BINARY_READ); socket_close($server); // we don't need this anymore - + if($result != "") { - if($result{0} == "\x00" || $result{1} == "\x83") { // make sure it's the right packet format - + if($result[0] == "\x00" || $result[1] == "\x83") { // make sure it's the right packet format + // Actually begin reading the output: - $sizebytes = unpack('n', $result{2} . $result{3}); // array size of the type identifier and content + $sizebytes = unpack('n', $result[2] . $result[3]); // array size of the type identifier and content $size = $sizebytes[1] - 1; // size of the string/floating-point (minus the size of the identifier byte) - - if($result{4} == "\x2a") { // 4-byte big-endian floating-point - $unpackint = unpack('f', $result{5} . $result{6} . $result{7} . $result{8}); // 4 possible bytes: add them up together, unpack them as a floating-point + + if($result[4] == "\x2a") { // 4-byte big-endian floating-point + $unpackint = unpack('f', $result[5] . $result[6] . $result[7] . $result[8]); // 4 possible bytes: add them up together, unpack them as a floating-point return $unpackint[1]; } - else if($result{4} == "\x06") { // ASCII string + else if($result[4] == "\x06") { // ASCII string $unpackstr = ""; // result string $index = 5; // string index - + while($size > 0) { // loop through the entire ASCII string $size--; - $unpackstr .= $result{$index}; // add the string position to return string + $unpackstr .= $result[$index]; // add the string position to return string $index++; } return $unpackstr; diff --git a/tools/WebhookProcessor/secret.php b/tools/WebhookProcessor/secret.php index 9b8a27d490..02dad3d627 100644 --- a/tools/WebhookProcessor/secret.php +++ b/tools/WebhookProcessor/secret.php @@ -1,133 +1,133 @@ - indentation detected" +# st=1 +# fi; +nl=' +' +nl=$'\n' +while read f; do + t=$(tail -c2 "$f"; printf x); r1="${nl}$"; r2="${nl}${r1}" + if [[ ! ${t%x} =~ $r1 ]]; then + echo "file $f is missing a trailing newline" + st=1 + fi; +done < <(find . -type f -name '*.dm') +# if grep -P '^/[\w/]\S+\(.*(var/|, ?var/.*).*\)' code/**/*.dm; then +# echo "changed files contains proc argument starting with 'var'" +# st=1 # annoy the coders instead of causing it to fail +# fi; +if grep -i 'centcomm' code/**/*.dm; then + echo "ERROR: Misspelling(s) of CENTCOM detected in code, please remove the extra M(s)." + st=1 +fi; +if grep -i 'centcomm' _maps/**/*.dmm; then + echo "ERROR: Misspelling(s) of CENTCOM detected in maps, please remove the extra M(s)." + st=1 +fi; +if grep -ni 'nanotransen' code/**/*.dm; then + echo "Misspelling(s) of nanotrasen detected in code, please remove the extra N(s)." + st=1 +fi; +if grep -ni 'nanotransen' _maps/**/*.dmm; then + echo "Misspelling(s) of nanotrasen detected in maps, please remove the extra N(s)." + st=1 +fi; +if ls _maps/*.json | grep -P "[A-Z]"; then + echo "Uppercase in a map json detected, these must be all lowercase." + st=1 +fi; +for json in _maps/*.json +do + map_path=$(jq -r '.map_path' $json) + while read map_file; do + filename="_maps/$map_path/$map_file" + if [ ! -f $filename ] + then + echo "found invalid file reference to $filename in _maps/$json" + st=1 + fi + done < <(jq -r '[.map_file] | flatten | .[]' $json) +done + +exit $st diff --git a/tools/travis/travis_config.txt b/tools/ci/ci_config.txt similarity index 78% rename from tools/travis/travis_config.txt rename to tools/ci/ci_config.txt index e59e4ed4ca..4925d781bb 100644 --- a/tools/travis/travis_config.txt +++ b/tools/ci/ci_config.txt @@ -1,9 +1,9 @@ -SQL_ENABLED -ADDRESS 127.0.0.1 -PORT 3306 -FEEDBACK_DATABASE tg_travis -FEEDBACK_TABLEPREFIX -FEEDBACK_LOGIN root -FEEDBACK_PASSWORD -LAVALAND_BUDGET 0 -SPACE_BUDGET 0 +SQL_ENABLED +ADDRESS 127.0.0.1 +PORT 3306 +FEEDBACK_DATABASE tg_ci +FEEDBACK_TABLEPREFIX +FEEDBACK_LOGIN root +FEEDBACK_PASSWORD +LAVALAND_BUDGET 0 +SPACE_BUDGET 0 diff --git a/tools/travis/dm.sh b/tools/ci/dm.sh similarity index 100% rename from tools/travis/dm.sh rename to tools/ci/dm.sh diff --git a/tools/appveyor/download_byond.sh b/tools/ci/download_byond.sh old mode 100644 new mode 100755 similarity index 100% rename from tools/appveyor/download_byond.sh rename to tools/ci/download_byond.sh diff --git a/tools/travis/install_build_tools.sh b/tools/ci/install_build_tools.sh similarity index 88% rename from tools/travis/install_build_tools.sh rename to tools/ci/install_build_tools.sh index c36cd571ba..6c3e267fca 100755 --- a/tools/travis/install_build_tools.sh +++ b/tools/ci/install_build_tools.sh @@ -10,5 +10,3 @@ npm install --global yarn pip3 install --user PyYaml pip3 install --user beautifulsoup4 - -phpenv global $PHP_VERSION diff --git a/tools/travis/install_byond.sh b/tools/ci/install_byond.sh similarity index 100% rename from tools/travis/install_byond.sh rename to tools/ci/install_byond.sh diff --git a/tools/ci/install_rust_g.sh b/tools/ci/install_rust_g.sh new file mode 100755 index 0000000000..2309f9d952 --- /dev/null +++ b/tools/ci/install_rust_g.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +source dependencies.sh + +mkdir -p ~/.byond/bin +wget -O ~/.byond/bin/librust_g.so "https://github.com/tgstation/rust-g/releases/download/$RUST_G_VERSION/librust_g.so" +chmod +x ~/.byond/bin/librust_g.so +ldd ~/.byond/bin/librust_g.so diff --git a/tools/ci/install_spaceman_dmm.sh b/tools/ci/install_spaceman_dmm.sh new file mode 100755 index 0000000000..d92dca4e95 --- /dev/null +++ b/tools/ci/install_spaceman_dmm.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -euo pipefail + +source dependencies.sh + +if [ ! -f ~/$1 ]; then + mkdir -p "$HOME/SpacemanDMM" + CACHEFILE="$HOME/SpacemanDMM/$1" + + if ! [ -f "$CACHEFILE.version" ] || ! grep -Fxq "$SPACEMAN_DMM_VERSION" "$CACHEFILE.version"; then + wget -O "$CACHEFILE" "https://github.com/SpaceManiac/SpacemanDMM/releases/download/$SPACEMAN_DMM_VERSION/$1" + chmod +x "$CACHEFILE" + echo "$SPACEMAN_DMM_VERSION" >"$CACHEFILE.version" + fi + + ln -s "$CACHEFILE" ~/$1 +fi + +~/$1 --version diff --git a/tools/ci/run_server.sh b/tools/ci/run_server.sh new file mode 100755 index 0000000000..46172abc66 --- /dev/null +++ b/tools/ci/run_server.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -euo pipefail + +tools/deploy.sh ci_test +rm ci_test/*.dll +mkdir ci_test/config + +#test config +cp tools/ci/ci_config.txt ci_test/config/config.txt + +#throw extools into ldd +cp libbyond-extools.so ~/.byond/bin/libbyond-extools.so +chmod +x ~/.byond/bin/libbyond-extools.so +ldd ~/.byond/bin/libbyond-extools.so + +cd ci_test +DreamDaemon tgstation.dmb -close -trusted -verbose -params "log-directory=ci" +cd .. +cat ci_test/data/logs/ci/clean_run.lk diff --git a/tools/travis/template_dm_generator.py b/tools/ci/template_dm_generator.py similarity index 100% rename from tools/travis/template_dm_generator.py rename to tools/ci/template_dm_generator.py diff --git a/tools/hooks/python.sh b/tools/hooks/python.sh index f575ebdac4..fc1804d8bc 100644 --- a/tools/hooks/python.sh +++ b/tools/hooks/python.sh @@ -1,15 +1,25 @@ #!/bin/sh # `sh` must be used here instead of `bash` to support GitHub Desktop. set -e + +# Strip the "App Execution Aliases" from $PATH. Even if the user installed +# Python using the Windows Store on purpose, these aliases always generate +# "Permission denied" errors when sh.exe tries to invoke them. +PATH=$(echo "$PATH" | tr ":" "\n" | grep -v "AppData/Local/Microsoft/WindowsApps" | tr "\n" ":") + +# Try to find a Python executable. if command -v python3 >/dev/null 2>&1; then PY=python3 elif command -v python >/dev/null 2>&1; then PY=python elif command -v py >/dev/null 2>&1; then - PY=py + PY="py -3" else - echo "Please install Python 3.6 or later." + echo "Please install Python from https://www.python.org/downloads/" + exit 1 fi + +# Deduce the path separator and add the mapmerge package to the search path. PATHSEP=$($PY - <<'EOF' import sys, os if sys.version_info.major != 3 or sys.version_info.minor < 6: diff --git a/tools/json_verifier.py b/tools/json_verifier.py index dbba811205..aa74620667 100644 --- a/tools/json_verifier.py +++ b/tools/json_verifier.py @@ -1,20 +1,20 @@ -import sys -import json - -if len(sys.argv) <= 1: - exit(1) - -status = 0 - -for file in sys.argv[1:]: - with open(file, encoding="ISO-8859-1") as f: - try: - json.load(f) - except ValueError as exception: - print("JSON error in {}".format(file)) - print(exception) - status = 1 - else: - print("Valid {}".format(file)) - -exit(status) +import sys +import json + +if len(sys.argv) <= 1: + exit(1) + +status = 0 + +for file in sys.argv[1:]: + with open(file, encoding="ISO-8859-1") as f: + try: + json.load(f) + except ValueError as exception: + print("JSON error in {}".format(file)) + print(exception) + status = 1 + else: + print("Valid {}".format(file)) + +exit(status) diff --git a/tools/mapmerge2/requirements.txt b/tools/mapmerge2/requirements.txt index 41ddc96c17..3f5c9ca0bc 100644 --- a/tools/mapmerge2/requirements.txt +++ b/tools/mapmerge2/requirements.txt @@ -1,3 +1,3 @@ pygit2==1.0.1 bidict==0.13.1 -Pillow==7.0.0 +Pillow==7.1.0 diff --git a/tools/travis/build_bsql.sh b/tools/travis/build_bsql.sh deleted file mode 100755 index e2b281efc6..0000000000 --- a/tools/travis/build_bsql.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -source dependencies.sh - -mkdir -p BSQL -cd BSQL -git init -git remote add origin https://github.com/tgstation/BSQL -git fetch --depth 1 origin $BSQL_VERSION -git checkout FETCH_HEAD - -mkdir -p artifacts -cd artifacts -export CXX=g++-7 -# The -D will be unnecessary past BSQL v1.4.0.0 -cmake .. -DMARIA_LIBRARY=/usr/lib/i386-linux-gnu/libmariadb.so -make - -mkdir -p ~/.byond/bin -ln -s $PWD/src/BSQL/libBSQL.so ../../libBSQL.so diff --git a/tools/travis/check_grep.sh b/tools/travis/check_grep.sh deleted file mode 100755 index 2117b570eb..0000000000 --- a/tools/travis/check_grep.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -set -euo pipefail - -#nb: must be bash to support shopt globstar -shopt -s globstar - -st=0 - -if grep -El '^\".+\" = \(.+\)' _maps/**/*.dmm; then - echo "Non-TGM formatted map detected. Please convert it using Map Merger!" - st=1 -fi; -if grep -P '^\ttag = \"icon' _maps/**/*.dmm; then - echo "tag vars from icon state generation detected in maps, please remove them." - st=1 -fi; -if grep 'step_[xy]' _maps/**/*.dmm; then - echo "step_x/step_y variables detected in maps, please remove them." - st=1 -fi; -if grep 'pixel_[xy] = 0' _maps/**/*.dmm; then - echo "pixel_x/pixel_y = 0 variables detected in maps, please review to ensure they are not dirty varedits." -fi; -if grep -P '\td[1-2] =' _maps/**/*.dmm; then - echo "d1/d2 cable variables detected in maps, please remove them." - st=1 -fi; -if grep '^/area/.+[\{]' _maps/**/*.dmm; then - echo "Vareditted /area path use detected in maps, please replace with proper paths." - st=1 -fi; -if grep '\W\/turf\s*[,\){]' _maps/**/*.dmm; then - echo "base /turf path use detected in maps, please replace with proper paths." - st=1 -fi; -if grep '^/*var/' code/**/*.dm; then - echo "Unmanaged global var use detected in code, please use the helpers." - st=1 -fi; -if grep -i 'centcomm' code/**/*.dm; then - echo "Misspelling(s) of CENTCOM detected in code, please remove the extra M(s)." - st=1 -fi; -if grep -i 'centcomm' _maps/**/*.dmm; then - echo "Misspelling(s) of CENTCOM detected in maps, please remove the extra M(s)." - st=1 -fi; - -exit $st diff --git a/tools/travis/check_line_endings.py b/tools/travis/check_line_endings.py deleted file mode 100644 index fbbbc41426..0000000000 --- a/tools/travis/check_line_endings.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import glob - -WINDOWS_NEWLINE = b'\r\n' - -FILES_TO_READ = [] -FILES_TO_READ.extend(glob.glob(r"**/*.dm", recursive=True)) -FILES_TO_READ.extend(glob.glob(r"**/*.dmm", recursive=True)) -FILES_TO_READ.extend(glob.glob(r"*.dme")) -#for i in FILES_TO_READ: -# if os.path.isdir(i): -# FILES_TO_READ.remove(i) - -def _reader(filepath): - data = open(filepath, "rb") - return data - -def main(): - filelist = [] - foundfiles = False - - for file in FILES_TO_READ: - data = _reader(file) - lines = data.readlines() - for line in lines: - if line.endswith(WINDOWS_NEWLINE): - filelist.append(file) - foundfiles = True - break - data.close() - - if not foundfiles: - print("No CRLF files found.") - sys.exit(0) - else: - print("Found files with suspected CRLF type.") - for i in filelist: - print(i) - sys.exit(1) - - - -if __name__ == "__main__": - main() diff --git a/tools/travis/install_dreamchecker.sh b/tools/travis/install_dreamchecker.sh deleted file mode 100755 index 4423e5aafb..0000000000 --- a/tools/travis/install_dreamchecker.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -euo pipefail - -source dependencies.sh - -wget -O ~/dreamchecker "https://github.com/SpaceManiac/SpacemanDMM/releases/download/$SPACEMAN_DMM_VERSION/dreamchecker" -chmod +x ~/dreamchecker -~/dreamchecker --version diff --git a/tools/travis/install_libmariadb.sh b/tools/travis/install_libmariadb.sh deleted file mode 100755 index d0ce4adc14..0000000000 --- a/tools/travis/install_libmariadb.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -euo pipefail - -# get libmariadb, cache it so limmex doesn't get angery -if [ -f $HOME/libmariadb ]; then - #travis likes to interpret the cache command as it being a file for some reason - rm $HOME/libmariadb -fi -mkdir -p $HOME/libmariadb -if [ ! -f $HOME/libmariadb/libmariadb.so ]; then - wget http://www.byond.com/download/db/mariadb_client-2.0.0-linux.tgz - tar -xvf mariadb_client-2.0.0-linux.tgz - mv mariadb_client-2.0.0-linux/libmariadb.so $HOME/libmariadb/libmariadb.so - rm -rf mariadb_client-2.0.0-linux.tgz mariadb_client-2.0.0-linux -fi diff --git a/tools/travis/install_rust_g.sh b/tools/travis/install_rust_g.sh deleted file mode 100755 index 227034af66..0000000000 --- a/tools/travis/install_rust_g.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -source dependencies.sh - -mkdir -p ~/.byond/bin -wget -O ~/.byond/bin/rust_g "https://github.com/tgstation/rust-g/releases/download/$RUST_G_VERSION/librust_g.so" -chmod +x ~/.byond/bin/rust_g diff --git a/tools/travis/run_server.sh b/tools/travis/run_server.sh deleted file mode 100755 index 975e8f6884..0000000000 --- a/tools/travis/run_server.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -set -euo pipefail - -tools/deploy.sh travis_test -mkdir travis_test/config - -#test config -cp tools/travis/travis_config.txt travis_test/config/config.txt - -cd travis_test -ln -s $HOME/libmariadb/libmariadb.so libmariadb.so -DreamDaemon tgstation.dmb -close -trusted -verbose -params "test-run&log-directory=travis" -cd .. -cat travis_test/data/logs/travis/clean_run.lk