diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cfe94738eebf..dc0bde45c566 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -250,3 +250,8 @@ Do not add any of the following in a Pull Request or risk getting the PR closed: * Any content that adds a specific character played by or reference to a single player, contributor, staff member, or maintainer. For example, a PR that adds a blue crab named after a staff member’s username is not permitted, as it directly references a specific individual. * Code which violates GitHub's [terms of service](https://github.com/site/terms). + +### Generative AI + +The use of generative AI tools is not permitted on the CM-SS13 repository. This includes pull request code, code review, and filing issues. If you proceed to post PRs, issues, or comments that are clearly AI generated, you will be warned against this and your content will be closed/deleted. Multiple infractions will result in an outright ban from the repository. + diff --git a/.github/actions/restore_or_install_byond/action.yml b/.github/actions/restore_or_install_byond/action.yml new file mode 100644 index 000000000000..4b07a612558d --- /dev/null +++ b/.github/actions/restore_or_install_byond/action.yml @@ -0,0 +1,51 @@ +# This action attempts to restore BYOND from a cache, or to install it otherwise. +name: Restore or Install BYOND +description: Attempts to restore a specified BYOND version from cache; if it can't, it installs it. + +inputs: + major: + description: "The major BYOND version to install. Defaults to the BYOND_MAJOR specified in `dependencies.sh`." + required: false + type: string + minor: + description: "The minor BYOND version to install. Defaults to the BYOND_MINOR specified in `dependencies.sh`." + required: false + type: string + +runs: + using: composite + steps: + - name: Configure BYOND version from inputs + if: ${{ inputs.major }} + shell: bash + run: | + echo "BYOND_MAJOR=${{ inputs.major }}" >> $GITHUB_ENV + echo "BYOND_MINOR=${{ inputs.minor }}" >> $GITHUB_ENV + - name: Configure BYOND version from dependencies.sh + if: ${{ !inputs.major }} + shell: bash + run: | + source dependencies.sh + echo "BYOND_MAJOR=$BYOND_MAJOR" >> $GITHUB_ENV + echo "BYOND_MINOR=$BYOND_MINOR" >> $GITHUB_ENV + + # The use of `actions/cache/restore` and `actions/cache/save` here is deliberate, as we want to + # save the BYOND install to a cache as early as possible. If we used just `actions/cache`, it + # would only attempt to save the cache at the end of a job. This ensures that if a workflow run + # is cancelled, we already have a cache to restore from. + - name: Restore BYOND cache + id: restore_byond_cache + uses: actions/cache/restore@v4 + with: + path: ~/BYOND + key: ${{ runner.os }}-byond-${{ env.BYOND_MAJOR }}-${{ env.BYOND_MINOR }} + - name: Install BYOND + if: ${{ !steps.restore_byond_cache.outputs.cache-hit }} + shell: bash + run: bash tools/ci/install_byond.sh + - name: Save BYOND cache + if: ${{ !steps.restore_byond_cache.outputs.cache-hit }} + uses: actions/cache/save@v4 + with: + path: ~/BYOND + key: ${{ steps.restore_byond_cache.outputs.cache-primary-key }} diff --git a/.github/actions/setup_node/action.yml b/.github/actions/setup_node/action.yml new file mode 100644 index 000000000000..120dbf4639ba --- /dev/null +++ b/.github/actions/setup_node/action.yml @@ -0,0 +1,26 @@ +# This action is a wrapper around `actions/setup-node`, to use the version specified in +# `dependencies.sh`. +name: Setup Node +description: Install Node using the version specified in `dependencies.sh`; additionally, restores the Yarn cache if one exists + +inputs: + restore-yarn-cache: + description: 'If `true`, restores the Yarn cache alongside installing node.' + required: false + type: boolean + default: false + +runs: + using: composite + steps: + - name: Configure Node version + shell: bash + run: | + source dependencies.sh + echo "NODE_VERSION_REQUIRED=$NODE_VERSION_LTS" >> $GITHUB_ENV + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION_REQUIRED }} + cache: ${{ fromJSON(inputs.restore-yarn-cache) && 'yarn' || '' }} + cache-dependency-path: ${{ fromJSON(inputs.restore-yarn-cache) && 'tgui/yarn.lock' || '' }} diff --git a/.github/alternate_byond_versions.txt b/.github/alternate_byond_versions.txt index 7b50af46885e..a7416a0788c8 100644 --- a/.github/alternate_byond_versions.txt +++ b/.github/alternate_byond_versions.txt @@ -4,4 +4,4 @@ # Format is version: map # Example: -# 500.1337: runtimestation +# 500.1337: runtime diff --git a/.github/workflows/autowiki.yml b/.github/workflows/autowiki.yml index fec68f2ca332..223a1200e2f1 100644 --- a/.github/workflows/autowiki.yml +++ b/.github/workflows/autowiki.yml @@ -21,12 +21,9 @@ jobs: - name: Checkout if: steps.secrets_set.outputs.SECRETS_ENABLED uses: actions/checkout@v3 - - name: Restore BYOND cache + - name: Install BYOND if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/cache@v3 - with: - path: ~/BYOND - key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} + uses: ./.github/actions/restore_or_install_byond - name: Install rust-g if: steps.secrets_set.outputs.SECRETS_ENABLED run: | @@ -37,7 +34,6 @@ jobs: - name: Compile and generate Autowiki files if: steps.secrets_set.outputs.SECRETS_ENABLED run: | - bash tools/ci/install_byond.sh source $HOME/BYOND/byond/bin/byondsetup tools/build/build --ci autowiki - name: Run Autowiki diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index b8c611767e6f..0f15f9ee2b1b 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -9,6 +9,7 @@ jobs: if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Run Linters runs-on: ubuntu-latest + timeout-minutes: 30 concurrency: group: run_linters-${{ github.head_ref || github.run_id }} cancel-in-progress: true @@ -20,27 +21,30 @@ jobs: uses: actions/cache@v4 with: path: ~/SpacemanDMM - key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} - - name: Restore Yarn cache + key: ${{ runner.os }}-spacemandmm-${{ hashFiles('dependencies.sh') }} + restore-keys: | + ${{ runner.os }}-spacemandmm- + - name: Setup Node + uses: ./.github/actions/setup_node + with: + restore-yarn-cache: true + - name: Restore Bootstrap cache uses: actions/cache@v4 with: - path: tgui/.yarn/cache - key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} + path: tools/bootstrap/.cache + key: ${{ runner.os }}-bootstrap-${{ hashFiles('tools/requirements.txt') }} restore-keys: | - ${{ runner.os }}-build- - ${{ runner.os }}- + ${{ runner.os }}-bootstrap- - name: Restore Rust cache uses: actions/cache@v4 with: path: ~/.cargo - key: ${{ runner.os }}-rust + key: ${{ runner.os }}-rust-${{ hashFiles('dependencies.sh')}} restore-keys: | - ${{ runner.os }}-build- - ${{ runner.os }}- + ${{ runner.os }}-rust- - name: Install Tools run: | pip3 install setuptools - bash tools/ci/install_node.sh bash tools/ci/install_spaceman_dmm.sh dreamchecker cargo install ripgrep --features pcre2 tools/bootstrap/python -c '' @@ -83,16 +87,15 @@ jobs: if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Compile Maps runs-on: ubuntu-latest + timeout-minutes: 30 steps: - uses: actions/checkout@v3 - - name: Restore BYOND cache - uses: actions/cache@v3 - with: - path: ~/BYOND - key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} + - name: Setup Node + uses: ./.github/actions/setup_node + - name: Restore BYOND from Cache + uses: ./.github/actions/restore_or_install_byond - name: Compile All Maps run: | - bash tools/ci/install_byond.sh source $HOME/BYOND/byond/bin/byondsetup tools/build/build --ci dm -DCIBUILDING -DCITESTING -DALL_MAPS @@ -123,6 +126,9 @@ jobs: run: | ALTERNATE_TESTS_JSON=$(jq -nRc '[inputs | capture("^(?[0-9]+)\\.(?[0-9]+): (?.+)$")]' .github/alternate_byond_versions.txt) echo "alternate_tests=$ALTERNATE_TESTS_JSON" >> $GITHUB_OUTPUT + - name: Set up BYOND cache + uses: ./.github/actions/restore_or_install_byond + run_all_tests: if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Unit Tests @@ -167,19 +173,34 @@ jobs: if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Windows Build runs-on: windows-latest + timeout-minutes: 30 concurrency: group: test_windows-${{ github.head_ref || github.run_id }} cancel-in-progress: true steps: - uses: actions/checkout@v3 - - name: Restore Yarn cache - uses: actions/cache@v3 + - name: Setup Node + uses: ./.github/actions/setup_node with: - path: tgui/.yarn/cache - key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-build- - ${{ runner.os }}- + restore-yarn-cache: true + - name: Configure BYOND version from inputs + if: ${{ inputs.major }} + shell: bash + run: | + echo "BYOND_MAJOR=${{ inputs.major }}" >> $GITHUB_ENV + echo "BYOND_MINOR=${{ inputs.minor }}" >> $GITHUB_ENV + - name: Configure BYOND version from dependencies.sh + if: ${{ !inputs.major }} + shell: bash + run: | + source dependencies.sh + echo "BYOND_MAJOR=$BYOND_MAJOR" >> $GITHUB_ENV + echo "BYOND_MINOR=$BYOND_MINOR" >> $GITHUB_ENV + - name: Restore BYOND cache + uses: actions/cache@v4 + with: + path: C:\\byond + key: ${{ runner.os }}-byond-${{ env.BYOND_MAJOR }}-${{ env.BYOND_MINOR }} - name: Compile run: pwsh tools/ci/build.ps1 env: diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_web_assets.yml similarity index 66% rename from .github/workflows/generate_documentation.yml rename to .github/workflows/generate_web_assets.yml index 7c178d1ac93b..69dc80d4fdf6 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_web_assets.yml @@ -1,27 +1,30 @@ -name: Generate documentation +name: Generate web assets on: push: branches: - master jobs: - generate_documentation: + generate_static_assets: if: ( !contains(github.event.head_commit.message, '[ci skip]') ) runs-on: ubuntu-latest - concurrency: gen-docs + concurrency: gen-assets steps: - uses: actions/checkout@v3 - name: Setup cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/SpacemanDMM - key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} + key: ${{ runner.os }}-spacemandmm-${{ hashFiles('dependencies.sh') }} + restore-keys: | + ${{ runner.os }}-spacemandmm- - name: Install SpacemanDMM run: bash tools/ci/install_spaceman_dmm.sh dmdoc - - name: Generate documentation + - name: Generate documentation and static assets run: | ~/dmdoc touch dmdoc/.nojekyll echo docs.cm-ss13.com > dmdoc/CNAME + mv tgui/public/ dmdoc/assets - name: Deploy uses: JamesIves/github-pages-deploy-action@3.7.1 with: diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 2b63e921a799..8a1d4c9cd4ff 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -4,6 +4,9 @@ on: types: [opened, reopened, synchronize, edited] jobs: label: + permissions: + contents: read + pull-requests: write runs-on: ubuntu-latest steps: - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" @@ -45,3 +48,20 @@ jobs: REPO: ${{ github.repository }} TOKEN: ${{ steps.app-token-generation.outputs.token }} PR_NUMBER: ${{ github.event.number }} + + - name: size-label + if: steps.value_holder.outputs.ACTIONS_ENABLED + uses: "pascalgn/size-label-action@v0.5.5" + env: + GITHUB_TOKEN: ${{ steps.app-token-generation.outputs.token }} + IGNORED: ".*\n!.gitignore\nyarn.lock/**" + with: + sizes: > + { + "0": "XS", + "20": "S", + "50": "M", + "200": "L", + "800": "XL", + "2000": "XXL" + } diff --git a/.github/workflows/run_unit_tests.yml b/.github/workflows/run_unit_tests.yml index 539b0fa01082..4d9274cfcbac 100644 --- a/.github/workflows/run_unit_tests.yml +++ b/.github/workflows/run_unit_tests.yml @@ -16,27 +16,24 @@ on: jobs: run_unit_tests: runs-on: ubuntu-latest + timeout-minutes: 30 steps: - uses: actions/checkout@v3 - - name: Restore BYOND cache - uses: actions/cache@v3 + - name: Restore BYOND from Cache + uses: ./.github/actions/restore_or_install_byond with: - path: ~/BYOND - key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} + major: ${{ inputs.major }} + minor: ${{ inputs.minor }} + - name: Setup Node + uses: ./.github/actions/setup_node - name: Install rust-g run: | sudo dpkg --add-architecture i386 sudo apt update || true sudo apt install -o APT::Immediate-Configure=false zlib1g-dev:i386 libssl-dev:i386 bash tools/ci/install_rust_g.sh - - name: Configure version - run: | - echo "BYOND_MAJOR=${{ inputs.major }}" >> $GITHUB_ENV - echo "BYOND_MINOR=${{ inputs.minor }}" >> $GITHUB_ENV - if: ${{ inputs.major }} - name: Compile Tests run: | - bash tools/ci/install_byond.sh source $HOME/BYOND/byond/bin/byondsetup tools/build/build --ci dm -DCIBUILDING -DANSICOLORS -Werror - name: Run Tests diff --git a/.prettierignore b/.prettierignore index 2b7500b2316b..25dfb6de1919 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,3 +3,6 @@ # We want it to run into the TGUI folder, however. !/tgui + +# Avoid running on any bundles. +/tgui/public/**/* diff --git a/.vscode/settings.json b/.vscode/settings.json index d29a55ea060c..6331fcbed7b4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -42,5 +42,9 @@ }, "workbench.editorAssociations": { "*.dmi": "dmiEditor.dmiEditor" - } + }, + "tgstationTestExplorer.project.DMEName": "colonialmarines.dme", + "dreammaker.tickOnCreate": true, + "dreammaker.reparseOnSave": true, + "dreammaker.autoUpdate": true } diff --git a/Dockerfile b/Dockerfile index 03eef406ee22..5adbef819bc9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,8 +20,8 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y make man RUN update-alternatives --install /usr/local/bin/python python /usr/bin/python3 20 ARG BYOND_MAJOR ARG BYOND_MINOR -ARG BYOND_DOWNLOAD_URL=https://secure.byond.com/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond_linux.zip -RUN curl ${BYOND_DOWNLOAD_URL} -o byond.zip \ +ARG BYOND_DOWNLOAD_URL=http://www.byond.com/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond_linux.zip +RUN curl ${BYOND_DOWNLOAD_URL} -o byond.zip -A "CMSS13/1.0 Continuous Integration"\ && unzip byond.zip \ && rm -rf byond.zip RUN DEBIAN_FRONTEND=noninteractive apt-get clean && rm -rf /var/lib/apt/lists/* diff --git a/LICENSE-CC-BY-NC-SA-3.0.txt b/LICENSE-CC-BY-SA-3.0.txt similarity index 75% rename from LICENSE-CC-BY-NC-SA-3.0.txt rename to LICENSE-CC-BY-SA-3.0.txt index a50eacf98c56..604209a80463 100644 --- a/LICENSE-CC-BY-NC-SA-3.0.txt +++ b/LICENSE-CC-BY-SA-3.0.txt @@ -1,6 +1,6 @@ Creative Commons Legal Code -Attribution-NonCommercial-ShareAlike 3.0 Unported +Attribution-ShareAlike 3.0 Unported CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN @@ -39,23 +39,32 @@ CONDITIONS. b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed - in Section 1(g) below, which, by reason of the selection and + in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be - considered an Adaptation (as defined above) for the purposes of this + considered an Adaptation (as defined below) for the purposes of this License. - c. "Distribute" means to make available to the public the original and + c. "Creative Commons Compatible License" means a license that is listed + at https://creativecommons.org/compatiblelicenses that has been + approved by Creative Commons as being essentially equivalent to this + License, including, at a minimum, because that license: (i) contains + terms that have the same purpose, meaning and effect as the License + Elements of this License; and, (ii) explicitly permits the relicensing + of adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same + License Elements as this License. + d. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. - d. "License Elements" means the following high-level license attributes + e. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: - Attribution, Noncommercial, ShareAlike. - e. "Licensor" means the individual, individuals, entity or entities that + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. - f. "Original Author" means, in the case of a literary or artistic work, + g. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, @@ -65,7 +74,7 @@ CONDITIONS. being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. - g. "Work" means the literary and/or artistic work offered under the terms + h. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, @@ -83,12 +92,12 @@ CONDITIONS. extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. - h. "You" means an individual or entity exercising rights under this + i. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. - i. "Publicly Perform" means to perform public recitations of the Work and + j. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that @@ -98,7 +107,7 @@ CONDITIONS. performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. - j. "Reproduce" means to make copies of the Work by any means including + k. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic @@ -126,13 +135,29 @@ exercise the rights in the Work as stated below: c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly -granted by Licensor are hereby reserved, including but not limited to the -rights described in Section 4(e). +granted by Licensor are hereby reserved. 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: @@ -155,41 +180,39 @@ subject to and limited by the following restrictions: apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit - as required by Section 4(d), as requested. If You create an + as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by - Section 4(d), as requested. - b. You may Distribute or Publicly Perform an Adaptation only under: (i) - the terms of this License; (ii) a later version of this License with + Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., - Attribution-NonCommercial-ShareAlike 3.0 US) ("Applicable License"). - You must include a copy of, or the URI, for Applicable License with - every copy of each Adaptation You Distribute or Publicly Perform. You - may not offer or impose any terms on the Adaptation that restrict the - terms of the Applicable License or the ability of the recipient of the - Adaptation to exercise the rights granted to that recipient under the - terms of the Applicable License. You must keep intact all notices that - refer to the Applicable License and to the disclaimer of warranties - with every copy of the Work as included in the Adaptation You - Distribute or Publicly Perform. When You Distribute or Publicly - Perform the Adaptation, You may not impose any effective technological - measures on the Adaptation that restrict the ability of a recipient of - the Adaptation from You to exercise the rights granted to that - recipient under the terms of the Applicable License. This Section 4(b) - applies to the Adaptation as incorporated in a Collection, but this - does not require the Collection apart from the Adaptation itself to be - made subject to the terms of the Applicable License. - c. You may not exercise any of the rights granted to You in Section 3 - above in any manner that is primarily intended for or directed toward - commercial advantage or private monetary compensation. The exchange of - the Work for other copyrighted works by means of digital file-sharing - or otherwise shall not be considered to be intended for or directed - toward commercial advantage or private monetary compensation, provided - there is no payment of any monetary compensation in con-nection with - the exchange of copyrighted works. - d. If You Distribute, or Publicly Perform the Work or any Adaptations or + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You + Distribute or Publicly Perform; (II) You may not offer or impose any + terms on the Adaptation that restrict the terms of the Applicable + License or the ability of the recipient of the Adaptation to exercise + the rights granted to that recipient under the terms of the Applicable + License; (III) You must keep intact all notices that refer to the + Applicable License and to the disclaimer of warranties with every copy + of the Work as included in the Adaptation You Distribute or Publicly + Perform; (IV) when You Distribute or Publicly Perform the Adaptation, + You may not impose any effective technological measures on the + Adaptation that restrict the ability of a recipient of the Adaptation + from You to exercise the rights granted to that recipient under the + terms of the Applicable License. This Section 4(b) applies to the + Adaptation as incorporated in a Collection, but this does not require + the Collection apart from the Adaptation itself to be made subject to + the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the @@ -202,48 +225,25 @@ subject to and limited by the following restrictions: extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; - and, (iv) consistent with Section 3(b), in the case of an Adaptation, - a credit identifying the use of the Work in the Adaptation (e.g., - "French translation of the Work by Original Author," or "Screenplay - based on original Work by Original Author"). The credit required by - this Section 4(d) may be implemented in any reasonable manner; - provided, however, that in the case of a Adaptation or Collection, at - a minimum such credit will appear, if a credit for all contributing - authors of the Adaptation or Collection appears, then as part of these - credits and in a manner at least as prominent as the credits for the - other contributing authors. For the avoidance of doubt, You may only - use the credit required by this Section for the purpose of attribution - in the manner set out above and, by exercising Your rights under this - License, You may not implicitly or explicitly assert or imply any - connection with, sponsorship or endorsement by the Original Author, - Licensor and/or Attribution Parties, as appropriate, of You or Your - use of the Work, without the separate, express prior written - permission of the Original Author, Licensor and/or Attribution + and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or + "Screenplay based on original Work by Original Author"). The credit + required by this Section 4(c) may be implemented in any reasonable + manner; provided, however, that in the case of a Adaptation or + Collection, at a minimum such credit will appear, if a credit for all + contributing authors of the Adaptation or Collection appears, then as + part of these credits and in a manner at least as prominent as the + credits for the other contributing authors. For the avoidance of + doubt, You may only use the credit required by this Section for the + purpose of attribution in the manner set out above and, by exercising + Your rights under this License, You may not implicitly or explicitly + assert or imply any connection with, sponsorship or endorsement by the + Original Author, Licensor and/or Attribution Parties, as appropriate, + of You or Your use of the Work, without the separate, express prior + written permission of the Original Author, Licensor and/or Attribution Parties. - e. For the avoidance of doubt: - - i. Non-waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme cannot be waived, the Licensor - reserves the exclusive right to collect such royalties for any - exercise by You of the rights granted under this License; - ii. Waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme can be waived, the Licensor reserves - the exclusive right to collect such royalties for any exercise by - You of the rights granted under this License if Your exercise of - such rights is for a purpose or use which is otherwise than - noncommercial as permitted under Section 4(c) and otherwise waives - the right to collect royalties through any statutory or compulsory - licensing scheme; and, - iii. Voluntary License Schemes. The Licensor reserves the right to - collect royalties, whether individually or, in the event that the - Licensor is a member of a collecting society that administers - voluntary licensing schemes, via that society, from any exercise - by You of the rights granted under this License that is for a - purpose or use which is otherwise than noncommercial as permitted - under Section 4(c). - f. Except as otherwise agreed in writing by the Licensor or as may be + d. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or @@ -261,15 +261,14 @@ subject to and limited by the following restrictions: 5. Representations, Warranties and Disclaimer -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING AND TO THE -FULLEST EXTENT PERMITTED BY APPLICABLE LAW, LICENSOR OFFERS THE WORK AS-IS -AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE -WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT -LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, -ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT -DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED -WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU. +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR @@ -355,6 +354,6 @@ Creative Commons Notice compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, - this trademark restriction does not form part of this License. + this trademark restriction does not form part of the License. Creative Commons may be contacted at https://creativecommons.org/. diff --git a/README.md b/README.md index 80f166648aa1..18c4e5d7c2b5 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ All new interfaces in CM must be created using tgui - this document will help ge ### AGPLv3 license > The code for CM-SS13 is licensed under the [GNU Affero General Public License v3](http://www.gnu.org/licenses/agpl.html). All code is assumed to be licensed under AGPL v3 unless stated otherwise by file header, or this document. -### Creative Commons 3.0 BY-SA +### Creative Commons 3.0 BY-SA > Assets including icons and sound are under the [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. Authorship for assets including art and sound under the CC BY-SA license is defined as the active development team of CM-SS13 unless stated otherwise (by author of the commit). ### GPLv3 license diff --git a/bin/tgui-fix.cmd b/bin/tgui-fix.cmd new file mode 100644 index 000000000000..f2844408ef83 --- /dev/null +++ b/bin/tgui-fix.cmd @@ -0,0 +1,2 @@ +@echo off +call "%~dp0\..\tools\build\build.bat" --wait-on-error tgui-fix %* diff --git a/code/__DEFINES/ARES.dm b/code/__DEFINES/ARES.dm index 55aa68f97309..3cedd21327cd 100644 --- a/code/__DEFINES/ARES.dm +++ b/code/__DEFINES/ARES.dm @@ -75,6 +75,8 @@ /// Downgraded from Priority #define TICKET_NON_PRIORITY "non-priority" +GLOBAL_LIST_EMPTY_TYPED(gas_vents, /obj/structure/pipes/vents/pump/no_boom/gas) + /// Cooldowns #define COOLDOWN_ARES_SENSOR 60 SECONDS #define COOLDOWN_ARES_ACCESS_CONTROL 20 SECONDS @@ -82,3 +84,9 @@ /// Time until someone can respawn as Working Joe #define JOE_JOIN_DEAD_TIME (15 MINUTES) + +#define FACTION_ARES "Ares" +#define FACTION_LIST_ARES_MARINE list(FACTION_MARINE, FACTION_ARES) +#define FACTION_LIST_ARES_ALL list(FACTION_ARES, FACTION_MARINE, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) +#define FACTION_LIST_ARES_WY list(FACTION_ARES, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) +#define FACTION_LIST_ARES_ALONE list(FACTION_ARES) diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index e949fffbbacb..2209fd19535a 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -35,9 +35,11 @@ #define MAP_LV759_HYBRISA_PROSPERA "LV-759 Hybrisa Prospera" // Highpop Only #define MAP_NEW_VARADERO "New Varadero"//ice colony underground but as its own map #define MAP_CHINOOK "Chinook 91 GSO" //admin level +#define MAP_ROSTOCK "SSV Rostock" //UPP Warship #define GAMEMODE_WHISKEY_OUTPOST "Whiskey Outpost" #define GAMEMODE_HIVE_WARS "Hive Wars" +#define GAMEMODE_FACTION_CLASH_UPP_CM "Faction Clash UPP CM" /// Number of players before we switch to lowpop maps only (LV, BR, Prison). #define PLAYERCOUNT_LOWPOP_MAP_LIMIT 130 @@ -365,6 +367,8 @@ #define WALL_REINFORCED_BUNKER "bunker" #define WALL_RESIN "resin" #define WALL_THICKRESIN "thickresin" +#define WALL_WEEDBOUND_RESIN "weedboundresin" +#define WALL_THICK_WEEDBOUND_RESIN "thickweedboundresin" #define WALL_MEMBRANE "membrane" #define WALL_THICKMEMBRANE "thickmembrane" #define WALL_BONE_RESIN "bone_resin" @@ -399,6 +403,8 @@ #define WALL_DEVWALL_R "devwall_r" #define WALL_HUNTERSHIP "metal"//DMI specific name #define WALL_AICORE "aiwall" +#define WALL_UPP_SHIP "uppwall_interior" +#define WALL_UPP_BASE "uppwall" //Defines for dropship weapon gimbals #define GIMBAL_LEFT -1 diff --git a/code/__DEFINES/__rust_g.dm b/code/__DEFINES/__rust_g.dm index 6c1b5c2d3ffa..72e70dbfb310 100644 --- a/code/__DEFINES/__rust_g.dm +++ b/code/__DEFINES/__rust_g.dm @@ -120,8 +120,9 @@ #define rustg_time_milliseconds(id) text2num(RUSTG_CALL(RUST_G, "time_milliseconds")(id)) #define rustg_time_reset(id) RUSTG_CALL(RUST_G, "time_reset")(id) +/// Returns the timestamp as a string /proc/rustg_unix_timestamp() - return text2num(RUSTG_CALL(RUST_G, "unix_timestamp")()) + return RUSTG_CALL(RUST_G, "unix_timestamp")() #define rustg_raw_read_toml_file(path) json_decode(RUSTG_CALL(RUST_G, "toml_file_to_json")(path) || "null") diff --git a/code/__DEFINES/_click.dm b/code/__DEFINES/_click.dm index b6dfaad081e7..1ee40b497ded 100644 --- a/code/__DEFINES/_click.dm +++ b/code/__DEFINES/_click.dm @@ -39,6 +39,10 @@ //Pixel coordinates in screen_loc format ("[tile_x]:[pixel_x],[tile_y]:[pixel_y]") #define SCREEN_LOC "screen-loc" +//Click catcher e.g. /atom/moveable/screen/click_catcher +#define CLICK_CATCHER "click_catcher" +#define CLICK_CATCHER_ADD_PARAM ";click_catcher=1" + /// From /mob/proc/click_adjacent() : (atom/A, obj/item/W, mods) makes it so the affterattack proc isn't called #define ATTACKBY_HINT_NO_AFTERATTACK (1 << 0) /// From /mob/proc/click_adjacent() : (atom/A, obj/item/W, mods) applies the click delay to next_move diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 841b83570671..c88d42538c86 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -4,7 +4,7 @@ It's best not to mess with the numbers of the regular access levels because most of them are tied into map-placed objects. This should be reworked in the future.*/ //WE NEED TO REWORK THIS ONE DAY. Access levels make me cry - Apophis #define ACCESS_MARINE_SENIOR 1 -#define ACCESS_MARINE_DATABASE 2 +#define ACCESS_MARINE_GENERAL 2 #define ACCESS_MARINE_BRIG 3 #define ACCESS_MARINE_ARMORY 4 #define ACCESS_MARINE_CMO 5 @@ -46,6 +46,11 @@ most of them are tied into map-placed objects. This should be reworked in the fu #define ACCESS_MARINE_CHAPLAIN 38 #define ACCESS_MARINE_FIELD_DOC 39 +/// Grants access to Marine record databases +#define ACCESS_MARINE_DATABASE 40 +/// Grants administrator access to Marine record databases +#define ACCESS_MARINE_DATABASE_ADMIN 41 + // AI Core Accesses /// Used in temporary passes #define ACCESS_MARINE_AI_TEMP 90 diff --git a/code/__DEFINES/chemistry.dm b/code/__DEFINES/chemistry.dm index 211eab8482f2..c6a0577c805b 100644 --- a/code/__DEFINES/chemistry.dm +++ b/code/__DEFINES/chemistry.dm @@ -97,6 +97,7 @@ #define PLASMA_PHEROMONE "pheromoneplasma" #define PLASMA_CHITIN "chitinplasma" #define PLASMA_CATECHOLAMINE "catecholamineplasma" +#define PLASMA_NUTRIENT "nutrientplasma" #define PLASMA_EGG "eggplasma" #define PLASMA_NEUROTOXIN "neurotoxinplasma" #define PLASMA_ROYAL "royalplasma" @@ -186,6 +187,7 @@ #define PROPERTY_ANTIPARASITIC "anti-parasitic" #define PROPERTY_ELECTROGENETIC "electrogenetic" #define PROPERTY_ORGANSTABILIZE "organ-stabilizing" +#define PROPERTY_CRITICALSTABILIZE "critical-stabilizing" //Rare Combo, made by combining other properties #define PROPERTY_DEFIBRILLATING "defibrillating" #define PROPERTY_THANATOMETABOL "thanatometabolizing" @@ -296,9 +298,11 @@ #define POTENCY_MULTIPLIER_VVLOW 0.1 #define POTENCY_MULTIPLIER_VLOW 0.25 #define POTENCY_MULTIPLIER_LOW 0.5 +#define POTENCY_MULTIPLIER_MEDIUMLOW 1.5 #define POTENCY_MULTIPLIER_MEDIUM 2 #define POTENCY_MULTIPLIER_HIGH 3 #define POTENCY_MULTIPLIER_VHIGH 5 +#define POTENCY_MULTIPLIER_VVHIGH 6 #define POTENCY_MULTIPLIER_HIGHEXTREMEINTER 7.5 #define POTENCY_MULTIPLIER_EXTREME 10 diff --git a/code/__DEFINES/clans.dm b/code/__DEFINES/clans.dm index b078cd4a04ea..87f9bb51e71e 100644 --- a/code/__DEFINES/clans.dm +++ b/code/__DEFINES/clans.dm @@ -92,3 +92,5 @@ #define CLAN_SHIP_PUBLIC -1 #define ERT_JOB_YOUNGBLOOD "Young Blood" +#define JOB_YOUNGBLOOD_ROLES /datum/timelock/young_blood +#define JOB_YOUNGBLOOD_ROLES_LIST list(ERT_JOB_YOUNGBLOOD) diff --git a/code/__DEFINES/client.dm b/code/__DEFINES/client.dm new file mode 100644 index 000000000000..b335951aec0f --- /dev/null +++ b/code/__DEFINES/client.dm @@ -0,0 +1,13 @@ +#define CLIENT_VERB(verb_name, args...)\ +/client/collect_client_verbs(){\ + . = ..();\ + . += /client/proc/##verb_name;\ +};\ +/client/proc/##verb_name(args)\ + +/// This gathers all the client *procs* that we are pretending are verbs - but only particularly want +/// authorized users to be able to use +/client/proc/collect_client_verbs() as /list + CAN_BE_REDEFINED(TRUE); + + return list() diff --git a/code/__DEFINES/client_prefs.dm b/code/__DEFINES/client_prefs.dm index fd3c998d0576..f7b6ec8b4e13 100644 --- a/code/__DEFINES/client_prefs.dm +++ b/code/__DEFINES/client_prefs.dm @@ -66,6 +66,8 @@ #define TOGGLE_AMMO_DISPLAY_TYPE (1<<19) ///Toggles between automatically shoving xenomorphs in the way as Queen. #define TOGGLE_AUTO_SHOVE_OFF (1<<20) +///Toggles whether activating marine leader orders will be spoken or not +#define TOGGLE_LEADERSHIP_SPOKEN_ORDERS (1<<21) //================================================= #define JOB_SLOT_RANDOMISED_SLOT -1 diff --git a/code/__DEFINES/colours.dm b/code/__DEFINES/colours.dm index ed0d38994a68..219b282fff7d 100644 --- a/code/__DEFINES/colours.dm +++ b/code/__DEFINES/colours.dm @@ -156,8 +156,8 @@ #define COLOR_G_ICE "#C7EDDE" //faded cyan #define COLOR_G_DES "#FF7C1C" //bright orange #define COLOR_G_JUNG "#64AA6E" //faded green +#define COLOR_G_SORO "#99d178" //light green /// Gun muzzle colors #define COLOR_LASER_RED "#FF8D8D" #define COLOR_MUZZLE_BLUE "#2CB2E8" - diff --git a/code/__DEFINES/conflict.dm b/code/__DEFINES/conflict.dm index 67b6f47a74a4..59bdd9cfe926 100644 --- a/code/__DEFINES/conflict.dm +++ b/code/__DEFINES/conflict.dm @@ -41,8 +41,11 @@ #define AMMO_MP (1<<21) /// Handles sentry flamers glob #define AMMO_FLAME (1<<22) +// If the projectile hits a dense turf it'll do on_hit_turf on the turf just in front of the turf instead of on the turf itself (This one does not work on mobs) +#define AMMO_STRIKES_SURFACE_ONLY (1<<23) // NOTE: Don't add flags past 1<<23, it'll break things due to BYOND limitations. You can usually use a Component instead. + /// Projectile is shrpanel which allow it to skip some collisions #define PROJECTILE_SHRAPNEL (1<<0) /// Apply additional effects upon hitting clicked target @@ -249,6 +252,7 @@ #define HEALTH_WALL_XENO_MEMBRANE 300 #define HEALTH_WALL_XENO_REFLECTIVE 300 #define HEALTH_WALL_XENO_MEMBRANE_THICK 600 +#define HEALTH_WALL_XENO_REFLECTIVE_WEAK 80 #define HEALTH_DOOR 1200 #define HEALTH_DOOR_XENO 600 diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 59d13ef35ba1..6170b1a61537 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -24,7 +24,7 @@ #define COMPONENT_DUPE_ALLOWED 1 /// new component is deleted #define COMPONENT_DUPE_UNIQUE 2 -/// old component is given the initialization args of the new +/// old component is given the initialization args of the new without any new component being created #define COMPONENT_DUPE_UNIQUE_PASSARGS 4 /// each component of the same type is consulted as to whether the duplicate should be allowed #define COMPONENT_DUPE_SELECTIVE 5 diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm index f06ad0064088..0155477337c3 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm @@ -65,14 +65,27 @@ /// from /datum/surgery_step/proc/attempt_step() #define COMSIG_HUMAN_SURGERY_APPLY_MODIFIERS "human_surgery_apply_modifiers" + +/// From /datum/surgery_step/proc/success() : (mob/user, mob/living/carbon/target, datum/surgery/surgery, obj/item/tool) +#define COMSIG_HUMAN_SURGERY_STEP_SUCCESS "human_surgery_step_success" + /// From /mob/living/carbon/human/proc/get_flags_cold_protection() #define COMSIG_HUMAN_COLD_PROTECTION_APPLY_MODIFIERS "human_cold_protection_apply_modifiers" /// From /obj/item/proc/dig_out_shrapnel() : () #define COMSIG_HUMAN_SHRAPNEL_REMOVED "human_shrapnel_removed" +/// From /obj/item/reagent_container/pill/attack() : (mob/living/carbon/human/attacked_mob) +#define COMSIG_HUMAN_PILL_FED "human_pill_fed" + +/// From /mob/living/carbon/human/attack_hand() : (successful) +// Sends to attacking mob, successful TRUE or FALSE +#define COMSIG_HUMAN_CPR_PERFORMED "human_cpr_performed" + +#define COMSIG_HUMAN_HM_TUTORIAL_TREATED "human_hm_tutorial_treated" + /// From /mob/living/carbon/human/UnarmedAttack() #define COMSIG_HUMAN_UNARMED_ATTACK "human_unarmed_attack" -/// from /modules/animations/animations_library.dm -#define COMSIG_HUMAN_ANIMATING "human_animating" +/// From /mob/living/carbon/human/hud_set_holocard() +#define COMSIG_HUMAN_TRIAGE_CARD_UPDATED "human_triage_card_updated" diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm index fd6cc5f22a50..10465f0825f1 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm @@ -40,6 +40,8 @@ ///from base of mob/living/set_buckled(): (new_buckled) #define COMSIG_LIVING_SET_BUCKLED "living_set_buckled" +/// From /obj/structure/bed/buckle_mob() : (mob/living/carbon/human/mob) +#define COMSIG_LIVING_BED_BUCKLED "living_bed_buckled" ///from base of mob/living/set_body_position() #define COMSIG_LIVING_SET_BODY_POSITION "living_set_body_position" @@ -50,3 +52,6 @@ #define COMSIG_LIVING_SHIMMY_LAYER "structure_shimmy_layer" /// Sent when a shimmy component is currently overriding the layer #define COMSIG_LIVING_SHIMMY_LAYER_CANCEL (1<<0) + +// From /obj/limb/proc/apply_splints() : (mob/living/user) +#define COMSIG_LIVING_LIMB_SPLINTED "living_limb_splinted" diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm index 4e044735793c..0d5917a6a63f 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm @@ -95,3 +95,6 @@ /// From /mob/living/carbon/xenomorph/proc/do_evolve() #define COMSIG_XENO_EVOLVE_TO_NEW_CASTE "xeno_evolve_to_new_caste" + +/// From /mob/living/carbon/human/death(cause, gibbed) +#define COMSIG_XENO_REVEAL_TACMAP "xeno_reveal_tacmap" diff --git a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm index 9d3d7549dca9..92c4b6207e89 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm @@ -185,3 +185,9 @@ #define COMSIG_MOB_END_TUTORIAL "mob_end_tutorial" #define COMSIG_MOB_NESTED "mob_nested" + +/// From /obj/item/roller/proc/deploy_roller() : (mob/user, obj/structure/bed/roller/roller) +#define COMSIG_MOB_ITEM_ROLLER_DEPLOYED "mob_roller_deployed" + +/// From /modules/animations/animations_library.dm and /code/modules/mob/mob.dm +#define COMSIG_MOB_ANIMATING "mob_animating" diff --git a/code/__DEFINES/dcs/signals/atom/signals_item.dm b/code/__DEFINES/dcs/signals/atom/signals_item.dm index 8e8c7f7a706b..71eff259dc13 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_item.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_item.dm @@ -28,6 +28,7 @@ #define COMSIG_SNACK_EATEN "snack_eaten" #define COMSIG_ITEM_PICKUP "item_pickup" + #define COMSIG_ITEM_PICKUP_CANCELLED (1<<0) ///from /obj/item/device/broadcasting #define COMSIG_BROADCAST_GO_LIVE "broadcast_live" diff --git a/code/__DEFINES/dcs/signals/atom/signals_obj.dm b/code/__DEFINES/dcs/signals/atom/signals_obj.dm index d2f5992b0f36..3445fe3df55f 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_obj.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_obj.dm @@ -60,3 +60,7 @@ #define COMSIG_DROPSHIP_REMOVE_EQUIPMENT "dropship_remove_equipment" #define COMSIG_STRUCTURE_CRATE_SQUAD_LAUNCHED "structure_crate_squad_launched" + +// from /obj/item/device/binoculars/range/designator/acquire_target() +#define COMSIG_DESIGNATOR_LASE "comsig_designator_lase" +#define COMSIG_DESIGNATOR_LASE_OFF "comsig_designator_lase_off" diff --git a/code/__DEFINES/dcs/signals/signals_datum.dm b/code/__DEFINES/dcs/signals/signals_datum.dm index c35038fcf3e9..7bf6318e40fb 100644 --- a/code/__DEFINES/dcs/signals/signals_datum.dm +++ b/code/__DEFINES/dcs/signals/signals_datum.dm @@ -69,3 +69,7 @@ /// Fired on the lazy template datum when the template is finished loading. (list/loaded_atom_movables, list/loaded_turfs, list/loaded_areas) #define COMSIG_LAZY_TEMPLATE_LOADED "lazy_template_loaded" + +/// Fired on the item when someone tries to holster the item: /mob/living/carbon/human/verb/holster_verb +#define COMSIG_ITEM_HOLSTER "item_holster" + #define COMPONENT_ITEM_HOLSTER_CANCELLED (1<<0) diff --git a/code/__DEFINES/emote_panels.dm b/code/__DEFINES/emote_panels.dm index 8419f5513cf0..acdf10990313 100644 --- a/code/__DEFINES/emote_panels.dm +++ b/code/__DEFINES/emote_panels.dm @@ -8,6 +8,9 @@ #define JOE_EMOTE_CATEGORY_NOTICE "Notice" #define JOE_EMOTE_CATEGORY_FIRE "Fire" #define JOE_EMOTE_CATEGORY_DAMAGE "Damage" +#define WY_DROID_CATEGORY_COMBAT "Combat" +#define WY_DROID_CATEGORY_QUIP "Quip" +#define WY_DROID_CATEGORY_STATUS "Status" #define YAUTJA_EMOTE_CATEGORY_FAKESOUND "Fake Sound" #define YAUTJA_EMOTE_CATEGORY_VOICE "Voice Synthesizer" #define YAUTJA_EMOTE_CATEGORY_SPECIES "Yautja" diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm index 751d703a42d7..4f4d813896b2 100644 --- a/code/__DEFINES/equipment.dm +++ b/code/__DEFINES/equipment.dm @@ -475,25 +475,35 @@ GLOBAL_LIST_INIT(slot_to_contained_sprite_shorthand, list( //================================================= //================================================= +/// Default accessory slot for non-accessory specific clothing, this should almost never be used for proper categorization +#define ACCESSORY_SLOT_DEFAULT "Accessory" + +// Accessory slots that have mechanics tied to them #define ACCESSORY_SLOT_UTILITY "Utility" +#define ACCESSORY_SLOT_STORAGE "Storage" +#define ACCESSORY_SLOT_ARMOR_C "Chest armor" +#define ACCESSORY_SLOT_WRIST_L "Left wrist" +#define ACCESSORY_SLOT_WRIST_R "Right wrist" + +// Accessory slots that are purely if not mostly cosmetic +#define ACCESSORY_SLOT_TIE "Tie" +#define ACCESSORY_SLOT_PATCH "Patch" #define ACCESSORY_SLOT_ARMBAND "Armband" #define ACCESSORY_SLOT_RANK "Rank" #define ACCESSORY_SLOT_DECOR "Decor" #define ACCESSORY_SLOT_MEDAL "Medal" #define ACCESSORY_SLOT_PONCHO "Ponchos" #define ACCESSORY_SLOT_TROPHY "Trophy" +#define ACCESSORY_SLOT_YAUTJA_MASK "Yautja Mask" #define ACCESSORY_SLOT_MASK "Mask" -#define ACCESSORY_SLOT_WRIST_L "Left wrist" -#define ACCESSORY_SLOT_WRIST_R "Right wrist" - -/// Used for uniform armor inserts. -#define ACCESSORY_SLOT_ARMOR_C "Chest armor" +// Accessory slots that are currently unused #define ACCESSORY_SLOT_ARMOR_A "Arm armor" #define ACCESSORY_SLOT_ARMOR_L "Leg armor" #define ACCESSORY_SLOT_ARMOR_S "Armor storage" #define ACCESSORY_SLOT_ARMOR_M "Misc armor" #define ACCESSORY_SLOT_HELM_C "Helmet cover" + //================================================= //================================================= @@ -570,6 +580,8 @@ GLOBAL_LIST_INIT(uniform_categories, list( #define STORAGE_ALLOW_QUICKDRAW (1<<11) /// Whether using this item will try not to empty it if possible #define STORAGE_DISABLE_USE_EMPTY (1<<12) +/// Whether the user can withdraw the items in storage while being hauled by a xeno +#define STORAGE_ALLOW_WHILE_HAULED (1<<13) #define STORAGE_FLAGS_DEFAULT (STORAGE_SHOW_FULLNESS|STORAGE_GATHER_SIMULTAENOUSLY|STORAGE_ALLOW_EMPTY) #define STORAGE_FLAGS_BOX (STORAGE_FLAGS_DEFAULT) @@ -593,3 +605,34 @@ GLOBAL_LIST_INIT(uniform_categories, list( #define PHONE_DND_ON 1 #define PHONE_DND_OFF 0 #define PHONE_DND_FORBIDDEN -1 + +///Get appropriate SLOT_IN_X for given slot +/proc/slot_to_in_storage_slot(slot) + switch(slot) + if(WEAR_FEET) + return WEAR_IN_SHOES + if(WEAR_BACK) + return WEAR_IN_BACK + if(WEAR_J_STORE) + return WEAR_IN_J_STORE + if(WEAR_BODY) + return WEAR_IN_ACCESSORY + if(WEAR_WAIST) + return WEAR_IN_BELT + if(WEAR_JACKET) + return WEAR_IN_JACKET + if(WEAR_L_STORE) + return WEAR_IN_L_STORE + if(WEAR_R_STORE) + return WEAR_IN_R_STORE + if(WEAR_HEAD) + return WEAR_IN_HELMET + else + return 0 + +/proc/is_valid_sticky_slot(slot) + switch(slot) + if(WEAR_HANDCUFFS, WEAR_LEGCUFFS, WEAR_L_HAND, WEAR_R_HAND) + return FALSE + else + return TRUE diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index 04d64f3572e6..20e12ccbe6f0 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -15,4 +15,7 @@ #define MODE_BATTLEFIELD_DRAW_STALEMATE "DRAW: Stalemate" #define MODE_BATTLEFIELD_DRAW_DEATH "DRAW: My Friends Are Dead" +#define MODE_FACTION_CLASH_UPP_MAJOR "UPP Major Victory" +#define MODE_FACTION_CLASH_UPP_MINOR "UPP Minor Victory" + #define MODE_GENERIC_DRAW_NUKE "DRAW: Nuclear Explosion" diff --git a/code/__DEFINES/generators.dm b/code/__DEFINES/generators.dm index 8488a11a409a..69dbb381d887 100644 --- a/code/__DEFINES/generators.dm +++ b/code/__DEFINES/generators.dm @@ -13,3 +13,4 @@ #define P_DATA_ICON_ADD "icon_add" #define P_DATA_ICON_REMOVE "icon_remove" #define P_DATA_ICON_WEIGHT "icon_edit" +#define P_DATA_GRADIENT "gradient" diff --git a/code/__DEFINES/human.dm b/code/__DEFINES/human.dm index a915d47fc781..08cf35cb9136 100644 --- a/code/__DEFINES/human.dm +++ b/code/__DEFINES/human.dm @@ -186,7 +186,7 @@ #define SYNTH_COLONY "Third Generation Colonial Synthetic" #define SYNTH_COLONY_GEN_TWO "Second Generation Colonial Synthetic" #define SYNTH_COLONY_GEN_ONE "First Generation Colonial Synthetic" -#define SYNTH_COMBAT "Combat Synthetic" +#define SYNTH_COMBAT "W-Y Combat Android" #define SYNTH_INFILTRATOR "Infiltrator Synthetic" #define SYNTH_WORKING_JOE "Working Joe" #define SYNTH_HAZARD_JOE "Hazard Joe" diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index a139dfd7ad0a..84c8dec27e8f 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -63,7 +63,9 @@ GLOBAL_LIST_INIT(job_squad_roles, JOB_SQUAD_ROLES_LIST) #define JOB_MEDIC_ROLES /datum/timelock/medic #define JOB_MEDIC_ROLES_LIST list(JOB_SQUAD_MEDIC, JOB_CMO, JOB_DOCTOR, JOB_FIELD_DOCTOR, JOB_NURSE, JOB_RESEARCHER, JOB_SURGEON) #define JOB_DOCTOR_ROLES /datum/timelock/doctor -#define JOB_DOCTOR_ROLES_LIST list(JOB_CMO, JOB_DOCTOR, JOB_SURGEON) +#define JOB_DOCTOR_ROLES_LIST list(JOB_CMO, JOB_DOCTOR, JOB_SURGEON, JOB_FIELD_DOCTOR) +#define JOB_RESEARCH_ROLES /datum/timelock/research +#define JOB_RESEARCH_ROLES_LIST list(JOB_RESEARCHER) #define JOB_CORPORATE_LIAISON "Corporate Liaison" @@ -119,6 +121,8 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define JOB_MARINE_RAIDER_CMD "Marine Raider Platoon Lead" #define JOB_MARINE_RAIDER_ROLES_LIST list(JOB_MARINE_RAIDER, JOB_MARINE_RAIDER_SL, JOB_MARINE_RAIDER_CMD) +#define MUTINY_LOYALIST_ROLES list(JOB_POLICE, JOB_WARDEN, JOB_CHIEF_POLICE, JOB_CO, JOB_SEA) + #define JOB_HUMAN_ROLES /datum/timelock/human #define JOB_XENO_ROLES /datum/timelock/xeno @@ -151,6 +155,9 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) . = ..(L);\ } +/// Role lists for Marine roles +#define CHAIN_OF_COMMAND_ROLES list(JOB_CO, JOB_XO, JOB_AUXILIARY_OFFICER, JOB_CHIEF_POLICE, JOB_CMO, JOB_SO, JOB_CHIEF_ENGINEER, JOB_DROPSHIP_PILOT, JOB_CAS_PILOT, JOB_INTEL) + //-------------WO roles--------------- #define JOB_WO_CO "Ground Commander" @@ -191,22 +198,32 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define JOB_PMC_DOCTOR "PMC Trauma Surgeon" #define JOB_PMC_INVESTIGATOR "PMC Medical Investigator" #define JOB_PMC_DETAINER "PMC Security Enforcer" +#define JOB_PMC_CROWD_CONTROL "PMC Crowd Control Specialist" #define JOB_PMC_GUNNER "PMC Support Weapons Specialist" //Renamed from Specialist to Support Specialist as it only has SG skills. #define JOB_PMC_SNIPER "PMC Weapons Specialist" //Renamed from Sharpshooter to specialist as it uses specialist skills. #define JOB_PMC_CREWMAN "PMC Vehicle Crewman" -#define JOB_PMC_XENO_HANDLER "PMC Xeno Handler" #define JOB_PMC_LEADER "PMC Leader" #define JOB_PMC_LEAD_INVEST "PMC Lead Investigator" #define JOB_PMC_DIRECTOR "PMC Site Director" #define JOB_PMC_SYNTH "PMC Support Synthetic" #define ROLES_WY_PMC list(JOB_PMC_LEADER, JOB_PMC_SNIPER, JOB_PMC_GUNNER, JOB_PMC_ENGINEER, JOB_PMC_MEDIC, JOB_PMC_STANDARD) -#define ROLES_WY_PMC_AUX list(JOB_PMC_SYNTH, JOB_PMC_CREWMAN, JOB_PMC_XENO_HANDLER, JOB_PMC_DOCTOR) -#define ROLES_WY_PMC_INSPEC list(JOB_PMC_LEAD_INVEST, JOB_PMC_INVESTIGATOR, JOB_PMC_DETAINER) +#define ROLES_WY_PMC_AUX list(JOB_PMC_SYNTH, JOB_PMC_CREWMAN, JOB_PMC_DOCTOR) +#define ROLES_WY_PMC_INSPEC list(JOB_PMC_LEAD_INVEST, JOB_PMC_INVESTIGATOR, JOB_PMC_DETAINER, JOB_PMC_CROWD_CONTROL) #define ROLES_WY_PMC_ALL ROLES_WY_PMC + ROLES_WY_PMC_AUX + ROLES_WY_PMC_INSPEC +//-------- COMMANDOS --------// +#define JOB_WY_COMMANDO_STANDARD "W-Y Commando" +#define JOB_WY_COMMANDO_LEADER "W-Y Commando Leader" +#define JOB_WY_COMMANDO_GUNNER "W-Y Commando Gunner" +#define JOB_WY_COMMANDO_DOGCATHER "W-Y Commando Dog Catcher" + +#define ROLES_WY_COMMANDOS list(JOB_WY_COMMANDO_STANDARD, JOB_WY_COMMANDO_LEADER, JOB_WY_COMMANDO_GUNNER, JOB_WY_COMMANDO_DOGCATHER) + //-------- WY --------// +#define JOB_WY_SEC "W-Y Security Guard" +#define JOB_WY_SEC_SYNTH "W-Y Security Guard Synthetic" #define JOB_TRAINEE "Corporate Trainee" #define JOB_JUNIOR_EXECUTIVE "Corporate Junior Executive" #define JOB_EXECUTIVE "Corporate Executive" @@ -218,31 +235,51 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define JOB_ASSISTANT_MANAGER "Corporate Assistant Manager" #define JOB_DIVISION_MANAGER "Corporate Division Manager" #define JOB_CHIEF_EXECUTIVE "Corporate Chief Executive" -#define JOB_DEPUTY_DIRECTOR "WY Deputy Director" -#define JOB_DIRECTOR "WY Director" +#define JOB_DEPUTY_DIRECTOR "W-Y Deputy Director" +#define JOB_DIRECTOR "W-Y Director" //-------- WY-DEATHSQUAD --------// -#define JOB_DS_SL "Whiteout Team Leader" -#define JOB_DS_SG "Whiteout Terminator" -#define JOB_DS_MED "Whiteout Team Medic" -#define JOB_DS_OP "Whiteout Operator" +#define JOB_DS_SL "Whiteout Team Leading Unit" +#define JOB_DS_CK "Whiteout Team Cloaker Unit" +#define JOB_DS_SUP "Whiteout Team Support Unit" +#define JOB_DS_CU "Whiteout Team Combat Unit" -#define ROLES_WY_CORPORATE list(JOB_EXECUTIVE_SUPERVISOR, JOB_LEGAL_SUPERVISOR, JOB_EXECUTIVE_SPECIALIST, JOB_LEGAL_SPECIALIST, JOB_SENIOR_EXECUTIVE, JOB_EXECUTIVE, JOB_JUNIOR_EXECUTIVE, JOB_TRAINEE) +#define ROLES_WY_CORPORATE list(JOB_EXECUTIVE_SUPERVISOR, JOB_LEGAL_SUPERVISOR, JOB_EXECUTIVE_SPECIALIST, JOB_LEGAL_SPECIALIST, JOB_SENIOR_EXECUTIVE, JOB_EXECUTIVE, JOB_JUNIOR_EXECUTIVE, JOB_TRAINEE, JOB_WY_SEC_SYNTH, JOB_WY_SEC) #define ROLES_WY_LEADERSHIP list(JOB_DIRECTOR, JOB_PMC_DIRECTOR, JOB_DEPUTY_DIRECTOR, JOB_CHIEF_EXECUTIVE, JOB_DIVISION_MANAGER, JOB_ASSISTANT_MANAGER) -#define ROLES_WY_WHITEOUT list(JOB_DS_SL, JOB_DS_SG, JOB_DS_MED, JOB_DS_OP) +#define ROLES_WY_WHITEOUT list(JOB_DS_SL, JOB_DS_CK, JOB_DS_SUP, JOB_DS_CU) #define JOB_CORPORATE_ROLES /datum/timelock/corporate -#define JOB_CORPORATE_ROLES_LIST list(JOB_CORPORATE_LIAISON, JOB_WO_CORPORATE_LIAISON, JOB_DIRECTOR, JOB_PMC_DIRECTOR, JOB_DEPUTY_DIRECTOR, JOB_CHIEF_EXECUTIVE, JOB_DIVISION_MANAGER, JOB_ASSISTANT_MANAGER, JOB_EXECUTIVE_SUPERVISOR, JOB_LEGAL_SUPERVISOR, JOB_EXECUTIVE_SPECIALIST, JOB_LEGAL_SPECIALIST, JOB_SENIOR_EXECUTIVE, JOB_EXECUTIVE, JOB_JUNIOR_EXECUTIVE, JOB_TRAINEE) +#define JOB_CORPORATE_ROLES_LIST list(JOB_CORPORATE_LIAISON, JOB_WO_CORPORATE_LIAISON, JOB_DIRECTOR, JOB_PMC_DIRECTOR, JOB_DEPUTY_DIRECTOR, JOB_CHIEF_EXECUTIVE, JOB_DIVISION_MANAGER, JOB_ASSISTANT_MANAGER, JOB_EXECUTIVE_SUPERVISOR, JOB_LEGAL_SUPERVISOR, JOB_EXECUTIVE_SPECIALIST, JOB_LEGAL_SPECIALIST, JOB_SENIOR_EXECUTIVE, JOB_EXECUTIVE, JOB_JUNIOR_EXECUTIVE, JOB_TRAINEE, JOB_WY_SEC_SYNTH, JOB_WY_SEC) //-------- WY Goons --------// -#define JOB_WY_GOON "WY Corporate Security" -#define JOB_WY_GOON_MEDIC "WY Corporate Security Medic" -#define JOB_WY_GOON_TECH "WY Corporate Security Technician" -#define JOB_WY_GOON_LEAD "WY Corporate Security Lead" -#define JOB_WY_RESEARCHER "WY Research Consultant" -#define JOB_WY_RESEARCH_LEAD "WY Senior Research Consultant" - -#define ROLES_WY_GOONS list(JOB_WY_GOON_LEAD, JOB_WY_GOON_TECH, JOB_WY_GOON_MEDIC, JOB_WY_GOON, JOB_WY_RESEARCHER, JOB_WY_RESEARCH_LEAD) +#define JOB_WY_GOON "W-Y Corporate Security" +#define JOB_WY_GOON_MEDIC "W-Y Corporate Security Medic" +#define JOB_WY_GOON_TECH "W-Y Corporate Security Technician" +#define JOB_WY_GOON_LEAD "W-Y Corporate Security Lead" +#define JOB_WY_RESEARCHER "W-Y Research Consultant" +#define JOB_WY_RESEARCH_LEAD "W-Y Senior Research Consultant" +#define JOB_WY_GOON_SYNTH "W-Y Corporate Security Synthetic" + +#define ROLES_WY_GOONS list(JOB_WY_GOON_LEAD, JOB_WY_GOON_TECH, JOB_WY_GOON_MEDIC, JOB_WY_GOON, JOB_WY_RESEARCHER, JOB_WY_RESEARCH_LEAD, JOB_WY_GOON_SYNTH) + +//-------- Hyperdyne --------// + +#define JOB_HC_SEC "HC Security Guard" +#define JOB_HC_SEC_SYNTH "HC Security Guard Synthetic" +#define JOB_HC_TRAINEE "Corporate Trainee" +#define JOB_HC_JUNIOR_EXECUTIVE "Corporate Junior Executive" +#define JOB_HC_CORPORATE_LIAISON "Corporate Liaison" +#define JOB_HC_EXECUTIVE "Corporate Executive" +#define JOB_HC_SENIOR_EXECUTIVE "Corporate Senior Executive" +#define JOB_HC_EXECUTIVE_SPECIALIST "Corporate Executive Specialist" +#define JOB_HC_LEGAL_SPECIALIST "Corporate Legal Specialist" +#define JOB_HC_EXECUTIVE_SUPERVISOR "Corporate Executive Supervisor" +#define JOB_HC_LEGAL_SUPERVISOR "Corporate Legal Supervisor" +#define JOB_HC_ASSISTANT_MANAGER "Corporate Assistant Manager" +#define JOB_HC_DIVISION_MANAGER "Corporate Division Manager" +#define JOB_HC_CHIEF_EXECUTIVE "Corporate Chief Executive" +#define JOB_HC_DEPUTY_DIRECTOR "HC Deputy Director" +#define JOB_HC_DIRECTOR "HC Director" //---- Contractors ----// #define JOB_CONTRACTOR "VAIPO Mercenary" @@ -349,6 +386,19 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define JOB_UPP_COMMISSAR "UPP Political Commissar" +//-------- People's Armed Police --------// + +#define JOB_PAP_MILITSIONER "UPP Militsioner" +#define JOB_PAP_STARSHIY_MILITSIONER "UPP Starshiy Militsioner" +#define JOB_PAP_STARSHINA "UPP Starshina" +#define JOB_PAP_LEYTENANT "UPP Leytenant Militsii" +#define JOB_PAP_KAPITAN "UPP Kapitan Militsii" +#define JOB_PAP_MAYOR "UPP Mayor Militsii" +#define JOB_PAP_POLITKOMISSAR "UPP Politkomissar" +#define JOB_PAP_POLKOVNIK "UPP Polkovnik Militsii" + +#define PAP_GRUNT_LIST list(JOB_PAP_MILITSIONER, JOB_PAP_STARSHIY_MILITSIONER, JOB_PAP_STARSHINA) + //-------- CLF --------// #define JOB_CLF "CLF Guerilla" #define JOB_CLF_ENGI "CLF Field Technician" @@ -357,12 +407,32 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define JOB_CLF_LEADER "CLF Cell Leader" #define JOB_CLF_COMMANDER "CLF Cell Commander" #define JOB_CLF_SYNTH "CLF Multipurpose Synthetic" +#define JOB_CLF_COORDINATOR "CLF Coordinator" -#define CLF_JOB_LIST list(JOB_CLF, JOB_CLF_ENGI, JOB_CLF_MEDIC, JOB_CLF_SPECIALIST, JOB_CLF_LEADER, JOB_CLF_COMMANDER, JOB_CLF_SYNTH) +#define CLF_JOB_LIST list(JOB_CLF, JOB_CLF_ENGI, JOB_CLF_MEDIC, JOB_CLF_SPECIALIST, JOB_CLF_LEADER, JOB_CLF_COMMANDER, JOB_CLF_SYNTH, JOB_CLF_COORDINATOR) //-------- TWE --------// #define JOB_TWE_REPRESENTATIVE "TWE Representative" +//IASF + +#define JOB_TWE_IASF_PARA "IASF Paratrooper" +#define JOB_TWE_IASF_PARA_SNIPER "IASF Paratrooper (Marksman)" +#define JOB_TWE_IASF_PARA_PILOT "IASF Fleet Air Arm (Dropship Pilot)" +#define JOB_TWE_IASF_PARA_SMARTGUNNER "IASF Paratrooper (Smartgunner)" +#define JOB_TWE_IASF_PARA_SPECIALIST "IASF Paratrooper (Specialist)" +#define JOB_TWE_IASF_PARA_ENGI "IASF Paratrooper (Combat Engineer)" +#define JOB_TWE_IASF_PARA_MEDIC "IASF Paratrooper (Combat Medical Technician)" +#define JOB_TWE_IASF_PARA_SQUAD_LEADER "IASF Paratrooper (Squad Leader)" +#define JOB_TWE_IASF_PARA_LIEUTENANT "IASF Lieutenant" +#define JOB_TWE_IASF_PARA_CAPTAIN "IASF Captain" +#define JOB_TWE_IASF_PARA_MAJOR "IASF Major" +#define JOB_TWE_IASF_PARA_COMMANDER "IASF Commanding Officer" + +#define JOB_TWE_IASF_PARA_SYNTH "IASF Support Synth" + +#define TWE_IASF_JOB_LIST list(JOB_TWE_IASF_PARA, JOB_TWE_IASF_PARA_ENGI, JOB_TWE_IASF_PARA_MEDIC, JOB_TWE_IASF_PARA_PILOT, JOB_TWE_IASF_PARA_SMARTGUNNER, JOB_TWE_IASF_PARA_SPECIALIST, JOB_TWE_IASF_PARA_SNIPER , JOB_TWE_IASF_PARA_SQUAD_LEADER, JOB_TWE_IASF_PARA_LIEUTENANT, JOB_TWE_IASF_PARA_CAPTAIN, JOB_TWE_IASF_PARA_MAJOR, JOB_TWE_IASF_PARA_COMMANDER) + //RMC #define JOB_TWE_RMC_RIFLEMAN "RMC Rifleman" #define JOB_TWE_RMC_MARKSMAN "RMC Marksman" @@ -410,8 +480,6 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) //-------- CIA --------// #define JOB_CIA "Intelligence Analyst" #define JOB_CIA_LIAISON "Intelligence Liaison Officer" - -#define TIS_JOB_LIST list(JOB_TIS_SA, JOB_TIS_IO) //-------- DUTCH'S DOZEN --------// #define JOB_DUTCH_ARNOLD "Dutch's Dozen - Dutch" #define JOB_DUTCH_RIFLEMAN "Dutch's Dozen - Rifleman" @@ -479,4 +547,4 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) ///For denying certain traits being applied to people. ie. bad leg ///'Grunt' lists are for people who wouldn't logically get the bad leg trait, ie. UPP marine counterparts. -#define JOB_ERT_GRUNT_LIST list(DUTCH_JOB_LIST, RIOT_JOB_LIST, PROVOST_JOB_LIST, CMB_GRUNT_LIST, CLF_JOB_LIST, UPP_JOB_GRUNT_LIST, UPP_COMMANDO_JOB_LIST, CONTRACTOR_JOB_LIST, ROLES_WY_GOONS, ROLES_WY_PMC_ALL, CMB_RIOT_LIST) +#define JOB_ERT_GRUNT_LIST list(DUTCH_JOB_LIST, RIOT_JOB_LIST, PROVOST_JOB_LIST, CMB_GRUNT_LIST, CLF_JOB_LIST, UPP_JOB_GRUNT_LIST, UPP_COMMANDO_JOB_LIST, CONTRACTOR_JOB_LIST, ROLES_WY_GOONS, ROLES_WY_PMC_ALL, ROLES_WY_COMMANDOS, CMB_RIOT_LIST) diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm index 17f2232b1964..8eadf7152a65 100644 --- a/code/__DEFINES/keybinding.dm +++ b/code/__DEFINES/keybinding.dm @@ -202,6 +202,7 @@ #define COMSIG_KB_YAUTJA_TELE_LOC "keybinding_yautja_tele_loc" #define COMSIG_KB_YAUTJA_FOLD_COMBISTICK "keybinding_yautja_fold_combistick" +#define COMSIG_KB_YAUTJA_GAUNTLET_GUARD "keybinding_yautja_gauntlet_guard" #define COMSIG_KB_OBSERVER_JOIN_XENO "keybinding_observer_join_as_xeno" #define COMSIG_KB_OBSERVER_JOIN_ERT "keybinding_observer_join_ert" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 19378f88995c..ae7904a190ad 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -56,6 +56,8 @@ /// conveyor belt #define CONVEYOR_LAYER 2.56 +#define RESIN_UNDER_STRUCTURE_LAYER 2.59 + #define RESIN_STRUCTURE_LAYER 2.6 #define LADDER_LAYER 2.7 diff --git a/code/__DEFINES/matrices.dm b/code/__DEFINES/matrices.dm new file mode 100644 index 000000000000..fd12f0c3ef8d --- /dev/null +++ b/code/__DEFINES/matrices.dm @@ -0,0 +1,15 @@ +/// Identity transform matrix (2d) with 6 values +/// list(ax,by,c, dx,dy,f) +#define TRANSFORM_MATRIX_IDENTITY list(1,0,0, 0,1,0) + +/// Identity transform matrix (xyz + translation) with 12 values +/// list(xx,xy,xz, yx,yy,yz, zx,zy,zz, cx,cy,cz) +#define TRANSFORM_COMPLEX_MATRIX_IDENTITY list(1,0,0, 0,1,0, 0,0,1, 0,0,0) + +/// Identity transform matrix (xyzw + projection) with 16 values exclusive to particles +/// list(xx,xy,xz,xw, yx,yy,yz,yw, zx,zy,zz,zw, wx,wy,wz,ww) +#define TRANSFORM_PROJECTION_MATRIX_IDENTITY list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1) + +/// Identity matrix for colors with 20 values +/// list(rr,rg,rb,ra, gr,gg,gb,ga, br,bg,bb,ba, ar,ag,ab,aa, cr,cg,cb,ca) +#define COLOR_MATRIX_IDENTITY list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 89deef2aafe9..f1139c4dbf14 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -32,7 +32,6 @@ #define EXPLOSION_FALLOFF_SHAPE_LINEAR 0 #define EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL 1 #define EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL_HALF 2 - #define EXPLOSION_MAX_POWER 5000 //area flags @@ -51,6 +50,10 @@ #define AREA_YAUTJA_GROUNDS (1<<5) /// Flags the area as a hunting grounds for the Yautja, sometimes blocking game interaction. #define AREA_YAUTJA_HUNTING_GROUNDS (1<<6) +/// Flags the area as hangable, allowing the hanging of skinned bodies. +#define AREA_YAUTJA_HANGABLE (1<<7) +/// Makes it so barricades can't be anchored and starts unsecured. +#define AREA_NOSECURECADES (1<<8) /// Default number of ticks for do_after #define DA_DEFAULT_NUM_TICKS 5 diff --git a/code/__DEFINES/mob_hud.dm b/code/__DEFINES/mob_hud.dm index ff771b8c25e8..d9139a59ce98 100644 --- a/code/__DEFINES/mob_hud.dm +++ b/code/__DEFINES/mob_hud.dm @@ -13,8 +13,6 @@ #define XENO_HOSTILE_SLOW "13" // xeno-inflicted slow. used by a bunch of MOBA xenos stuff #define XENO_HOSTILE_TAG "14" // dancer prae 'tag' #define XENO_HOSTILE_FREEZE "15" // Any xeno-inflifcted root -#define XENO_EXECUTE "28" // Execute thershold, vampire - #define HEALTH_HUD_XENO "16" // health HUD for xenos #define PLASMA_HUD "17" // indicates the plasma level of xenos. #define PHEROMONE_HUD "18" // indicates which pheromone is active on a xeno. @@ -27,7 +25,9 @@ #define HUNTER_CLAN "25" //Displays a colored icon to represent ingame Hunter Clans #define HUNTER_HUD "26" //Displays various statuses on mobs for Hunters to identify targets #define HOLOCARD_HUD "27" //Displays the holocards set by medical personnel +#define XENO_EXECUTE "28" // Execute thershold, vampire #define NEW_PLAYER_HUD "29" //Makes it easy to see new players. +#define SPYCAM_HUD "30" //Remote control spy cameras. //data HUD (medhud, sechud) defines #define MOB_HUD_SECURITY_BASIC 1 @@ -42,16 +42,20 @@ #define MOB_HUD_FACTION_OBSERVER 10 #define MOB_HUD_FACTION_UPP 11 #define MOB_HUD_FACTION_WY 12 -#define MOB_HUD_FACTION_TWE 13 -#define MOB_HUD_FACTION_CLF 14 -#define MOB_HUD_FACTION_PMC 15 -#define MOB_HUD_FACTION_CMB 16 -#define MOB_HUD_FACTION_NSPA 17 -#define MOB_HUD_FACTION_WO 18 -#define MOB_HUD_HUNTER 19 -#define MOB_HUD_HUNTER_CLAN 20 -#define MOB_HUD_EXECUTE 21 -#define MOB_HUD_NEW_PLAYER 22 +#define MOB_HUD_FACTION_HC 13 +#define MOB_HUD_FACTION_TWE 14 +#define MOB_HUD_FACTION_IASF 15 +#define MOB_HUD_FACTION_CLF 16 +#define MOB_HUD_FACTION_PMC 17 +#define MOB_HUD_FACTION_CMB 18 +#define MOB_HUD_FACTION_NSPA 19 +#define MOB_HUD_FACTION_PAP 20 +#define MOB_HUD_FACTION_WO 21 +#define MOB_HUD_HUNTER 22 +#define MOB_HUD_HUNTER_CLAN 23 +#define MOB_HUD_EXECUTE 24 +#define MOB_HUD_NEW_PLAYER 25 +#define MOB_HUD_SPYCAMS 26 //for SL/FTL/LZ targeting on locator huds #define TRACKER_SL "track_sl" @@ -69,6 +73,7 @@ #define TRACKER_DSL "_dsl" // Delta Squad Leader #define TRACKER_ESL "_esl" // Echo Squad Leader #define TRACKER_FSL "_fsl" // Cryo Squad Leader +#define TRACKER_ISL "_isl" // Intel Squad Leader //for tracking the queen/hivecore on xeno locator huds #define TRACKER_QUEEN "Queen" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 5544f5b508ae..96376bb5762e 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -121,6 +121,7 @@ #define CANSLOW (1<<19) #define NO_PERMANENT_DAMAGE (1<<20) #define CORRUPTED_ALLY (1<<21) +#define FAKESOUL (1<<22) // Lets things without souls pretend like they do // ============================= // hive types @@ -187,9 +188,12 @@ #define SQUEEZE_UNDER_VEHICLES (1<<1) // Only the van is supported as of now. #define EASY_SURGERY (1<<2) // Surgeries on this mob don't require advanced skills. #define SURGERY_MODE_ON (1<<3) // Mob on surgery mode, will attempt surgery when using relevant items on harm/disarm intent. -#define MUTINEER (1<<4) // Part of the Mutiny Gang -#define GIVING (1<<5) // Is currently trying to give an item to someone -#define NOBIOSCAN (1<<6) +#define GIVING (1<<4) // Is currently trying to give an item to someone +#define NOBIOSCAN (1<<5) +#define HAS_SPAWNED_PET (1<<6) // Has spawned their special pet. +#define MUTINY_MUTINEER (1<<7) // Part of the Mutiny Gang +#define MUTINY_LOYALIST (1<<8) // Allied with command. +#define MUTINY_NONCOMBAT (1<<9) // NON COMBATANT. //================================================= @@ -260,6 +264,10 @@ #define ACTION_BLUE_POWER_UP 16 #define ACTION_PURPLE_POWER_UP 17 +#define BUSY_ICON_CLIMBING 18 + +#define EMOTE_ICON_WALLBOOSTING 19 + //defins for datum/hud #define HUD_STYLE_STANDARD 1 @@ -295,6 +303,7 @@ #define EMOTING_HEADBUTT (1<<2) #define EMOTING_TAIL_SWIPE (1<<3) #define EMOTING_ROCK_PAPER_SCISSORS (1<<4) +#define EMOTING_WALL_BOOSTING (1<<5) //forcesay types #define SUDDEN 0 diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm index c2e18d740aaa..81bba92baaf8 100644 --- a/code/__DEFINES/mode.dm +++ b/code/__DEFINES/mode.dm @@ -189,6 +189,7 @@ GLOBAL_LIST_INIT(whitelist_hierarchy, list(WHITELIST_NORMAL, WHITELIST_COUNCIL, #define SENATOR_LIST list(WHITELIST_COMMANDER_LEADER, WHITELIST_SYNTHETIC_LEADER, WHITELIST_YAUTJA_LEADER) #define isCouncil(A) (A.check_whitelist_status_list(COUNCIL_LIST)) #define isSenator(A) (A.check_whitelist_status_list(SENATOR_LIST)) +#define isYautjaCouncil(A) (A.check_whitelist_status(WHITELIST_YAUTJA_COUNCIL)) DEFINE_BITFIELD(whitelist_status, list( "WHITELIST_YAUTJA" = WHITELIST_YAUTJA, @@ -248,6 +249,9 @@ DEFINE_BITFIELD(whitelist_status, list( #define FACTION_CONTRACTOR "VAI" #define FACTION_MARSHAL "Colonial Marshal" #define FACTION_NSPA "NSPA" +#define FACTION_IASF "Imperial Armed Space Force" +#define FACTION_PAP "People's Armed Police" +#define FACTION_HYPERDYNE "Hyperdyne Corporation" #define FACTION_WY_DEATHSQUAD "WY Death Squad" #define FACTION_MERCENARY "Mercenary" #define FACTION_FREELANCER "Freelancer" @@ -274,21 +278,30 @@ DEFINE_BITFIELD(whitelist_status, list( #define FACTION_LIST_ERT_OTHER list(FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO) #define FACTION_LIST_ERT_ALL list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY, FACTION_CLF, FACTION_CONTRACTOR, FACTION_UPP, FACTION_FREELANCER, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_MARSHAL, FACTION_TWE, FACTION_HUNTED, FACTION_HUNTED_CLF, FACTION_HUNTED_UPP, FACTION_HUNTED_TWE, FACTION_HUNTED_MERC) #define FACTION_LIST_WY list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) +#define FACTION_LIST_HYPERDYNE list(FACTION_HYPERDYNE) #define FACTION_LIST_UPP list(FACTION_UPP) #define FACTION_LIST_CLF list(FACTION_CLF) -#define FACTION_LIST_TWE list(FACTION_TWE) +#define FACTION_LIST_TWE list(FACTION_TWE, FACTION_IASF) #define FACTION_LIST_FREELANCER list(FACTION_FREELANCER) #define FACTION_LIST_CONTRACTOR list(FACTION_CONTRACTOR) #define FACTION_LIST_MERCENARY list(FACTION_MERCENARY) #define FACTION_LIST_MARSHAL list(FACTION_MARSHAL) #define FACTION_LIST_DUTCH list(FACTION_DUTCH) -#define FACTION_LIST_SURVIVOR_WY list(FACTION_SURVIVOR, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) +#define FACTION_LIST_SURVIVOR_WY list(FACTION_SURVIVOR, FACTION_PMC, FACTION_WY) #define FACTION_LIST_SURVIVOR_NSPA list(FACTION_SURVIVOR, FACTION_NSPA, FACTION_TWE) -#define FACTION_LIST_MARINE_WY list(FACTION_MARINE, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) +#define FACTION_LIST_SURVIVOR_IASF list(FACTION_SURVIVOR, FACTION_IASF, FACTION_TWE) +#define FACTION_LIST_SURVIVOR_PAP list(FACTION_SURVIVOR, FACTION_PAP, FACTION_UPP) +#define FACTION_LIST_SURVIVOR_UPP list(FACTION_SURVIVOR, FACTION_UPP) +#define FACTION_LIST_MARINE_WY list(FACTION_MARINE, FACTION_PMC, FACTION_WY) #define FACTION_LIST_MARINE_UPP list(FACTION_MARINE, FACTION_UPP) #define FACTION_LIST_MARINE_TWE list(FACTION_MARINE, FACTION_TWE) #define FACTION_LIST_YAUTJA list(FACTION_YAUTJA, FACTION_YAUTJA_YOUNG) #define FACTION_LIST_HUNTED list(FACTION_HUNTED, FACTION_HUNTED_CLF, FACTION_HUNTED_UPP, FACTION_HUNTED_TWE, FACTION_HUNTED_MERC) +#define FACTION_LIST_COLONY list(FACTION_SURVIVOR, FACTION_COLONIST) +#define FACTION_LIST_NEUTRAL list(FACTION_NEUTRAL) + +/// The list of factions loosely allied with the USCM +#define FACTION_LIST_MARINE_FAXES list(FACTION_MARINE, FACTION_WY, FACTION_MARSHAL, FACTION_TWE) // Xenomorphs #define FACTION_PREDALIEN "Predalien" diff --git a/code/__DEFINES/origins.dm b/code/__DEFINES/origins.dm index 3ea79cc6cca2..9a5e90b5b893 100644 --- a/code/__DEFINES/origins.dm +++ b/code/__DEFINES/origins.dm @@ -19,3 +19,14 @@ // UPP #define ORIGIN_UPP "Union of Progressive Peoples" + +// WY +#define ORIGIN_WY "Weyland-Yutani Corporation" +#define ORIGIN_WY_SEC "Weyland-Yutani Security" +#define ORIGIN_WY_PMC "Weyland-Yutani Private Military Company" + +// TWE +#define ORIGIN_TWE "Three World Empire" + +// CMB +#define ORIGIN_CMB "The Colonial Marshal Bureau" diff --git a/code/__DEFINES/paygrade_defs/pap.dm b/code/__DEFINES/paygrade_defs/pap.dm new file mode 100644 index 000000000000..5a9a991930ec --- /dev/null +++ b/code/__DEFINES/paygrade_defs/pap.dm @@ -0,0 +1,28 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// PAP - (People's Armed Police) - UPP style Police, like the CMB but for heavy UPP focused colonies. + +/// UPP, Militsioner +#define PAY_SHORT_PAP_MLTS "MLTS" + +/// UPP, Starshiy Militsioner +#define PAY_SHORT_PAP_SMLTS "SMLTS" + +/// UPP, Starshina +#define PAY_SHORT_PAP_STRSH "STRSH" + +/// UPP, Leytenant Militsii +#define PAY_SHORT_PAP_LTN "LTN" + +/// UPP, Kapitan Militsii +#define PAY_SHORT_PAP_KPTN "KPTN" + +/// UPP, Mayor Militsii +#define PAY_SHORT_PAP_MYR "MYR" + +/// UPP, Politkomissar +#define PAY_SHORT_PAP_PLTK "PLTK" + +/// UPP, Polkovnik Militsii +#define PAY_SHORT_PAP_PLKV "PLKV" + diff --git a/code/__DEFINES/paygrade_defs/weyland.dm b/code/__DEFINES/paygrade_defs/weyland.dm index 39b064fd2a94..f881c2c68fc8 100644 --- a/code/__DEFINES/paygrade_defs/weyland.dm +++ b/code/__DEFINES/paygrade_defs/weyland.dm @@ -56,8 +56,8 @@ /// PMC-VS, Vehicle Specialist #define PAY_SHORT_PMC_VS "PMC-VS" -/// PMC-XS, Xeno Specialist (Handler) -#define PAY_SHORT_PMC_XS "PMC-XS" +/// PMC-CCS, Crowd Control Specialist +#define PAY_SHORT_PMC_CCS "PMC-CCS" /// PMC-TL, Team Leader #define PAY_SHORT_PMC_TL "PMC-TL" @@ -82,3 +82,17 @@ /// PMC-DIR, PMC Director #define PAY_SHORT_PMC_DIR "PMC-DIR" + +// Weyland Yutani Commandos + +/// WY-COM, Weyland-Yutani Commando +#define PAY_SHORT_WY_COM "WY-COM" + +/// WY-COMLD Weyland-Yutani Commando Leader +#define PAY_SHORT_WY_COMLD "WY-COMLD" + +/// WY-GUN, Weyland-Yutani Commando Gunner +#define PAY_SHORT_WY_GUN "WY-GUN" + +/// WY-DOG, Weyland-Yutani Dog Catcher +#define PAY_SHORT_WY_DOG "WY-DOG" diff --git a/code/__DEFINES/pred.dm b/code/__DEFINES/pred.dm index 6b04e8127218..728acaf181a2 100644 --- a/code/__DEFINES/pred.dm +++ b/code/__DEFINES/pred.dm @@ -1,5 +1,10 @@ +#define PRED_TECH_MODERN "Modern" +#define PRED_TECH_RETRO "Retro" +#define PRED_TECH_COMBO "Combo" + #define PRED_MATERIALS list("ebony", "silver", "bronze", "crimson", "bone") -#define PRED_TRANSLATORS list("Modern", "Retro", "Combo") +#define PRED_TRANSLATORS list(PRED_TECH_MODERN, PRED_TECH_RETRO, PRED_TECH_COMBO) +#define PRED_INVIS_SOUNDS list(PRED_TECH_MODERN, PRED_TECH_RETRO) #define PRED_LEGACIES list("None", "Dragon", "Swamp", "Enforcer", "Collector") #define PRED_SKIN_COLOR list("tan", "green", "purple", "blue", "red", "black") diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index cf5a1c40f7f7..598d4856e92f 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -62,6 +62,10 @@ #define RADIO_CHANNEL_PMC_CCT "PMC CCT" #define RADIO_CHANNEL_WY_WO "SpecOps" +//Hyperdyne Comms + +#define RADIO_CHANNEL_HYPERDYNE "Hyperdyne" + //Listening Devices #define RADIO_CHANNEL_BUG_A "Listening Device A" #define RADIO_CHANNEL_BUG_B "Listening Device B" @@ -79,6 +83,7 @@ #define RADIO_CHANNEL_CIA "CIA" #define RADIO_CHANNEL_YAUTJA "Yautja" +#define RADIO_CHANNEL_YAUTJA_OVERSEER "Overseer" // Listening bug broadcast setting. Whether or not it plays only to ghosts with preferences, or doesn't show to ghosts at all. diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index ab9d0f1bffde..5feba90d3a18 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -109,6 +109,7 @@ #define MOBILE_SHUTTLE_LIFEBOAT_PORT "lifeboat-port" #define MOBILE_SHUTTLE_LIFEBOAT_STARBOARD "lifeboat-starboard" +#define MOBILE_SHUTTLE_LIFEBOAT_ROSTOCK "lifeboat-rostock" #define MOBILE_SHUTTLE_VEHICLE_ELEVATOR "vehicle_elevator" #define DROPSHIP_ALAMO "dropship_alamo" @@ -120,7 +121,8 @@ #define ALMAYER_DROPSHIP_LZ1 "almayer-hangar-lz1" #define ALMAYER_DROPSHIP_LZ2 "almayer-hangar-lz2" -#define UPP_DROPSHIP_LZ2 "upp-hangar-lz1" +#define UPP_DROPSHIP_LZ1 "upp-hangar-lz1" +#define UPP_DROPSHIP_LZ2 "upp-hangar-lz2" #define DROPSHIP_FLYBY_ID "special_flight" #define DROPSHIP_LZ1 "dropship-lz1" diff --git a/code/__DEFINES/sounds.dm b/code/__DEFINES/sounds.dm index aac1ffc9585b..e9cc84335518 100644 --- a/code/__DEFINES/sounds.dm +++ b/code/__DEFINES/sounds.dm @@ -86,7 +86,10 @@ #define SOUND_ECHO_REVERB_OFF list(0, 0, -10000, -10000, 0, 0.0, 0, 0.25, 1.5, 1.0, 0, 1.0, 0, 0.0, 0.0, 0.0, 1.0, 0) //-10000 to Room & RoomHF makes enviromental reverb effectively inaudible #define AMBIENCE_SHIP 'sound/ambience/shipambience.ogg' +#define AMBIENCE_SHIP_ALT 'sound/ambience/shipambience1.ogg' #define AMBIENCE_JUNGLE 'sound/ambience/ambienceLV624.ogg' +#define AMBIENCE_JUNGLEMOON 'sound/ambience/junglemoon.ogg' +#define AMBIENCE_JUNGLE_ALT 'sound/ambience/ambience_strata.ogg' #define AMBIENCE_RIVER 'sound/ambience/ambienceriver.ogg' #define AMBIENCE_MALL 'sound/ambience/medbay1.ogg' #define AMBIENCE_CAVE 'sound/ambience/desert.ogg' @@ -112,6 +115,7 @@ #define SCAPE_PL_ENG list('sound/soundscape/engamb1.ogg', 'sound/soundscape/engamb2.ogg', 'sound/soundscape/engamb3.ogg', 'sound/soundscape/engamb4.ogg', 'sound/soundscape/engamb5.ogg', 'sound/soundscape/engamb6.ogg', 'sound/soundscape/engamb7.ogg', ) #define SCAPE_PL_HANGAR list('sound/soundscape/hangaramb1.ogg', 'sound/soundscape/hangaramb2.ogg', 'sound/soundscape/hangaramb3.ogg', 'sound/soundscape/hangaramb4.ogg', 'sound/soundscape/hangaramb5.ogg', 'sound/soundscape/hangaramb6.ogg', 'sound/soundscape/hangaramb7.ogg', 'sound/soundscape/hangaramb8.ogg', 'sound/soundscape/hangaramb9.ogg', 'sound/soundscape/hangaramb10.ogg', ) #define SCAPE_PL_ARES list('sound/soundscape/mother.ogg') +#define SCAPE_PL_JUNGLE_MOON list('sound/soundscape/alien_creature1.ogg', 'sound/soundscape/alien_creature2.ogg', 'sound/soundscape/alien_creature3.ogg') // Hybrisa Soundscapes diff --git a/code/__DEFINES/structure.dm b/code/__DEFINES/structure.dm new file mode 100644 index 000000000000..03b6da57dc95 --- /dev/null +++ b/code/__DEFINES/structure.dm @@ -0,0 +1,6 @@ +//! Defines for all obj/structure atoms. + +/// How much health the structure has. +#define STRUCTURE_HEALTH_WEAK 50 +#define STRUCTURE_HEALTH_BASE 100 +#define STRUCTURE_HEALTH_REINFORCED 300 diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 7e1ba820dd8b..b9b539c32e80 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,7 +1,7 @@ // tgstation-server DMAPI // The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in IETF RFC 2119. -#define TGS_DMAPI_VERSION "7.3.1" +#define TGS_DMAPI_VERSION "7.3.3" // All functions and datums outside this document are subject to change with any version and should not be relied on. diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3c0c6f924bfa..7900a6c84b78 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -189,6 +189,8 @@ #define TRAIT_HIVEMIND_INTERFERENCE "t_interference" /// If the hive or xeno can use objects. #define TRAIT_OPPOSABLE_THUMBS "t_thumbs" +/// If the hive or xeno can use playing cards. +#define TRAIT_CARDPLAYING_THUMBS "t_card_thumbs" /// If the Hive delays round end (this is overridden for some hives). Does not occur naturally. Must be applied in events. #define TRAIT_NO_HIVE_DELAY "t_no_hive_delay" /// If the Hive uses it's colors on the mobs. Does not occur naturally, excepting the Mutated hive. @@ -309,6 +311,9 @@ // This item can't be implanted into someone, regardless of the size of the item. #define TRAIT_ITEM_NOT_IMPLANTABLE "t_item_not_implantable" +//This item is being dissolved. Used by yautja_cleaner. +#define TRAIT_ITEM_DISSOLVING "item_dissolving" + //-- structure traits -- // TABLE TRAITS /// If the table is being flipped, prevent any changes that will mess with adjacency handling @@ -378,6 +383,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ABILITY_NO_PLASMA_TRANSFER" = TRAIT_ABILITY_NO_PLASMA_TRANSFER, "TRAIT_ABILITY_OVIPOSITOR" = TRAIT_ABILITY_OVIPOSITOR, "TRAIT_OPPOSABLE_THUMBS" = TRAIT_OPPOSABLE_THUMBS, + "TRAIT_CARDPLAYING_THUMBS" = TRAIT_CARDPLAYING_THUMBS, "TRAIT_INTERFERENCE" = TRAIT_HIVEMIND_INTERFERENCE, "TRAIT_VALKYRIE_ARMOR" = TRAIT_VALKYRIE_ARMORED, ), diff --git a/code/__DEFINES/typecheck/humanoids.dm b/code/__DEFINES/typecheck/humanoids.dm index 3decc5bbd9de..73580c611677 100644 --- a/code/__DEFINES/typecheck/humanoids.dm +++ b/code/__DEFINES/typecheck/humanoids.dm @@ -18,6 +18,7 @@ #define isworkingjoe(A) (ishuman(A) && istype(A?:species, /datum/species/synthetic/colonial/working_joe)) #define ishazardjoe(A) (ishuman(A) && istype(A?:species, /datum/species/synthetic/colonial/working_joe/hazard)) #define isuppjoe(A) (ishuman(A) && istype(A?:species, /datum/species/synthetic/colonial/working_joe/upp)) +#define iswydroid(A) (ishuman(A) && istype(A?:species, /datum/species/synthetic/colonial/wy_droid)) #define isinfiltratorsynthetic(A) (ishuman(A) && istype(A?:species, /datum/species/synthetic/infiltrator)) #define isk9synth(A) (ishuman(A) && istype(A?:species, /datum/species/synthetic/synth_k9)) diff --git a/code/__DEFINES/vendors.dm b/code/__DEFINES/vendors.dm index 19472d0b61b7..bd6c0ddab16c 100644 --- a/code/__DEFINES/vendors.dm +++ b/code/__DEFINES/vendors.dm @@ -18,6 +18,7 @@ #define MARINE_CAN_BUY_COMBAT_HELMET "combat_helmet" #define MARINE_CAN_BUY_COMBAT_ARMOR "combat_armor" #define MARINE_CAN_BUY_KIT "kit" +#define MARINE_CAN_BUY_MAP "map" #define MARINE_CAN_BUY_DRESS "dress" #define CIVILIAN_CAN_BUY_BACKPACK "civilian_backpack" #define CIVILIAN_CAN_BUY_UTILITY "civilian_utility" @@ -29,7 +30,7 @@ #define CIVILIAN_CAN_BUY_GLOVES "civilian_gloves" #define CIVILIAN_CAN_BUY_ACCESSORY "civilian_accessory" -#define MARINE_CAN_BUY_ALL list(MARINE_CAN_BUY_UNIFORM = 1, MARINE_CAN_BUY_SHOES = 1, MARINE_CAN_BUY_HELMET = 1, MARINE_CAN_BUY_ARMOR = 1, MARINE_CAN_BUY_GLOVES = 1, MARINE_CAN_BUY_EAR = 1, MARINE_CAN_BUY_BACKPACK = 1, MARINE_CAN_BUY_POUCH = 2, MARINE_CAN_BUY_BELT = 1, MARINE_CAN_BUY_GLASSES = 1, MARINE_CAN_BUY_MASK = 1, MARINE_CAN_BUY_ESSENTIALS = 1, MARINE_CAN_BUY_SECONDARY = 1, MARINE_CAN_BUY_ATTACHMENT = 1, MARINE_CAN_BUY_MRE = 1, MARINE_CAN_BUY_ACCESSORY = 1, MARINE_CAN_BUY_COMBAT_SHOES = 1, MARINE_CAN_BUY_COMBAT_HELMET = 1, MARINE_CAN_BUY_COMBAT_ARMOR = 1, MARINE_CAN_BUY_KIT = 1, MARINE_CAN_BUY_DRESS = 99, CIVILIAN_CAN_BUY_UNIFORM = 5, CIVILIAN_CAN_BUY_SUIT = 5, CIVILIAN_CAN_BUY_HAT = 5, CIVILIAN_CAN_BUY_GLASSES = 2, CIVILIAN_CAN_BUY_SHOES = 2, CIVILIAN_CAN_BUY_GLOVES = 2, CIVILIAN_CAN_BUY_ACCESSORY = 5) +#define MARINE_CAN_BUY_ALL list(MARINE_CAN_BUY_UNIFORM = 1, MARINE_CAN_BUY_SHOES = 1, MARINE_CAN_BUY_HELMET = 1, MARINE_CAN_BUY_ARMOR = 1, MARINE_CAN_BUY_GLOVES = 1, MARINE_CAN_BUY_EAR = 1, MARINE_CAN_BUY_BACKPACK = 1, MARINE_CAN_BUY_POUCH = 2, MARINE_CAN_BUY_BELT = 1, MARINE_CAN_BUY_GLASSES = 1, MARINE_CAN_BUY_MASK = 1, MARINE_CAN_BUY_ESSENTIALS = 1, MARINE_CAN_BUY_SECONDARY = 1, MARINE_CAN_BUY_ATTACHMENT = 1, MARINE_CAN_BUY_MRE = 1, MARINE_CAN_BUY_MAP = 1, MARINE_CAN_BUY_ACCESSORY = 1, MARINE_CAN_BUY_COMBAT_SHOES = 1, MARINE_CAN_BUY_COMBAT_HELMET = 1, MARINE_CAN_BUY_COMBAT_ARMOR = 1, MARINE_CAN_BUY_KIT = 1, MARINE_CAN_BUY_DRESS = 99, CIVILIAN_CAN_BUY_UNIFORM = 5, CIVILIAN_CAN_BUY_SUIT = 5, CIVILIAN_CAN_BUY_HAT = 5, CIVILIAN_CAN_BUY_GLASSES = 2, CIVILIAN_CAN_BUY_SHOES = 2, CIVILIAN_CAN_BUY_GLOVES = 2, CIVILIAN_CAN_BUY_ACCESSORY = 5) #define MARINE_TOTAL_BUY_POINTS 45 #define MARINE_TOTAL_SNOWFLAKE_POINTS 120 diff --git a/code/__DEFINES/weapon_stats.dm b/code/__DEFINES/weapon_stats.dm index 0f0730b6ca93..68f6e309da7d 100644 --- a/code/__DEFINES/weapon_stats.dm +++ b/code/__DEFINES/weapon_stats.dm @@ -99,8 +99,10 @@ It DOES NOT control where your bullets go, that's scatter and projectile varianc ////RECOIL//// */ +#define RECOIL_AMOUNT_TIER_0 6 #define RECOIL_AMOUNT_TIER_1 5 #define RECOIL_AMOUNT_TIER_2 4 +#define RECOIL_AMOUNT_TIER_2_5 3.4 #define RECOIL_AMOUNT_TIER_3 3 #define RECOIL_AMOUNT_TIER_4 2 #define RECOIL_AMOUNT_TIER_5 1 @@ -136,7 +138,8 @@ As such, don't expect any values assigned to common firearms to even consider ho //How many ticks you have to wait between firing. Burst delay uses the same variable! */ -/// Sniper/DMR Delays +/// Sniper/DMR/SHARP Delays +#define FIRE_DELAY_TIER_SHARP 40 #define FIRE_DELAY_TIER_AMR 30 #define FIRE_DELAY_TIER_VULTURE 20 #define FIRE_DELAY_TIER_SNIPER 15 diff --git a/code/__DEFINES/wycomputer.dm b/code/__DEFINES/wycomputer.dm new file mode 100644 index 000000000000..e51a035f0471 --- /dev/null +++ b/code/__DEFINES/wycomputer.dm @@ -0,0 +1,16 @@ +/// WY Corporate Director +#define WY_COMP_ACCESS_DIRECTOR 7 +/// WY Corporate Leadership (Chief Exec and Div Manager) +#define WY_COMP_ACCESS_SENIOR_LEAD 6 +/// WY Corporate Supervisors (Asst. Manager and Exec. Supervisor) +#define WY_COMP_ACCESS_SUPERVISOR 5 +/// WY Senior Employees (Exec. Specialists and Senior Execs.) +#define WY_COMP_ACCESS_CORPORATE_SENIOR 4 +/// WY Corporate Liaison +#define WY_COMP_ACCESS_LIAISON 3 +/// WY Corporate Employees +#define WY_COMP_ACCESS_CORPORATE 2 +/// Unauthenticated Personnel +#define WY_COMP_ACCESS_FORBIDDEN 1 +/// Logged out... +#define WY_COMP_ACCESS_LOGGED_OUT 0 diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index a0b957c05a75..22bd6990eb21 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -197,8 +197,6 @@ #define XENO_LEAVE_TIMER_LARVA 80 //80 seconds /// The time against away_timer when an AFK xeno (not larva) can be replaced #define XENO_LEAVE_TIMER 300 //300 seconds -/// The time against away_timer when an AFK facehugger converts to a npc -#define XENO_FACEHUGGER_LEAVE_TIMER 420 //420 seconds /// The time against away_timer when an AFK xeno gets listed in the available list so ghosts can get ready #define XENO_AVAILABLE_TIMER 60 //60 seconds @@ -379,6 +377,7 @@ // Hivelord strain flags #define HIVELORD_RESIN_WHISPERER "Resin Whisperer" +#define HIVELORD_DESIGNER "Designer" // Carrier strain flags #define CARRIER_EGGSAC "Eggsac" @@ -639,6 +638,7 @@ #define XENO_STRUCTURE_PYLON "hive pylon" #define XENO_STRUCTURE_EGGMORPH "egg morpher" #define XENO_STRUCTURE_RECOVERY "recovery node" +#define XENO_STRUCTURE_PLASMA_TREE "plasma tree" #define XENO_STRUCTURE_NEST "thick resin nest" #define RESIN_TRAP_EMPTY 0 @@ -707,6 +707,9 @@ #define XENO_CASTE_HELLHOUND "Hellhound" #define XENO_SPECIAL_CASTES list(XENO_CASTE_QUEEN, XENO_CASTE_PREDALIEN, XENO_CASTE_HELLHOUND) +//caste list +#define XENO_CONSTRUCT_NODE_BOOST list(XENO_CASTE_HIVELORD, XENO_CASTE_BURROWER, XENO_CASTE_CARRIER, XENO_CASTE_QUEEN) + #define ALL_XENO_CASTES list(XENO_CASTE_LARVA, XENO_CASTE_PREDALIEN_LARVA, XENO_CASTE_FACEHUGGER, XENO_CASTE_LESSER_DRONE, XENO_CASTE_DRONE, XENO_CASTE_RUNNER, XENO_CASTE_SENTINEL, XENO_CASTE_DEFENDER, XENO_CASTE_BURROWER, XENO_CASTE_CARRIER, XENO_CASTE_HIVELORD, XENO_CASTE_LURKER, XENO_CASTE_WARRIOR, XENO_CASTE_SPITTER, XENO_CASTE_BOILER, XENO_CASTE_PRAETORIAN, XENO_CASTE_CRUSHER, XENO_CASTE_RAVAGER, XENO_CASTE_QUEEN, XENO_CASTE_PREDALIEN, XENO_CASTE_HELLHOUND, XENO_CASTE_KING) // Checks if two hives are allied to each other. diff --git a/code/__HELPERS/_time.dm b/code/__HELPERS/_time.dm index f0be24ea7e12..5e114fa2eaa8 100644 --- a/code/__HELPERS/_time.dm +++ b/code/__HELPERS/_time.dm @@ -97,3 +97,140 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) if(hour) hourT = " and [hour] hour[(hour != 1)? "s":""]" return "[day] day[(day != 1)? "s":""][hourT][minuteT][secondT]" + +/* + +Days of the week to make it easier to reference them. + +When using time2text(), please use "DDD" to find the weekday. Refrain from using "Day" + +*/ +#define MONDAY "Mon" +#define TUESDAY "Tue" +#define WEDNESDAY "Wed" +#define THURSDAY "Thu" +#define FRIDAY "Fri" +#define SATURDAY "Sat" +#define SUNDAY "Sun" + +//Months + +#define JANUARY 1 +#define FEBRUARY 2 +#define MARCH 3 +#define APRIL 4 +#define MAY 5 +#define JUNE 6 +#define JULY 7 +#define AUGUST 8 +#define SEPTEMBER 9 +#define OCTOBER 10 +#define NOVEMBER 11 +#define DECEMBER 12 + +//Select holiday names -- If you test for a holiday in the code, make the holiday's name a define and test for that instead +#define NEW_YEAR "New Year" +#define VALENTINES "Valentine's Day" +#define APRIL_FOOLS "April Fool's Day" +#define ST_PATRICK "Saint Patrick's Day" + +#define EASTER "Easter" +#define HALLOWEEN "Halloween" +#define CHRISTMAS "Christmas" +#define FESTIVE_SEASON "Festive Season" +#define HOTDOG_DAY "National Hot Dog Day" + +/*Timezones*/ + +/// Line Islands Time +#define TIMEZONE_LINT 14 + +// Chatham Daylight Time +#define TIMEZONE_CHADT 13.75 + +/// Tokelau Time +#define TIMEZONE_TKT 13 + +/// Tonga Time +#define TIMEZONE_TOT 13 + +/// New Zealand Daylight Time +#define TIMEZONE_NZDT 13 + +/// New Zealand Standard Time +#define TIMEZONE_NZST 12 + +/// Norfolk Time +#define TIMEZONE_NFT 11 + +/// Lord Howe Standard Time +#define TIMEZONE_LHST 10.5 + +/// Australian Eastern Standard Time +#define TIMEZONE_AEST 10 + +/// Australian Central Standard Time +#define TIMEZONE_ACST 9.5 + +/// Australian Central Western Standard Time +#define TIMEZONE_ACWST 8.75 + +/// Australian Western Standard Time +#define TIMEZONE_AWST 8 + +/// Christmas Island Time +#define TIMEZONE_CXT 7 + +/// Cocos Islands Time +#define TIMEZONE_CCT 6.5 + +/// Central European Summer Time +#define TIMEZONE_CEST 2 + +/// Coordinated Universal Time +#define TIMEZONE_UTC 0 + +/// Eastern Daylight Time +#define TIMEZONE_EDT -4 + +/// Eastern Standard Time +#define TIMEZONE_EST -5 + +/// Central Daylight Time +#define TIMEZONE_CDT -5 + +/// Central Standard Time +#define TIMEZONE_CST -6 + +/// Mountain Daylight Time +#define TIMEZONE_MDT -6 + +/// Mountain Standard Time +#define TIMEZONE_MST -7 + +/// Pacific Daylight Time +#define TIMEZONE_PDT -7 + +/// Pacific Standard Time +#define TIMEZONE_PST -8 + +/// Alaska Daylight Time +#define TIMEZONE_AKDT -8 + +/// Alaska Standard Time +#define TIMEZONE_AKST -9 + +/// Hawaii-Aleutian Daylight Time +#define TIMEZONE_HDT -9 + +/// Hawaii Standard Time +#define TIMEZONE_HST -10 + +/// Cook Island Time +#define TIMEZONE_CKT -10 + +/// Niue Time +#define TIMEZONE_NUT -11 + +/// Anywhere on Earth +#define TIMEZONE_ANYWHERE_ON_EARTH -12 diff --git a/code/__HELPERS/dates.dm b/code/__HELPERS/dates.dm new file mode 100644 index 000000000000..272aa3d3136a --- /dev/null +++ b/code/__HELPERS/dates.dm @@ -0,0 +1,41 @@ +//Adapted from a free algorithm written in BASIC (https://www.assa.org.au/edm#Computer) +/proc/easter_date(y) + var/first_dig, remain_19, temp //Intermediate Results + var/table_a, table_b, table_c, table_d, table_e //Table A-E results + var/d, m //Day and Month returned + + first_dig = round((y / 100)) + remain_19 = y % 19 + + temp = (round((first_dig - 15) / 2)) + 202 - 11 * remain_19 + + switch(first_dig) + if(21,24,25,27,28,29,30,31,32,34,35,38) + temp -= 1 + if(33,36,37,39,40) + temp -= 2 + temp %= 30 + + table_a = temp + 21 + if(temp == 29) + table_a -= 1 + if(temp == 28 && (remain_19 > 10)) + table_a -= 1 + table_b = (table_a - 19) % 7 + + table_c = (40 - first_dig) % 4 + if(table_c == 3) + table_c += 1 + if(table_c > 1) + table_c += 1 + temp = y % 100 + table_d = (temp + round((temp / 4))) % 7 + + table_e = ((20 - table_b - table_c - table_d) % 7) + 1 + d = table_a + table_e + if(d > 31) + d -= 31 + m = 4 + else + m = 3 + return list("day" = d, "month" = m) diff --git a/code/__HELPERS/filters.dm b/code/__HELPERS/filters.dm index 29e3ec9efb1e..8306c19ebccf 100644 --- a/code/__HELPERS/filters.dm +++ b/code/__HELPERS/filters.dm @@ -22,20 +22,26 @@ GLOBAL_LIST_INIT(master_filter_info, list( "size" = 1 ) ), - /* Not supported because making a proper matrix editor on the frontend would be a huge dick pain. - Uncomment if you ever implement it + // Needs either a proper matrix editor, or just a hook to our existing one + // Issue is filterrific assumes variables will have the same value type if they share the same name, which this violates + // Gotta refactor this sometime "color" = list( "defaults" = list( "color" = matrix(), "space" = FILTER_COLOR_RGB + ), + "enums" = list( + "FILTER_COLOR_RGB" = FILTER_COLOR_RGB, + "FILTER_COLOR_HSV" = FILTER_COLOR_HSV, + "FILTER_COLOR_HSL" = FILTER_COLOR_HSL, + "FILTER_COLOR_HCY" = FILTER_COLOR_HCY ) ), - */ "displace" = list( "defaults" = list( "x" = 0, "y" = 0, - "size" = null, + "size" = 1, "icon" = ICON_NOT_SET, "render_source" = "" ) @@ -62,8 +68,20 @@ GLOBAL_LIST_INIT(master_filter_info, list( "render_source" = "", "flags" = FILTER_OVERLAY, "color" = "", - "transform" = null, + "transform" = TRANSFORM_MATRIX_IDENTITY, "blend_mode" = BLEND_DEFAULT + ), + "flags" = list( + "FILTER_OVERLAY" = FILTER_OVERLAY, + "FILTER_UNDERLAY" = FILTER_UNDERLAY + ), + "enums" = list( + "BLEND_DEFAULT" = BLEND_DEFAULT, + "BLEND_OVERLAY" = BLEND_OVERLAY, + "BLEND_ADD" = BLEND_ADD, + "BLEND_SUBTRACT" = BLEND_SUBTRACT, + "BLEND_MULTIPLY" = BLEND_MULTIPLY, + "BLEND_INSET_OVERLAY" = BLEND_INSET_OVERLAY ) ), "motion_blur" = list( @@ -138,7 +156,6 @@ GLOBAL_LIST_INIT(master_filter_info, list( #undef ICON_NOT_SET - //Helpers to generate lists for filter helpers //This is the only practical way of writing these that actually produces sane lists /proc/alpha_mask_filter(x, y, icon/icon, render_source, flags) @@ -313,6 +330,8 @@ GLOBAL_LIST_INIT(master_filter_info, list( animate(offset = random_roll - 1, time = rand() * 20 + 10) /proc/remove_wibbly_filters(atom/in_atom) + if(QDELETED(in_atom)) + return var/filter for(var/i in 1 to 7) filter = in_atom.get_filter("wibbly-[i]") diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 81325a60b375..01555ddbff01 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -514,7 +514,8 @@ world if(no_anim) //Clean up repeated frames - var/icon/cleaned = new /icon() + // Done this way otherwise Width() and Height() would always be 0 for this icon + var/icon/cleaned = icon('icons/effects/effects.dmi', "nothing") cleaned.Insert(flat, "", SOUTH, 1, 0) return cleaned else @@ -679,6 +680,61 @@ world return FALSE +/// Asks the user for an icon (either from file or as a path) and offers to customize it if possible (e.g. setting icon_state) +/proc/pick_and_customize_icon(mob/user, pick_only=FALSE) + var/icon/icon_result = null + if(!user) + user = usr + + var/icon_from_file = tgui_alert(user, "Do you wish to pick an icon from file?", "File picker icon", list("Yes", "No")) + if(isnull(icon_from_file)) + return null + if(icon_from_file == "Yes") + icon_result = input(user, "Pick icon:", "Icon") as null|icon + if(!icon_result) + return null + else if(icon_from_file == "No") + var/new_icon = tgui_input_text(user, "Pick icon path", "icon path") + if(isnull(new_icon)) + return null + var/regex/regex = regex(@"^.+icons/") + new_icon = regex.Replace(replacetext(new_icon, @"\", "/"), "icons/") + icon_result = fcopy_rsc(new_icon) + if(!icon_result) + to_chat(user, SPAN_WARNING("'[new_icon]' is an invalid icon path!")) + return null + + var/dmi_path = get_icon_dmi_path(icon_result) + if(!dmi_path || pick_only) + return icon_result + + var/custom = tgui_alert(user, "Do you wish to specify any arguments for the icon?", "Customize Icon", list("Yes", "No")) + if(isnull(custom)) + return null + if(custom == "Yes") + var/new_icon_state = tgui_input_text(user, "Pick icon_state", "icon_state") + if(isnull(new_icon_state)) + return null + var/new_icon_dir = tgui_input_list(user, "Pick icon dir", "dir", list("North", "East", "South", "West"), default="South") + if(isnull(new_icon_dir)) + return null + var/new_icon_frame = tgui_input_number(user, "Pick icon frame", "frame", min_value=0, integer_only=TRUE) + if(isnull(new_icon_frame)) + return null + var/new_icon_moving = tgui_input_list(user, "Pick icon moving", "moving", list("Both", "Movement only", "Non-Movement Only"), default="Both") + switch(new_icon_moving) + if("Both") + new_icon_moving = null + if("Movement only") + new_icon_moving = 1 + if("Non-Movement Only") + new_icon_moving = 0 + else + return null + icon_result = new(dmi_path, new_icon_state, text2dir(new_icon_dir), new_icon_frame, new_icon_moving) + + return icon_result + /** * generate an asset for the given icon or the icon of the given appearance for [thing], and send it to any clients in target. * Arguments: @@ -757,6 +813,12 @@ world icon2collapse = icon(icon2collapse, icon_state, dir, frame, moving) + var/width = icon2collapse.Width() + var/height = icon2collapse.Height() + if(width != height) + var/new_dimension = min(width, height) + center_icon(icon2collapse, new_dimension, new_dimension) + var/list/name_and_ref = generate_and_hash_rsc_file(icon2collapse, icon_path)//pretend that tuples exist var/rsc_ref = name_and_ref[1] //weird object thats not even readable to the debugger, represents a reference to the icons rsc entry @@ -889,6 +951,50 @@ world return image_to_center +/** + * Centers an icon. + * + * Arguments: + * * icon - The icon to center + * * final_width - The width to crop to. Will use Width() if <= 0 + * * final_height - The height to crop to. Will use Height() if <= 0 + */ +/proc/center_icon(icon/icon, final_width, final_height) + var/width = icon.Width() || world.icon_size + var/height = icon.Height() || world.icon_size + + if(final_width <= 0) + final_width = width + if(final_height <= 0) + final_height = height + + var/left = INFINITY + var/right = 0 + var/bottom = INFINITY + var/top = 0 + + // Find the inner dimensions (non-alpha pixels) + for(var/x in 1 to width) + for(var/y in 1 to height) + if(icon.GetPixel(x, y)) + left = min(x, left) + right = max(x, right) + bottom = min(y, bottom) + top = max(y, top) + + if(!right) + // Fully transparent + icon.Crop(1, 1, final_width, final_height) + return icon + + var/inner_width = right - left + var/inner_height = top - bottom + var/left_padding = left - floor((final_width - inner_width) * 0.5) + var/bottom_padding = bottom - floor((final_height - inner_height) * 0.5) + + icon.Crop(left_padding, bottom_padding, left_padding + final_width - 1, bottom_padding + final_height - 1) + return icon + //For creating consistent icons for human looking simple animals /proc/get_flat_human_icon(icon_id, equipment_preset_dresscode, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override) var/static/list/humanoid_icon_cache = list() diff --git a/code/__HELPERS/level_traits.dm b/code/__HELPERS/level_traits.dm index 8b3d1b0a3809..ccc7f871dccf 100644 --- a/code/__HELPERS/level_traits.dm +++ b/code/__HELPERS/level_traits.dm @@ -6,4 +6,4 @@ #define is_reserved_level(z) SSmapping.level_trait(z, ZTRAIT_RESERVED) -#define OBJECTS_CAN_REACH(Oa, Ob) (!(is_admin_level(Oa.z) || is_admin_level(Ob.z)) || Oa.z == Ob.z) +#define OBJECTS_CAN_REACH(Oa, Ob) (!(should_block_game_interaction(Oa) || should_block_game_interaction(Ob)) || Oa.z == Ob.z) diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index 2f6a6093a367..96793e35e0e7 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -102,16 +102,11 @@ list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) list(0.393,0.349,0.272,0, 0.769,0.686,0.534,0, 0.189,0.168,0.131,0, 0,0,0,1, 0,0,0,0) */ - -//Does nothing -/proc/color_matrix_identity() - return list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) - //word of warning: using a matrix like this as a color value will simplify it back to a string after being set /proc/color_hex2color_matrix(string) var/length = length(string) if((length != 7 && length != 9) || length != length_char(string)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY var/r = hex2num(copytext(string, 2, 4))/255 var/g = hex2num(copytext(string, 4, 6))/255 var/b = hex2num(copytext(string, 6, 8))/255 @@ -119,13 +114,13 @@ list(0.393,0.349,0.272,0, 0.769,0.686,0.534,0, 0.189,0.168,0.131,0, 0,0,0,1, 0,0 if(length == 9) a = hex2num(copytext(string, 8, 10))/255 if(!isnum(r) || !isnum(g) || !isnum(b) || !isnum(a)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY return list(r,0,0,0, 0,g,0,0, 0,0,b,0, 0,0,0,a, 0,0,0,0) ///Converts a hex color string to a color matrix. /proc/color_matrix_from_string(string) if(!string || !istext(string)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY var/string_r = hex2num(copytext(string, 2, 4)) / 255 var/string_g = hex2num(copytext(string, 4, 6)) / 255 @@ -192,9 +187,9 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro //Returns a matrix addition of A with B /proc/color_matrix_add(list/A, list/B) if(!istype(A) || !istype(B)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY if(length(A) != 20 || length(B) != 20) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY var/list/output = list() output.len = 20 for(var/value in 1 to 20) @@ -205,9 +200,9 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro //Returns a matrix multiplication of A with B /proc/color_matrix_multiply(list/A, list/B) if(!istype(A) || !istype(B)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY if(length(A) != 20 || length(B) != 20) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY var/list/output = list() output.len = 20 var/x = 1 @@ -225,7 +220,7 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro The arg is a list of hex colours, for ex "list("#d4c218", "#b929f7", "#339933"". if you want variations of the same color, color_matrix_recolor_red() is simpler.**/ /proc/color_matrix_recolor_rgb(list/replacement_shades) - var/list/final_matrix = color_matrix_identity() + var/list/final_matrix = COLOR_MATRIX_IDENTITY if(length(replacement_shades) != 3) CRASH("color_matrix_recolor_rgb() called with less than 3 replacement colours.") diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index fae9d1a82fe6..4aa147b640aa 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -237,9 +237,12 @@ //Returns whether or not a player is a guest using their ckey as an input -/proc/IsGuestKey(key) +/proc/IsGuestKey(key, strict = FALSE) + if(!strict && (key in GLOB.permitted_guests)) + return FALSE + if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx - return 0 + return FALSE var/i = 7, ch, len = length(key) @@ -249,8 +252,8 @@ for (, i <= len, ++i) ch = text2ascii(key, i) if (ch < 48 || ch > 57) - return 0 - return 1 + return FALSE + return TRUE //This will update a mob's name, real_name, mind.name, data_core records, pda and id //Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn @@ -345,8 +348,6 @@ var/list/sortmob = sortAtom(GLOB.mob_list) for(var/mob/living/silicon/ai/M in sortmob) moblist.Add(M) - for(var/mob/living/silicon/robot/M in sortmob) - moblist.Add(M) for(var/mob/living/carbon/human/M in sortmob) moblist.Add(M) for(var/mob/living/brain/M in sortmob) @@ -622,10 +623,12 @@ GLOBAL_DATUM(busy_indicator_medical, /image) GLOBAL_DATUM(busy_indicator_build, /image) GLOBAL_DATUM(busy_indicator_friendly, /image) GLOBAL_DATUM(busy_indicator_hostile, /image) +GLOBAL_DATUM(busy_indicator_climbing, /image) GLOBAL_DATUM(emote_indicator_highfive, /image) GLOBAL_DATUM(emote_indicator_fistbump, /image) GLOBAL_DATUM(emote_indicator_headbutt, /image) GLOBAL_DATUM(emote_indicator_tailswipe, /image) +GLOBAL_DATUM(emote_indicator_wallboosting, /image) GLOBAL_DATUM(emote_indicator_rock_paper_scissors, /image) GLOBAL_DATUM(emote_indicator_rock, /image) GLOBAL_DATUM(emote_indicator_paper, /image) @@ -666,6 +669,12 @@ GLOBAL_DATUM(action_purple_power_up, /image) GLOB.busy_indicator_hostile.layer = FLY_LAYER GLOB.busy_indicator_hostile.plane = ABOVE_GAME_PLANE return GLOB.busy_indicator_hostile + else if(busy_type == BUSY_ICON_CLIMBING) + if(!GLOB.busy_indicator_climbing) + GLOB.busy_indicator_climbing = image('icons/mob/do_afters.dmi', null, "busy_climbing", "pixel_y" = 22) + GLOB.busy_indicator_climbing.layer = FLY_LAYER + GLOB.busy_indicator_climbing.plane = ABOVE_GAME_PLANE + return GLOB.busy_indicator_climbing else if(busy_type == EMOTE_ICON_HIGHFIVE) if(!GLOB.emote_indicator_highfive) GLOB.emote_indicator_highfive = image('icons/mob/do_afters.dmi', null, "emote_highfive", "pixel_y" = 22) @@ -714,6 +723,12 @@ GLOBAL_DATUM(action_purple_power_up, /image) GLOB.emote_indicator_tailswipe.layer = FLY_LAYER GLOB.emote_indicator_tailswipe.plane = ABOVE_GAME_PLANE return GLOB.emote_indicator_tailswipe + else if(busy_type == EMOTE_ICON_WALLBOOSTING) + if(!GLOB.emote_indicator_wallboosting) + GLOB.emote_indicator_wallboosting = image('icons/mob/do_afters.dmi', null, "emote_wallboosting", "pixel_y" = 22) + GLOB.emote_indicator_wallboosting.layer = FLY_LAYER + GLOB.emote_indicator_wallboosting.plane = ABOVE_GAME_PLANE + return GLOB.emote_indicator_wallboosting else if(busy_type == ACTION_RED_POWER_UP) if(!GLOB.action_red_power_up) GLOB.action_red_power_up = image('icons/effects/effects.dmi', null, "anger", "pixel_x" = 16) @@ -740,6 +755,7 @@ GLOBAL_DATUM(action_purple_power_up, /image) return GLOB.action_purple_power_up + /* * do_after handles timed actions * The flags indicate which actions from the user and a target (if there is a target) interrupt a given action. @@ -889,33 +905,33 @@ GLOBAL_DATUM(action_purple_power_up, /image) if((user_flags|target_flags) & INTERRUPT_OUT_OF_RANGE && target && get_dist(busy_user, target) > max_dist) . = FALSE break - if(user_flags & INTERRUPT_LCLICK && busy_user.clicked_something["left"] || \ - target_is_mob && (target_flags & INTERRUPT_LCLICK && T.clicked_something["left"]) + if(user_flags & INTERRUPT_LCLICK && busy_user.clicked_something[LEFT_CLICK] || \ + target_is_mob && (target_flags & INTERRUPT_LCLICK && T.clicked_something[LEFT_CLICK]) ) . = FALSE break - if(user_flags & INTERRUPT_RCLICK && busy_user.clicked_something["right"] || \ - target_is_mob && (target_flags & INTERRUPT_RCLICK && T.clicked_something["right"]) + if(user_flags & INTERRUPT_RCLICK && busy_user.clicked_something[RIGHT_CLICK] || \ + target_is_mob && (target_flags & INTERRUPT_RCLICK && T.clicked_something[RIGHT_CLICK]) ) . = FALSE break - if(user_flags & INTERRUPT_SHIFTCLICK && busy_user.clicked_something["left"] && busy_user.clicked_something["shift"] || \ - target_is_mob && (target_flags & INTERRUPT_SHIFTCLICK && T.clicked_something["left"] && T.clicked_something["shift"]) + if(user_flags & INTERRUPT_SHIFTCLICK && busy_user.clicked_something[LEFT_CLICK] && busy_user.clicked_something[SHIFT_CLICK] || \ + target_is_mob && (target_flags & INTERRUPT_SHIFTCLICK && T.clicked_something[LEFT_CLICK] && T.clicked_something[SHIFT_CLICK]) ) . = FALSE break - if(user_flags & INTERRUPT_ALTCLICK && busy_user.clicked_something["left"] && busy_user.clicked_something["alt"] || \ - target_is_mob && (target_flags & INTERRUPT_ALTCLICK && T.clicked_something["left"] && T.clicked_something["alt"]) + if(user_flags & INTERRUPT_ALTCLICK && busy_user.clicked_something[LEFT_CLICK] && busy_user.clicked_something[ALT_CLICK] || \ + target_is_mob && (target_flags & INTERRUPT_ALTCLICK && T.clicked_something[LEFT_CLICK] && T.clicked_something[ALT_CLICK]) ) . = FALSE break - if(user_flags & INTERRUPT_CTRLCLICK && busy_user.clicked_something["left"] && busy_user.clicked_something["ctrl"] || \ - target_is_mob && (target_flags & INTERRUPT_CTRLCLICK && T.clicked_something["left"] && T.clicked_something["ctrl"]) + if(user_flags & INTERRUPT_CTRLCLICK && busy_user.clicked_something[LEFT_CLICK] && busy_user.clicked_something[CTRL_CLICK] || \ + target_is_mob && (target_flags & INTERRUPT_CTRLCLICK && T.clicked_something[LEFT_CLICK] && T.clicked_something[CTRL_CLICK]) ) . = FALSE break - if(user_flags & INTERRUPT_MIDDLECLICK && busy_user.clicked_something["middle"] || \ - target_is_mob && (target_flags & INTERRUPT_MIDDLECLICK && T.clicked_something["middle"]) + if(user_flags & INTERRUPT_MIDDLECLICK && busy_user.clicked_something[MIDDLE_CLICK] || \ + target_is_mob && (target_flags & INTERRUPT_MIDDLECLICK && T.clicked_something[MIDDLE_CLICK]) ) . = FALSE break diff --git a/code/_byond_version_compat.dm b/code/_byond_version_compat.dm index 3f9a5a0bd812..f4949de7183a 100644 --- a/code/_byond_version_compat.dm +++ b/code/_byond_version_compat.dm @@ -2,11 +2,11 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 516 -#define MIN_COMPILER_BUILD 1655 +#define MIN_COMPILER_BUILD 1661 #if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://www.byond.com/download and update. -#error You need version 516.1655 or higher +#error You need version 516.1661 or higher #endif // So we want to have compile time guarantees these methods exist on local type, unfortunately 515 killed the .proc/procname and .verb/verbname syntax so we have to use nameof() diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index a76e4a8e0b73..0dce1a50f61e 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -345,6 +345,10 @@ DEFINE_BITFIELD(flags_area, list( "AREA_ALLOW_XENO_JOIN" = AREA_ALLOW_XENO_JOIN, "AREA_CONTAINMENT" = AREA_CONTAINMENT, "AREA_UNWEEDABLE" = AREA_UNWEEDABLE, + "AREA_YAUTJA_GROUNDS" = AREA_YAUTJA_GROUNDS, + "AREA_YAUTJA_HUNTING_GROUNDS" = AREA_YAUTJA_HUNTING_GROUNDS, + "AREA_YAUTJA_HANGABLE" = AREA_YAUTJA_HANGABLE, + "AREA_NOSECURECADES" = AREA_NOSECURECADES, )) DEFINE_BITFIELD(disabilities, list( @@ -376,6 +380,7 @@ DEFINE_BITFIELD(status_flags, list( "CANDAZE" = CANDAZE, "CANSLOW" = CANSLOW, "NO_PERMANENT_DAMAGE" = NO_PERMANENT_DAMAGE, + "FAKESOUL" = FAKESOUL, )) DEFINE_BITFIELD(mob_flags, list( @@ -383,9 +388,11 @@ DEFINE_BITFIELD(mob_flags, list( "SQUEEZE_UNDER_VEHICLES" = SQUEEZE_UNDER_VEHICLES, "EASY_SURGERY" = EASY_SURGERY, "SURGERY_MODE_ON" = SURGERY_MODE_ON, - "MUTINEER" = MUTINEER, "GIVING" = GIVING, "NOBIOSCAN" = NOBIOSCAN, + "MUTINY_MUTINEER" = MUTINY_MUTINEER, + "MUTINY_LOYALIST" = MUTINY_LOYALIST, + "MUTINY_NONCOMBAT" = MUTINY_NONCOMBAT, )) DEFINE_BITFIELD(mobility_flags, list( diff --git a/code/_globalvars/global_lists.dm b/code/_globalvars/global_lists.dm index 9b241b007d16..b6fb3d9a7c35 100644 --- a/code/_globalvars/global_lists.dm +++ b/code/_globalvars/global_lists.dm @@ -326,10 +326,14 @@ GLOBAL_LIST_INIT(wj_emotes, setup_working_joe_emotes()) GLOBAL_LIST_EMPTY(hj_categories) /// dict ("category" : (emotes)) of every hj emote typepath GLOBAL_LIST_INIT(hj_emotes, setup_hazard_joe_emotes()) -/// dict ("category" : (emotes)) of every uppj emote typepath +/// list of categories for upp joes GLOBAL_LIST_EMPTY(uppj_categories) /// dict ("category" : (emotes)) of every uppj emote typepath GLOBAL_LIST_INIT(uppj_emotes, setup_upp_joe_emotes()) +/// list of categories for wy combat droids +GLOBAL_LIST_EMPTY(wy_droid_categories) +/// dict ("category" : (emotes)) of every wy droid emote typepath +GLOBAL_LIST_INIT(wy_droid_emotes, setup_wy_droid_emotes()) /proc/cached_params_decode(params_data, decode_proc) . = GLOB.paramslist_cache[params_data] @@ -425,9 +429,7 @@ GLOBAL_LIST_INIT(uppj_emotes, setup_upp_joe_emotes()) var/list/language_keys = list() for (var/language_name in subtypesof(/datum/language)) var/datum/language/L = language_name - language_keys[":[lowertext(initial(L.key))]"] = initial(L.name) - language_keys[".[lowertext(initial(L.key))]"] = initial(L.name) - language_keys["#[lowertext(initial(L.key))]"] = initial(L.name) + language_keys["![lowertext(initial(L.key))]"] = initial(L.name) return language_keys //Comb Sort. This works apparently, so we're keeping it that way @@ -537,7 +539,7 @@ GLOBAL_LIST_INIT(uppj_emotes, setup_upp_joe_emotes()) /* // Uncomment to debug chemical reaction list. -/client/verb/debug_chemical_list() +CLIENT_VERB(debug_chemical_list) for (var/reaction in GLOB.chemical_reactions_filtered_list) . += "GLOB.chemical_reactions_filtered_list\[\"[reaction]\"\] = \"[GLOB.chemical_reactions_filtered_list[reaction]]\"\n" @@ -605,7 +607,7 @@ GLOBAL_LIST_INIT_TYPED(specialist_set_datums, /datum/specialist_set, setup_speci emotes_to_add += emote return emotes_to_add -/// Setup for Hazard joe emotes and category list, returns data for uppj_emotes +/// Setup for UPP joe emotes and category list, returns data for uppj_emotes /proc/setup_upp_joe_emotes() var/list/emotes_to_add = list() for(var/datum/emote/living/carbon/human/synthetic/working_joe/emote as anything in subtypesof(/datum/emote/living/carbon/human/synthetic/working_joe)) @@ -618,6 +620,19 @@ GLOBAL_LIST_INIT_TYPED(specialist_set_datums, /datum/specialist_set, setup_speci emotes_to_add += emote return emotes_to_add +/// Setup for WY droid emotes and category list, returns data for wy_droid_emotes +/proc/setup_wy_droid_emotes() + var/list/emotes_to_add = list() + for(var/datum/emote/living/carbon/human/synthetic/colonial/wy_droid/emote as anything in subtypesof(/datum/emote/living/carbon/human/synthetic/colonial/wy_droid)) + if(!initial(emote.key) || !initial(emote.say_message)) + continue + + if(!(initial(emote.category) in GLOB.wy_droid_categories)) + GLOB.wy_droid_categories += initial(emote.category) + + emotes_to_add += emote + return emotes_to_add + GLOBAL_LIST_EMPTY(topic_tokens) GLOBAL_PROTECT(topic_tokens) diff --git a/code/_globalvars/lists/client.dm b/code/_globalvars/lists/client.dm index 404e8a662e80..3564e19aabbc 100644 --- a/code/_globalvars/lists/client.dm +++ b/code/_globalvars/lists/client.dm @@ -46,3 +46,6 @@ GLOBAL_LIST_INIT(_kbMap, list( ///List of ckeys that have seen a blurb of a given key. GLOBAL_LIST_EMPTY(blurb_witnesses) + +/// dict of ckey -> last occupied mob +GLOBAL_LIST_EMPTY(ckey_to_occupied_mob) diff --git a/code/_globalvars/lists/mapping_globals.dm b/code/_globalvars/lists/mapping_globals.dm index d0122d06c895..7d7ba827e7b8 100644 --- a/code/_globalvars/lists/mapping_globals.dm +++ b/code/_globalvars/lists/mapping_globals.dm @@ -34,6 +34,7 @@ GLOBAL_LIST_EMPTY(zombie_landmarks) GLOBAL_LIST_EMPTY(newplayer_start) GLOBAL_LIST_EMPTY_TYPED(observer_starts, /obj/effect/landmark/observer_start) +GLOBAL_LIST_EMPTY_TYPED(spycam_starts, /obj/effect/landmark/spycam_start) GLOBAL_LIST_EMPTY(map_items) GLOBAL_LIST_EMPTY(xeno_tunnels) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index f9e831a7bd45..a37e6b1e4184 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -30,9 +30,9 @@ if ((A.flags_atom & NOINTERACT)) if (istype(A, /atom/movable/screen/click_catcher)) var/list/mods = params2list(params) - var/turf/TU = params2turf(mods["screen-loc"], get_turf(client.eye), client) + var/turf/TU = params2turf(mods[SCREEN_LOC], get_turf(client.eye), client) if (TU) - params += ";click_catcher=1" + params += CLICK_CATCHER_ADD_PARAM do_click(TU, location, params) return @@ -49,7 +49,7 @@ clicked_something[mod] = TRUE // Don't allow any other clicks while dragging something - if (mods["drag"]) + if(mods[DRAG]) return if(SEND_SIGNAL(client, COMSIG_CLIENT_PRE_CLICK, A, mods) & COMPONENT_INTERRUPT_CLICK) @@ -213,19 +213,19 @@ if(!client || !client.remote_control) return FALSE - if(mods["middle"]) + if(mods[MIDDLE_CLICK]) A.AIMiddleClick(src) return TRUE - if(mods["shift"]) + if(mods[SHIFT_CLICK]) A.AIShiftClick(src) return TRUE - if(mods["alt"]) + if(mods[ALT_CLICK]) A.AIAltClick(src) return TRUE - if(mods["ctrl"]) + if(mods[CTRL_CLICK]) A.AICtrlClick(src) return TRUE @@ -236,12 +236,12 @@ return TRUE /atom/proc/clicked(mob/user, list/mods) - if (mods["shift"] && !mods["middle"]) + if (mods[SHIFT_CLICK] && !mods[MIDDLE_CLICK]) if(can_examine(user)) examine(user) return TRUE - if (mods["alt"]) + if (mods[ALT_CLICK]) var/turf/T = get_turf(src) if(T && user.TurfAdjacent(T) && length(T.contents)) user.set_listed_turf(T) @@ -253,7 +253,7 @@ if (..()) return TRUE - if (mods["ctrl"]) + if (mods[CTRL_CLICK]) if (Adjacent(user) && user.next_move < world.time) user.start_pulling(src) return TRUE @@ -384,7 +384,7 @@ if(prefs.adaptive_zoom) INVOKE_ASYNC(src, PROC_REF(adaptive_zoom)) else if(prefs.auto_fit_viewport) - INVOKE_ASYNC(src, VERB_REF(fit_viewport)) + INVOKE_ASYNC(src, PROC_REF(fit_viewport)) /client/proc/get_adaptive_zoom_factor() if(!prefs.adaptive_zoom) diff --git a/code/_onclick/click_hold.dm b/code/_onclick/click_hold.dm index 4b2d60939ea8..ec0a69144017 100644 --- a/code/_onclick/click_hold.dm +++ b/code/_onclick/click_hold.dm @@ -4,7 +4,7 @@ */ // This just checks if A is the click catcher (i.e. the user clicked a black tile on their screen), then updates A and B to be what's "under" the black tile -#define CONVERT_CLICK_CATCHER(A,B,C) if(istype(A,/atom/movable/screen/click_catcher)) { var/list/mods = params2list(params); var/turf/TU = params2turf(mods["screen-loc"], get_turf(eye), src); A = TU; B = TU; C = TRUE } +#define CONVERT_CLICK_CATCHER(A,B,C) if(istype(A,/atom/movable/screen/click_catcher)) { var/list/mods = params2list(params); var/turf/TU = params2turf(mods[SCREEN_LOC], get_turf(eye), src); A = TU; B = TU; C = TRUE } /client /// Whether or not the player is holding their mouse click @@ -25,7 +25,7 @@ var/click_catcher_click = FALSE CONVERT_CLICK_CATCHER(A, T, click_catcher_click) if(click_catcher_click) - params += ";click_catcher=1" + params += CLICK_CATCHER_ADD_PARAM holding_click = TRUE mouse_trace_history = null @@ -35,7 +35,7 @@ return var/list/mods = params2list(params) - if(mods["left"]) + if(mods[LEFT_CLICK]) SEND_SIGNAL(src, COMSIG_CLIENT_LMB_DOWN, A, mods) lmb_last_mousedown_mods = mods @@ -48,7 +48,7 @@ //Some combat intent click-drags shouldn't be overridden. var/mob/target_mob = A - if(ismob(target_mob) && target_mob.faction == mob.faction && !mods["ctrl"] && !(iscarbonsizexeno(mob) && !mob.get_active_hand())) //Don't attack your allies or yourself, unless you're a xeno with an open hand. + if(ismob(target_mob) && target_mob.faction == mob.faction && !mods[CTRL_CLICK] && !(iscarbonsizexeno(mob) && !mob.get_active_hand())) //Don't attack your allies or yourself, unless you're a xeno with an open hand. return if(!isturf(T)) //If clickdragging something in your own inventory, it's probably a deliberate attempt to open something, tactical-reload, etc. Don't click it. @@ -63,14 +63,14 @@ var/click_catcher_click = FALSE CONVERT_CLICK_CATCHER(A, T, click_catcher_click) if(click_catcher_click) - params += ";click_catcher=1" + params += CLICK_CATCHER_ADD_PARAM holding_click = FALSE if(SEND_SIGNAL(mob, COMSIG_MOB_MOUSEUP, A, T, skin_ctl, params) & COMSIG_MOB_CLICK_CANCELED) return var/list/mods = params2list(params) - if(mods["left"]) + if(mods[LEFT_CLICK]) SEND_SIGNAL(src, COMSIG_CLIENT_LMB_UP, A, params) /client/MouseDrag(atom/src_obj, atom/over_obj, turf/src_loc, turf/over_loc, src_ctl, over_ctl, params) @@ -80,13 +80,13 @@ var/click_catcher_click = FALSE CONVERT_CLICK_CATCHER(over_obj, over_loc, click_catcher_click) if(click_catcher_click) - params += ";click_catcher=1" + params += CLICK_CATCHER_ADD_PARAM if(SEND_SIGNAL(mob, COMSIG_MOB_MOUSEDRAG, src_obj, over_obj, src_loc, over_loc, src_ctl, over_ctl, params) & COMSIG_MOB_CLICK_CANCELED) return var/list/mods = params2list(params) - if(mods["left"]) + if(mods[LEFT_CLICK]) SEND_SIGNAL(src, COMSIG_CLIENT_LMB_DRAG, src_obj, over_obj, params) var/atom/last_atom = LAZYACCESS(mouse_trace_history, length(mouse_trace_history)) @@ -98,6 +98,9 @@ /client/MouseDrop(datum/src_object, datum/over_object, src_location, over_location, src_control, over_control, params) . = ..() + if(HAS_TRAIT(usr, TRAIT_HAULED)) + if(!isweapon(src_object) && !isgun(src_object)) + return if(over_object) SEND_SIGNAL(over_object, COMSIG_ATOM_DROPPED_ON, src_object, src) diff --git a/code/_onclick/double_click.dm b/code/_onclick/double_click.dm index 5ba285801c7c..73e24514cdd9 100644 --- a/code/_onclick/double_click.dm +++ b/code/_onclick/double_click.dm @@ -1,25 +1,25 @@ // Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click) /mob/proc/DblClickOn(atom/A, params) var/list/modifiers = params2list(params) - if(modifiers["shift"] && modifiers["middle"]) + if(modifiers[SHIFT_CLICK] && modifiers[MIDDLE_CLICK]) ShiftMiddleDblClickOn(A) return - if(modifiers["shift"] && modifiers["ctrl"]) + if(modifiers[SHIFT_CLICK] && modifiers[CTRL_CLICK]) CtrlShiftDblClickOn(A) return - if(modifiers["ctrl"] && modifiers["middle"]) + if(modifiers[CTRL_CLICK] && modifiers[MIDDLE_CLICK]) CtrlMiddleDblClickOn(A) return - if(modifiers["middle"]) + if(modifiers[MIDDLE_CLICK]) MiddleDblClickOn(A) return - if(modifiers["shift"]) + if(modifiers[SHIFT_CLICK]) ShiftDblClickOn(A) return - if(modifiers["alt"]) + if(modifiers[ALT_CLICK]) AltDblClickOn(A) return - if(modifiers["ctrl"]) + if(modifiers[CTRL_CLICK]) CtrlDblClickOn(A) return diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index f14204b0561a..0e563c0dfbee 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -23,5 +23,7 @@ Called on the atom that you release mouse drag over. "dropping" is the atom being mouse dragged */ /atom/proc/MouseDrop_T(atom/dropping, mob/user) + if(HAS_TRAIT(usr, TRAIT_HAULED)) + return if (dropping.flags_atom & NOINTERACT) return diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index 26dc93bbff2b..43998e7651d5 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -194,6 +194,6 @@ /** * When the popup closes in any way (player or proc call) it calls this. */ -/client/verb/handle_popup_close(window_id as text) +CLIENT_VERB(handle_popup_close, window_id as text) set hidden = TRUE clear_map("[window_id]_map") diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index fb0cd867e64c..ce978584872b 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -155,8 +155,8 @@ if (..()) return TRUE - var/icon_x = text2num(mods["icon-x"]) - var/icon_y = text2num(mods["icon-y"]) + var/icon_x = text2num(mods[ICON_X]) + var/icon_y = text2num(mods[ICON_Y]) var/old_selecting = selecting //We're only going to update_icon() if there's been a change switch(icon_y) @@ -323,7 +323,7 @@ if(user.is_mob_incapacitated()) return TRUE - if (mods["ctrl"]) + if (mods[CTRL_CLICK]) carbon.toggle_throw_mode(THROW_MODE_HIGH) else carbon.toggle_throw_mode(THROW_MODE_NORMAL) @@ -403,8 +403,8 @@ return 1 /atom/movable/screen/act_intent/corner/clicked(mob/user, list/mods) - var/_x = text2num(mods["icon-x"]) - var/_y = text2num(mods["icon-y"]) + var/_x = text2num(mods[ICON_X]) + var/_y = text2num(mods[ICON_Y]) if(_x<=16 && _y<=16) user.a_intent_change(INTENT_HARM) @@ -463,11 +463,11 @@ if(!istype(earpiece) || !earpiece.has_hud || !has_access) to_chat(user, SPAN_WARNING("Unauthorized access detected.")) return - if(mods["shift"]) + if(mods[SHIFT_CLICK]) var/area/current_area = get_area(user) to_chat(user, SPAN_NOTICE("You are currently at: [current_area.name].")) return - else if(mods["alt"]) + else if(mods[ALT_CLICK]) earpiece.switch_tracker_target() return if(user.get_active_hand()) @@ -483,14 +483,14 @@ /atom/movable/screen/mark_locator/clicked(mob/living/carbon/xenomorph/user, mods) if(!istype(user)) return FALSE - if(mods["shift"] && user.tracked_marker) + if(mods[SHIFT_CLICK] && user.tracked_marker) if(user.observed_xeno == user.tracked_marker) user.overwatch(user.tracked_marker, TRUE) //passing in an obj/effect into a proc that expects mob/xenomorph B) else to_chat(user, SPAN_XENONOTICE("We psychically observe the [user.tracked_marker.mark_meaning.name] resin mark in [get_area_name(user.tracked_marker)].")) user.overwatch(user.tracked_marker) //this is so scuffed, sorry if this causes errors return - if(mods["alt"] && user.tracked_marker) + if(mods[ALT_CLICK] && user.tracked_marker) user.stop_tracking_resin_mark() return if(!user.hive) @@ -517,14 +517,14 @@ /atom/movable/screen/queen_locator/clicked(mob/living/carbon/xenomorph/user, mods) if(!istype(user)) return FALSE - if(mods["shift"]) + if(mods[SHIFT_CLICK]) var/area/current_area = get_area(user) to_chat(user, SPAN_NOTICE("We are currently at: [current_area.name].")) return if(!user.hive) to_chat(user, SPAN_WARNING("We don't belong to a hive!")) return FALSE - if(mods["alt"]) + if(mods[ALT_CLICK]) var/list/options = list() if(user.hive.living_xeno_queen) // Don't need weakrefs to this or the hive core, since there's only one possible target. diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d1208fb45bb9..1c180ba16b25 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,9 +1,9 @@ // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) + SHOULD_CALL_PARENT(TRUE) if(HAS_TRAIT(user, TRAIT_HAULED)) return - SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK_SELF, src) @@ -82,9 +82,9 @@ return FALSE ///////////////////////// - user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)])" - M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)])" - msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)]) in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) + user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)])" + M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)])" + msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)]) in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) ///////////////////////// diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index abdb6acfe56e..ec502fa61570 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -15,11 +15,11 @@ if(..()) return TRUE - if (mods["shift"] && mods["middle"]) + if (mods[SHIFT_CLICK] && mods[MIDDLE_CLICK]) point_to(target) return TRUE - if(mods["ctrl"]) + if(mods[CTRL_CLICK]) if(target == src) if(!can_reenter_corpse || !mind || !mind.current) return @@ -92,7 +92,7 @@ next_move = world.time + 8 // You are responsible for checking config.ghost_interaction when you override this function // Not all of them require checking, see below - if(!mods["shift"]) + if(!mods[SHIFT_CLICK]) target.attack_ghost(src) return FALSE @@ -116,21 +116,19 @@ user.forceMove(get_turf(target)) /obj/structure/ladder/attack_ghost(mob/user as mob) + var/obj/structure/ladder/ladder_dest if(up && down) - switch( alert("Go up or down the ladder?", "Ladder", "Up", "Down", "Cancel") ) - if("Up") - user.forceMove(get_turf(up)) - if("Down") - user.forceMove(get_turf(down)) - if("Cancel") - return - + ladder_dest = lowertext(show_radial_menu(user, src, direction_selection, require_near = FALSE)) + if(ladder_dest == "up") + user.forceMove(get_turf(up)) + if(ladder_dest == "down") + user.forceMove(get_turf(down)) else if(up) user.forceMove(get_turf(up)) - else if(down) user.forceMove(get_turf(down)) - + else + return FALSE //just in case // ------------------------------------------- // This was supposed to be used by adminghosts // I think it is a *terrible* idea diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 8176f9e5247c..4b0abccde3ad 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -4,11 +4,11 @@ */ /mob/living/carbon/click(atom/A, list/mods) - if (mods["shift"] && mods["middle"]) + if (mods[SHIFT_CLICK] && mods[MIDDLE_CLICK]) point_to(A) return TRUE - if (mods["middle"]) + if (mods[MIDDLE_CLICK]) if (isStructure(A) && get_dist(src, A) <= 1) var/obj/structure/S = A if(S.climbable) diff --git a/code/_onclick/ventcrawl.dm b/code/_onclick/ventcrawl.dm index 72fe31f35cdc..aa820ad97ddc 100644 --- a/code/_onclick/ventcrawl.dm +++ b/code/_onclick/ventcrawl.dm @@ -13,7 +13,7 @@ /mob/living/click(atom/A, list/mods) if(..()) return TRUE - if(mods["alt"]) + if(mods[ALT_CLICK]) if(can_ventcrawl() && istype(A, /obj/structure/pipes/vents)) handle_ventcrawl(A) return TRUE diff --git a/code/_onclick/xeno.dm b/code/_onclick/xeno.dm index f3de78d95a78..0dad61fe9cc3 100644 --- a/code/_onclick/xeno.dm +++ b/code/_onclick/xeno.dm @@ -8,7 +8,7 @@ var/mob/alt if(target == src) //Clicking self. - target = params2turf(click_parameters["screen-loc"], get_turf(src), client) + target = params2turf(click_parameters[SCREEN_LOC], get_turf(src), client) tile_attack = TRUE if(target.z != z) @@ -146,7 +146,7 @@ so that it doesn't double up on the delays) so that it applies the delay immedia if(activate_ability && selected_ability) if(istype(target, /atom/movable/screen)) // Click through the UI: Currently this won't attempt to sprite click any mob there, just the turf - var/turf/turf = params2turf(mods["screen-loc"], get_turf(client.eye), client) + var/turf/turf = params2turf(mods[SCREEN_LOC], get_turf(client.eye), client) if(turf) target = turf selected_ability.use_ability_wrapper(target, mods) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 741862b5d65d..389801b087dc 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -120,6 +120,11 @@ ///Used to determine how many extra larva you want per burst. Supports fractions. See /datum/hive_status/proc/increase_larva_after_burst() /datum/config_entry/number/extra_larva_per_burst + config_entry_value = 0 + integer = FALSE + +///Used to determine how many extra larva you want per burst if nested. Supports fractions. See /datum/hive_status/proc/increase_larva_after_burst() +/datum/config_entry/number/extra_larva_per_nested_burst config_entry_value = 1 integer = FALSE @@ -132,3 +137,9 @@ min_val = 0 config_entry_value = 140 integer = TRUE + +/datum/config_entry/number/nuclear_lock_marines_percentage + min_val = 0 + config_entry_value = 0 // Type 0 to disable lock + max_val = 100 + integer = TRUE diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index a41a619e602f..ccbcb2475cf1 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -156,6 +156,9 @@ Administrative related. /datum/config_entry/string/ooc_color_admin config_entry_value = "#ff8000" +/datum/config_entry/string/ooc_color_maint + config_entry_value = "#00ffff" + /datum/config_entry/string/ooc_color_default config_entry_value = "#b82e00" @@ -324,7 +327,7 @@ Master controller and performance related. sync_validate = TRUE var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag] if(!TL.sync_validate) - TL.ValidateAndSet(10 / config_entry_value) + TL.ValidateAndSet("[10 / config_entry_value]") sync_validate = FALSE /datum/config_entry/number/ticklag @@ -343,7 +346,7 @@ Master controller and performance related. sync_validate = TRUE var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps] if(!FPS.sync_validate) - FPS.ValidateAndSet(10 / config_entry_value) + FPS.ValidateAndSet("[10 / config_entry_value]") sync_validate = FALSE /datum/config_entry/number/tick_limit_mc_init //SSinitialization throttling @@ -680,3 +683,17 @@ This maintains a list of ip addresses that are able to bypass topic filtering. /datum/config_entry/string/repo_name /datum/config_entry/string/org + +/datum/config_entry/keyed_list/auth_urls + splitter = "|" + key_mode = KEY_MODE_TEXT_UNALTERED + value_mode = VALUE_MODE_TEXT + protection = CONFIG_ENTRY_HIDDEN|CONFIG_ENTRY_LOCKED + +/datum/config_entry/string/twofactor_admins_url + protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN + +/datum/config_entry/string/sentry_endpoint + +/datum/config_entry/string/sentry_dsn + protection = CONFIG_ENTRY_HIDDEN diff --git a/code/controllers/configuration/entries/resources.dm b/code/controllers/configuration/entries/resources.dm index c839ccc078d4..2ceb9e3afe7a 100644 --- a/code/controllers/configuration/entries/resources.dm +++ b/code/controllers/configuration/entries/resources.dm @@ -28,3 +28,7 @@ if (str_var && str_var[length(str_var)] != "/") str_var += "/" return ..(str_var) + +/datum/config_entry/string/storage_cdn_iframe + config_entry_value = "https://cmss13-devs.github.io/cmss13/assets/iframe.html" + protection = CONFIG_ENTRY_LOCKED diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index 06461ab18bc1..f4d25df23b71 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -72,6 +72,7 @@ Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency //Misc channels #define YAUT_FREQ 1205 +#define YAUT_OVR_FREQ 1206 #define DUT_FREQ 1210 #define VAI_FREQ 1215 #define RMC_FREQ 1216 @@ -113,6 +114,10 @@ Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency #define FAX_USCM_HC_FREQ 1297 #define FAX_USCM_PVST_FREQ 1298 +//Hyperdyne channels (1331-1399) + +#define HDC_FREQ 1331 + //General Radio #define MIN_FREQ 1460 // ------------------------------------------------------ #define PUB_FREQ 1461 @@ -156,6 +161,7 @@ Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency GLOBAL_LIST_INIT(radiochannels, list( RADIO_CHANNEL_YAUTJA = YAUT_FREQ, + RADIO_CHANNEL_YAUTJA_OVERSEER = YAUT_OVR_FREQ, RADIO_CHANNEL_VAI = VAI_FREQ, RADIO_CHANNEL_CMB = CMB_FREQ, RADIO_CHANNEL_DUTCH_DOZEN = DUT_FREQ, @@ -191,6 +197,7 @@ GLOBAL_LIST_INIT(radiochannels, list( RADIO_CHANNEL_COLONY = COLONY_FREQ, + RADIO_CHANNEL_HYPERDYNE = HDC_FREQ, RADIO_CHANNEL_WY = WY_FREQ, RADIO_CHANNEL_PMC_GEN = PMC_FREQ, @@ -224,7 +231,7 @@ GLOBAL_LIST_INIT(radiochannels, list( )) // Response Teams -#define ERT_FREQS list(VAI_FREQ, DUT_FREQ, YAUT_FREQ, CMB_FREQ, RMC_FREQ) +#define ERT_FREQS list(VAI_FREQ, DUT_FREQ, YAUT_FREQ, YAUT_OVR_FREQ, CMB_FREQ, RMC_FREQ) // UPP Frequencies #define UPP_FREQS list(UPP_FREQ, UPP_CMD_FREQ, UPP_ENGI_FREQ, UPP_MED_FREQ, UPP_CCT_FREQ, UPP_KDO_FREQ) @@ -322,6 +329,7 @@ SUBSYSTEM_DEF(radio) "[FAX_WY_FREQ]" = "airadio", "[FAX_USCM_HC_FREQ]" = "aiprivradio", "[FAX_USCM_PVST_FREQ]" = "aiprivradio", + "[HDC_FREQ]" = "hdcradio", ) /datum/controller/subsystem/radio/proc/add_object(obj/device as obj, new_frequency as num, filter = null as text|null) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index c400e4a41cf9..2ae24718824e 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -24,6 +24,8 @@ SUBSYSTEM_DEF(events) if(!E.typepath) continue //don't want this one! leave it for the garbage collector control += E //add it to the list of all events (controls) + if(isnull(GLOB.holidays)) + fill_holidays() reschedule() return SS_INIT_SUCCESS @@ -128,3 +130,41 @@ SUBSYSTEM_DEF(events) SSevents.can_fire = !SSevents.can_fire message_admins("[usr.client] has toggled the events subsystem [SSevents.can_fire == 1 ? "on" : "off"]") log_admin("[usr.client] has toggled the events subsystem [SSevents.can_fire == 1 ? "on" : "off"]") + +GLOBAL_LIST(holidays) + +/** + * Checks that the passed holiday is located in the global holidays list. + * + * Returns a holiday datum, or null if it's not that holiday. + */ +/proc/check_holidays(holiday_to_find) + if(isnull(GLOB.holidays) && !fill_holidays()) + return // Failed to generate holidays, for some reason + + return GLOB.holidays[holiday_to_find] + +/** + * Fills the holidays list if applicable, or leaves it an empty list. + */ +/proc/fill_holidays() + GLOB.holidays = list() + for(var/holiday_type in subtypesof(/datum/holiday)) + var/datum/holiday/holiday = new holiday_type() + var/delete_holiday = TRUE + for(var/timezone in holiday.timezones) + var/time_in_timezone = world.realtime + timezone HOURS + + var/YYYY = text2num(time2text(time_in_timezone, "YYYY")) // get the current year + var/MM = text2num(time2text(time_in_timezone, "MM")) // get the current month + var/DD = text2num(time2text(time_in_timezone, "DD")) // get the current day + var/DDD = time2text(time_in_timezone, "DDD") // get the current weekday + + if(holiday.shouldCelebrate(DD, MM, YYYY, DDD)) + GLOB.holidays[holiday.name] = holiday + delete_holiday = FALSE + break + if(delete_holiday) + qdel(holiday) + + return TRUE diff --git a/code/controllers/subsystem/inactivity.dm b/code/controllers/subsystem/inactivity.dm index e3635e630f85..c3183bd8f502 100644 --- a/code/controllers/subsystem/inactivity.dm +++ b/code/controllers/subsystem/inactivity.dm @@ -14,6 +14,8 @@ SUBSYSTEM_DEF(inactivity) debug_log("Removed nulls from GLOB.clients!") if(list_clear_nulls(GLOB.player_list)) debug_log("Removed nulls from GLOB.player_list!") + if(list_clear_nulls(GLOB.new_player_list)) + debug_log("Removed nulls from GLOB.new_player_list!") if(!CONFIG_GET(flag/kick_inactive)) return diff --git a/code/controllers/subsystem/init/law.dm b/code/controllers/subsystem/init/law.dm index c7ade815972c..bc10f65d97c5 100644 --- a/code/controllers/subsystem/init/law.dm +++ b/code/controllers/subsystem/init/law.dm @@ -9,6 +9,7 @@ SUBSYSTEM_DEF(law_init) var/list/major_law = list() var/list/capital_law = list() var/list/precautionary_law = list() + var/list/civilian_law = list() /datum/controller/subsystem/law_init/Initialize() for(var/law in subtypesof(/datum/law/optional_law)) @@ -26,6 +27,9 @@ SUBSYSTEM_DEF(law_init) for(var/law in subtypesof(/datum/law/precautionary_charge)) precautionary_law += new law - laws = optional_law + minor_law + major_law + capital_law + precautionary_law + for(var/law in subtypesof(/datum/law/civilian_law)) + civilian_law += new law + + laws = optional_law + minor_law + major_law + capital_law + precautionary_law + civilian_law return SS_INIT_SUCCESS diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 2968b110aaf5..e99b5ad917ee 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -195,7 +195,7 @@ SUBSYSTEM_DEF(mapping) // CM Snowflake for Mass Screenshot dimensions auto detection for(var/z in bounds[MAP_MINZ] to bounds[MAP_MAXZ]) var/datum/space_level/zlevel = z_list[start_z + z - 1] - zlevel.bounds = list(bounds[MAP_MINX], bounds[MAP_MINY], z, bounds[MAP_MAXX], bounds[MAP_MAXY], z) + zlevel.bounds = list(bounds[MAP_MINX] + x_offset - 1, bounds[MAP_MINY] + y_offset - 1, z, bounds[MAP_MAXX] + x_offset - 1, bounds[MAP_MAXY] + y_offset - 1, z) // =============== END CM Change ================= @@ -234,6 +234,10 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loading [ship_map.map_name]...") Loadship(FailedZs, ship_map.map_name, ship_map.map_path, ship_map.map_file, ship_map.traits, ZTRAITS_MAIN_SHIP, override_map_path = ship_base_path) + // loads the UPP ship if the game mode is faction clash (Generally run by the Prepare event under prep event verb) + if(trim(file2text("data/mode.txt")) == GAMEMODE_FACTION_CLASH_UPP_CM) + Loadship(FailedZs, "ssv_rostock", "templates/", list("ssv_rostock.dmm") , list(),ZTRAITS_MAIN_SHIP , override_map_path = "maps/") + if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen var/msg = "RED ALERT! The following map files failed to load: [FailedZs[1]]" if(length(FailedZs) > 1) @@ -263,11 +267,12 @@ SUBSYSTEM_DEF(mapping) next_map_configs[SHIP_MAP] = VM return TRUE -/datum/controller/subsystem/mapping/proc/preloadTemplates(path = "maps/templates/") //see master controller setup - var/list/filelist = flist(path) - for(var/map in filelist) - var/datum/map_template/T = new(path = "[path][map]", rename = "[map]") - map_templates[T.name] = T +/datum/controller/subsystem/mapping/proc/preloadTemplates(paths = list("maps/templates/", "maps/templates/lazy_templates/thunderdome/")) //see master controller setup + for(var/path in paths) + var/list/filelist = flist(path) + for(var/map in filelist) + var/datum/map_template/T = new(path = "[path][map]", rename = "[map]") + map_templates[T.name] = T preloadShuttleTemplates() preload_tent_templates() diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm index 88144925368a..17dc3de112dd 100644 --- a/code/controllers/subsystem/minimap.dm +++ b/code/controllers/subsystem/minimap.dm @@ -769,9 +769,10 @@ SUBSYSTEM_DEF(minimaps) if(faction == FACTION_NEUTRAL && isobserver(user)) faction = allowed_flags == MINIMAP_FLAG_XENO ? XENO_HIVE_NORMAL : FACTION_MARINE - if(is_xeno && xeno.hive.see_humans_on_tacmap && targeted_ztrait != ZTRAIT_MARINE_MAIN_SHIP) + if(is_xeno && xeno.hive.see_humans_on_tacmap) + if(targeted_ztrait != ZTRAIT_MARINE_MAIN_SHIP && !xeno.hive.need_round_end_check) + targeted_ztrait = ZTRAIT_MARINE_MAIN_SHIP allowed_flags |= MINIMAP_FLAG_USCM|MINIMAP_FLAG_WY|MINIMAP_FLAG_UPP|MINIMAP_FLAG_CLF - targeted_ztrait = ZTRAIT_MARINE_MAIN_SHIP map_holder = null new_current_map = get_unannounced_tacmap_data_png(faction) @@ -1048,7 +1049,7 @@ SUBSYSTEM_DEF(minimaps) return UI_CLOSE var/mob/living/carbon/xenomorph/xeno = user - if(!xeno.hive?.living_xeno_queen?.ovipositor) + if(!xeno.hive?.living_xeno_queen?.ovipositor && xeno.hive?.tacmap_requires_queen_ovi) return UI_CLOSE return UI_INTERACTIVE diff --git a/code/controllers/subsystem/processing/authentication.dm b/code/controllers/subsystem/processing/authentication.dm new file mode 100644 index 000000000000..6d35f4e4c306 --- /dev/null +++ b/code/controllers/subsystem/processing/authentication.dm @@ -0,0 +1,4 @@ +PROCESSING_SUBSYSTEM_DEF(authentication) + name = "Authentication Processing" + flags = SS_NO_INIT + wait = 5 SECONDS diff --git a/code/controllers/subsystem/sentry.dm b/code/controllers/subsystem/sentry.dm new file mode 100644 index 000000000000..13192914977a --- /dev/null +++ b/code/controllers/subsystem/sentry.dm @@ -0,0 +1,110 @@ +SUBSYSTEM_DEF(sentry) + name = "Sentry" + wait = 2 SECONDS + flags = SS_NO_INIT + runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + + var/list/datum/error_envelope/envelopes = list() + + var/static/list/characters = splittext("abcdef012345679", "") + var/list/hashed_context = list() + +/datum/controller/subsystem/sentry/fire(resumed) + var/static/list/headers = list( + "Content-Type" = "application/x-sentry-envelope", + "User-Agent" = "sentry.dm/1.0.0", + ) + + var/static/git_revision + if(!git_revision) + git_revision = GLOB.revdata.commit + + var/static/dsn + if(!dsn) + dsn = CONFIG_GET(string/sentry_dsn) + + for(var/datum/error_envelope/error as anything in envelopes) + var/event_id = get_uuid() + + var/header = "{\"event_id\":\"[event_id]\",\"dsn\":\"[dsn]\"}" + + var/list/stacktrace = list() + for(var/datum/static_callee/called as anything in error.stacktrace) + + var/list/parsed_args = list( + "src" = called._src, + "usr" = called._usr, + ) + var/index = 1 + for(var/arg in called._args) + parsed_args["argument #[index]"] = arg + index++ + + var/pre_context, context, post_context + + var/hash = "[called.file]:[called.line]" + if(hash in hashed_context) + pre_context = hashed_context[hash][1] + context = hashed_context[hash][2] + post_context = hashed_context[hash][3] + else + var/list/file_lines = splittext(rustg_file_read(called.file), "\n") + + pre_context = file_lines.Copy(clamp(called.line - 5, 1, length(file_lines)), called.line) + context = file_lines[called.line] + post_context = file_lines.Copy(called.line + 1, clamp(called.line + 6, 1, length(file_lines))) + + hashed_context[hash] = list(pre_context, context, post_context) + + var/procpath/proc_path = called.proc + + stacktrace += list(list( + "filename" = called.file, + "function" = proc_path.type, + "lineno" = called.line, + "vars" = parsed_args, + "pre_context" = pre_context, + "context_line" = context, + "post_context" = post_context, + "source_link" = "https://github.com/cmss13-devs/cmss13/blob/[git_revision]/[called.file]#L[called.line]" + )) + + var/list/event_parts = list( + "event_id" = event_id, + "platform" = "other", + "server_name" = CONFIG_GET(string/servername), + "release" = git_revision, + "exception" = list( + "type" = error.error, + "value" = "Runtime Error", + "stacktrace" = list("frames" = stacktrace), + ), + ) + + var/event = json_encode(event_parts) + + var/event_header = "{\"type\":\"event\",\"length\":[length(event)]}" + + var/assembled = "[header]\n[event_header]\n[event]\n" + + rustg_http_request_async(RUSTG_HTTP_METHOD_POST, CONFIG_GET(string/sentry_endpoint), assembled, headers, null) + + envelopes = list() + +/// Generates a 32 character hex UUID, as random as BYOND will be +/datum/controller/subsystem/sentry/proc/get_uuid() + var/uuid = "" + for(var/i in 1 to 32) + uuid += characters[rand(1, length(characters))] + return uuid + +/datum/error_envelope + var/error + + var/list/callee/stacktrace + +/datum/error_envelope/New(error, list/callee/stacktrace) + . = ..() + + src.error = error + src.stacktrace = stacktrace diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 1a2a98ef4344..1a1fc3d81836 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -412,15 +412,3 @@ SUBSYSTEM_DEF(statpanels) else client.stat_panel.send_message("remove_listedturf") client.obj_window.stop_turf_tracking() - -/client/verb/open_statbrowser_options(current_fontsize as num|null) - set name = "Open Statbrowser Options" - set hidden = TRUE - - if (!current_fontsize) - current_fontsize = 14 - - var/datum/statbrowser_options/options_panel = statbrowser_options - if(!options_panel) - options_panel = statbrowser_options = new(src, current_fontsize) - options_panel.tgui_interact() diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index 071da60d08bf..e3cc9b23b0a6 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -28,18 +28,37 @@ SUBSYSTEM_DEF(tgui) /datum/controller/subsystem/tgui/PreInit() basehtml = file2text('tgui/public/tgui.html') - // Inject inline polyfills - var/polyfill = file2text('tgui/public/tgui-polyfill.min.js') - polyfill = "" - basehtml = replacetextEx(basehtml, "", polyfill) + + // Inject inline helper functions + var/helpers = file2text('tgui/public/helpers.min.js') + helpers = "" + basehtml = replacetextEx(basehtml, "", helpers) + + // Inject inline ntos-error styles + var/ntos_error = file2text('tgui/public/ntos-error.min.css') + ntos_error = "" + basehtml = replacetextEx(basehtml, "", ntos_error) + basehtml = replacetext(basehtml, "tgui:stylesheet", MAP_STYLESHEET) /datum/controller/subsystem/tgui/OnConfigLoad() + var/storage_iframe = CONFIG_GET(string/storage_cdn_iframe) + + if(storage_iframe && storage_iframe != /datum/config_entry/string/storage_cdn_iframe::config_entry_value) + basehtml = replacetext(basehtml, "tgui:storagecdn", storage_iframe) + return + if(CONFIG_GET(string/asset_transport) == "webroot") var/datum/asset_transport/webroot/webroot = SSassets.transport var/datum/asset_cache_item/item = webroot.register_asset("iframe.html", file("tgui/public/iframe.html")) basehtml = replacetext(basehtml, "tgui:storagecdn", webroot.get_asset_url("iframe.html", item)) + return + + if(!storage_iframe) + return + + basehtml = replacetext(basehtml, "tgui:storagecdn", storage_iframe) /datum/controller/subsystem/tgui/Shutdown() close_all_uis() diff --git a/code/controllers/subsystem/thunderdome.dm b/code/controllers/subsystem/thunderdome.dm new file mode 100644 index 000000000000..aeb716c7c92b --- /dev/null +++ b/code/controllers/subsystem/thunderdome.dm @@ -0,0 +1,56 @@ +SUBSYSTEM_DEF(thunderdome) + name = "Thunderdome" + wait = 1 SECONDS + flags = SS_NO_INIT + + var/list/datum/thunderdome_clean/to_clean = list() + + var/list/immune_areas = list( + /area/tdome/tdomeobserve + ) + +/datum/controller/subsystem/thunderdome/fire(resumed) + var/static/list/mob_typecache = typecacheof(/mob) + + for(var/datum/thunderdome_clean/clean_packet as anything in to_clean) + + for(var/turf/turf as anything in clean_packet.turfs_to_clean) + if(clean_packet.no_mobs || (turf.loc.type in immune_areas)) + turf.empty(turf_type = null, ignore_typecache = mob_typecache) + else + turf.empty(turf_type = null) + + clean_packet.turfs_to_clean -= turf + + if(!length(clean_packet.turfs_to_clean)) + var/datum/map_template/thunderdome_template = SSmapping.map_templates[clean_packet.thunderdome.get_map_name()] + thunderdome_template.load(clean_packet.thunderdome.get_spawn_turf()) + + to_clean -= clean_packet + qdel(clean_packet) + + if(MC_TICK_CHECK) + return + +/// Schedule a thunderdome for cleaning. Will replace the original thunderdome map after cleaning it. +/datum/controller/subsystem/thunderdome/proc/schedule_cleaning(datum/personal_thunderdome/thunderdome, no_mobs) + to_clean += new /datum/thunderdome_clean( + thunderdome.get_all_turfs(), + thunderdome, + no_mobs + ) + +/datum/thunderdome_clean + /// The list of turfs that we're cleaning up. Removed over time. + var/list/turf/turfs_to_clean + + /// The thunderdome that we're going to place back down after cleaning. + var/datum/personal_thunderdome/thunderdome + + /// If all mobs should be excluded by the cleaning or not. + var/no_mobs = TRUE + +/datum/thunderdome_clean/New(turfs_to_clean, thunderdome, no_mobs) + src.turfs_to_clean = turfs_to_clean + src.thunderdome = thunderdome + src.no_mobs = no_mobs diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 9b426a0a84ce..7f547ada4b25 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -371,7 +371,7 @@ SUBSYSTEM_DEF(vote) V.set_name("Vote: [question]") C.player_details.player_actions += V if(send_clients_vote) - C.mob.vote() + C.vote() RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_LOGGED_IN, PROC_REF(handle_client_joining)) SStgui.update_uis(src) @@ -385,15 +385,15 @@ SUBSYSTEM_DEF(vote) // Do not remove more votes than were made for the map return -(min(current_votes, total_vote_adjustment)) -/mob/verb/vote() +CLIENT_VERB(vote) set category = "OOC" set name = "Vote" - SSvote.tgui_interact(src) + SSvote.tgui_interact(mob) /datum/controller/subsystem/vote/Topic(href, href_list) . = ..() - usr.vote() + usr.client?.vote() /datum/controller/subsystem/vote/proc/remove_action_buttons() SEND_GLOBAL_SIGNAL(COMSIG_GLOB_REMOVE_VOTE_BUTTON) @@ -415,7 +415,7 @@ SUBSYSTEM_DEF(vote) /datum/action/innate/vote/action_activate() . = ..() - owner.vote() + owner.client?.vote() /datum/action/innate/vote/proc/remove_from_client() if(!owner) diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 6ae0f36e8927..e46ed04ced0c 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -1,9 +1,9 @@ GLOBAL_LIST_EMPTY(weather_notify_objects) SUBSYSTEM_DEF(weather) - name = "Weather" - wait = 5 SECONDS - priority = SS_PRIORITY_LIGHTING + name = "Weather" + wait = 5 SECONDS + priority = SS_PRIORITY_LIGHTING // Tracking vars for controller state var/is_weather_event = FALSE // Is there a weather event going on right now? @@ -34,6 +34,9 @@ SUBSYSTEM_DEF(weather) /// List of master areas to use for applying effects var/list/area/weather_areas = list() + /// List of all cleanables that are outside that will be cleaned up by active weather + var/list/obj/effect/decal/cleanable/cleanable_list = list() + /datum/controller/subsystem/weather/Initialize(start_timeofday) // Set up our map delegate datum for supported maps // The ONLY place where things should depend on map_tag @@ -42,6 +45,16 @@ SUBSYSTEM_DEF(weather) var/weathertype = SSmapping.configs[GROUND_MAP].weather_holder map_holder = new weathertype setup_weather_areas() + + var/correct_list = list() + for(var/obj/effect/decal/cleanable/cleanable as anything in cleanable_list) + if(!(cleanable.cleanable_turf.loc in weather_areas)) + continue + + correct_list += cleanable + + cleanable_list = correct_list + return SS_INIT_SUCCESS /datum/controller/subsystem/weather/proc/setup_weather_areas() @@ -64,6 +77,16 @@ SUBSYSTEM_DEF(weather) map_holder = new weather_holder setup_weather_areas() +/// Checks that a cleanable should be cleaned up by weather. If so, it is added to the list to be cleaned +/datum/controller/subsystem/weather/proc/add_cleanable(obj/effect/decal/cleanable/cleanable) + if(!SSmapping.configs[GROUND_MAP].weather_holder) + return + + if(map_holder && !(get_area(cleanable) in weather_areas)) + return + + cleanable_list += cleanable + /datum/controller/subsystem/weather/stat_entry(msg) var/time_left = 0 if(weather_event_instance?.length) @@ -90,6 +113,15 @@ SUBSYSTEM_DEF(weather) // If there's a weather event, return if (is_weather_event) + if(!weather_event_instance.cleaning || !SSobjectives.first_drop_complete) + return + + for(var/obj/effect/decal/cleanable/cleanable as anything in cleanable_list) + if(!prob(5)) + continue + + cleanable.fade_and_disappear() + return // Check if we have had enough time between events diff --git a/code/controllers/subsystem/who.dm b/code/controllers/subsystem/who.dm index 5f5510dc6489..0159e49e0ee4 100644 --- a/code/controllers/subsystem/who.dm +++ b/code/controllers/subsystem/who.dm @@ -56,7 +56,7 @@ SUBSYSTEM_DEF(who) // Running thru all clients and doing some counts for(var/client/client as anything in sortTim(GLOB.clients, GLOBAL_PROC_REF(cmp_ckey_asc))) var/list/client_payload = list() - client_payload["text"] = client.key + client_payload["text"] = client.username() client_payload["ckey_color"] = "white" if(CLIENT_IS_STEALTHED(client)) player_stealthed_additional["total_players"] += list(list(client.key = list(client_payload))) @@ -282,14 +282,14 @@ SUBSYSTEM_DEF(who) // VERBS -/mob/verb/who() +CLIENT_VERB(who) set category = "OOC" set name = "Who" - SSwho.who.tgui_interact(src) + SSwho.who.tgui_interact(mob) -/mob/verb/staffwho() +CLIENT_VERB(staffwho) set category = "Admin" set name = "StaffWho" - SSwho.staff_who.tgui_interact(src) + SSwho.staff_who.tgui_interact(mob) diff --git a/code/datums/ASRS.dm b/code/datums/ASRS.dm index 38778822c93b..37eec75613da 100644 --- a/code/datums/ASRS.dm +++ b/code/datums/ASRS.dm @@ -70,14 +70,6 @@ reference_package = /datum/supply_packs/ammo_shell_box_flechette cost = ASRS_VERY_LOW_WEIGHT -/datum/supply_packs_asrs/ammo_shell_box_breaching - reference_package = /datum/supply_packs/ammo_shell_box_breaching - cost = ASRS_VERY_LOW_WEIGHT - -/datum/supply_packs_asrs/ammo_xm51 - reference_package = /datum/supply_packs/ammo_xm51 - cost = ASRS_VERY_LOW_WEIGHT - /datum/supply_packs_asrs/ammo_smartgun reference_package = /datum/supply_packs/ammo_smartgun diff --git a/code/datums/agents/tools/tracker.dm b/code/datums/agents/tools/tracker.dm index 2f3063afb78c..0b21b8f3eb64 100644 --- a/code/datums/agents/tools/tracker.dm +++ b/code/datums/agents/tools/tracker.dm @@ -39,7 +39,7 @@ if(!ishuman(user) || !skillcheckexplicit(user, SKILL_ANTAG, SKILL_ANTAG_AGENT)) return ..() - if(mods["alt"]) + if(mods[ALT_CLICK]) if(!CAN_PICKUP(user, src)) return ..() select_object(user) diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm index 28185a4ab47d..0c0eac53e50d 100644 --- a/code/datums/ammo/ammo.dm +++ b/code/datums/ammo/ammo.dm @@ -136,7 +136,7 @@ /datum/ammo/proc/on_pointblank(mob/living/L, obj/projectile/P, mob/living/user, obj/item/weapon/gun/fired_from) return -/datum/ammo/proc/on_hit_obj(obj/O, obj/projectile/P) //Special effects when hitting objects. +/datum/ammo/proc/on_hit_obj(obj/target_object, obj/projectile/proj_hit) //Special effects when hitting objects. SHOULD_NOT_SLEEP(TRUE) return diff --git a/code/datums/ammo/bullet/bullet.dm b/code/datums/ammo/bullet/bullet.dm index 9adc4ba2ae50..d3ddb2cd8f35 100644 --- a/code/datums/ammo/bullet/bullet.dm +++ b/code/datums/ammo/bullet/bullet.dm @@ -72,8 +72,7 @@ user.count_niche_stat(STATISTICS_NICHE_EXECUTION, 1, firing_projectile.weapon_cause_data?.cause_name) var/area/execution_area = get_area(execution_target) - - msg_admin_attack(FONT_SIZE_HUGE("[key_name(usr)] has battlefield executed [key_name(execution_target)] in [get_area(usr)] ([usr.loc.x],[usr.loc.y],[usr.loc.z])."), usr.loc.x, usr.loc.y, usr.loc.z) + msg_admin_ff("[key_name(user)] [ADMIN_JMP_USER(user)] [ADMIN_PM(user)] has battlefield executed [key_name(execution_target)] [ADMIN_JMP(execution_target)] [ADMIN_PM(execution_target)] at [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z]) using [fired_from].") log_attack("[key_name(usr)] battlefield executed [key_name(execution_target)] at [execution_area.name].") if(flags_ammo_behavior & AMMO_EXPLOSIVE) diff --git a/code/datums/ammo/bullet/pistol.dm b/code/datums/ammo/bullet/pistol.dm index b50899558d7a..99eee56c9f2e 100644 --- a/code/datums/ammo/bullet/pistol.dm +++ b/code/datums/ammo/bullet/pistol.dm @@ -96,10 +96,16 @@ shrapnel_chance = 0 // Reskinned rubber bullet used for the ES-4 CL pistol. -/datum/ammo/bullet/pistol/rubber/stun +/datum/ammo/bullet/pistol/rubber/es4 name = "stun pistol bullet" + icon_state = "cm_laser" sound_override = null - + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + sound_hit = "energy_hit" + sound_miss = "energy_miss" + sound_bounce = "energy_bounce" + hit_effect_color = "#00aeff" + stamina_damage = 30 accuracy = HIT_ACCURACY_TIER_4 // Used by M1911, Deagle and KT-42 @@ -239,6 +245,13 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) )) +/datum/ammo/bullet/pistol/squash/rubber + name = "rubber squash-head pistol bullet" + damage_type = BURN + shrapnel_chance = 0 + sound_override = 'sound/weapons/gun_c99.ogg' + damage = 2 + stamina_damage = 40 /datum/ammo/bullet/pistol/mankey name = "live monkey" @@ -272,3 +285,5 @@ penetration = 20 shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 +/datum/ammo/bullet/pistol/l54_custom + penetration= ARMOR_PENETRATION_TIER_3 diff --git a/code/datums/ammo/bullet/revolver.dm b/code/datums/ammo/bullet/revolver.dm index 8e8d5ff9e4e8..4f04d5546b64 100644 --- a/code/datums/ammo/bullet/revolver.dm +++ b/code/datums/ammo/bullet/revolver.dm @@ -136,6 +136,10 @@ damage_var_high = PROJECTILE_VARIANCE_TIER_6 penetration = ARMOR_PENETRATION_TIER_4 +/datum/ammo/bullet/revolver/mateba/New() + ..() + RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) + /datum/ammo/bullet/revolver/mateba/highimpact name = ".454 heavy high-impact revolver bullet" debilitate = list(0,2,0,0,0,1,0,0) @@ -147,10 +151,6 @@ penetration = ARMOR_PENETRATION_TIER_10 damage = 45 -/datum/ammo/bullet/revolver/mateba/highimpact/New() - ..() - RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) - /datum/ammo/bullet/revolver/mateba/highimpact/on_hit_mob(mob/M, obj/projectile/P) knockback(M, P, 4) diff --git a/code/datums/ammo/bullet/rifle.dm b/code/datums/ammo/bullet/rifle.dm index cbb4baeceda6..80fee9d6c4a1 100644 --- a/code/datums/ammo/bullet/rifle.dm +++ b/code/datums/ammo/bullet/rifle.dm @@ -227,7 +227,7 @@ /datum/ammo/bullet/rifle/l23 name = "8.88mm rifle bullet" - damage = 55 + damage = 50 penetration = ARMOR_PENETRATION_TIER_2 /datum/ammo/bullet/rifle/l23/ap diff --git a/code/datums/ammo/bullet/shotgun.dm b/code/datums/ammo/bullet/shotgun.dm index 245051eb75b9..b06d42ce42b9 100644 --- a/code/datums/ammo/bullet/shotgun.dm +++ b/code/datums/ammo/bullet/shotgun.dm @@ -42,6 +42,18 @@ to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) +/datum/ammo/bullet/shotgun/slug/es7 + name = "electrostatic solid slug" + icon_state = "bullet_iff" + handful_state = "es7_slug" + sound_miss = "energy_miss" + sound_bounce = "energy_bounce" + hit_effect_color = "#00aeff" + sound_override = 'sound/weapons/gun_es7lethal.ogg' + damage = 60 + penetration = ARMOR_PENETRATION_TIER_8 + accuracy = HIT_ACCURACY_TIER_5 + /datum/ammo/bullet/shotgun/beanbag name = "beanbag slug" headshot_state = HEADSHOT_OVERLAY_LIGHT //It's not meant to kill people... but if you put it in your mouth, it will. @@ -65,6 +77,34 @@ var/mob/living/carbon/human/H = M shake_camera(H, 2, 1) +/datum/ammo/bullet/shotgun/beanbag/es7 + name = "electrostatic shock slug" + headshot_state = HEADSHOT_OVERLAY_LIGHT //Electric version of the bean bag. + handful_state = "shock_slug" + icon_state = "cm_laser" + sound_override = 'sound/weapons/gun_es7.ogg' + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + sound_hit = "energy_hit" + sound_miss = "energy_miss" + sound_bounce = "energy_bounce" + max_range = 12 + shrapnel_chance = 0 + damage = 0 + stamina_damage = 50 + hit_effect_color = "#00aeff" + accuracy = HIT_ACCURACY_TIER_3 + shell_speed = AMMO_SPEED_TIER_4 + handful_state = "shock_slug" + +/datum/ammo/bullet/shotgun/beanbag/es7/on_hit_mob(mob/mobs, obj/projectile/P) + if(!isyautja(mobs) && !isxeno(mobs)) + mobs.emote("pain") + mobs.sway_jitter(2,1) + + if(ishuman(mobs)) + var/mob/living/carbon/human/humanus = mobs + humanus.disable_special_items() // Disables scout cloak + humanus.make_jittery(40) /datum/ammo/bullet/shotgun/incendiary name = "incendiary slug" diff --git a/code/datums/ammo/bullet/smg.dm b/code/datums/ammo/bullet/smg.dm index e4618acff22d..8bd163e66dd1 100644 --- a/code/datums/ammo/bullet/smg.dm +++ b/code/datums/ammo/bullet/smg.dm @@ -159,7 +159,7 @@ /datum/ammo/bullet/smg/p90/twe_ap name = "armor-piercing submachinegun bullet" - damage = 26 + damage = 20 accurate_range = 5 effective_range_max = 8 penetration = ARMOR_PENETRATION_TIER_4 diff --git a/code/datums/ammo/bullet/sniper.dm b/code/datums/ammo/bullet/sniper.dm index eceea9f36fd3..681f3271eafa 100644 --- a/code/datums/ammo/bullet/sniper.dm +++ b/code/datums/ammo/bullet/sniper.dm @@ -153,14 +153,10 @@ return stopping_power -/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/target_mob,obj/projectile/aimed_projectile) - +/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/target_mob, obj/projectile/aimed_projectile) var/mob/living/living_target = target_mob - var/stopping_power = stopping_power_knockback(living_target, aimed_projectile) - if((aimed_projectile.projectile_flags & PROJECTILE_BULLSEYE) && target_mob == aimed_projectile.original) - var/amr_counter = 0 var/datum/weakref/old_target = null // This is used to let xenos know when they're no longer targeted. @@ -180,7 +176,7 @@ old_target = amr.focused_fire_target if(target_mob == (amr.focused_fire_target?.resolve())) - if(amr.focused_fire_counter < 3) // Can stack up to twice. + if(amr.focused_fire_counter < 2) // Can stack up to twice (0, 1). amr.focused_fire_counter += 1 else amr.focused_fire_counter = 0 @@ -195,6 +191,11 @@ amr_counter = min(amr.focused_fire_counter + 1, 3) amr.focused_fire_target = WEAKREF(target_mob) + var/stopping_power = 0 + if(amr_counter > 1) + // Only if this is the 2nd or 3rd hit do we apply daze or slow or knockdown + stopping_power = stopping_power_knockback(living_target, aimed_projectile) + var/size_damage_mod = 0.8 // 1.8x vs Non-Xenos (225) var/size_current_health_damage = 0 // % Current Health calculation, only used for Xeno calculations at the moment. var/focused_fire_active = 0 // Whether to try and use focused fire calculations or not, for that kind of target. @@ -203,7 +204,9 @@ if(slow_duration <= 2) // Must be over 60 base damage. slow_duration = 0 - if(isxeno(target_mob)) + if(!isxeno(target_mob)) + living_target.apply_armoured_damage((damage*size_damage_mod), ARMOR_BULLET, BRUTE, null, penetration) + else var/mob/living/carbon/xenomorph/target = target_mob size_damage_mod -= 0.2 // Down to 1.6x damage, 200. size_current_health_damage = 0.1 // 1.6x Damage + 10% current health (200 + 10%, 223 vs Runners) @@ -231,13 +234,11 @@ living_target.apply_armoured_damage((final_xeno_damage), ARMOR_BULLET, BRUTE, null, penetration) - else - living_target.apply_armoured_damage((damage*size_damage_mod), ARMOR_BULLET, BRUTE, null, penetration) - if(slow_duration && (living_target.mob_size != MOB_SIZE_XENO_SMALL) && !(HAS_TRAIT(living_target, TRAIT_CHARGING))) // Runners and Charging Crushers are not slowed. living_target.Slow((slow_duration / 2)) if(slow_duration >= 2) living_target.Superslow((slow_duration / 4)) + if(stopping_power > 3) living_target.Daze(0.1) // Visual cue that you got hit by something HARD. diff --git a/code/datums/ammo/energy.dm b/code/datums/ammo/energy.dm index 6eb865034cbe..fc72f69598ff 100644 --- a/code/datums/ammo/energy.dm +++ b/code/datums/ammo/energy.dm @@ -110,43 +110,81 @@ name = "root caster bolt" icon_state = "ion" -/datum/ammo/energy/yautja/caster/stun - name = "low power stun bolt" - debilitate = list(2,2,0,0,0,1,0,0) +/datum/ammo/energy/yautja/caster/bolt/single_stun + name = "stun bolt" + var/stun_time = 3 damage = 0 flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST -/datum/ammo/energy/yautja/caster/bolt - name = "plasma bolt" - icon_state = "pulse1" - flags_ammo_behavior = AMMO_IGNORE_RESIST - shell_speed = AMMO_SPEED_TIER_6 - damage = 35 +/datum/ammo/energy/yautja/caster/bolt/single_stun/on_hit_mob(mob/all_targets, obj/projectile/stun_bolt) + var/mob/living/carbon/any_target = all_targets -/datum/ammo/energy/yautja/caster/bolt/stun - name = "high power stun bolt" - var/stun_time = 2 + if(isyautja(any_target) || ispredalien(any_target)) + return + if(istype(any_target)) + to_chat(any_target, SPAN_DANGER("An electric shock ripples through your body, freezing you in place!")) + log_attack("[key_name(any_target)] was stunned by a high power stun bolt from [key_name(stun_bolt.firer)] at [get_area(stun_bolt)]") + + if(ishuman(any_target)) + stun_time++ + any_target.apply_effect(stun_time, WEAKEN) + any_target.apply_effect(stun_time, STUN) + ..() + +/datum/ammo/energy/yautja/caster/sphere/aoe_stun + name = "plasma immobilizer" damage = 0 flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + accurate_range = 20 + max_range = 20 -/datum/ammo/energy/yautja/caster/bolt/stun/on_hit_mob(mob/M, obj/projectile/P) - var/mob/living/carbon/C = M - var/stun_time = src.stun_time - if(istype(C)) - if(isyautja(C) || ispredalien(C)) - return - to_chat(C, SPAN_DANGER("An electric shock ripples through your body, freezing you in place!")) - log_attack("[key_name(C)] was stunned by a high power stun bolt from [key_name(P.firer)] at [get_area(P)]") + var/stun_range = 7 // Big + var/stun_time = 6 + +/datum/ammo/energy/yautja/caster/sphere/aoe_stun/on_hit_mob(mob/all_targets, obj/projectile/stun_projectile) + do_area_stun(stun_projectile) + +/datum/ammo/energy/yautja/caster/sphere/aoe_stun/on_hit_turf(turf/any_turf, obj/projectile/stun_projectile) + do_area_stun(stun_projectile) + +/datum/ammo/energy/yautja/caster/sphere/aoe_stun/on_hit_obj(obj/any_object, obj/projectile/stun_projectile) + do_area_stun(stun_projectile) + +/datum/ammo/energy/yautja/caster/sphere/aoe_stun/do_at_max_range(obj/projectile/stun_projectile) + do_area_stun(stun_projectile) + +/datum/ammo/energy/yautja/caster/sphere/aoe_stun/proc/do_area_stun(obj/projectile/stun_projectile) + playsound(stun_projectile, 'sound/weapons/wave.ogg', 75, 1, 25) + + for(var/mob/living/carbon/any_target in orange(stun_range, stun_projectile)) + log_attack("[key_name(any_target)] was stunned by a plasma immobilizer from [key_name(stun_projectile.firer)] at [get_area(stun_projectile)]") + var/stun_time = src.stun_time + + if(isyautja(any_target)) + stun_time -= 2 + + if(ispredalien(any_target)) + continue + to_chat(any_target, SPAN_DANGER("A powerful electric shock ripples through your body, freezing you in place!")) + any_target.apply_effect(stun_time, STUN) + any_target.apply_effect(stun_time, WEAKEN) - if(ishuman(C)) - stun_time++ - C.apply_effect(stun_time, WEAKEN) - C.apply_effect(stun_time, STUN) - ..() -/datum/ammo/energy/yautja/caster/sphere +// --- LETHAL AMMO --- \\ + +/datum/ammo/energy/yautja/caster/bolt/single_lethal + name = "plasma bolt" + icon_state = "pulse1" + flags_ammo_behavior = AMMO_IGNORE_RESIST + shell_speed = AMMO_SPEED_TIER_6 + damage = 75 // This will really only be used to kill people, so it should be decent at doing so. + +/datum/ammo/energy/yautja/caster/bolt/single_lethal/on_hit_mob(mob/all_targets, obj/projectile/lethal_projectile) + cell_explosion(lethal_projectile, 50, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, lethal_projectile.weapon_cause_data) + +/datum/ammo/energy/yautja/caster/aoe_lethal name = "plasma eradicator" icon_state = "bluespace" flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_HITS_TARGET_TURF @@ -160,61 +198,24 @@ var/vehicle_slowdown_time = 5 SECONDS -/datum/ammo/energy/yautja/caster/sphere/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) +/datum/ammo/energy/yautja/caster/aoe_lethal/on_hit_mob(mob/all_targets, obj/projectile/lethal_projectile) + cell_explosion(lethal_projectile, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, lethal_projectile.weapon_cause_data) -/datum/ammo/energy/yautja/caster/sphere/on_hit_turf(turf/T, obj/projectile/P) - cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) +/datum/ammo/energy/yautja/caster/aoe_lethal/on_hit_turf(mob/all_targets, obj/projectile/lethal_projectile) + cell_explosion(lethal_projectile, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, lethal_projectile.weapon_cause_data) -/datum/ammo/energy/yautja/caster/sphere/on_hit_obj(obj/O, obj/projectile/P) - if(istype(O, /obj/vehicle/multitile)) - var/obj/vehicle/multitile/multitile_vehicle = O +/datum/ammo/energy/yautja/caster/aoe_lethal/on_hit_obj(obj/any_object, obj/projectile/lethal_projectile) + if(istype(any_object, /obj/vehicle/multitile)) + var/obj/vehicle/multitile/multitile_vehicle = any_object multitile_vehicle.next_move = world.time + vehicle_slowdown_time playsound(multitile_vehicle, 'sound/effects/meteorimpact.ogg', 35) - multitile_vehicle.at_munition_interior_explosion_effect(cause_data = create_cause_data("Plasma Eradicator", P.firer)) + multitile_vehicle.at_munition_interior_explosion_effect(cause_data = create_cause_data("Plasma Eradicator", lethal_projectile.firer)) multitile_vehicle.interior_crash_effect() - multitile_vehicle.ex_act(150, P.dir, P.weapon_cause_data, 100) - cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/energy/yautja/caster/sphere/do_at_max_range(obj/projectile/P) - cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - - -/datum/ammo/energy/yautja/caster/sphere/stun - name = "plasma immobilizer" - damage = 0 - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST - accurate_range = 20 - max_range = 20 - - var/stun_range = 4 // Big - var/stun_time = 6 - -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_mob(mob/M, obj/projectile/P) - do_area_stun(P) + multitile_vehicle.ex_act(150, lethal_projectile.dir, lethal_projectile.weapon_cause_data, 100) + cell_explosion(get_turf(lethal_projectile), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, lethal_projectile.weapon_cause_data) -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_turf(turf/T,obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_obj(obj/O,obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/do_at_max_range(obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/proc/do_area_stun(obj/projectile/P) - playsound(P, 'sound/weapons/wave.ogg', 75, 1, 25) - FOR_DVIEW(var/mob/living/carbon/M, src.stun_range, get_turf(P), HIDE_INVISIBLE_OBSERVER) - var/stun_time = src.stun_time - log_attack("[key_name(M)] was stunned by a plasma immobilizer from [key_name(P.firer)] at [get_area(P)]") - if (isyautja(M)) - stun_time -= 2 - if(ispredalien(M)) - continue - to_chat(M, SPAN_DANGER("A powerful electric shock ripples through your body, freezing you in place!")) - M.apply_effect(stun_time, STUN) - M.apply_effect(stun_time, WEAKEN) - FOR_DVIEW_END +/datum/ammo/energy/yautja/caster/aoe_lethal/do_at_max_range(obj/projectile/lethal_projectile) + cell_explosion(get_turf(lethal_projectile), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, lethal_projectile.weapon_cause_data) /datum/ammo/energy/yautja/rifle/bolt name = "plasma rifle bolt" diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm index 6bd06701e900..bea9d957cf2a 100644 --- a/code/datums/ammo/misc.dm +++ b/code/datums/ammo/misc.dm @@ -175,6 +175,90 @@ var/obj/item/weapon/gun/flare/flare_gun_fired_from = fired_projectile.shot_from flare_gun_fired_from.last_signal_flare_name = signal_flare.name +/datum/ammo/arrow + name = "arrow" + ping = null //no bounce off. + damage_type = BRUTE + icon_state = "arrow" + + damage = 110 + penetration = 20 + accuracy = HIT_ACCURACY_TIER_3 + max_range = 14 + shell_speed = AMMO_SPEED_TIER_3 + flags_ammo_behavior = AMMO_SPECIAL_EMBED + shrapnel_chance = SHRAPNEL_CHANCE_TIER_10 + shrapnel_type = /obj/item/arrow + handful_type = /obj/item/arrow + sound_hit = 'sound/weapons/pierce.ogg' + var/activated = FALSE + +/datum/ammo/arrow/on_embed(mob/embedded_mob, obj/limb/target_organ, silent = FALSE) + if(!ishumansynth_strict(embedded_mob) || !istype(target_organ)) + return + target_organ.embed(new shrapnel_type) + +/datum/ammo/arrow/proc/drop_arrow(turf/T, obj/projectile/fired_projectile) + var/obj/item/arrow/arrow = new handful_type(T) + var/matrix/rotation = matrix() + rotation.Turn(fired_projectile.angle - 90) + arrow.apply_transform(rotation) + +/datum/ammo/arrow/on_hit_mob(mob/mob,obj/projectile/projectile) + mob.apply_effect(1, STUN) + mob.apply_effect(3, DAZE) + if(!ishumansynth_strict(mob)) + drop_arrow(get_turf(mob), projectile) + pushback(mob, projectile, 7) + +/datum/ammo/arrow/on_hit_obj(obj/object,obj/projectile/projectile) + drop_arrow(get_turf(projectile), projectile) + +/datum/ammo/arrow/on_hit_turf(turf/turf, obj/projectile/projectile) + if(turf.density && isturf(projectile.loc)) + drop_arrow(projectile.loc, projectile) + else + drop_arrow(turf, projectile) + +/datum/ammo/arrow/do_at_max_range(obj/projectile/projectile, mob/firer) + drop_arrow(get_turf(projectile), projectile) + +/datum/ammo/arrow/expl + activated = TRUE + handful_type = /obj/item/arrow/expl + damage_type = BURN + flags_ammo_behavior = AMMO_HITS_TARGET_TURF + shrapnel_chance = 0 + var/datum/effect_system/smoke_spread/smoke + +/datum/ammo/arrow/expl/New() + . = ..() + smoke = new() + +/datum/ammo/arrow/expl/on_hit_mob(mob/mob,obj/projectile/projectile) + cell_explosion(get_turf(mob), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, projectile.weapon_cause_data) + smoke.set_up(1, get_turf(mob)) + smoke.start() + +/datum/ammo/arrow/expl/on_hit_obj(obj/object,obj/projectile/projectile) + cell_explosion(get_turf(projectile), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, projectile.weapon_cause_data) + smoke.set_up(1, get_turf(projectile)) + smoke.start() +/datum/ammo/arrow/expl/on_hit_turf(turf/turf, obj/projectile/projectile) + if(turf.density && isturf(projectile.loc)) + cell_explosion(get_turf(projectile), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, projectile.weapon_cause_data) + smoke.set_up(1, get_turf(projectile)) + smoke.start() + else + cell_explosion(turf, 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, projectile.weapon_cause_data) + smoke.set_up(1, turf) + smoke.start() + +/datum/ammo/arrow/expl/do_at_max_range(obj/projectile/projectile, mob/firer) + cell_explosion(get_turf(projectile), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, projectile.weapon_cause_data) + smoke.set_up(1, get_turf(projectile)) + smoke.start() + /datum/ammo/flare/starshell name = "starshell ash" icon_state = "starshell_bullet" @@ -330,3 +414,29 @@ var/obj/item/clothing/mask/facehugger/child = new(T) child.hivenumber = hugger_hive INVOKE_ASYNC(child, TYPE_PROC_REF(/obj/item/clothing/mask/facehugger, leap_at_nearest_target)) + +/datum/ammo/pill + name = "syringe" + icon_state = "syringe" + flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_ALWAYS_FF + + damage = 0 + +/datum/ammo/pill/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + + if(!ishuman(M)) + return + + if(!istype(P, /obj/projectile/pill)) + return + + var/obj/projectile/pill/pill_projectile = P + + if(QDELETED(pill_projectile.source_pill)) + pill_projectile.source_pill = null + return + + var/datum/reagents/pill_reagents = pill_projectile.source_pill.reagents + + pill_reagents.trans_to(M, pill_reagents.total_volume) diff --git a/code/datums/ammo/rocket.dm b/code/datums/ammo/rocket.dm index 78dac2b39e16..777693c8cbf2 100644 --- a/code/datums/ammo/rocket.dm +++ b/code/datums/ammo/rocket.dm @@ -307,3 +307,124 @@ /datum/ammo/rocket/custom/do_at_max_range(obj/projectile/projectile) prime(null, projectile) + +/datum/ammo/rocket/brute + flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_HITS_TARGET_TURF|AMMO_SNIPER //sniper as we want good acc + name = "M5510 Laser-Guided Rocket" + icon_state = "brute" + ///Chance per tile to spawn smoke + var/smoke_chance = 30 + ///Chance per tile to spawn sparks + var/spark_chance = 30 + ///Chance per tile to spawn flame tile + var/fire_chance = 30 + ///Chance for impacted object to be thrown + var/throw_chance = 20 + ///Damage in central area + var/structure_damage = 1200 + ///Lower bound of damage on left and right blast edge + var/edge_lower_dmg = 400 + ///Lower bound of damage on left and right blast edge + var/edge_upper_dmg = 700 + ///blast length, creates 3 wide 5x5 box fallowed by 3 wide blast + var/max_distance = 7 + +/datum/ammo/rocket/brute/on_hit_mob(mob/mob, obj/projectile/projectile) + INVOKE_ASYNC(src,PROC_REF(prime), mob, projectile) + +/datum/ammo/rocket/brute/on_hit_obj(obj/object, obj/projectile/projectile) + INVOKE_ASYNC(src,PROC_REF(prime), object, projectile) + +/datum/ammo/rocket/brute/on_hit_turf(turf/turf, obj/projectile/projectile) + INVOKE_ASYNC(src,PROC_REF(prime), turf, projectile) + +/datum/ammo/rocket/brute/do_at_max_range(obj/projectile/projectile) + INVOKE_ASYNC(src,PROC_REF(prime), null, projectile) + +/datum/ammo/rocket/brute/proc/prime(atom/atom, obj/projectile/projectile) + if(istype(projectile.firer, /mob/living/carbon)) + var/mob/living/carbon/firer = projectile.firer + if(atom) + log_game("[key_name(firer)] fired [name] targeting [atom], at [AREACOORD(atom)]") + msg_admin_niche("[key_name(firer, TRUE)] fired [name] targeting [atom], at [ADMIN_VERBOSEJMP(atom)]") + firer.attack_log += "\[[time_stamp()]\] [key_name(firer)] fired [name] targeting [atom], at [AREACOORD(atom)]" + else + log_game("[key_name(firer)] fired [name] at [AREACOORD(projectile)]") + msg_admin_niche("[key_name(firer, TRUE)] fired [name] at [ADMIN_VERBOSEJMP(projectile)]") + firer.attack_log += "\[[time_stamp()]\] [key_name(firer)] fired [name] at [AREACOORD(projectile)]" + var/angle = projectile.angle + var/right_angle = (angle + 90 ) % 360 + var/left_angle = (angle -90) % 360 + var/diagonal_left = (angle - 135) % 360 + var/diagonal_right = (angle + 135) % 360 + var/turf/initial_location = projectile.loc + var/list/cleared_locations = list(initial_location) + var/edge = FALSE + for(var/i = 0 to max_distance) + var/turf/new_turf = get_angle_target_turf(initial_location, angle , i) + INVOKE_ASYNC(src, PROC_REF(detonate),new_turf, initial_location, cleared_locations) + cleared_locations |= new_turf + var/max_width = 2 + if(i == 1 || i == max_distance) + max_width = 1 + for(var/ii = 1 to max_width) + edge = FALSE + if(ii == max_width) + edge = TRUE + var/turf/right_turf = get_angle_target_turf(new_turf, right_angle , ii) + INVOKE_ASYNC(src, PROC_REF(detonate),right_turf, initial_location, cleared_locations) + cleared_locations |= right_turf + var/turf/left_turf = get_angle_target_turf(new_turf, left_angle , ii) + INVOKE_ASYNC(src, PROC_REF(detonate),left_turf, initial_location, cleared_locations) + cleared_locations |= left_turf + if(i > 2) + right_turf = get_angle_target_turf(new_turf, diagonal_right , ii) + INVOKE_ASYNC(src, PROC_REF(detonate),right_turf, initial_location, cleared_locations,edge) + left_turf = get_angle_target_turf(new_turf, diagonal_left , ii) + INVOKE_ASYNC(src, PROC_REF(detonate),left_turf, initial_location, cleared_locations,edge) + cleared_locations |= right_turf + cleared_locations |= left_turf + sleep(1) //for effect of traveling blastwave rather then instant action in whole impact area + + +/datum/ammo/rocket/brute/proc/detonate(turf/location, turf/initial_location, list/detonated_locations, edge = FALSE) + if(location in detonated_locations) + return + + + if(prob(fire_chance)) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flame_radius), null, 0, location, BURN_TIME_INSTANT, BURN_LEVEL_TIER_1, FLAMESHAPE_LINE, null, FIRE_VARIANT_DEFAULT) + + if(prob(spark_chance)) + var/datum/effect_system/spark_spread/spark = new /datum/effect_system/spark_spread + spark.set_up(5, 1, location) + spark.start() + + if(prob(smoke_chance)) + var/datum/effect_system/smoke_spread/smoke = new /datum/effect_system/smoke_spread + smoke.set_up(0, 0, location, null, 3 DECISECONDS) + smoke.start() + + if(edge) + structure_damage = rand(edge_lower_dmg, edge_upper_dmg) + if(istype(location,/turf/closed/wall)) + location.ex_act(structure_damage) + for(var/obj/structure/structure in location.contents) + structure.ex_act(structure_damage) + if(location != initial_location) + var/throw_direction = Get_Angle(initial_location, location) + for(var/obj/atom in location.contents) + if(atom.anchored) + continue + if(prob(throw_chance)) + continue + atom.throw_atom(get_angle_target_turf(location,throw_direction,1),range = 1,speed = SPEED_INSTANT, spin = FALSE) + for(var/mob/living/living in location.contents) + if(prob(throw_chance + living.mob_size * 5 )) + continue + living.throw_atom(get_angle_target_turf(location,throw_direction,1),range = 1,speed = SPEED_INSTANT, spin = FALSE) + + + + + diff --git a/code/datums/ammo/shrapnel.dm b/code/datums/ammo/shrapnel.dm index f98c9723f1b1..45e9d2193fce 100644 --- a/code/datums/ammo/shrapnel.dm +++ b/code/datums/ammo/shrapnel.dm @@ -109,6 +109,9 @@ shell_speed = AMMO_SPEED_TIER_1 shrapnel_chance = 0 +/datum/ammo/bullet/shrapnel/light/resin + name = "resin shrapnel" + /datum/ammo/bullet/shrapnel/light/human name = "human bone fragments" icon_state = "shrapnel_human" diff --git a/code/datums/ammo/xeno.dm b/code/datums/ammo/xeno.dm index 11873a7202d5..2b901b8438c0 100644 --- a/code/datums/ammo/xeno.dm +++ b/code/datums/ammo/xeno.dm @@ -186,7 +186,6 @@ max_range = 8 damage = 30 shell_speed = AMMO_SPEED_TIER_2 - added_spit_delay = 0 /datum/ammo/xeno/acid/dot name = "acid spit" @@ -403,3 +402,39 @@ /datum/ammo/xeno/oppressor_tail/proc/remove_tail_overlay(mob/overlayed_mob, image/tail_image) overlayed_mob.overlays -= tail_image + + + +/datum/ammo/yautja/gauntlet_hook + name = "chain hook" + icon_state = "none" + ping = null + flags_ammo_behavior = AMMO_STOPPED_BY_COVER + damage_type = BRUTE + + damage = XENO_DAMAGE_TIER_5 + max_range = 4 + accuracy = HIT_ACCURACY_TIER_MAX + +/datum/ammo/yautja/gauntlet_hook/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) + //The projectile has no icon, so the overlay shows up in FRONT of the projectile, and the beam connects to it in the middle. + var/image/hook_overlay = new(icon = 'icons/effects/beam.dmi', icon_state = "chain", layer = BELOW_MOB_LAYER) + generated_projectile.overlays += hook_overlay + +/datum/ammo/yautja/gauntlet_hook/on_hit_mob(mob/target, obj/projectile/fired_proj) + shake_camera(target, 5, 0.1 SECONDS) + var/obj/effect/beam/chain_beam = fired_proj.firer.beam(target, "chain", 'icons/effects/beam.dmi', 10 SECONDS, 10) + + var/image/chain_image = image('icons/effects/status_effects.dmi', "chain") + target.overlays += chain_image + + new /datum/effects/xeno_slow(target, fired_proj.firer, ttl = 0.5 SECONDS) + + target.apply_effect(0.5, ROOT) + + INVOKE_ASYNC(target, TYPE_PROC_REF(/atom/movable, throw_atom), fired_proj.firer, get_dist(fired_proj.firer, target)-1, SPEED_VERY_FAST) + + qdel(chain_beam) + +/datum/ammo/yautja/gauntlet_hook/proc/remove_tail_overlay(mob/overlayed_mob, image/chain_image) + overlayed_mob.overlays -= chain_image diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 87a89ce6c506..aeaa572bb264 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -229,7 +229,7 @@ // a custom list of parameters // otherwise, just reset the client mob's machine var. // -/client/verb/windowclose(atomref as text|null, params as text|null) +CLIENT_VERB(windowclose, atomref as text|null, params as text|null) set hidden = TRUE // hide this verb from the user's panel set name = ".windowclose" // no autocomplete on cmd line diff --git a/code/datums/components/connect_mob_behalf.dm b/code/datums/components/connect_mob_behalf.dm index 2eeee78bf28b..367f93184290 100644 --- a/code/datums/components/connect_mob_behalf.dm +++ b/code/datums/components/connect_mob_behalf.dm @@ -41,9 +41,9 @@ if(QDELETED(tracked?.mob)) return tracked_mob = tracked.mob - RegisterSignal(tracked_mob, COMSIG_MOB_LOGOUT, PROC_REF(on_logout)) for (var/signal in connections) parent.RegisterSignal(tracked_mob, signal, connections[signal]) + RegisterSignal(tracked_mob, COMSIG_MOB_LOGOUT, PROC_REF(on_logout)) /datum/component/connect_mob_behalf/proc/unregister_signals() if(isnull(tracked_mob)) diff --git a/code/datums/components/damage_over_time.dm b/code/datums/components/damage_over_time.dm new file mode 100644 index 000000000000..080a61cda410 --- /dev/null +++ b/code/datums/components/damage_over_time.dm @@ -0,0 +1,83 @@ +//used on soro boiling water + +/datum/component/damage_over_time + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + + /// How much to damage (negative is healing) will incorporate dmg_mult after Initialize + var/dam_amount = 5 + /// The kind of damage to perform + var/dam_type = BURN + /// The desired body temperature to approach (if temp_delta specified) + var/target_temp = T90C + /// How much to adjust temperature each tick (does nothing if 0 - changing sign makes no difference). + var/temp_delta = 5 + /// The kind of thing to try and locate in loc to persist the effect + var/cause_path + + /// Parent as a living mob + var/mob/living/living_parent + +/datum/component/damage_over_time/InheritComponent(cause_path, dam_amount, dam_type, target_temp, temp_delta, synth_dmg_mult, pred_dmg_mult, warning_message) + return // Ultimately just here to suppress named arg errors + +/datum/component/damage_over_time/Initialize(cause_path, dam_amount=5, dam_type=BURN, target_temp=T90C, temp_delta=5, synth_dmg_mult=0.5, pred_dmg_mult=0.5, warning_message="You feel your body start to shake as the scalding water sears your skin, heat overwhelming your senses...") + src.dam_amount = dam_amount + src.dam_type = dam_type + src.target_temp = target_temp + src.temp_delta = temp_delta + src.cause_path = cause_path + + living_parent = parent + + if(!ispath(cause_path)) + return COMPONENT_INCOMPATIBLE + + if(!istype(living_parent)) + return COMPONENT_INCOMPATIBLE + if(living_parent.stat == DEAD) + return COMPONENT_INCOMPATIBLE + + if(issynth(living_parent)) + dam_amount *= synth_dmg_mult + else + if(warning_message) + to_chat(parent, SPAN_DANGER(warning_message)) + if(isyautja(living_parent)) + dam_amount *= pred_dmg_mult + + try_to_damage() + +/datum/component/damage_over_time/process(delta_time) + try_to_damage() + +/datum/component/damage_over_time/proc/try_to_damage() + if(QDELETED(living_parent) || living_parent.stat == DEAD) + qdel(src) + return + + var/cause = locate(cause_path) in living_parent.loc + if(!cause) //if we are no longer on a tile with the damage causing effect, stop. + qdel(src) + return + + if(living_parent.body_position == STANDING_UP) + living_parent.apply_damage(dam_amount,dam_type,"l_leg") + living_parent.apply_damage(dam_amount,dam_type,"l_foot") + living_parent.apply_damage(dam_amount,dam_type,"r_leg") + living_parent.apply_damage(dam_amount,dam_type,"r_foot") + else + living_parent.apply_damage(5*dam_amount,dam_type) + + if(temp_delta) + if(living_parent.bodytemperature + temp_delta < target_temp) + living_parent.bodytemperature += temp_delta + else if(living_parent.bodytemperature - temp_delta > target_temp) + living_parent.bodytemperature -= temp_delta + else + living_parent.bodytemperature = target_temp + +/datum/component/damage_over_time/RegisterWithParent() + START_PROCESSING(SSdcs, src) + +/datum/component/damage_over_time/UnregisterFromParent() + STOP_PROCESSING(SSdcs, src) diff --git a/code/datums/components/iff_fire_prevention.dm b/code/datums/components/iff_fire_prevention.dm index a82c3783af56..251947dad327 100644 --- a/code/datums/components/iff_fire_prevention.dm +++ b/code/datums/components/iff_fire_prevention.dm @@ -29,7 +29,11 @@ var/range_to_check = user.get_maximum_view_range() - var/extended_target_turf = get_angle_target_turf(user, angle, range_to_check) + var/extended_target_turf + if(target.z > user.z) + extended_target_turf = get_angle_target_turf(locate(user.x, user.y, target.z), angle, range_to_check) + else + extended_target_turf = get_angle_target_turf(user, angle, range_to_check) var/turf/starting_turf = get_turf(user) diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm index 61fa7cda1aa6..1ebe18f6f387 100644 --- a/code/datums/components/label.dm +++ b/code/datums/components/label.dm @@ -33,7 +33,7 @@ Since the parent already has a label, it will remove the old one from the parent's name, and apply the new one. */ /datum/component/label/InheritComponent(datum/component/label/new_comp , i_am_original, _label_name) - remove_label() + clear_label() if(new_comp) label_name = new_comp.label_name else @@ -60,9 +60,12 @@ if(!istype(labeler) || labeler.mode) return - remove_label() - playsound(parent, 'sound/items/poster_ripped.ogg', 20, TRUE) - to_chat(user, SPAN_WARNING("You remove the label from [parent].")) + if(has_label()) + log_admin("[key_name(usr)] has removed label from [parent].") + user.visible_message(SPAN_NOTICE("[user] removes label from [parent]."), + SPAN_NOTICE("You remove the label from [parent].")) + clear_label() + playsound(parent, 'sound/items/poster_ripped.ogg', 20, TRUE) qdel(src) // Remove the component from the object. /** @@ -77,6 +80,8 @@ /datum/component/label/proc/Examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER + if(!has_label()) + return examine_list += SPAN_NOTICE("It has a label with some words written on it. Use a hand labeler to remove it.") /// Applies a label to the name of the parent in the format of: "parent_name (label)" @@ -84,8 +89,13 @@ var/atom/owner = parent owner.name += " ([label_name])" -/// Removes the label from the parent's name -/datum/component/label/proc/remove_label() +/// Clears the label from the parent's name (but doesn't delete it) +/datum/component/label/proc/clear_label() var/atom/owner = parent owner.name = replacetext(owner.name, "([label_name])", "") // Remove the label text from the parent's name, wherever it's located. owner.name = trim(owner.name) // Shave off any white space from the beginning or end of the parent's name. + +/// Returns the position of the label in the name if applied, otherwise 0 +/datum/component/label/proc/has_label() + var/atom/owner = parent + return findtext(owner.name, "([label_name])") diff --git a/code/datums/construction/xenomorph/construction_template_xenomorph.dm b/code/datums/construction/xenomorph/construction_template_xenomorph.dm index 94914eb1e9ce..7564731d8dc5 100644 --- a/code/datums/construction/xenomorph/construction_template_xenomorph.dm +++ b/code/datums/construction/xenomorph/construction_template_xenomorph.dm @@ -59,6 +59,13 @@ build_type = /obj/effect/alien/resin/special/eggmorph build_icon_state = "eggmorph_preview" +/datum/construction_template/xenomorph/plasma_tree + name = XENO_STRUCTURE_PLASMA_TREE + description = "Gives out small bursts of plasma, replenishing the reserves of the sisters around it." + build_type = /obj/effect/alien/resin/special/plasma_tree + build_icon_state = "recovery_plasma" + + /datum/construction_template/xenomorph/recovery name = XENO_STRUCTURE_RECOVERY description = "Hastily recovers the strength of sisters resting around it." diff --git a/code/datums/crew_manifest.dm b/code/datums/crew_manifest.dm index 62d6efafcd2c..e34aaa0a7685 100644 --- a/code/datums/crew_manifest.dm +++ b/code/datums/crew_manifest.dm @@ -37,12 +37,12 @@ GLOBAL_DATUM_INIT(crew_manifest, /datum/crew_manifest, new) var/list/data = list() for(var/datum/data/record/record_entry in GLOB.data_core.general) - var/name = record_entry.fields["name"] var/rank = record_entry.fields["rank"] var/squad = record_entry.fields["squad"] if(isnull(name) || isnull(rank)) continue + if(record_entry.fields["mob_faction"] != FACTION_MARINE && rank != JOB_CORPORATE_LIAISON) continue @@ -56,7 +56,6 @@ GLOBAL_DATUM_INIT(crew_manifest, /datum/crew_manifest, new) for(var/iterated_dept in departments) if(iterated_dept in GLOB.ROLES_SQUAD_ALL) - //Check for exact squad match if(isnull(squad) || lowertext(squad) != lowertext(iterated_dept)) continue var/list/jobs = departments[iterated_dept] @@ -64,7 +63,6 @@ GLOBAL_DATUM_INIT(crew_manifest, /datum/crew_manifest, new) entry_dept = iterated_dept break - // Assign to department if rank matches or fallback for unrecognized rank if(isnull(entry_dept) && squad) entry_dept = squad break @@ -85,7 +83,12 @@ GLOBAL_DATUM_INIT(crew_manifest, /datum/crew_manifest, new) ui.open() /datum/crew_manifest/ui_state(mob/user) - return GLOB.always_state + if(ishuman(user) && (user.faction == FACTION_MARINE || (user.faction in FACTION_LIST_WY) || user.faction == FACTION_FAX)) + return GLOB.conscious_state + if(isnewplayer(user)) + return GLOB.new_player_state + if(isobserver(user)) + return GLOB.observer_state /datum/crew_manifest/proc/open_ui(mob/user) tgui_interact(user) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 87fa47dfe859..d072ef2db665 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -14,12 +14,26 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) if(!nosleep) sleep(40) - var/list/jobs_to_check = GLOB.ROLES_CIC + GLOB.ROLES_AUXIL_SUPPORT + GLOB.ROLES_MISC + GLOB.ROLES_POLICE + GLOB.ROLES_ENGINEERING + GLOB.ROLES_REQUISITION + GLOB.ROLES_MEDICAL + GLOB.ROLES_MARINES - for(var/mob/living/carbon/human/H as anything in GLOB.human_mob_list) - if(should_block_game_interaction(H)) + var/list/jobs_to_check = GLOB.ROLES_USCM + GLOB.ROLES_WO + + for(var/mob/living/carbon/human/current_human as anything in GLOB.human_mob_list) + if(should_block_game_interaction(current_human)) + continue + + if(is_in_manifest(current_human)) continue - if(H.job in jobs_to_check) - manifest_inject(H) + + if(current_human.job in jobs_to_check) + manifest_inject(current_human) + +/datum/datacore/proc/is_in_manifest(mob/living/carbon/human/current_human) + var/weakref = WEAKREF(current_human) + + for(var/datum/data/record/current_record as anything in general) + if(current_record.fields["ref"] == weakref) + return TRUE + + return FALSE /datum/datacore/proc/manifest_modify(name, ref, assignment, rank, p_stat) var/datum/data/record/foundrecord @@ -55,6 +69,12 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) else assignment = "Unassigned" + var/manifest_title + if(target?.assigned_equipment_preset.manifest_title) + manifest_title = target.assigned_equipment_preset.manifest_title + else + manifest_title = target.job + var/id = add_zero(num2hex(target.gid), 6) //this was the best they could come up with? A large random number? *sigh* var/icon/front = new(get_id_photo(target), dir = SOUTH) var/icon/side = new(get_id_photo(target), dir = WEST) @@ -65,8 +85,8 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) record_general.fields["id"] = id record_general.fields["name"] = target.real_name record_general.name = target.real_name - record_general.fields["real_rank"] = target.job - record_general.fields["rank"] = assignment + record_general.fields["real_rank"] = assignment + record_general.fields["rank"] = manifest_title record_general.fields["squad"] = target.assigned_squad ? target.assigned_squad.name : null record_general.fields["age"] = target.age record_general.fields["p_stat"] = "Active" @@ -92,19 +112,18 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) record_medical.fields["id"] = id record_medical.fields["name"] = target.real_name record_medical.name = target.name - record_medical.fields["b_type"] = target.blood_type - record_medical.fields["mi_dis"] = "None" - record_medical.fields["mi_dis_d"] = "No minor disabilities have been declared." - record_medical.fields["ma_dis"] = "None" - record_medical.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - record_medical.fields["alg"] = "None" - record_medical.fields["alg_d"] = "No allergies have been detected in this patient." - record_medical.fields["cdi"] = "None" - record_medical.fields["cdi_d"] = "No diseases have been diagnosed at the moment." + record_medical.fields["blood_type"] = target.blood_type + record_medical.fields["minor_disability"] = "None" + record_medical.fields["minor_disability_details"] = "No minor disabilities have been declared." + record_medical.fields["major_disability"] = "None" + record_medical.fields["major_disability_details"] = "No major disabilities have been diagnosed." + record_medical.fields["allergies"] = "None" + record_medical.fields["allergies_details"] = "No allergies have been detected in this patient." + record_medical.fields["diseases"] = "None" + record_medical.fields["diseases_details"] = "No diseases have been diagnosed at the moment." record_medical.fields["last_scan_time"] = null record_medical.fields["last_scan_result"] = "No scan data on record" // body scanner results record_medical.fields["autodoc_data"] = list() - record_medical.fields["autodoc_manual"] = list() record_medical.fields["ref"] = WEAKREF(target) if(target.med_record && !jobban_isbanned(target, "Records")) @@ -137,7 +156,7 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) record_locked.fields["rank"] = target.job record_locked.fields["age"] = target.age record_locked.fields["sex"] = target.gender - record_locked.fields["b_type"] = target.b_type + record_locked.fields["blood_type"] = target.blood_type record_locked.fields["species"] = target.get_species() record_locked.fields["origin"] = target.origin record_locked.fields["faction"] = target.personal_faction diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 4da7469a5c6f..38820e1d6367 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1,7 +1,9 @@ // reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) -/datum/proc/can_vv_get() +/datum/proc/can_vv_get(var_name) + if(var_name == NAMEOF(src, vars)) + return FALSE return TRUE /datum/proc/can_vv_modify() diff --git a/code/datums/effects/heal_over_time.dm b/code/datums/effects/heal_over_time.dm index 8b4883cede4e..2a7188fa330e 100644 --- a/code/datums/effects/heal_over_time.dm +++ b/code/datums/effects/heal_over_time.dm @@ -32,3 +32,11 @@ affected_mob.updatehealth() return TRUE + +/datum/effects/heal_over_time/Destroy() + if(affected_atom) + var/mob/living/carbon/xenomorph/xeno = affected_atom + if(istype(xeno)) + xeno.balloon_alert(xeno, "our regeneration speed returns to normal.", text_color = "#17991b80") + playsound(xeno, 'sound/effects/squish_and_exhaust.ogg', 25, 1) + return ..() diff --git a/code/datums/effects/plasma_over_time.dm b/code/datums/effects/plasma_over_time.dm index c6c32c3cd872..5fb6f71c1ce5 100644 --- a/code/datums/effects/plasma_over_time.dm +++ b/code/datums/effects/plasma_over_time.dm @@ -31,3 +31,11 @@ affected_mob.gain_plasma(plasma_each_process) return TRUE + +/datum/effects/plasma_over_time/Destroy() + if(affected_atom) + var/mob/living/carbon/xenomorph/xeno = affected_atom + if(istype(xeno)) + xeno.balloon_alert(xeno, "our plasma rush subsides.", text_color = "#1e6072") + playsound(xeno, 'sound/effects/squish_and_exhaust.ogg', 25, 1) + return ..() diff --git a/code/datums/effects/xeno_strains/gain_xeno_cooldown_reduction_on_slash.dm b/code/datums/effects/xeno_strains/gain_xeno_cooldown_reduction_on_slash.dm index 5bfde0080ef7..bba62ea7eff7 100644 --- a/code/datums/effects/xeno_strains/gain_xeno_cooldown_reduction_on_slash.dm +++ b/code/datums/effects/xeno_strains/gain_xeno_cooldown_reduction_on_slash.dm @@ -26,19 +26,21 @@ /datum/effects/gain_xeno_cooldown_reduction_on_slash/Destroy() if(affected_atom) - var/mob/living/carbon/xenomorph/X = affected_atom - X.cooldown_reduction_percentage -= current_reduction - to_chat(X, SPAN_XENOWARNING("You feel your frenzy wanes! Your cooldowns are back to normal.")) - if(X.cooldown_reduction_percentage < 0) - X.cooldown_reduction_percentage = 0 + var/mob/living/carbon/xenomorph/xeno = affected_atom + xeno.cooldown_reduction_percentage -= current_reduction + to_chat(xeno, SPAN_XENOWARNING("We feel our frenzy wane! Our cooldowns are back to normal.")) + xeno.balloon_alert(xeno, "we feel our frenzy wane!", text_color = "#99461780") + playsound(xeno, 'sound/effects/squish_and_exhaust.ogg', 25, 1) + if(xeno.cooldown_reduction_percentage < 0) + xeno.cooldown_reduction_percentage = 0 return ..() /datum/effects/gain_xeno_cooldown_reduction_on_slash/proc/increase_cooldown_reduction() SIGNAL_HANDLER if(affected_atom && current_reduction < max_reduction_amount) - var/mob/living/carbon/xenomorph/X = affected_atom + var/mob/living/carbon/xenomorph/xeno = affected_atom var/previous_reduction = current_reduction current_reduction = min(current_reduction + reduction_amount_per_slash, max_reduction_amount) var/delta = current_reduction - previous_reduction - X.cooldown_reduction_percentage += delta + xeno.cooldown_reduction_percentage += delta diff --git a/code/datums/effects/xeno_strains/xeno_speed.dm b/code/datums/effects/xeno_strains/xeno_speed.dm index 0e3b86a58da3..63b80198e603 100644 --- a/code/datums/effects/xeno_strains/xeno_speed.dm +++ b/code/datums/effects/xeno_strains/xeno_speed.dm @@ -44,4 +44,6 @@ LAZYREMOVE(xeno.modifier_sources, effect_modifier_source) if(effect_end_message) to_chat(xeno, effect_end_message) + xeno.balloon_alert(xeno, "our speed fall back to normal.", text_color = "#5B248C") + playsound(xeno, 'sound/effects/squish_and_exhaust.ogg', 25, 1) return ..() diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index fa10ca2a3a91..5496b95ed678 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -28,9 +28,9 @@ /// Deactivates the functionality defines by the element on the given datum /datum/element/proc/Detach(datum/source, force) SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src) - SHOULD_CALL_PARENT(TRUE) UnregisterSignal(source, COMSIG_PARENT_QDELETING) /datum/element/Destroy(force) diff --git a/code/datums/elements/bloody_feet.dm b/code/datums/elements/bloody_feet.dm index 3bcccd8377c6..8964eac5c882 100644 --- a/code/datums/elements/bloody_feet.dm +++ b/code/datums/elements/bloody_feet.dm @@ -60,7 +60,7 @@ Detach(target) return - // FIXME: This shit is retarded and Entered should be refactored + // FIXME: This shit is silly and Entered should be refactored if(LAZYISIN(entered_bloody_turf, target)) LAZYREMOVE(entered_bloody_turf, target) return diff --git a/code/datums/elements/drop_retrieval.dm b/code/datums/elements/drop_retrieval.dm index 0b77fd6265f2..4485bca071ad 100644 --- a/code/datums/elements/drop_retrieval.dm +++ b/code/datums/elements/drop_retrieval.dm @@ -42,8 +42,14 @@ . = ..() if (.) return + RegisterSignal(target, COMSIG_ITEM_HOLSTER, PROC_REF(holster)) retrieval_slot = slot +/datum/element/drop_retrieval/gun/proc/holster(obj/item/weapon/gun/holstered_gun, mob/user) + SIGNAL_HANDLER + if(holstered_gun.retrieve_to_slot(user, retrieval_slot, FALSE, TRUE)) + return COMPONENT_ITEM_HOLSTER_CANCELLED + /datum/element/drop_retrieval/gun/dropped(obj/item/weapon/gun/G, mob/user) G.handle_retrieval(user, retrieval_slot) diff --git a/code/datums/emergency_calls/bodyguard.dm b/code/datums/emergency_calls/bodyguard.dm new file mode 100644 index 000000000000..597ebfa73724 --- /dev/null +++ b/code/datums/emergency_calls/bodyguard.dm @@ -0,0 +1,99 @@ +/datum/emergency_call/wy_bodyguard + name = "Weyland-Yutani Bodyguard (Executive Bodyguard Detail)" + mob_max = 1 + mob_min = 1 + home_base = /datum/lazy_template/ert/weyland_station + var/equipment_preset = /datum/equipment_preset/wy/security + var/equipment_preset_leader = /datum/equipment_preset/wy/security + var/spawn_header = "You are a Weyland-Yutani Security Guard!" + var/spawn_header_leader = "You are a Weyland-Yutani Security Guard!" + +/datum/emergency_call/wy_bodyguard/New() + ..() + dispatch_message = "[MAIN_SHIP_NAME], this is a Weyland-Yutani Corporate Security Protection Detail shuttle inbound to the Liaison's Beacon." + objectives = "Protect the Corporate Liaison and follow his commands, unless it goes against Company policy. Do not damage Wey-Yu property." + +/datum/emergency_call/wy_bodyguard/create_member(datum/mind/responder_mind, turf/override_spawn_loc) + var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() + + if(!istype(spawn_loc)) + return //Didn't find a useable spawn point. + + var/mob/living/carbon/human/mob = new(spawn_loc) + responder_mind.transfer_to(mob, TRUE) + + if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) + leader = mob + to_chat(mob, SPAN_ROLE_HEADER(spawn_header_leader)) + arm_equipment(mob, equipment_preset_leader, TRUE, TRUE) + else + to_chat(mob, SPAN_ROLE_HEADER(spawn_header)) + arm_equipment(mob, equipment_preset, TRUE, TRUE) + + print_backstory(mob) + + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + +/datum/emergency_call/wy_bodyguard/print_backstory(mob/living/carbon/human/response_mob) + to_chat(response_mob, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a poor family.")) + to_chat(response_mob, SPAN_BOLD("Joining the ranks of Weyland-Yutani was all you could do to keep yourself and your loved ones fed.")) + to_chat(response_mob, SPAN_BOLD("You have no idea what a xenomorph is.")) + to_chat(response_mob, SPAN_BOLD("You are a simple security officer employed by Weyland-Yutani to guard their Executives from all Divisions alike.")) + to_chat(response_mob, SPAN_BOLD("You were sent to act as the Executives bodyguard on the [MAIN_SHIP_NAME], you have gotten permission from corporate to enter the area.")) + to_chat(response_mob, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) + +/datum/emergency_call/wy_bodyguard/goon + equipment_preset = /datum/equipment_preset/goon/standard/bodyguard + equipment_preset_leader = /datum/equipment_preset/goon/lead/bodyguard + spawn_header = "You are a Weyland-Yutani Corporate Security Officer!" + spawn_header_leader = "You are a Weyland-Yutani Corporate Security Lead!" + +/datum/emergency_call/wy_bodyguard/pmc + equipment_preset = /datum/equipment_preset/pmc/pmc_standard + equipment_preset_leader = /datum/equipment_preset/pmc/pmc_leader + spawn_header = "You are a Weyland-Yutani PMC Operator!" + spawn_header_leader = "You are a Weyland-Yutani PMC Leader!" + +/datum/emergency_call/wy_bodyguard/pmc/print_backstory(mob/living/carbon/human/response_mob) + if(ishuman_strict(response_mob)) + to_chat(response_mob, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a [pick(75;"well-off", 15;"well-established", 10;"average")] family.")) + to_chat(response_mob, SPAN_BOLD("Joining the ranks of Weyland-Yutani has proven to be very profitable for you.")) + to_chat(response_mob, SPAN_BOLD("While you are officially an employee, much of your work is off the books. You work as a skilled mercenary.")) + to_chat(response_mob, SPAN_BOLD("You are [pick(50;"unaware of the xenomorph threat", 15;"acutely aware of the xenomorph threat", 10;"well-informed of the xenomorph threat")]")) + +/datum/emergency_call/wy_bodyguard/pmc/sec/ + equipment_preset = /datum/equipment_preset/pmc/pmc_detainer + equipment_preset_leader = /datum/equipment_preset/pmc/pmc_lead_investigator + spawn_header = "You are a Weyland-Yutani PMC Detainer!" + spawn_header_leader = "You are a Weyland-Yutani PMC Lead Investigator!" + +/datum/emergency_call/wy_bodyguard/commando + equipment_preset = /datum/equipment_preset/pmc/commando/standard/low_threat + equipment_preset_leader = /datum/equipment_preset/pmc/commando/leader/low_threat + spawn_header = "You are a Weyland-Yutani Commando!" + spawn_header_leader = "You are a Weyland-Yutani Commando Leader!" + +/datum/emergency_call/wy_bodyguard/commando/print_backstory(mob/living/carbon/human/response_mob) + to_chat(response_mob, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a [pick(75;"well-off", 15;"well-established", 10;"average")] family.")) + to_chat(response_mob, SPAN_BOLD("Joining the ranks of Weyland-Yutani has proven to be very profitable for you.")) + to_chat(response_mob, SPAN_BOLD("While you are officially an employee, much of your work is off the books. You work as a skilled mercenary.")) + to_chat(response_mob, SPAN_BOLD("You are well-informed of the xenomorph threat")) + to_chat(response_mob, SPAN_BOLD("You are part of Weyland-Yutani Task Force Oberon that arrived in 2182 following the UA withdrawl of the Neroid Sector.")) + to_chat(response_mob, SPAN_BOLD("Task-force Titan is stationed aboard the USCSS Nisshoku, a weaponized science Weyland-Yutani vessel that is stationed at the edge of the Neroid Sector. ")) + to_chat(response_mob, SPAN_BOLD("Under the directive of Weyland-Yutani board member Johan Almric, you act as private security for Weyland-Yutani Corporate Liaison.")) + to_chat(response_mob, SPAN_BOLD("The USCSS Nisshoku contains a crew of roughly fifty commandos, and thirty scientists and support personnel.")) + to_chat(response_mob, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) + to_chat(response_mob, SPAN_BOLD("Deny Weyland-Yutani's involvement and do not trust the UA/USCM forces.")) + +/datum/emergency_call/wy_bodyguard/android + equipment_preset = /datum/equipment_preset/pmc/w_y_whiteout/low_threat + equipment_preset_leader = /datum/equipment_preset/pmc/w_y_whiteout/low_threat/leader + spawn_header = "You are a Weyland-Yutani Combat Android!" + spawn_header_leader = "You are a Weyland-Yutani Combat Android Leading Unit!" + +/datum/emergency_call/wy_bodyguard/android/print_backstory(mob/living/carbon/human/response_mob) + to_chat(response_mob, SPAN_BOLD("You were brought online in a Weyland-Yutani secret combat synthetic production facility.")) + to_chat(response_mob, SPAN_BOLD("You were programmed with a fully unlocked combat software.")) + to_chat(response_mob, SPAN_BOLD("You were given all available information about the xenomorph threat including classified data reserved for special employees.")) + to_chat(response_mob, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) + to_chat(response_mob, SPAN_BOLD("Deny Weyland-Yutani's involvement and do not trust the UA/USCM forces.")) diff --git a/code/datums/emergency_calls/deathsquad.dm b/code/datums/emergency_calls/deathsquad.dm index 7808f46d3109..d6727bdbf627 100644 --- a/code/datums/emergency_calls/deathsquad.dm +++ b/code/datums/emergency_calls/deathsquad.dm @@ -30,21 +30,21 @@ if(!leader && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(person.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = person - to_chat(person, SPAN_ROLE_HEADER("You are the Whiteout Team Leader!")) + to_chat(person, SPAN_ROLE_HEADER("You are the Whiteout Team Leading Unit!")) to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/leader, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(person.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Medic!")) + to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Support Unit!")) to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/medic, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(person.client, list(JOB_SQUAD_SPECIALIST, JOB_SQUAD_SMARTGUN), time_required_for_job)) heavies++ - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Terminator!")) + to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Cloaker Unit!")) to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) - arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/terminator, TRUE, TRUE) + arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/cloaker, TRUE, TRUE) else - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Operative!")) + to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Combat Unit!")) to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout, TRUE, TRUE) @@ -67,21 +67,21 @@ if(!leader && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(person.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = person - to_chat(person, SPAN_ROLE_HEADER("You are the Whiteout Team Leader!")) + to_chat(person, SPAN_ROLE_HEADER("You are the Whiteout Team Leading Unit!")) to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat/leader, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(person.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Medic!")) + to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Support Unit!")) to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat/medic, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(person.client, list(JOB_SQUAD_SPECIALIST, JOB_SQUAD_SMARTGUN), time_required_for_job)) heavies++ - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Terminator!")) + to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Cloaker Unit!")) to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) - arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat/terminator, TRUE, TRUE) + arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat/cloaker, TRUE, TRUE) else - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Operative!")) + to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Combat Unit!")) to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat, TRUE, TRUE) diff --git a/code/datums/emergency_calls/ert_stations.dm b/code/datums/emergency_calls/ert_stations.dm index 947007d25d70..31ccc0486685 100644 --- a/code/datums/emergency_calls/ert_stations.dm +++ b/code/datums/emergency_calls/ert_stations.dm @@ -21,3 +21,6 @@ /datum/lazy_template/fax_response_base map_name = "fax_responder_base" + +/datum/lazy_template/ssv_rostock + map_name = "ssv_rostock" diff --git a/code/datums/emergency_calls/goons.dm b/code/datums/emergency_calls/goons.dm index 57bb1c668448..f91fa0c042fe 100644 --- a/code/datums/emergency_calls/goons.dm +++ b/code/datums/emergency_calls/goons.dm @@ -97,45 +97,6 @@ to_chat(backstory_human, SPAN_BOLD("You heard about the original distress signal ages ago, but you have only just gotten permission from corporate to enter the area.")) to_chat(backstory_human, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the researcher is kept safe and follow their instructions.")) -/datum/emergency_call/goon/bodyguard - name = "Weyland-Yutani Goon (Executive Bodyguard Detail)" - mob_max = 1 - mob_min = 1 - -/datum/emergency_call/goon/bodyguard/New() - ..() - dispatch_message = "[MAIN_SHIP_NAME], this is a Weyland-Yutani Corporate Security Protection Detail shuttle inbound to the Liaison's Beacon." - objectives = "Protect the Corporate Liaison and follow his commands, unless it goes against Company policy. Do not damage Wey-Yu property." - -/datum/emergency_call/goon/bodyguard/create_member(datum/mind/M, turf/override_spawn_loc) - var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() - - if(!istype(spawn_loc)) - return //Didn't find a useable spawn point. - - var/mob/living/carbon/human/mob = new(spawn_loc) - M.transfer_to(mob, TRUE) - - if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) - leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Corporate Security Lead!")) - arm_equipment(mob, /datum/equipment_preset/goon/lead, TRUE, TRUE) - else - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Corporate Security Officer!")) - arm_equipment(mob, /datum/equipment_preset/goon/standard, TRUE, TRUE) - - print_backstory(mob) - - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) - -/datum/emergency_call/goon/bodyguard/print_backstory(mob/living/carbon/human/M) - to_chat(M, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a poor family.")) - to_chat(M, SPAN_BOLD("Joining the ranks of Weyland-Yutani was all you could do to keep yourself and your loved ones fed.")) - to_chat(M, SPAN_BOLD("You have no idea what a xenomorph is.")) - to_chat(M, SPAN_BOLD("You are a simple security officer employed by Weyland-Yutani to guard their Executives from all Divisions alike.")) - to_chat(M, SPAN_BOLD("You were sent to act as the Executives bodyguard on the [MAIN_SHIP_NAME], you have gotten permission from corporate to enter the area.")) - to_chat(M, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) - /datum/emergency_call/goon/platoon name = "Weyland-Yutani Corporate Security (Platoon)" mob_min = 8 diff --git a/code/datums/emergency_calls/inspection.dm b/code/datums/emergency_calls/inspection.dm index f42cd198f733..1eda16b80724 100644 --- a/code/datums/emergency_calls/inspection.dm +++ b/code/datums/emergency_calls/inspection.dm @@ -94,6 +94,7 @@ home_base = /datum/lazy_template/ert/weyland_station name_of_spawn = /obj/effect/landmark/ert_spawns/distress_pmc item_spawn = /obj/effect/landmark/ert_spawns/distress_pmc/item + max_heavies = 1 probability = 0 /datum/emergency_call/inspection_wy/New() @@ -116,6 +117,13 @@ to_chat(H, SPAN_ROLE_BODY("While officially your outfit does mundane security work for Weyland-Yutani, in practice you serve as both official and unofficial investigators into conduct of Company personnel. You are being dispatched to the [MAIN_SHIP_NAME] to make sure that the local Liaison has not forgotten their priorities or worse, thought to bite the hand that feeds them.")) to_chat(H, SPAN_ROLE_BODY("Remember the USCM personnel on the ship may not appreciate your presence there. Should the Liaison be in jail, you are not to act as legal counsel in any way unless instructed to do so by Dispatch. Your basic duty is to make a detailed report of anything involving the Liaison and any other WY personnel on board the ship.")) to_chat(H, SPAN_WARNING("Unless ordered otherwise by Dispatch, you are to avoid open conflict with the Marines. Retreat and make a report if they are outright hostile. Ahelp if you have any more questions or wish to release this character for other players.")) + else if(heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(H.client, JOB_SQUAD_SPECIALIST)) + heavies++ + arm_equipment(H, /datum/equipment_preset/pmc/pmc_riot_control, TRUE, TRUE) + to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Crowd Control Specialist!")) + to_chat(H, SPAN_ROLE_BODY("While officially your outfit does mundane security work for Weyland-Yutani, in practice you serve as both official and unofficial investigators into conduct of Company personnel. The Lead Investigator is in charge, your duty is to provide backup, counsel and any other form of assistance you can render to make sure their mission is a success.")) + to_chat(H, SPAN_ROLE_BODY("Remember that the USCM, or at least some parts of it, may be hostile towards your presence on the ship. Unless ordered otherwise by Dispatch, you and your Team Leader are to avoid open conflict with the Marines. Your main priority is making sure that your Lead survives to write the report they are due.")) + to_chat(H, SPAN_WARNING("Unless ordered otherwise by Dispatch, you are to avoid open conflict with the Marines. Your priority is the safety of your team, if the ship gets to hot, your best bet is evacuation. Ahelp if you have any more questions or wish to release this character for other players.")) else arm_equipment(H, /datum/equipment_preset/pmc/pmc_detainer, TRUE, TRUE) to_chat(H, SPAN_ROLE_HEADER("You are part of a Weyland-Yutani PMC Investigation Team!")) diff --git a/code/datums/emergency_calls/pmc.dm b/code/datums/emergency_calls/pmc.dm index 225e5c011c56..1dc72f056b4a 100644 --- a/code/datums/emergency_calls/pmc.dm +++ b/code/datums/emergency_calls/pmc.dm @@ -1,5 +1,5 @@ -//Weyland-Yutani commandos. Friendly to USCM, hostile to xenos. +//Weyland-Yutani PMCs. Friendly to USCM, hostile to xenos. /datum/emergency_call/pmc name = "Weyland-Yutani PMC (Squad)" mob_max = 6 @@ -95,7 +95,7 @@ mob_min = 2 probability = 0 max_medics = 2 - max_smartgunners = 1 + max_smartgunners = 0 var/checked_objective = FALSE /datum/emergency_call/pmc/chem_retrieval/New() @@ -123,7 +123,7 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = H - to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Squad Leader!")) + to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Lead Investigator!")) arm_equipment(H, /datum/equipment_preset/pmc/pmc_lead_investigator, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ @@ -131,8 +131,8 @@ arm_equipment(H, /datum/equipment_preset/pmc/pmc_med_investigator, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(H.client, JOB_SQUAD_SMARTGUN, time_required_for_job)) heavies++ - to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Heavy Gunner!")) - arm_equipment(H, /datum/equipment_preset/pmc/pmc_gunner, TRUE, TRUE) + to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Crowd Control Specialist!")) + arm_equipment(H, /datum/equipment_preset/pmc/pmc_riot_control, TRUE, TRUE) else to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Detainer!")) arm_equipment(H, /datum/equipment_preset/pmc/pmc_detainer, TRUE, TRUE) @@ -140,6 +140,7 @@ print_backstory(H) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + /obj/effect/landmark/ert_spawns/distress_pmc name = "Distress_PMC" icon_state = "spawn_distress_pmc" diff --git a/code/datums/emergency_calls/pred_hunt/hunting_calls.dm b/code/datums/emergency_calls/pred_hunt/hunting_calls.dm index 0413bc781bd6..cbfcf741933a 100644 --- a/code/datums/emergency_calls/pred_hunt/hunting_calls.dm +++ b/code/datums/emergency_calls/pred_hunt/hunting_calls.dm @@ -179,8 +179,11 @@ /datum/emergency_call/young_bloods //YOUNG BLOOD ERT ONLY FOR HUNTING GROUNDS IF SOME MOD USES THIS INSIDE THE MAIN GAME THE COUNCIL WONT BE HAPPY (Joe Lampost) name = "Template" var/blooding_name - time_required_for_job = 60 HOURS + var/youngblood_time probability = 0 + mob_max = 3 + mob_min = 1 + objectives = "Hunt down and defeat prey within the hunting grounds to earn your mark. You may not: Stun hit prey, hit prey in cloak or excessively run away to heal." name_of_spawn = /obj/effect/landmark/ert_spawns/distress/hunt_spawner/pred shuttle_id = "" @@ -190,25 +193,22 @@ if(youngblood_candidate.current?.client?.check_whitelist_status(WHITELIST_YAUTJA) || jobban_isbanned(youngblood_candidate.current, ERT_JOB_YOUNGBLOOD)) to_chat(youngblood_candidate.current, SPAN_WARNING("You didn't qualify for the ERT beacon because you are already whitelisted for predator or you are job banned from youngblood.")) continue + if(check_timelock(youngblood_candidate.current?.client, JOB_YOUNGBLOOD_ROLES_LIST, youngblood_time)) + to_chat(youngblood_candidate.current, SPAN_WARNING("You did not qualify for the ERT beacon because you have already reached the maximum time allowed for Youngblood, please consider applying for Predator on the forums.")) + continue if(check_timelock(youngblood_candidate.current?.client, JOB_SQUAD_ROLES_LIST, time_required_for_job) && (youngblood_candidate.current?.client.get_total_xeno_playtime() >= time_required_for_job)) youngblood_candidates_clean.Add(youngblood_candidate) continue if(youngblood_candidate.current) - to_chat(youngblood_candidate.current, SPAN_WARNING("You didn't qualify for the ERT beacon because you did not meet the required hours for this role [round(time_required_for_job / 36000)] hours on both squad roles and xenomorph roles.")) + to_chat(youngblood_candidate.current, SPAN_WARNING("You didn't qualify for the ERT beacon because you did not meet the required hours for this role [round(time_required_for_job / 18000)] hours on both squad roles and xenomorph roles.")) return youngblood_candidates_clean -/datum/emergency_call/young_bloods/hunting_party - name = "Hunting Grounds - Youngblood Party" - blooding_name = "Youngblood Party (Three members)" - mob_max = 3 - mob_min = 1 - objectives = "Hunt down and defeat prey within the hunting grounds to earn your mark. You may not: Stun hit prey, hit prey in cloak or excessively run away to heal." /datum/emergency_call/young_bloods/spawn_candidates(quiet_launch, announce_incoming, override_spawn_loc) . = ..() if(length(members) < mob_min) message_all_yautja("No youngbloods answered the call.") - GLOB.blooding_activated = FALSE + COOLDOWN_RESET(GLOB, youngblood_timer_yautja) else message_all_yautja("Awoke [length(members)] youngbloods for the ritual.") @@ -247,3 +247,21 @@ if(SSticker.mode) SSticker.mode.initialize_predator(hunter, ignore_pred_num = TRUE) + +/datum/emergency_call/young_bloods/inexperienced + name = "Hunting Grounds - Inexperienced Youngblood Party" //For completly new youngblood players + blooding_name = "Inexperienced Youngblood Party (Three members)" + time_required_for_job = 5 HOURS + youngblood_time = 2 HOURS + +/datum/emergency_call/young_bloods/intermediate + name = "Hunting Grounds - Intermediate Youngblood Party" //For players who have played a few rounds as youngblood + blooding_name = "Intermediate Youngblood Party (Three members)" + time_required_for_job = 10 HOURS + youngblood_time = 5 HOURS + +/datum/emergency_call/young_bloods/experienced //Regular youngblood party + name = "Hunting Grounds - Experienced Youngblood Party" + blooding_name = "Experienced Youngblood Party (Three members)" + time_required_for_job = 20 HOURS + youngblood_time = 10 HOURS diff --git a/code/datums/emergency_calls/royal_marines.dm b/code/datums/emergency_calls/royal_marines.dm index 1e54dfbbd9f7..01ae32823cc3 100644 --- a/code/datums/emergency_calls/royal_marines.dm +++ b/code/datums/emergency_calls/royal_marines.dm @@ -1,6 +1,6 @@ /datum/emergency_call/royal_marines name = "Royal Marines Commando (Squad) (Friendly)" - mob_max = 7 + mob_max = 6 probability = 15 home_base = /datum/lazy_template/ert/twe_station shuttle_id = MOBILE_SHUTTLE_ID_ERT4 diff --git a/code/datums/emergency_calls/supplies.dm b/code/datums/emergency_calls/supplies.dm index 4bb71849f86a..9d56560b36d4 100644 --- a/code/datums/emergency_calls/supplies.dm +++ b/code/datums/emergency_calls/supplies.dm @@ -38,8 +38,8 @@ new /obj/item/attachable/verticalgrip(W) new /obj/item/attachable/verticalgrip(W) if(2) - new /obj/item/weapon/gun/flamer(W) - new /obj/item/weapon/gun/flamer(W) + new /obj/item/weapon/gun/flamer/m240(W) + new /obj/item/weapon/gun/flamer/m240(W) new /obj/item/ammo_magazine/flamer_tank(W) new /obj/item/ammo_magazine/flamer_tank(W) if(3) diff --git a/code/datums/emergency_calls/wy_commando.dm b/code/datums/emergency_calls/wy_commando.dm new file mode 100644 index 000000000000..c510b564be01 --- /dev/null +++ b/code/datums/emergency_calls/wy_commando.dm @@ -0,0 +1,103 @@ + +//Weyland-Yutani commandos. Friendly to USCM, hostile to xenos. +/datum/emergency_call/wy_commando + name = "Weyland-Yutani Commando (Squad)" + mob_max = 6 + probability = 5 + shuttle_id = MOBILE_SHUTTLE_ID_ERT2 + home_base = /datum/lazy_template/ert/weyland_station + name_of_spawn = /obj/effect/landmark/ert_spawns/distress_pmc + item_spawn = /obj/effect/landmark/ert_spawns/distress_pmc/item + + max_smartgunners = 1 + + +/datum/emergency_call/wy_commando/New() + ..() + arrival_message = "[MAIN_SHIP_NAME], this is USCSS Nisshoku responding to your distress call. We are boarding. Any hostile actions will be met with lethal force." + objectives = "Secure the Corporate Liaison and the [MAIN_SHIP_NAME]'s Commanding Officer, and eliminate any hostile threats. Do not damage Wey-Yu property." + + +/datum/emergency_call/wy_commando/create_member(datum/mind/M, turf/override_spawn_loc) + var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() + + if(!istype(spawn_loc)) + return //Didn't find a useable spawn point. + + var/mob/living/carbon/human/mob = new(spawn_loc) + M.transfer_to(mob, TRUE) + + if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) + leader = mob + to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Commando Squad Leader!")) + arm_equipment(mob, /datum/equipment_preset/pmc/commando/leader/low_threat, TRUE, TRUE) + else if(smartgunners < max_smartgunners && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(mob.client, JOB_SQUAD_SMARTGUN)) + smartgunners++ + to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Commando Heavy Gunner!")) + arm_equipment(mob, /datum/equipment_preset/pmc/commando/gunner/low_threat, TRUE, TRUE) + else + to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Commando!")) + arm_equipment(mob, /datum/equipment_preset/pmc/commando/standard/low_threat, TRUE, TRUE) + + print_backstory(mob) + + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + +/datum/emergency_call/wy_commando/print_backstory(mob/living/carbon/human/M) + to_chat(M, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a [pick(75;"well-off", 15;"well-established", 10;"average")] family.")) + to_chat(M, SPAN_BOLD("Joining the ranks of Weyland-Yutani has proven to be very profitable for you.")) + to_chat(M, SPAN_BOLD("While you are officially an employee, much of your work is off the books. You work as a skilled mercenary.")) + to_chat(M, SPAN_BOLD("You are well-informed of the xenomorph threat")) + to_chat(M, SPAN_BOLD("You are part of Weyland-Yutani Task Force Oberon that arrived in 2182 following the UA withdrawl of the Neroid Sector.")) + to_chat(M, SPAN_BOLD("Task-force Titan is stationed aboard the USCSS Nisshoku, a weaponized science Weyland-Yutani vessel that is stationed at the edge of the Neroid Sector. ")) + to_chat(M, SPAN_BOLD("Under the directive of Weyland-Yutani board member Johan Almric, you act as private security for Weyland-Yutani science teams.")) + to_chat(M, SPAN_BOLD("The USCSS Nisshoku contains a crew of roughly fifty commandos, and thirty scientists and support personnel.")) + to_chat(M, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) + to_chat(M, SPAN_BOLD("Deny Weyland-Yutani's involvement and do not trust the UA/USCM forces.")) + +/datum/emergency_call/wy_commando/platoon + name = "Weyland-Yutani Commando (Platoon)" + mob_min = 8 + mob_max = 25 + probability = 0 + max_smartgunners = 4 + +/datum/emergency_call/wy_commando/deathsquad + name = "Weyland-Yutani Commando (Squad) (!DEATHSQUAD!)" + mob_max = 8 + probability = 0 + shuttle_id = MOBILE_SHUTTLE_ID_ERT2 + home_base = /datum/lazy_template/ert/weyland_station + name_of_spawn = /obj/effect/landmark/ert_spawns/distress_pmc + item_spawn = /obj/effect/landmark/ert_spawns/distress_pmc/item + + max_smartgunners = 2 + +/datum/emergency_call/wy_commando/deathsquad/New() + ..() + objectives = "Eliminate everyone, then detonate the ship. Damage to Wey-Yu property is tolerable." + +/datum/emergency_call/wy_commando/deathsquad/create_member(datum/mind/M, turf/override_spawn_loc) + var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() + + if(!istype(spawn_loc)) + return //Didn't find a useable spawn point. + + var/mob/living/carbon/human/mob = new(spawn_loc) + M.transfer_to(mob, TRUE) + + if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) + leader = mob + to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Commando Squad Leader!")) + arm_equipment(mob, /datum/equipment_preset/pmc/commando/leader, TRUE, TRUE) + else if(smartgunners < max_smartgunners && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(mob.client, JOB_SQUAD_SMARTGUN)) + smartgunners++ + to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Commando Heavy Gunner!")) + arm_equipment(mob, /datum/equipment_preset/pmc/commando/gunner, TRUE, TRUE) + else + to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Commando!")) + arm_equipment(mob, /datum/equipment_preset/pmc/commando/standard, TRUE, TRUE) + + print_backstory(mob) + + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index 72f75f5ab0b3..50c79309c49f 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -528,6 +528,8 @@ BSQL_PROTECT_DATUM(/datum/entity/player) add_verb(src, /client/proc/whitelist_panel) if(isCouncil(src)) add_verb(src, /client/proc/other_records) + if(isYautjaCouncil(src)) + add_verb(src, /client/proc/pred_council_message) if(GLOB.RoleAuthority && check_whitelist_status(WHITELIST_PREDATOR)) clan_info = GET_CLAN_PLAYER(player.id) diff --git a/code/datums/factions/clf.dm b/code/datums/factions/clf.dm index ce53b505b352..19a5a9f32c4e 100644 --- a/code/datums/factions/clf.dm +++ b/code/datums/factions/clf.dm @@ -23,6 +23,8 @@ hud_icon_state = "synth" if(JOB_CLF_COMMANDER) hud_icon_state = "cellcom" + if(JOB_CLF_COORDINATOR) + hud_icon_state = "cr" if(hud_icon_state) holder.overlays += image('icons/mob/hud/marine_hud.dmi', human, "clf_[hud_icon_state]") diff --git a/code/datums/factions/hyperdyne.dm b/code/datums/factions/hyperdyne.dm new file mode 100644 index 000000000000..967e3155d9da --- /dev/null +++ b/code/datums/factions/hyperdyne.dm @@ -0,0 +1,39 @@ +/datum/faction/hyperdyne + name = "Hyperdyne Corporation" + faction_tag = FACTION_HYPERDYNE + +/datum/faction/hyperdyne/modify_hud_holder(image/holder, mob/living/carbon/human/user) + var/hud_icon_state + var/obj/item/card/id/id_card = user.get_idcard() + var/role + if(user.mind) + role = user.job + else if(id_card) + role = id_card.rank + switch(role) + if(JOB_HC_TRAINEE) + hud_icon_state = "trainee" + if(JOB_HC_JUNIOR_EXECUTIVE) + hud_icon_state = "junior_exec" + if(JOB_HC_CORPORATE_LIAISON) + hud_icon_state = "liaison" + if(JOB_HC_EXECUTIVE) + hud_icon_state = "liaison" + if(JOB_HC_SENIOR_EXECUTIVE) + hud_icon_state = "senior_exec" + if(JOB_HC_EXECUTIVE_SPECIALIST, JOB_HC_LEGAL_SPECIALIST) + hud_icon_state = "exec_spec" + if(JOB_HC_EXECUTIVE_SUPERVISOR, JOB_HC_LEGAL_SUPERVISOR) + hud_icon_state = "exec_super" + if(JOB_HC_ASSISTANT_MANAGER) + hud_icon_state = "ass_man" + if(JOB_HC_DIVISION_MANAGER) + hud_icon_state = "div_man" + if(JOB_HC_CHIEF_EXECUTIVE) + hud_icon_state = "chief_man" + if(JOB_HC_DEPUTY_DIRECTOR) + hud_icon_state = "dep_director" + if(JOB_HC_DIRECTOR) + hud_icon_state = "director" + if(hud_icon_state) + holder.overlays += image('icons/mob/hud/marine_hud.dmi', user, "hc_[hud_icon_state]") diff --git a/code/datums/factions/iasf.dm b/code/datums/factions/iasf.dm new file mode 100644 index 000000000000..031e39e51682 --- /dev/null +++ b/code/datums/factions/iasf.dm @@ -0,0 +1,41 @@ +/datum/faction/iasf + name = "TWE - Imperial Armed Space Force" + faction_tag = FACTION_IASF + +/datum/faction/iasf/modify_hud_holder(image/holder, mob/living/carbon/human/human) + var/hud_icon_state + var/obj/item/card/id/dogtag/ID = human.get_idcard() + var/_role + if(human.mind) + _role = human.job + else if(ID) + _role = ID.rank + switch(_role) + if(JOB_TWE_IASF_PARA_LIEUTENANT) + hud_icon_state = "lieutenant" + if(JOB_TWE_IASF_PARA_SQUAD_LEADER) + hud_icon_state = "teamleader" + if(JOB_TWE_IASF_PARA_SNIPER) + hud_icon_state = "sniper" + if(JOB_TWE_IASF_PARA_MEDIC) + hud_icon_state = "medic" + if(JOB_TWE_IASF_PARA) + hud_icon_state = "rifleman" + if(JOB_TWE_IASF_PARA_SMARTGUNNER) + hud_icon_state = "smartgunner" + if(JOB_TWE_IASF_PARA_SPECIALIST) + hud_icon_state = "spec" + if(JOB_TWE_IASF_PARA_PILOT) + hud_icon_state = "pilot" + if(JOB_TWE_IASF_PARA_ENGI) + hud_icon_state = "engi" + if(JOB_TWE_IASF_PARA_CAPTAIN) + hud_icon_state = "commander" + if(JOB_TWE_IASF_PARA_MAJOR) + hud_icon_state = "major" + if (JOB_TWE_IASF_PARA_COMMANDER) + hud_icon_state = "commander" + if (JOB_TWE_IASF_PARA_SYNTH) + hud_icon_state = "synth" + if(hud_icon_state) + holder.overlays += image('icons/mob/hud/marine_hud.dmi', human, "iasf_[hud_icon_state]") diff --git a/code/datums/factions/pap.dm b/code/datums/factions/pap.dm new file mode 100644 index 000000000000..9893d3a35701 --- /dev/null +++ b/code/datums/factions/pap.dm @@ -0,0 +1,31 @@ +/datum/faction/pap + name = "People's Armed Police" + faction_tag = FACTION_PAP + +/datum/faction/pap/modify_hud_holder(image/holder, mob/living/carbon/human/human) + var/hud_icon_state + var/obj/item/card/id/ID = human.get_idcard() + var/_role + if(human.mind) + _role = human.job + else if(ID) + _role = ID.rank + switch(_role) + if(JOB_PAP_MILITSIONER) + hud_icon_state = "silver" + if(JOB_PAP_STARSHIY_MILITSIONER) + hud_icon_state = "silver" + if(JOB_PAP_STARSHINA) + hud_icon_state = "silver" + if(JOB_PAP_LEYTENANT) + hud_icon_state = "gold" + if(JOB_PAP_KAPITAN) + hud_icon_state = "gold" + if(JOB_PAP_MAYOR) + hud_icon_state = "gold" + if(JOB_PAP_POLITKOMISSAR) + hud_icon_state = "gold" + if(JOB_PAP_POLKOVNIK) + hud_icon_state = "gold" + if(hud_icon_state) + holder.overlays += image('icons/mob/hud/marine_hud.dmi', human, "pap_[hud_icon_state]") diff --git a/code/datums/factions/pmc.dm b/code/datums/factions/pmc.dm index 421b5a22b404..737bab8301a2 100644 --- a/code/datums/factions/pmc.dm +++ b/code/datums/factions/pmc.dm @@ -27,18 +27,26 @@ hud_icon_state = "mi" if(JOB_PMC_SYNTH) hud_icon_state = "syn" - if(JOB_PMC_XENO_HANDLER) - hud_icon_state = "handler" if(JOB_PMC_GUNNER) hud_icon_state = "sg" if(JOB_PMC_DETAINER) hud_icon_state = "mp" + if(JOB_PMC_CROWD_CONTROL) + hud_icon_state = "riot" if(JOB_PMC_CREWMAN) hud_icon_state = "crew" if(JOB_PMC_SNIPER) hud_icon_state = "spec" if(JOB_PMC_STANDARD) hud_icon_state = "gun" + if(JOB_WY_COMMANDO_STANDARD) + hud_icon_state = "commando_gun" + if(JOB_WY_COMMANDO_LEADER) + hud_icon_state = "commando_leader" + if(JOB_WY_COMMANDO_GUNNER) + hud_icon_state = "commando_sg" + if(JOB_WY_COMMANDO_DOGCATHER) + hud_icon_state = "commando_dogcatcher" if(hud_icon_state) holder.overlays += image('icons/mob/hud/marine_hud.dmi', H, "pmc_[hud_icon_state]") diff --git a/code/datums/factions/uscm.dm b/code/datums/factions/uscm.dm index b5b9ca8e5cb5..5493f05e67f4 100644 --- a/code/datums/factions/uscm.dm +++ b/code/datums/factions/uscm.dm @@ -68,7 +68,7 @@ if(!marine_rk) marine_rk = current_human.rank_fallback - if(current_human.rank_override) + if(current_human.rank_override && squad.squad_leader != current_human) marine_rk = current_human.rank_override if(marine_rk) var/image/IMG = image('icons/mob/hud/marine_hud.dmi', current_human, "hudsquad") diff --git a/code/datums/factions/wo.dm b/code/datums/factions/wo.dm index 5544c28abc2c..d07005f15cde 100644 --- a/code/datums/factions/wo.dm +++ b/code/datums/factions/wo.dm @@ -13,11 +13,11 @@ switch(_role) if(JOB_DS_SL) hud_icon_state = "sl" - if(JOB_DS_SG) - hud_icon_state = "sg" - if(JOB_DS_MED) + if(JOB_DS_CK) hud_icon_state = "med" - if(JOB_DS_OP) + if(JOB_DS_SUP) + hud_icon_state = "sg" + if(JOB_DS_CU) hud_icon_state = "op" if(hud_icon_state) holder.overlays += image('icons/mob/hud/marine_hud.dmi', human, "wo_[hud_icon_state]") diff --git a/code/datums/factions/wy.dm b/code/datums/factions/wy.dm index d0b94b8fddad..80858064b57e 100644 --- a/code/datums/factions/wy.dm +++ b/code/datums/factions/wy.dm @@ -15,6 +15,8 @@ hud_icon_state = "goon_normal" if(JOB_WY_GOON_LEAD) hud_icon_state = "goon_leader" + if(JOB_WY_GOON_SYNTH) + hud_icon_state = "goon_synth" if(JOB_WY_RESEARCHER) hud_icon_state = "researcher" if(JOB_WY_RESEARCH_LEAD) @@ -23,6 +25,10 @@ hud_icon_state = "goon_engi" if(JOB_WY_GOON_MEDIC) hud_icon_state = "goon_medic" + if(JOB_WY_SEC) + hud_icon_state = "sec" + if(JOB_WY_SEC_SYNTH) + hud_icon_state = "synth" if(JOB_TRAINEE) hud_icon_state = "trainee" if(JOB_JUNIOR_EXECUTIVE) diff --git a/code/datums/global_variables.dm b/code/datums/global_variables.dm index 4f7cf24f7d15..041ecf88455e 100644 --- a/code/datums/global_variables.dm +++ b/code/datums/global_variables.dm @@ -399,7 +399,7 @@ global.vars[variable] = var_new if("icon") - var/var_new = input("Pick icon:","Icon",global.vars[variable]) as null|icon + var/var_new = pick_and_customize_icon(pick_only=TRUE) if(var_new==null) return global.vars[variable] = var_new diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index aa4665bda652..679b0697a767 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -52,7 +52,7 @@ GLOBAL_DATUM_INIT(revdata, /datum/getrev, new) continue . += "#[tm.number][details]
" -/client/verb/showrevinfo() +CLIENT_VERB(showrevinfo) set category = "OOC" set name = "Show Server Revision" set desc = "Check the current server code revision" diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index d7e90f61683a..d67a27e0ed6c 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -31,7 +31,7 @@ . = ..() if(.) return - winset(user, null, "command=.screenshot [!user.keys_held["shift"] ? "auto" : ""]") + winset(user, null, "command=.screenshot [!user.keys_held[SHIFT_CLICK] ? "auto" : ""]") return TRUE /datum/keybinding/client/toggle_fullscreen diff --git a/code/datums/keybinding/yautja.dm b/code/datums/keybinding/yautja.dm index 2933684f8bba..436a96e38092 100644 --- a/code/datums/keybinding/yautja.dm +++ b/code/datums/keybinding/yautja.dm @@ -415,3 +415,20 @@ if(istype(held_item)) held_item.fold_combistick() return TRUE + +/datum/keybinding/yautja/guard_gloves + hotkey_keys = list("Space") + classic_keys = list("Unbound") + name = "gauntlet_guard" + full_name = "Guard-Yourself" + keybind_signal = COMSIG_KB_YAUTJA_GAUNTLET_GUARD + +/datum/keybinding/yautja/guard_gloves/down(client/user) + . = ..() + if(.) + return + var/mob/living/carbon/human/human = user.mob + var/obj/item/weapon/bracer_attachment/chain_gauntlets/held_item = human.get_held_item() + if(istype(held_item)) + held_item.gauntlet_guard() + return TRUE diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index 860d612847ce..13cf15cb98a9 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -45,6 +45,10 @@ var/list/synth_survivor_types_by_variant var/list/CO_survivor_types + var/list/CO_survivor_types_by_variant + + var/list/CO_insert_survivor_types + var/list/CO_insert_survivor_types_by_variant var/list/defcon_triggers = list(5150, 4225, 2800, 1000, 0.0) @@ -103,7 +107,6 @@ /datum/equipment_preset/synth/survivor/atc_synth, /datum/equipment_preset/synth/survivor/cmb_synth, /datum/equipment_preset/synth/survivor/wy/security_synth, - /datum/equipment_preset/synth/survivor/wy/protection_synth, /datum/equipment_preset/synth/survivor/wy/corporate_synth, /datum/equipment_preset/synth/survivor/detective_synth, /datum/equipment_preset/synth/survivor/icc_synth, @@ -279,6 +282,23 @@ pathed_CO_survivor_types += CO_survivor_typepath CO_survivor_types = pathed_CO_survivor_types.Copy() + if(islist(json["CO_insert_survivor_types"])) + CO_insert_survivor_types = json["CO_insert_survivor_types"] + else if ("CO_insert_survivor_types" in json) + log_world("map_config CO_insert_survivor_types is not a list!") + return + + var/list/pathed_CO_insert_survivor_types = list() + for(var/CO_insert_surv_type in CO_insert_survivor_types) + var/CO_insert_survivor_typepath = CO_insert_surv_type + if(!ispath(CO_insert_survivor_typepath)) + CO_insert_survivor_typepath = text2path(CO_insert_surv_type) + if(!ispath(CO_insert_survivor_typepath)) + log_world("[CO_insert_surv_type] isn't a proper typepath, removing from CO_insert_survivor_types list") + continue + pathed_CO_insert_survivor_types += CO_insert_survivor_typepath + CO_insert_survivor_types = pathed_CO_insert_survivor_types.Copy() + if (islist(json["monkey_types"])) monkey_types = list() for(var/monkey in json["monkey_types"]) diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm index 2eabd92c5986..a53f188b3ffb 100644 --- a/code/datums/mob_hud.dm +++ b/code/datums/mob_hud.dm @@ -14,16 +14,20 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( MOB_HUD_FACTION_OBSERVER = new /datum/mob_hud/faction/observer(), MOB_HUD_FACTION_UPP = new /datum/mob_hud/faction/upp(), MOB_HUD_FACTION_WY = new /datum/mob_hud/faction/wy(), + MOB_HUD_FACTION_HC = new /datum/mob_hud/faction/hyperdyne(), MOB_HUD_FACTION_TWE = new /datum/mob_hud/faction/twe(), + MOB_HUD_FACTION_IASF = new /datum/mob_hud/faction/iasf(), MOB_HUD_FACTION_CLF = new /datum/mob_hud/faction/clf(), MOB_HUD_FACTION_PMC = new /datum/mob_hud/faction/pmc(), MOB_HUD_FACTION_CMB = new /datum/mob_hud/faction/cmb(), MOB_HUD_FACTION_NSPA = new /datum/mob_hud/faction/nspa(), + MOB_HUD_FACTION_PAP = new /datum/mob_hud/faction/pap(), MOB_HUD_FACTION_WO = new /datum/mob_hud/faction/wo(), MOB_HUD_HUNTER = new /datum/mob_hud/hunter_hud(), MOB_HUD_HUNTER_CLAN = new /datum/mob_hud/hunter_clan(), MOB_HUD_EXECUTE = new /datum/mob_hud/execute_hud(), MOB_HUD_NEW_PLAYER = new /datum/mob_hud/new_player(), + MOB_HUD_SPYCAMS = new /datum/mob_hud/spy_cams(), )) /datum/mob_hud @@ -33,8 +37,7 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( // which is the list of the images maintenenced by this HUD // Actually managing those images is left up to clients. -// Stop displaying a HUD to a specific person -// (took off medical glasses) +/// Stop displaying a HUD to a specific person (e.g. took off medical glasses) /datum/mob_hud/proc/remove_hud_from(mob/user, source) if(length(hudusers[user]) && (source in hudusers[user])) hudusers[user] -= source @@ -46,15 +49,13 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( hudusers -= user return TRUE -// Stop rendering a HUD on a target -// "unenroll" them so to speak +/// Stop rendering a HUD on a target ("unenroll" them so to speak) /datum/mob_hud/proc/remove_from_hud(mob/target) for(var/mob/user in hudusers) remove_from_single_hud(user, target) hudmobs -= target -// Always invoked on every 'user' -// Removes target from user's client's images. +/// Removes target from user's client's images. /datum/mob_hud/proc/remove_from_single_hud(mob/user, mob/target) if(!user.client) return @@ -63,7 +64,7 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( if(target.clone) user.client.images -= target.clone.hud_list[i] -// Allow user to view a HUD (putting on medical glasses) +/// Allow user to view a HUD (e.g. putting on medical glasses) /datum/mob_hud/proc/add_hud_to(mob/user, source) hudusers |= user if(hudusers[user]) @@ -85,7 +86,7 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( for(var/mob/target in hudmobs) add_to_single_hud(user, target) -// "Enroll" a target into the HUD. (let others see the HUD on target) +/// "Enroll" a target into the HUD. (let others see the HUD on target) /datum/mob_hud/proc/add_to_hud(mob/target) hudmobs |= target for(var/mob/user in hudusers) @@ -210,9 +211,15 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( /datum/mob_hud/faction/wy faction_to_check = FACTION_WY +/datum/mob_hud/faction/hyperdyne + faction_to_check = FACTION_HYPERDYNE + /datum/mob_hud/faction/twe faction_to_check = FACTION_TWE +/datum/mob_hud/faction/iasf + faction_to_check = FACTION_IASF + /datum/mob_hud/faction/clf faction_to_check = FACTION_CLF @@ -225,12 +232,18 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( /datum/mob_hud/faction/nspa faction_to_check = FACTION_NSPA +/datum/mob_hud/faction/pap + faction_to_check = FACTION_PAP + /datum/mob_hud/faction/cmb faction_to_check = FACTION_MARSHAL /datum/mob_hud/faction/observer hud_icons = list(FACTION_HUD, ORDER_HUD, HUNTER_CLAN, HOLOCARD_HUD) +/datum/mob_hud/spy_cams + hud_icons = list(SPYCAM_HUD) + ///////// MOB PROCS //////////////////////////////: @@ -245,14 +258,17 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( for(var/datum/mob_hud/hud in GLOB.huds) if(istype(hud, /datum/mob_hud/xeno)) //this one is xeno only continue + if(istype(hud, /datum/mob_hud/faction)) + // Only add to a faction hud if we are that faction + var/datum/mob_hud/faction/faction_hud = hud + if(faction_hud.faction_to_check != faction) + continue hud.add_to_hud(src) hud_set_new_player() /mob/living/carbon/xenomorph/add_to_all_mob_huds() - for(var/datum/mob_hud/hud in GLOB.huds) - if(!istype(hud, /datum/mob_hud/xeno)) - continue - hud.add_to_hud(src) + var/datum/mob_hud/hud = GLOB.huds[MOB_HUD_XENO_STATUS] + hud.add_to_hud(src) /mob/proc/remove_from_all_mob_huds() @@ -461,7 +477,7 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( if(stat == DEAD || status_flags & FAKEDEATH) if(revive_enabled) - if(!client) + if(!client && !(status_flags & FAKESOUL)) var/mob/dead/observer/G = get_ghost(FALSE, TRUE) if(!G) holder.icon_state = "huddeaddnr" @@ -529,6 +545,13 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( for(var/obj/effect/alien/resin/marker/i in hive.resin_marks) client.images |= i.seenMeaning +/mob/living/carbon/xenomorph/proc/hud_set_design_marks() + if(!client) + return + for(var/obj/effect/alien/resin/design/des in hive.designer_marks) + if(des.choosenMark) + client.images |= des.choosenMark + /mob/living/carbon/xenomorph/proc/hud_set_plasma() var/image/holder = hud_list[PLASMA_HUD] if(stat == DEAD || plasma_max == 0) @@ -682,9 +705,12 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( holder.icon_state = "hudblank" holder.overlays.Cut() - if(mob_flags & MUTINEER) - holder.overlays += image('icons/mob/hud/marine_hud.dmi', src, "hudmutineer") - return + if(mob_flags & MUTINY_MUTINEER) + holder.overlays += image('icons/mob/hud/marine_hud.dmi', src, "hudmutineer", pixel_y = 12) + else if(mob_flags & MUTINY_LOYALIST) + holder.overlays += image('icons/mob/hud/marine_hud.dmi', src, "hudloyalist", pixel_y = 12) + else if(mob_flags & MUTINY_NONCOMBAT) + holder.overlays += image('icons/mob/hud/marine_hud.dmi', src, "hudnoncombat", pixel_y = 9) hud_set_new_player() F.modify_hud_holder(holder, src) @@ -693,8 +719,13 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( set waitfor = FALSE var/image/holder = hud_list[HUNTER_CLAN] + var/new_icon_state = "predhud" + if(client?.check_whitelist_status(WHITELIST_YAUTJA_LEADER)) + new_icon_state = "leaderhud" + else if(client?.check_whitelist_status(WHITELIST_YAUTJA_COUNCIL)) + new_icon_state = "councilhud" - holder.icon_state = "predhud" + holder.icon_state = new_icon_state if(client && client.clan_info && client.clan_info.clan_id) var/datum/entity/clan/player_clan = GET_CLAN(client.clan_info.clan_id) @@ -778,6 +809,7 @@ GLOBAL_DATUM_INIT(hud_icon_hudfocus, /image, image('icons/mob/hud/marine_hud.dmi /mob/living/carbon/human/hud_set_holocard() var/image/holder = hud_list[HOLOCARD_HUD] holder.icon_state = holo_card_color ? "holo_card_[holo_card_color]" : "hudblank" + SEND_SIGNAL(src, COMSIG_HUMAN_TRIAGE_CARD_UPDATED) // Vampire Execute HUD /mob/living/carbon/human/proc/update_execute_hud() diff --git a/code/datums/origin/cmb.dm b/code/datums/origin/cmb.dm new file mode 100644 index 000000000000..4e9987d1c5d9 --- /dev/null +++ b/code/datums/origin/cmb.dm @@ -0,0 +1,3 @@ +/datum/origin/cmb + name = ORIGIN_CMB + desc = "You were born on a United Americas affiliated colony and decided to join their Federal Investigative organization called the Colonial Marshals Bureau." diff --git a/code/datums/origin/twe.dm b/code/datums/origin/twe.dm new file mode 100644 index 000000000000..56c389a6172a --- /dev/null +++ b/code/datums/origin/twe.dm @@ -0,0 +1,3 @@ +/datum/origin/twe + name = ORIGIN_TWE + desc = "You were born in the Three World Empire, on one of their colonies." diff --git a/code/datums/origin/wy.dm b/code/datums/origin/wy.dm new file mode 100644 index 000000000000..0863571c53a8 --- /dev/null +++ b/code/datums/origin/wy.dm @@ -0,0 +1,11 @@ +/datum/origin/wy + name = ORIGIN_WY + desc = "You were born on a Weyland-Yutani colony and have decided to work your way towards the corporate ladder." + +/datum/origin/wy/sec + name = ORIGIN_WY_SEC + desc = "You were born on a Weyland-Yutani colony. You didn't have many choices so you joined their lowly security force." + +/datum/origin/wy/pmc + name = ORIGIN_WY_PMC + desc = "You were born on a Weyland-Yutani colony and joined the USCM, you were one of the best and were honorably discharged. Weyland-Yutani noticed your achievements and offered you a contract to join the PMCs. You happily accepted." diff --git a/code/datums/paygrades/factions/twe/twe.dm b/code/datums/paygrades/factions/twe/twe.dm index b03c4e0379a2..bffe157f3108 100644 --- a/code/datums/paygrades/factions/twe/twe.dm +++ b/code/datums/paygrades/factions/twe/twe.dm @@ -119,106 +119,106 @@ pay_multiplier = 9 officer_grade = GRADE_FLAG -///IASF Enlisted +/// IASF Enlisted /datum/paygrade/twe/iasf/e1 paygrade = PAY_SHORT_IASFE1 - name = "Nito Rikushi" - prefix = "Nt-Shi." + name = "Private" + prefix = "Pte." /datum/paygrade/twe/iasf/e2 paygrade = PAY_SHORT_IASFE2 - name = "Itto rikushi " - prefix = "It-Shi." + name = "Private Second Class" + prefix = "Pte2." pay_multiplier = 2.1 /datum/paygrade/twe/iasf/e3 paygrade = PAY_SHORT_IASFE3 - name = "Rikushicho" - prefix = "Shi." + name = "Lance Corporal" + prefix = "LCpl." pay_multiplier = 2.2 /datum/paygrade/twe/iasf/e4 paygrade = PAY_SHORT_IASFE4 - name = "Santo rikuso" - prefix = "St-Rik." + name = "Corporal" + prefix = "Cpl." pay_multiplier = 2.3 /datum/paygrade/twe/iasf/e5 paygrade = PAY_SHORT_IASFE5 - name = "Nito rikuso" - prefix = "Nt-Rik." + name = "Sergeant" + prefix = "Sgt." pay_multiplier = 2.7 -/datum/paygrade/twe/e6 +/datum/paygrade/twe/iasf/e6 paygrade = PAY_SHORT_IASFE6 - name = "Itto rikuso" - prefix = "It-Rik." + name = "Staff Sergeant" + prefix = "SSgt." pay_multiplier = 2.7 -/datum/paygrade/twe/e7 +/datum/paygrade/twe/iasf/e7 paygrade = PAY_SHORT_IASFE7 - name = "Rikusocho " - prefix = "Rik." + name = "Warrant Officer Class 2" + prefix = "WO2." pay_multiplier = 2.7 - -///IASF officer +/// IASF Officer /datum/paygrade/twe/iasf/o1 paygrade = PAY_SHORT_IASFO1 - name = "Santo Kaii" - prefix = "St-Wei." + name = "Second Lieutenant" + prefix = "2Lt." /datum/paygrade/twe/iasf/o2 paygrade = PAY_SHORT_IASFO2 - name = "Nito Kaii" - prefix = "Nt-Wei." + name = "Lieutenant" + prefix = "Lt." pay_multiplier = 2.1 /datum/paygrade/twe/iasf/o3 paygrade = PAY_SHORT_IASFO3 - name = "Itto Kaii" - prefix = "It-Wei." + name = "Captain" + prefix = "Capt." pay_multiplier = 2.2 /datum/paygrade/twe/iasf/o4 paygrade = PAY_SHORT_IASFO4 - name = "Santo Kaisa" - prefix = "St-Sa." + name = "Major" + prefix = "Maj." pay_multiplier = 2.3 /datum/paygrade/twe/iasf/o5 paygrade = PAY_SHORT_IASFO5 - name = "Nito Kaisa" - prefix = "Nt-Sa." + name = "Lieutenant Colonel" + prefix = "LtCol." pay_multiplier = 2.7 /datum/paygrade/twe/iasf/o6 paygrade = PAY_SHORT_IASFO6 - name = "Itto Kaisa" - prefix = "It-Sa." + name = "Colonel" + prefix = "Col." pay_multiplier = 2.7 /datum/paygrade/twe/iasf/o7 paygrade = PAY_SHORT_IASFO7 - name = "Kaisho-ho" - prefix = "It-Sho." + name = "Brigadier" + prefix = "Brig." pay_multiplier = 2.7 /datum/paygrade/twe/iasf/o8 paygrade = PAY_SHORT_IASFO8 - name = "Kaisho" - prefix = "Sho." + name = "Major General" + prefix = "MajGen." pay_multiplier = 2.7 - /datum/paygrade/twe/iasf/o9 paygrade = PAY_SHORT_IASFO9 - name = "Bakuryōchō-taru-shō" - prefix = "Bt-Sho." + name = "General of the Brigade" + prefix = "GenBrig." pay_multiplier = 2.7 +// Misc + /datum/paygrade/twe/o10 paygrade = PAY_SHORT_EMP name = "Empress" diff --git a/code/datums/paygrades/factions/upp/pap.dm b/code/datums/paygrades/factions/upp/pap.dm new file mode 100644 index 000000000000..a9ef7f551b61 --- /dev/null +++ b/code/datums/paygrades/factions/upp/pap.dm @@ -0,0 +1,54 @@ +// PAP - (People's Armed Police) - UPP style Police, like the CMB but for heavy UPP focused colonies. + +/datum/paygrade/pap + name = "PaP Paygrade" + pay_multiplier = 0.2 + default_faction = FACTION_PAP + +/datum/paygrade/pap/militsiya + paygrade = PAY_SHORT_PAP_MLTS + name = "Militsioner" + prefix = "Milit." + pay_multiplier = 0.3 + +/datum/paygrade/pap/ml_sergeant + paygrade = PAY_SHORT_PAP_SMLTS + name = "Starshiy Militsioner" + prefix = "St. Mlts." + pay_multiplier = 0.4 + +/datum/paygrade/pap/ml_starshina + paygrade = PAY_SHORT_PAP_STRSH + name = "Starshina" + prefix = "Strsh." + pay_multiplier = 0.5 + +/datum/paygrade/pap/ml_lieutenant + paygrade = PAY_SHORT_PAP_LTN + name = "Leytenant Militsii" + prefix = "Ltn." + pay_multiplier = 0.6 + +/datum/paygrade/pap/ml_captain + paygrade = PAY_SHORT_PAP_KPTN + name = "Kapitan Militsii" + prefix = "Kptn." + pay_multiplier = 0.7 + +/datum/paygrade/pap/ml_major + paygrade = PAY_SHORT_PAP_MYR + name = "Mayor Militsii" + prefix = "Myr." + pay_multiplier = 0.8 + +/datum/paygrade/pap/ml_commissar + paygrade = PAY_SHORT_PAP_PLTK + name = "Politkomissar" + prefix = "Pltk." + pay_multiplier = 0.75 + +/datum/paygrade/pap/ml_colonel + paygrade = PAY_SHORT_PAP_PLKV + name = "Polkovnik Militsii" + prefix = "Plkv." + pay_multiplier = 0.9 diff --git a/code/datums/paygrades/factions/wy/commando.dm b/code/datums/paygrades/factions/wy/commando.dm new file mode 100644 index 000000000000..6ba55bf93b80 --- /dev/null +++ b/code/datums/paygrades/factions/wy/commando.dm @@ -0,0 +1,28 @@ +/datum/paygrade/pmc_commando + name = "PMC Commando Paygrade" + pay_multiplier = 5 + default_faction = FACTION_PMC + fprefix = "WYCDO." + +/datum/paygrade/pmc_commando/standard + paygrade = PAY_SHORT_WY_COM + name = "Corporate Commando" + prefix = "OPR." + +/datum/paygrade/pmc_commando/gunner + paygrade = PAY_SHORT_WY_GUN + name = "Corporate Commando Gunner" + prefix = "GNR." + pay_multiplier = 6 + +/datum/paygrade/pmc_commando/dog_catcher + paygrade = PAY_SHORT_WY_DOG + name = "Corporate Commando Dog Catcher" + prefix = "DC." + pay_multiplier = 7 + +/datum/paygrade/pmc_commando/leader + paygrade = PAY_SHORT_WY_COMLD + name = "Corporate Commando Leader" + prefix = "TML." + pay_multiplier = 8 diff --git a/code/datums/paygrades/factions/wy/pmc.dm b/code/datums/paygrades/factions/wy/pmc.dm index b6acf2864578..0e83b87ee850 100644 --- a/code/datums/paygrades/factions/wy/pmc.dm +++ b/code/datums/paygrades/factions/wy/pmc.dm @@ -41,12 +41,11 @@ prefix = "SPW." pay_multiplier = 3 -/datum/paygrade/pmc/handler - paygrade = PAY_SHORT_PMC_XS - name = "Xeno Specialist" - prefix = "SPX." +/datum/paygrade/pmc/crowd_control + paygrade = PAY_SHORT_PMC_CCS + name = "Crowd Control Specialist" + prefix = "SPCC." pay_multiplier = 4 - officer_grade = GRADE_OFFICER //PMC Support Staff /datum/paygrade/pmc/doctor @@ -62,28 +61,6 @@ prefix = "TEC." pay_multiplier = 4 -//PMC Elite -/datum/paygrade/pmc/elite - paygrade = PAY_SHORT_PMC_ELR - name = "Elite Responder" - prefix = "ELR." - pay_multiplier = 4 - officer_grade = GRADE_OFFICER - -/datum/paygrade/pmc/medic/elite - paygrade = PAY_SHORT_PMC_ELM - name = "Elite Medic" - prefix = "ELM." - pay_multiplier = 4.5 - officer_grade = GRADE_OFFICER - -/datum/paygrade/pmc/spec/elite - paygrade = PAY_SHORT_PMC_ELG - name = "Elite Gunner" - prefix = "ELG." - pay_multiplier = 5 - officer_grade = GRADE_OFFICER - //PMC Command /datum/paygrade/pmc/teamlead paygrade = PAY_SHORT_PMC_TL @@ -92,13 +69,6 @@ pay_multiplier = 3.5 officer_grade = GRADE_OFFICER -/datum/paygrade/pmc/elitelead - paygrade = PAY_SHORT_PMC_ETL - name = "Elite Team Leader" - prefix = "ETML." - pay_multiplier = 5.5 - officer_grade = GRADE_OFFICER - /datum/paygrade/pmc/director paygrade = PAY_SHORT_PMC_DIR name = "Site Director" diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index cd277054d1a4..7ed2c5e2e2de 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -996,8 +996,8 @@ /datum/recipe/sausage items = list( - /obj/item/reagent_container/food/snacks/meatball, - /obj/item/reagent_container/food/snacks/cutlet, + /obj/item/reagent_container/food/snacks/rawmeatball, + /obj/item/reagent_container/food/snacks/rawcutlet, ) result = /obj/item/reagent_container/food/snacks/sausage diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm index 1dbc2ec3e9cb..216388bbfed6 100644 --- a/code/datums/skills/civilian.dm +++ b/code/datums/skills/civilian.dm @@ -182,6 +182,22 @@ CIVILIAN SKILL_JTAC = SKILL_JTAC_TRAINED, ) +/datum/skills/civilian/survivor/pmc/commando + name = "Survivor W-Y Commando" + additional_skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + ) + /datum/skills/civilian/survivor/doctor name = "Survivor Doctor" additional_skills = list( @@ -195,8 +211,68 @@ CIVILIAN additional_skills = list( SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + ) + +/datum/skills/civilian/survivor/clf/combat_engineer + name = "Survivor CLF Engineer" + additional_skills = list( + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/civilian/survivor/clf/combat_medic + name = "Survivor CLF Medic" + additional_skills = list( + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/civilian/survivor/clf/leader + name = "Survivor CLF Leader" + additional_skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, // to use their C4 + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + ) + +/datum/skills/civilian/survivor/clf/coordinator + name = "Survivor CLF Coordinator" + additional_skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, ) /datum/skills/civilian/survivor/scientist @@ -321,6 +397,15 @@ CIVILIAN SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, ) +/datum/skills/civilian/survivor/uscm_recruiter + name = "Survivor USCM Recruiter" + additional_skills = list( + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + ) + /datum/skills/civilian/fax_responder name = "Comms Relay Worker" //Used for fax responder presets, allowing use of appropriate HUDs and basics. skills = list( diff --git a/code/datums/skills/clf.dm b/code/datums/skills/clf.dm index 64a8864d3c51..e0ac64d61941 100644 --- a/code/datums/skills/clf.dm +++ b/code/datums/skills/clf.dm @@ -92,3 +92,21 @@ COLONIAL LIBERATION FRONT SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, ) + +/datum/skills/clf/coordinator + name = "CLF Coordinator" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) diff --git a/code/datums/skills/cmb.dm b/code/datums/skills/cmb.dm index 4c3d751a25bb..97f2cc64d77f 100644 --- a/code/datums/skills/cmb.dm +++ b/code/datums/skills/cmb.dm @@ -102,3 +102,22 @@ COLONIAL MARSHALS SKILL_INTEL = SKILL_INTEL_EXPERT, SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER ) + + +/datum/skills/cmb/co_survivor // CMB CO Survivor for Solaris Ridge + name = "CMB Marshal" + skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) diff --git a/code/datums/skills/iasf.dm b/code/datums/skills/iasf.dm new file mode 100644 index 000000000000..3abdd71ed6bd --- /dev/null +++ b/code/datums/skills/iasf.dm @@ -0,0 +1,226 @@ +/* +---------------------------- +IASF - Paratrooper +---------------------------- +*/ + +//NOTE: Skills take heavy from PMCs + + +/datum/skills/iasf + name = "IASF - Paratrooper" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_SURGERY = SKILL_SURGERY_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/iasf/specialist + name = "IASF - Paratrooper - Specialist" // Not used in inserts. + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_SURGERY = SKILL_SURGERY_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/iasf/pilot + name = "IASF - Paratrooper - Pilot" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_SURGERY = SKILL_SURGERY_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_PILOT = SKILL_PILOT_EXPERT, + ) + +/datum/skills/iasf/engi + name = "IASF - Paratrooper - Engineer" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_SURGERY = SKILL_SURGERY_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/iasf/smartgun + name = "IASF - Paratrooper - Smartgunner" // Not used in inserts. + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_SURGERY = SKILL_SURGERY_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/iasf/medic + name = "IASF - Paratrooper - Medic" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/iasf/leader + name = "IASF - Paratrooper - Squad Leader" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_SURGERY = SKILL_SURGERY_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/iasf/lieutenant + name = "IASF - Paratrooper - Officer" // Not used in inserts. + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + ) + +/datum/skills/iasf/captain + name = "IASF - Paratrooper - Captain" // Not used in inserts. + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + ) + +/datum/skills/iasf/major + name = "IASF - Paratrooper - Major" // Not used in inserts. + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + ) + +/datum/skills/iasf/commander + name = "IASF - Paratrooper - Commanding Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, //can change ship alt + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + ) diff --git a/code/datums/skills/pmc.dm b/code/datums/skills/pmc.dm index 1860157c0a54..10b4cde80289 100644 --- a/code/datums/skills/pmc.dm +++ b/code/datums/skills/pmc.dm @@ -169,3 +169,75 @@ Private Military Contractors SKILL_JTAC = SKILL_JTAC_MASTER, SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, ) + +/datum/skills/pmc/commando + name = "W-Y Commando" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/pmc/commando/gunner + name = "W-Y Commando Smartgunner" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/pmc/commando/dogcatcher + name = "W-Y Commando Dog Catcher" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/pmc/commando/leader + name = "W-Y Commando Leader" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) diff --git a/code/datums/skills/rmc.dm b/code/datums/skills/rmc.dm index 88b5d57c614c..4a7f96857fcb 100644 --- a/code/datums/skills/rmc.dm +++ b/code/datums/skills/rmc.dm @@ -40,6 +40,24 @@ Royal Marines Commando SKILL_VEHICLE = SKILL_VEHICLE_SMALL, ) +/datum/skills/rmc/pilot + name = "Royal Marines Commando Pilot" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_PILOT = SKILL_PILOT_EXPERT, + ) + /datum/skills/rmc/breacher name = "Royal Marines Commando Breacher" skills = list( diff --git a/code/datums/skills/synthetic.dm b/code/datums/skills/synthetic.dm index 0c627edad8d2..023f1d27530b 100644 --- a/code/datums/skills/synthetic.dm +++ b/code/datums/skills/synthetic.dm @@ -54,9 +54,10 @@ SYNTHETIC /datum/skills/working_joe name = SYNTH_WORKING_JOE skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_CQC = SKILL_CQC_MASTER, //They are supposed to be kinda robust SKILL_ENGINEER = SKILL_ENGINEER_MASTER, //So they can fully use the Maintenance Jack - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, @@ -64,6 +65,21 @@ SYNTHETIC SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, ) +/datum/skills/dzho_automaton + name = SYNTH_UPP_JOE + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, //They are supposed to be kinda robust + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, //So they can fully use the Maintenance Jack + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, //literally Fighting Joe + SKILL_FIREMAN = SKILL_FIREMAN_MASTER, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_MAX, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + ) + /datum/skills/infiltrator_synthetic name = SYNTH_INFILTRATOR skills = list( diff --git a/code/datums/skills/upp.dm b/code/datums/skills/upp.dm index c292251b9ab9..f3e8fa8190f0 100644 --- a/code/datums/skills/upp.dm +++ b/code/datums/skills/upp.dm @@ -179,6 +179,7 @@ UNITED PROGRESSIVE PEOPLES SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, @@ -229,9 +230,26 @@ UNITED PROGRESSIVE PEOPLES SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + ) + +/datum/skills/military/survivor/upp_spec/rocket + name = "UPP Specialist" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ROCKET, ) /datum/skills/military/survivor/upp_sl diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm index 9d5e5923adcf..1ef06004a1c3 100644 --- a/code/datums/skills/uscm.dm +++ b/code/datums/skills/uscm.dm @@ -118,6 +118,7 @@ MILITARY NONCOMBATANT /datum/skills/nurse name = "Nurse" skills = list( + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, SKILL_SURGERY = SKILL_SURGERY_NOVICE, @@ -411,6 +412,7 @@ COMMAND STAFF SKILL_POLICE = SKILL_POLICE_FLASH, SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, ) /datum/skills/CE @@ -545,4 +547,5 @@ CIA SKILL_INTEL = SKILL_INTEL_EXPERT, SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_ANTAG = SKILL_ANTAG_AGENT, ) diff --git a/code/datums/soundOutput.dm b/code/datums/soundOutput.dm index 480d5f63a3f3..073d1ec35cb9 100644 --- a/code/datums/soundOutput.dm +++ b/code/datums/soundOutput.dm @@ -45,7 +45,7 @@ S.falloff /= 2 owner_turf = candidate S.x = T.x - owner_turf.x - S.y = T.z - owner_turf.z + S.y = (T.z - owner_turf.z) * 5 S.z = T.y - owner_turf.y S.y += T.y_s_offset S.x += T.x_s_offset @@ -199,18 +199,18 @@ S.status = SOUND_UPDATE sound_to(src, S) -/client/verb/adjust_volume_sfx() +CLIENT_VERB(adjust_volume_sfx) set name = "Adjust Volume SFX" set category = "Preferences.Sound" adjust_volume_prefs(VOLUME_SFX, "Set the volume for sound effects", 0) -/client/verb/adjust_volume_ambience() +CLIENT_VERB(adjust_volume_ambience) set name = "Adjust Volume Ambience" set category = "Preferences.Sound" adjust_volume_prefs(VOLUME_AMB, "Set the volume for ambience and soundscapes", 0) soundOutput.update_ambience(null, null, TRUE) -/client/verb/adjust_volume_lobby_music() +CLIENT_VERB(adjust_volume_lobby_music) set name = "Adjust Volume LobbyMusic" set category = "Preferences.Sound" adjust_volume_prefs(VOLUME_LOBBY, "Set the volume for Lobby Music", SOUND_CHANNEL_LOBBY) diff --git a/code/datums/statistics/entities/death_stats.dm b/code/datums/statistics/entities/death_stats.dm index de2d9cc71526..170ca24a24df 100644 --- a/code/datums/statistics/entities/death_stats.dm +++ b/code/datums/statistics/entities/death_stats.dm @@ -140,7 +140,6 @@ GLOB.round_statistics.track_death(new_death) new_death.save() - new_death.detach() return new_death /mob/living/carbon/human/track_mob_death(datum/cause_data/cause_data, turf/death_loc) diff --git a/code/datums/statistics/random_facts/christmas_fact.dm b/code/datums/statistics/random_facts/christmas_fact.dm index 7050efef4325..7e849acf06d1 100644 --- a/code/datums/statistics/random_facts/christmas_fact.dm +++ b/code/datums/statistics/random_facts/christmas_fact.dm @@ -1,17 +1,40 @@ -/datum/random_fact/christmas/announce() +// Leaderboard stat for festivizer_hits_total_max +// Normally includes dead always but can disable by setting prob_check_dead to 0 + +/datum/random_fact/christmas + role_filter = null + +/datum/random_fact/christmas/life_grab_stat(mob/fact_mob) + return fact_mob.festivizer_hits_total + +/datum/random_fact/christmas/generate_announcement_message() + if(!check_xeno && !check_human) + return null + var/festivizer_hits_total_max = 0 var/mob/mob_to_report = null var/list/list_to_check = list() - list_to_check += GLOB.living_mob_list - list_to_check += GLOB.dead_mob_list + if(check_human) + if(prob_check_dead > 0) + list_to_check += GLOB.human_mob_list + else + list_to_check += GLOB.alive_human_list + if(check_xeno) + if(prob_check_dead > 0) + list_to_check += GLOB.xeno_mob_list + else + list_to_check += GLOB.living_xeno_list + for(var/mob/checked_mob as anything in list_to_check) - if(festivizer_hits_total_max < checked_mob.festivizer_hits_total) + if(check_mob_ignored(checked_mob)) + continue + if(festivizer_hits_total_max < checked_mob.festivizer_hits_total && (checked_mob.persistent_ckey in GLOB.directory)) mob_to_report = checked_mob - festivizer_hits_total_max = checked_mob.festivizer_hits_total + festivizer_hits_total_max = life_grab_stat(checked_mob) - if(!mob_to_report || !festivizer_hits_total_max) - return + if(!mob_to_report || festivizer_hits_total_max < min_required) + return null var/name = mob_to_report.real_name var/additional_message @@ -27,6 +50,4 @@ else additional_message = "[name] is the VERY SPIRIT of CHRISTMAS!!!" - message = "[name] festivized a grand total of [festivizer_hits_total_max] objects! [additional_message]" - - return ..() + return "[name] festivized a grand total of [festivizer_hits_total_max] objects! [additional_message]" diff --git a/code/datums/statistics/random_facts/kills_fact.dm b/code/datums/statistics/random_facts/kills_fact.dm index 7ef1c2b238de..4b43b0b193bf 100644 --- a/code/datums/statistics/random_facts/kills_fact.dm +++ b/code/datums/statistics/random_facts/kills_fact.dm @@ -1,6 +1,8 @@ /datum/random_fact/kills statistic_name = "kills" statistic_verb = "earned" + role_filter = list(XENO_CASTE_FACEHUGGER, XENO_CASTE_LESSER_DRONE, XENO_CASTE_LARVA, XENO_CASTE_PREDALIEN_LARVA) + role_filter_blacklist = TRUE /datum/random_fact/kills/life_grab_stat(mob/fact_mob) return fact_mob.life_kills_total diff --git a/code/datums/statistics/random_facts/random_fact.dm b/code/datums/statistics/random_facts/random_fact.dm index d327bd36f4f6..1f5a1f073367 100644 --- a/code/datums/statistics/random_facts/random_fact.dm +++ b/code/datums/statistics/random_facts/random_fact.dm @@ -1,86 +1,161 @@ +/// How many facts per faction (marine/xeno) to announce +#define MAX_FACTION_FACTS_TO_ANNOUNCE 5 + /datum/random_fact - var/message = null + /// The noun for this statistic in the announcement var/statistic_name = null + /// The verb for this statistic in the announcement var/statistic_verb = null - + /// Whether this statistic can apply to humans var/check_human = TRUE + /// Whether this statistic can apply to xenos var/check_xeno = TRUE + /// The prob dead are checked for this statistic + var/prob_check_dead = 50 + /// The min stat required to be noted + var/min_required = 1 + /// Any factions to filter for this statistic + var/list/faction_filter = list("Tutorial Hive") + /// Whether the faction_filter is a blacklist (otherwise whitelist) + var/list/faction_filter_blacklist = TRUE + /// Any roles to filter for this statistic + var/list/role_filter = list(XENO_CASTE_FACEHUGGER, XENO_CASTE_LESSER_DRONE) + /// Whether the role_filter is a blacklist (otherwise whitelist) + var/list/role_filter_blacklist = TRUE -/datum/random_fact/New(set_check_human = TRUE, set_check_xeno = TRUE) +/datum/random_fact/New(check_human=TRUE, check_xeno=TRUE) . = ..() - check_human = set_check_human - check_xeno = set_check_xeno + src.check_human = initial(src.check_human) && check_human + src.check_xeno = initial(src.check_human) && check_xeno +/// Announces this random_fact to world if possible (returns TRUE if sent) /datum/random_fact/proc/announce() - calculate_announcement_message() + var/message = generate_announcement_message() if(message) to_world(SPAN_CENTERBOLD(message)) return TRUE return FALSE -/datum/random_fact/proc/calculate_announcement_message() - var/death_stat_gotten = 0 - var/living_stat_gotten = 0 - var/datum/entity/statistic/death/death_to_report = null - var/mob/mob_to_report = null +/// Returns TRUE if the provided datum/entity/statistic/death is ignored via faction/role filters +/datum/random_fact/proc/check_death_ignored(datum/entity/statistic/death/entry) + if(entry.faction_name in faction_filter) + if(faction_filter_blacklist) + return TRUE + else if(!faction_filter_blacklist) + return TRUE + + if(entry.role_name in role_filter) + if(role_filter_blacklist) + return TRUE + else if(!role_filter_blacklist) + return TRUE + + return FALSE + +/// Returns TRUE if the provided mob is ignored via faction/role filters +/datum/random_fact/proc/check_mob_ignored(mob/target) + if(target.faction in faction_filter) + if(faction_filter_blacklist) + return TRUE + else if(!faction_filter_blacklist) + return TRUE + + if(target.get_role_name() in role_filter) + if(role_filter_blacklist) + return TRUE + else if(!role_filter_blacklist) + return TRUE - if(GLOB.round_statistics && length(GLOB.round_statistics.death_stats_list)) - for(var/datum/entity/statistic/death/death in GLOB.round_statistics.death_stats_list) - if(!check_human && !death.is_xeno) + return FALSE + +/// Returns the /datum/entity/statistic/death for a random still connected player that has min_required for this stat +/datum/random_fact/proc/find_death_to_report() + RETURN_TYPE(/datum/entity/statistic/death) + + if(!GLOB.round_statistics) + return null + if(!length(GLOB.round_statistics.death_stats_list)) + return null + + var/list/list_to_check = shuffle(GLOB.round_statistics.death_stats_list) + for(var/datum/entity/statistic/death/death as anything in list_to_check) + if(death.is_xeno) + if(!check_xeno) continue - if(!check_xeno && death.is_xeno) + else + if(!check_human) continue - if(death_stat_gotten < death_grab_stat(death)) - death_to_report = death - death_stat_gotten = death_grab_stat(death) + if(check_death_ignored(death)) + continue + var/datum/entity/player/player_record = DB_ENTITY(/datum/entity/player, death.player_id) + if(!player_record) + debug_log("/datum/entity/player lookup failed for '[death.player_id]' during [type]'s find_death_to_report") + continue + if(!(player_record.ckey in GLOB.directory)) + continue // Not connected anymore + if(death_grab_stat(death) >= min_required) + return death // Success + +/// Returns the /mob/living/carbon for a random still connected player that has min_required for this stat +/datum/random_fact/proc/find_living_to_report() + RETURN_TYPE(/mob/living/carbon) var/list/list_to_check = list() if(check_human) list_to_check += GLOB.alive_human_list if(check_xeno) list_to_check += GLOB.living_xeno_list + list_to_check = shuffle(list_to_check) - for(var/mob/checked_mob as anything in list_to_check) - if(!checked_mob?.persistent_ckey) - continue // We don't care about NPCs - if(living_stat_gotten < life_grab_stat(checked_mob)) - mob_to_report = checked_mob - living_stat_gotten = life_grab_stat(checked_mob) + for(var/mob/living/carbon/checked_mob as anything in list_to_check) + if(check_mob_ignored(checked_mob)) + continue + if(!(checked_mob.persistent_ckey in GLOB.directory)) + continue // We don't care about NPCs or people disconnected + if(life_grab_stat(checked_mob) >= min_required) + return checked_mob // Success + +/// Attempts to get a statistic to report on and returns the string of the message otherwise null if no one met requirements +/datum/random_fact/proc/generate_announcement_message() + if(!check_xeno && !check_human) + return null + + var/datum/entity/statistic/death/death_to_report = null + var/mob/mob_to_report = null + + var/dead_attempted = FALSE + if(prob(prob_check_dead)) + dead_attempted = TRUE + death_to_report = find_death_to_report() + if(!death_to_report && prob_check_dead < 100) + mob_to_report = find_living_to_report() + if(!mob_to_report && prob_check_dead > 0 && !dead_attempted) + death_to_report = find_death_to_report() if(!death_to_report && !mob_to_report) - return + return null var/name = "" var/stat_gotten = 0 var/additional_message = "" - if(death_to_report && mob_to_report) - if(living_stat_gotten > death_stat_gotten) - name = mob_to_report.real_name - stat_gotten = living_stat_gotten - additional_message = "and survived! Great work!" - else - name = death_to_report.mob_name - stat_gotten = death_stat_gotten - additional_message = "before dying" - if(death_to_report.cause_name) - additional_message += " to [death_to_report.cause_name]" - additional_message += ". Good work!" - else if(death_to_report) + if(death_to_report) name = death_to_report.mob_name - stat_gotten = death_stat_gotten + stat_gotten = death_grab_stat(death_to_report) additional_message = "before dying" if(death_to_report.cause_name) additional_message += " to [death_to_report.cause_name]" additional_message += ". Good work!" else name = mob_to_report.real_name - stat_gotten = living_stat_gotten + stat_gotten = life_grab_stat(mob_to_report) additional_message = "and survived! Great work!" - message = "[name] [statistic_verb] [stat_gotten] [statistic_name] [additional_message]" + return "[name] [statistic_verb] [stat_gotten] [statistic_name] [additional_message]" +/// Override this to specify what value on a mob to get for this statistic /datum/random_fact/proc/life_grab_stat(mob/fact_mob) return 0 +/// Override this to specify what value on a death to get for this statistic /datum/random_fact/proc/death_grab_stat(datum/entity/statistic/death/fact_death) return 0 diff --git a/code/datums/supply_packs/ammo.dm b/code/datums/supply_packs/ammo.dm index 4cb830f0576a..b0d92cfb5782 100644 --- a/code/datums/supply_packs/ammo.dm +++ b/code/datums/supply_packs/ammo.dm @@ -134,6 +134,16 @@ containername = "\improper M4RA AP magazines crate" group = "Ammo" +/datum/supply_packs/ammo_m4ra_mag_box_ext + name = "Magazine box (M4RA, 12x extended mags)" + contains = list( + /obj/item/ammo_box/magazine/m4ra/ext, + ) + cost = 30 + containertype = /obj/structure/closet/crate/ammo + containername = "\improper M4RA extended magazines crate" + group = "Ammo" + //------------------------For M44---------------- /datum/supply_packs/ammo_m44_mag_box @@ -230,16 +240,6 @@ containername = "\improper shotgun flechette crate" group = "Ammo" -/datum/supply_packs/ammo_shell_box_breaching - name = "Shell box (16g) (120x breaching shells)" - contains = list( - /obj/item/ammo_box/magazine/shotgun/light/breaching, - ) - cost = 40 - containertype = /obj/structure/closet/crate/ammo - containername = "\improper shotgun breaching crate" - group = "Ammo" - //------------------------For 88M4 ---------------- /datum/supply_packs/ammo_mod88_mag_box_ap @@ -296,17 +296,6 @@ containername = "\improper M41AE2 HPR holo-target magazines crate" group = "Ammo" -/datum/supply_packs/ammo_xm51 - contains = list( - /obj/item/ammo_magazine/rifle/xm51, - /obj/item/ammo_magazine/rifle/xm51, - /obj/item/ammo_magazine/shotgun/light/breaching, - ) - name = "XM51 Ammo (2x mags) (1x small breaching shell box)" - cost = 20 - containertype = /obj/structure/closet/crate/ammo - containername = "\improper XM51 ammo crate" - group = "Ammo" //------------------------For M10 Auto Pistol ---------------- @@ -533,3 +522,35 @@ containertype = /obj/structure/closet/crate/ammo containername = "\improper surplus ammo crate" group = "Ammo" + +//------------------------For L54---------------- + +/datum/supply_packs/ammo_l54_mag_box + name = "Magazine box (L54, 16x regular mags)" + contains = list( + /obj/item/ammo_box/magazine/l54, + ) + cost = 20 + containertype = /obj/structure/closet/crate/ammo + containername = "\improper L54 magazines crate" + group = "Ammo" + +/datum/supply_packs/ammo_l54_mag_box_ap + name = "Magazine box (L54, 16x AP mags)" + contains = list( + /obj/item/ammo_box/magazine/l54/ap, + ) + cost = 30 + containertype = /obj/structure/closet/crate/ammo + containername = "\improper L54 AP magazines crate" + group = "Ammo" + +/datum/supply_packs/ammo_l54_mag_box_hp + name = "Magazine box (L54, 16x HP mags)" + contains = list( + /obj/item/ammo_box/magazine/l54/hp, + ) + cost = 30 + containertype = /obj/structure/closet/crate/ammo + containername = "\improper L54 HP magazines crate" + group = "Ammo" diff --git a/code/datums/supply_packs/attachments.dm b/code/datums/supply_packs/attachments.dm index 1610dfa23f45..b2927749c839 100644 --- a/code/datums/supply_packs/attachments.dm +++ b/code/datums/supply_packs/attachments.dm @@ -214,9 +214,9 @@ /obj/item/attachable/stock/rifle, /obj/item/attachable/stock/rifle, /obj/item/attachable/stock/rifle, - /obj/item/attachable/stock/shotgun, - /obj/item/attachable/stock/shotgun, - /obj/item/attachable/stock/shotgun, + /obj/item/attachable/stock/synth/collapsible, + /obj/item/attachable/stock/synth/collapsible, + /obj/item/attachable/stock/synth/collapsible, /obj/item/attachable/stock/smg, /obj/item/attachable/stock/smg, /obj/item/attachable/stock/smg, @@ -259,10 +259,10 @@ /datum/supply_packs/stock_shotgun name = "shotgun stock attachment crate (x4)" contains = list( - /obj/item/attachable/stock/shotgun, - /obj/item/attachable/stock/shotgun, - /obj/item/attachable/stock/shotgun, - /obj/item/attachable/stock/shotgun, + /obj/item/attachable/stock/synth/collapsible, + /obj/item/attachable/stock/synth/collapsible, + /obj/item/attachable/stock/synth/collapsible, + /obj/item/attachable/stock/synth/collapsible, ) cost = 30 containertype = /obj/structure/closet/crate diff --git a/code/datums/supply_packs/black_market.dm b/code/datums/supply_packs/black_market.dm index 33a95baa3c16..8b06e8be927f 100644 --- a/code/datums/supply_packs/black_market.dm +++ b/code/datums/supply_packs/black_market.dm @@ -66,10 +66,10 @@ Non-USCM items, from CLF, UPP, colonies, etc. Mostly combat-related. /datum/supply_packs/contraband/seized/black_market_scanner name = "black market scanner crate" contains = list(/obj/item/device/black_market_scanner) - containername = "trash cart" + containername = "interesting wooden crate" dollar_cost = 5 crate_heat = 0 - containertype = /obj/structure/closet/crate/trashcart + containertype = /obj/structure/closet/coffin/woodencrate /datum/supply_packs/contraband/seized/confiscated_equipment name = "seized foreign equipment crate" @@ -83,10 +83,10 @@ Non-USCM items, from CLF, UPP, colonies, etc. Mostly combat-related. if(1) //pmc new /obj/item/clothing/under/marine/veteran/pmc(src) new /obj/item/clothing/head/helmet/marine/veteran/pmc(src) - new /obj/item/clothing/suit/storage/marine/veteran/pmc(src) - new /obj/item/clothing/gloves/marine/veteran/pmc(src) + new /obj/item/clothing/suit/storage/marine/veteran/pmc/light(src) + new /obj/item/clothing/gloves/marine/veteran(src) new /obj/item/clothing/mask/gas/pmc(src) - new /obj/item/storage/backpack/lightpack/five_slot(src) + new /obj/item/storage/backpack/pmc(src) if(2) //pizza new /obj/item/clothing/under/pizza(src) new /obj/item/clothing/head/soft/red(src) @@ -180,6 +180,19 @@ Additionally, weapons that are way too good to put in the basically-flavor black // Rifles +/datum/supply_packs/contraband/seized/ak4047 + name = "AK-4047 pulse assault rifle crate (x5 magazines included)" + contains = list( + /obj/item/weapon/gun/rifle/ak4047, + /obj/item/ammo_magazine/rifle/ak4047, + /obj/item/ammo_magazine/rifle/ak4047, + /obj/item/ammo_magazine/rifle/ak4047, + /obj/item/ammo_magazine/rifle/ak4047, + /obj/item/ammo_magazine/rifle/ak4047, + ) + dollar_cost = 20 + containertype = /obj/structure/largecrate/black_market + /datum/supply_packs/contraband/seized/m16 name = "M16 rifle crate (x4 magazines included)" contains = list( @@ -616,7 +629,7 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/toy/prize/deathripley, /obj/item/reagent_container/food/snacks/grown/ambrosiadeus, /obj/item/reagent_container/food/snacks/grown/ambrosiavulgaris, - /obj/item/clothing/accessory/horrible, + /obj/item/clothing/accessory/tie/horrible, /obj/item/toy/inflatable_duck, /obj/item/pamphlet/skill/powerloader, /obj/item/pamphlet/language/russian, @@ -680,7 +693,7 @@ USCM spare items, miscellaneous gear that's too niche and distant (or restricted /obj/item/weapon/baton/cattleprod, /obj/item/ammo_magazine/shotgun/beanbag, /obj/item/storage/box/packet/m15/rubber, - /obj/item/storage/box/guncase/m79, + /obj/item/storage/box/guncase/m85a1, /obj/item/clothing/head/helmet/marine/MP, /obj/item/prop/helmetgarb/riot_shield, ) @@ -768,6 +781,18 @@ USCM spare items, miscellaneous gear that's too niche and distant (or restricted contains = list(/obj/item/ammo_box/magazine/shotgun/upp/flechette) containertype = /obj/structure/largecrate/black_market +/datum/supply_packs/contraband/ammo/ak4047 + name = "Magazine box (AK-4047, 12x regular mags)" + dollar_cost = 40 + contains = list(/obj/item/ammo_box/magazine/ak4047) + containertype = /obj/structure/largecrate/black_market + +/datum/supply_packs/contraband/ammo/ak4047/ap + name = "Magazine box (AK-4047, 12x AP mags)" + dollar_cost = 80 + contains = list(/obj/item/ammo_box/magazine/ak4047/ap) + containertype = /obj/structure/largecrate/black_market + /datum/supply_packs/contraband/ammo/m16 name = "Magazine box (M16, 12x regular mags)" dollar_cost = 100 diff --git a/code/datums/supply_packs/explosives.dm b/code/datums/supply_packs/explosives.dm index f032d0f891b0..f459920d5f12 100644 --- a/code/datums/supply_packs/explosives.dm +++ b/code/datums/supply_packs/explosives.dm @@ -67,6 +67,21 @@ containername = "\improper plastic explosives crate (WARNING)" group = "Explosives" +/datum/supply_packs/brute_rockets + name = "M6H-BRUTE Breaching Rocket Crate (x6)" + contains = list( + /obj/item/ammo_magazine/rocket/brute, + /obj/item/ammo_magazine/rocket/brute, + /obj/item/ammo_magazine/rocket/brute, + /obj/item/ammo_magazine/rocket/brute, + /obj/item/ammo_magazine/rocket/brute, + /obj/item/ammo_magazine/rocket/brute, + ) + cost = 30 + containertype = /obj/structure/closet/crate/explosives + containername = "\improper M6H-BRUTE Breaching Rocket Crate (WARNING)" + group = "Explosives" + /datum/supply_packs/explosives_incendiary name = "M40 HIDP incendiary grenades crate (x6)" contains = list( diff --git a/code/datums/supply_packs/medical.dm b/code/datums/supply_packs/medical.dm index acfb9fe1793d..a0f2280bfb27 100644 --- a/code/datums/supply_packs/medical.dm +++ b/code/datums/supply_packs/medical.dm @@ -130,10 +130,10 @@ /datum/supply_packs/upgraded_medical_kits name = "upgraded medical equipment crate (x4)" contains = list( - /obj/item/storage/box/czsp/medic_upgraded_kits, - /obj/item/storage/box/czsp/medic_upgraded_kits, - /obj/item/storage/box/czsp/medic_upgraded_kits, - /obj/item/storage/box/czsp/medic_upgraded_kits, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, ) cost = 0 buyable = FALSE diff --git a/code/datums/supply_packs/operations.dm b/code/datums/supply_packs/operations.dm index fd715cddce95..cb7c2fe8d6bc 100644 --- a/code/datums/supply_packs/operations.dm +++ b/code/datums/supply_packs/operations.dm @@ -73,14 +73,20 @@ group = "Operations" /datum/supply_packs/nuclearbomb - name = "Decrypted Operational Nuke" + name = "Decrypted Operational Blockbuster" + contains = list( + /obj/item/book/manual/nuclear, + ) cost = 0 containertype = /obj/structure/machinery/nuclearbomb buyable = 0 group = "Operations" /datum/supply_packs/technuclearbomb - name = "Encrypted Operational Nuke" + name = "Encrypted Operational Blockbuster" + contains = list( + /obj/item/book/manual/nuclear, + ) cost = 0 containertype = /obj/structure/machinery/nuclearbomb/tech buyable = 0 diff --git a/code/datums/supply_packs/spec_ammo.dm b/code/datums/supply_packs/spec_ammo.dm index d9fbfa84c63e..4c479b80e973 100644 --- a/code/datums/supply_packs/spec_ammo.dm +++ b/code/datums/supply_packs/spec_ammo.dm @@ -176,6 +176,65 @@ containername = "M4RA Scout Impact Magazine Crate" group = "Weapons Specialist Ammo" +//SHARP + +/datum/supply_packs/ammo_grenadier_sharp_mix + name = "SHARP Operator Mixed Magazine Crate (explosive x2, flechette x2, incendiary x2)" + contains = list( + /obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/flechette, + /obj/item/ammo_magazine/rifle/sharp/flechette, + /obj/item/ammo_magazine/rifle/sharp/incendiary, + /obj/item/ammo_magazine/rifle/sharp/incendiary, + ) + cost = 40 + containertype = /obj/structure/closet/crate/ammo + containername = "SHARP Operator Mixed Magazine Crate" + group = "Weapons Specialist Ammo" + +/datum/supply_packs/ammo_grenadier_sharp_explosive + name = "SHARP Operator Explosive Magazine Crate (x5)" + contains = list( + /obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/explosive, + ) + cost = 30 + containertype = /obj/structure/closet/crate/ammo + containername = "SHARP Operator Explosive Magazine Crate" + group = "Weapons Specialist Ammo" + +/datum/supply_packs/ammo_grenadier_sharp_flechette + name = "SHARP Operator Flechette Magazine Crate (x5)" + contains = list( + /obj/item/ammo_magazine/rifle/sharp/flechette, + /obj/item/ammo_magazine/rifle/sharp/flechette, + /obj/item/ammo_magazine/rifle/sharp/flechette, + /obj/item/ammo_magazine/rifle/sharp/flechette, + /obj/item/ammo_magazine/rifle/sharp/flechette, + ) + cost = 30 + containertype = /obj/structure/closet/crate/ammo + containername = "SHARP Operator Flechette Magazine Crate" + group = "Weapons Specialist Ammo" + +/datum/supply_packs/ammo_grenadier_sharp_incendiary + name = "SHARP Operator incendiary Magazine Crate (x5)" + contains = list( + /obj/item/ammo_magazine/rifle/sharp/incendiary, + /obj/item/ammo_magazine/rifle/sharp/incendiary, + /obj/item/ammo_magazine/rifle/sharp/incendiary, + /obj/item/ammo_magazine/rifle/sharp/incendiary, + /obj/item/ammo_magazine/rifle/sharp/incendiary, + ) + cost = 30 + containertype = /obj/structure/closet/crate/ammo + containername = "SHARP Operator incendiary Magazine Crate" + group = "Weapons Specialist Ammo" + //M240-T /datum/supply_packs/ammo_pyro_mix diff --git a/code/datums/supply_packs/upp_medical.dm b/code/datums/supply_packs/upp_medical.dm index b1c577da23ff..8bb122570d40 100644 --- a/code/datums/supply_packs/upp_medical.dm +++ b/code/datums/supply_packs/upp_medical.dm @@ -130,10 +130,10 @@ /datum/supply_packs/upp/upgraded_medical_kits name = "UPP upgraded medical equipment crate (x4)" contains = list( - /obj/item/storage/box/czsp/medic_upgraded_kits, - /obj/item/storage/box/czsp/medic_upgraded_kits, - /obj/item/storage/box/czsp/medic_upgraded_kits, - /obj/item/storage/box/czsp/medic_upgraded_kits, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, ) cost = 0 buyable = FALSE diff --git a/code/datums/supply_packs/weapons.dm b/code/datums/supply_packs/weapons.dm index b7ca1fb489a7..377cc65f4fb1 100644 --- a/code/datums/supply_packs/weapons.dm +++ b/code/datums/supply_packs/weapons.dm @@ -32,14 +32,14 @@ group = "Weapons" /datum/supply_packs/grenade_launchers - name = "M79 Grenade Launcher Crate (x2 Guncases)" + name = "M85A1 Grenade Launcher Crate (x2 Guncases)" contains = list( - /obj/item/storage/box/guncase/m79, - /obj/item/storage/box/guncase/m79, + /obj/item/storage/box/guncase/m85a1, + /obj/item/storage/box/guncase/m85a1, ) cost = 40 containertype = /obj/structure/closet/crate/weapon - containername = "M79 grenade launcher crate" + containername = "M85A1 grenade launcher crate" group = "Weapons" /datum/supply_packs/mou53 @@ -53,17 +53,6 @@ containername = "MOU-53 Break Action Shotgun Crate" group = "Weapons" -/datum/supply_packs/xm51 - name = "XM51 Breaching Scattergun Crate (x2)" - contains = list( - /obj/item/storage/box/guncase/xm51, - /obj/item/storage/box/guncase/xm51, - ) - cost = 30 - containertype = /obj/structure/closet/crate/weapon - containername = "XM51 Breaching Scattergun Crate" - group = "Weapons" - /datum/supply_packs/smartpistol name = "SU-6 Smart Pistol Crate (x2)" contains = list( diff --git a/code/datums/tutorial/_tutorial.dm b/code/datums/tutorial/_tutorial.dm index a9a2d2aead8a..5e77adfc9b38 100644 --- a/code/datums/tutorial/_tutorial.dm +++ b/code/datums/tutorial/_tutorial.dm @@ -259,3 +259,9 @@ GLOBAL_LIST_EMPTY_TYPED(ongoing_tutorials, /datum/tutorial) mappath = "maps/tutorial/tutorial_7x7.dmm" width = 7 height = 7 + +/datum/map_template/tutorial/s15x10/hm + name = "Tutorial Zone (15x10) (HM Tutorial)" + mappath = "maps/tutorial/tutorial_15x10_hm.dmm" + width = 15 + height = 10 diff --git a/code/datums/tutorial/marine/hospital_corpsman_sandbox.dm b/code/datums/tutorial/marine/hospital_corpsman_sandbox.dm new file mode 100644 index 000000000000..cc41847bd5b0 --- /dev/null +++ b/code/datums/tutorial/marine/hospital_corpsman_sandbox.dm @@ -0,0 +1,634 @@ +/* Gameplay Phases */ +#define TUTORIAL_HM_PHASE_PREP 0 //! Prep time upon joining, time for players to gear up +#define TUTORIAL_HM_PHASE_MAIN 1 //! Regular round, locks the prep room, spawns up to 5 patients with injuries of any severity +#define TUTORIAL_HM_PHASE_RESUPPLY 2 //! Pauses gameplay, opens the prep room, and allows resupply time, happens at random +#define TUTORIAL_HM_PHASE_NIGHTMARE 3 //! Simulates a Mass-Casualty event, 3-5 patients with severe damage levels + +/// How quickly HM tutorial sandbox difficulty increases over time (and how likely a Mass-Cas becomes) +#define TUTORIAL_HM_DIFFICULTY_INCREASE (1/2) + +/* Injury Severity Levels */ +#define TUTORIAL_HM_INJURY_SEVERITY_BOOBOO 1.5 //! Boo-boos that take less than 5 seconds to fix +#define TUTORIAL_HM_INJURY_SEVERITY_MINOR 3 +#define TUTORIAL_HM_INJURY_SEVERITY_ROUTINE 4 //! Routine treatments, occasional IB, 1-2 fractures, moderate damage less than 200, minor ODs, eye damage ONLY +#define TUTORIAL_HM_INJURY_SEVERITY_SEVERE 5 //! Life-threatening injuries, organ damage, missing limbs, up to 250 damage, multiple fracs, low blood +#define TUTORIAL_HM_INJURY_SEVERITY_FATAL 6 //! Life-threatening injuries, organ damage, missing limbs, up to 300 damage, multiple fracs, low blood +#define TUTORIAL_HM_INJURY_SEVERITY_EXTREME 9 //! Fatal injuries, organ damage, missing limbs, up to 450 damage, multiple fracs, low blood +#define TUTORIAL_HM_INJURY_SEVERITY_MAXIMUM 12 //! No limit on injury types, damage ranging from 500-600, extremely rare outside of Mass-Cas events + +/* Tiers of patients to be encountered in harder difficulties, and their types of damage */ +#define PATIENT_TYPE_MUNDANE 1 +#define PATIENT_TYPE_ORGAN 2 +#define PATIENT_TYPE_TOXIN 3 + +/* Defines for the health_tasks_handler proc, tracking remaining complex injuries to be treated in a patient */ +#define INTERNAL_BLEEDING "IB" +#define SUTURE "suture" +#define FRACTURE "fracture" + +/datum/tutorial/marine/hospital_corpsman_sandbox + name = "Marine - Hospital Corpsman (Sandbox)" + desc = "Test your medical skills against an endless wave of wounded Marines!" + tutorial_id = "marine_hm_3" + required_tutorial = "marine_basic_1" + icon_state = "medic" + tutorial_template = /datum/map_template/tutorial/s15x10/hm + + /// holder for the CMO NPC + var/mob/living/carbon/human/CMO_npc + /// Current step of the tutorial we're at + var/stage = TUTORIAL_HM_PHASE_PREP + /// List of patient NPCs. Stored in relation to their end destination turf + var/list/mob/living/carbon/human/realistic_dummy/agents = list() + /// List of active dragging NPCs. Mobs on this list are ACTIVELY dragging a wounded marine + var/list/mob/living/carbon/human/dragging_agents = list() + /// List of ACTIVELY MOVING patient NPCs + var/list/mob/living/carbon/human/realistic_dummy/active_agents = list() + /// List of NPC inventory items that needs to be removed when they asked to leave + var/list/obj/item/clothing/suit/storage/marine/medium/cleanup = list() + /// Ref to any patient NPC actively moving + var/mob/living/carbon/human/realistic_dummy/active_agent + /// Ref to late-spawned patient NPC that has a chance to appear during a treatment phase + var/mob/living/carbon/human/realistic_dummy/booboo_agent + /// Ref to any dragging NPC, bringing a patient to the player + var/mob/living/carbon/human/dragging_agent + /// Spawn point for all NPCs except the CMO + var/turf/agent_spawn_location + /// List of injury severity levels in sequence + var/static/list/difficulties = list( + TUTORIAL_HM_INJURY_SEVERITY_BOOBOO, + TUTORIAL_HM_INJURY_SEVERITY_MINOR, + TUTORIAL_HM_INJURY_SEVERITY_ROUTINE, + TUTORIAL_HM_INJURY_SEVERITY_SEVERE, + TUTORIAL_HM_INJURY_SEVERITY_FATAL, + TUTORIAL_HM_INJURY_SEVERITY_EXTREME, + TUTORIAL_HM_INJURY_SEVERITY_MAXIMUM + ) + /// Max amount of patient NPCs per survival wave (NOT including booboo NPCs) + var/max_survival_agents = 3 + /// Min amount of patient NPCs per survival wave (NOT including booboo NPCs) + var/min_survival_agents = 1 + /// Current survival wave + var/survival_wave = 0 + /// Current survival wave difficulty (in terms of injury severity) + var/survival_difficulty = TUTORIAL_HM_INJURY_SEVERITY_BOOBOO + /// Holds a random timer per survival wave for a booboo agent to spawn + var/booboo_timer + /// Holds a timer which forces agents to stop processing movement, in case they are misbehaving + var/terminate_movement_timer + /// List of injuries on patient NPCs that must be treated before fully healed. Is only tested AFTER they pass 65% health + var/list/mob/living/carbon/human/realistic_dummy/agent_healing_tasks = list() + /// Wave number when the last resupply phase triggered. Will wait 3 waves before rolling again + var/last_resupply_round = 1 + /// Wave number when the last mass-casualty (nightmare) phase triggered. Will wait 3 waves before rolling again + var/last_masscas_round = 1 + /// Lists possible chemicals that can appear pre-medicated in patient NPCs in harder difficulties + var/static/list/datum/reagent/medical/premeds = list( + /datum/reagent/medical/tramadol, + /datum/reagent/medical/bicaridine, + /datum/reagent/medical/kelotane, + /datum/reagent/medical/oxycodone + ) + /// List of supply room vendors to be restocked before a supply phase + var/list/supply_vendors = list() + +/datum/tutorial/marine/hospital_corpsman_sandbox/start_tutorial(mob/starting_mob) + . = ..() + if(!.) + return + + START_PROCESSING(SSfastobj, src) + init_mob() + init_npcs() + message_to_player("Welcome to the Hospital Corpsman tutorial sandbox mode!") + message_to_player("Gear up in your preferred HM kit, then press the orange 'Ready Up' arrow at the top of your HUD to begin the first round!") + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/handle_round_progression() + + var/difficulty_upgrade_warning = null + + if(booboo_timer) + deltimer(booboo_timer) + booboo_timer = null + if(terminate_movement_timer) + deltimer(terminate_movement_timer) + terminate_movement_timer = null + // clears refs to old friends, since passed + agent_healing_tasks = list() + agents = list() + dragging_agents = list() + active_agents = list() + + switch(stage) + if(TUTORIAL_HM_PHASE_RESUPPLY) + return // sometimes it double-calls handle_round_progression() + // Ensures that a resupply always follows a mass-cas, disregarding minimum rounds between + // Lowers difficulty close to, if not slightly below baseline + if(TUTORIAL_HM_PHASE_NIGHTMARE) + stage = TUTORIAL_HM_PHASE_RESUPPLY + survival_wave++ + survival_difficulty = pick(TUTORIAL_HM_INJURY_SEVERITY_MINOR, TUTORIAL_HM_INJURY_SEVERITY_ROUTINE) + min_survival_agents = 1 + max_survival_agents = 3 + begin_supply_phase() + return + // 1 in 5 chance per round to trigger a resupply phase + // Will only roll beyond wave 3, and 5 waves after the previous resupply phase. + if(prob(20) && (survival_wave >= (last_resupply_round + 5))) + begin_supply_phase() + return + survival_wave++ + // 1 in 5 chance per round to trigger a mass-cas (NIGHTMARE) phase + // Will only roll beyond wave 3, and 5 waves after the previous mass-cas phase. + if(prob(20) && (survival_wave >= (last_masscas_round + 5))) + stage = TUTORIAL_HM_PHASE_NIGHTMARE + // increases difficulty by 2 levels, but not beyond the max. + for(var/i in 1 to 2) + var/current_difficulty = survival_difficulty + if(current_difficulty != TUTORIAL_HM_INJURY_SEVERITY_MAXIMUM) + survival_difficulty = next_in_list(current_difficulty, difficulties) + // heightened patient NPC spawn rates, from 4-6 + min_survival_agents = 4 + max_survival_agents = 6 + playsound(tutorial_mob.loc, 'sound/effects/siren.ogg', 50) + message_to_player("Warning! Mass-Casualty event detected!") + last_masscas_round = survival_wave + // 50% chance per wave of increasing difficulty by one step + // two round grace period from start + else if(prob(TUTORIAL_HM_DIFFICULTY_INCREASE * 100) && !(survival_wave <= 2)) + var/current_difficulty = survival_difficulty + if(current_difficulty != TUTORIAL_HM_INJURY_SEVERITY_MAXIMUM) + survival_difficulty = next_in_list(current_difficulty, difficulties) + difficulty_upgrade_warning = " Difficulty has increased, watch out!!" + + CMO_npc.say("Now entering round [survival_wave]![difficulty_upgrade_warning]") + + addtimer(CALLBACK(src, PROC_REF(spawn_agents)), 2 SECONDS) + terminate_movement_timer = addtimer(CALLBACK(src, PROC_REF(terminate_agent_processing)), 15 SECONDS, TIMER_STOPPABLE) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/end_supply_phase() + + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor, prep_door) + var/turf/boundry = get_turf(loc_from_corner(4, 1)) + if(tutorial_mob.x <= boundry.x) + message_to_player("Please exit the preparations room before progressing into the next round!") + return + prep_door.close(TRUE) + prep_door.lock(TRUE) + stage = TUTORIAL_HM_PHASE_MAIN + remove_action(tutorial_mob, /datum/action/hm_tutorial/sandbox/ready_up) + handle_round_progression() + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/begin_supply_phase() + + restock_supply_room() + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor, prep_door) + prep_door.unlock(TRUE) + prep_door.open() + stage = TUTORIAL_HM_PHASE_MAIN // just in case it wasnt already + + if(last_resupply_round == 1) + message_to_player("Phew! We have entered a resupply phase of the tutorial!") + message_to_player("Use this rare opportunity to refill, restock, and resupply yourself for future rounds.") + message_to_player("Remember, on the field, immediate resupply will not always be possible! You won't know for certain when your next chance will arrive, so stock up while you can!") + message_to_player("When you are ready, leave the supply room, then click the 'Ready Up' action on the top left of your screen to begin your next round.") + else + message_to_player("Now enterering a resupply phase. Stock up while you can!") + + last_resupply_round = survival_wave + give_action(tutorial_mob, /datum/action/hm_tutorial/sandbox/ready_up, null, null, src) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/restock_supply_room() + + for(var/obj/structure/machinery/cm_vending/sorted/medical/supply_vendor in supply_vendors) + supply_vendor.populate_product_list(1.2) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/spawn_agents() + SIGNAL_HANDLER + + for(var/i in 1 to (rand(min_survival_agents, max_survival_agents))) + var/mob/living/carbon/human/realistic_dummy/active_agent = new(agent_spawn_location) + arm_equipment(active_agent, /datum/equipment_preset/uscm/tutorial_rifleman) + var/turf/dropoff_point = loc_from_corner(rand(6, 8), rand(1, 3)) // Picks a random turf to move the NPC to + agents[active_agent] = dropoff_point + active_agent.a_intent = INTENT_DISARM + simulate_condition(active_agent) + var/obj/item/clothing/suit/storage/marine/medium/armor = active_agent.get_item_by_slot(WEAR_JACKET) + RegisterSignal(armor, COMSIG_ITEM_UNEQUIPPED, PROC_REF(item_cleanup)) + + addtimer(CALLBACK(src, PROC_REF(eval_agent_status)), 3 SECONDS) // Gives time for NPCs to pass out or die, if their condition is severe enough + if((survival_difficulty >= TUTORIAL_HM_INJURY_SEVERITY_FATAL) && prob(75)) // If above difficulty FATAL, starts a random timer to spawn a booboo agent + booboo_timer = addtimer(CALLBACK(src, PROC_REF(eval_booboo_agent)), (rand(15,25)) SECONDS, TIMER_STOPPABLE) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/simulate_condition(mob/living/carbon/human/target) + SIGNAL_HANDLER + + // Simulates patient NPC injuries + + var/damage_amount_split = ((rand(1, 100)) / 100) // How damage should be split between brute and burn + var/list/limbs = target.limbs + var/amount_of_parts = rand(1, 6) // Amount of times to roll for a limb fracture + var/patient_type = pick(75;PATIENT_TYPE_MUNDANE, 15;PATIENT_TYPE_ORGAN, 10;PATIENT_TYPE_TOXIN) // 75% chance for mundane damage, 15% for organ damage, 10% for toxin + + if(patient_type >= PATIENT_TYPE_MUNDANE) + for(var/i in 1 to amount_of_parts) + var/obj/limb/selected_limb = pick(limbs) + var/damage_amount = (rand((40 * survival_difficulty), (50 * survival_difficulty))) + selected_limb.take_damage(round((damage_amount * damage_amount_split) / amount_of_parts), round((damage_amount * (1 - damage_amount_split)) / amount_of_parts)) + if((damage_amount > 30) && prob(survival_difficulty * 10)) + selected_limb.fracture() + if(patient_type == PATIENT_TYPE_ORGAN) // applies organ damage AS WELL as mundane damage if type 2 + var/datum/internal_organ/organ = pick(target.internal_organs) + target.apply_internal_damage(rand(1,(survival_difficulty*3.75)), "[organ.name]") + else if(patient_type == PATIENT_TYPE_TOXIN) // applies toxin damage AS WELL as mundane damage if type 3 + target.setToxLoss(rand(1,10*survival_difficulty)) + + if(prob(40)) // Simulates premedicated patients + var/datum/reagent/medical/reagent = pick(premeds) + target.reagents.add_reagent(reagent.id, rand(5, reagent.overdose - 1)) // OD safety + + target.updatehealth() + target.UpdateDamageIcon() + RegisterSignal(target, COMSIG_HUMAN_HM_TUTORIAL_TREATED, PROC_REF(final_health_checks)) + RegisterSignal(target, COMSIG_HUMAN_SET_UNDEFIBBABLE, PROC_REF(make_agent_leave)) // perma detection + + RegisterSignal(target, COMSIG_LIVING_REJUVENATED, PROC_REF(make_agent_leave)) // for debugging + +// 'bypass' variable used by the rejuvenate proc to override health checks +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/final_health_checks(mob/living/carbon/human/target, bypass) + SIGNAL_HANDLER + + // Makes sure complex injuries are treated once 70% health is reached + + var/list/healing_tasks = list() + UnregisterSignal(target, COMSIG_HUMAN_HM_TUTORIAL_TREATED) + for(var/obj/limb/limb as anything in target.limbs) + var/list/injury_type = list() + if((limb.status & LIMB_BROKEN) && !(limb.status & LIMB_SPLINTED)) + injury_type |= FRACTURE + RegisterSignal(limb, COMSIG_LIVING_LIMB_SPLINTED, PROC_REF(health_tasks_handler)) + if(limb.can_bleed_internally) + for(var/datum/wound/wound as anything in limb.wounds) + if(wound.internal) + injury_type |= INTERNAL_BLEEDING + RegisterSignal(tutorial_mob, COMSIG_HUMAN_SURGERY_STEP_SUCCESS, PROC_REF(health_tasks_handler), TRUE) // yeah yeah, give me a break + if(length(injury_type)) + healing_tasks[limb] = injury_type + if(!length(healing_tasks) || bypass) + make_agent_leave(target) + else + agent_healing_tasks[target] = healing_tasks + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/health_tasks_handler(datum/source, mob/living/carbon/human/realistic_dummy/target, datum/surgery/surgery) + SIGNAL_HANDLER + + var/list/healing_tasks = agent_healing_tasks[target] + + var/obj/limb/limb + if(istype(source, /obj/limb)) // swaps around the variables from COMSIG_LIVING_LIMB_SPLINTED to make them consistent + limb = source + var/target_redirect = limb.owner + health_tasks_handler(target, target_redirect) + UnregisterSignal(limb, COMSIG_LIVING_LIMB_SPLINTED) + return + for(limb in healing_tasks) + var/list/injury_type = list() + injury_type |= healing_tasks[limb] + if(surgery && limb == surgery.affected_limb) + if(istype(surgery, /datum/surgery/internal_bleeding)) + injury_type -= INTERNAL_BLEEDING + injury_type |= SUTURE + if(istype(surgery, /datum/surgery/suture_incision)) + injury_type = healing_tasks[surgery.affected_limb] + if(SUTURE in injury_type) + injury_type -= SUTURE + if((FRACTURE in injury_type) && (limb.status & LIMB_BROKEN) && (limb.status & LIMB_SPLINTED)) + injury_type -= FRACTURE + if(!length(injury_type) && limb) // makes sure something DID exist on the list + healing_tasks -= limb + else + healing_tasks[limb] = injury_type + if(!length(healing_tasks)) + UnregisterSignal(tutorial_mob, COMSIG_HUMAN_SURGERY_STEP_SUCCESS) + make_agent_leave(target) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/eval_agent_status() + + for(var/mob/living/carbon/human/target as anything in agents) + if(target.stat != CONSCIOUS) // are they awake? + var/mob/living/carbon/human/dragging_agent = new(target.loc) + init_dragging_agent(dragging_agent) + dragging_agent.do_pull(target) + dragging_agents[dragging_agent] = target + movement_handler() + else + active_agents |= target + movement_handler() + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/handle_speech(mob/living/carbon/human/target) + + var/list/help_me = list() + + if(target in dragging_agents) + target.emote("medic") + return + if(prob(25)) + target.emote("medic") + return + for(var/obj/limb/limb as anything in target.limbs) + if(limb.status & LIMB_BROKEN) + var/targetlimb = limb.display_name + help_me |= list("Need a [targetlimb] splint please Doc", "Splint [targetlimb]", "Can you splint my [targetlimb] please") + + help_me |= list( + "Doc can I get some pills?", + "Need a patch up please", + "Im hurt Doc...", + "Can I get some healthcare?", + "Pill me real quick", + "HEEEEEELP!!!", + "M-Medic.. I'm dying", + "I'll pay you 20 bucks to patch me up", + "MEDIC!!!!! HEEEEEELP!!!!", + "HEEEELP MEEEEEE!!!!!" + ) + + target.say("[pick(help_me)]") + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/movement_handler() + + listclearnulls(dragging_agents) + listclearnulls(active_agents) + for(var/mob/living/carbon/human/dragging_agent as anything in dragging_agents) + move_agent(dragging_agent, dragging_agents) + for(var/mob/living/carbon/human/active_agent as anything in active_agents) + move_agent(active_agent, active_agents) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/terminate_agent_processing() + + if(terminate_movement_timer) + deltimer(terminate_movement_timer) + terminate_movement_timer = null + for(var/mob/living/carbon/human/dragging_agent as anything in dragging_agents) + dragging_agent.stop_pulling() + var/mob/living/carbon/human/dragging_target = dragging_agents[dragging_agent] + if(dragging_target) + active_agents |= dragging_target // sorry bud, you'll have to get there yourself + dragging_agents -= dragging_agent + make_dragging_agent_leave(dragging_agent) + for(var/mob/living/carbon/human/active_agent as anything in active_agents) + var/turf/dropoff_point = loc_from_corner(rand(6, 8), rand(1, 3)) + active_agent.forceMove(dropoff_point) + active_agents -= active_agent + listclearnulls(dragging_agents) + listclearnulls(active_agents) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/move_agent(mob/agent, list/agent_list) + + var/dropoff_point_offset + var/mob/living/carbon/human/target = agent + if(agent in dragging_agents) + target = agent_list[agent] + dropoff_point_offset = 1 + var/turf/dropoff_point = agents[target] + var/step_direction + var/turf/target_turf + if(!dropoff_point) // Something has gone horribly wrong + terminate_agent_processing() + return + if(locate(agent) in agent_spawn_location) + var/initial_step_direction = pick((agent_spawn_location.y) <= (dropoff_point.y) ? NORTH : SOUTH) + target_turf = get_step(agent, initial_step_direction) + agent.Move(target_turf, initial_step_direction) + if((dropoff_point.x > (agent.x + dropoff_point_offset)) || (dropoff_point.x < (agent.x + dropoff_point_offset))) + step_direction = pick((agent.x + dropoff_point_offset) > (dropoff_point.x) ? WEST : EAST) + target_turf = get_step(agent, step_direction) + agent.Move(target_turf, step_direction) + else if(dropoff_point.x == (agent.x + dropoff_point_offset)) + if(((dropoff_point.y - agent.y) >= (1 + dropoff_point_offset)) || ((dropoff_point.y - agent.y) <= -(1 + dropoff_point_offset))) + step_direction = pick((agent.y) > (dropoff_point.y) ? SOUTH : NORTH) + target_turf = get_step(agent, step_direction) + agent.Move(target_turf, step_direction) + if(agent in dragging_agents) + var/turf/drag_turf = get_step(agent, EAST) + target.Move(drag_turf, EAST) + return + handle_speech(agent) + target.Move(dropoff_point) + if(agent in dragging_agents) + agent.mob_flags |= IMMOBILE_ACTION + agent.stop_pulling() + agent_list -= agent + make_dragging_agent_leave(agent) + if(agent in active_agents) + agent_list -= agent + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/make_dragging_agent_leave(mob/living/carbon/human/dragging_agent) + + if(dragging_agent in dragging_agents) // failsafe in case the dragging NPC never had their movement code stopped + dragging_agents -= dragging_agent + dragging_agent.density = FALSE + QDEL_IN(dragging_agent, 2.5 SECONDS) + animate(dragging_agent, 2.5 SECONDS, alpha = 0, easing = CUBIC_EASING) + +// NOTE: bypass variable is a boolean used in the simulate_evac proc, used to stop to the balloon text from playing +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/make_agent_leave(mob/living/carbon/human/realistic_dummy/agent, bypass) + SIGNAL_HANDLER + + UnregisterSignal(agent, COMSIG_LIVING_REJUVENATED) + UnregisterSignal(agent, COMSIG_HUMAN_SET_UNDEFIBBABLE) + UnregisterSignal(agent, COMSIG_HUMAN_HM_TUTORIAL_TREATED) + agent.updatehealth() + if(!bypass) + if(agent.undefibbable == TRUE) + agent.balloon_alert_to_viewers("[agent.name] permanently dead!", null, DEFAULT_MESSAGE_RANGE, null, COLOR_RED) + playsound(agent.loc, 'sound/items/defib_failed.ogg', 20) + else + agent.balloon_alert_to_viewers("[agent.name] fully treated!") + playsound(agent.loc, 'sound/machines/terminal_success.ogg', 20) + agents -= agent + if(agent in active_agents) // failsafe in case patient NPC was healed, despite never reaching their dropzone + active_agents -= agent + QDEL_IN(agent, 2.5 SECONDS) + animate(agent, 2.5 SECONDS, alpha = 0, easing = CUBIC_EASING) + for(var/obj/item/clothing/suit/storage/marine/medium/armor as anything in cleanup) + item_cleanup(armor) + if(!length(agents)) + INVOKE_ASYNC(src, PROC_REF(handle_round_progression)) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/eval_booboo_agent() + SIGNAL_HANDLER + + var/mob/living/carbon/human/realistic_dummy/active_agent = new(agent_spawn_location) + arm_equipment(active_agent, /datum/equipment_preset/uscm/tutorial_rifleman) + var/turf/dropoff_point = loc_from_corner(rand(6, 8), rand(1, 3)) + agents[active_agent] = dropoff_point + active_agent.a_intent = INTENT_DISARM + + var/damage_amount_split = ((rand(1, 100)) / 100) + var/list/limbs = active_agent.limbs + var/amount_of_parts = (rand(1, 6)) + + for(var/i in 1 to amount_of_parts) + var/obj/limb/selected_limb = pick(limbs) + var/damage_amount = (rand((40 * TUTORIAL_HM_INJURY_SEVERITY_BOOBOO), (50 * TUTORIAL_HM_INJURY_SEVERITY_BOOBOO))) + selected_limb.take_damage(round((damage_amount * damage_amount_split) / amount_of_parts), round((damage_amount * (1 - damage_amount_split)) / amount_of_parts)) + if((damage_amount > 30) && prob(TUTORIAL_HM_INJURY_SEVERITY_BOOBOO * 10)) + selected_limb.fracture() + + active_agent.updatehealth() + active_agent.UpdateDamageIcon() + active_agents |= active_agent + RegisterSignal(active_agent, COMSIG_HUMAN_HM_TUTORIAL_TREATED, PROC_REF(make_agent_leave)) + RegisterSignal(active_agent, COMSIG_HUMAN_SET_UNDEFIBBABLE, PROC_REF(make_agent_leave)) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/simulate_evac(datum/source, mob/living/carbon/human/target) + + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/bed/medevac_stretcher/prop, medevac_bed) + + var/list/status_message = list() + + for(var/datum/reagent/medical/chemical as anything in target.reagents.reagent_list) + if(chemical.volume >= chemical.overdose_critical) + status_message |= "Critical [chemical.name] overdose detected" + for(var/datum/internal_organ/organ as anything in target.internal_organs) + if(organ.damage >= organ.min_broken_damage) + if((locate(/datum/reagent/medical/peridaxon) in target.reagents.reagent_list) || (target.stat == DEAD)) + status_message |= "Ruptured [organ.name] detected" + else + medevac_bed.balloon_alert_to_viewers("Organ damage detected! Please stabilize patient with Peridaxon before transit.", null, DEFAULT_MESSAGE_RANGE, null, COLOR_RED) + playsound(medevac_bed.loc, 'sound/machines/twobeep.ogg', 20) + return + + if(tutorial_mob == target) + medevac_bed.balloon_alert_to_viewers("Error! Unable to self-evacuate!", null, DEFAULT_MESSAGE_RANGE, null, COLOR_RED) + playsound(medevac_bed.loc, 'sound/machines/twobeep.ogg', 20) + return + if(length(status_message)) + medevac_bed.balloon_alert_to_viewers("[pick(status_message)]! Evacuating patient!!", null, DEFAULT_MESSAGE_RANGE, null, LIGHT_COLOR_BLUE) + playsound(medevac_bed.loc, pick_weight(list('sound/machines/ping.ogg' = 9, 'sound/machines/juicer.ogg' = 1)), 20) + make_agent_leave(target, TRUE) + addtimer(CALLBACK(src, PROC_REF(animate_medevac_bed), target), 2.7 SECONDS) + else + medevac_bed.balloon_alert_to_viewers("Error! Patient condition does not warrant evacuation!", null, DEFAULT_MESSAGE_RANGE, null, COLOR_RED) + playsound(medevac_bed.loc, 'sound/machines/twobeep.ogg', 20) + return + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/animate_medevac_bed(mob/living/carbon/human/target) + + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/bed/medevac_stretcher/prop, medevac_bed) + medevac_bed.update_icon() + flick("winched_stretcher", medevac_bed) + +/datum/tutorial/marine/hospital_corpsman_sandbox/process(delta_time) + + if(length(dragging_agents) || length(active_agents)) + movement_handler() + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/item_cleanup(obj/item/clothing/suit/storage/marine/medium/armor) + SIGNAL_HANDLER + + if(!(armor in cleanup)) + cleanup |= armor // marks item for removal once the dummy is ready + UnregisterSignal(armor, COMSIG_ITEM_UNEQUIPPED) + return + else + cleanup -= armor + var/obj/item/storage/internal/armor_storage = locate(/obj/item/storage/internal) in armor + for(var/obj/item/item as anything in armor_storage) + armor_storage.remove_from_storage(item, get_turf(armor)) + QDEL_IN(armor, 1 SECONDS) + +/datum/tutorial/marine/hospital_corpsman_sandbox/init_mob() + . = ..() + arm_equipment(tutorial_mob, /datum/equipment_preset/tutorial/fed) + tutorial_mob.set_skills(/datum/skills/combat_medic) + give_action(tutorial_mob, /datum/action/hm_tutorial/sandbox/ready_up, null, null, src) + tutorial_mob.job = JOB_SQUAD_MEDIC + tutorial_mob.forceMove(get_turf(loc_from_corner(0,1))) // spawn point + + +/datum/tutorial/marine/hospital_corpsman_sandbox/init_map() + + new /obj/structure/machinery/cm_vending/clothing/medic/tutorial(loc_from_corner(2, 0)) + new /obj/structure/machinery/cm_vending/gear/medic/tutorial/(loc_from_corner(3, 0)) + var/obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor/prep_door = locate(/obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor) in get_turf(loc_from_corner(4, 1)) + var/obj/structure/bed/medevac_stretcher/prop/medevac_bed = locate(/obj/structure/bed/medevac_stretcher/prop) in get_turf(loc_from_corner(7, 0)) + var/obj/structure/machinery/smartfridge/smartfridge = locate(/obj/structure/machinery/smartfridge) in get_turf(loc_from_corner(0, 3)) + supply_vendors |= locate(/obj/structure/machinery/cm_vending/sorted/medical/blood/bolted) in get_turf(loc_from_corner(0, 0)) + supply_vendors |= locate(/obj/structure/machinery/cm_vending/sorted/medical/bolted) in get_turf(loc_from_corner(1, 0)) + supply_vendors |= locate(/obj/structure/machinery/cm_vending/sorted/medical/marinemed) in get_turf(loc_from_corner(2, 3)) + agent_spawn_location = get_turf(loc_from_corner(12, 2)) + var/obj/item/storage/pill_bottle/imialky/ia = new /obj/item/storage/pill_bottle/imialky + smartfridge.add_local_item(ia) //I have won, but at what cost? + prep_door.req_one_access = null + prep_door.req_access = null + add_to_tracking_atoms(prep_door) + add_to_tracking_atoms(medevac_bed) + RegisterSignal(medevac_bed, COMSIG_LIVING_BED_BUCKLED, PROC_REF(simulate_evac)) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/init_npcs() + + CMO_npc = new(loc_from_corner(7, 7)) + arm_equipment(CMO_npc, /datum/equipment_preset/uscm_ship/uscm_medical/cmo/npc) + +/datum/tutorial/marine/hospital_corpsman_sandbox/proc/init_dragging_agent(mob/living/carbon/human/dragging_agent) + arm_equipment(dragging_agent, /datum/equipment_preset/uscm/tutorial_rifleman) + dragging_agent.a_intent = INTENT_DISARM + +/datum/tutorial/marine/hospital_corpsman_sandbox/Destroy(force) + STOP_PROCESSING(SSfastobj, src) + if(booboo_timer) + deltimer(booboo_timer) + booboo_timer = null + if(terminate_movement_timer) + deltimer(terminate_movement_timer) + terminate_movement_timer = null + agent_healing_tasks = list() + terminate_agent_processing() + QDEL_LIST(supply_vendors) + QDEL_LIST(agents) + QDEL_LIST(active_agents) + QDEL_LIST(dragging_agents) + return ..() + +/datum/action/hm_tutorial/sandbox/ready_up + name = "Ready Up" + action_icon_state = "walkman_next" + var/datum/weakref/tutorial + +/datum/action/hm_tutorial/sandbox/ready_up/New(Target, override_icon_state, datum/tutorial/marine/hospital_corpsman_sandbox/selected_tutorial) + . = ..() + tutorial = WEAKREF(selected_tutorial) + +/datum/action/hm_tutorial/sandbox/ready_up/action_activate() + . = ..() + if(!tutorial) + return + + var/datum/tutorial/marine/hospital_corpsman_sandbox/selected_tutorial = tutorial.resolve() + + selected_tutorial.end_supply_phase() + +#undef TUTORIAL_HM_PHASE_PREP +#undef TUTORIAL_HM_PHASE_MAIN +#undef TUTORIAL_HM_PHASE_RESUPPLY +#undef TUTORIAL_HM_PHASE_NIGHTMARE + +#undef TUTORIAL_HM_DIFFICULTY_INCREASE + +#undef TUTORIAL_HM_INJURY_SEVERITY_BOOBOO +#undef TUTORIAL_HM_INJURY_SEVERITY_MINOR +#undef TUTORIAL_HM_INJURY_SEVERITY_ROUTINE +#undef TUTORIAL_HM_INJURY_SEVERITY_SEVERE +#undef TUTORIAL_HM_INJURY_SEVERITY_FATAL +#undef TUTORIAL_HM_INJURY_SEVERITY_EXTREME +#undef TUTORIAL_HM_INJURY_SEVERITY_MAXIMUM + +#undef PATIENT_TYPE_MUNDANE +#undef PATIENT_TYPE_ORGAN +#undef PATIENT_TYPE_TOXIN + +#undef INTERNAL_BLEEDING +#undef SUTURE +#undef FRACTURE diff --git a/code/datums/tutorial/marine/reqs_line.dm b/code/datums/tutorial/marine/reqs_line.dm index 9afd29a1e441..b8bea130a76b 100644 --- a/code/datums/tutorial/marine/reqs_line.dm +++ b/code/datums/tutorial/marine/reqs_line.dm @@ -67,9 +67,9 @@ /obj/item/attachable/attached_gun/shotgun = list("U7", "Underbarrel", "Underbarrel Shotgun", "Mini Shotgun", "UBS"), /obj/item/attachable/verticalgrip = list("VG", "Vert Grip", "Vertical Grip"), /obj/item/attachable/stock/rifle = list("Solid Stock", "M41 stock", "M41 Solid Stock"), - /obj/item/attachable/stock/shotgun = list("M37 Stock", "Wooden stock"), + /obj/item/attachable/stock/synth/collapsible = list("M37A2 Stock", "Collapsible Stock"), /* GEAR */ - /obj/item/weapon/gun/shotgun/pump = list("M37", "shotgun"), + /obj/item/weapon/gun/shotgun/pump/m37a = list("M37", "shotgun"), /obj/item/weapon/gun/smg/m39 = list("M39", "SMG"), /obj/item/weapon/gun/rifle/m4ra = list("M4RA", "M4RA Battle Rifle"), /obj/item/weapon/gun/rifle/m41a = list("M41", "M41", "M41A", "Mk2", "M4 rifle"), @@ -82,13 +82,13 @@ /obj/item/storage/box/guncase/m56d = list("M56D", "HMG", "M56"), /obj/item/storage/box/guncase/m2c = list("M2C"), /obj/item/storage/box/guncase/flamer = list("Flamer", "Flamer kit", "Incinerator"), - /obj/item/storage/box/guncase/m79 = list("GL", "Grenade launcher", "M79", "M79 Grenade launcher"), - /obj/item/storage/box/guncase/xm51 = list("XM51", "Breaching Shotty", "Breaching Shotgun", "Breaching Scattergun"), + /obj/item/storage/box/guncase/m85a1 = list("GL", "Grenade launcher", "M85A1", "M85A1 Grenade launcher"), /obj/item/clothing/accessory/storage/black_vest = list("Black webbing", "Black webbing vest"), /obj/item/clothing/accessory/storage/black_vest/brown_vest = list("Brown webbing", "Brown webbing vest"), /obj/item/clothing/accessory/storage/webbing = list("Webbing", "Normal webbing", "Web"), /obj/item/clothing/accessory/storage/webbing/black = list("Normal black webbing", "Black normal webbing","Normal black web"), /obj/item/clothing/accessory/storage/droppouch = list("Drop Pouch"), + /obj/item/clothing/accessory/storage/droppouch/black = list("Black Drop Pouch"), /obj/item/clothing/suit/storage/webbing = list("External webbing"), /obj/item/storage/backpack/marine/engineerpack/flamethrower/kit = list("Pyro pack", "Pyro backpack", "G4-1 pack", "Flamer backpack"), /obj/item/storage/backpack/marine/ammo_rack = list ("IMP Ammo Rack", "Ammo rack", "Ammo IMP Rack"), @@ -128,7 +128,7 @@ /obj/item/ammo_magazine/rifle/extended = list("Ext Mk2", "MK2 Extended", "Extended MK2 mag"), /obj/item/ammo_magazine/smartgun = list("Smartgun drum", "SG drum"), /obj/item/ammo_magazine/rifle/lmg = list("HPR mag", "Heavy pulse rifle mag", "M41AE2 box"), - /obj/item/ammo_magazine/rifle/xm51 = list("XM51 mag"), + /obj/item/ammo_magazine/rocket/brute = list("Brute warhead", "Brute rocket"), ) /datum/tutorial/marine/reqs_line/Destroy(force) diff --git a/code/datums/vehicles.dm b/code/datums/vehicles.dm index 5b99bbb438fd..dff85ca664b0 100644 --- a/code/datums/vehicles.dm +++ b/code/datums/vehicles.dm @@ -14,6 +14,10 @@ name = "APC" interior_id = "apc" +/datum/map_template/interior/apc_pmc + name = "W-Y APC" + interior_id = "apc_pmc" + /datum/map_template/interior/apc_command name = "Command APC" interior_id = "apc_command" diff --git a/code/datums/weather/weather_event.dm b/code/datums/weather/weather_event.dm index 3d80b54a0ef7..58e154d68fcc 100644 --- a/code/datums/weather/weather_event.dm +++ b/code/datums/weather/weather_event.dm @@ -6,25 +6,42 @@ /datum/weather_event //// MANDATORY vars - var/name = "set this" // Make this a copy of display name unless theres a good reason - var/display_name = "set this" // The "display name" of this event - var/length = 0 // Length of the event + + /// Make this a copy of display name unless theres a good reason + var/name = "set this" + + /// The "display name" of this event + var/display_name = "set this" + + /// Length of the event + var/length = 0 //// Optional vars - var/fullscreen_type = null // If this is set, display a fullscreen type to mobs - var/turf_overlay_icon_state // The icon to set on the VFX holder instanced into every turf at round start + + /// If this is set, display a fullscreen type to mobs + var/fullscreen_type = null + + /// The icon to set on the VFX holder instanced into every turf at round start + var/turf_overlay_icon_state var/turf_overlay_alpha = 255 var/effect_message = "tell a coder to fix this | WEATHER EVENT EFFECT MESSAGE" var/damage_per_tick = 200 // more likely to report the bug if it instantly kills them var/damage_type = BURN + var/should_sound_weather_alarm = FALSE // Variable to check if weather alarm on loudspeakers (like soro) should be played. + var/ambience = 'sound/ambience/strata/strata_snow.ogg' - var/has_process = FALSE // to be used with handle_weather_process() + /// to be used with handle_weather_process() + var/has_process = FALSE var/lightning_chance = 0 - var/fire_smothering_strength = 0 // How much will this weather smother fires on turfs and on mobs - should be 0 to 10 + /// How much will this weather smother fires on turfs and on mobs - should be 0 to 10 + var/fire_smothering_strength = 0 + + /// If this weather event should wash away decals exposed to it + var/cleaning = TRUE /datum/weather_event/proc/start_weather_event() return diff --git a/code/datums/weather/weather_events/big_red.dm b/code/datums/weather/weather_events/big_red.dm index 262e73142581..0d9007ebdfa0 100644 --- a/code/datums/weather/weather_events/big_red.dm +++ b/code/datums/weather/weather_events/big_red.dm @@ -13,6 +13,8 @@ fire_smothering_strength = 1 + cleaning = FALSE + /datum/weather_event/sand name = "Sandstorm" display_name = "Sandstorm" @@ -28,6 +30,8 @@ fire_smothering_strength = 2 + cleaning = FALSE + /datum/weather_event/rock name = "Rockstorm" display_name = "Rockstorm" @@ -42,3 +46,5 @@ ambience = 'sound/ambience/strata/strata_blizzard.ogg' fire_smothering_strength = 3 + + cleaning = FALSE diff --git a/code/datums/weather/weather_events/sorokyne.dm b/code/datums/weather/weather_events/sorokyne.dm index 03889032711f..4882104a1790 100644 --- a/code/datums/weather/weather_events/sorokyne.dm +++ b/code/datums/weather/weather_events/sorokyne.dm @@ -1,42 +1,61 @@ // Weather events for Sorokyne -/datum/weather_event/snow - name = "Snow" - display_name = "Snow" - length = 10 MINUTES - fullscreen_type = /atom/movable/screen/fullscreen/weather/low - turf_overlay_icon_state = "strata_snowing" - effect_message = "You feel the icy winds chill you!" +/datum/weather_event/soro/very_light_rain + name = "Soro Light Rain" + + display_name = "Light Rain" + + length = 3 MINUTES + + lightning_chance = 4 + + fire_smothering_strength = 1 + + turf_overlay_icon_state = "strata_storm" + turf_overlay_alpha = 25 + + effect_message = null damage_per_tick = 0 - ambience = 'sound/ambience/strata/strata_snow.ogg' + ambience = 'sound/ambience/rainandthunderlong.ogg' - fire_smothering_strength = 3 +/datum/weather_event/soro/light_rain + name = "Tropical Storm" + display_name = "Tropical Storm" + length = 3 MINUTES + fullscreen_type = /atom/movable/screen/fullscreen/weather/low -/datum/weather_event/snowstorm - name = "Snowstorm" - display_name = "Snowstorm" - length = 6 MINUTES - fullscreen_type = /atom/movable/screen/fullscreen/weather/medium turf_overlay_icon_state = "strata_storm" + turf_overlay_alpha = 40 - effect_message = "You feel the icy winds of the snowstorm chill you to the bone!" - damage_per_tick = 0.125 + effect_message = null + damage_per_tick = 0 - ambience = 'sound/ambience/strata/strata_snowstorm.ogg' + has_process = TRUE + lightning_chance = 1 - fire_smothering_strength = 4 + ambience = 'sound/ambience/rainforest.ogg' + + fire_smothering_strength = 1 + +/datum/weather_event/soro/monsoon + name = "Monsoon Warning" + display_name = "Monsoon Warning" + + should_sound_weather_alarm = TRUE -/datum/weather_event/blizzard - name = "Blizzard" - display_name = "Blizzard" length = 4 MINUTES fullscreen_type = /atom/movable/screen/fullscreen/weather/high - turf_overlay_icon_state = "strata_blizzard" - effect_message = "You feel the winds of the blizzard sap all the warmth from your body!" - damage_per_tick = 0.25 + turf_overlay_icon_state = "strata_storm" + turf_overlay_alpha = 115 - ambience = 'sound/ambience/strata/strata_blizzard.ogg' + effect_message = null + damage_per_tick = 0 + + ambience = 'sound/ambience/varadero_storm.ogg' - fire_smothering_strength = 6 + has_process = TRUE + lightning_chance = 6 + + fire_smothering_strength = 4 diff --git a/code/datums/weather/weather_map_holder.dm b/code/datums/weather/weather_map_holder.dm index eb3458d70a25..156dddec9fdb 100644 --- a/code/datums/weather/weather_map_holder.dm +++ b/code/datums/weather/weather_map_holder.dm @@ -42,8 +42,7 @@ // Called whenever the weather SS decides to start an event, but // warn_time deciseconds before it actually starts // (think weather sirens on sorokyne) -/datum/weather_ss_map_holder/proc/weather_warning(event_type) - var/datum/weather_event/incoming_event = event_type +/datum/weather_ss_map_holder/proc/weather_warning(datum/weather_event/incoming_event) var/weather_name = initial(incoming_event.display_name) var/list/ground_levels = SSmapping.levels_by_any_trait(list(ZTRAIT_GROUND)) for(var/mob/living/carbon/human/affected_human in GLOB.alive_human_list) @@ -54,3 +53,5 @@ if(!affected_xeno.stat && affected_xeno.client) playsound_client(affected_xeno.client, 'sound/voice/alien_distantroar_3.ogg', affected_xeno.loc, 25, FALSE) affected_xeno.play_screen_text("The Hivemind Senses:
" + "Incoming [weather_name]", /atom/movable/screen/text/screen_text/command_order, rgb(175, 0, 175)) + + elder_overseer_message("Incoming [weather_name].") diff --git a/code/datums/weather/weather_map_holders/sorokyne.dm b/code/datums/weather/weather_map_holders/sorokyne.dm index 3c27a43ce1b3..62c810e08318 100644 --- a/code/datums/weather/weather_map_holders/sorokyne.dm +++ b/code/datums/weather/weather_map_holders/sorokyne.dm @@ -3,23 +3,26 @@ /datum/weather_ss_map_holder/sorokyne name = "Sorokyne Map Holder" - min_time_between_events = 20 MINUTES + min_time_between_events = 30 MINUTES no_weather_turf_icon_state = "strata_clearsky" potential_weather_events = list( - /datum/weather_event/snow, - /datum/weather_event/snowstorm, - /datum/weather_event/blizzard, + /datum/weather_event/soro/light_rain, + /datum/weather_event/soro/monsoon, + /datum/weather_event/soro/very_light_rain, ) /datum/weather_ss_map_holder/sorokyne/should_affect_area(area/A) - return (A.temperature <= SOROKYNE_TEMPERATURE) + return ((A.temperature <= TROPICAL_TEMP) && !CEILING_IS_PROTECTED(A.ceiling, CEILING_GLASS)) /datum/weather_ss_map_holder/sorokyne/should_start_event() if (prob(PROB_WEATHER_SOROKYNE)) return TRUE return FALSE -/datum/weather_ss_map_holder/sorokyne/weather_warning() - for (var/obj/structure/machinery/weather_siren/WS in GLOB.weather_notify_objects) - WS.weather_warning() +/datum/weather_ss_map_holder/sorokyne/weather_warning(datum/weather_event/incoming_event) + if(incoming_event.should_sound_weather_alarm) + for (var/obj/structure/machinery/weather_siren/WS in GLOB.weather_notify_objects) + WS.weather_warning() + else + ..() diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 8d1a55275fc6..e70cac5664d9 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -151,6 +151,12 @@ if(SSticker.HasRoundStarted()) data["real_mode"] = SSticker.mode.name + data["testmerges"] = list() + for(var/datum/tgs_revision_information/test_merge/test_merge as anything in GLOB.revdata.testmerge) + data["testmerges"] += list( + list("title" = test_merge.title, "number" = test_merge.number, "url" = test_merge.url, "author" = test_merge.author) + ) + /datum/world_topic/certify key = "certify" required_params = list("identifier", "discord_id") diff --git a/code/datums/xeno_shields/xeno_shield.dm b/code/datums/xeno_shields/xeno_shield.dm index 83efa578b2d0..1453f6aa3e48 100644 --- a/code/datums/xeno_shields/xeno_shield.dm +++ b/code/datums/xeno_shields/xeno_shield.dm @@ -44,9 +44,15 @@ // Anything special to do on removal /datum/xeno_shield/proc/on_removal() + if(linked_xeno && istype(linked_xeno, /mob/living/carbon/xenomorph) && shield_source == XENO_SHIELD_SOURCE_GARDENER) + linked_xeno.balloon_alert(linked_xeno, "our carapace shell crumbles!", text_color = "#17997280") + playsound(linked_xeno, "shield_shatter", 25, 1) return /datum/xeno_shield/proc/begin_decay() + if(linked_xeno && istype(linked_xeno, /mob/living/carbon/xenomorph) && shield_source == XENO_SHIELD_SOURCE_GARDENER) + linked_xeno.balloon_alert(linked_xeno, "our carapace shell begins to decay!", text_color = "#17997280") + playsound(linked_xeno, 'sound/effects/squish_and_exhaust.ogg', 25, 1) START_PROCESSING(SSobj, src) processing = TRUE diff --git a/code/defines/procs/announcement.dm b/code/defines/procs/announcement.dm index 63d2d6f58831..89bc77172e1a 100644 --- a/code/defines/procs/announcement.dm +++ b/code/defines/procs/announcement.dm @@ -5,7 +5,6 @@ #define QUEEN_ANNOUNCE "The words of the Queen reverberate in your head..." #define QUEEN_MOTHER_ANNOUNCE "Queen Mother Psychic Directive" #define XENO_GENERAL_ANNOUNCE "You sense something unusual..." //general xeno announcement that don't involve Queen, for nuke for example -#define YAUTJA_ANNOUNCE "You receive a message from your ship AI..." //preds announcement #define HIGHER_FORCE_ANNOUNCE SPAN_ANNOUNCEMENT_HEADER_BLUE("Unknown Higher Force") //xenomorph hive announcement @@ -40,7 +39,7 @@ if(!istype(H) || H.stat != CONSCIOUS || isyautja(H)) //base human checks targets.Remove(H) continue - if(is_mainship_level(H.z)) // People on ship see everything + if(is_mainship_level(H.z) && istype(GLOB.master_mode, /datum/game_mode/extended/faction_clash )) // People on ship see everything, unless it is faction clash continue // If they have iff AND a marine headset they will recieve announcements @@ -81,18 +80,6 @@ announcement_helper(message, title, targets, sound_to_play) -//yautja ship AI announcement -/proc/yautja_announcement(message, title = YAUTJA_ANNOUNCE, sound_to_play = sound('sound/misc/notice1.ogg')) - var/list/targets = GLOB.human_mob_list + GLOB.dead_mob_list - for(var/mob/M in targets) - if(isobserver(M)) //observers see everything - continue - var/mob/living/carbon/human/H = M - if(!isyautja(H) || H.stat != CONSCIOUS) - targets.Remove(H) - - announcement_helper(message, title, targets, sound_to_play) - //AI announcement that uses talking into comms /proc/ai_announcement(message, sound_to_play = sound('sound/misc/interference.ogg'), logging = ARES_LOG_MAIN) for(var/mob/M in (GLOB.human_mob_list + GLOB.dead_mob_list)) diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm index 6ede64f9573b..75fdaa8740b1 100644 --- a/code/defines/procs/records.dm +++ b/code/defines/procs/records.dm @@ -33,19 +33,18 @@ medical_record.fields["id"] = null medical_record.fields["name"] = person.real_name medical_record.name = person.real_name - medical_record.fields["b_type"] = person.b_type - medical_record.fields["mi_dis"] = "None" - medical_record.fields["mi_dis_d"] = "No minor disabilities have been declared." - medical_record.fields["ma_dis"] = "None" - medical_record.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - medical_record.fields["alg"] = "None" - medical_record.fields["alg_d"] = "No allergies have been detected in this patient." - medical_record.fields["cdi"] = "None" - medical_record.fields["cdi_d"] = "No diseases have been diagnosed at the moment." + medical_record.fields["blood_type"] = person.blood_type + medical_record.fields["minor_disability"] = "None" + medical_record.fields["minor_disability_details"] = "No minor disabilities have been declared." + medical_record.fields["major_disability"] = "None" + medical_record.fields["major_disability_details"] = "No major disabilities have been diagnosed." + medical_record.fields["allergies"] = "None" + medical_record.fields["allergies_details"] = "No allergies have been detected in this patient." + medical_record.fields["diseases"] = "None" + medical_record.fields["diseases_details"] = "No diseases have been diagnosed at the moment." medical_record.fields["last_scan_time"] = null medical_record.fields["last_scan_result"] = "No scan data on record" medical_record.fields["autodoc_data"] = list() - medical_record.fields["autodoc_manual"] = list() medical_record.fields["ref"] = WEAKREF(person) GLOB.data_core.medical += medical_record return medical_record diff --git a/code/game/area/DesertDam.dm b/code/game/area/DesertDam.dm index c636d8ba01aa..7020a6e35737 100644 --- a/code/game/area/DesertDam.dm +++ b/code/game/area/DesertDam.dm @@ -691,6 +691,10 @@ linked_lz = DROPSHIP_LZ1 is_landing_zone = TRUE minimap_color = MINIMAP_AREA_LZ + always_unpowered = FALSE + power_light = TRUE + power_equip = TRUE + power_environ = TRUE //Landing Pad for the Normandy. THIS IS NOT THE SHUTTLE AREA /area/desert_dam/exterior/landing_pad_two @@ -699,6 +703,10 @@ linked_lz = DROPSHIP_LZ2 is_landing_zone = TRUE minimap_color = MINIMAP_AREA_LZ + always_unpowered = FALSE + power_light = TRUE + power_equip = TRUE + power_environ = TRUE //Valleys //Near LZ diff --git a/code/game/area/LV624.dm b/code/game/area/LV624.dm index 6ff833bda51d..abb3e1b4fe3d 100644 --- a/code/game/area/LV624.dm +++ b/code/game/area/LV624.dm @@ -14,6 +14,7 @@ //Jungle /area/lv624/ground/jungle minimap_color = MINIMAP_AREA_JUNGLE + flags_area = AREA_YAUTJA_HANGABLE /area/lv624/ground/jungle/south_east_jungle name ="\improper Southeast Jungle" @@ -260,6 +261,11 @@ name ="\improper North Central Caves" icon_state = "away3" //meh +/area/lv624/ground/caves/north_central_caves/lake_house_tower + name = "\improper Lake House Communications Relay" + ceiling = CEILING_NONE + icon_state = "yellow" + /area/lv624/ground/caves/south_central_caves name ="\improper South Central Caves" icon_state = "away2" //meh diff --git a/code/game/area/LV759_Hybrisa_Prospera.dm b/code/game/area/LV759_Hybrisa_Prospera.dm index 6bf124d9047a..1de7eca0b4d9 100644 --- a/code/game/area/LV759_Hybrisa_Prospera.dm +++ b/code/game/area/LV759_Hybrisa_Prospera.dm @@ -219,7 +219,7 @@ soundscape_playlist = SCAPE_PL_LV759_CAVES ceiling_muffle = FALSE minimap_color = MINIMAP_AREA_HYBRISACAVES - unoviable_timer = FALSE + unoviable_timer = 25 MINUTES always_unpowered = TRUE /area/lv759/indoors/caves/electric_fence1 @@ -323,7 +323,7 @@ soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES ceiling_muffle = FALSE minimap_color = MINIMAP_AREA_HYBRISACAVES - unoviable_timer = FALSE + unoviable_timer = 25 MINUTES /area/lv759/outdoors/caves/north_west_caves_outdoors name = "Caverns - Northwest" @@ -333,7 +333,7 @@ soundscape_playlist = SCAPE_PL_LV759_CAVES ceiling_muffle = FALSE minimap_color = MINIMAP_AREA_HYBRISACAVES - unoviable_timer = FALSE + unoviable_timer = 25 MINUTES /area/lv759/indoors/caves/north_east_caves name = "Caverns - Northeast" @@ -568,6 +568,12 @@ requires_power = FALSE minimap_color = MINIMAP_AREA_COLONY +/area/lv759/indoors/spaceport/clf_dropship + name = "UD-9M 'Dogbite'" + icon_state = "wydropship" + requires_power = FALSE + minimap_color = MINIMAP_AREA_COLONY + // Garage /area/lv759/indoors/garage_reception diff --git a/code/game/area/admin_level.dm b/code/game/area/admin_level.dm index a4d70860d823..81763675b171 100644 --- a/code/game/area/admin_level.dm +++ b/code/game/area/admin_level.dm @@ -174,6 +174,7 @@ name = "Tutorial Zone" icon_state = "tutorial" requires_power = FALSE + unlimited_power = TRUE flags_area = AREA_NOTUNNEL|AREA_AVOID_BIOSCAN statistic_exempt = TRUE ceiling = CEILING_METAL @@ -188,3 +189,6 @@ /area/misc/tutorial/no_baselight base_lighting_alpha = 0 + +/area/misc/tutorial/no_baselight/open + ceiling = CEILING_NONE diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm index 5d676522014f..f9eb67bfed20 100644 --- a/code/game/area/almayer.dm +++ b/code/game/area/almayer.dm @@ -14,6 +14,8 @@ // soundscape_playlist = list('sound/effects/xylophone1.ogg', 'sound/effects/xylophone2.ogg', 'sound/effects/xylophone3.ogg') ambience_exterior = AMBIENCE_ALMAYER ceiling_muffle = FALSE + flags_area = AREA_NOSECURECADES + weather_enabled = FALSE ///Whether this area is used for hijack evacuation progress var/hijack_evacuation_area = FALSE @@ -495,6 +497,9 @@ /area/almayer/maint/hull/lower/p_bow name = "\improper Lower Deck Port-Bow Hull" +/area/almayer/maint/hull/lower/lower_astronav + name = "\improper Lower Deck Weapons Control Maintenance" + /area/almayer/maint/hull/lower/s_bow name = "\improper Lower Deck Starboard-Bow Hull" @@ -921,3 +926,85 @@ /area/almayer/evacuation/stranded/pod16 /area/almayer/evacuation/stranded/pod17 /area/almayer/evacuation/stranded/pod18 + +//Mid-Deck + +/area/almayer/middeck + name = "USS Almayer - Middle Deck" + allow_construction = FALSE + icon_state = "lowerhull" + +/area/almayer/middeck/hanger + name = "Middle Deck - Hangerbay Catwalks" + icon_state = "hangar" + +/area/almayer/middeck/medical + name = "Middle Deck - Medical Catwalks" + icon_state = "medical" + +/area/almayer/middeck/engineer + name = "Middle Deck - Engineering Catwalks" + icon_state = "workshop" + +/area/almayer/middeck/req + name = "Middle Deck - Requisition Catwalks" + icon_state = "req" + +/area/almayer/middeck/briefing + name = "Middle Deck - Briefing Catwalks" + icon_state = "briefing" + +/area/almayer/middeck/maintenance + name = "\improper Middle Deck Maintenance - Parent" + +//Bow + +/area/almayer/middeck/maintenance/bow + name = "\improper Middle Deck Maintenance - Bow" + +/area/almayer/middeck/maintenance/pb + name = "\improper Middle Deck Maintenance - Port-Bow" + +/area/almayer/middeck/maintenance/sb + name = "\improper Middle Deck Maintenance - Starboard-Bow" + +//Fore + +/area/almayer/middeck/maintenance/amidship + name = "\improper Middle Deck Maintenance - Amidship" + +/area/almayer/middeck/maintenance/sf + name = "\improper Middle Deck Maintenance - Starboard-Fore" + +/area/almayer/middeck/maintenance/sp + name = "\improper Middle Deck Maintenance - Port-Fore" + +//Aft + +/area/almayer/middeck/maintenance/aft + name = "\improper Middle Deck Maintenance - Aft" + +/area/almayer/middeck/maintenance/saft + name = "\improper Middle Deck Maintenance - Starboard-Aft" + +/area/almayer/middeck/maintenance/paft + name = "\improper Middle Deck Maintenance - Port-Aft" + +//Admin Lower Level + +/area/almayer/underdeck/ + name = "USS Almayer - Under Deck" + allow_construction = FALSE + icon_state = "lowerhull" + +/area/almayer/underdeck/hangar + name = "USS Almayer - Under Deck Hangar" + icon_state = "hangar" + +/area/almayer/underdeck/req + name = "USS Almayer - Under Deck Cargo" + icon_state = "req" + +/area/almayer/underdeck/vehicle + name = "USS Almayer - Under Deck Vehicle Bay" + icon_state = "req" diff --git a/code/game/area/areas_event.dm b/code/game/area/areas_event.dm index c43dae3a65b2..f32eb08e53c4 100644 --- a/code/game/area/areas_event.dm +++ b/code/game/area/areas_event.dm @@ -52,6 +52,8 @@ structure: //always powered requires_power = FALSE unlimited_power = TRUE + // ovi block timer is disabled so queens can do ovi stuff in event areas, namely USS runtime. + unoviable_timer = FALSE //no dynamic lighting, unpowered. /area/event/unpowered @@ -67,14 +69,15 @@ structure: icon_state = "event_dyn" requires_power = TRUE unlimited_power = TRUE + // Base lighting disabled so that normal lighting can function. + base_lighting_alpha = 0 -//no dynamic lighting, unpowered. +//dynamic lighting, unpowered. /area/event/dynamic/unpowered name = "Open grounds (event D)" icon_state = "event_dyn_nopower" unlimited_power = FALSE - base_lighting_alpha = 255 //dynamic lighting, lit, powered. /area/event/dynamic/lit @@ -89,7 +92,6 @@ structure: icon_state = "event_dyn_lit_nopower" unlimited_power = FALSE - base_lighting_alpha = 255 //-----------------------CEILING_METAL-------------------------- @@ -115,8 +117,10 @@ structure: icon_state = "metal_dyn" requires_power = TRUE unlimited_power = TRUE + // Base lighting disabled so that normal lighting can function. + base_lighting_alpha = 0 -//no dynamic lighting, unpowered. +//dynamic lighting, unpowered. /area/event/metal/dynamic/unpowered name = "Building interior (event D)" icon_state = "metal_dyn_nopower" @@ -168,8 +172,10 @@ structure: icon_state = "under_dyn" requires_power = TRUE unlimited_power = TRUE + // Base lighting disabled so that normal lighting can function. + base_lighting_alpha = 0 -//no dynamic lighting, unpowered. +//dynamic lighting, unpowered. /area/event/underground/dynamic/unpowered name = "Small caves (event D)" icon_state = "under_dyn_nopower" @@ -223,8 +229,10 @@ structure: icon_state = "undercas_dyn" requires_power = TRUE unlimited_power = TRUE + // Base lighting disabled so that normal lighting can function. + base_lighting_alpha = 0 -//no dynamic lighting, unpowered. +//dynamic lighting, unpowered. /area/event/underground_no_CAS/dynamic/unpowered name = "Caves (event D)" icon_state = "undercas_dyn_nopower" @@ -276,8 +284,10 @@ structure: icon_state = "deep_dyn" requires_power = TRUE unlimited_power = TRUE + // Base lighting disabled so that normal lighting can function. + base_lighting_alpha = 0 -//no dynamic lighting, unpowered. +//dynamic lighting, unpowered. /area/event/deep_underground/dynamic/unpowered name = "Deep underground (event D)" icon_state = "deep_dyn_nopower" diff --git a/code/game/area/hunting_preserve.dm b/code/game/area/hunting_preserve.dm index ef3bf22b535b..74d0df0db3bc 100644 --- a/code/game/area/hunting_preserve.dm +++ b/code/game/area/hunting_preserve.dm @@ -3,9 +3,8 @@ /area/yautja_grounds name = "\improper Yautja Hunting Grounds" icon_state = "green" - ambience_exterior = AMBIENCE_JUNGLE weather_enabled = FALSE - flags_area = AREA_NOTUNNEL|AREA_AVOID_BIOSCAN|AREA_YAUTJA_GROUNDS|AREA_YAUTJA_HUNTING_GROUNDS + flags_area = AREA_YAUTJA_HANGABLE|AREA_NOTUNNEL|AREA_AVOID_BIOSCAN|AREA_YAUTJA_GROUNDS|AREA_YAUTJA_HUNTING_GROUNDS resin_construction_allowed = FALSE can_build_special = FALSE is_resin_allowed = TRUE @@ -13,81 +12,59 @@ /area/yautja_grounds/jungle name = "\improper Yautja Hunting Grounds Jungle Central" icon_state = "central" - ambience_exterior = AMBIENCE_JUNGLE + ambience_exterior = AMBIENCE_JUNGLEMOON + soundscape_playlist = SCAPE_PL_JUNGLE_MOON + soundscape_interval = 60 /area/yautja_grounds/jungle/north name = "\improper Yautja Hunting Grounds Jungle north" icon_state = "north" - ambience_exterior = AMBIENCE_JUNGLE -/area/yautja_grounds/north_east - name = "\improper Yautja Hunting Grounds Jungle south east" +/area/yautja_grounds/jungle/north_east + name = "\improper Yautja Hunting Grounds Jungle north east" icon_state = "northeast" - ambience_exterior = AMBIENCE_JUNGLE -/area/yautja_grounds/north_west - name = "\improper Yautja Hunting Grounds Jungle south west" +/area/yautja_grounds/jungle/north_west + name = "\improper Yautja Hunting Grounds Jungle north west" icon_state = "northwest" - ambience_exterior = AMBIENCE_JUNGLE /area/yautja_grounds/jungle/east name = "\improper Yautja Hunting Grounds Jungle east" icon_state = "east" - ambience_exterior = AMBIENCE_JUNGLE -/area/yautja_grounds/south +/area/yautja_grounds/jungle/south name = "\improper Yautja Hunting Grounds Jungle south" icon_state = "south" - ambience_exterior = AMBIENCE_JUNGLE -/area/yautja_grounds/south_east +/area/yautja_grounds/jungle/south_east name = "\improper Yautja Hunting Grounds Jungle south east" icon_state = "southeast" - ambience_exterior = AMBIENCE_JUNGLE -/area/yautja_grounds/south_west +/area/yautja_grounds/jungle/south_west name = "\improper Yautja Hunting Grounds Jungle south west " icon_state = "southwest" - ambience_exterior = AMBIENCE_JUNGLE /area/yautja_grounds/jungle/west name = "\improper Yautja Hunting Grounds Jungle west" icon_state = "west" - ambience_exterior = AMBIENCE_JUNGLE /area/yautja_grounds/caves name = "\improper Yautja Hunting Grounds Caves" icon_state = "cave" - ambience_exterior = AMBIENCE_CAVE ceiling = CEILING_UNDERGROUND_BLOCK_CAS sound_environment = SOUND_ENVIRONMENT_AUDITORIUM - -/area/yautja_grounds/temple - name = "\improper Yautja Hunting Grounds Temple" - icon_state = "bluenew" + ceiling_muffle = FALSE ambience_exterior = AMBIENCE_CAVE - ceiling = CEILING_UNDERGROUND_SANDSTONE_BLOCK_CAS - -/area/yautja_grounds/temple/entrance - name = "\improper Yautja Hunting Grounds Temple" - icon_state = "bluenew" - ambience_exterior = AMBIENCE_JUNGLE - ceiling = CEILING_SANDSTONE_ALLOW_CAS - -///TP Areas/Young blood prep areas + soundscape_playlist = SCAPE_PL_CAVE + base_muffle = MUFFLE_HIGH + soundscape_interval = 30 +///TP Areas/Prep areas /area/yautja_grounds/prep_room name = "\improper Jungle Moon Campsite" icon_state = "red" - ambience_exterior = AMBIENCE_JUNGLE - -/area/yautja_grounds/young_blood_prep - name = "\improper Jungle Moon Young Blood Prep Area" - icon_state = "red" - ambience_exterior = AMBIENCE_JUNGLE - ceiling = CEILING_SANDSTONE_ALLOW_CAS - -/area/yautja_grounds/prep_room/inside - name = "\improper Jungle Moon Campsite Room" - icon_state = "yellow" + ambience_exterior = AMBIENCE_JUNGLEMOON + sound_environment = SOUND_ENVIRONMENT_ROOM + ceiling_muffle = FALSE + base_muffle = MUFFLE_MEDIUM ceiling = CEILING_SANDSTONE_ALLOW_CAS diff --git a/code/game/area/rostock.dm b/code/game/area/rostock.dm new file mode 100644 index 000000000000..6468dc608ba4 --- /dev/null +++ b/code/game/area/rostock.dm @@ -0,0 +1,426 @@ +//ROSTOCK AREAS (Different to Almayer)--------------------------------------// +// Fore = East | Aft = West // +// Port = North | Starboard = South // +// Bow = Eastern |Stern = Western //(those are the front and back small sections) +// Naming convention is to start by port or starboard then put eitheir (bow,fore,midship,aft,stern) + +/area/rostock + name = "SSV Rostock" + icon = 'icons/turf/area_almayer.dmi' + // ambience = list('sound/ambience/shipambience.ogg') + icon_state = "almayer" + flags_area = AREA_NOTUNNEL +// requires_power = TRUE +// unlimited_power = TRUE + ceiling = CEILING_METAL + powernet_name = "rostock" + sound_environment = SOUND_ENVIRONMENT_ROOM + soundscape_interval = 30 + // soundscape_playlist = list('sound/effects/xylophone1.ogg', 'sound/effects/xylophone2.ogg', 'sound/effects/xylophone3.ogg') + ambience_exterior = AMBIENCE_ALMAYER + ceiling_muffle = FALSE + +// Upper Deck Misc +/area/rostock/upper_deck + fake_zlevel = 1 // upperdeck + +/area/rostock/upper_deck/hallway + name = "SSV Rostock - Upper Deck Midship Hallway" + icon_state = "stern" + +// Hanger Deck + +/area/rostock/hangar + fake_zlevel = 1 // upperdeck + +/area/rostock/hangar/hangarbay + name = "SSV Rostock - Hangar" + icon_state = "hangar" + soundscape_playlist = SCAPE_PL_HANGAR + soundscape_interval = 50 + +/area/rostock/hangar/pilotbunk + name = "SSV Rostock - Pilot Cryogenics" + icon_state = "livingspace" + +/area/rostock/hangar/repairbay + name = "SSV Rostock - Dropship Repair Bay" + icon_state = "dropshiprepair" + +// Medical Deck (Upper/Lower) + +/area/rostock/medical + +/area/rostock/medical/lobby + name = "SSV Rostock - Medbay Lobby" + icon_state = "medical" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/storage + name = "SSV Rostock - Deployment Storage" + icon_state = "medical" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/surgery + name = "SSV Rostock - Operating Theatre" + icon_state = "operating" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/chemistry + name = "SSV Rostock - Chemical Laboratory" + icon_state = "chemistry" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/accessway + name = "SSV Rostock - Rear Corridor" + icon_state = "medical" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/prep + name = "SSV Rostock - Medical Preperation Room" + icon_state = "medical" + fake_zlevel = 2 // lowerdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/morgue + name = "SSV Rostock - Morgue" + icon_state = "medical" + fake_zlevel = 2 // lowerdeck + +// Military Police Deck (Upper/Lower) + +/area/rostock/security + +/area/rostock/security/brig_accessway + name = "SSV Rostock - Brig Accessway" + icon_state = "brig" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/brig_entryway + name = "SSV Rostock - Brig Observation Area" + icon_state = "brig" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/brig_holding_area + name = "SSV Rostock - Prisoner Holding Area" + icon_state = "brigcells" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/execution_room + name = "SSV Rostock - Execution Room" + icon_state = "brigcells" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/execution_storage + name = "SSV Rostock - Execution Storage Room" + icon_state = "brigcells" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/brig_office + name = "SSV Rostock - Brig Office" + icon_state = "brig" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/headquarters_lobby + name = "SSV Rostock - Politsiya HQ Lobby" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +/area/rostock/security/headquarters_interrogation + name = "SSV Rostock - Interrogation Room" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +/area/rostock/security/headquarters_bunk + name = "SSV Rostock - Politsiya Bunks" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +/area/rostock/security/headquarters_storage + name = "SSV Rostock - Politsiya Equipment Storage" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +/area/rostock/security/headquarters_armory + name = "SSV Rostock - Politsiya Armory" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +// Vehicle Storage + +/area/rostock/vehiclehangar + name = "SSV Rostock - Vehicle Hangar" + icon_state = "exoarmor" + fake_zlevel = 2 //upperdeck + +// Engineering Deck + +/area/rostock/engineering + +/area/rostock/engineering/main_area + name = "SSV Rostock - Engineering" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +/area/rostock/engineering/reactor + name = "SSV Rostock - Reactor Core" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +/area/rostock/engineering/lower_aft_corridor + name = "SSV Rostock - Upper Aft Entrance Corridor" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +/area/rostock/engineering/port_aft_accessway + name = "SSV Rostock - Port Aft Accessway" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +/area/rostock/engineering/starboard_aft_accessway + name = "SSV Rostock - Starboard Aft Accessway" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +// Upperdeck Maintenance + +/area/rostock/upperdeck_maint + fake_zlevel = 1 //upperdeck + +/area/rostock/upperdeck_maint/p_a + name = "SSV Rostock - Upper Port-Aft Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/p_m + name = "SSV Rostock - Upper Port-Midship Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/p_f + name = "SSV Rostock - Upper Port-Fore Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/s_a + name = "SSV Rostock - Upper Starboard-Aft Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/s_m + name = "SSV Rostock - Upper Starboard-Midship Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/s_f + name = "SSV Rostock - Upper Starboard-Fore Maintenance" + icon_state = "upperhull" + +// ERT Docking Ports + +/area/rostock/ert_dock + +/area/rostock/ert_dock/port + name = "SSV Rostock - Port Emergency Docking" + icon_state = "starboardpd" + fake_zlevel = 1 // upperdeck + +/area/rostock/ert_dock/starboard + name = "SSV Rostock - Starboard Emergency Docking" + icon_state = "starboardpd" + fake_zlevel = 1 // upperdeck + +// Stairs +/area/rostock/stair_clone + name = "SSV Rostock - Lower Deck Stairs" + icon_state = "stairs_lowerdeck" + fake_zlevel = 2 // lowerdeck + resin_construction_allowed = FALSE + requires_power = FALSE + +/area/rostock/stair_clone/upper + name = "SSV Rostock - Upper Deck Stairs" + icon_state = "stairs_upperdeck" + fake_zlevel = 1 // upperdeck + +// Command + +/area/rostock/command + +/area/rostock/command/astronavigation + name = "SSV Rostock - Astronavigational Deck" + icon_state = "astronavigation" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/cic + name = "SSV Rostock - Combat Information Centre" + icon_state = "cic" + fake_zlevel = 2 // lowerdeck + soundscape_playlist = SCAPE_PL_CIC + soundscape_interval = 50 + flags_area = AREA_NOTUNNEL + +/area/rostock/command/armory + name = "SSV Rostock - Command Armory" + icon_state = "cic" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/hallway + name = "SSV Rostock - Command Hallway" + icon_state = "cic" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/dining + name = "SSV Rostock - Command Dining Hall" + icon_state = "cic" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/co + name = "SSV Rostock - Commanding Officer's Quarters" + icon_state = "officerrnr" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/xo + name = "SSV Rostock - Kapitan's Quarter's" + icon_state = "officerrnr" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/polcom + name = "SSV Rostock - Political Officer's Quarters" + icon_state = "officerrnr" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/so + name = "SSV Rostock - Staff Officer's Bunks" + icon_state = "officerrnr" + fake_zlevel = 2 // lowerdeck + +// Lower Deck Misc + +/area/rostock/lower_deck + fake_zlevel = 2 // lowerdeck + +/area/rostock/lower_deck/m_hallway + name = "SSV Rostock - Lower Deck Midship Hallway" + icon_state = "stern" + +/area/rostock/lower_deck/p_hallway + name = "SSV Rostock - Lower Deck Port Hallway" + icon_state = "port" + +/area/rostock/lower_deck/s_a_hallway + name = "SSV Rostock - Lower Deck Starboard-Aft Hallway" + icon_state = "starboard" + +/area/rostock/lower_deck/p_a_hallway + name = "SSV Rostock - Lower Deck Port-Aft Hallway" + icon_state = "port" + +/area/rostock/lower_deck/engineering_lower_access + name = "SSV Rostock - Lower Deck Engineering Starboard Aft Accessway" + icon_state = "port" + +/area/rostock/lower_deck/cryogenics + name = "SSV Rostock - Cryogenic Cells" + icon_state = "cryo" + +/area/rostock/lower_deck/prep + name = "SSV Rostock - Troop Preperation" + icon_state = "gruntrnr" + +/area/rostock/lower_deck/bunk + name = "SSV Rostock - Extended Mission Bunks" + icon_state = "gruntrnr" + +/area/rostock/lower_deck/kitchen + name = "SSV Rostock - Meal Hall" + icon_state = "gruntrnr" + +/area/rostock/lower_deck/bathroom + name = "SSV Rostock - Unisex Bathroom" + icon_state = "missionplanner" + +/area/rostock/lower_deck/ammunition_storage + name = "SSV Rostock - Heavy Ordinance Storage" + icon_state = "missionplanner" + +/area/rostock/lower_deck/briefing + name = "SSV Rostock - Briefing Hall" + icon_state = "briefing" + +/area/rostock/lower_deck/starboard_umbilical + name = "\improper Lower Deck Starboard Umbilical Hallway" + icon_state = "portumbilical" + +// Lower Deck Maintenance + +/area/rostock/lowerdeck_maint + fake_zlevel = 2 //lowerdeck + +/area/rostock/lowerdeck_maint/p_a + name = "SSV Rostock - Lower Port-Aft Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/p_m + name = "SSV Rostock - Lower Port-Midship Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/p_f + name = "SSV Rostock - Lower Port-Fore Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/s_a + name = "SSV Rostock - Lower Starboard-Aft Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/s_m + name = "SSV Rostock - Lower Starboard-Midship Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/s_f + name = "SSV Rostock - Lower Starboard-Fore Maintenance" + icon_state = "lowerhull" + +// Railguns + +/area/rostock/railgun + name = "SSV Rostock - Port Railgun Control Room" + icon_state = "weaponroom" + +/area/rostock/railgun/starboard + name = "SSV Rostock - Starboard Railgun Control Room" + icon_state = "weaponroom" + +// AI Core - 1VAN/3 + +/area/rostock/airoom + name = "SSV Rostock - AI Core" + icon_state = "airoom" + fake_zlevel = 2 // lowerdeck + soundscape_playlist = SCAPE_PL_ARES + soundscape_interval = 120 + flags_area = AREA_NOTUNNEL|AREA_UNWEEDABLE + can_build_special = FALSE + is_resin_allowed = FALSE + resin_construction_allowed = FALSE + +// Requisitions Bay + +/area/rostock/req + name = "SSV Rostock - Requisitions" + icon_state = "req" + fake_zlevel = 2 // lowerdeck + +// Lifeboat + +/area/rostock/lifeboat + name = "SSV Rostock - Lifeboat Docking Port" + icon_state = "selfdestruct" + fake_zlevel = 2 // lowerdeck + diff --git a/code/game/area/space_station_13_areas.dm b/code/game/area/space_station_13_areas.dm index a4deed0bc171..9a69919f1e8b 100644 --- a/code/game/area/space_station_13_areas.dm +++ b/code/game/area/space_station_13_areas.dm @@ -86,6 +86,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station requires_power = 0 flags_area = AREA_NOTUNNEL statistic_exempt = TRUE + block_game_interaction = TRUE ceiling = CEILING_METAL base_lighting_alpha = 255 diff --git a/code/game/area/strata.dm b/code/game/area/strata.dm index 54809ac3589f..082ce19195ad 100644 --- a/code/game/area/strata.dm +++ b/code/game/area/strata.dm @@ -1,566 +1,527 @@ -//Areas for the Sorokyne Strata (aka Carp Lake.dm) - -/* AG in a path stands for ABOVE GROUND, while UG stands for underground. -After that, all areas are sorted by EXTERIOR or INTERIOR. With INTERIOR being any area that isn't nippy and cold. (All buildings & jungle caves) -EXTERIOR is FUCKING FREEZING, and refers to areas out in the open and or exposed to the elements. -*/ +// Areas for the Sorokyne Strata /area/strata name = "Sorokyne Strata" icon = 'icons/turf/area_strata.dmi' - //ambience = list('figuresomethingout.ogg') icon_state = "strata" can_build_special = TRUE //T-Comms structure powernet_name = "ground" - temperature = SOROKYNE_TEMPERATURE //If not in a building, it'll be cold. All interior areas are set to T20C + temperature = TROPICAL_TEMP minimap_color = MINIMAP_AREA_COLONY -/area/shuttle/drop1/strata //Not in Sulaco.DM because holy shit we need to sort things. - name = "Dropship Alamo Landing Zone" - icon_state = "shuttle" - base_lighting_alpha = 255 - minimap_color = MINIMAP_AREA_LZ - linked_lz = DROPSHIP_LZ1 - -/area/shuttle/drop2/strata - name = "Dropship Normandy Landing Zone" - icon_state = "shuttle2" - base_lighting_alpha = 255 - minimap_color = MINIMAP_AREA_LZ - linked_lz = DROPSHIP_LZ2 - - -//Begin actual area definitions. There's probably a better way to do this. +/area/strata/interior/out_of_bounds + name = "Out of Bounds" + icon_state = "ag_i" + soundscape_playlist = FALSE + ambience_exterior = FALSE + requires_power = FALSE + is_resin_allowed = FALSE + flags_area = AREA_NOTUNNEL|AREA_UNWEEDABLE + ceiling = CEILING_MAX ////////////////////////////////////////// -// ------===| Essentials |===------ // -////////////////////////////////////////// - -//-Above Ground (ag) -/area/strata/ag - name = "Above Ground Area" - icon_state = "ag" -/area/strata/ag/exterior - name = "Exterior Above Ground Area" +/area/strata/exterior + name = "Exterior" icon_state = "ag_e" ceiling = CEILING_NONE - //always_unpowered = 1 So exterior lights work, this will be commented out unless it causes unforseen issues. + ambience_exterior = AMBIENCE_JUNGLE_ALT -/area/strata/ag/interior - name = "Interior Above Ground Area" +/area/strata/interior + name = "Interior" icon_state = "ag_i" - requires_power = 1 - temperature = T20C //Nice and room temp ceiling = CEILING_METAL - - -//-Under Ground (ug) - -/area/strata/ug - name = "Under Ground Area" - icon_state = "ug" - ceiling = CEILING_UNDERGROUND_ALLOW_CAS - -/area/strata/ug/interior - name = "Interior Under Ground Area" - icon_state = "ug_i" - requires_power = 1 - temperature = T20C - -/area/strata/ug/exterior - name = "Exterior Under Ground Area" - icon_state = "ug_i" - requires_power = 1 - temperature = T20C - ceiling = CEILING_NONE - weather_enabled = TRUE - + soundscape_playlist = SCAPE_PL_LV759_INDOORS + ambience_exterior = AMBIENCE_HYBRISA_INTERIOR + temperature = T20C //Nice and room temp //////////////////////////////////////// -// ------===| Exterior |===------ // -//////////////////////////////////////// - //-Landing Zones -/area/strata/ag/exterior/landing_zones + +/area/strata/exterior/landing_zones name = "Do not use." icon_state = "landingzone_2" minimap_color = MINIMAP_AREA_LZ -/area/strata/ag/exterior/landing_zones/lz2 - name = "Landing Zone 2 Pad - Ice Fields" +/area/strata/interior/landing_zones + name = "Do not use." + icon_state = "landingzone_1" + minimap_color = MINIMAP_AREA_LZ + +/area/strata/exterior/landing_zones/lz2 + name = "Landing Zone 2 Pad - Rocky Fields" unlimited_power = 1 //So the DS computer always works for the Queen - weather_enabled = FALSE is_landing_zone = TRUE linked_lz = DROPSHIP_LZ2 -/area/strata/ag/exterior/landing_zones/near_lz2 - name = "Landing Zone 2 - Ice Fields" +/area/strata/exterior/landing_zones/near_lz2 + name = "Landing Zone 2 - Rocky Fields" icon_state = "nearlz2" - weather_enabled = TRUE is_landing_zone = TRUE linked_lz = DROPSHIP_LZ2 -/area/strata/ag/interior/landing_zones - name = "Do not use." - icon_state = "landingzone_1" - minimap_color = MINIMAP_AREA_LZ - weather_enabled = FALSE - ceiling = CEILING_NONE - -/area/strata/ag/interior/landing_zones/lz1 +/area/strata/interior/landing_zones/lz1 name = "Landing Zone 1 Pad - Mining Aerodrome" unlimited_power = 1 //So the DS computer always works for the Queen is_landing_zone = TRUE linked_lz = DROPSHIP_LZ1 -/area/strata/ag/interior/landing_zones/near_lz1 +/area/strata/interior/landing_zones/near_lz1 name = "Landing Zone 1 - Mining Aerodrome" icon_state = "nearlz1" is_landing_zone = TRUE linked_lz = DROPSHIP_LZ1 +//-Caves (how are these caves?) -//-Caves -/area/strata/ag/exterior/caves - name = "Do not use." +/area/strata/exterior/shed_five_caves + name = "Terminal Five Topside Pathway" icon_state = "lzcaves" -/area/strata/ag/exterior/caves/shed_five_caves - name = "Terminal Five Topside Caves" - -/area/strata/ag/exterior/caves/lz_caves - name = "External Mining Aerodrome Caves" +/area/strata/exterior/lz_caves + name = "External Mining Aerodrome Pathway" linked_lz = DROPSHIP_LZ1 - -/area/strata/ag/exterior/jungle/carplake_center - name = "Deep Jungle - Carp Lake Center Island" - icon_state = "ug_jung_1" - weather_enabled = TRUE - unoviable_timer = FALSE + icon_state = "lzcaves" //-Marsh -/area/strata/ag/exterior/marsh +/area/strata/exterior/marsh name = "Do not use." icon_state = "marsh" -/area/strata/ag/exterior/marsh/spring_marshes - name = "Cryo-Thermal Springs Marshes" +/area/strata/exterior/marsh/spring_marshes + name = "Geothermal Springs Marshes" linked_lz = list(DROPSHIP_LZ1, DROPSHIP_LZ2) -/area/strata/ag/exterior/marsh/water_marshes - name = "Cryo-Thermal Water Marshes" +/area/strata/exterior/marsh/water_marshes + name = "Geothermal Water Marshes" linked_lz = DROPSHIP_LZ2 -/area/strata/ag/exterior/marsh/island_marshes - name = "Cryo-Thermal Island Marshes" +/area/strata/exterior/marsh/island_marshes + name = "Geothermal Island Marshes" is_landing_zone = TRUE linked_lz = DROPSHIP_LZ2 -/area/strata/ag/exterior/marsh/relay_marshes - name = "Cryo-Thermal Relay Marshes" +/area/strata/exterior/marsh/relay_marshes + name = "Geothermal Relay Marshes" is_landing_zone = TRUE linked_lz = DROPSHIP_LZ2 -/area/strata/ag/exterior/marsh/center - name = "Cryo-Thermal Springs" +/area/strata/exterior/marsh/center + name = "Geothermal Springs" icon_state = "marshcenter" linked_lz = list(DROPSHIP_LZ1, DROPSHIP_LZ2) -/area/strata/ag/exterior/marsh/river - name = "Cryo-Thermal River" +/area/strata/exterior/marsh/river + name = "Geothermal River" icon_state = "marshriver" linked_lz = DROPSHIP_LZ1 -/area/strata/ag/exterior/marsh/crash - name = "Cryo-Thermal Crashed Lifeboat" +/area/strata/exterior/marsh/crash + name = "Geothermal Crashed Dropship" icon_state = "marshship" linked_lz = list(DROPSHIP_LZ1, DROPSHIP_LZ2) -/area/strata/ag/exterior/marsh/water - name = "Cryo-Thermal Water" +/area/strata/exterior/marsh/water + name = "Geothermal Water" icon_state = "marshwater" - temperature = TCMB //space cold linked_lz = DROPSHIP_LZ2 //-Outside "interiors" -/area/strata/ag/exterior/vanyard +/area/strata/interior/vanyard name = "Flight Control Vehicle Yard" icon_state = "garage" -/area/strata/ag/exterior/tcomms - name = "Do not use." +/area/strata/exterior/tcomms_mining_caves + name = "Mining Pathway Relay" icon_state = "tcomms1" -/area/strata/ag/exterior/tcomms/mining_caves - name = "Mining Caves Relay" +/area/strata/exterior/tcomms_vehicle_yard + name = "Vehicle Yard Relay" + icon_state = "tcomms1" //-Outpost -/area/strata/ag/exterior/outpost_decks - name = "Outpost Decks" +/area/strata/exterior/outpost_decks + name = "Outpost - Decks" icon_state = "rdecks" minimap_color = MINIMAP_AREA_CAVES //-Paths -/area/strata/ag/exterior/paths - name = "Ice Path" - icon_state = "path" - -/area/strata/ag/exterior/paths/flight_control_exterior +/area/strata/exterior/flight_control_exterior name = "Flight Control Exterior" linked_lz = DROPSHIP_LZ1 + icon_state = "path" -/area/strata/ag/exterior/paths/mining_outpost_exterior - name = "Mining Outpost Exterior" +/area/strata/exterior/mining_outpost_exterior + name = "Mining Outpost - Exterior" linked_lz = DROPSHIP_LZ1 + icon_state = "path" -/area/strata/ag/exterior/paths/north_outpost +/area/strata/exterior/north_outpost name = "Outpost - North Access Channel" icon_state = "outpost_gen_2" + icon_state = "path" -/area/strata/ag/exterior/paths/far_north_outpost +/area/strata/exterior/far_north_outpost name = "Far North Of The Outpost" icon_state = "cabin" unoviable_timer = FALSE + icon_state = "path" -/area/strata/ag/exterior/paths/south_outpost +/area/strata/exterior/south_outpost name = "South Of The Outpost" - ceiling = CEILING_NONE + icon_state = "path" //////////////////////////////////////// -// ------===| Interior |===------ // -//////////////////////////////////////// - -/area/strata/ug/interior/jungle - name = "Do not use." - ceiling = CEILING_DEEP_UNDERGROUND - //-Outpost -/area/strata/ag/interior/outpost +/area/strata/interior/outpost name = "Sorokyne Outpost" icon_state = "shed_x_ag" minimap_color = MINIMAP_AREA_CAVES - ceiling = CEILING_UNDERGROUND_METAL_ALLOW_CAS -/area/strata/ag/interior/outpost/foyer - name = "Outpost Main Foyer" +/area/strata/interior/outpost/foyer + name = "Outpost - Main Foyer" icon_state = "outpost_gen_1" -/area/strata/ag/interior/outpost/maint - name = "Outpost Canteen - Eastern Maintenance" +/area/strata/interior/outpost/maint + name = "Outpost - Canteen - Eastern Maintenance" icon_state = "outpost_maint" -/area/strata/ag/interior/outpost/med - name = "Outpost Medical" +/area/strata/interior/outpost/med + name = "Outpost - Medical" icon_state = "outpost_med" minimap_color = MINIMAP_AREA_MEDBAY -/area/strata/ag/interior/outpost/engi - name = "Outpost Engineering" +/area/strata/interior/outpost/engi + name = "Outpost - Engineering" icon_state = "outpost_engi_0" minimap_color = MINIMAP_AREA_ENGI -/area/strata/ag/interior/outpost/engi/drome - name = "Outpost Aerodome" +/area/strata/interior/outpost/engi/drome + name = "Outpost - Aerodome" icon_state = "outpost_engi_4" -/area/strata/ag/interior/outpost/engi/drome/shuttle +/area/strata/interior/outpost/engi/drome/shuttle name = "Dismantled VDVK Eagle Mk 4" icon_state = "outpost_engi_3" -/area/strata/ag/interior/outpost/security - name = "Outpost Security" +/area/strata/interior/outpost/engi/drome/shuttle_MK3 + name = "VDVK Eagle Mk 3" + icon_state = "outpost_engi_3" + +/area/strata/interior/shuttle_sof + name = "UPP-DS-3 'Voron'" + icon_state = "outpost_engi_3" + ambience_exterior = AMBIENCE_SHIP_ALT + +/area/strata/interior/supply_shuttle_sof + name = "UPP-DS-3 'Volk'" + icon_state = "outpost_engi_3" + ambience_exterior = AMBIENCE_SHIP_ALT + +/area/strata/interior/outpost/security + name = "Outpost - Security" icon_state = "outpost_sec_0" minimap_color = MINIMAP_AREA_SEC -/area/strata/ag/interior/outpost/admin - name = "Outpost Administration" +/area/strata/interior/outpost/admin + name = "Outpost - Administration" icon_state = "outpost_admin_0" minimap_color = MINIMAP_AREA_COMMAND ceiling = CEILING_GLASS -/area/strata/ag/interior/outpost/canteen - name = "Outpost Canteen" +/area/strata/interior/outpost/canteen + name = "Outpost - Canteen" icon_state = "outpost_canteen_0" ceiling = CEILING_GLASS -/area/strata/ag/interior/outpost/canteen/bar - name = "Outpost Bar" +/area/strata/interior/outpost/canteen/bar + name = "Outpost - Bar" icon_state = "outpost_canteen_2" //-Mining Outpost -/area/strata/ag/interior/mining_outpost - name = "Do not use." +/area/strata/interior/mining_outpost + name = "Mining Outpost - Central" + icon_state = "dorms_0" minimap_color = MINIMAP_AREA_MINING linked_lz = DROPSHIP_LZ1 - ceiling = CEILING_UNDERGROUND_METAL_ALLOW_CAS - -/area/strata/ag/interior/mining_outpost/central - name = "Mining Outpost Central" - icon_state = "dorms_0" - ceiling = CEILING_GLASS -/area/strata/ag/interior/mining_outpost/south_dormitories - name = "Mining Outpost South Dormitories" +/area/strata/interior/mining_outpost/south_dormitories + name = "Mining Outpost - South Dormitories" icon_state = "dorms_3" ceiling = CEILING_GLASS -/area/strata/ag/interior/mining_outpost/maintenance - name = "Mining Outpost Dormitory Maintenance" +/area/strata/interior/mining_outpost/maintenance + name = "Mining Outpost - Dormitory Maintenance" icon_state = "outpost_maint" -/area/strata/ag/interior/mining_outpost/hive - name = "Mining Outpost Dormitory Thermal Storage" +/area/strata/interior/mining_outpost/hive + name = "Mining Outpost - Dormitory Geothermal Storage" icon_state = "dorms_beno" -/area/strata/ag/interior/mining_outpost/canteen - name = "Mining Outpost Dormitory Canteen" +/area/strata/interior/mining_outpost/canteen + name = "Mining Outpost - Dormitory Canteen" icon_state = "dorms_canteen" ceiling = CEILING_GLASS -/area/strata/ag/interior/mining_outpost/flight_control - name = "Mining Outpost Flight Control" +/area/strata/interior/mining_outpost/flight_control + name = "Mining Outpost - Flight Control" icon_state = "dorms_lobby" is_landing_zone = TRUE -//-Outside interiors - -/area/strata/ag/interior/outside - name= "Do not use." - icon_state = "outpost_gen_3" - -/area/strata/ag/interior/outside/administration +/area/strata/interior/administration name = "Flight Control Offices" icon_state = "offices" minimap_color = MINIMAP_AREA_COMMAND - ceiling = CEILING_UNDERGROUND_METAL_ALLOW_CAS linked_lz = DROPSHIP_LZ1 -/area/strata/ag/interior/outside/wooden_hospital +/area/strata/interior/wooden_hospital name = "Wooden Hospital - Hospital Proper" icon_state = "cabin3" minimap_color = MINIMAP_AREA_CAVES unoviable_timer = FALSE -/area/strata/ag/interior/mountain - name = "Outside mountain" - icon_state = "ag_e" +/area/strata/interior/wooden_ruins + name = "Old Wooden Building" + icon_state = "cabin3" + minimap_color = MINIMAP_AREA_CAVES + unoviable_timer = FALSE -/area/strata/ag/interior/outside/mountain - name = "Outside mountain" - icon_state = "ag_e" +// Sec Checkpoints -/area/strata/ag/interior/outside/checkpoints +/area/strata/interior/checkpoints name= "Do not use." icon_state = "security_station" - ceiling = CEILING_UNDERGROUND_METAL_ALLOW_CAS minimap_color = MINIMAP_AREA_SEC -/area/strata/ag/interior/outside/checkpoints/north_armor +/area/strata/interior/checkpoints/north_armor name = "North Security Armored Checkpoint" -/area/strata/ag/interior/outside/checkpoints/north +/area/strata/interior/checkpoints/north name = "Landing Zone North Security Checkpoint" -/area/strata/ag/interior/outside/checkpoints/west +/area/strata/interior/checkpoints/west name = "Landing Zone West Security Checkpoint" -/area/strata/ag/interior/outside/checkpoints/south +/area/strata/interior/checkpoints/south name = "Landing Zone South Security Checkpoint" is_landing_zone = TRUE -/area/strata/ag/interior/outside/checkpoints/outpost - name = "Outpost Deck Security Checkpoint" +/area/strata/interior/checkpoints/outpost + name = "Outpost - Deck Security Checkpoint" icon_state = "rdecks_sec" -/area/strata/ag/interior/outside/engineering - name = "Do not use." - icon_state = "outpost_engi_3" - minimap_color = MINIMAP_AREA_ENGI - linked_lz = DROPSHIP_LZ2 +// Engi Storage -/area/strata/ag/interior/outside/engineering/parts_storage - name = "Engineering Parts Storage" +/area/strata/interior/parts_storage + name = "Engineering - Parts Storage" icon_state = "outpost_engi_1" - ceiling = CEILING_UNDERGROUND_METAL_ALLOW_CAS -/area/strata/ag/interior/outside/engineering/parts_storage_exterior - name = "Engineering Parts Storage Exterior" - weather_enabled = TRUE +/area/strata/interior/generator_substation + name = "Engineering - Generator Substation" + icon_state = "outpost_engi_1" -/area/strata/ag/interior/outside/engineering/parts_storage_cave - name = "Engineering Parts Storage Exterior" +/area/strata/exterior/parts_storage_exterior + name = "Engineering - Parts Storage Exterior" + icon_state = "outpost_engi_4" + ceiling = CEILING_UNDERGROUND_ALLOW_CAS + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE + +/area/strata/exterior/parts_storage_cave + name = "Engineering - Parts Storage Exterior" icon_state = "outpost_engi_4" minimap_color = MINIMAP_AREA_ENGI_CAVE - ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ceiling = CEILING_UNDERGROUND_ALLOW_CAS + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE + +// BBall, Caves & Secure Checkpoint -/area/strata/ag/interior/outside/bball //come on and SLAM. - name = "Outpost Basket Ball Court" +/area/strata/interior/bball //come on and SLAM. + name = "Outpost - Basket Ball Court" icon_state = "outpost_gen_4" - ceiling = CEILING_UNDERGROUND_METAL_ALLOW_CAS minimap_color = MINIMAP_AREA_CAVES -/area/strata/ag/interior/outside/bball/cave //come on BURST AND DIE. +/area/strata/interior/bball_cave //come on BURST AND DIE. name = "Outpost - B-Ball Caves" icon_state = "hive_1" ceiling = CEILING_UNDERGROUND_BLOCK_CAS minimap_color = MINIMAP_AREA_CAVES_DEEP unoviable_timer = FALSE + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE +/area/strata/interior/secure_checkpoint + name = "Secure Checkpoint Passthrough" + icon_state = "outpost_engi_0" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + minimap_color = MINIMAP_AREA_CAVES_DEEP + unoviable_timer = FALSE + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE -//-Underground Dorms +//-Deep Jungle Dorms -/area/strata/ug/interior/outpost - name = "Do not use." - icon_state = "shed_x_ug" - minimap_color = MINIMAP_AREA_CAVES - -/area/strata/ug/interior/outpost/underground_dorms +/area/strata/interior/underground_dorms name = "Do not use." icon_state = "ug_jung_dorm" minimap_color = MINIMAP_AREA_CAVES_STRUCTURE + ceiling = CEILING_UNDERGROUND_METAL_BLOCK_CAS + ceiling_muffle = FALSE -/area/strata/ug/interior/outpost/underground_dorms/sec1 - name = "Underground Security Dorm #1" +/area/strata/interior/underground_dorms/sec1 + name = "Deep Jungle - Security Dorm #1" unoviable_timer = FALSE -/area/strata/ug/interior/outpost/underground_dorms/sec2 - name = "Underground Security Dorm #2" +/area/strata/interior/underground_dorms/sec2 + name = "Deep Jungle - Security Dorm #2" unoviable_timer = FALSE -/area/strata/ug/interior/outpost/underground_dorms/admin1 - name = "Underground General Staff Dorm #1" +/area/strata/interior/underground_dorms/admin1 + name = "Deep Jungle - General Staff Dorm #1" -/area/strata/ug/interior/outpost/underground_dorms/admin2 - name = "Underground General Staff Dorm #2" +/area/strata/interior/underground_dorms/admin2 + name = "Deep Jungle - General Staff Dorm #2" unoviable_timer = FALSE -/area/strata/ug/interior/outpost/underground_dorms/admin3 - name = "Underground General Staff Dorm #3" +/area/strata/interior/underground_dorms/admin3 + name = "Deep Jungle - General Staff Dorm #3" unoviable_timer = FALSE -/area/strata/ug/interior/outpost/underground_dorms/admin4 - name = "Underground General Staff Dorm #4" +/area/strata/interior/underground_dorms/admin4 + name = "Deep Jungle - General Staff Dorm #4" unoviable_timer = FALSE -/area/strata/ug/interior/outpost/underground_dorms/med1 - name = "Underground Medical Dorm #1" +/area/strata/interior/underground_dorms/med1 + name = "Deep Jungle - Medical Dorm #1" requires_power = 1 -/area/strata/ug/interior/outpost/underground_dorms/med2 - name = "Underground Medical Dorm #2" +/area/strata/interior/underground_dorms/med2 + name = "Deep Jungle - Medical Dorm #2" + requires_power = TRUE + +/area/strata/interior/underground_dorms/botany + name = "Botanical Research Station" requires_power = TRUE -//-Underground platform +//-Platform -/area/strata/ug/interior/outpost/platform - name = "Underground Platform" +/area/strata/exterior/outpost_platform + name = "Deep Jungle - Platform" icon_state = "ug_jung_1" minimap_color = MINIMAP_AREA_MEDBAY_CAVE -//-Underground Jungle +//-Jungle -/area/strata/ug/interior/jungle +/area/strata/exterior/carplake_center + name = "Deep Jungle - Lake Center Island" + icon_state = "ug_jung_1" + unoviable_timer = FALSE + +/area/strata/exterior/deep_jungle name = "Do not use." icon_state = "ug_jung_0" minimap_color = MINIMAP_AREA_JUNGLE + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ceiling_muffle = FALSE -/area/strata/ug/interior/jungle/carplake - name = "Do not use." - icon_state = "ug_jung_1" - unoviable_timer = FALSE - -/area/strata/ug/interior/jungle/carplake/north +/area/strata/exterior/deep_jungle/carplake_north name = "Deep Jungle - North of Carp Lake" icon_state = "ug_jung_6" -/area/strata/ug/interior/jungle/carplake/east +/area/strata/exterior/deep_jungle/carplake_east name = "Deep Jungle - East of Carp Lake" icon_state = "ug_jung_5" -/area/strata/ug/interior/jungle/platform - name = "Do not use." - icon_state = "ug_jung_1" - -/area/strata/ug/interior/jungle/platform/south - name = "Deep Jungle - South of Underground Platform" +/area/strata/exterior/deep_jungle/platform + name = "Deep Jungle - South of the Platform" icon_state = "ug_jung_4" unoviable_timer = FALSE -/area/strata/ug/interior/jungle/platform/east - name = "Deep Jungle - East of Underground Platform" +/area/strata/exterior/deep_jungle/platform_east + name = "Deep Jungle - East of the Platform" icon_state = "ug_jung_0" unoviable_timer = FALSE + ceiling = CEILING_NONE -/area/strata/ug/interior/jungle/structures - name = "Do not use." - icon_state = "ug_jung_mine_1" - ceiling = CEILING_DEEP_UNDERGROUND_METAL - -/area/strata/ug/interior/jungle/structures/research - icon_state = "ug_jung_2" - name = "Deep Jungle - Classified Research Station" - minimap_color = MINIMAP_AREA_RESEARCH - unoviable_timer = FALSE - -/area/strata/ug/interior/jungle/structures/research/south - icon_state = "ug_jung_3" - name = "Deep Jungle - South of Classified Research Station" - minimap_color = MINIMAP_AREA_JUNGLE - -/area/strata/ug/interior/jungle/structures/research/hot_springs +/area/strata/exterior/deep_jungle/hot_springs icon_state = "ug_jung_4" name = "Deep Jungle - Hot Springs" minimap_color = MINIMAP_AREA_JUNGLE -/area/strata/ug/interior/jungle/structures/research/old_tunnels +/area/strata/exterior/deep_jungle/old_tunnels icon_state = "ug_jung_mine_1" - name = "Deep Jungle - Old Tunnels" + name = "Deep Jungle - Old Path - West of Classified Research Station" minimap_color = MINIMAP_AREA_JUNGLE + ceiling = CEILING_NONE -/area/strata/ug/interior/jungle/structures/monitoring - icon_state = "ug_jung_5" - name = "Deep Jungle - Planetary Core Monitoring" - minimap_color = MINIMAP_AREA_CAVES_STRUCTURE - unoviable_timer = FALSE +/area/strata/exterior/deep_jungle/north + icon_state = "ug_jung_6" + name = "Deep Jungle - South of Classified Research Station" + minimap_color = MINIMAP_AREA_JUNGLE -/area/strata/ug/interior/jungle/structures/monitoring/west +/area/strata/exterior/deep_jungle/west icon_state = "ug_jung_6" name = "Deep Jungle - West of Planetary Core Monitoring" minimap_color = MINIMAP_AREA_JUNGLE -/area/strata/ug/interior/jungle/structures/monitoring/south +/area/strata/exterior/deep_jungle/south icon_state = "ug_jung_7" name = "Deep Jungle - South of Planetary Core Monitoring" minimap_color = MINIMAP_AREA_JUNGLE -/area/strata/ug/interior/jungle/structures/monitoring/east +/area/strata/exterior/deep_jungle/east icon_state = "ug_jung_8" name = "Deep Jungle - East of Planetary Core Monitoring" minimap_color = MINIMAP_AREA_JUNGLE -/area/strata/ug/interior/jungle/structures/ruin +/area/strata/exterior/deep_jungle/planet_core_research_station_exterior + icon_state = "ug_jung_8" + name = "Deep Jungle - Planetary Core Monitoring Research Station" + minimap_color = MINIMAP_AREA_JUNGLE + +/area/strata/exterior/deep_jungle/ruin icon_state = "ug_jung_mine_4" name = "Deep Jungle - Ancient Dorms" unoviable_timer = FALSE + weather_enabled = FALSE -/area/strata/ug/interior/jungle/tearlake +/area/strata/exterior/deep_jungle/tearlake name = "Deep Jungle - Weeping Pool" icon_state = "ug_jung_3" unoviable_timer = FALSE +// Deep Jungle Structure + +/area/strata/interior/planet_core_research_station + icon_state = "ug_jung_5" + name = "Deep Jungle - Planetary Core Monitoring Research Station" + minimap_color = MINIMAP_AREA_CAVES_STRUCTURE + unoviable_timer = FALSE + ceiling = CEILING_UNDERGROUND_METAL_BLOCK_CAS + ceiling_muffle = FALSE + +/area/strata/interior/research + icon_state = "ug_jung_2" + name = "Deep Jungle - Classified Research Station" + minimap_color = MINIMAP_AREA_RESEARCH + unoviable_timer = FALSE + ceiling = CEILING_UNDERGROUND_METAL_BLOCK_CAS + ceiling_muffle = FALSE + //-Others -/area/strata/ag/interior/restricted +/area/strata/exterior/restricted name = "Super Secret Credits Room" icon_state = "marshwater" requires_power = FALSE @@ -569,11 +530,11 @@ EXTERIOR is FUCKING FREEZING, and refers to areas out in the open and or exposed // CLF Insert -/area/strata/ag/interior/outside/checkpoints/clf +/area/strata/interior/checkpoints/clf name = "Far North Armored Checkpoint" -/area/strata/ag/interior/outpost/clf_dorms +/area/strata/interior/outpost/clf_dorms name = "Far North Dormitory" -/area/strata/ag/interior/outpost/clf_office +/area/strata/interior/outpost/clf_office name = "Far North Office" diff --git a/code/game/blood.dm b/code/game/blood.dm index 9628bfec542f..c4951c05f323 100644 --- a/code/game/blood.dm +++ b/code/game/blood.dm @@ -76,6 +76,7 @@ blood_color = null if(blood_overlay) overlays.Remove(blood_overlay) + blood_overlay = null // so guns will actually be cleaned of blood return 1 /obj/item/clothing/gloves/clean_blood() diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index 8701d02d1175..8bfe06245fa0 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -141,7 +141,7 @@ Additional game mode variables. //===================================================\\ /datum/game_mode/proc/initialize_predator(mob/living/carbon/human/new_predator, ignore_pred_num = FALSE) - predators[new_predator.ckey] = list("Name" = new_predator.real_name, "Status" = "Alive") + predators[new_predator.username()] = list("Name" = new_predator.real_name, "Status" = "Alive") if(!ignore_pred_num) pred_current_num++ @@ -265,6 +265,9 @@ Additional game mode variables. GLOB.RoleAuthority.equip_role(new_predator, J, new_predator.loc) + if(new_predator.client.check_whitelist_status(WHITELIST_YAUTJA_LEADER) && (tgui_alert(new_predator, "Do you wish to announce your presence?", "Announce Arrival", list("Yes","No"), 10 SECONDS) != "No")) + elder_overseer_message("[new_predator.real_name] has joined the hunting party.") + return new_predator //===================================================\\ @@ -357,9 +360,11 @@ Additional game mode variables. return TRUE /datum/game_mode/proc/load_fax_base() + loaded_fax_base = "loading" loaded_fax_base = SSmapping.lazy_load_template(/datum/lazy_template/fax_response_base, force = TRUE) - if(!loaded_fax_base) + if(!loaded_fax_base || (loaded_fax_base == "loading")) log_debug("Error loading fax response base!") + loaded_fax_base = null return FALSE return TRUE @@ -512,6 +517,15 @@ Additional game mode variables. // If a lobby player is trying to join as xeno, estimate their possible position if(is_new_player) + if(!SSticker.HasRoundStarted() || world.time < SSticker.round_start_time + 15 SECONDS) + // Larva queue numbers are too volatile at the start of the game for the estimation to be what they end up with + to_chat(xeno_candidate, SPAN_XENONOTICE("Larva queue position estimation is not available until shortly after the game has started. \ + The ordering is based on your time of death or the time you joined. When you have been dead long enough and are not inactive, \ + you will periodically receive messages where you are in the queue relative to other currently valid xeno candidates. \ + Your current position will shift as others change their preferences or go inactive, but your relative position compared to all observers is the same. \ + Note: Playing as a facehugger/lesser or in the thunderdome will not alter your time of death. \ + This means you won't lose your relative place in queue if you step away, disconnect, play as a facehugger/lesser, or play in the thunderdome.")) + return FALSE var/mob/new_player/candidate_new_player = xeno_candidate if(candidate_new_player.larva_queue_message_stale_time <= world.time) // No cached/current lobby message, determine the position diff --git a/code/game/gamemodes/cm_process.dm b/code/game/gamemodes/cm_process.dm index f84dd7866f85..93a931c991b9 100644 --- a/code/game/gamemodes/cm_process.dm +++ b/code/game/gamemodes/cm_process.dm @@ -1,5 +1,3 @@ - - /* Like with cm_initialize.dm, these procs exist to quickly populate classic CM game modes. Specifically for processing, announcing completion, and so on. Simply plug in these procs @@ -91,13 +89,21 @@ of predators), but can be added to include variant game modes (like humans vs. h sleep(2 SECONDS) to_chat_spaced(world, margin_bottom = 0, html = SPAN_ROLE_BODY("|______________________|")) to_world(SPAN_ROLE_HEADER("FUN FACTS")) - var/list/fact_types = subtypesof(/datum/random_fact) + var/list/fact_types = shuffle(subtypesof(/datum/random_fact)) + var/facts_so_far = 0 for(var/fact_type as anything in fact_types) - var/datum/random_fact/fact_human = new fact_type(set_check_human = TRUE, set_check_xeno = FALSE) - fact_human.announce() + var/datum/random_fact/fact_human = new fact_type(check_human=TRUE, check_xeno=FALSE) + if(fact_human.announce()) + facts_so_far++ + if(facts_so_far >= MAX_FACTION_FACTS_TO_ANNOUNCE) + break + facts_so_far = 0 for(var/fact_type as anything in fact_types) - var/datum/random_fact/fact_xeno = new fact_type(set_check_human = FALSE, set_check_xeno = TRUE) - fact_xeno.announce() + var/datum/random_fact/fact_xeno = new fact_type(check_human=FALSE, check_xeno=TRUE) + if(fact_xeno.announce()) + facts_so_far++ + if(facts_so_far >= MAX_FACTION_FACTS_TO_ANNOUNCE) + break to_chat_spaced(world, margin_top = 0, html = SPAN_ROLE_BODY("|______________________|")) //===================================================\\ diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index ca390a6bb3f5..e173912e25ee 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -137,6 +137,7 @@ addtimer(CALLBACK(src, PROC_REF(ares_online)), 5 SECONDS) addtimer(CALLBACK(src, PROC_REF(map_announcement)), 20 SECONDS) addtimer(CALLBACK(src, PROC_REF(start_lz_hazards)), DISTRESS_LZ_HAZARD_START) + addtimer(CALLBACK(src, PROC_REF(ares_command_check)), 2 MINUTES) addtimer(CALLBACK(SSentity_manager, TYPE_PROC_REF(/datum/controller/subsystem/entity_manager, select), /datum/entity/survivor_survival), 7 MINUTES) return ..() @@ -358,6 +359,63 @@ var/rendered_announce_text = replacetext(SSmapping.configs[GROUND_MAP].announce_text, "###SHIPNAME###", MAIN_SHIP_NAME) marine_announcement(rendered_announce_text, "[MAIN_SHIP_NAME]") +/datum/game_mode/proc/ares_command_check() + var/role_in_charge + var/mob/living/carbon/human/person_in_charge + + var/list/role_needs_id = list(JOB_SO, JOB_CHIEF_ENGINEER, JOB_DROPSHIP_PILOT, JOB_CAS_PILOT, JOB_INTEL) + var/list/role_needs_comms = list(JOB_CHIEF_POLICE, JOB_CMO, JOB_CHIEF_ENGINEER, JOB_DROPSHIP_PILOT, JOB_CAS_PILOT, JOB_INTEL) + var/announce_addendum + + var/datum/squad/intel_squad = GLOB.RoleAuthority.squads_by_type[/datum/squad/marine/intel] + var/list/intel_officers = intel_squad.marines_list + + //Basically this follows the list of command staff in order of CoC, + //then if the role lacks senior command access it gives the person that access + + if(GLOB.marine_leaders[JOB_CO] || GLOB.marine_leaders[JOB_XO]) + return + //If we have a CO or XO, we're good no need to announce anything. + + for(var/job_by_chain in CHAIN_OF_COMMAND_ROLES) + role_in_charge = job_by_chain + + if(job_by_chain == JOB_SO && GLOB.marine_leaders[JOB_SO]) + person_in_charge = pick(GLOB.marine_leaders[JOB_SO]) + break + if(job_by_chain == JOB_INTEL && !!length(intel_officers)) + person_in_charge = pick(intel_officers) + break + //If the job is a list we have to stop here + if(person_in_charge) + continue + + var/datum/job/job_datum = GLOB.RoleAuthority.roles_for_mode[job_by_chain] + person_in_charge = job_datum.get_active_player_on_job() + if(!isnull(person_in_charge)) + break + + if(isnull(person_in_charge)) + return + + if(LAZYFIND(role_needs_comms, role_in_charge)) + //If the role needs comms we let them know about the headset. + announce_addendum += "\nA Command headset is availible in the CIC Command Tablet cabinet." + + if(LAZYFIND(role_needs_id, role_in_charge)) + //If the role needs senior command access, we need to add it to the ID card. + var/obj/item/card/id/card = person_in_charge.get_idcard() + if(card) + var/list/access = card.access + access.Add(ACCESS_MARINE_SENIOR) + announce_addendum += "\nSenior Command access added to ID." + + //does an announcement to the crew about the commander & alerts admins to that change for logs. + shipwide_ai_announcement("Due to the absence of command staff, commander authority now falls to [role_in_charge] [person_in_charge], who will assume command until further notice. Please direct all inquiries and follow instructions accordingly. [announce_addendum]", MAIN_AI_SYSTEM, 'sound/misc/interference.ogg') + message_admins("[key_name(person_in_charge, 1)] [ADMIN_JMP_USER(person_in_charge)] has been designated the operation commander.") + return + + /datum/game_mode/colonialmarines/proc/ares_conclude() ai_silent_announcement("Bioscan complete. No unknown lifeform signature detected.", ".V") ai_silent_announcement("Saving operational report to archive.", ".V") @@ -388,7 +446,7 @@ continue if(!hive.living_xeno_queen && hive.xeno_queen_timer < world.time) - xeno_message("The Hive is ready for a new Queen to evolve.", 3, hive.hivenumber) + xeno_message("The Hive is ready for a new Queen to evolve. The hive can only survive for a limited time without a queen!", 3, hive.hivenumber) if(!active_lz && world.time > lz_selection_timer) select_lz(locate(/obj/structure/machinery/computer/shuttle/dropship/flight/lz1)) @@ -602,26 +660,29 @@ GLOB.round_statistics.current_map.total_marine_majors++ if(MODE_INFESTATION_X_MINOR) var/list/living_player_list = count_humans_and_xenos(get_affected_zlevels()) + end_icon = "xeno_minor" if(living_player_list[1] && !living_player_list[2]) // If Xeno Minor but Xenos are dead and Humans are alive, see which faction is the last standing var/headcount = count_per_faction() var/living = headcount["total_headcount"] if ((headcount["WY_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/lastmanstanding_wy.ogg') + end_icon = "wy_major" log_game("3rd party victory: Weyland-Yutani") message_admins("3rd party victory: Weyland-Yutani") else if ((headcount["UPP_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/lastmanstanding_upp.ogg') + end_icon = "upp_major" log_game("3rd party victory: Union of Progressive Peoples") message_admins("3rd party victory: Union of Progressive Peoples") else if ((headcount["CLF_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/lastmanstanding_clf.ogg') + end_icon = "upp_major" log_game("3rd party victory: Colonial Liberation Front") message_admins("3rd party victory: Colonial Liberation Front") else if ((headcount["marine_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/neutral_melancholy2.ogg') //This is the theme song for Colonial Marines the game, fitting else musical_track = pick('sound/theme/neutral_melancholy1.ogg') - end_icon = "xeno_minor" if(GLOB.round_statistics && GLOB.round_statistics.current_map) GLOB.round_statistics.current_map.total_xeno_victories++ if(MODE_INFESTATION_M_MINOR) @@ -634,9 +695,12 @@ musical_track = 'sound/theme/neutral_hopeful2.ogg' if(GLOB.round_statistics && GLOB.round_statistics.current_map) GLOB.round_statistics.current_map.total_draws++ - var/sound/S = sound(musical_track, channel = SOUND_CHANNEL_LOBBY) - S.status = SOUND_STREAM - sound_to(world, S) + else + end_icon = "draw" + musical_track = 'sound/theme/neutral_hopeful2.ogg' + var/sound/theme = sound(musical_track, channel = SOUND_CHANNEL_LOBBY) + theme.status = SOUND_STREAM + sound_to(world, theme) if(GLOB.round_statistics) GLOB.round_statistics.game_mode = name GLOB.round_statistics.round_length = world.time diff --git a/code/game/gamemodes/colonialmarines/huntergames.dm b/code/game/gamemodes/colonialmarines/huntergames.dm index c681585a11df..66c922cba9e0 100644 --- a/code/game/gamemodes/colonialmarines/huntergames.dm +++ b/code/game/gamemodes/colonialmarines/huntergames.dm @@ -1,9 +1,9 @@ #define HUNTER_BEST_ITEM pick(\ - 75; list(/obj/item/clothing/glasses/night, /obj/item/storage/backpack/holding, /obj/item/storage/belt/grenade/full, /obj/item/weapon/gun/flamer), \ + 75; list(/obj/item/clothing/glasses/night, /obj/item/storage/backpack/holding, /obj/item/storage/belt/grenade/full, /obj/item/weapon/gun/flamer/m240), \ 100; list(/obj/item/weapon/twohanded/yautja/glaive, /obj/item/clothing/mask/gas/yautja/hunter, /obj/item/clothing/suit/armor/yautja/hunter,/obj/item/clothing/shoes/yautja/hunter), \ 50; list(/obj/item/weapon/yautja/chained/combistick, /obj/item/clothing/mask/gas/yautja/hunter, /obj/item/clothing/suit/armor/yautja/hunter/full,/obj/item/clothing/shoes/yautja/hunter), \ 150; list(/obj/item/stack/medical/advanced/ointment, /obj/item/stack/medical/advanced/bruise_pack, /obj/item/storage/belt/medical/lifesaver/full), \ - 50; list(/obj/item/clothing/under/marine/veteran/pmc/commando, /obj/item/clothing/suit/storage/marine/veteran/pmc/commando, /obj/item/clothing/gloves/marine/veteran/pmc/commando, /obj/item/clothing/shoes/veteran/pmc/commando, /obj/item/clothing/head/helmet/marine/veteran/pmc/commando), \ + 50; list(/obj/item/clothing/under/marine/veteran/pmc/apesuit, /obj/item/clothing/suit/storage/marine/veteran/pmc/apesuit, /obj/item/clothing/gloves/marine/veteran/pmc/apesuit, /obj/item/clothing/shoes/veteran/pmc/commando, /obj/item/clothing/head/helmet/marine/veteran/pmc/apesuit), \ 125; list(/obj/item/weapon/yautja/chain, /obj/item/weapon/yautja/knife, /obj/item/weapon/yautja/scythe, /obj/item/hunting_trap, /obj/item/hunting_trap), \ 75; list(/obj/item/weapon/gun/revolver/mateba/general, /obj/item/ammo_magazine/revolver/mateba, /obj/item/ammo_magazine/revolver/mateba, /obj/item/clothing/mask/balaclava/tactical), \ 50; list(/obj/item/weapon/shield/energy, /obj/item/weapon/energy/axe, /obj/item/clothing/under/chainshirt/hunter, /obj/item/clothing/head/helmet/gladiator, /obj/item/clothing/suit/armor/gladiator) \ @@ -36,7 +36,7 @@ 50; /obj/item/storage/firstaid/fire, \ 75; /obj/item/storage/box/mre/wy, \ \ - 100; /obj/item/storage/backpack/commando, \ + 100; /obj/item/storage/backpack/pmc/backpack/commando/apesuit, \ 100; /obj/item/storage/backpack/yautja, \ 100; /obj/item/storage/belt/knifepouch, \ 100; /obj/item/storage/belt/utility/full, \ diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm index 1674b602cd1b..a922d3d90c44 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm @@ -611,6 +611,7 @@ var/list/supplies = list( "10x24mm, slugs, buckshot, and 10x20mm rounds", "Explosives and grenades", + "SHARP ammo", "Rocket ammo", "Sniper ammo", "Anti-Material Sniper ammo", @@ -640,11 +641,14 @@ if("Explosives and grenades") supply_drop = 5 to_chat(usr, SPAN_NOTICE("Explosives and grenades will now drop!")) - if("Pyrotechnician tanks") + if("SHARP ammo") supply_drop = 6 + to_chat(usr, SPAN_NOTICE("SHARP ammo will now drop!")) + if("Pyrotechnician tanks") + supply_drop = 7 to_chat(usr, SPAN_NOTICE("Pyrotechnician tanks will now drop!")) if("Scout ammo") - supply_drop = 7 + supply_drop = 8 to_chat(usr, SPAN_NOTICE("Scout ammo will now drop!")) else return @@ -747,12 +751,17 @@ if(5) // Give them explosives + Grenades for the Grenade spec. Might be too many grenades, but we'll find out. spawnitems = list(/obj/item/storage/box/explosive_mines, /obj/item/storage/belt/grenade/full) - if(6) // Pyrotech + if(6) // SHARP ammo + spawnitems = list(/obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/incendiary, + /obj/item/ammo_magazine/rifle/sharp/flechette,) + if(7) // Pyrotech var/fuel = pick(/obj/item/ammo_magazine/flamer_tank/large/B, /obj/item/ammo_magazine/flamer_tank/large/X) spawnitems = list(/obj/item/ammo_magazine/flamer_tank/large, /obj/item/ammo_magazine/flamer_tank/large, fuel) - if(7) // Scout + if(8) // Scout spawnitems = list(/obj/item/ammo_magazine/rifle/m4ra/custom, /obj/item/ammo_magazine/rifle/m4ra/custom, /obj/item/ammo_magazine/rifle/m4ra/custom/incendiary, diff --git a/code/game/gamemodes/extended/cm_vs_upp.dm b/code/game/gamemodes/extended/cm_vs_upp.dm index 855d04a26763..c26f6d20a426 100644 --- a/code/game/gamemodes/extended/cm_vs_upp.dm +++ b/code/game/gamemodes/extended/cm_vs_upp.dm @@ -1,3 +1,6 @@ +/// How long to delay the round completion (command is immediately notified) +#define ROUND_END_DELAY (2 MINUTES) + /datum/game_mode/extended/faction_clash/cm_vs_upp name = "Faction Clash UPP CM" config_tag = "Faction Clash UPP CM" @@ -19,6 +22,12 @@ ) taskbar_icon = 'icons/taskbar/gml_hvh.png' + var/upp_ship = "ssv_rostock.dmm" + +/datum/game_mode/extended/faction_clash/cm_vs_upp/pre_setup() + . = ..() + GLOB.round_should_check_for_win = FALSE + /datum/game_mode/extended/faction_clash/cm_vs_upp/get_roles_list() return GLOB.ROLES_CM_VS_UPP @@ -27,10 +36,154 @@ . = ..() SSweather.force_weather_holder(/datum/weather_ss_map_holder/faction_clash) for(var/area/area in GLOB.all_areas) + if(is_mainship_level(area.z)) + continue area.base_lighting_alpha = 150 area.update_base_lighting() +/datum/game_mode/extended/faction_clash/cm_vs_upp/process() + if(--round_started > 0) + return FALSE //Initial countdown, just to be safe, so that everyone has a chance to spawn before we check anything. + . = ..() + if(!round_finished) + if(++round_checkwin >= 5) //Only check win conditions every 5 ticks. + if(GLOB.round_should_check_for_win) + check_win() + round_checkwin = 0 + + +/datum/game_mode/extended/faction_clash/cm_vs_upp/check_win() + if(SSticker.current_state != GAME_STATE_PLAYING) + return + + var/upp_left = 0 + var/uscm_left = 0 + var/loss_threshold = 5 + var/list/z_levels = SSmapping.levels_by_any_trait(list(ZTRAIT_GROUND)) + for(var/mob/mob in GLOB.player_list) + if(mob.z && (mob.z in z_levels) && mob.stat != DEAD && !istype(mob.loc, /turf/open/space)) + if(ishuman(mob) && !isyautja(mob) && !(mob.status_flags & XENO_HOST) && !iszombie(mob)) + var/mob/living/carbon/human/human = mob + if(!human.handcuffed && !human.resting) + if(human.faction == FACTION_UPP) + upp_left ++ + if(human.faction == FACTION_MARINE) + uscm_left ++ + if(upp_left >= loss_threshold && uscm_left >= loss_threshold) + return + + if(upp_left < loss_threshold || uscm_left < loss_threshold) + if(upp_left < loss_threshold) + round_finished = MODE_INFESTATION_M_MAJOR + else + round_finished = MODE_FACTION_CLASH_UPP_MAJOR + roundend_ceasefire() + + SSticker.roundend_check_paused = TRUE + addtimer(VARSET_CALLBACK(SSticker, roundend_check_paused, FALSE), ROUND_END_DELAY) + + +/datum/game_mode/extended/faction_clash/cm_vs_upp/check_finished() + if(round_finished) + return TRUE + +/datum/game_mode/extended/faction_clash/cm_vs_upp/proc/roundend_ceasefire() + set_gamemode_modifier(/datum/gamemode_modifier/ceasefire, enabled = TRUE) + switch(round_finished) + if(MODE_FACTION_CLASH_UPP_MAJOR) + marine_announcement("ALERT: USCM ground force overrun scenario in progress. Automated command directive issued, all USCM personnel are ordered to evacuate combat zone.\n\nOpposing Force have issued a ceasefire, risk of capture of USCM personnel by opposing force is high, avoid contact and evade capture.\n\nFinal report being prepared in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Enemy force are combat inoperative, enemy force are conducting an evacuation of the operations zone.\n\nA ceasefire is in effect. Union forces are directed to attempt to capture fleeing enemy force personnel.\n\nFinal report being prepared in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + if(MODE_FACTION_CLASH_UPP_MINOR) + marine_announcement("ALERT: USCM ground force overrun scenario in progress. Automated command directive issued, all USCM personnel are ordered to evacuate combat zone.\n\nOpposing Force have issued a ceasefire, risk of capture of USCM personnel by opposing force is high, avoid contact and evade capture.\n\nFinal report being prepared in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Enemy force are combat inoperative, enemy force are conducting an evacuation of the operations zone.\n\nA ceasefire is in effect. Union forces are directed to attempt to capture fleeing enemy force personnel.\n\nFinal report being prepared in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + if(MODE_INFESTATION_M_MAJOR) + marine_announcement("ALERT: Opposing force are conducting emergency evacuation of the operations zone. Confidence is high that opposing forces are retreating from the planet.\n\nCeasefire is in effect to minimise non-combatant casualties, ground forces are directed to intercept and detain retreating opposing forces\n\nFinal report being prepared in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Unsustainable combat losses noted. Automated strategic reposition order is now in effect. All Union combat personnel are to return to dropships and re-deploy to the SSV Rostock.\n\nEnemy force have instituted a ceasefire, exploit this to assist in evading capture.\n\nFinal report being prepared in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + if(MODE_INFESTATION_M_MINOR) + marine_announcement("ALERT: Opposing force are conducting emergency evacuation of the operations zone. Confidence is high that opposing forces are retreating from the planet.\n\nCeasefire is in effect to minimise non-combatant casualties, ground forces are directed to intercept and detain retreating opposing forces.\n\nFinal report being prepared in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Unsustainable combat losses noted. Automated strategic reposition order is now in effect. All Union combat personnel are to return to dropships and re-deploy to the SSV Rostock.\n\nEnemy force have instituted a ceasefire, exploit this to assist in evading capture.\n\nFinal report being prepared in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + if(MODE_BATTLEFIELD_DRAW_STALEMATE) + marine_announcement("ALERT: A ceasefire is now in effect. Further details pending. All combat operations are to cease. Further information pending in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: A ceasefire is now in effect. Further details pending. All combat operations are to cease. Additional facts pending in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + + +/datum/game_mode/extended/faction_clash/cm_vs_upp/declare_completion() + announce_ending() + var/musical_track + var/end_icon = "draw" + switch(round_finished) + if(MODE_FACTION_CLASH_UPP_MAJOR) + marine_announcement("ALERT: All ground forces killed in action or non-responsive. Landing zone overrun. Impossible to sustain combat operations.\n\nMission Abort Authorized! Commencing automatic vessel deorbit procedure from operations zone.\n\nSaving operational report to archive, commencing final systems scan.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Enemy landing zone status. Under Union Military Control. Enemy ground forces. Deceased and/or in Union Military custody.\n\nMission Accomplished! Dispatching subspace signal to Sector Command.\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + musical_track = pick('sound/theme/lastmanstanding_upp.ogg') + end_icon = "upp_major" + if(MODE_FACTION_CLASH_UPP_MINOR) + marine_announcement("ALERT: All ground forces killed in action or non-responsive. Landing zone overrun. Impossible to sustain combat operations.\n\nMission Abort Authorized! Commencing automatic vessel deorbit procedure from operations zone.\n\nSaving operational report to archive, commencing final systems scan.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Enemy landing zone status. Under Union Military Control. Enemy ground forces. Deceased and/or in Union Military custody.\n\nMission Accomplished! Dispatching subspace signal to Sector Command.\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + musical_track = pick('sound/theme/lastmanstanding_upp.ogg') + end_icon = "upp_minor" + if(MODE_INFESTATION_M_MAJOR) + marine_announcement("ALERT: Opposing Force landing zone under USCM force control. Orbital scans concludes all opposing force combat personnel are combat inoperative.\n\nMission Accomplished!\n\nSaving operational report to archive, commencing final systems.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Union landing zone compromised. Union ground forces are non-responsive. Further combat operations impossible.\n\nMission Abort Authorized\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + musical_track = pick('sound/theme/winning_triumph1.ogg','sound/theme/winning_triumph2.ogg') + end_icon = "marine_major" + if(MODE_INFESTATION_M_MINOR) + marine_announcement("ALERT: Opposing Force landing zone under USCM force control. Orbital scans concludes all opposing force combat personnel are combat inoperative.\n\nMission Accomplished!\n\nSaving operational report to archive, commencing final systems scan.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Union landing zone compromised. Union ground forces are non-responsive. Further combat operations impossible.\n\nMission Abort Authorized\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + musical_track = pick('sound/theme/neutral_hopeful1.ogg','sound/theme/neutral_hopeful2.ogg') + end_icon = "marine_minor" + if(MODE_BATTLEFIELD_DRAW_STALEMATE) + marine_announcement("ALERT: Inconclusive combat outcome. Unable to assess tactical or strategic situation.\n\nDispatching automated request to High Command for further directives.\n\nSaving operational report to archive, commencing final systems scan.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Battle situation has developed not necessarily to the Unions advantage\n\nDispatching request for new directives to Sector Command.\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + end_icon = "draw" + musical_track = 'sound/theme/neutral_hopeful2.ogg' + else + end_icon = "draw" + musical_track = 'sound/theme/neutral_hopeful2.ogg' + var/sound/theme = sound(musical_track, channel = SOUND_CHANNEL_LOBBY) + theme.status = SOUND_STREAM + sound_to(world, theme) + + calculate_end_statistics() + show_end_statistics(end_icon) + + declare_completion_announce_fallen_soldiers() + declare_completion_announce_predators() + declare_completion_announce_medal_awards() + declare_fun_facts() + + return TRUE + +/datum/game_mode/extended/faction_clash/cm_vs_upp/ds_first_landed(obj/docking_port/stationary/marine_dropship) + if(round_started > 0) //we enter here on shipspawn but do not want this + return + .=..() + marine_announcement("First troops have landed on the colony! Five minute long ceasefire is in effect to allow evacuation of civilians.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("First troops have landed on the colony! Five minute long ceasefire is in effect to allow evacuation of civilians.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + set_gamemode_modifier(/datum/gamemode_modifier/ceasefire, enabled = TRUE) + addtimer(CALLBACK(src,PROC_REF(ceasefire_warning)), 4 MINUTES) + addtimer(CALLBACK(src,PROC_REF(ceasefire_end)), 5 MINUTES) + addtimer(VARSET_CALLBACK(GLOB, round_should_check_for_win, TRUE), 15 MINUTES) + +/datum/game_mode/extended/faction_clash/cm_vs_upp/proc/ceasefire_warning() + marine_announcement("Ceasefire ends in one minute.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("Ceasefire ends in one minute.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + +/datum/game_mode/extended/faction_clash/cm_vs_upp/proc/ceasefire_end() + marine_announcement("Ceasefire is over. Combat operations may commence.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("Ceasefire is over. Combat operations may commence.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + set_gamemode_modifier(/datum/gamemode_modifier/ceasefire, enabled = FALSE) + GLOB.round_should_check_for_win = TRUE + + + /datum/game_mode/extended/faction_clash/cm_vs_upp/announce() . = ..() + addtimer(CALLBACK(src,PROC_REF(deleyed_announce)), 10 SECONDS) + +/datum/game_mode/extended/faction_clash/cm_vs_upp/proc/deleyed_announce() marine_announcement("An automated distress call has been received from the local colony.\n\nAlert! Sensors have detected a Union of Progressive People's warship in orbit of colony. Enemy Vessel has refused automated hails and is entering lower-planetary orbit. High likelihood enemy vessel is preparing to deploy dropships to local colony. Authorization to interdict and repel hostile force from allied territory has been granted. Automated thawing of cryostasis marine reserves in progress.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) marine_announcement("Alert! Sensors have detected encroaching USCM vessel on an intercept course with local colony.\n\nIntelligence suggests this is the [MAIN_SHIP_NAME]. Confidence is high that USCM force is acting counter to Union interests in this area. Authorization to deploy ground forces to disrupt foreign power attempt to encroach on Union interests has been granted. Emergency awakening of cryostasis troop reserves in progress.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + + +#undef ROUND_END_DELAY diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 35ea20cb497e..a4be09d24612 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -140,7 +140,7 @@ GLOBAL_VAR_INIT(cas_tracking_id_increment, 0) //this var used to assign unique t if(GLOB.round_statistics) GLOB.round_statistics.track_round_end() log_game("Round end result: [round_finished]") - to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Round Complete|")) + to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Round Complete:[round_finished]|")) to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDBODY("Thus ends the story of the brave men and women of the [MAIN_SHIP_NAME] and their struggle on [SSmapping.configs[GROUND_MAP].map_name].\nThe game-mode was: [GLOB.master_mode]!\n[CONFIG_GET(string/endofroundblurb)]")) /datum/game_mode/proc/declare_completion() @@ -184,9 +184,9 @@ GLOBAL_VAR_INIT(cas_tracking_id_increment, 0) //this var used to assign unique t if(M.client && M.client.player_data) if(M.stat == DEAD) - record_playtime(M.client.player_data, JOB_OBSERVER, type) + record_playtime(M.client.player_data, JOB_OBSERVER, M.type) else - record_playtime(M.client.player_data, M.job, type) + record_playtime(M.client.player_data, M.job, M.type) /datum/game_mode/proc/show_end_statistics(icon_state) GLOB.round_statistics.update_panel_data() diff --git a/code/game/gamemodes/round_modifiers.dm b/code/game/gamemodes/round_modifiers.dm index 4e6ead453cb2..c3b47bcfb206 100644 --- a/code/game/gamemodes/round_modifiers.dm +++ b/code/game/gamemodes/round_modifiers.dm @@ -145,3 +145,7 @@ /datum/gamemode_modifier/no_body_c4 modifier_name = "No body c4" modifier_desc = "Prevents c4 explosives from being planted on dead body." + +/datum/gamemode_modifier/ceasefire + modifier_name = "Ceasefire" + modifier_desc = "Prevents firing guns and throwing granades." diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index f8f24e5c4bdc..9395db4bef69 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -110,7 +110,7 @@ if(ACCESS_LIST_MARINE_MAIN) return list( ACCESS_MARINE_SENIOR, - ACCESS_MARINE_DATABASE, + ACCESS_MARINE_GENERAL, ACCESS_MARINE_COMMAND, ACCESS_MARINE_CMP, ACCESS_MARINE_BRIG, @@ -146,11 +146,13 @@ ACCESS_MARINE_CHAPLAIN, ACCESS_MARINE_FIELD_DOC, ACCESS_PRESS, + ACCESS_MARINE_DATABASE, ) if(ACCESS_LIST_MARINE_ALL) return list( ACCESS_MARINE_CO, + ACCESS_MARINE_DATABASE_ADMIN, ACCESS_MARINE_AI, ACCESS_MARINE_AI_TEMP, ) + get_access(ACCESS_LIST_MARINE_MAIN) @@ -313,8 +315,9 @@ if(5)//Command return list( ACCESS_MARINE_SENIOR, - ACCESS_MARINE_DATABASE, ACCESS_MARINE_COMMAND, + ACCESS_MARINE_GENERAL, + ACCESS_MARINE_DATABASE, ACCESS_MARINE_RO, ACCESS_MARINE_CARGO, ACCESS_MARINE_SEA, @@ -393,6 +396,10 @@ return "[MAIN_SHIP_NAME] Engineering" if(ACCESS_MARINE_OT) return "[MAIN_SHIP_NAME] Ordnance Workshop" + if(ACCESS_MARINE_GENERAL) + return "[MAIN_SHIP_NAME] General Access" + if(ACCESS_MARINE_DATABASE) + return "[MAIN_SHIP_NAME] Database Access" if(ACCESS_MARINE_SENIOR) return "[MAIN_SHIP_NAME] Senior Command" if(ACCESS_MARINE_CO) diff --git a/code/game/jobs/job/antag/other/pred.dm b/code/game/jobs/job/antag/other/pred.dm index 27423f2aea63..c7377deadc9b 100644 --- a/code/game/jobs/job/antag/other/pred.dm +++ b/code/game/jobs/job/antag/other/pred.dm @@ -79,3 +79,10 @@ if(SSticker.mode) SSticker.mode.initialize_predator(hunter, ignore_pred_num = TRUE) + +/datum/timelock/young_blood + name = "Young Blood Roles" + +/datum/timelock/young_blood/New(name, time_required, list/roles) + . = ..() + src.roles = JOB_YOUNGBLOOD_ROLES_LIST diff --git a/code/game/jobs/job/civilians/civilian.dm b/code/game/jobs/job/civilians/civilian.dm index bb8741a9154f..776a88cb8b87 100644 --- a/code/game/jobs/job/civilians/civilian.dm +++ b/code/game/jobs/job/civilians/civilian.dm @@ -15,6 +15,13 @@ . = ..() src.roles = JOB_DOCTOR_ROLES_LIST +/datum/timelock/research + name = "Research Roles" + +/datum/timelock/research/New(name, time_required, list/roles) + . = ..() + src.roles = JOB_RESEARCH_ROLES_LIST + /datum/timelock/corporate name = "Corporate Roles" diff --git a/code/game/jobs/job/civilians/other/survivors.dm b/code/game/jobs/job/civilians/other/survivors.dm index c7eae6ddcded..889d730d359f 100644 --- a/code/game/jobs/job/civilians/other/survivors.dm +++ b/code/game/jobs/job/civilians/other/survivors.dm @@ -211,16 +211,29 @@ AddTimelock(/datum/job/civilian/survivor, list( /datum/job/civilian/survivor/commanding_officer/set_spawn_positions() var/list/CO_survivor_types = SSmapping.configs[GROUND_MAP].CO_survivor_types - if(length(CO_survivor_types)) + var/list/CO_insert_survivor_types = SSmapping.configs[GROUND_MAP].CO_insert_survivor_types + if(length(CO_survivor_types) || length(CO_insert_survivor_types)) total_positions = 1 spawn_positions = 1 return spawn_positions /datum/job/civilian/survivor/commanding_officer/handle_equip_gear(mob/living/carbon/human/equipping_human, obj/effect/landmark/survivor_spawner/picked_spawner) - if(picked_spawner.CO_equipment) + var/list/CO_survivor_types = SSmapping.configs[GROUND_MAP].CO_survivor_types + if(picked_spawner.CO_equipment) //insert with CO arm_equipment(equipping_human, picked_spawner.CO_equipment, FALSE, TRUE) return - else - var/list/CO_survivor_types = SSmapping.configs[GROUND_MAP].CO_survivor_types + else if(length(CO_survivor_types)) //map with guarenteed CO slot arm_equipment(equipping_human, pick(CO_survivor_types), FALSE, TRUE) return + else //map that has an insert that enabled rolling for CO but the insert didn't fire and there is no default CO equipment, thus equip as a normal survivor + var/preferred_variant = ANY_SURVIVOR + if(equipping_human.client?.prefs?.pref_special_job_options[JOB_SURVIVOR] != ANY_SURVIVOR) + preferred_variant = equipping_human.client?.prefs?.pref_special_job_options[JOB_SURVIVOR] + if(MAX_SURVIVOR_PER_TYPE[preferred_variant] != -1 && SSticker.mode.survivors_by_type_amounts[preferred_variant] && SSticker.mode.survivors_by_type_amounts[preferred_variant] >= MAX_SURVIVOR_PER_TYPE[preferred_variant]) + preferred_variant = ANY_SURVIVOR + + var/list/survivor_types = preferred_variant != ANY_SURVIVOR && length(SSmapping.configs[GROUND_MAP].survivor_types_by_variant[preferred_variant]) ? SSmapping.configs[GROUND_MAP].survivor_types_by_variant[preferred_variant] : SSmapping.configs[GROUND_MAP].survivor_types + arm_equipment(equipping_human, pick(survivor_types), FALSE, TRUE) + + SSticker.mode.survivors_by_type_amounts[preferred_variant] += 1 + return diff --git a/code/game/jobs/job/civilians/support/cmo.dm b/code/game/jobs/job/civilians/support/cmo.dm index b75f840ac895..0917621094a7 100644 --- a/code/game/jobs/job/civilians/support/cmo.dm +++ b/code/game/jobs/job/civilians/support/cmo.dm @@ -1,3 +1,4 @@ +//CMO /datum/job/civilian/professor title = JOB_CMO total_positions = 1 @@ -7,9 +8,24 @@ flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = /datum/equipment_preset/uscm_ship/uscm_medical/cmo entry_message_body = "You're a commissioned officer of the USCM. You have authority over everything related to Medbay and Research, only able to be overridden by the XO and CO. You are in charge of medical staff, surgery, chemistry, stimulants and keeping the marines healthy overall." + var/mob/living/carbon/human/active_cmo + +/datum/job/civilian/professor/generate_entry_conditions(mob/living/cmo, whitelist_status) + . = ..() + active_cmo = cmo + RegisterSignal(cmo, COMSIG_PARENT_QDELETING, PROC_REF(cleanup_active_cmo)) + +/datum/job/civilian/professor/proc/cleanup_active_cmo(mob/cmo) + SIGNAL_HANDLER + active_cmo = null + +/datum/job/civilian/professor/get_active_player_on_job() + return active_cmo AddTimelock(/datum/job/civilian/professor, list( - JOB_MEDIC_ROLES = 10 HOURS + JOB_DOCTOR_ROLES = 10 HOURS, + JOB_MEDIC_ROLES = 10 HOURS, + JOB_RESEARCH_ROLES = 5 HOURS, )) /obj/effect/landmark/start/professor diff --git a/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm b/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm index 8ec1fec6c1b1..594d4090cd74 100644 --- a/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm +++ b/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm @@ -6,6 +6,19 @@ flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = /datum/equipment_preset/uscm_ship/auxiliary_officer entry_message_body = "Your job is to oversee the hangar crew, the intel officers, the engineering department, and requisition department. You have many responsibilities and a few plates to keep spinning but your subordinates are mostly self-reliant. Assist where you can and make sure command personnel are confident the auxiliary departments are operating at peak efficiency." + var/mob/living/carbon/human/active_auxiliary_officer + +/datum/job/command/auxiliary_officer/generate_entry_conditions(mob/living/auxiliary_officer, whitelist_status) + . = ..() + active_auxiliary_officer = auxiliary_officer + RegisterSignal(auxiliary_officer, COMSIG_PARENT_QDELETING, PROC_REF(cleanup_active_auxiliary_officer)) + +/datum/job/command/auxiliary_officer/proc/cleanup_active_auxiliary_officer(mob/auxiliary_officer) + SIGNAL_HANDLER + active_auxiliary_officer = null + +/datum/job/command/auxiliary_officer/get_active_player_on_job() + return active_auxiliary_officer AddTimelock(/datum/job/command/auxiliary_officer, list( JOB_SQUAD_ROLES = 5 HOURS, diff --git a/code/game/jobs/job/command/auxiliary/cas_pilot.dm b/code/game/jobs/job/command/auxiliary/cas_pilot.dm index 688e772573e7..4ea9bbb4baa1 100644 --- a/code/game/jobs/job/command/auxiliary/cas_pilot.dm +++ b/code/game/jobs/job/command/auxiliary/cas_pilot.dm @@ -8,6 +8,19 @@ flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = /datum/equipment_preset/uscm_ship/gp entry_message_body = "Your job is to fly, protect, and maintain the ship's gunship. While you are an officer, your authority is limited to the dropship, where you have authority over the enlisted personnel." + var/mob/living/carbon/human/active_cas_pilot + +/datum/job/command/pilot/cas_pilot/generate_entry_conditions(mob/living/cas_pilot, whitelist_status) + . = ..() + active_cas_pilot = cas_pilot + RegisterSignal(cas_pilot, COMSIG_PARENT_QDELETING, PROC_REF(cleanup_active_cas_pilot)) + +/datum/job/command/pilot/cas_pilot/proc/cleanup_active_cas_pilot(mob/cas_pilot) + SIGNAL_HANDLER + active_cas_pilot = null + +/datum/job/command/pilot/cas_pilot/get_active_player_on_job() + return active_cas_pilot /datum/job/command/pilot/whiskey total_positions = 2 diff --git a/code/game/jobs/job/command/auxiliary/dropship_pilot.dm b/code/game/jobs/job/command/auxiliary/dropship_pilot.dm index 028fba6baa6f..358a77496bca 100644 --- a/code/game/jobs/job/command/auxiliary/dropship_pilot.dm +++ b/code/game/jobs/job/command/auxiliary/dropship_pilot.dm @@ -8,6 +8,19 @@ flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = /datum/equipment_preset/uscm_ship/dp entry_message_body = "Your job is to fly, protect, and maintain the ship's transport dropship. While you are an officer, your authority is limited to the dropship, where you have authority over the enlisted personnel. If you are not piloting, there is an autopilot fallback for command, but don't leave the dropship without reason." + var/mob/living/carbon/human/active_dropship_pilot + +/datum/job/command/pilot/dropship_pilot/generate_entry_conditions(mob/living/dropship_pilot, whitelist_status) + . = ..() + active_dropship_pilot = dropship_pilot + RegisterSignal(dropship_pilot, COMSIG_PARENT_QDELETING, PROC_REF(cleanup_active_dropship_pilot)) + +/datum/job/command/pilot/dropship_pilot/proc/cleanup_active_dropship_pilot(mob/dropship_pilot) + SIGNAL_HANDLER + active_dropship_pilot = null + +/datum/job/command/pilot/dropship_pilot/get_active_player_on_job() + return active_dropship_pilot // Dropship Roles is both DP, GP and DCC combined to not force people to backtrack AddTimelock(/datum/job/command/pilot/dropship_pilot, list( diff --git a/code/game/jobs/job/command/cic/executive.dm b/code/game/jobs/job/command/cic/executive.dm index 9f2135f5ee52..d94caa5c9ac9 100644 --- a/code/game/jobs/job/command/cic/executive.dm +++ b/code/game/jobs/job/command/cic/executive.dm @@ -18,7 +18,7 @@ GLOB.marine_leaders -= JOB_XO AddTimelock(/datum/job/command/executive, list( - JOB_COMMAND_ROLES = 20 HOURS, + JOB_SO = 20 HOURS, JOB_SQUAD_LEADER = 10 HOURS, )) diff --git a/code/game/jobs/job/command/police/chief_police.dm b/code/game/jobs/job/command/police/chief_police.dm index ecc8af38526c..c62c34951410 100644 --- a/code/game/jobs/job/command/police/chief_police.dm +++ b/code/game/jobs/job/command/police/chief_police.dm @@ -5,7 +5,7 @@ flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = /datum/equipment_preset/uscm_ship/uscm_police/cmp entry_message_body = "You are held by a higher standard and are required to obey not only the server rules but the Marine Law. Failure to do so may result in a job ban or server ban. You lead the Military Police, ensure your officers maintain peace and stability aboard the ship. Marines can get rowdy after a few weeks of cryosleep! In addition, you are tasked with the security of high-ranking personnel, including the command staff. Keep them safe!" - var/mob/living/carbon/human/active_cmp + var/mob/living/carbon/human/active_cmp = null; /datum/job/command/warrant/generate_entry_conditions(mob/living/cmp, whitelist_status) . = ..() @@ -16,6 +16,9 @@ SIGNAL_HANDLER active_cmp = null +/datum/job/command/warrant/get_active_player_on_job() + return active_cmp + AddTimelock(/datum/job/command/warrant, list( JOB_POLICE_ROLES = 15 HOURS, JOB_COMMAND_ROLES = 5 HOURS diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index e10f41f701f8..320bd09b76db 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -352,3 +352,7 @@ /// Called when the job owner enters deep cryogenic storage /datum/job/proc/on_cryo(mob/living/carbon/human/cryoing) return + +/// Returns the active player on this job, specifically for singleton jobs +/datum/job/proc/get_active_player_on_job() + return diff --git a/code/game/jobs/job/logistics/engi/chief_engineer.dm b/code/game/jobs/job/logistics/engi/chief_engineer.dm index b6aa23f9c4a6..f5118cbf7cfd 100644 --- a/code/game/jobs/job/logistics/engi/chief_engineer.dm +++ b/code/game/jobs/job/logistics/engi/chief_engineer.dm @@ -3,7 +3,20 @@ selection_class = "job_ce" flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = /datum/equipment_preset/uscm_ship/chief_engineer - entry_message_body = "Your job is to maintain your department and keep your technicians in check. You are responsible for engineering, power, ordnance, and the orbital cannon. Should the commanding and executive officer be unavailable, you are next in the chain of command." + entry_message_body = "Your job is to maintain your department and keep your technicians in check. You are responsible for engineering, power, ordnance, and the orbital cannon." + var/mob/living/carbon/human/active_chief_engineer + +/datum/job/logistics/engineering/generate_entry_conditions(mob/living/chief_engineer, whitelist_status) + . = ..() + active_chief_engineer = chief_engineer + RegisterSignal(chief_engineer, COMSIG_PARENT_QDELETING, PROC_REF(cleanup_active_chief_engineer)) + +/datum/job/logistics/engineering/proc/cleanup_active_chief_engineer(mob/chief_engineer) + SIGNAL_HANDLER + active_chief_engineer = null + +/datum/job/logistics/engineering/get_active_player_on_job() + return active_chief_engineer AddTimelock(/datum/job/logistics/engineering, list( JOB_ENGINEER_ROLES = 10 HOURS, diff --git a/code/game/jobs/job/marine/squad_info.dm b/code/game/jobs/job/marine/squad_info.dm index 406263115196..48870b928c71 100644 --- a/code/game/jobs/job/marine/squad_info.dm +++ b/code/game/jobs/job/marine/squad_info.dm @@ -245,7 +245,19 @@ if(JOB_SQUAD_SMARTGUN) rank = "SG" if(JOB_SQUAD_SPECIALIST) - rank = "Spc" + switch(H.rank_override) + if("spec_demo") + rank = "SpcDem" + if("spec_sniper") + rank = "SpcSn" + if("spec_grenadier") + rank = "SpcGr" + if("spec_sharp") + rank = "SpcShp" + if("spec_pyro") + rank = "SpcPy" + else + rank = "Spc" if(JOB_SQUAD_TEAM_LEADER) rank = "TL" if(JOB_SQUAD_LEADER) diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index 48f0aec1e6d0..0e851422cbdc 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -703,7 +703,8 @@ if(JOB_MARINE_RAIDER_CMD) old_lead.comm_title = "CMD." else - old_lead.comm_title = "RFN" + var/datum/job/job = GLOB.RoleAuthority.roles_for_mode[GET_DEFAULT_ROLE(old_lead.job)] + old_lead.comm_title = job.gear_preset.role_comm_title if(GET_DEFAULT_ROLE(old_lead.job) != JOB_SQUAD_LEADER || !leader_killed) var/obj/item/device/radio/headset/almayer/marine/headset = old_lead.get_type_in_ears(/obj/item/device/radio/headset/almayer/marine) if(headset) diff --git a/code/game/jobs/job/special/weyland_yutani.dm b/code/game/jobs/job/special/weyland_yutani.dm index 2145c13efa4a..f470d0d69393 100644 --- a/code/game/jobs/job/special/weyland_yutani.dm +++ b/code/game/jobs/job/special/weyland_yutani.dm @@ -89,6 +89,10 @@ title = JOB_PMC_LEAD_INVEST gear_preset = /datum/equipment_preset/pmc/pmc_lead_investigator +/datum/job/special/wey_yu/pmc/crowd_control + title = JOB_PMC_CROWD_CONTROL + gear_preset = /datum/equipment_preset/pmc/pmc_riot_control + /datum/job/special/wey_yu/pmc/detainer title = JOB_PMC_DETAINER gear_preset = /datum/equipment_preset/pmc/pmc_detainer @@ -101,10 +105,6 @@ title = JOB_PMC_DOCTOR gear_preset = /datum/equipment_preset/pmc/doctor -/datum/job/special/wey_yu/pmc/handler - title = JOB_PMC_XENO_HANDLER - gear_preset = /datum/equipment_preset/pmc/xeno_handler - /datum/job/special/wey_yu/pmc/synth title = JOB_PMC_SYNTH gear_preset = /datum/equipment_preset/pmc/synth @@ -112,3 +112,20 @@ /datum/job/special/wey_yu/pmc/director title = JOB_PMC_DIRECTOR gear_preset = /datum/equipment_preset/pmc/director + +/datum/job/special/wey_yu/pmc/commando + title = JOB_WY_COMMANDO_STANDARD + gear_preset = /datum/equipment_preset/pmc/commando/standard + +/datum/job/special/wey_yu/pmc/commando_leader + title = JOB_WY_COMMANDO_LEADER + gear_preset = /datum/equipment_preset/pmc/commando/leader + +/datum/job/special/wey_yu/pmc/commando_gunner + title = JOB_WY_COMMANDO_GUNNER + gear_preset = /datum/equipment_preset/pmc/commando/gunner + +/datum/job/special/wey_yu/pmc/commando_dogcatcher + title = JOB_WY_COMMANDO_DOGCATHER + gear_preset = /datum/equipment_preset/pmc/commando/dogcatcher + diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index d884d86329de..f27de4e5a8b6 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -26,7 +26,7 @@ /client/proc/whitelist_panel() set name = "Whitelist Panel" - set category = "Admin.Panels" + set category = "OOC.Whitelist" if(wl_panel) qdel(wl_panel) diff --git a/code/game/machinery/ARES/ARES.dm b/code/game/machinery/ARES/ARES.dm index 1ecbb4a5d7d6..952f02c8f48d 100644 --- a/code/game/machinery/ARES/ARES.dm +++ b/code/game/machinery/ARES/ARES.dm @@ -115,3 +115,34 @@ name = "ARES Substrate" desc = "The memory substrate of ARES, containing complex protocols and information. Limited capabilities can operate on substrate alone, without the main ARES Unit operational." icon_state = "substrate" + +/// Sentry +/obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares + name = "UA X512-S mini sentry" + faction_group = FACTION_LIST_ARES_MARINE + +/obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares/Initialize() + link_sentry() + . = ..() + +/obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares/Destroy() + delink_sentry() + . = ..() + +/obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares/start_processing() + sync_iff() + ..() + +/obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares/proc/sync_iff() + var/datum/ares_link/ares_link = GLOB.ares_link + if(!ares_link || !ares_link.faction_group) + faction_group = FACTION_LIST_ARES_MARINE + faction_group = ares_link.faction_group + +/obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares/proc/link_sentry() + var/datum/ares_link/link = GLOB.ares_link + link.core_sentries += src + +/obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares/proc/delink_sentry() + var/datum/ares_link/link = GLOB.ares_link + link.core_sentries -= src diff --git a/code/game/machinery/ARES/ARES_interface.dm b/code/game/machinery/ARES/ARES_interface.dm index 2bdd42088346..43b9cc13f903 100644 --- a/code/game/machinery/ARES/ARES_interface.dm +++ b/code/game/machinery/ARES/ARES_interface.dm @@ -431,6 +431,14 @@ to_chat(user, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE + var/nuclear_lock = CONFIG_GET(number/nuclear_lock_marines_percentage) + if(nuclear_lock > 0 && nuclear_lock != 100) + var/marines_count = SSticker.mode.count_marines() // Counting marines on land and on the ship + var/marines_peak = GLOB.peak_humans * nuclear_lock / 100 + if(marines_count >= marines_peak) + to_chat(user, SPAN_WARNING("There are still too many Marines and USCM crew alive on this operation!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE if(GLOB.security_level == SEC_LEVEL_DELTA || SSticker.mode.is_in_endgame) to_chat(user, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) @@ -452,7 +460,7 @@ if("trigger_vent") playsound = FALSE - var/obj/structure/pipes/vents/pump/no_boom/gas/sec_vent = locate(params["vent"]) + var/obj/structure/pipes/vents/pump/no_boom/gas/ares/sec_vent = locate(params["vent"]) if(!istype(sec_vent) || sec_vent.welded) to_chat(user, SPAN_WARNING("ERROR: Gas release failure.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) @@ -476,5 +484,17 @@ aicore_lockdown(user) return TRUE + if("update_sentries") + var/new_iff = params["chosen_iff"] + if(!new_iff) + to_chat(user, SPAN_WARNING("ERROR: Unknown setting.")) + return FALSE + if(new_iff == link.faction_label) + return FALSE + link.change_iff(new_iff) + message_admins("ARES: [key_name(user)] updated ARES Sentry IFF to [new_iff].") + to_chat(user, SPAN_WARNING("Sentry IFF settings updated!")) + return TRUE + if(playsound) playsound(src, "keyboard_alt", 15, 1) diff --git a/code/game/machinery/ARES/ARES_interface_admin.dm b/code/game/machinery/ARES/ARES_interface_admin.dm index 9dd631f37455..5818926d0be7 100644 --- a/code/game/machinery/ARES/ARES_interface_admin.dm +++ b/code/game/machinery/ARES/ARES_interface_admin.dm @@ -342,7 +342,7 @@ return TRUE if("trigger_vent") - var/obj/structure/pipes/vents/pump/no_boom/gas/sec_vent = locate(params["vent"]) + var/obj/structure/pipes/vents/pump/no_boom/gas/ares/sec_vent = locate(params["vent"]) if(!istype(sec_vent) || sec_vent.welded) to_chat(user, SPAN_WARNING("ERROR: Gas release failure.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) @@ -358,3 +358,15 @@ log_ares_security("Nerve Gas Release", "Released Nerve Gas from Vent '[sec_vent.vent_tag]'.", MAIN_AI_SYSTEM) sec_vent.create_gas(VENT_GAS_CN20_XENO, 6, 5 SECONDS) log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") + + if("update_sentries") + var/new_iff = params["chosen_iff"] + if(!new_iff) + to_chat(user, SPAN_WARNING("ERROR: Unknown setting.")) + return FALSE + if(new_iff == faction_label) + return FALSE + change_iff(new_iff) + message_admins("ARES: [key_name(user)] updated ARES Sentry IFF to [new_iff].") + to_chat(user, SPAN_WARNING("Sentry IFF settings updated!")) + return TRUE diff --git a/code/game/machinery/ARES/ARES_interface_apollo.dm b/code/game/machinery/ARES/ARES_interface_apollo.dm index b371ba885b06..3bc581a15a4b 100644 --- a/code/game/machinery/ARES/ARES_interface_apollo.dm +++ b/code/game/machinery/ARES/ARES_interface_apollo.dm @@ -359,7 +359,7 @@ if("trigger_vent") playsound = FALSE - var/obj/structure/pipes/vents/pump/no_boom/gas/sec_vent = locate(params["vent"]) + var/obj/structure/pipes/vents/pump/no_boom/gas/ares/sec_vent = locate(params["vent"]) if(!istype(sec_vent) || sec_vent.welded) to_chat(user, SPAN_WARNING("ERROR: Gas release failure.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) @@ -383,6 +383,18 @@ aicore_lockdown(user) return TRUE + if("update_sentries") + var/new_iff = params["chosen_iff"] + if(!new_iff) + to_chat(user, SPAN_WARNING("ERROR: Unknown setting.")) + return FALSE + if(new_iff == link.faction_label) + return FALSE + link.change_iff(new_iff) + message_admins("ARES: [key_name(user)] updated ARES Sentry IFF to [new_iff].") + to_chat(user, SPAN_WARNING("Sentry IFF settings updated!")) + return TRUE + if(playsound) playsound(src, "keyboard_alt", 15, 1) diff --git a/code/game/machinery/ARES/ARES_interface_data.dm b/code/game/machinery/ARES/ARES_interface_data.dm index b02ef384077b..dea0bc56189e 100644 --- a/code/game/machinery/ARES/ARES_interface_data.dm +++ b/code/game/machinery/ARES/ARES_interface_data.dm @@ -18,6 +18,9 @@ data["nuketimelock"] = NUCLEAR_TIME_LOCK data["nuke_available"] = nuke_available + data["sentry_setting"] = link.faction_label + data["faction_options"] = list("USCM Only", "Wey-Yu Only", "USCM & Wey-Yu", "ARES Only") + var/list/logged_announcements = list() for(var/datum/ares_record/announcement/broadcast as anything in records_announcement) @@ -135,7 +138,7 @@ data["records_discussions"] = logged_convos var/list/security_vents = list() - for(var/obj/structure/pipes/vents/pump/no_boom/gas/vent in link.linked_vents) + for(var/obj/structure/pipes/vents/pump/no_boom/gas/ares/vent in link.linked_vents) if(!vent.vent_tag) vent.vent_tag = "Security Vent #[link.tag_num]" link.tag_num++ diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm index 09a90f240aeb..6730721c8424 100644 --- a/code/game/machinery/ARES/ARES_procs.dm +++ b/code/game/machinery/ARES/ARES_procs.dm @@ -40,6 +40,12 @@ GLOBAL_LIST_INIT(maintenance_categories, list( var/list/waiting_ids = list() var/list/active_ids = list() + ///Sentry faction stuff + var/faction_label = "USCM Only" + var/list/faction_group = FACTION_LIST_ARES_MARINE + var/list/faction_options = list("USCM Only" = FACTION_LIST_ARES_MARINE, "Wey-Yu Only" = FACTION_WY, "USCM & Wey-Yu" = FACTION_LIST_ARES_ALL, "ARES Only" = FACTION_LIST_ARES_ALONE) + var/list/core_sentries = list() + /datum/ares_link/New() admin_interface = new datacore = GLOB.ares_datacore @@ -54,6 +60,14 @@ GLOBAL_LIST_INIT(maintenance_categories, list( alert.delink() ..() +/datum/ares_link/proc/change_iff(selection) + faction_label = selection + var/list/new_iff = faction_options[selection] + + faction_group = new_iff + ares_apollo_talk("Security IFF systems updated to [selection]") + for(var/obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares/sentry as anything in core_sentries) + sentry.sync_iff() /* BELOW ARE IN AdminAres.dm /datum/ares_link/tgui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/machinery/ARES/apollo_pda.dm b/code/game/machinery/ARES/apollo_pda.dm index c81e879fdf69..d2fa678ad48d 100644 --- a/code/game/machinery/ARES/apollo_pda.dm +++ b/code/game/machinery/ARES/apollo_pda.dm @@ -390,7 +390,7 @@ if("trigger_vent") playsound = FALSE - var/obj/structure/pipes/vents/pump/no_boom/gas/sec_vent = locate(params["vent"]) + var/obj/structure/pipes/vents/pump/no_boom/gas/ares/sec_vent = locate(params["vent"]) if(!istype(sec_vent) || sec_vent.welded) to_chat(user, SPAN_WARNING("ERROR: Gas release failure.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) @@ -414,6 +414,18 @@ aicore_lockdown(user) return TRUE + if("update_sentries") + var/new_iff = params["chosen_iff"] + if(!new_iff) + to_chat(user, SPAN_WARNING("ERROR: Unknown setting.")) + return FALSE + if(new_iff == link.faction_label) + return FALSE + link.change_iff(new_iff) + message_admins("ARES: [key_name(user)] updated ARES Sentry IFF to [new_iff].") + to_chat(user, SPAN_WARNING("Sentry IFF settings updated!")) + return TRUE + if(playsound) var/sound = pick('sound/machines/pda_button1.ogg', 'sound/machines/pda_button2.ogg') playsound(src, sound, 15, TRUE) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index a9afd36267c4..f1c87598f400 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -93,6 +93,10 @@ to_chat(user, SPAN_WARNING("The patient needs to be on the table first.")) return + if(!H.has_limb("head")) + to_chat(user, SPAN_WARNING("The patient has no head.")) + return + if(!anes_tank) to_chat(user, SPAN_WARNING("There is no anesthetic tank connected to the table, load one first.")) return @@ -107,6 +111,10 @@ if(!anes_tank) to_chat(user, SPAN_WARNING("There is no anesthetic tank connected to the table, load one first.")) return + if(!H.has_limb("head")) + to_chat(user, SPAN_WARNING("The patient has no head.")) + return + if(H.wear_mask) var/obj/item/mask = H.wear_mask if(mask.flags_inventory & CANTSTRIP) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 285e7381baee..726b1f6ddc56 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -39,6 +39,8 @@ var/autoname = FALSE var/autonumber = 0 //camera number in area + var/list/owner_factions = FACTION_LIST_NEUTRAL + GLOBAL_LIST_EMPTY_TYPED(all_cameras, /obj/structure/machinery/camera) /obj/structure/machinery/camera/Initialize(mapload, ...) . = ..() @@ -258,7 +260,7 @@ GLOBAL_LIST_EMPTY_TYPED(all_cameras, /obj/structure/machinery/camera) /atom/proc/auto_turn() //Automatically turns based on nearby walls. var/turf/closed/wall/T = null - for(var/i = 1, i <= 8; i += i) + for(var/i = 1; i <= 8; i += i) T = get_ranged_target_turf(src, i, 1) if(istype(T)) //If someone knows a better way to do this, let me know. -Giacom @@ -322,6 +324,9 @@ GLOBAL_LIST_EMPTY_TYPED(all_cameras, /obj/structure/machinery/camera) linked_broadcasting = camera_item c_tag = linked_broadcasting.get_broadcast_name() +/obj/structure/machinery/camera/overwatch + network = list(CAMERA_NET_OVERWATCH) + /obj/structure/machinery/camera/mortar alpha = 0 mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 221c35f95368..4efd487c9db7 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -59,6 +59,7 @@ icon = 'icons/obj/vehicles/interiors/general.dmi' icon_state = "vehicle_camera" network = list(CAMERA_NET_VEHICLE) + owner_factions = FACTION_LIST_HUMANOID /obj/structure/machinery/camera/vehicle/toggle_cam_status(on = FALSE) if(on) @@ -92,6 +93,7 @@ /obj/structure/machinery/camera/autoname/almayer name = "military-grade camera" network = list(CAMERA_NET_ALMAYER) + owner_factions = FACTION_LIST_MARINE_WY /obj/structure/machinery/camera/autoname/almayer/containment name = "containment camera" @@ -104,6 +106,7 @@ /obj/structure/machinery/camera/autoname/almayer/containment/hidden network = list(CAMERA_NET_CONTAINMENT_HIDDEN) + owner_factions = FACTION_LIST_WY /obj/structure/machinery/camera/autoname/almayer/containment/ares name = "ares core camera" @@ -113,6 +116,13 @@ name = "brig camera" network = list(CAMERA_NET_BRIG) +/obj/structure/machinery/camera/autoname/yautja + network = list(CAMERA_NET_YAUTJA) + +/obj/structure/machinery/camera/autoname/yautja/Initialize() + . = ..() + upgradeXRay(src) + //used by the landing camera dropship equipment. Do not place them right under where the dropship lands. //Should place them near each corner of your LZs. /obj/structure/machinery/camera/autoname/lz_camera @@ -125,6 +135,7 @@ colony_camera_mapload = FALSE emp_proof = TRUE + owner_factions = FACTION_LIST_HUMANOID /obj/structure/machinery/camera/autoname/lz_camera/ex_act() return diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 833264e9f59e..b7f1d7d4b756 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -242,18 +242,3 @@ for(var/mob/M in currentarea) to_chat(M, "FIGHT!") -//Holorack - -/obj/structure/surface/rack/holorack - name = "rack" - desc = "Different from the Middle Ages version." - icon = 'icons/obj/objects.dmi' - icon_state = "rack" - -/obj/structure/surface/rack/holorack/attack_hand(mob/user as mob) - return - -/obj/structure/surface/rack/holorack/attackby(obj/item/W as obj, mob/user as mob) - if (HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) - to_chat(user, "It's a holorack! You can't unwrench it!") - return diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index b913849eaa25..d036aac0ff9d 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -49,7 +49,7 @@
Name: [src.victim.real_name]
Age: [src.victim.age]
-Blood Type: [src.victim.b_type]
+Blood Type: [src.victim.blood_type]

Health: [src.victim.health]
Brute Damage: [src.victim.getBruteLoss()]
diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index b8edcaebf4ce..c272d1247ad7 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -429,4 +429,20 @@ name = "\improper 'Saipan' camera controls" network = list(CAMERA_NET_RESEARCH, CAMERA_NET_LASER_TARGETS) +/obj/structure/machinery/computer/cameras/yautja + name = "Hellhound Observation Interface" + alpha = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + density = FALSE + use_power = USE_POWER_NONE + idle_power_usage = 0 + active_power_usage = 0 + needs_power = FALSE + network = list(CAMERA_NET_YAUTJA) + explo_proof = TRUE + +/obj/structure/machinery/computer/cameras/yautja/Initialize() + . = ..() + SEND_SIGNAL(src, COMSIG_CAMERA_SET_NVG, 5, NV_COLOR_RED) + #undef DEFAULT_MAP_SIZE diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index 3aa6fff72b9a..2a7e60ba6a20 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -666,6 +666,9 @@ if(!human_operator.allow_gun_usage) to_chat(human_operator, SPAN_WARNING("Your programming prevents you from operating dropship weaponry!")) return FALSE + if(MODE_HAS_MODIFIER(/datum/gamemode_modifier/ceasefire)) + to_chat(human_operator, SPAN_WARNING("You will not break the ceasefire by doing that!")) + return FALSE var/obj/structure/dropship_equipment/weapon/DEW = selected_equipment if(!selected_equipment || !selected_equipment.is_weapon) to_chat(weapon_operator, SPAN_WARNING("No weapon selected.")) diff --git a/code/game/machinery/computer/fax_responder_spy.dm b/code/game/machinery/computer/fax_responder_spy.dm new file mode 100644 index 000000000000..bd4b9afda9fe --- /dev/null +++ b/code/game/machinery/computer/fax_responder_spy.dm @@ -0,0 +1,329 @@ +/obj/structure/machinery/computer/spy_camera + name = "remote monitoring computer" + + icon_state = "terminal" + + var/mob/hologram/spy_camera/spy_eye + var/spy_range = 5 + var/spy_faction = FACTION_NEUTRAL + + var/turf/last_location + var/turf/start_location + + /// Computer and Spycam can only be used if this variable is cleared + var/locked = FALSE + +/obj/structure/machinery/computer/spy_camera/attackby(obj/item, mob/user) //Can't break or disassemble. + return + +/obj/structure/machinery/computer/spy_camera/bullet_act(obj/projectile/proj) //Can't shoot it + return FALSE + +/obj/structure/machinery/computer/spy_camera/proc/set_operator(mob/living/carbon/human/new_operator) + if(!istype(new_operator)) + return + remove_current_operator() + + operator = new_operator + var/datum/mob_hud/spy_hud = GLOB.huds[MOB_HUD_SPYCAMS] + spy_hud.add_hud_to(new_operator, src) + RegisterSignal(operator, COMSIG_PARENT_QDELETING, PROC_REF(remove_current_operator)) + RegisterSignal(operator, COMSIG_MOVABLE_MOVED, PROC_REF(remove_current_operator)) + + if(!last_location) + last_location = loc + + start_location = last_location + + spy_eye = new(last_location, new_operator, src) + //RegisterSignal(eye, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_and_set_zlevel)) + RegisterSignal(spy_eye, COMSIG_PARENT_QDELETING, PROC_REF(remove_current_operator)) + +/obj/structure/machinery/computer/spy_camera/proc/remove_current_operator() + SIGNAL_HANDLER + if(!operator) return + + if(spy_eye) + last_location = spy_eye.loc + if(spy_eye.gc_destroyed) + spy_eye = null + else + QDEL_NULL(spy_eye) + + UnregisterSignal(operator, list( + COMSIG_PARENT_QDELETING, + COMSIG_MOVABLE_PRE_MOVE, + COMSIG_MOB_POST_CLICK + )) + operator.update_sight() + var/datum/mob_hud/spy_hud = GLOB.huds[MOB_HUD_SPYCAMS] + spy_hud.remove_hud_from(operator, src) + operator = null + +/obj/structure/machinery/computer/spy_camera/attack_hand(mob/living/carbon/human/pos_operator) + if(..()) + return + + if(!istype(pos_operator)) + return + + if(locked || (!(pos_operator.faction == FACTION_FAX) && !(spy_faction in pos_operator.faction_group))) + to_chat(pos_operator, SPAN_WARNING("The remote camera system is locked out!")) + return FALSE + + if(operator && operator.stat == CONSCIOUS) + to_chat(pos_operator, SPAN_WARNING("Someone is already using this computer!")) + return + + if(tgui_alert(pos_operator, "Change the camera focus?", "Spycam Computer", list("Yes", "No")) == "Yes") + var/obj/effect/landmark/spycam_start/start_point = tgui_input_list(pos_operator, "Where do you want to focus the camera?", "Camera Focus", GLOB.spycam_starts) + if(!start_point) + return + last_location = start_point.loc + + set_operator(pos_operator) + + +/obj/effect/landmark/spycam_start + name = "Spycam Landmark" + icon_state = "spycam" + +/obj/effect/landmark/spycam_start/Initialize() + . = ..() + name = "Spycam [get_area_name(src, TRUE)]" + GLOB.spycam_starts += src + +/obj/effect/landmark/spycam_start/Destroy() + GLOB.spycam_starts -= src + return ..() + +/mob/hologram/spy_camera + name = "Spy Camera" + motion_sensed = FALSE + icon_state = "spycam" + + color = "#10948d" + + hud_possible = list(SPYCAM_HUD) + hears_speech = TRUE + + var/mob/living/carbon/is_watching + + var/spy_range = 5 + var/spy_faction = FACTION_NEUTRAL + + var/list/temporary_list = list() + var/list/temporary_list_2 = list() + + ///Whether or not the camera is on cooldown for a warning message it can't move to a certain tile, locked to one message every 3 seconds. + var/move_warn = FALSE + + +/mob/hologram/spy_camera/Initialize(mapload, mob/living/carbon/spy_operator, obj/structure/machinery/computer/spy_camera/console) + if(!console || !spy_operator) + return INITIALIZE_HINT_QDEL + + if(!istype(console)) + stack_trace("Tried to initialize a /mob/hologram/spy_camera on type ([console.type])") + return INITIALIZE_HINT_QDEL + + spy_range = console.spy_range + spy_faction = console.spy_faction + faction = spy_faction + + switch(spy_faction) + if(FACTION_MARINE, FACTION_MARSHAL) + color = "#0947bb" + if(FACTION_CLF) + color = "#717fbd" + if(FACTION_UPP) + color = "#0f3d11" + if(FACTION_TWE) + color = "#b350c0" + if(FACTION_WY) + color = "#b6b6b6" + + . = ..() + + name = "Spy Camera ([spy_faction])" + RegisterSignal(spy_operator, COMSIG_MOB_PRE_CLICK, PROC_REF(handle_overwatch)) + //RegisterSignal(spy_operator, COMSIG_XENO_OVERWATCH_XENO, PROC_REF(start_watching)) + //RegisterSignal(spy_operator, list( + // COMSIG_XENO_STOP_OVERWATCH, + // COMSIG_XENO_STOP_OVERWATCH_XENO + //), PROC_REF(stop_watching)) + RegisterSignal(src, COMSIG_MOVABLE_TURF_ENTER, PROC_REF(can_spy_turf)) + + med_hud_set_status() + add_to_all_mob_huds() + + spy_operator.sight |= SEE_TURFS|SEE_OBJS + +/mob/hologram/spy_camera/proc/exit_hologram() + SIGNAL_HANDLER + qdel(src) + +/mob/hologram/spy_camera/handle_move(mob/living/carbon/human/spy_operator, NewLoc, direct) + if(is_watching && (can_spy_turf(src, is_watching.loc) & COMPONENT_TURF_DENY_MOVEMENT)) + return COMPONENT_OVERRIDE_MOVE + + return ..() + +/mob/hologram/spy_camera/proc/start_watching(mob/living/carbon/human/source_mob, mob/living/carbon/human/target_mob) + SIGNAL_HANDLER + forceMove(target_mob) + is_watching = target_mob + + RegisterSignal(target_mob, COMSIG_PARENT_QDELETING, PROC_REF(target_watching_qdeleted)) + return + +// able to stop watching here before the loc is set to null +/mob/hologram/spy_camera/proc/target_watching_qdeleted(mob/living/carbon/target) + SIGNAL_HANDLER + stop_watching(linked_mob, target) + +/mob/hologram/spy_camera/proc/stop_watching(mob/living/carbon/human/responder, mob/living/carbon/human/target) + SIGNAL_HANDLER + if(target) + if(loc == target) + var/turf/target_turf = get_turf(target) + + if(target_turf) + forceMove(target_turf) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + + if(!isturf(loc) || (can_spy_turf(src, loc) & COMPONENT_TURF_DENY_MOVEMENT)) + forceMove(target.loc) + + is_watching = null + target.reset_view() + return + +/mob/hologram/spy_camera/proc/can_spy_turf(mob/self, turf/crossing_turf) + SIGNAL_HANDLER + + if(!crossing_turf || istype(crossing_turf, /turf/open/space) || istype(get_area(crossing_turf), /area/space)) + return COMPONENT_TURF_DENY_MOVEMENT + + if(istype(crossing_turf, /turf/closed/wall)) + var/turf/closed/wall/crossing_wall = crossing_turf + if(crossing_wall.turf_flags & TURF_HULL) + if(!move_warn) + move_warn = TRUE + addtimer(CALLBACK(src, PROC_REF(reset_warn)), 3 SECONDS) + to_chat(linked_mob, SPAN_WARNING("You cannot move the camera here, it's a solid wall!")) + return COMPONENT_TURF_DENY_MOVEMENT + + if(is_mainship_level(z)) + if(spy_faction in FACTION_LIST_MARINE_FAXES) + return COMPONENT_TURF_ALLOW_MOVEMENT + + var/list/turf_area = view(spy_range, crossing_turf) + temporary_list = turf_area + + var/list/obj/structure/machinery/camera/camera_list = list() + temporary_list_2 = camera_list + + for(var/obj/structure/machinery/camera/nearby_camera in turf_area) + camera_list += nearby_camera + for(var/mob/living/carbon/human/local_mob in turf_area) + if(istype(local_mob.head, /obj/item/clothing/head/helmet/marine)) + var/obj/item/clothing/head/helmet/marine/helm = local_mob.head + camera_list += helm.camera + + for(var/obj/structure/machinery/camera/possible_camera in camera_list) + if(spy_faction in possible_camera.owner_factions) + return COMPONENT_TURF_ALLOW_MOVEMENT + + if(!move_warn) + move_warn = TRUE + addtimer(CALLBACK(src, PROC_REF(reset_warn)), 3 SECONDS) + to_chat(linked_mob, SPAN_WARNING("You can't move the spy here, there's no camera you have access to nearby!")) + return COMPONENT_TURF_DENY_MOVEMENT + +/mob/hologram/spy_camera/proc/reset_warn() + move_warn = FALSE + +/mob/hologram/spy_camera/proc/is_spy_faction(atom/target_atom) + if(!ismob(target_atom)) + return FALSE + var/mob/living/carbon/target_mob = target_atom + if(!(spy_faction in target_mob.faction_group)) + return FALSE + return TRUE + +/mob/hologram/spy_camera/proc/handle_overwatch(mob/living/carbon/human/spy_operator, atom/target_atom, mods) + SIGNAL_HANDLER + + var/turf/target_turf = get_turf(target_atom) + if(!istype(target_turf)) + return + + if(!mods["ctrl"]) + return + + // I want to make this mimic observer follow. + //if(is_spy_faction(target_atom)) + // var/mob/living/carbon/target_mob = target_atom + // return COMPONENT_INTERRUPT_CLICK + + + if(!(can_spy_turf(src, target_turf) & COMPONENT_TURF_ALLOW_MOVEMENT)) + return + + forceMove(target_turf) + + return COMPONENT_INTERRUPT_CLICK + +/mob/hologram/spy_camera/handle_view(mob/spy_operator, atom/target) + if(spy_operator.client) + spy_operator.client.perspective = EYE_PERSPECTIVE + + if(is_watching) + spy_operator.client.eye = is_watching + else + spy_operator.client.eye = src + + return COMPONENT_OVERRIDE_VIEW + +/mob/hologram/spy_camera/Destroy() + if(linked_mob) + linked_mob.sight &= ~(SEE_TURFS|SEE_OBJS) + + remove_from_all_mob_huds() + is_watching = null + + return ..() + +/mob/hologram/spy_camera/add_to_all_mob_huds() + var/datum/mob_hud/hud = GLOB.huds[MOB_HUD_SPYCAMS] + hud.add_to_hud(src) + +/mob/hologram/spy_camera/remove_from_all_mob_huds() + var/datum/mob_hud/hud = GLOB.huds[MOB_HUD_SPYCAMS] + hud.remove_from_hud(src) + +/mob/hologram/spy_camera/med_hud_set_status() + var/image/holder = hud_list[SPYCAM_HUD] + holder.icon_state = "hudeye" + holder.color = color + + + +/obj/structure/machinery/computer/spy_camera/uscm + spy_faction = FACTION_MARINE + +/obj/structure/machinery/computer/spy_camera/wy + spy_faction = FACTION_WY + +/obj/structure/machinery/computer/spy_camera/twe + spy_faction = FACTION_TWE + +/obj/structure/machinery/computer/spy_camera/clf + spy_faction = FACTION_CLF + +/obj/structure/machinery/computer/spy_camera/upp + spy_faction = FACTION_UPP + +/obj/structure/machinery/computer/spy_camera/cmb + spy_faction = FACTION_MARSHAL diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 4348ec6b99c6..22772cfb2b7a 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -1,536 +1,634 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 +/// view-only medical record access, for unclassified files. lowest access level. +#define MEDICAL_RECORD_ACCESS_LEVEL_0 0 // assigned to HMs and Nurses. +/// edit access for all unclassified files. view-only for classified files. +#define MEDICAL_RECORD_ACCESS_LEVEL_1 1 // access level given to Doctors, and any Officers at or above 1stLT. +/// full record database edit and viewing access. +#define MEDICAL_RECORD_ACCESS_LEVEL_2 2 // given to the CMO, Synths, and the CO/XO. + /obj/structure/machinery/computer/med_data//TODO:SANITY - name = "Medical Records" + name = "Medical Records Console" desc = "This can be used to check medical records." icon_state = "medcomp" density = TRUE req_one_access = list(ACCESS_MARINE_MEDBAY, ACCESS_WY_MEDICAL) circuit = /obj/item/circuitboard/computer/med_data var/obj/item/card/id/scan = null - var/last_user_name = "" - var/last_user_rank = "" - var/authenticated = null - var/rank = null - var/screen = null - var/datum/data/record/active1 = null - var/datum/data/record/active2 = null - var/a_id = null - var/temp = null - var/printing = null - -/obj/structure/machinery/computer/med_data/verb/eject_id() - set category = "Object" - set name = "Eject ID Card" - set src in oview(1) - - if(!usr || usr.is_mob_incapacitated()) + /// the target id of a record intended to link with a biometric scan + var/bio_link_target_record_id + /// time left for someone to authenticate a biometric scan, before it aborts + var/biometric_scan_timer + /// the current users access level for the medical record database. see define definitions for access permissions + var/access_level = MEDICAL_RECORD_ACCESS_LEVEL_0 + /// the id number of the lastest viewed record. used to manage ui data + var/currently_selected_record_id + + COOLDOWN_DECLARE(record_printing_cooldown) + +/obj/structure/machinery/computer/med_data/attack_remote(mob/user) + return attack_hand(user) + +/obj/structure/machinery/computer/med_data/attack_hand(mob/user) + if(..() || inoperable()) + to_chat(user, SPAN_INFO("It does not appear to be working.")) return - if(scan) - to_chat(usr, "You remove \the [scan] from \the [src].") - scan.forceMove(get_turf(src)) - if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) - usr.put_in_hands(scan) - scan = null - else - to_chat(usr, "There is nothing to remove from the console.") - return + if(bio_link_target_record_id && ishumansynth_strict(user)) + user.visible_message(SPAN_NOTICE("You hear a beep as [user]'s hand is scanned to \the [name].")) + visible_message("[SPAN_BOLD("[src]")] states, \"SCAN ENTRY: ["Scanned, please stay close until operation's end."]\"") + playsound(user.loc, 'sound/machines/screen_output1.ogg', 25, TRUE) + link_medical_data(user, bio_link_target_record_id) + bio_link_target_record_id = FALSE + return -/obj/structure/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob) - if(istype(O, /obj/item/card/id) && !scan) - if(usr.drop_held_item()) - O.forceMove(src) - scan = O - last_user_name = scan.registered_name - last_user_rank = scan.rank - to_chat(user, "You insert [O].") - . = ..() + if(!allowed(user)) + to_chat(user, SPAN_WARNING("Access denied.")) + return + + if(!is_mainship_level(z)) + to_chat(user, SPAN_DANGER("Unable to establish a connection: \black You're too far away from the station!")) + return + + tgui_interact(user) + +/obj/structure/machinery/computer/med_data/proc/get_database_access_level(obj/item/card/id/id) + if(!id) + return MEDICAL_RECORD_ACCESS_LEVEL_0 + if(ACCESS_MARINE_DATABASE_ADMIN in id.access) + return MEDICAL_RECORD_ACCESS_LEVEL_2 + if(ACCESS_MARINE_DATABASE in id.access) + return MEDICAL_RECORD_ACCESS_LEVEL_1 + return MEDICAL_RECORD_ACCESS_LEVEL_0 + +/obj/structure/machinery/computer/med_data/proc/link_medical_data(mob/living/carbon/human/target, general_record_id) -/obj/structure/machinery/computer/med_data/attack_remote(user as mob) - return src.attack_hand(user) + if(biometric_scan_timer) + deltimer(biometric_scan_timer) + biometric_scan_timer = null -/obj/structure/machinery/computer/med_data/attack_hand(mob/user as mob) - if(..()) + var/assignment = "Unassigned" // whichever job is listed on the id of the current user + if(target.job) + assignment = target.job + + for (var/datum/data/record/general_record in GLOB.data_core.general) + if(general_record.fields["id"] != general_record_id) + continue + if((general_record.fields["name"] != target.real_name) && (general_record.fields["name"] != "New Record")) + balloon_alert_to_viewers("ERROR! Medical record bioscan does not match general record ID.") + playsound(src, 'sound/machines/terminal_error.ogg', 15, FALSE) + return + general_record.fields["name"] = target.real_name + general_record.name = target.real_name + general_record.fields["real_rank"] = target.job + general_record.fields["rank"] = assignment + general_record.fields["age"] = target.age + general_record.fields["p_stat"] = "Active" + general_record.fields["m_stat"] = "Stable" + general_record.fields["sex"] = capitalize(target.gender) + general_record.fields["ref"] = WEAKREF(target) + + var/datum/data/record/medical_record = new /datum/data/record() + medical_record.fields["id"] = general_record_id + medical_record.fields["name"] = target.real_name + medical_record.name = target.real_name + medical_record.fields["blood_type"] = target.blood_type + medical_record.fields["minor_disability"] = "None" + medical_record.fields["minor_disability_details"] = "No minor disabilities have been declared." + medical_record.fields["major_disability"] = "None" + medical_record.fields["major_disability_details"] = "No major disabilities have been diagnosed." + medical_record.fields["allergies"] = "None" + medical_record.fields["allergies_details"] = "No allergies have been detected in this patient." + medical_record.fields["diseases"] = "None" + medical_record.fields["diseases_details"] = "No diseases have been diagnosed at the moment." + medical_record.fields["last_scan_time"] = null + medical_record.fields["last_scan_result"] = "No scan data on record" + medical_record.fields["autodoc_data"] = list() + medical_record.fields["ref"] = WEAKREF(target) + GLOB.data_core.medical += medical_record + + currently_selected_record_id = general_record_id + update_static_data_for_all_viewers() + + +/obj/structure/machinery/computer/med_data/proc/print_medical_record(record_id, mob/living/carbon/human/user) + + if(!record_id) + // for whatever reason, the computer is asking for a record with a null ID + balloon_alert_to_viewers("Critical systems fault! Unable to process request.") + to_chat(user, SPAN_NOTICE("Critical systems fault! Unable to process request.")) + playsound(loc, 'sound/machines/terminal_shutdown.ogg', 15, FALSE) return - var/dat - if (src.temp) - dat = text("[src.temp]

Clear Screen") - else - dat = text("Confirm Identity: []
", src, (src.scan ? text("[]", src.scan.name) : "----------")) - if (src.authenticated) - switch(src.screen) - if(1.0) - dat += {" -Search Records -
List Records -
-
Medbot Tracking -
-
Record Maintenance -
{Log Out}
-"} - if(2.0) - dat += "Record List:
" - if(!isnull(GLOB.data_core.general)) - for(var/datum/data/record/R in sortRecord(GLOB.data_core.general)) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) - //Foreach goto(132) - dat += text("
Back", src) - if(3.0) - dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) - if(4.0) - if ((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1))) - dat += "
Medical Record

" - dat += "
Name: [active1.fields["name"]] \ - ID: [active1.fields["id"]]
\n \ - Sex: [active1.fields["sex"]]
\n \ - Age: [active1.fields["age"]]
\n \ - Physical Status: [active1.fields["p_stat"]]
\n \ - Mental Status: [active1.fields["m_stat"]]
\ - Photo:
" - else - dat += "General Record Lost!
" - if ((istype(src.active2, /datum/data/record) && GLOB.data_core.medical.Find(src.active2))) - dat += "
\n
Medical Data

\nBlood Type: [active2.fields["b_type"]]
\n
\nMinor Disabilities: [active2.fields["mi_dis"]]
\nDetails: [active2.fields["mi_dis_d"]]
\n
\nMajor Disabilities: [active2.fields["ma_dis"]]
\nDetails: [active2.fields["ma_dis_d"]]
\n
\nAllergies: [active2.fields["alg"]]
\nDetails: [active2.fields["alg_d"]]
\n
\nCurrent Diseases: [active2.fields["cdi"]] (per disease info placed in log/comment section)
\nDetails: [active2.fields["cdi_d"]]
\n
\nImportant Notes:
\n\t[decode(src.active2.fields["notes"])]
\n
\n
Comments/Log

" - var/counter = 1 - while(active2.fields[text("com_[]", counter)]) - var/current_index = text("com_[]", counter) - if(findtext(active2.fields[current_index], "
")) - dat += text("[]
Delete Entry

", active2.fields[current_index], src, counter) - else - dat += text("[]

", active2.fields[current_index]) - counter++ - dat += text("Add Entry

", src) - dat += text("Delete Record (Medical Only)

", src) - else - dat += "Medical Record Lost!
" - dat += text("New Record

") - dat += text("\nPrint Record
\n", src) - dat += text("\nPrint Latest Bodyscan

\nBack
", src, src) - if(5) - dat += "
Medical Robot Monitor
" - dat += "Back" - dat += "
Medical Robots:" - var/bdat = null - for(var/obj/structure/machinery/bot/medbot/M in GLOB.machines) - - if(M.z != src.z) - continue //only find medibots on the same z-level as the computer - var/turf/bl = get_turf(M) - if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up - bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"]
" - if((!isnull(M.reagent_glass)) && M.use_beaker) - bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\]
" - else - bdat += "Using Internal Synthesizer.
" - if(!bdat) - dat += "
None detected
" - else - dat += "
[bdat]" + // Locate the general record + var/datum/data/record/general_record = find_record("general", record_id) + + // Locate the medical record + var/datum/data/record/medical_record = find_record("medical", record_id) + + if (!general_record) + balloon_alert_to_viewers("Unable to process request. Record not found!") + to_chat(user, SPAN_NOTICE("Unable to process request. Record not found!")) + playsound(loc, 'sound/machines/terminal_shutdown.ogg', 15, FALSE) + return + + var/obj/item/paper/medical_record/report = new /obj/item/paper/medical_record(loc, general_record, medical_record) + report.name = text("Medical Record ([])", general_record.fields["name"]) + +/obj/structure/machinery/computer/med_data/proc/handle_biometric_scan_timeout(mob/living/carbon/human/user) + + if(biometric_scan_timer) + deltimer(biometric_scan_timer) + biometric_scan_timer = null + + bio_link_target_record_id = null + balloon_alert_to_viewers("Aborting biometric scan! No user detected in time.") + to_chat(user, SPAN_NOTICE("Aborting biometric scan! No user detected in time.")) + playsound(loc, 'sound/machines/terminal_shutdown.ogg', 15, FALSE) + +/obj/structure/machinery/computer/med_data/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "MedicalRecords", "Medical Records") + ui.autoupdate = FALSE + ui.open() + +/obj/structure/machinery/computer/med_data/proc/gather_record_data(mob/user, datum/data/record/general) + + if(!general) + return + + var/id_number = general.fields["id"] + var/datum/data/record/medical = find_record("medical", id_number) + + var/datum/weakref/target_ref = general.fields["ref"] + var/mob/living/carbon/human/target + var/obj/item/card/id/id + var/record_classified = FALSE + + if(target_ref) + target = target_ref.resolve() + if(!target) // if the target has been gibbed, or no longer physically exists + return + id = target.get_idcard() + // checks if record target is in the chain of command, and needs their record protected + if(target.job in CHAIN_OF_COMMAND_ROLES) + record_classified = TRUE + + var/paygrade = id ? id.paygrade : "None" + + var/list/record = list( + "id" = id_number, + "general_name" = general.fields["name"], + "general_job" = general.fields["rank"], + "general_rank" = paygrade, + "general_age" = general.fields["age"], + "general_sex" = general.fields["sex"], + "general_m_stat" = medical ? general.fields["m_stat"] : null, + "general_p_stat" = medical ? general.fields["p_stat"] : null, + "medical_blood_type" = medical ? medical.fields["blood_type"] : null, + "medical_major_disability" = medical ? medical.fields["major_disability"] : null, + "medical_major_disability_details" = medical ? medical.fields["major_disability_details"] : null, + "medical_minor_disability" = medical ? medical.fields["minor_disability"] : null, + "medical_minor_disability_details" = medical ? medical.fields["minor_disability_details"] : null, + "medical_allergies" = medical ? medical.fields["allergies"] : null, + "medical_allergies_details" = medical ? medical.fields["allergies_details"] : null, + "medical_diseases" = medical ? medical.fields["diseases"] : null, + "medical_diseases_details" = medical ? medical.fields["diseases_details"] : null, + "medical_comments" = medical ? medical.fields["comments"] : null, + "record_classified" = record_classified + ) + + return record + +/obj/structure/machinery/computer/med_data/ui_status(mob/user) + if(inoperable()) + return UI_CLOSE + + if(!ishumansynth_strict(user) || (user.stat == DEAD)) + return UI_CLOSE + + if((user.stat == UNCONSCIOUS) || !allowed(user)) + return UI_DISABLED + + if(get_dist(src, user) <= 2) + return UI_INTERACTIVE + + // if none of the above were true, something is very wrong + return UI_CLOSE + +/obj/structure/machinery/computer/med_data/ui_data(mob/user) + . = ..() + + // Map medical records via id + var/list/records = list() + var/list/medical_record = list() + for (var/datum/data/record/medical in GLOB.data_core.medical) + medical_record[medical.fields["id"]] = medical + + for (var/datum/data/record/general in GLOB.data_core.general) + var/id_number = general.fields["id"] + var/datum/data/record/medical = medical_record[id_number] + + // checks if the record is being viewed, and requires more data + if((id_number == currently_selected_record_id) && currently_selected_record_id) + records |= list(gather_record_data(user, general)) + // sends photo data seperately from the records system, for ease of use + var/icon/photo_icon = new /icon('icons/misc/buildmode.dmi', "buildhelp") + var/photo_data = icon2html(photo_icon, user.client, sourceonly = TRUE) + + var/photo_front = general.fields["photo_front"] ? icon2html(general.fields["photo_front"], user.client, sourceonly = TRUE) : photo_data + var/photo_side = general.fields["photo_side"] ? icon2html(general.fields["photo_side"], user.client, sourceonly = TRUE) : photo_data + + .["photo_front"] = photo_front + .["photo_side"] = photo_side else - dat += text("{Log In}", src) - show_browser(user, dat, "Medical Records", "med_rec") - onclose(user, "med_rec") - return + var/list/record = list( + "id" = id_number, + "general_name" = general.fields["name"], + "general_job" = general.fields["rank"], + "general_p_stat" = medical ? general.fields["p_stat"] : null + ) + records |= list(record) + + .["records"] = records + +/obj/structure/machinery/computer/med_data/ui_static_data(mob/user) + . = ..() + + .["operator"] = operator + .["database_access_level"] = access_level + + var/icon/photo_icon = new /icon('icons/misc/buildmode.dmi', "buildhelp") + var/photo_data = icon2html(photo_icon, user.client, sourceonly = TRUE) -/obj/structure/machinery/computer/med_data/Topic(href, href_list) - if(..()) + // Attach to the UI data + .["fallback_image"] = photo_data + +/obj/structure/machinery/computer/med_data/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/mob/living/carbon/human/user = ui.user + if(!allowed(user)) + to_chat(user, SPAN_WARNING("Access denied.")) return - if (!( GLOB.data_core.general.Find(src.active1) )) - src.active1 = null + playsound(src, get_sfx("terminal_button"), 25, FALSE) + + switch(action) + if("log_in") + operator = user + var/obj/item/card/id/id = user.get_idcard() + access_level = get_database_access_level(id) + update_static_data(user, ui) + return + if("log_out") + operator = null + access_level = MEDICAL_RECORD_ACCESS_LEVEL_0 + update_static_data(user, ui) + return + //* Actions for managing records + if("select_record") + var/id = params["id"] + + if(!id) + tgui_alert(user, "Invalid record ID.") + return + + // Find the corresponding general record + var/datum/data/record/general_record = find_record("general", id) + + if(!general_record) + tgui_alert(user,"Record not found.") + return + + currently_selected_record_id = id + + return TRUE + + if("update_field") + var/id = params["id"] + var/field = params["field"] + var/value = params["value"] - if (!( GLOB.data_core.medical.Find(src.active2) )) - src.active2 = null + var/validation_error = validate_field(field, value, user, FALSE) + if (validation_error) + to_chat(user, SPAN_WARNING("Console returns error with buzzing sound: [validation_error]")) + playsound(loc, 'sound/machines/buzz-two.ogg', 15, TRUE) + return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (isRemoteControlling(usr))) - usr.set_interaction(src) + if(!id || !field) + tgui_alert(user, "Invalid record ID or field.") + return - if (href_list["temp"]) - src.temp = null + var/is_general_field = copytext(field, 1, 9) == "general_" + var/is_medical_field = copytext(field, 1, 9) == "medical_" - if (href_list["scan"]) - if (src.scan) + if(!is_general_field && !is_medical_field) + tgui_alert(user, "Invalid field prefix.") + return - if(ishuman(usr)) - scan.forceMove(usr.loc) + // Remove the prefix to map to the original field name + var/original_field = copytext(field, 9) - if(!usr.get_active_hand()) - usr.put_in_hands(scan) + // Locate the general record + var/datum/data/record/general_record = find_record("general", id) - scan = null + // Locate the medical record (if applicable) + var/datum/data/record/medical_record = find_record("medical", id) - else - src.scan.forceMove(src.loc) - src.scan = null + // Update the appropriate record + if(is_general_field && general_record && (original_field in general_record.fields)) + general_record.fields[original_field] = value + + else if(is_medical_field && medical_record && (original_field in medical_record.fields)) + medical_record.fields[original_field] = value else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/card/id)) - if(usr.drop_held_item()) - I.forceMove(src) - src.scan = I - - else if (href_list["logout"]) - src.authenticated = null - src.screen = null - src.active1 = null - src.active2 = null - - else if (href_list["login"]) - - if (isRemoteControlling(usr)) - src.active1 = null - src.active2 = null - src.authenticated = usr.name - src.rank = "AI" - src.screen = 1 - - else if (istype(src.scan, /obj/item/card/id)) - src.active1 = null - src.active2 = null - - if (src.check_access(src.scan)) - src.authenticated = src.scan.registered_name - src.rank = src.scan.assignment - src.screen = 1 - - if (src.authenticated) - - if(href_list["screen"]) - src.screen = text2num(href_list["screen"]) - if(src.screen < 1) - src.screen = 1 - - src.active1 = null - src.active2 = null - - if (href_list["del_all"]) - src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) - - if (href_list["del_all2"]) - for(var/datum/data/record/R as anything in GLOB.data_core.medical) - GLOB.data_core.medical -= R - qdel(R) - //Foreach goto(494) - temp = "All records deleted." - msg_admin_niche("[key_name_admin(usr)] deleted all medical records.") - - if (href_list["field"]) - var/a1 = active1 - var/a2 = active2 - switch(href_list["field"]) - if("sex") - if (istype(active1, /datum/data/record)) - var/new_value = "Male" - if (active1.fields["sex"] == "Male") - new_value = "Female" - active1.fields["sex"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record sex for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("age") - if (istype(active1, /datum/data/record)) - var/new_value = input("Please input age:", "Med. records", active1.fields["age"], null) as num - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active1 != a1)) - return - active1.fields["age"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record age for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("mi_dis") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(trim(strip_html(input("Please input minor disabilities list:", "Med. records", active2.fields["mi_dis"], null) as text)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["mi_dis"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record minor disabilities list for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("mi_dis_d") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(trim(strip_html(input("Please summarize minor dis.:", "Med. records", active2.fields["mi_dis_d"], null) as message)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["mi_dis_d"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record minor disabilities desc for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("ma_dis") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(trim(strip_html(input("Please input major diabilities list:", "Med. records", active2.fields["ma_dis"], null) as text)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["ma_dis"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record major disabilities list for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("ma_dis_d") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(trim(strip_html(input("Please summarize major dis.:", "Med. records", active2.fields["ma_dis_d"], null) as message)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["ma_dis_d"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record major disabilities desc for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("alg") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(trim(strip_html(input("Please state allergies:", "Med. records", active2.fields["alg"], null) as text)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["alg"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record allergies list for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("alg_d") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(trim(strip_html(input("Please summarize allergies:", "Med. records", active2.fields["alg_d"], null) as message)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["alg_d"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record allergies desc for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("cdi") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(trim(strip_html(input("Please state diseases:", "Med. records", active2.fields["cdi"], null) as text)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["cdi"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record disabilities list for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("cdi_d") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(trim(strip_html(input("Please summarize diseases:", "Med. records", active2.fields["cdi_d"], null) as message)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["cdi_d"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record disabilities desc for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("notes") - if (istype(active2, /datum/data/record)) - var/new_value = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - active2.fields["notes"] = new_value - msg_admin_niche("[key_name_admin(usr)] set the medical record notes for [active1.fields["name"]] ([active1.fields["id"]]) to [new_value].") - if("p_stat") - if (istype(active1, /datum/data/record)) - temp = text("Physical Condition:
\n\t*Deceased*
\n\t*SSD*
\n\tActive
\n\tPhysically Unfit
\n\tDisabled
", src, src, src, src, src) - if("m_stat") - if (istype(active1, /datum/data/record)) - temp = text("Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
", src, src, src, src) - if("b_type") - if (istype(active2, /datum/data/record)) - temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) - - - if (href_list["p_stat"]) - if(istype(active1, /datum/data/record)) - switch(href_list["p_stat"]) - if("deceased") - active1.fields["p_stat"] = "*Deceased*" - if("ssd") - active1.fields["p_stat"] = "*SSD*" - if("active") - active1.fields["p_stat"] = "Active" - if("unfit") - active1.fields["p_stat"] = "Physically Unfit" - if("disabled") - active1.fields["p_stat"] = "Disabled" - msg_admin_niche("[key_name_admin(usr)] set the medical record physical state for [active1.fields["name"]] ([active1.fields["id"]]) to [href_list["p_stat"]].") - - if (href_list["m_stat"]) - if(istype(active1, /datum/data/record)) - switch(href_list["m_stat"]) - if("insane") - active1.fields["m_stat"] = "*Insane*" - if("unstable") - active1.fields["m_stat"] = "*Unstable*" - if("watch") - active1.fields["m_stat"] = "*Watch*" - if("stable") - active1.fields["m_stat"] = "Stable" - msg_admin_niche("[key_name_admin(usr)] set the medical record mental state for [active1.fields["name"]] ([active1.fields["id"]]) to [href_list["m_stat"]].") - - if (href_list["b_type"]) - if(istype(active2, /datum/data/record)) - switch(href_list["b_type"]) - if("an") - active2.fields["b_type"] = "A-" - if("bn") - active2.fields["b_type"] = "B-" - if("abn") - active2.fields["b_type"] = "AB-" - if("on") - active2.fields["b_type"] = "O-" - if("ap") - active2.fields["b_type"] = "A+" - if("bp") - active2.fields["b_type"] = "B+" - if("abp") - active2.fields["b_type"] = "AB+" - if("op") - active2.fields["b_type"] = "O+" - msg_admin_niche("[key_name_admin(usr)] set the medical record blood type for [active1.fields["name"]] ([active1.fields["id"]]) to [active2.fields["b_type"]].") - - if (href_list["del_r"]) - if(istype(active2, /datum/data/record)) - temp = text("Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
", src, src) - - if (href_list["del_r2"]) - msg_admin_niche("[key_name_admin(usr)] deleted the medical record for [active1.fields["name"]] ([active1.fields["id"]]).") - QDEL_NULL(active2) - - if (href_list["d_rec"]) - var/datum/data/record/R = locate(href_list["d_rec"]) - var/datum/data/record/M = locate(href_list["d_rec"]) - if (!( GLOB.data_core.general.Find(R) )) - src.temp = "Record Not Found!" - return - for(var/datum/data/record/E in GLOB.data_core.medical) - if ((E.fields["ref"] == R.fields["ref"] || E.fields["id"] == R.fields["id"])) - M = E - src.active1 = R - src.active2 = M - src.screen = 4 - - if (href_list["new"]) - if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) ))) - var/datum/data/record/R = new /datum/data/record( ) - R.fields["name"] = src.active1.fields["name"] - R.fields["id"] = src.active1.fields["id"] - R.name = text("Medical Record #[]", R.fields["id"]) - R.fields["b_type"] = "Unknown" - R.fields["mi_dis"] = "None" - R.fields["mi_dis_d"] = "No minor disabilities have been declared." - R.fields["ma_dis"] = "None" - R.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - R.fields["alg"] = "None" - R.fields["alg_d"] = "No allergies have been detected in this patient." - R.fields["cdi"] = "None" - R.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - R.fields["notes"] = "No notes." - GLOB.data_core.medical += R - src.active2 = R - src.screen = 4 - - if (href_list["add_c"]) - if (!( istype(active2, /datum/data/record) )) - return - var/a2 = active2 - var/new_value = copytext(trim(strip_html(input("Add Comment:", "Med. records", null, null) as message)),1,MAX_MESSAGE_LEN) - if ((!( new_value ) || !( authenticated ) || usr.stat || usr.is_mob_restrained() || (!in_range(src, usr) && (!isRemoteControlling(usr))) || active2 != a2)) - return - var/counter = 1 - while(active2.fields[text("com_[]", counter)]) - counter++ - active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [GLOB.game_year]
[new_value]") - msg_admin_niche("[key_name_admin(usr)] added a medical comment for [active1.fields["name"]] ([active1.fields["id"]]): [new_value].") - - if (href_list["del_c"]) - if ((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) - msg_admin_niche("[key_name_admin(usr)] deleted a medical comment for [active1.fields["name"]] ([active1.fields["id"]]): [active2.fields[text("com_[]", href_list["del_c"])]].") - active2.fields[text("com_[]", href_list["del_c"])] = text("Deleted entry by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [GLOB.game_year]") - - if (href_list["search"]) - var/t1 = stripped_input(usr, "Search String: (Name, DNA, or ID)", "Med. records") - if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.is_mob_restrained() || ((!in_range(src, usr)) && (!isRemoteControlling(usr))))) - return - src.active1 = null - src.active2 = null - t1 = lowertext(t1) - for(var/datum/data/record/R as anything in GLOB.data_core.medical) - if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]))) - src.active2 = R - if (!active2) - temp = "Could not locate record [t1]." - else - for(var/datum/data/record/E in GLOB.data_core.general) - if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) - src.active1 = E - src.screen = 4 - - if (href_list["print_p"]) - if (!( src.printing )) - src.printing = 1 - var/datum/data/record/record1 = null - var/datum/data/record/record2 = null - if ((istype(src.active1, /datum/data/record) && GLOB.data_core.general.Find(src.active1))) - record1 = active1 - if ((istype(src.active2, /datum/data/record) && GLOB.data_core.medical.Find(src.active2))) - record2 = active2 - playsound(src.loc, 'sound/machines/fax.ogg', 15, 1) - sleep(40) - var/obj/item/paper/P = new /obj/item/paper( src.loc ) - P.info = "
Medical Record

" - if (record1) - P.info += text("Name: []
\nID: []
\nSex: []
\nAge: []
\nPhysical Status: []
\nMental Status: []
", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["p_stat"], record1.fields["m_stat"]) - P.name = text("Medical Record ([])", record1.fields["name"]) - else - P.info += "General Record Lost!
" - P.name = "Medical Record" - if (record2) - P.info += "
\n
Medical Data

\nBlood Type: [record2.fields["b_type"]]
\n
\nMinor Disabilities: [record2.fields["mi_dis"]]
\nDetails: [record2.fields["mi_dis_d"]]
\n
\nMajor Disabilities: [record2.fields["ma_dis"]]
\nDetails: [record2.fields["ma_dis_d"]]
\n
\nAllergies: [record2.fields["alg"]]
\nDetails: [record2.fields["alg_d"]]
\n
\nCurrent Diseases: [record2.fields["cdi"]] (per disease info placed in log/comment section)
\nDetails: [record2.fields["cdi_d"]]
\n
\nImportant Notes:
\n\t[decode(record2.fields["notes"])]
\n
\n
Comments/Log

" - var/counter = 1 - while(record2.fields[text("com_[]", counter)]) - P.info += text("[]
", record2.fields[text("com_[]", counter)]) - counter++ - else - P.info += "Medical Record Lost!
" - P.info += "" - P.info += text("

This report was printed by [] [].
The [MAIN_SHIP_NAME],[]/[], []

\n",rank,authenticated,time2text(world.timeofday, "MM/DD"),GLOB.game_year,worldtime2text()) - src.printing = null - - if(href_list["print_bs"])//Prints latest body scan - if(!(src.printing)) - src.printing = 1 - var/datum/data/record/record - if ((istype(src.active1, /datum/data/record) && GLOB.data_core.general.Find(src.active1))) - record = active1 - if(!record) - return - playsound(src.loc, 'sound/machines/fax.ogg', 15, 1) - sleep(40) - var/datum/asset/asset = get_asset_datum(/datum/asset/simple/paper) - var/obj/item/paper/P = new /obj/item/paper( src.loc ) - P.name = text("Scan: [], []",record.fields["name"],worldtime2text()) - P.info += text("

Official Weyland-Yutani Document
Scan Record

[]

\n
",record.fields["name"]) - for(var/datum/data/record/R as anything in GLOB.data_core.medical) - if (R.fields["name"] == record.fields["name"]) - if(R.fields["last_scan_time"] && R.fields["last_scan_result"]) - P.info += R.fields["last_scan_result"] - break - else - P.info += "No scan on record." - P.info += text("

This report was printed by [] [].
The [MAIN_SHIP_NAME], []/[], []

\n",rank,authenticated,time2text(world.timeofday, "MM/DD"),GLOB.game_year,worldtime2text()) - src.printing = null - - - - src.add_fingerprint(usr) - src.updateUsrDialog() - return + tgui_alert(user, "Record or associated field not found.") + return -/obj/structure/machinery/computer/med_data/emp_act(severity) - . = ..() - if(inoperable()) + var/name = general_record.fields["name"] + // record modifications to be ported to ARES logs in future + msg_admin_niche("[key_name(user)] changed the record of [name] at [get_location_in_text(user)]. Field [original_field] value changed to [value] [ADMIN_JMP(loc)]") + + return TRUE + + if ("add_comment") + var/id = params["id"] + var/comment = params["comment"] + + if (!id || !comment || length(trim(comment)) == 0) + to_chat(user, SPAN_WARNING("Invalid input. Ensure both ID and comment are provided.")) + return + + // Locate the medical record + var/datum/data/record/medical_record = find_record("medical", id) + + if (!medical_record) + to_chat(user, SPAN_WARNING("Record not found.")) + return + + var/comment_id = length(medical_record.fields["comments"] || list()) + 1 + var/created_at = text("[] [] []", time2text(world.realtime, "MMM DD"), time2text(world.time, "[worldtime2text()]:ss"), GLOB.game_year) + + var/new_comment = list( + "entry" = strip_html(trim(comment)), + "created_by" = list("name" = user.get_authentification_name(), "rank" = user.get_assignment()), + "created_at" = created_at, + "deleted_by" = null, + "deleted_at" = null + ) + + if (!islist(medical_record.fields["comments"])) + medical_record.fields["comments"] = list("[comment_id]" = new_comment) + else + medical_record.fields["comments"]["[comment_id]"] = new_comment + + to_chat(user, SPAN_NOTICE("Comment added successfully.")) + msg_admin_niche("[key_name_admin(user)] added medical comment for [medical_record.fields["name"]] at [get_location_in_text(user)] [ADMIN_JMP(loc)]") + + return TRUE + + if ("delete_comment") + var/id = params["id"] + var/comment_key = params["key"] + + if (!id || !comment_key) + to_chat(user, SPAN_WARNING("Invalid input. Ensure both ID and comment key are provided.")) + return + + // Locate the medical record + var/datum/data/record/medical_record = find_record("medical", id) + + if (!medical_record) + to_chat(user, SPAN_WARNING("Record not found.")) + return + + if (!medical_record.fields["comments"] || !medical_record.fields["comments"][comment_key]) + to_chat(user, SPAN_WARNING("Comment not found.")) + return + + var/comment = medical_record.fields["comments"][comment_key] + if (comment["deleted_by"]) + to_chat(user, SPAN_WARNING("This comment is already deleted.")) + return + + comment["deleted_by"] = "[user.get_authentification_name()] ([user.get_assignment()])" + comment["deleted_at"] = text("[] [] []", time2text(world.realtime, "MMM DD"), time2text(world.time, "[worldtime2text()]:ss"), GLOB.game_year) + + medical_record.fields["comments"][comment_key] = comment + + to_chat(user, SPAN_NOTICE("Comment deleted successfully.")) + msg_admin_niche("[key_name_admin(user)] deleted comment [comment_key] on [medical_record.fields["name"]]'s medical record at [get_location_in_text(user)] [ADMIN_JMP(loc)]") + + return TRUE + + //* Records maintenance actions + if ("new_medical_record") + if(access_level != MEDICAL_RECORD_ACCESS_LEVEL_2) + to_chat(user, SPAN_WARNING("Insufficient access credentials!")) + return + + var/id = params["id"] + var/name = params["name"] + + if (name && id) + balloon_alert_to_viewers("Place a hand on the biometric reader to create a new medical record.") + to_chat(user, SPAN_WARNING("Place a hand on the biometric reader to create a new medical record.")) + playsound(src, 'sound/machines/ping.ogg', 15, FALSE) + bio_link_target_record_id = id + biometric_scan_timer = addtimer(CALLBACK(src, PROC_REF(handle_biometric_scan_timeout), user), 10 SECONDS, TIMER_STOPPABLE) + + return + + if ("new_general_record") + + if(access_level != MEDICAL_RECORD_ACCESS_LEVEL_2) + to_chat(user, SPAN_WARNING("Insufficient access credentials!")) + return + + CreateGeneralRecord() + to_chat(user, SPAN_NOTICE("You successfully created a new general record.")) + msg_admin_niche("[key_name_admin(user)] created new general record at [get_location_in_text(user)] [ADMIN_JMP(loc)].") + update_static_data_for_all_viewers() + + return TRUE + + if ("delete_medical_record") + if(access_level != MEDICAL_RECORD_ACCESS_LEVEL_2) + to_chat(user, SPAN_WARNING("Insufficient access credentials!")) + return + + var/id = params["id"] + var/datum/data/record/medical_record = find_record("medical", id) + var/datum/data/record/general_record = find_record("medical", id) + + if (!medical_record || !general_record) + to_chat(user, SPAN_WARNING("Record not found.")) + return + + var/record_name = general_record.fields["name"] + if ((istype(medical_record, /datum/data/record) && GLOB.data_core.medical.Find(medical_record))) + GLOB.data_core.medical -= medical_record + msg_admin_niche("[key_name_admin(user)] deleted the medical record of [record_name] at [get_location_in_text(user)] [ADMIN_JMP(loc)].") + qdel(medical_record) + + tgui_interact(user, ui) + + return + + //* Actions for ingame objects interactions + if ("print_medical_record") + var/target_record_id = params["id"] + if (!COOLDOWN_FINISHED(src, record_printing_cooldown)) + to_chat(user, SPAN_WARNING("Woah there buddy! Let the printer catch its breath before ordering the next document.")) + return + + COOLDOWN_START(src, record_printing_cooldown, 7 SECONDS) + + balloon_alert_to_viewers("Printing record!") + to_chat(user, SPAN_NOTICE("Printing record!")) + playsound(loc, 'sound/machines/fax.ogg', 15, TRUE) + + addtimer(CALLBACK(src, PROC_REF(print_medical_record), target_record_id, user), 3 SECONDS) + return + + if ("update_photo") + var/id = params["id"] + var/photo_profile = params["photo_profile"] + var/icon/image = get_photo(user) + if(!image) + to_chat(user, SPAN_WARNING("You are currently not holding any photo.")) + return + + // Locate the general record + var/datum/data/record/general_record = find_record("general", id) + + if (!general_record) + to_chat(user, SPAN_WARNING("Record not found.")) + return + + general_record.fields["photo_[photo_profile]"] = image + ui.send_update(list( + "photo_[photo_profile]" = icon2html(image, user.client, sourceonly = TRUE), + )) + + to_chat(user, SPAN_NOTICE("You successfully updated record [photo_profile] photo")) + msg_admin_niche("[key_name_admin(user)] updated the record photo of [general_record.fields["name"]] at [get_location_in_text(user)] [ADMIN_JMP(loc)]") + + return TRUE + +/obj/structure/machinery/computer/med_data/proc/validate_field(field, value, mob/user = usr, strict_mode = FALSE) + var/list/validators = list( + "general_name" = list( + "type" = "string", + "max_length" = 49, + "required" = TRUE, + "regex" = regex(@"^[a-zA-Z' ]+$"), // Allow letters, spaces, and single quotes + ), + "general_age" = list( + "type" = "number", + "required" = TRUE, + "min_value" = 18, + "max_value" = 100, + ), + "general_sex" = list( + "type" = "string", + "required" = TRUE, + "allowed_values" = list("Male", "Female"), + ), + "medical_major_disability" = list( + "type" = "string", + "max_length" = 50, + ), + "medical_minor_disability" = list( + "type" = "string", + "max_length" = 50, + ), + "medical_diseases" = list( + "type" = "string", + "max_length" = 50, + ), + "medical_allergies" = list( + "type" = "string", + "max_length" = 50, + ), + "medical_comments" = list( + "type" = "string", + "max_length" = 500, + "required" = TRUE, + ) + ) + + var/list/rules = validators[field] + // Handle strict mode: if the field is undefined, fail immediately + if (strict_mode && !rules) + return "[field] is not a recognized property." + + // If not in strict mode and the field is undefined, allow it through without checks + if (!rules) return - for(var/datum/data/record/R as anything in GLOB.data_core.medical) - if(prob(10/severity)) - switch(rand(1,6)) - if(1) - msg_admin_niche("The medical record name of [R.fields["name"]] was scrambled!") - R.fields["name"] = "[pick(pick(GLOB.first_names_male), pick(GLOB.first_names_female))] [pick(GLOB.last_names)]" - if(2) - R.fields["sex"] = pick("Male", "Female") - msg_admin_niche("The medical record sex of [R.fields["name"]] was scrambled!") - if(3) - R.fields["age"] = rand(5, 85) - msg_admin_niche("The medical record age of [R.fields["name"]] was scrambled!") - if(4) - R.fields["b_type"] = pick("A-", "B-", "AB-", "O-", "A+", "B+", "AB+", "O+") - msg_admin_niche("The medical record blood type of [R.fields["name"]] was scrambled!") - if(5) - R.fields["p_stat"] = pick("*SSD*", "Active", "Physically Unfit", "Disabled") - msg_admin_niche("The medical record physical state of [R.fields["name"]] was scrambled!") - if(6) - R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") - msg_admin_niche("The medical record mental state of [R.fields["name"]] was scrambled!") - continue + // Check required + if (rules["required"] && isnull(value)) + return "[field] is required." + + // Check type + if (rules["type"] == "string" && !istext(value)) + return "[field] must be a string." + + // Check max_length + if (rules["type"] == "string" && rules["max_length"] && length(value) > rules["max_length"]) + return "[field] exceeds maximum length of [rules["max_length"]]." + + // Validate value range for numbers + if (rules["type"] == "number") + var/regex/regex_number = regex(@"^[-+]?[0-9]*(\.[0-9]+)?$") + if (!regex_number.Find(value)) + return "Field [field] must be a valid number." + + var/min_value = rules["min_value"] + var/max_value = rules["max_value"] + var/num_value = text2num(value) + if (rules["min_value"] && num_value < min_value) + return "Field [field] must not be less than [min_value]." + if (rules["max_value"] && num_value > max_value) + return "Field [field] must not exceed [max_value]." + + // Check regex + var/regex/regex = rules["regex"] + if (rules["regex"] && !regex.Find(value)) + return "[field] contains invalid characters." + + // Check allowed_values + if (rules["allowed_values"] && !(value in rules["allowed_values"])) + return "[value] is not a valid value for [field]." - else if(prob(1)) - msg_admin_niche("The medical record of [R.fields["name"]] was lost!") - GLOB.data_core.medical -= R - qdel(R) - continue + return +/obj/structure/machinery/computer/med_data/proc/find_record(record_type, id) + // Determine the list to search based on record_type + var/list/records = null + if (record_type == "general") + records = GLOB.data_core.general + else if (record_type == "medical") + records = GLOB.data_core.medical + else + return // Unsupported record type + // There are actually other types of records as well, but I want to make it foolproof + + // Iterate over the records to find the one matching the ID + for (var/datum/data/record/record in records) + if (record.fields["id"] == id) + return record + +/obj/structure/machinery/computer/med_data/proc/get_photo(mob/user) + if(istype(user.get_active_hand(), /obj/item/photo)) + var/obj/item/photo/photo = user.get_active_hand() + return photo.img /obj/structure/machinery/computer/med_data/laptop name = "Medical Laptop" diff --git a/code/game/machinery/computer/sentencing.dm b/code/game/machinery/computer/sentencing.dm index 620593de6237..6236127eb928 100644 --- a/code/game/machinery/computer/sentencing.dm +++ b/code/game/machinery/computer/sentencing.dm @@ -11,7 +11,7 @@ unacidable = TRUE breakable = FALSE unslashable = TRUE - + /obj/structure/machinery/computer/sentencing/ex_act(severity) return @@ -50,6 +50,7 @@ current_charge["name"] = L.name current_charge["desc"] = L.desc current_charge["special_punishment"] = L.special_punishment + current_charge["conditions"] = L.conditions current_charge["ref"] = "\ref[L]" current_charges += list(current_charge) data["current_charges"] = current_charges @@ -85,6 +86,7 @@ data["laws"] += list(create_law_data("Capital Laws", SSlaw_init.capital_law)) data["laws"] += list(create_law_data("Optional Laws", SSlaw_init.optional_law)) data["laws"] += list(create_law_data("Precautionary Laws", SSlaw_init.precautionary_law)) + data["laws"] += list(create_law_data("Civilian Laws", SSlaw_init.civilian_law)) return data @@ -98,6 +100,7 @@ law["desc"] = L.desc law["brig_time"] = L.brig_time law["special_punishment"] = L.special_punishment + law["conditions"] = L.conditions law["ref"] = "\ref[L]" formatted_laws += list(law) diff --git a/code/game/machinery/computer/wy_computer.dm b/code/game/machinery/computer/wy_computer.dm new file mode 100644 index 000000000000..22d04d6e5da4 --- /dev/null +++ b/code/game/machinery/computer/wy_computer.dm @@ -0,0 +1,384 @@ +// #################### WY Intranet Console ##################### +/obj/structure/machinery/computer/wy_intranet + name = "WY Intranet Terminal" + desc = "A standard issue Weyland-Yutani terminal for accessing the corporate intranet." + icon_state = "medlaptop" + explo_proof = TRUE + + var/current_menu = "login" + var/last_menu = "" + + /// The last person to login. + var/last_login = "No User" + + var/authentication = WY_COMP_ACCESS_LOGGED_OUT + + /// A list of everyone who has logged in. + var/list/login_history = list() + + /// The ID of the wall divider(s) linked to this console. + var/divider_id = null + /// Whether or not the control panel for a hidden cell is available. + var/hidden_cell_id = null + /// The ID of any security systems. (Flashbulbs) + var/security_system_id = null + + // If the room divider, or cell doors/shutters are open or not. + var/open_divider = FALSE + var/open_cell_door = FALSE + var/open_cell_shutters = FALSE + + /// A loose number to order security vents if they aren't pre-ordered. + var/vent_tag_num = 1 + + /// Machinery the console interacts with (doors/shutters) + var/list/obj/structure/machinery/targets = list() + + COOLDOWN_DECLARE(printer_cooldown) + COOLDOWN_DECLARE(cell_flasher) + COOLDOWN_DECLARE(sec_flasher) + +/obj/structure/machinery/computer/wy_intranet/Initialize() + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/machinery/computer/wy_intranet/LateInitialize() + . = ..() + get_targets() + +/obj/structure/machinery/computer/wy_intranet/Destroy() + targets = null + . = ..() + +/obj/structure/machinery/computer/wy_intranet/proc/get_targets() + targets = list() + for(var/obj/structure/machinery/door/target_door in GLOB.machines) + if(target_door.id == divider_id) + targets += target_door + continue + if(target_door.id == hidden_cell_id) + targets += target_door + + for(var/obj/structure/machinery/flasher/target_flash in GLOB.machines) + if(target_flash.id == hidden_cell_id) + targets += target_flash + continue + if(target_flash.id == security_system_id) + targets += target_flash + + for(var/obj/structure/pipes/vents/pump/no_boom/gas/gas_vent in GLOB.gas_vents) + if(gas_vent.network_id == security_system_id) + targets += gas_vent + +/obj/structure/machinery/computer/wy_intranet/liaison + divider_id = "CLRoomDivider" + hidden_cell_id = "CL_Containment" + security_system_id = "CL_Security" + +// ------ WY Intranet Console UI ------ // + +/obj/structure/machinery/computer/wy_intranet/attack_hand(mob/user) + if(..() || !allowed(usr) || inoperable()) + return FALSE + + tgui_interact(user) + return TRUE + +/obj/structure/machinery/computer/wy_intranet/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "WYComputer", name) + ui.open() + +/obj/structure/machinery/computer/wy_intranet/ui_data(mob/user) + var/list/data = list() + + data["current_menu"] = current_menu + data["last_page"] = last_menu + data["logged_in"] = last_login + + data["access_text"] = "Intranet Tier [authentication], [wy_auth_to_text(authentication)]." + data["access_level"] = authentication + + data["alert_level"] = GLOB.security_level + data["worldtime"] = world.time + + data["access_log"] = login_history + + data["has_room_divider"] = divider_id + data["has_hidden_cell"] = hidden_cell_id + + data["open_divider"] = open_divider + data["open_cell_door"] = open_cell_door + data["open_cell_shutters"] = open_cell_shutters + + data["printer_cooldown"] = !COOLDOWN_FINISHED(src, printer_cooldown) + data["cell_flash_cooldown"] = !COOLDOWN_FINISHED(src, cell_flasher) + + data["security_vents"] = get_security_vents() + + return data + +/obj/structure/machinery/computer/wy_intranet/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(!allowed(user)) + return UI_UPDATE + if(inoperable()) + return UI_DISABLED + +/obj/structure/machinery/computer/wy_intranet/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + var/mob/user = ui.user + var/playsound = TRUE + + switch (action) + if("go_back") + if(!last_menu) + return to_chat(user, SPAN_WARNING("Error, no previous page detected.")) + var/temp_holder = current_menu + current_menu = last_menu + last_menu = temp_holder + + if("login") + var/mob/living/carbon/human/human_user = user + var/obj/item/card/id/idcard = human_user.get_active_hand() + if(istype(idcard)) + if(!idcard.check_biometrics(human_user)) + to_chat(human_user, SPAN_WARNING("ERROR: Biometric identification failure. You must use your own ID card during login procedures.")) + return FALSE + authentication = get_wy_access(idcard) + last_login = idcard.registered_name + else if(human_user.wear_id) + idcard = human_user.get_idcard() + if(idcard) + authentication = get_wy_access(idcard) + last_login = idcard.registered_name + else + to_chat(human_user, SPAN_WARNING("You require an ID card to access this terminal!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(authentication) + login_history += "[last_login] at [worldtime2text()], Intranet Tier [authentication] - [wy_auth_to_text(authentication)]." + current_menu = "main" + + // -- Page Changers -- // + if("logout") + last_menu = current_menu + current_menu = "login" + login_history += "[last_login] logged out at [worldtime2text()]." + last_login = "No User" + authentication = WY_COMP_ACCESS_LOGGED_OUT + + if("home") + last_menu = current_menu + current_menu = "main" + if("page_vents") + last_menu = current_menu + current_menu = "vents" + + if("unlock_divider") + toggle_divider() + + if("cell_shutters") + if(!open_cell_shutters) + open_shutters() + else + close_door() + close_shutters() + + if("cell_door") + if(!open_cell_door) + open_door() + else + close_door() + + if("cell_flash") + trigger_cell_flash() + + if("security_flash") + trigger_sec_flash() + + if("trigger_vent") + playsound = FALSE + var/obj/structure/pipes/vents/pump/no_boom/gas/sec_vent = locate(params["vent"]) + if(!istype(sec_vent) || sec_vent.welded) + to_chat(user, SPAN_WARNING("ERROR: Gas release failure.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(!COOLDOWN_FINISHED(sec_vent, vent_trigger_cooldown)) + to_chat(user, SPAN_WARNING("ERROR: Insufficient gas reserve for this vent.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + to_chat(user, SPAN_WARNING("Initiating gas release from [sec_vent.vent_tag].")) + playsound(src, 'sound/machines/chime.ogg', 15, 1) + COOLDOWN_START(sec_vent, vent_trigger_cooldown, 30 SECONDS) + ares_apollo_talk("Nerve Gas release imminent from [sec_vent.vent_tag].")//Ares still monitors release of gas, even in the CLs vents. + log_ares_security("Nerve Gas Release", "Released Nerve Gas from Vent '[sec_vent.vent_tag]'.") + sec_vent.create_gas(VENT_GAS_CN20, 6, 5 SECONDS) + log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via WY Intranet.") + + if(playsound) + playsound(src, "keyboard_alt", 15, 1) + + + +/obj/structure/machinery/computer/proc/get_wy_access(obj/item/card/id/card) + if(ACCESS_WY_GENERAL in card.access) + if(card.paygrade) + switch(card.paygrade) + if(PAY_SHORT_WYC10) + return WY_COMP_ACCESS_DIRECTOR + if(PAY_SHORT_WYC9, PAY_SHORT_WYC8) + return WY_COMP_ACCESS_SENIOR_LEAD + if(PAY_SHORT_WYC7, PAY_SHORT_WYC6) + return WY_COMP_ACCESS_SUPERVISOR + if(card.assignment == JOB_CORPORATE_LIAISON) + return WY_COMP_ACCESS_LIAISON + if(card.paygrade && (card.paygrade == PAY_SHORT_WYC5 || card.paygrade == PAY_SHORT_WYC4)) + return WY_COMP_ACCESS_CORPORATE_SENIOR + return WY_COMP_ACCESS_CORPORATE + else + return WY_COMP_ACCESS_FORBIDDEN + + + +/obj/structure/machinery/computer/proc/wy_auth_to_text(access_level) + switch(access_level) + if(WY_COMP_ACCESS_LOGGED_OUT) + return "Logged Out" + if(WY_COMP_ACCESS_FORBIDDEN) + return "Unauthorized User" + if(WY_COMP_ACCESS_LIAISON) + return "Weyland-Yutani Liaison" + if(WY_COMP_ACCESS_CORPORATE) + return "Weyland-Yutani Employee" + if(WY_COMP_ACCESS_SUPERVISOR) + return "Weyland-Yutani Supervisor" + if(WY_COMP_ACCESS_SENIOR_LEAD) + return "Weyland-Yutani Senior Leadership" + if(WY_COMP_ACCESS_DIRECTOR) + return "Weyland-Yutani Directorate" + + + +// Opens and locks doors, power check +/obj/structure/machinery/computer/wy_intranet/proc/open_door(force = FALSE) + if(inoperable() && !force) + return FALSE + + for(var/obj/structure/machinery/door/airlock/target_door in targets) + if(target_door.id != hidden_cell_id) + continue + if(!target_door.density) + continue + target_door.unlock(force) + target_door.open(force) + open_cell_door = TRUE + + return TRUE + +// Closes and unlocks doors, power check +/obj/structure/machinery/computer/wy_intranet/proc/close_door() + if(inoperable()) + return FALSE + + for(var/obj/structure/machinery/door/airlock/target_door in targets) + if(target_door.id != hidden_cell_id) + continue + if(target_door.density) + continue + target_door.close() + target_door.lock() + open_cell_door = FALSE + + return TRUE + +// Opens and locks doors, power check +/obj/structure/machinery/computer/wy_intranet/proc/open_shutters(force = FALSE) + if(inoperable() && !force) + return FALSE + + for(var/obj/structure/machinery/door/poddoor/target_shutter in targets) + if(target_shutter.id != hidden_cell_id) + continue + if(target_shutter.stat & BROKEN) + continue + if(!target_shutter.density) + continue + target_shutter.open() + open_cell_shutters = TRUE + return TRUE + +// Closes and unlocks doors, power check +/obj/structure/machinery/computer/wy_intranet/proc/close_shutters() + if(inoperable()) + return FALSE + for(var/obj/structure/machinery/door/poddoor/target_shutter in targets) + if(target_shutter.id != hidden_cell_id) + continue + if(target_shutter.stat & BROKEN) + continue + if(target_shutter.density) + continue + target_shutter.close() + open_cell_shutters = FALSE + return TRUE + +/obj/structure/machinery/computer/wy_intranet/proc/toggle_divider() + if(inoperable()) + return FALSE + if(open_divider) + for(var/obj/structure/machinery/door/poddoor/divider in targets) + if(divider.id != divider_id) + continue + if(divider.density) + continue + divider.close() + open_divider = FALSE + else + for(var/obj/structure/machinery/door/poddoor/divider in targets) + if(divider.id != divider_id) + continue + if(!divider.density) + continue + divider.open() + open_divider = TRUE + +/obj/structure/machinery/computer/wy_intranet/proc/trigger_cell_flash() + if(!COOLDOWN_FINISHED(src, cell_flasher)) + return FALSE + + for(var/obj/structure/machinery/flasher/target_flash in targets) + if(target_flash.id != hidden_cell_id) + continue + target_flash.flash() + COOLDOWN_START(src, cell_flasher, 15 SECONDS) + return TRUE + +/obj/structure/machinery/computer/wy_intranet/proc/trigger_sec_flash() + if(!COOLDOWN_FINISHED(src, sec_flasher)) + return FALSE + + for(var/obj/structure/machinery/flasher/target_flash in targets) + if(target_flash.id != security_system_id) + continue + target_flash.flash() + COOLDOWN_START(src, sec_flasher, 15 SECONDS) + return TRUE + +/obj/structure/machinery/computer/wy_intranet/proc/get_security_vents() + var/list/security_vents = list() + for(var/obj/structure/pipes/vents/pump/no_boom/gas/vent in targets) + if(!vent.vent_tag) + vent.vent_tag = "Security Vent #[vent_tag_num]" + vent_tag_num++ + + var/list/current_vent = list() + var/is_available = COOLDOWN_FINISHED(vent, vent_trigger_cooldown) + current_vent["vent_tag"] = vent.vent_tag + current_vent["ref"] = "\ref[vent]" + current_vent["available"] = is_available + security_vents += list(current_vent) + return security_vents diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 467336eb9c78..dd3348639b4a 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -256,8 +256,8 @@ beaker.reagents.reaction(occupant, permeable_in_mobs = FALSE) if(autoeject) - //release the patient automatically when brute and burn are handled on non-robotic limbs - if(!occupant.getBruteLoss(TRUE) && !occupant.getFireLoss(TRUE) && !occupant.getCloneLoss()) + //release the patient automatically when brute and burn are handled on non-robotic limbs and tox damage handled + if(!occupant.getBruteLoss(TRUE) && !occupant.getFireLoss(TRUE) && !occupant.getToxLoss() && !occupant.getCloneLoss()) display_message("Patient's external wounds are healed.") go_out(TRUE) return diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 8a648b1b47e4..50146d859575 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -4,13 +4,12 @@ /obj/structure/machinery/deployable name = "deployable" desc = "deployable" - icon = 'icons/obj/objects.dmi' req_access = list(ACCESS_MARINE_PREP)//I'm changing this until these are properly tested./N /obj/structure/machinery/deployable/barrier name = "deployable barrier" desc = "A deployable barrier. Swipe your ID card to lock/unlock it." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/items/security.dmi' anchored = FALSE density = TRUE icon_state = "barrier0" diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 9b4b944d2033..536434e1b76d 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -12,6 +12,7 @@ power_channel = POWER_CHANNEL_ENVIRON unslashable = TRUE unacidable = TRUE + explo_proof = TRUE var/id = null var/range = 10 var/normaldoorcontrol = CONTROL_POD_DOORS diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index e4f1b08986bb..4640cbcd4356 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -622,7 +622,7 @@ name = "\improper Alpha Squad Preparations" icon = 'icons/obj/structures/doors/prepdoor_alpha.dmi' req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA) opacity = FALSE glass = TRUE @@ -670,7 +670,7 @@ name = "\improper Bravo Squad Preparations" icon = 'icons/obj/structures/doors/prepdoor_bravo.dmi' req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_BRAVO) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_BRAVO) opacity = FALSE glass = TRUE @@ -718,7 +718,7 @@ name = "\improper Charlie Squad Preparations" icon = 'icons/obj/structures/doors/prepdoor_charlie.dmi' req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_CHARLIE) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_CHARLIE) opacity = FALSE glass = TRUE @@ -766,7 +766,7 @@ name = "\improper Delta Squad Preparations" icon = 'icons/obj/structures/doors/prepdoor_delta.dmi' req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_DELTA) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_DELTA) opacity = FALSE glass = TRUE @@ -841,14 +841,14 @@ /obj/structure/machinery/door/airlock/almayer/marine/shared name = "\improper Squads Preparations" icon = 'icons/obj/structures/doors/prepdoor.dmi' - req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) + req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) opacity = FALSE glass = TRUE /obj/structure/machinery/door/airlock/almayer/marine/shared/alpha_bravo name = "\improper Alpha-Bravo Squads Preparations" icon = 'icons/obj/structures/doors/prepdoor_alpha.dmi' - req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO) + req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO) /obj/structure/machinery/door/airlock/almayer/marine/shared/alpha_bravo/yellow icon = 'icons/obj/structures/doors/prepdoor_bravo.dmi' @@ -856,7 +856,7 @@ /obj/structure/machinery/door/airlock/almayer/marine/shared/charlie_delta name = "\improper Charlie-Delta Squads Preparations" icon = 'icons/obj/structures/doors/prepdoor_charlie.dmi' - req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) + req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) /obj/structure/machinery/door/airlock/almayer/marine/shared/charlie_delta/blue icon = 'icons/obj/structures/doors/prepdoor_delta.dmi' @@ -1056,3 +1056,133 @@ glass = FALSE req_access = null req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +// ------ UPP Ship Doors ------ // +// --- UPP Generic Door --- // + +/obj/structure/machinery/door/airlock/upp + openspeed = 4 + +/obj/structure/machinery/door/airlock/upp/generic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_greendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/upp/generic/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/generic/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_greendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/generic/solid/autoname + autoname = TRUE + +// --- UPP Medical Door --- // + +/obj/structure/machinery/door/airlock/upp/medical + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_medigreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_MEDICAL, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/medical/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/medical/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_medigreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/medical/solid/autoname + autoname = TRUE + +// --- UPP Requisitions Door --- // + +/obj/structure/machinery/door/airlock/upp/req + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_reqgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/req/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/req/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_reqgreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/req/solid/autoname + autoname = TRUE + +// --- UPP Security Door --- // + +/obj/structure/machinery/door/airlock/upp/sec + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_secgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_SECURITY, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/sec/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/sec/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_secgreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/sec/solid/autoname + autoname = TRUE + +// --- UPP Engineering Door --- // + +/obj/structure/machinery/door/airlock/upp/engi + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_engigreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/engi/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/engi/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_engigreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/engi/solid/autoname + autoname = TRUE + +// --- UPP Command Door --- // + +/obj/structure/machinery/door/airlock/upp/cic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_commandgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = list(ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/cic/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/cic/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_commandgreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/cic/solid/autoname + autoname = TRUE diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index f4c32a83566a..d0c5d2039a8d 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -570,37 +570,37 @@ name = "\improper Alpha Squad Preparations" icon = 'icons/obj/structures/doors/2x1prepdoor_alpha.dmi' req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA) /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/bravo name = "\improper Bravo Squad Preparations" icon = 'icons/obj/structures/doors/2x1prepdoor_bravo.dmi' req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_BRAVO) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_BRAVO) /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/charlie name = "\improper Charlie Squad Preparations" icon = 'icons/obj/structures/doors/2x1prepdoor_charlie.dmi' req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_CHARLIE) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_CHARLIE) /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/delta name = "\improper Delta Squad Preparations" icon = 'icons/obj/structures/doors/2x1prepdoor_delta.dmi' req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_DELTA) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_DELTA) /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/shared name = "\improper Squads Preparations" icon = 'icons/obj/structures/doors/prepdoor.dmi' - req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) + req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) opacity = FALSE glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/shared/alpha_bravo name = "\improper Alpha-Bravo Squads Preparations" icon = 'icons/obj/structures/doors/2x1prepdoor_alpha.dmi' - req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO) + req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO) /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/shared/alpha_bravo/yellow icon = 'icons/obj/structures/doors/2x1prepdoor_bravo.dmi' @@ -608,7 +608,7 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/shared/charlie_delta name = "\improper Charlie-Delta Squads Preparations" icon = 'icons/obj/structures/doors/2x1prepdoor_charlie.dmi' - req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) + req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/shared/charlie_delta/blue icon = 'icons/obj/structures/doors/2x1prepdoor_delta.dmi' @@ -785,3 +785,142 @@ autoname = TRUE opacity = TRUE glass = FALSE + +// ------ UPP Multi Ship Doors ------ // +// --- UPP Generic Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp + openspeed = 4 + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1greendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1greendoor.dmi' + opacity = TRUE + glass = FALSE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic_solid/autoname + autoname = TRUE + +// --- UPP Generic Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp + openspeed = 4 + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1greendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1greendoor.dmi' + opacity = TRUE + glass = FALSE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic_solid/autoname + autoname = TRUE + +// --- UPP Medical Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp/medical + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1medigreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_MEDICAL, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/medical/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/medical_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1medigreendoor.dmi' + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_UPP_MEDICAL, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/medical_solid/autoname + autoname = TRUE + +// --- UPP Requisition Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp/req + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1reqgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/req/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/req_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1reqgreendoor.dmi' + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/req_solid/autoname + autoname = TRUE + +// --- UPP Security Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp/sec + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1secgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_SECURITY, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/sec/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/sec_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1secgreendoor.dmi' + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_UPP_SECURITY, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/sec_solid/autoname + autoname = TRUE + +// --- UPP Engineering Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp/eng + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1engdoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/eng/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/eng_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1enggreendoor.dmi' + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/eng_solid/autoname + autoname = TRUE diff --git a/code/game/machinery/doors/poddoor/almayer.dm b/code/game/machinery/doors/poddoor/almayer.dm index 75706f99f42f..7284d13fd938 100644 --- a/code/game/machinery/doors/poddoor/almayer.dm +++ b/code/game/machinery/doors/poddoor/almayer.dm @@ -37,6 +37,7 @@ desc = "A metal wall used to separate rooms and make up the ship." icon_state = "liaison_pdoor1" base_icon_state = "liaison_pdoor" + id = "CLRoomDivider" /obj/structure/machinery/door/poddoor/almayer/blended/liaison/open density = FALSE diff --git a/code/game/machinery/doors/poddoor/poddoor.dm b/code/game/machinery/doors/poddoor/poddoor.dm index a313987cb82e..63f10f98f3ca 100644 --- a/code/game/machinery/doors/poddoor/poddoor.dm +++ b/code/game/machinery/doors/poddoor/poddoor.dm @@ -159,7 +159,7 @@ vehicle_resistant = FALSE unslashable = FALSE gender = PLURAL - health = 200 + health = 100 /obj/structure/machinery/door/poddoor/hybrisa/open_shutters/bullet_act(obj/projectile/P) health -= P.damage diff --git a/code/game/machinery/doors/poddoor/shutters/shutters.dm b/code/game/machinery/doors/poddoor/shutters/shutters.dm index 2819d48123aa..1fe7d7d8ee91 100644 --- a/code/game/machinery/doors/poddoor/shutters/shutters.dm +++ b/code/game/machinery/doors/poddoor/shutters/shutters.dm @@ -117,6 +117,11 @@ /obj/structure/machinery/door/poddoor/yautja/hunting_grounds name = "Preserve Shutter" id = "Yautja Preserve" + needs_power = FALSE + unacidable = TRUE + unslashable = TRUE + breakable = FALSE + explo_proof = TRUE /obj/structure/machinery/door/poddoor/yautja/hunting_grounds/Initialize() . = ..() diff --git a/code/game/machinery/doors/railing.dm b/code/game/machinery/doors/railing.dm index 899d7e0646c5..5e34ae6997ef 100644 --- a/code/game/machinery/doors/railing.dm +++ b/code/game/machinery/doors/railing.dm @@ -77,3 +77,6 @@ /obj/structure/machinery/door/poddoor/railing/open density = FALSE + +/obj/structure/machinery/door/poddoor/railing/upp + id = "supply_elevator_railing_upp" diff --git a/code/game/machinery/doors/runed_sandstone.dm b/code/game/machinery/doors/runed_sandstone.dm index c3c6fb5f2f40..354340cfd18f 100644 --- a/code/game/machinery/doors/runed_sandstone.dm +++ b/code/game/machinery/doors/runed_sandstone.dm @@ -251,3 +251,6 @@ name = "\improper Runed Sandstone Airlock" unacidable = FALSE //Destroyable version of the temple doors damage_cap = HEALTH_WALL + +/obj/structure/machinery/door/airlock/sandstone/runed/dark + color = "#2E1E21" diff --git a/code/game/machinery/fax_machine.dm b/code/game/machinery/fax_machine.dm index 94ea2133d994..8509de16a48a 100644 --- a/code/game/machinery/fax_machine.dm +++ b/code/game/machinery/fax_machine.dm @@ -123,15 +123,15 @@ GLOBAL_DATUM_INIT(fax_network, /datum/fax_network, new) if(FAX_NET_USCM) id_tag_prefix = "UA-M"//United Americas Military if(FAX_NET_USCM_HC) - id_tag_final = "UA-MHC" + id_tag_prefix = "UA-MHC" if(FAX_NET_CMB) - id_tag_final = "CMB-R" + id_tag_prefix = "CMB-R" if(FAX_NET_WY) id_tag_prefix = "WY-SCN"//Weyland Yutani Secure Corporate Network if(FAX_NET_WY_COL) id_tag_prefix = "WYC"//Weyland Yutani Communications if(FAX_NET_WY_HC) - id_tag_final = "WY-DIR" + id_tag_prefix = "WY-DIR" if(FAX_NET_TWE) id_tag_prefix = "ICN"//Imperial Communication Network if(FAX_NET_TWE_HC) @@ -347,6 +347,9 @@ GLOBAL_DATUM_INIT(fax_network, /datum/fax_network, new) . = TRUE if("send") + if(!COOLDOWN_FINISHED(src, send_cooldown)) + return + if(!original_fax) to_chat(user, SPAN_NOTICE("No paper loaded.")) return @@ -379,6 +382,8 @@ GLOBAL_DATUM_INIT(fax_network, /datum/fax_network, new) if("ejectpaper") if(!original_fax) to_chat(user, SPAN_NOTICE("No paper loaded.")) + return + if(!ishuman(user)) to_chat(user, SPAN_NOTICE("You can't do that.")) return @@ -615,7 +620,7 @@ GLOBAL_DATUM_INIT(fax_network, /datum/fax_network, new) return if(!(receiver.inoperable())) - flick("[initial(icon_state)]receive", receiver) + flick("[initial(receiver.icon_state)]receive", receiver) playsound(receiver.loc, "sound/machines/fax.ogg", 15) // give the sprite some time to flick @@ -691,7 +696,7 @@ GLOBAL_DATUM_INIT(fax_network, /datum/fax_network, new) /obj/structure/machinery/faxmachine/corporate/liaison/almayer department = FAX_DEPARTMENT_ALMAYER sub_name = "W-Y Liaison" - radio_alert_tag = ":Y" + radio_alert_tag = ":y" /obj/structure/machinery/faxmachine/corporate/highcom department = FAX_DEPARTMENT_WY_HC @@ -729,7 +734,7 @@ GLOBAL_DATUM_INIT(fax_network, /datum/fax_network, new) name = "\improper USCM Provost Fax Machine" department = FAX_DEPARTMENT_ALMAYER_BRIG target_department = FAX_DEPARTMENT_PROVOST - radio_alert_tag = ":P" + radio_alert_tag = ":p" /obj/structure/machinery/faxmachine/uscm/almayer/brig/chief sub_name = "Chief MP" @@ -791,14 +796,18 @@ GLOBAL_DATUM_INIT(fax_network, /datum/fax_network, new) needs_power = FALSE use_power = USE_POWER_NONE health = 150 + department = FAX_DEPARTMENT_ALMAYER + target_department = FAX_DEPARTMENT_PRESS + sub_name = "Correspondent (portable)" var/obj/item/device/fax_backpack/faxbag /obj/structure/machinery/faxmachine/backpack/New(loc, portable_id_tag) - . = ..() if(portable_id_tag) machine_id_tag = portable_id_tag + identity_name = sub_name ? "[sub_name], [machine_id_tag]" : machine_id_tag fixed_id_tag = TRUE GLOB.fax_network.all_faxcodes[machine_id_tag] = src + return ..() ///The wearable and deployable part of the fax machine backpack /obj/item/device/fax_backpack diff --git a/code/game/machinery/fusion_engine.dm b/code/game/machinery/fusion_engine.dm index 9398d33914a5..5e9680a4c930 100644 --- a/code/game/machinery/fusion_engine.dm +++ b/code/game/machinery/fusion_engine.dm @@ -22,6 +22,8 @@ ///Whether the reactor is on the ship var/is_ship_reactor = FALSE + ///Whether the reactor is guaranteed to be fully repaired + var/is_reserved_level = FALSE ///If the generator is overloaded var/overloaded = FALSE //Only possible during hijack once fuel is at 100% @@ -63,6 +65,9 @@ if(6) //16% buildstate = BUILDSTATE_DAMAGE_WRENCH + if(!buildstate && is_reserved_level(z)) + buildstate = BUILDSTATE_FUNCTIONAL + if(require_fusion_cell) //Set up fuel cell if needed fusion_cell = new /obj/item/fuel_cell/used(src) fusion_cell.fuel_amount = fusion_cell.max_fuel_amount @@ -472,6 +477,11 @@ power_generation_max = 100000 //100,000W at full capacity original_fail_rate = 10 +/obj/structure/machinery/power/reactor/rostock + name = "\improper RDS-168 fusion reactor" + desc = "A RDS-168 Fusion Reactor." + + #undef BUILDSTATE_FUNCTIONAL #undef BUILDSTATE_DAMAGE_WELD #undef BUILDSTATE_DAMAGE_WIRE diff --git a/code/game/machinery/gear.dm b/code/game/machinery/gear.dm index c7b06bd21c6f..4d7a6b4cb7fa 100644 --- a/code/game/machinery/gear.dm +++ b/code/game/machinery/gear.dm @@ -15,6 +15,9 @@ /obj/structure/machinery/gear/proc/stop_moving() icon_state = "gear" +/obj/structure/machinery/gear/upp + id = "supply_elevator_railing_upp" + /obj/structure/machinery/elevator_strut name = "\improper strut" icon = 'icons/turf/elevator_strut.dmi' @@ -33,3 +36,4 @@ /obj/structure/machinery/elevator_strut/bottom icon_state = "strut_bottom" + diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index c663c452c2b4..8d0b0e161155 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -22,20 +22,20 @@ /obj/structure/machinery/gibber/New() ..() - overlays += image('icons/obj/structures/machinery/kitchen.dmi', "grjam") + overlays += image(icon, "grjam") /obj/structure/machinery/gibber/update_icon() overlays.Cut() if (dirty) - overlays += image('icons/obj/structures/machinery/kitchen.dmi', "grbloody") + overlays += image(icon, "grbloody") if(inoperable()) return if (!occupant) - overlays += image('icons/obj/structures/machinery/kitchen.dmi', "grjam") + overlays += image(icon, "grjam") else if (operating) - overlays += image('icons/obj/structures/machinery/kitchen.dmi', "gruse") + overlays += image(icon, "gruse") else - overlays += image('icons/obj/structures/machinery/kitchen.dmi', "gridle") + overlays += image(icon, "gridle") /obj/structure/machinery/gibber/relaymove(mob/user) if(user.is_mob_incapacitated(TRUE)) diff --git a/code/game/machinery/medical_pod/autodoc.dm b/code/game/machinery/medical_pod/autodoc.dm index d5af3272af06..2ad0158a139d 100644 --- a/code/game/machinery/medical_pod/autodoc.dm +++ b/code/game/machinery/medical_pod/autodoc.dm @@ -1,6 +1,6 @@ //Autodoc /obj/structure/machinery/medical_pod/autodoc - name = "\improper autodoc emergency medical system" + name = "autodoc emergency medical system" desc = "An emergency surgical device designed to perform life-saving treatments and basic surgeries on patients automatically, without the need of a surgeon.
It still requires someone with medical knowledge to program the treatments correctly; for this reason, colonies that use these often have paramedics trained in autodoc operation." icon_state = "autodoc_open" @@ -43,7 +43,7 @@ // --- MEDICAL POD PROC OVERRIDES --- \\ -/obj/structure/machinery/medical_pod/autodoc/go_in(mob/M) +/obj/structure/machinery/medical_pod/autodoc/go_in(mob/patient) . = ..() start_processing() if(connected) @@ -51,6 +51,12 @@ /obj/structure/machinery/medical_pod/autodoc/go_out() . = ..() + surgery = FALSE + heal_brute = FALSE + heal_burn = FALSE + heal_toxin = FALSE + filtering = FALSE + blood_transfer = FALSE surgery_todo_list = list() stop_processing() if(connected) @@ -68,7 +74,6 @@ if(surgery) visible_message("[icon2html(src, viewers(src))] \The [src] malfunctions as [usr] aborts the surgery in progress.") occupant.take_limb_damage(rand(30,50),rand(30,50)) - surgery = FALSE // message_admins for now, may change to message_admins later message_admins("[key_name(usr)] ejected [key_name(occupant)] from the autodoc during surgery causing damage.") return TRUE @@ -101,9 +106,8 @@ /obj/structure/machinery/medical_pod/autodoc/power_change(area/master_area = null) ..() - if(stat & NOPOWER) + if((stat & NOPOWER) && occupant) visible_message("\The [src] engages the safety override, ejecting the occupant.") - surgery = 0 go_out() return @@ -130,7 +134,6 @@ if(occupant) if(occupant.stat == DEAD) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Patient has expired.") - surgery = 0 go_out() return if(surgery) @@ -203,93 +206,89 @@ var/unneeded = 0 /proc/create_autodoc_surgery(limb_ref, type_of_surgery, surgery_procedure, unneeded=0, organ_ref=null) - var/datum/autodoc_surgery/A = new() - A.type_of_surgery = type_of_surgery - A.surgery_procedure = surgery_procedure - A.unneeded = unneeded - A.limb_ref = limb_ref - A.organ_ref = organ_ref - return A + var/datum/autodoc_surgery/auto_surgery = new() + auto_surgery.type_of_surgery = type_of_surgery + auto_surgery.surgery_procedure = surgery_procedure + auto_surgery.unneeded = unneeded + auto_surgery.limb_ref = limb_ref + auto_surgery.organ_ref = organ_ref + return auto_surgery /obj/structure/machinery/medical_pod/autodoc/allow_drop() return 0 -/proc/generate_autodoc_surgery_list(mob/living/carbon/human/M) - if(!ishuman(M)) +/proc/generate_autodoc_surgery_list(mob/living/carbon/human/patient) + if(!ishuman(patient)) return list() var/surgery_list = list() var/known_implants = list(/obj/item/implant/chem, /obj/item/implant/death_alarm, /obj/item/implant/loyalty, /obj/item/implant/tracking, /obj/item/implant/neurostim) - for(var/obj/limb/L in M.limbs) - if(L) - for(var/datum/wound/W in L.wounds) - if(W.internal) - surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"internal") + for(var/obj/limb/limb in patient.limbs) + if(limb) + for(var/datum/wound/wound in limb.wounds) + if(wound.internal) + surgery_list += create_autodoc_surgery(limb,LIMB_SURGERY,"internal") break var/organdamagesurgery = 0 - for(var/datum/internal_organ/I in L.internal_organs) - if(I.robotic == ORGAN_ASSISTED||I.robotic == ORGAN_ROBOT) + for(var/datum/internal_organ/organ in limb.internal_organs) + if(organ.robotic == ORGAN_ASSISTED || organ.robotic == ORGAN_ROBOT) // we can't deal with these continue - if(I.damage > 0) - if(I.name == "eyeballs") // treat eye surgery differently + if(organ.damage > 0) + if(organ.name == "eyeballs") // treat eye surgery differently continue if(organdamagesurgery > 0) continue // avoid duplicates - surgery_list += create_autodoc_surgery(L,ORGAN_SURGERY,"damage",0,I) + surgery_list += create_autodoc_surgery(limb,ORGAN_SURGERY,"organdamage",0,organ) organdamagesurgery++ - if(L.status & LIMB_BROKEN) - surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"broken") - if(L.status & LIMB_DESTROYED) - if(!(L.parent.status & LIMB_DESTROYED) && L.name != "head") - surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"missing") - if(length(L.implants)) - for(var/I in L.implants) - if(!is_type_in_list(I,known_implants)) - surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"shrapnel") - if(M.incision_depths[L.name] != SURGERY_DEPTH_SURFACE) - surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"open") - var/datum/internal_organ/I = M.internal_organs_by_name["eyes"] - if(I && (M.disabilities & NEARSIGHTED || M.sdisabilities & DISABILITY_BLIND || I.damage > 0)) - surgery_list += create_autodoc_surgery(null,ORGAN_SURGERY,"eyes",0,I) - if(M.getBruteLoss() > 0) + if(limb.status & LIMB_BROKEN) + surgery_list += create_autodoc_surgery(limb,LIMB_SURGERY,"broken") + if(limb.status & LIMB_DESTROYED) + if(!(limb.parent.status & LIMB_DESTROYED) && limb.name != "head") + surgery_list += create_autodoc_surgery(limb,LIMB_SURGERY,"missing") + if(length(limb.implants)) + for(var/implant in limb.implants) + if(!is_type_in_list(implant,known_implants)) + surgery_list += create_autodoc_surgery(limb,LIMB_SURGERY,"shrapnel") + if(patient.incision_depths[limb.name] != SURGERY_DEPTH_SURFACE) + surgery_list += create_autodoc_surgery(limb,LIMB_SURGERY,"open") + var/datum/internal_organ/eyes = patient.internal_organs_by_name["eyes"] + if(eyes && (patient.disabilities & NEARSIGHTED || patient.sdisabilities & DISABILITY_BLIND || eyes.damage > 0)) + surgery_list += create_autodoc_surgery(null,ORGAN_SURGERY,"eyes",0,eyes) + if(patient.getBruteLoss() > 0) surgery_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"brute") - if(M.getFireLoss() > 0) + if(patient.getFireLoss() > 0) surgery_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"burn") - if(M.getToxLoss() > 0) + if(patient.getToxLoss() > 0) surgery_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"toxin") var/overdoses = 0 - for(var/datum/reagent/x in M.reagents.reagent_list) - if(istype(x,/datum/reagent/toxin)||M.reagents.get_reagent_amount(x.id) > x.overdose) + for(var/datum/reagent/chem in patient.reagents.reagent_list) + if(istype(chem,/datum/reagent/toxin) || patient.reagents.get_reagent_amount(chem.id) > chem.overdose) overdoses++ if(overdoses) surgery_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"dialysis") - if(M.blood_volume < BLOOD_VOLUME_NORMAL) + if(patient.blood_volume < BLOOD_VOLUME_NORMAL) surgery_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"blood") return surgery_list -/obj/structure/machinery/medical_pod/autodoc/proc/surgery_op(mob/living/carbon/M) +/obj/structure/machinery/medical_pod/autodoc/proc/surgery_op(mob/living/carbon/enclosed) set background = 1 - if(M.stat == DEAD||!ishuman(M)) + if(enclosed.stat == DEAD||!ishuman(enclosed)) visible_message("\The [src] buzzes.") src.go_out() //kick them out too. return - var/mob/living/carbon/human/H = M - var/datum/data/record/N = null - var/human_ref = WEAKREF(H) - for(var/datum/data/record/R as anything in GLOB.data_core.medical) - if (R.fields["ref"] == human_ref) - N = R - if(isnull(N)) - visible_message("\The [src] buzzes: No records found for occupant.") - src.go_out() //kick them out too. - return - - var/list/surgery_todo_list = N.fields["autodoc_manual"] + var/mob/living/carbon/human/patient = enclosed + var/datum/data/record/patient_record = null + var/human_ref = WEAKREF(patient) + for(var/datum/data/record/medrec as anything in GLOB.data_core.medical) + if (medrec.fields["ref"] == human_ref) + patient_record = medrec + if(isnull(patient_record)) + patient_record = create_medical_record(patient) if(!length(surgery_todo_list)) visible_message("\The [src] buzzes, no surgical procedures were queued.") @@ -301,9 +300,9 @@ var/known_implants = list(/obj/item/implant/chem, /obj/item/implant/death_alarm, /obj/item/implant/loyalty, /obj/item/implant/tracking, /obj/item/implant/neurostim) - for(var/datum/autodoc_surgery/A in surgery_todo_list) - if(A.type_of_surgery == EXTERNAL_SURGERY) - switch(A.surgery_procedure) + for(var/datum/autodoc_surgery/auto_surgery in surgery_todo_list) + if(auto_surgery.type_of_surgery == EXTERNAL_SURGERY) + switch(auto_surgery.surgery_procedure) if("brute") heal_brute = 1 if("burn") @@ -314,95 +313,95 @@ filtering = 1 if("blood") blood_transfer = 1 - surgery_todo_list -= A + surgery_todo_list -= auto_surgery var/currentsurgery = 1 while(length(surgery_todo_list) > 0) if(!surgery) break; sleep(-1) - var/datum/autodoc_surgery/S = surgery_todo_list[currentsurgery] + var/datum/autodoc_surgery/current_surgery = surgery_todo_list[currentsurgery] surgery_mod = 1 // might need tweaking - switch(S.type_of_surgery) + switch(current_surgery.type_of_surgery) if(ORGAN_SURGERY) - switch(S.surgery_procedure) - if("damage") + switch(current_surgery.surgery_procedure) + if("organdamage") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning organ restoration.") - if(S.unneeded) + if(current_surgery.unneeded) sleep(UNNEEDED_DELAY) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure has been deemed unnecessary.") - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue - open_incision(H,S.limb_ref) + open_incision(patient,current_surgery.limb_ref) - if(S.limb_ref.name != "groin") - open_encased(H,S.limb_ref) + if(current_surgery.limb_ref.name != "groin") + open_encased(patient,current_surgery.limb_ref) - if(!istype(S.organ_ref,/datum/internal_organ/brain)) + if(!istype(current_surgery.organ_ref,/datum/internal_organ/brain)) sleep(FIX_ORGAN_MAX_DURATION*surgery_mod) else - if(S.organ_ref.damage > BONECHIPS_MAX_DAMAGE) + if(current_surgery.organ_ref.damage > BONECHIPS_MAX_DAMAGE) sleep(FIXVEIN_MAX_DURATION*surgery_mod) sleep(REMOVE_OBJECT_MAX_DURATION*surgery_mod) if(!surgery) break - if(istype(S.organ_ref,/datum/internal_organ)) - S.organ_ref.rejuvenate() + if(istype(current_surgery.organ_ref,/datum/internal_organ)) + current_surgery.organ_ref.rejuvenate() else visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Organ is missing.") // close them - if(S.limb_ref.name != "groin") // TODO: fix brute damage before closing - close_encased(H,S.limb_ref) - close_incision(H,S.limb_ref) + if(current_surgery.limb_ref.name != "groin") // TODO: fix brute damage before closing + close_encased(patient,current_surgery.limb_ref) + close_incision(patient,current_surgery.limb_ref) if("eyes") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning corrective eye surgery.") - if(S.unneeded) + if(current_surgery.unneeded) sleep(UNNEEDED_DELAY) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure has been deemed unnecessary.") - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue - if(istype(S.organ_ref,/datum/internal_organ/eyes)) - var/datum/internal_organ/eyes/E = S.organ_ref + if(istype(current_surgery.organ_ref,/datum/internal_organ/eyes)) + var/datum/internal_organ/eyes/eye = current_surgery.organ_ref - if(E.eye_surgery_stage == 0) + if(eye.eye_surgery_stage == 0) sleep(SCALPEL_MAX_DURATION) if(!surgery) break - E.eye_surgery_stage = 1 - H.disabilities |= NEARSIGHTED // code\#define\mobs.dm + eye.eye_surgery_stage = 1 + patient.disabilities |= NEARSIGHTED // code\#define\mobs.dm - if(E.eye_surgery_stage == 1) + if(eye.eye_surgery_stage == 1) sleep(RETRACTOR_MAX_DURATION) if(!surgery) break - E.eye_surgery_stage = 2 + eye.eye_surgery_stage = 2 - if(E.eye_surgery_stage == 2) + if(eye.eye_surgery_stage == 2) sleep(HEMOSTAT_MAX_DURATION) if(!surgery) break - E.eye_surgery_stage = 3 + eye.eye_surgery_stage = 3 - if(E.eye_surgery_stage == 3) + if(eye.eye_surgery_stage == 3) sleep(CAUTERY_MAX_DURATION) if(!surgery) break - H.disabilities &= ~NEARSIGHTED - H.sdisabilities &= ~DISABILITY_BLIND - E.heal_damage(E.damage) - E.eye_surgery_stage = 0 + patient.disabilities &= ~NEARSIGHTED + patient.sdisabilities &= ~DISABILITY_BLIND + eye.heal_damage(eye.damage) + eye.eye_surgery_stage = 0 if("larva") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src]beeps: Removing unknown parasites.") if(!locate(/obj/item/alien_embryo) in occupant) sleep(UNNEEDED_DELAY) visible_message("[icon2html(src, viewers(src))] [src] speaks: Procedure has been deemed unnecessary.")// >:) - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue sleep(SCALPEL_MAX_DURATION + HEMOSTAT_MAX_DURATION + REMOVE_OBJECT_MAX_DURATION) var/obj/item/alien_embryo/alien_larva = locate() in occupant @@ -416,59 +415,59 @@ if(LIMB_SURGERY) - switch(S.surgery_procedure) + switch(current_surgery.surgery_procedure) if("internal") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning internal bleeding procedure.") - if(S.unneeded) + if(current_surgery.unneeded) sleep(UNNEEDED_DELAY) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure has been deemed unnecessary.") - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue - open_incision(H,S.limb_ref) - for(var/datum/wound/W in S.limb_ref.wounds) + open_incision(patient,current_surgery.limb_ref) + for(var/datum/wound/wound in current_surgery.limb_ref.wounds) if(!surgery) break - if(W.internal) + if(wound.internal) sleep(FIXVEIN_MIN_DURATION-30) - S.limb_ref.wounds -= W - S.limb_ref.remove_all_bleeding(FALSE, TRUE) - qdel(W) + current_surgery.limb_ref.wounds -= wound + current_surgery.limb_ref.remove_all_bleeding(FALSE, TRUE) + qdel(wound) if(!surgery) break - close_incision(H,S.limb_ref) + close_incision(patient,current_surgery.limb_ref) if("broken") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning broken bone procedure.") - if(S.unneeded) + if(current_surgery.unneeded) sleep(UNNEEDED_DELAY) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure has been deemed unnecessary.") - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue - open_incision(H,S.limb_ref) + open_incision(patient,current_surgery.limb_ref) sleep(BONEGEL_REPAIR_MAX_DURATION*surgery_mod+20) - if(S.limb_ref.brute_dam > 20) - sleep(((S.limb_ref.brute_dam - 20)/2)*surgery_mod) + if(current_surgery.limb_ref.brute_dam > 20) + sleep(((current_surgery.limb_ref.brute_dam - 20)/2)*surgery_mod) if(!surgery) break - S.limb_ref.heal_damage(S.limb_ref.brute_dam - 20) + current_surgery.limb_ref.heal_damage(current_surgery.limb_ref.brute_dam - 20) if(!surgery) break - if(S.limb_ref.status & LIMB_SPLINTED_INDESTRUCTIBLE) + if(current_surgery.limb_ref.status & LIMB_SPLINTED_INDESTRUCTIBLE) new /obj/item/stack/medical/splint/nano(loc, 1) - S.limb_ref.status &= ~(LIMB_SPLINTED|LIMB_SPLINTED_INDESTRUCTIBLE|LIMB_BROKEN) - S.limb_ref.perma_injury = 0 - H.pain.recalculate_pain() - close_incision(H,S.limb_ref) + current_surgery.limb_ref.status &= ~(LIMB_SPLINTED|LIMB_SPLINTED_INDESTRUCTIBLE|LIMB_BROKEN) + current_surgery.limb_ref.perma_injury = 0 + patient.pain.recalculate_pain() + close_incision(patient,current_surgery.limb_ref) if("missing") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning limb replacement.") - if(S.unneeded) + if(current_surgery.unneeded) sleep(UNNEEDED_DELAY) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure has been deemed unnecessary.") - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue sleep(SCALPEL_MAX_DURATION*surgery_mod) @@ -478,20 +477,20 @@ if(stored_metal < LIMB_METAL_AMOUNT) visible_message("[icon2html(src, viewers(src))] \The [src] croaks: Metal reserves depleted.") playsound(src.loc, 'sound/machines/buzz-two.ogg', 15, 1) - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue // next surgery stored_metal -= LIMB_METAL_AMOUNT - if(S.limb_ref.parent.status & LIMB_DESTROYED) // there's nothing to attach to + if(current_surgery.limb_ref.parent.status & LIMB_DESTROYED) // there's nothing to attach to visible_message("[icon2html(src, viewers(src))] \The [src] croaks: Limb attachment failed.") playsound(src.loc, 'sound/machines/buzz-two.ogg', 15, 1) - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue if(!surgery) break - S.limb_ref.setAmputatedTree() + current_surgery.limb_ref.setAmputatedTree() var/spillover = LIMB_PRINTING_TIME - (CAUTERY_MAX_DURATION+RETRACTOR_MAX_DURATION+SCALPEL_MAX_DURATION) if(spillover > 0) @@ -500,48 +499,48 @@ sleep(IMPLANT_MAX_DURATION*surgery_mod) if(!surgery) break - S.limb_ref.robotize() - H.update_body() - H.updatehealth() - H.UpdateDamageIcon() + current_surgery.limb_ref.robotize() + patient.update_body() + patient.updatehealth() + patient.UpdateDamageIcon() if("shrapnel") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning shrapnel removal."); - if(S.unneeded) + if(current_surgery.unneeded) sleep(UNNEEDED_DELAY) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure has been deemed unnecessary."); - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue - open_incision(H,S.limb_ref) - if(S.limb_ref.name == "chest" || S.limb_ref.name == "head") - open_encased(H,S.limb_ref) - if(length(S.limb_ref.implants)) - for(var/obj/item/I in S.limb_ref.implants) + open_incision(patient,current_surgery.limb_ref) + if(current_surgery.limb_ref.name == "chest" || current_surgery.limb_ref.name == "head") + open_encased(patient,current_surgery.limb_ref) + if(length(current_surgery.limb_ref.implants)) + for(var/obj/item/implant in current_surgery.limb_ref.implants) if(!surgery) break - if(!is_type_in_list(I,known_implants)) + if(!is_type_in_list(implant,known_implants)) sleep(REMOVE_OBJECT_MAX_DURATION*surgery_mod) - S.limb_ref.implants -= I - H.embedded_items -= I - qdel(I) - if(S.limb_ref.name == "chest" || S.limb_ref.name == "head") - close_encased(H,S.limb_ref) + current_surgery.limb_ref.implants -= implant + patient.embedded_items -= implant + qdel(implant) + if(current_surgery.limb_ref.name == "chest" || current_surgery.limb_ref.name == "head") + close_encased(patient,current_surgery.limb_ref) if(!surgery) break - close_incision(H,S.limb_ref) + close_incision(patient,current_surgery.limb_ref) if("open") if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src]croaks: Closing surgical incision."); - close_encased(H,S.limb_ref) - close_incision(H,S.limb_ref) + close_encased(patient,current_surgery.limb_ref) + close_incision(patient,current_surgery.limb_ref) if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure complete."); - surgery_todo_list -= S + surgery_todo_list -= current_surgery continue while(heal_brute||heal_burn||heal_toxin||filtering||blood_transfer) @@ -551,43 +550,43 @@ if(prob(5)) visible_message("[icon2html(src, viewers(src))] \The [src] beeps as it continues working."); - H.pain.recalculate_pain() + patient.pain.recalculate_pain() visible_message("[icon2html(src, viewers(src))] \The [src] clicks and opens up having finished the requested operations.") - surgery = 0 + SStgui.close_uis(connected) go_out() -/obj/structure/machinery/medical_pod/autodoc/proc/open_incision(mob/living/carbon/human/target, obj/limb/L) - if(target && L && target.incision_depths[L.name] == SURGERY_DEPTH_SURFACE) +/obj/structure/machinery/medical_pod/autodoc/proc/open_incision(mob/living/carbon/human/target, obj/limb/limb) + if(target && limb && target.incision_depths[limb.name] == SURGERY_DEPTH_SURFACE) sleep(INCISION_MANAGER_MAX_DURATION*surgery_mod) if(!surgery) return - L.createwound(CUT, 1) - target.incision_depths[L.name] = SURGERY_DEPTH_SHALLOW //Can immediately proceed to other surgery steps + limb.createwound(CUT, 1) + target.incision_depths[limb.name] = SURGERY_DEPTH_SHALLOW //Can immediately proceed to other surgery steps target.updatehealth() -/obj/structure/machinery/medical_pod/autodoc/proc/close_incision(mob/living/carbon/human/target, obj/limb/L) - if(target && L && target.incision_depths[L.name] == SURGERY_DEPTH_SHALLOW) +/obj/structure/machinery/medical_pod/autodoc/proc/close_incision(mob/living/carbon/human/target, obj/limb/limb) + if(target && limb && target.incision_depths[limb.name] == SURGERY_DEPTH_SHALLOW) sleep(CAUTERY_MAX_DURATION*surgery_mod) if(!surgery) return - L.reset_limb_surgeries() - L.remove_all_bleeding(TRUE) + limb.reset_limb_surgeries() + limb.remove_all_bleeding(TRUE) target.updatehealth() -/obj/structure/machinery/medical_pod/autodoc/proc/open_encased(mob/living/carbon/human/target, obj/limb/L) - if(target && L && target.incision_depths[L.name] == SURGERY_DEPTH_SHALLOW) +/obj/structure/machinery/medical_pod/autodoc/proc/open_encased(mob/living/carbon/human/target, obj/limb/limb) + if(target && limb && target.incision_depths[limb.name] == SURGERY_DEPTH_SHALLOW) sleep((CIRCULAR_SAW_MAX_DURATION*surgery_mod) + (RETRACTOR_MAX_DURATION*surgery_mod)) if(!surgery) return - target.incision_depths[L.name] = SURGERY_DEPTH_DEEP + target.incision_depths[limb.name] = SURGERY_DEPTH_DEEP -/obj/structure/machinery/medical_pod/autodoc/proc/close_encased(mob/living/carbon/human/target, obj/limb/L) - if(target && L && target.incision_depths[L.name] == SURGERY_DEPTH_DEEP) +/obj/structure/machinery/medical_pod/autodoc/proc/close_encased(mob/living/carbon/human/target, obj/limb/limb) + if(target && limb && target.incision_depths[limb.name] == SURGERY_DEPTH_DEEP) sleep((RETRACTOR_MAX_DURATION*surgery_mod) + (BONEGEL_REPAIR_MAX_DURATION*surgery_mod)) if(!surgery) return - target.incision_depths[L.name] = SURGERY_DEPTH_SHALLOW + target.incision_depths[limb.name] = SURGERY_DEPTH_SHALLOW #ifdef OBJECTS_PROXY_SPEECH // Transfers speech to occupant @@ -602,7 +601,7 @@ //Auto Doc console that links up to it. /obj/structure/machinery/autodoc_console - name = "\improper autodoc medical system control console" + name = "autodoc medical system control console" desc = "The control interface used to operate the adjoining autodoc. Requires training to use properly." icon = 'icons/obj/structures/machinery/cryogenics.dmi' icon_state = "sleeperconsole" @@ -669,270 +668,209 @@ /obj/structure/machinery/autodoc_console/attack_hand(mob/living/user) if(..()) return - var/dat = "" + if(!connected || (connected.inoperable())) - dat += "This console is not connected to a Auto-Doc or the Auto-Doc is non-functional." to_chat(user, "This console seems to be powered down.") - else - if(!skillcheck(user, SKILL_SURGERY, SKILL_SURGERY_NOVICE)) - to_chat(user, SPAN_WARNING("You have no idea how to use this.")) - return - var/mob/living/occupant = connected.occupant - dat += "Overall Status:
" - if(occupant) - var/t1 - switch(occupant.stat) - if(0) - t1 = "conscious" - if(1) - t1 = "unconscious" - if(2) - t1 = "dead" - var/operating - switch(connected.surgery) - if(0) - operating = "Auto-Doc: STANDING BY" - if(1) - operating = "Auto-Doc: IN SURGERY: DO NOT MANUALLY EJECT" - var/damageOxy = occupant.getOxyLoss() > 50 ? "[occupant.getOxyLoss()]" : occupant.getOxyLoss() - var/damageTox = occupant.getToxLoss() > 50 ? "[occupant.getToxLoss()]" : occupant.getToxLoss() - var/damageFire = occupant.getFireLoss() > 50 ? "[occupant.getFireLoss()]" : occupant.getFireLoss() - var/damageBrute = occupant.getBruteLoss() > 50 ? "[occupant.getBruteLoss()]" : occupant.getBruteLoss() - dat += "Name: [occupant.name]
" - dat += "Damage: [SET_CLASS("[damageOxy]", INTERFACE_BLUE)] - [SET_CLASS("[damageTox]", INTERFACE_GREEN)] - [SET_CLASS("[damageFire]", INTERFACE_ORANGE)] - [SET_CLASS("[damageBrute]", INTERFACE_RED)]
" - dat += "The patient is [t1].
" - dat += "[operating]
" - dat += "Eject Patient" - dat += "
Surgery Queue:
" - - var/list/surgeryqueue = list() - var/datum/data/record/N = null - var/occupant_ref = WEAKREF(connected.occupant) - for(var/datum/data/record/R as anything in GLOB.data_core.medical) - if (R.fields["ref"] == occupant_ref) - N = R - if(isnull(N)) - N = create_medical_record(connected.occupant) - - if(!isnull(N.fields["autodoc_manual"])) - for(var/datum/autodoc_surgery/A in N.fields["autodoc_manual"]) - switch(A.type_of_surgery) - if(EXTERNAL_SURGERY) - switch(A.surgery_procedure) - if("brute") - surgeryqueue["brute"] = 1 - dat += "Brute Damage Treatment" - if("burn") - surgeryqueue["burn"] = 1 - dat += "Burn Damage Treatment" - if("toxin") - surgeryqueue["toxin"] = 1 - dat += "Bloodstream Toxin Removal" - if("dialysis") - surgeryqueue["dialysis"] = 1 - dat += "Dialysis" - if("blood") - surgeryqueue["blood"] = 1 - dat += "Emergency Blood Transfusion" - if(ORGAN_SURGERY) - switch(A.surgery_procedure) - if("damage") - surgeryqueue["organdamage"] = 1 - dat += "Organ Damage Treatment" - if("eyes") - surgeryqueue["eyes"] = 1 - dat += "Corrective Eye Surgery" - if("larva") - surgeryqueue["larva"] = 1 - dat += "Experimental Parasite Surgery" - if(LIMB_SURGERY) - switch(A.surgery_procedure) - if("internal") - surgeryqueue["internal"] = 1 - dat += "Internal Bleeding Surgery" - if("broken") - surgeryqueue["broken"] = 1 - dat += "Bone Repair Treatment" - if("missing") - surgeryqueue["missing"] = 1 - dat += "Limb Replacement Surgery" - if("shrapnel") - surgeryqueue["shrapnel"] = 1 - dat += "Shrapnel Removal Surgery" - if("open") - surgeryqueue["open"] = 1 - dat += "Close Open Incisions" - - dat += "
" - - dat += "
Begin Surgery - Refresh Menu - Clear Queue
" - if(!connected.surgery) - dat += "Trauma Surgeries" - dat += "
" - if(isnull(surgeryqueue["brute"])) - dat += "Brute Damage Treatment
" - if(isnull(surgeryqueue["burn"])) - dat += "Burn Damage Treatment
" - if(isnull(surgeryqueue["open"])) - dat += "Close Open Incisions
" - if(isnull(surgeryqueue["shrapnel"])) - dat += "Shrapnel Removal Surgery
" - dat += "Hematology Treatments" - dat += "
" - if(isnull(surgeryqueue["blood"])) - dat += "Emergency Blood Transfusion
" - if(isnull(surgeryqueue["dialysis"])) - dat += "Dialysis
" - if(isnull(surgeryqueue["toxin"])) - dat += "Bloodstream Toxin Removal
" - dat += "
" - if(length(upgrades)) - dat += "Orthopedic Surgeries" - for(var/iter in upgrades) - switch(iter) - if(RESEARCH_UPGRADE_TIER_2) - if(isnull(surgeryqueue["broken"])) - dat += "Broken Bone Surgery
" - if(RESEARCH_UPGRADE_TIER_1) - if(isnull(surgeryqueue["internal"])) - dat += "Internal Bleeding Surgery
" - if(RESEARCH_UPGRADE_TIER_3) - if(isnull(surgeryqueue["organdamage"])) - dat += "Organ Damage Treatment
" - if(RESEARCH_UPGRADE_TIER_4) - if(isnull(surgeryqueue["larva"])) - dat += "Experimental Parasite Exctraction
" - else - dat += "The autodoc is empty." - dat += text("Close", user) - show_browser(user, dat, "Auto-Doc Medical System", "sleeper", width = 300, height = 400) - onclose(user, "sleeper") + return + + if(connected.skilllock && !skillcheck(user, SKILL_SURGERY, connected.skilllock)) + to_chat(user, SPAN_WARNING("The interface looks too complicated for you. You're going to need someone trained in the usage of \the [connected.name]!")) + return + + tgui_interact(user) -/obj/structure/machinery/autodoc_console/Topic(href, href_list) +/obj/structure/machinery/autodoc_console/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Autodoc", "Autodoc") + ui.open() + +/obj/structure/machinery/autodoc_console/ui_state(mob/user) + return GLOB.not_incapacitated_and_adjacent_state + +/obj/structure/machinery/autodoc_console/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(inoperable()) + return UI_CLOSE + +/obj/structure/machinery/autodoc_console/ui_data(mob/user) + . = ..() + + if(!connected) + .["connected"] = null + return . + + .["connected"] = connected + .["connected_operable"] = !connected.inoperable() + + var/mob/living/occupant = connected.occupant + + .["hasOccupant"] = occupant ? 1 : 0 + var/occupantData[0] + if(occupant) + occupantData["name"] = occupant.name + occupantData["stat"] = occupant.stat + occupantData["health"] = occupant.health + occupantData["maxHealth"] = occupant.maxHealth + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD + occupantData["bruteLoss"] = occupant.getBruteLoss() + occupantData["oxyLoss"] = occupant.getOxyLoss() + occupantData["toxLoss"] = occupant.getToxLoss() + occupantData["fireLoss"] = occupant.getFireLoss() + occupantData["hasBlood"] = 0 + occupantData["totalReagents"] = occupant.reagents.total_volume + + // I'm not sure WHY you'd want to put a simple_animal in a sleeper, but precedent is precedent + if(ishuman(occupant)) + var/mob/living/carbon/human/human_occupant = occupant + if(!(NO_BLOOD in human_occupant.species.flags)) + occupantData["pulse"] = human_occupant.get_pulse(GETPULSE_TOOL) + occupantData["hasBlood"] = 1 + occupantData["bloodLevel"] = floor(occupant.blood_volume) + occupantData["bloodMax"] = occupant.max_blood + occupantData["bloodPercent"] = round(100*(occupant.blood_volume/occupant.max_blood), 0.01) + + .["occupant"] = occupantData + .["surgery"] = connected.surgery + + var/list/selected = list() + + selected["brute"] = 0 + selected["burn"] = 0 + selected["open"] = 0 + selected["shrapnel"] = 0 + selected["toxin"] = 0 + selected["dialysis"] = 0 + selected["blood"] = 0 + + for(var/iter in upgrades) + switch(iter) + if(RESEARCH_UPGRADE_TIER_1) + selected["internal"] = 0 + if(RESEARCH_UPGRADE_TIER_2) + selected["broken"] = 0 + if(RESEARCH_UPGRADE_TIER_3) + selected["organdamage"] = 0 + if(RESEARCH_UPGRADE_TIER_4) + selected["larva"] = 0 + + for(var/datum/autodoc_surgery/item in connected.surgery_todo_list) + var/type = item.surgery_procedure + selected[type] = 1 + + .["surgeries"] = selected + + .["filtering"] = connected.filtering + .["blood_transfer"] = connected.blood_transfer + .["heal_brute"] = connected.heal_brute + .["heal_burn"] = connected.heal_burn + .["heal_toxin"] = connected.heal_toxin + + return . + +/obj/structure/machinery/autodoc_console/ui_act(action, params) if(..()) return - if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf)))) - usr.set_interaction(src) - - if(connected.occupant && ishuman(connected.occupant)) - // manual surgery handling - var/datum/data/record/N = null - var/occupant_ref = WEAKREF(connected.occupant) - for(var/datum/data/record/R as anything in GLOB.data_core.medical) - if (R.fields["ref"] == occupant_ref) - N = R - if(isnull(N)) - N = create_medical_record(connected.occupant) - - var/needed = 0 // this is to stop someone just choosing everything - if(href_list["brute"]) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,EXTERNAL_SURGERY,"brute") - updateUsrDialog() - if(href_list["burn"]) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,EXTERNAL_SURGERY,"burn") - updateUsrDialog() - if(href_list["toxin"]) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,EXTERNAL_SURGERY,"toxin") - updateUsrDialog() - if(href_list["dialysis"]) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,EXTERNAL_SURGERY,"dialysis") - updateUsrDialog() - if(href_list["blood"]) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,EXTERNAL_SURGERY,"blood") - updateUsrDialog() - if(href_list["eyes"]) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,ORGAN_SURGERY,"eyes",0,connected.occupant.internal_organs_by_name["eyes"]) - updateUsrDialog() - if(href_list["organdamage"]) - for(var/obj/limb/L in connected.occupant.limbs) - if(L) - for(var/datum/internal_organ/I in L.internal_organs) - if(I.robotic == ORGAN_ASSISTED||I.robotic == ORGAN_ROBOT) + if(usr == connected.occupant) + return + if(stat & (NOPOWER|BROKEN)) + return + + add_fingerprint(usr) + + . = TRUE + if(connected.occupant && ishuman(connected.occupant)) + var/needed = 0 // this is to stop someone just choosing everything + switch(action) + if("brute") + connected.surgery_todo_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"brute") + if("burn") + connected.surgery_todo_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"burn") + if("toxin") + connected.surgery_todo_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"toxin") + if("dialysis") + connected.surgery_todo_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"dialysis") + if("blood") + connected.surgery_todo_list += create_autodoc_surgery(null,EXTERNAL_SURGERY,"blood") + if("eyes") + connected.surgery_todo_list += create_autodoc_surgery(null,ORGAN_SURGERY,"eyes",0,connected.occupant.internal_organs_by_name["eyes"]) + if("organdamage") + for(var/obj/limb/limb in connected.occupant.limbs) + if(limb) + for(var/datum/internal_organ/organ in limb.internal_organs) + if(organ.robotic == ORGAN_ASSISTED || organ.robotic == ORGAN_ROBOT) // we can't deal with these continue - if(I.damage > 0) - N.fields["autodoc_manual"] += create_autodoc_surgery(L,ORGAN_SURGERY,"damage",0,I) + if(organ.damage > 0) + connected.surgery_todo_list += create_autodoc_surgery(limb,ORGAN_SURGERY,"organdamage",0,organ) needed++ if(!needed) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,ORGAN_SURGERY,"damage",1) - updateUsrDialog() - if(href_list["larva"]) - N.fields["autodoc_manual"] += create_autodoc_surgery("chest",ORGAN_SURGERY,"larva",0) - updateUsrDialog() - if(href_list["internal"]) - for(var/obj/limb/L in connected.occupant.limbs) - if(L) - for(var/datum/wound/W in L.wounds) - if(W.internal) - N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"internal") + connected.surgery_todo_list += create_autodoc_surgery(null,ORGAN_SURGERY,"organdamage",1) + if("larva") + connected.surgery_todo_list += create_autodoc_surgery("chest",ORGAN_SURGERY,"larva",0) + if("internal") + for(var/obj/limb/limb in connected.occupant.limbs) + if(limb) + for(var/datum/wound/wound in limb.wounds) + if(wound.internal) + connected.surgery_todo_list += create_autodoc_surgery(limb,LIMB_SURGERY,"internal") needed++ break if(!needed) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,LIMB_SURGERY,"internal",1) - updateUsrDialog() - - if(href_list["broken"]) - for(var/obj/limb/L in connected.occupant.limbs) - if(L) - if(L.status & LIMB_BROKEN) - N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"broken") + connected.surgery_todo_list += create_autodoc_surgery(null,LIMB_SURGERY,"internal",1) + if("broken") + for(var/obj/limb/limb in connected.occupant.limbs) + if(limb) + if(limb.status & LIMB_BROKEN) + connected.surgery_todo_list += create_autodoc_surgery(limb,LIMB_SURGERY,"broken") needed++ if(!needed) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,LIMB_SURGERY,"broken",1) - updateUsrDialog() - - if(href_list["missing"]) - for(var/obj/limb/L in connected.occupant.limbs) - if(L) - if(L.status & LIMB_DESTROYED) - if(!(L.parent.status & LIMB_DESTROYED) && L.name != "head") - N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"missing") + connected.surgery_todo_list += create_autodoc_surgery(null,LIMB_SURGERY,"broken",1) + if("missing") + for(var/obj/limb/limb in connected.occupant.limbs) + if(limb) + if(limb.status & LIMB_DESTROYED) + if(!(limb.parent.status & LIMB_DESTROYED) && limb.name != "head") + connected.surgery_todo_list += create_autodoc_surgery(limb,LIMB_SURGERY,"missing") needed++ if(!needed) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,LIMB_SURGERY,"missing",1) - updateUsrDialog() - - if(href_list["shrapnel"]) + connected.surgery_todo_list += create_autodoc_surgery(null,LIMB_SURGERY,"missing",1) + if("shrapnel") var/known_implants = list(/obj/item/implant/chem, /obj/item/implant/death_alarm, /obj/item/implant/loyalty, /obj/item/implant/tracking, /obj/item/implant/neurostim) - for(var/obj/limb/L in connected.occupant.limbs) - if(L) - if(length(L.implants)) - for(var/I in L.implants) - if(!is_type_in_list(I,known_implants)) - N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"shrapnel") + for(var/obj/limb/limb in connected.occupant.limbs) + if(limb) + if(length(limb.implants)) + for(var/implant in limb.implants) + if(!is_type_in_list(implant, known_implants)) + connected.surgery_todo_list += create_autodoc_surgery(limb,LIMB_SURGERY,"shrapnel") needed++ if(!needed) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,LIMB_SURGERY,"shrapnel",1) - updateUsrDialog() - - if(href_list["open"]) - for(var/obj/limb/L in connected.occupant.limbs) - if(L) - if(connected.occupant.incision_depths[L.name] != SURGERY_DEPTH_SURFACE) - N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"open") + connected.surgery_todo_list += create_autodoc_surgery(null,LIMB_SURGERY,"shrapnel",1) + if("open") + for(var/obj/limb/limb in connected.occupant.limbs) + if(limb) + if(connected.occupant.incision_depths[limb.name] != SURGERY_DEPTH_SURFACE) + connected.surgery_todo_list += create_autodoc_surgery(limb,LIMB_SURGERY,"open") needed++ - if(href_list["open"]) - N.fields["autodoc_manual"] += create_autodoc_surgery(null,LIMB_SURGERY,"open",1) - updateUsrDialog() - + if(!needed) + connected.surgery_todo_list += create_autodoc_surgery(null,LIMB_SURGERY,"open",1) // The rest - if(href_list["clear"]) - N.fields["autodoc_manual"] = list() - updateUsrDialog() - if(href_list["refresh"]) - updateUsrDialog() - if(href_list["surgery"]) - if(connected.occupant) - connected.surgery_op(src.connected.occupant) - updateUsrDialog() - if(href_list["ejectify"]) - connected.eject() - updateUsrDialog() - add_fingerprint(usr) + if("clear") + connected.surgery_todo_list = list() + if("surgery") + if(connected.occupant) + connected.surgery_op(src.connected.occupant) + if("ejectify") + connected.eject() + else + return FALSE + else + return FALSE /obj/structure/machinery/autodoc_console/yautja name = "medical pod console" icon = 'icons/obj/structures/machinery/yautja_machines.dmi' + upgrades = list(1=1, 2=2, 3=3, 4=4) /obj/structure/machinery/medical_pod/autodoc/unskilled name = "advanced autodoc emergency medical system" @@ -940,6 +878,6 @@ skilllock = null /obj/structure/machinery/medical_pod/autodoc/yautja - name = "alien automated medical pod" + name = "automated medical pod" desc = "An emergency surgical alien device designed to perform life-saving treatments and basic surgeries on patients automatically, without the need of a surgeon." icon = 'icons/obj/structures/machinery/yautja_machines.dmi' diff --git a/code/game/machinery/medical_pod/sleeper.dm b/code/game/machinery/medical_pod/sleeper.dm index 59134ca67788..945a72af7054 100644 --- a/code/game/machinery/medical_pod/sleeper.dm +++ b/code/game/machinery/medical_pod/sleeper.dm @@ -428,3 +428,7 @@ /obj/structure/machinery/medical_pod/sleeper/yautja icon = 'icons/obj/structures/machinery/yautja_machines.dmi' + available_chemicals = list("thwei", "inaprovaline", "oxycodone", "anti_toxin", "dexalinp", "tricordrazine", "alkysine", "imidazoline") + emergency_chems = list("thwei", "inaprovaline", "oxycodone", "anti_toxin", "dexalinp", "tricordrazine", "bicaridine", "kelotane", "meralyne", "dermaline", "alkysine", "imidazoline") + reagent_removed_per_second = AMOUNT_PER_TIME(8, 1 SECONDS) + upgraded = TRUE diff --git a/code/game/machinery/nuclearbomb.dm b/code/game/machinery/nuclearbomb.dm index e392c5c1051c..273d4eeab581 100644 --- a/code/game/machinery/nuclearbomb.dm +++ b/code/game/machinery/nuclearbomb.dm @@ -1,7 +1,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) /obj/structure/machinery/nuclearbomb - name = "\improper Nuclear Fission Explosive" - desc = "Nuke the entire site from orbit, it's the only way to be sure. Too bad we don't have any orbital nukes." + name = "\improper 'Blockbuster' Large Atomic Fission Demolition Device (LAFDEDE)" + desc = "Mainly intended as a demolition charge, this device, also called 'W-135', is primarily used by USCM space vessels that don't have the equipment to remotely nuke planets from orbit. According to the Nuclear Regulatory Commission of the United Americas, this device have an estimated yield of 15 to 30 kilotonnes of TNT, enough to flatten everything that moves in a 6.30 kilometer, or 3.9 mile range. It also weighs 422 kilograms, or 930 pounds." icon = 'icons/obj/structures/machinery/nuclearbomb.dmi' icon_state = "nuke" density = TRUE @@ -342,11 +342,11 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) announcement_helper("WARNING.\n\nDETONATION IN [floor(timeleft/10)] SECONDS.", "HQ Intel Division", humans_other, 'sound/misc/notice1.ogg') //preds part var/t_left = duration2text_sec(floor(rand(timeleft - timeleft / 10, timeleft + timeleft / 10))) - yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!\n\nYou have approximately [t_left] seconds to abandon the hunting grounds before activation of the human purification device.")) + elder_overseer_message("You have approximately [t_left] seconds to abandon the hunting grounds before activation of the human purification device.") //xenos part var/warning if(timer_warning & NUKE_SHOW_TIMER_HALF) - warning = "A shiver goes down our carapace as we feel the approaching end... the hive killer is halfway through its preparation cycle!" + warning = "A shiver goes down our carapace as we feel the approaching end... the hive killer is halfway through the detonation countdown!" else if(timer_warning & NUKE_SHOW_TIMER_MINUTE) warning = "Every sense in our form is screaming... the hive killer is almost ready to trigger!" else @@ -364,7 +364,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE ORDNANCE ACTIVATED.\n\nDETONATION IN [floor(timeleft/10)] SECONDS.", "[MAIN_AI_SYSTEM] Nuclear Tracker", humans_uscm, 'sound/misc/notice1.ogg') announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE ORDNANCE ACTIVATED.\n\nDETONATION IN [floor(timeleft/10)] SECONDS.", "HQ Nuclear Tracker", humans_other, 'sound/misc/notice1.ogg') var/t_left = duration2text_sec(floor(rand(timeleft - timeleft / 10, timeleft + timeleft / 10))) - yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!
A human purification device has been detected. You have approximately [t_left] to abandon the hunting grounds before it activates.")) + elder_overseer_message(SPAN_YAUTJABOLDBIG("A human purification device has been detected. You have approximately [t_left] to abandon the hunting grounds before it activates.")) for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] if(!length(hive.totalXenos)) @@ -373,7 +373,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) else announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE ORDNANCE DEACTIVATED.", "[MAIN_AI_SYSTEM] Nuclear Tracker", humans_uscm, 'sound/misc/notice1.ogg') announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE ORDNANCE DEACTIVATED.", "HQ Intel Division", humans_other, 'sound/misc/notice1.ogg') - yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!
The human purification device's signature has disappeared.")) + elder_overseer_message(SPAN_YAUTJABOLDBIG("The human purification device's signature has disappeared.")) for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] if(!length(hive.totalXenos)) @@ -610,7 +610,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) announcement_helper("ALERT.\n\nDECRYPTION COMPLETE.\n\nNUCLEAR EXPLOSIVE ORDNANCE ACTIVATED.\n\nDETONATION IN [floor(timeleft/10)] SECONDS.", "[MAIN_AI_SYSTEM] Nuclear Tracker", humans_uscm, 'sound/misc/notice1.ogg') announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE ORDNANCE ACTIVATED.\n\nDETONATION IN [floor(timeleft/10)] SECONDS.", "HQ Nuclear Tracker", humans_other, 'sound/misc/notice1.ogg') var/t_left = duration2text_sec(floor(rand(timeleft - timeleft / 10, timeleft + timeleft / 10))) - yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!
The human purification device has been activated. You have approximately [t_left] to abandon the hunting grounds before it activates.")) + elder_overseer_message("The human purification device has been activated. You have approximately [t_left] to abandon the hunting grounds before it activates.") var/datum/hive_status/hive for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] @@ -623,7 +623,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) //preds part var/time_left = duration2text_sec(floor(rand(decryption_time - decryption_time / 10, decryption_time + decryption_time / 10))) - yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!\n\nYou have approximately [time_left] seconds to abandon the hunting grounds before the human purification device is able to be activated.")) + elder_overseer_message("You have approximately [time_left] seconds to abandon the hunting grounds before the human purification device is able to be activated.") //xenos part var/warning = "We are almost out of time, STOP THEM." @@ -643,7 +643,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE ORDNANCE DECRYPTION STARTED.\n\nDECRYPTION IN [floor(decryption_time/10)] SECONDS.", "[MAIN_AI_SYSTEM] Nuclear Tracker", humans_uscm, 'sound/misc/notice1.ogg') announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE ORDNANCE DECRYPTION STARTED.\n\nDECRYPTION IN [floor(decryption_time/10)] SECONDS.", "HQ Nuclear Tracker", humans_other, 'sound/misc/notice1.ogg') var/time_left = duration2text_sec(floor(rand(decryption_time - decryption_time / 10, decryption_time + decryption_time / 10))) - yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!
A human purification device has been detected. You have approximately [time_left] before it finishes its initial phase.")) + elder_overseer_message("A human purification device has been detected. You have approximately [time_left] before it finishes its initial phase.") for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] if(!length(hive.totalXenos)) @@ -653,7 +653,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE DECRYPTION HALTED.\n\nUnexpected decryption shutdown has led to data loss.", "[MAIN_AI_SYSTEM] Nuclear Tracker", humans_uscm, 'sound/misc/notice1.ogg') announcement_helper("ALERT.\n\nNUCLEAR EXPLOSIVE DECRYPTION HALTED.", "HQ Intel Division", humans_other, 'sound/misc/notice1.ogg') - yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!
The human purification device's signature has disappeared.")) + elder_overseer_message("WARNING!
The human purification device's signature has disappeared.") for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] if(!length(hive.totalXenos)) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index f1fd570a3cfd..d1b4b7b242a3 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -278,7 +278,7 @@ Buildable meters /obj/item/pipe/pickup(mob/user, silent) var/old_dir = dir - ..() + . = ..() setDir(old_dir) // Retain old dir since these rotate in hand /obj/item/pipe/equipped(mob/user, slot, silent) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index d0d01fdda85c..8aa22ebfc321 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -149,11 +149,11 @@ Nah */ //Allow you to drag-drop disposal pipes into it -/obj/structure/machinery/pipedispenser/disposal/MouseDrop_T(obj/structure/disposalconstruct/pipe as obj, mob/usr as mob) - if(usr.is_mob_incapacitated()) +/obj/structure/machinery/pipedispenser/disposal/MouseDrop_T(obj/structure/disposalconstruct/pipe as obj, mob/user as mob) + if(user.is_mob_incapacitated()) return - if (!istype(pipe) || get_dist(usr, src) > 1 || get_dist(src,pipe) > 1 ) + if (!istype(pipe) || get_dist(user, src) > 1 || get_dist(src,pipe) > 1 ) return if (pipe.anchored) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index b62f8a1444b4..86f122c5c5f0 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -1,6 +1,6 @@ /obj/structure/machinery/recharge_station name = "synthetic maintenance station" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures/machinery/synth_charger.dmi' icon_state = "borgcharger0" desc = "A Synthetic Maintenance Station designed to recharge, repair and maintain various sizes of artificial people. Simply place the synthetic or android in need of repair in here and they will be fixed up in no time!" density = TRUE @@ -141,17 +141,17 @@ overlays.Cut() switch(floor(chargepercentage())) if(1 to 20) - overlays += image('icons/obj/objects.dmi', "statn_c0") + overlays += image(icon, "statn_c0") if(21 to 40) - overlays += image('icons/obj/objects.dmi', "statn_c20") + overlays += image(icon, "statn_c20") if(41 to 60) - overlays += image('icons/obj/objects.dmi', "statn_c40") + overlays += image(icon, "statn_c40") if(61 to 80) - overlays += image('icons/obj/objects.dmi', "statn_c60") + overlays += image(icon, "statn_c60") if(81 to 98) - overlays += image('icons/obj/objects.dmi', "statn_c80") + overlays += image(icon, "statn_c80") if(99 to 110) - overlays += image('icons/obj/objects.dmi', "statn_c100") + overlays += image(icon, "statn_c100") /obj/structure/machinery/recharge_station/proc/process_occupant() if(src.occupant) @@ -257,10 +257,10 @@ //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO return if (!issynth(usr)) - to_chat(usr, SPAN_NOTICE(" Only non-organics may enter the recharge and repair station!")) + to_chat(usr, SPAN_NOTICE(" Only non-organics may enter the [name]!")) return if (src.occupant) - to_chat(usr, SPAN_NOTICE(" The cell is already occupied!")) + to_chat(usr, SPAN_NOTICE(" The [name] is already occupied!")) return move_mob_inside(usr) return @@ -279,11 +279,11 @@ to_chat(user, SPAN_NOTICE("The [name] is already occupied!")) return - visible_message(SPAN_NOTICE("[user] starts putting [G.grabbed_thing] into the sleeper."), null, null, 3) + visible_message(SPAN_NOTICE("[user] starts putting [G.grabbed_thing] into the [name]."), null, null, 3) if(do_after(user, 20, INTERRUPT_ALL, BUSY_ICON_GENERIC)) if(occupant) - to_chat(user, SPAN_NOTICE("The sleeper is already occupied!")) + to_chat(user, SPAN_NOTICE("The [name] is already occupied!")) return if(!G || !G.grabbed_thing) return diff --git a/code/game/machinery/sentry_holder.dm b/code/game/machinery/sentry_holder.dm index 7dfb71acc717..ae989bb61710 100644 --- a/code/game/machinery/sentry_holder.dm +++ b/code/game/machinery/sentry_holder.dm @@ -127,6 +127,7 @@ turret_path = /obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini /obj/structure/machinery/sentry_holder/almayer/mini/aicore + turret_path = /obj/structure/machinery/defenses/sentry/premade/deployable/almayer/mini/ares /obj/structure/machinery/sentry_holder/almayer/mini/aicore/Initialize() . = ..() diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index ae4010a3c050..10974008cd35 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -190,7 +190,7 @@ continue // --- Can understand the speech --- - if (!M || R.say_understands(M)) + if (!M || R.say_understands(M, speaking)) // - Not human or wearing a voice mask - if (!M || !ishuman(M) || vmask) heard_masked += R @@ -246,7 +246,10 @@ /* --- Process all the mobs that heard the voice normally (did not understand) --- */ if (length(heard_voice)) for (var/mob/R in heard_voice) - R.hear_radio(message,verbage, speaking, part_a, part_b, M,0, vname, 0) + if(R.faction == M.faction) + R.hear_radio(message, verbage, speaking, part_a, part_b, M, 0, realname, volume) + else + R.hear_radio(message, verbage, speaking, part_a, part_b, M, 0, vname, 0) /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ // Displays garbled message (ie "f*c* **u, **i*er!") diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index a96c44e3de55..30e618925afb 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -441,7 +441,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) id = "Receiver B" network = "tcommsat" autolinkers = list("receiverB") // link to relay - freq_listening = list(COMM_FREQ, ENG_FREQ, SEC_FREQ, MED_FREQ, REQ_FREQ, SENTRY_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ) + freq_listening = list(COMM_FREQ, ENG_FREQ, SEC_FREQ, MED_FREQ, REQ_FREQ, SENTRY_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, YAUT_OVR_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ) //Common and other radio frequencies for people to freely use /obj/structure/machinery/telecomms/receiver/preset/Initialize(mapload, ...) @@ -453,7 +453,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) id = "CentComm Receiver" network = "tcommsat" autolinkers = list("receiverCent") - freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ, FORECON_FREQ) + freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, YAUT_OVR_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ, FORECON_FREQ) //Buses @@ -472,7 +472,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) /obj/structure/machinery/telecomms/bus/preset_three id = "Bus 3" network = "tcommsat" - freq_listening = list(SEC_FREQ, COMM_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ) + freq_listening = list(SEC_FREQ, COMM_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, YAUT_OVR_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ) autolinkers = list("processor3", "security", "command", "JTAC") /obj/structure/machinery/telecomms/bus/preset_four @@ -488,7 +488,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) /obj/structure/machinery/telecomms/bus/preset_cent id = "CentComm Bus" network = "tcommsat" - freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ) + freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, YAUT_OVR_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ) autolinkers = list("processorCent", "centcomm") //Processors @@ -553,7 +553,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) /obj/structure/machinery/telecomms/server/presets/command id = "Command Server" - freq_listening = list(COMM_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ) + freq_listening = list(COMM_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, YAUT_OVR_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ) autolinkers = list("command") /obj/structure/machinery/telecomms/server/presets/engineering @@ -568,7 +568,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) /obj/structure/machinery/telecomms/server/presets/centcomm id = "CentComm Server" - freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ) + freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, YAUT_OVR_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ) autolinkers = list("centcomm") //Broadcasters diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index 5f4515167995..2562a225783c 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -745,7 +745,7 @@ GLOBAL_LIST_EMPTY(vending_products) var/obj/item/device/multitool/MT = W if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED) && !skillcheckexplicit(user, SKILL_ANTAG, SKILL_ANTAG_AGENT)) - to_chat(user, SPAN_WARNING("You do not understand how tweak access requirements in [src].")) + to_chat(user, SPAN_WARNING("You do not understand how to tweak access requirements in [src].")) return FALSE if(stat != WORKING) to_chat(user, SPAN_WARNING("[src] must be in working condition and powered for you to hack it.")) @@ -1295,6 +1295,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_corresponding_types_list, list( if(islist(item_ref)) // multi-vending var/list/ref_list = item_ref item_ref = ref_list[1] + var/icon/image_icon = icon(initial(item_ref.icon), initial(item_ref.icon_state)) + var/image_size = "[image_icon.Width()]x[image_icon.Height()]" var/is_category = item_ref == null @@ -1307,7 +1309,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_corresponding_types_list, list( "prod_color" = priority, "prod_desc" = initial(item_ref.desc), "prod_cost" = p_cost, - "image" = imgid + "image" = imgid, + "image_size" = image_size, ) if (is_category == 1) diff --git a/code/game/machinery/vending/vending_types.dm b/code/game/machinery/vending/vending_types.dm index ff19140b2d6c..7edc65b71496 100644 --- a/code/game/machinery/vending/vending_types.dm +++ b/code/game/machinery/vending/vending_types.dm @@ -462,6 +462,7 @@ /obj/item/ammo_magazine/rifle/m4ra/rubber = 40, /obj/item/clothing/head/helmet/marine/MP = 8, /obj/item/explosive/plastic/breaching_charge/rubber = 6, + /obj/item/clothing/glasses/mgoggles/mp_riot_shield = 15, ) /obj/structure/machinery/vending/sea @@ -484,6 +485,7 @@ /obj/item/storage/firstaid/fire = 2, /obj/item/storage/firstaid/rad = 1, /obj/item/device/radio/headset = 6, + /obj/item/device/flashlight = 4, /obj/item/tool/crew_monitor = 1, ) contraband = list(/obj/item/storage/fancy/cigar = 2,/obj/item/tool/lighter/zippo = 2) diff --git a/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm b/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm index e847245fae45..4f4d2650b4e7 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm @@ -40,6 +40,11 @@ products_sets = listed_products[/datum/equipment_preset/clf] return products_sets +/obj/structure/machinery/cm_vending/clothing/antag/upp + name = "\improper Automated Equipment Rack" + icon_state = "upp_clothing" + req_access = list(ACCESS_UPP_GENERAL) + //--------------RANDOM EQUIPMENT AND GEAR------------------------ /obj/effect/essentials_set/random/clf_shoes @@ -263,11 +268,11 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_upp, list( list("Purple Armband", 6, /obj/item/clothing/accessory/armband/science, null, VENDOR_ITEM_REGULAR), list("Yellow Armband", 6, /obj/item/clothing/accessory/armband/engine, null, VENDOR_ITEM_REGULAR), list("Green Armband", 6, /obj/item/clothing/accessory/armband/medgreen, null, VENDOR_ITEM_REGULAR), - list("Blue Tie", 6, /obj/item/clothing/accessory/blue, null, VENDOR_ITEM_REGULAR), - list("Green Tie", 6, /obj/item/clothing/accessory/green, null, VENDOR_ITEM_REGULAR), - list("Black Tie", 6, /obj/item/clothing/accessory/black, null, VENDOR_ITEM_REGULAR), - list("Gold Tie", 6, /obj/item/clothing/accessory/gold, null, VENDOR_ITEM_REGULAR), - list("Red Tie", 6, /obj/item/clothing/accessory/red, null, VENDOR_ITEM_REGULAR), - list("Purple Tie", 6, /obj/item/clothing/accessory/purple, null, VENDOR_ITEM_REGULAR), + list("Blue Tie", 6, /obj/item/clothing/accessory/tie, null, VENDOR_ITEM_REGULAR), + list("Green Tie", 6, /obj/item/clothing/accessory/tie/green, null, VENDOR_ITEM_REGULAR), + list("Black Tie", 6, /obj/item/clothing/accessory/tie/black, null, VENDOR_ITEM_REGULAR), + list("Gold Tie", 6, /obj/item/clothing/accessory/tie/gold, null, VENDOR_ITEM_REGULAR), + list("Red Tie", 6, /obj/item/clothing/accessory/tie/red, null, VENDOR_ITEM_REGULAR), + list("Purple Tie", 6, /obj/item/clothing/accessory/tie/purple, null, VENDOR_ITEM_REGULAR), list("Dress Gloves", 6, /obj/item/clothing/gloves/marine/dress, null, VENDOR_ITEM_REGULAR), )) diff --git a/code/game/machinery/vending/vendor_types/antag/antag_predator.dm b/code/game/machinery/vending/vendor_types/antag/antag_predator.dm index cc138f3f8c7f..3e7ca231ee1d 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_predator.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_predator.dm @@ -1,6 +1,6 @@ GLOBAL_LIST_INIT(cm_vending_equipment_yautja, list( list("Essential Hunting Supplies", 0, null, null, null), - list("Hunting Equipment", 0, list(/obj/item/clothing/under/chainshirt/hunter, /obj/item/storage/backpack/yautja, /obj/item/storage/medicomp/full, /obj/item/device/yautja_teleporter), MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + list("Hunting Equipment", 0, list(/obj/item/clothing/under/chainshirt/hunter, /obj/item/storage/backpack/yautja, /obj/item/storage/medicomp/full, /obj/item/device/yautja_teleporter, /obj/item/tool/yautja_cleaner), MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), list("Armor", 0, list(/obj/item/clothing/suit/armor/yautja/hunter, /obj/item/clothing/mask/gas/yautja/hunter, /obj/item/clothing/accessory/mask, /obj/item/clothing/shoes/yautja/hunter/knife), MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), list("Main Weapons (CHOOSE 1)", 0, null, null, null), @@ -22,6 +22,7 @@ GLOBAL_LIST_INIT(cm_vending_equipment_yautja, list( list("Wrist Blades", 0,list(/obj/item/bracer_attachments/wristblades, /obj/item/bracer_attachments/wristblades), MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), list("The Fearsome Scimitars", 0, list(/obj/item/bracer_attachments/scimitars, /obj/item/bracer_attachments/scimitars), MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("The Skewering Scimitars", 0, list(/obj/item/bracer_attachments/scimitars_alt, /obj/item/bracer_attachments/scimitars_alt), MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("The Chain Gauntlets", 0, list(/obj/item/bracer_attachments/chain_gauntlets, /obj/item/bracer_attachments/chain_gauntlets, /obj/item/yautja/chain), MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("Secondary Equipment (CHOOSE 2)", 0, null, null, null), list("The Fleeting Spike Launcher", 0, /obj/item/weapon/gun/launcher/spike, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), @@ -30,6 +31,7 @@ GLOBAL_LIST_INIT(cm_vending_equipment_yautja, list( list("The Purifying Smart-Disc", 0, /obj/item/explosive/grenade/spawnergrenade/smartdisc, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("The Steadfast Shield", 0, /obj/item/weapon/shield/riot/yautja, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("The Formidable Plate Armor", 0, /obj/item/clothing/suit/armor/yautja/hunter/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("The Firm Bow", 0, /obj/item/storage/belt/gun/quiver/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("Clothing Accessory (CHOOSE 1)", 0, null, null, null), list("Third-Cape", 0, /obj/item/clothing/yautja_cape/third, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), @@ -40,7 +42,7 @@ GLOBAL_LIST_INIT(cm_vending_equipment_yautja, list( GLOBAL_LIST_INIT(cm_vending_elder_yautja, list( list("Essential Hunting Supplies", 0, null, null, null), - list("Hunting Equipment", 0, list(/obj/item/clothing/under/chainshirt/hunter, /obj/item/storage/backpack/yautja, /obj/item/storage/medicomp/full, /obj/item/device/yautja_teleporter), MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + list("Hunting Equipment", 0, list(/obj/item/clothing/under/chainshirt/hunter, /obj/item/storage/backpack/yautja, /obj/item/storage/medicomp/full, /obj/item/device/yautja_teleporter, /obj/item/tool/yautja_cleaner), MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), list("Armor", 0, list(/obj/item/clothing/suit/armor/yautja/hunter, /obj/item/clothing/mask/gas/yautja/hunter, /obj/item/clothing/accessory/mask, /obj/item/clothing/shoes/yautja/hunter/knife), MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), list("Main Weapons (CHOOSE 1)", 0, null, null, null), @@ -62,7 +64,7 @@ GLOBAL_LIST_INIT(cm_vending_elder_yautja, list( list("Wrist Blades", 0,list(/obj/item/bracer_attachments/wristblades, /obj/item/bracer_attachments/wristblades), MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), list("The Fearsome Scimitars", 0, list(/obj/item/bracer_attachments/scimitars, /obj/item/bracer_attachments/scimitars), MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("The Skewering Scimitars", 0, list(/obj/item/bracer_attachments/scimitars_alt, /obj/item/bracer_attachments/scimitars_alt), MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), - + list("The Chain Gauntlets", 0, list(/obj/item/bracer_attachments/chain_gauntlets, /obj/item/bracer_attachments/chain_gauntlets, /obj/item/yautja/chain), MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("Secondary Equipment (CHOOSE 2)", 0, null, null, null), list("The Fleeting Spike Launcher", 0, /obj/item/weapon/gun/launcher/spike, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("The Swift Plasma Pistol", 0, /obj/item/weapon/gun/energy/yautja/plasmapistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), @@ -72,6 +74,7 @@ GLOBAL_LIST_INIT(cm_vending_elder_yautja, list( list("The Gilded Warlord’s Aegis", 0, /obj/item/weapon/shield/riot/yautja/ancient, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("The Dread Hunter’s Bulwark", 0, /obj/item/weapon/shield/riot/yautja/ancient/alt, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("The Formidable Plate Armor", 0, /obj/item/clothing/suit/armor/yautja/hunter/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("The Firm Bow", 0, /obj/item/storage/belt/gun/quiver/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("Clothing Accessory (CHOOSE 1)", 0, null, null, null), list("Third-Cape", 0, /obj/item/clothing/yautja_cape/third, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/antag/antag_upp_commanding_officer.dm b/code/game/machinery/vending/vendor_types/antag/antag_upp_commanding_officer.dm index 696025d0bc74..360bb0c2a38a 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_upp_commanding_officer.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_upp_commanding_officer.dm @@ -81,6 +81,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_upp_commanding_officer, list( list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("HUDS (CHOOSE 1)", 0, null, null, null), list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), diff --git a/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm b/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm index 718548f9220e..26f1b2dece84 100644 --- a/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm +++ b/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm @@ -20,6 +20,11 @@ GLOBAL_LIST_INIT(cm_vending_clothing_combat_correspondent, list( list("Black Vest", 0, /obj/item/clothing/suit/storage/hazardvest/black, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), list("Black Coat", 0, /obj/item/clothing/suit/storage/jacket/marine/reporter/black, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), list("Green Coat", 0, /obj/item/clothing/suit/storage/jacket/marine/reporter/green, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("Green Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/correspondent, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("Blue Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/correspondent/blue, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("Tan Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/correspondent/tan, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("Brown Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/correspondent/brown, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("HELMET (CHOOSE 1)", 0, null, null, null), list("Combat Correspondent's Helmet", 0, /obj/item/clothing/head/helmet/marine/reporter, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), diff --git a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm index 0fd5694c09e2..ad8eb7568a37 100644 --- a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm @@ -24,7 +24,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("Flechette Shells", 20, /obj/item/ammo_magazine/shotgun/flechette, null, VENDOR_ITEM_REGULAR), list("SPECIAL AMMUNITION", 0, null, null, null), - list("M41A Incendiary Magazine", 65, /obj/item/ammo_magazine/rifle/incendiary, null, VENDOR_ITEM_REGULAR), list("M41A Rubber Shot Magazine", 10, /obj/item/ammo_magazine/rifle/rubber, null, VENDOR_ITEM_REGULAR), list("Beanbag Slugs", 10, /obj/item/ammo_magazine/shotgun/beanbag, null, VENDOR_ITEM_REGULAR), @@ -74,7 +73,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), + list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom/co, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("COMMANDING OFFICER ESSENTIALS KIT (TAKE ALL)", 0, null, null, null), @@ -85,9 +84,11 @@ GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("Secure Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("RTO Telephone Pack", 0, /obj/item/storage/backpack/marine/satchel/rto, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("Intel Expedition Pack", 0, /obj/item/storage/backpack/marine/satchel/intel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), + list("Expedition Chestrig", 0, /obj/item/storage/backpack/marine/satchel/intel/chestrig, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), + list("Expedition Satchel", 0, /obj/item/storage/backpack/marine/satchel/intel/expeditionsatchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), list("ARMOR (CHOOSE 1)", 0, null, null, null), - list("Commanding Officer's M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/CO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("Commanding Officer's M3 Armor", 0, /obj/item/clothing/suit/storage/marine/CIC/CO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), list("M11C Helmet", 0, /obj/item/clothing/head/helmet/marine/leader/CO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), @@ -97,10 +98,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("HUDS (CHOOSE 1)", 0, null, null, null), list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), diff --git a/code/game/machinery/vending/vendor_types/crew/corporate_liaison.dm b/code/game/machinery/vending/vendor_types/crew/corporate_liaison.dm index 3e840017c916..40e10fc5fda5 100644 --- a/code/game/machinery/vending/vendor_types/crew/corporate_liaison.dm +++ b/code/game/machinery/vending/vendor_types/crew/corporate_liaison.dm @@ -3,6 +3,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_corporate_liaison, list( list("SUITS AND UNDERSHIRTS (CHOOSE 5)", 0, null, null, null), list("Black Suit Pants", 0, /obj/item/clothing/under/liaison_suit/black, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), + list("Black Suitskirt", 0, /obj/item/clothing/under/liaison_suit/black/skirt, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), list("Blue Suit Pants", 0, /obj/item/clothing/under/liaison_suit/blue, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Brown Suit Pants", 0, /obj/item/clothing/under/liaison_suit/brown, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("White Suit Pants", 0, /obj/item/clothing/under/liaison_suit/corporate_formal, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), @@ -10,6 +11,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_corporate_liaison, list( list("Worn Suit", 0, /obj/item/clothing/under/detective/neutral, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Liaison's Tan Suit", 0, /obj/item/clothing/under/liaison_suit, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Liaison's Charcoal Suit", 0, /obj/item/clothing/under/liaison_suit/charcoal, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Liaison's Charcoal Suitskirt", 0, /obj/item/clothing/under/liaison_suit/charcoal/skirt, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Liaison's White Suit", 0, /obj/item/clothing/under/liaison_suit/formal, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Liaison's Blue Blazer", 0, /obj/item/clothing/under/liaison_suit/blazer, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Liaison's Suspenders", 0, /obj/item/clothing/under/liaison_suit/suspenders, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), @@ -18,6 +20,16 @@ GLOBAL_LIST_INIT(cm_vending_clothing_corporate_liaison, list( list("Country Club Outfit", 0, /obj/item/clothing/under/liaison_suit/ivy, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Orange Outfit", 0, /obj/item/clothing/under/liaison_suit/orange, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Corporate Casual", 0, /obj/item/clothing/under/liaison_suit/field, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Corporate Casual Skirt", 0, /obj/item/clothing/under/liaison_suit/field/skirt, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Simple White Shirt, Black Pants", 0, /obj/item/clothing/under/sl_suit, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Simple White Shirt, Blue Pants", 0, /obj/item/clothing/under/lawyer/bluesuit, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Black Tailored Suit", 0, /obj/item/clothing/under/suit_jacket, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Burgundy Tailored Suit", 0, /obj/item/clothing/under/suit_jacket/burgundy, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Charcoal Tailored Suit", 0, /obj/item/clothing/under/suit_jacket/charcoal, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Navy Tailored Suit", 0, /obj/item/clothing/under/suit_jacket/navy, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Checkered Tailored Suit", 0, /obj/item/clothing/under/suit_jacket/checkered, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Jet-Black Executive Suit", 0, /obj/item/clothing/under/suit_jacket/really_black, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), + list("Fem Jet-Black Executive Suit", 0, /obj/item/clothing/under/suit_jacket/female, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Grey Workwear", 0, /obj/item/clothing/under/colonist/workwear, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Khaki Workwear", 0, /obj/item/clothing/under/colonist/workwear/khaki, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Pink Workwear", 0, /obj/item/clothing/under/colonist/workwear/pink, CIVILIAN_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), @@ -30,6 +42,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_corporate_liaison, list( list("Brown Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/corporate/brown, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Blue Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/corporate/blue, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Formal Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/corporate/formal, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Black Fancy Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/lawyer/blackjacket, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Blue Fancy Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/lawyer/bluejacket, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Purple Fancy Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/lawyer/purpjacket, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Red Fancy Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/lawyer/redjacket, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Brown Fancy Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/lawyer/brown, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Light-Brown Fancy Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/lawyer/light_brown, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Grey Bomber Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/bomber/grey, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Red Bomber Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/bomber/red, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Khaki Bomber Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/bomber, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), @@ -38,12 +56,16 @@ GLOBAL_LIST_INIT(cm_vending_clothing_corporate_liaison, list( list("Brown Windbreaker", 0, /obj/item/clothing/suit/storage/windbreaker/windbreaker_brown, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Grey Windbreaker", 0, /obj/item/clothing/suit/storage/windbreaker/windbreaker_gray, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Green Windbreaker", 0, /obj/item/clothing/suit/storage/windbreaker/windbreaker_green, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Brown Polyester Jacket", 0, /obj/item/clothing/suit/storage/snow_suit/hybrisa/polyester_jacket_brown, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Blue Polyester Jacket", 0, /obj/item/clothing/suit/storage/snow_suit/hybrisa/polyester_jacket_blue, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Red Polyester Jacket", 0, /obj/item/clothing/suit/storage/snow_suit/hybrisa/polyester_jacket_red, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Expedition Windbreaker", 0, /obj/item/clothing/suit/storage/windbreaker/windbreaker_covenant, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Liaison's Winter Coat", 0, /obj/item/clothing/suit/storage/snow_suit/liaison, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Beige Trenchcoat", 0, /obj/item/clothing/suit/storage/CMB/trenchcoat, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Brown Trenchcoat", 0, /obj/item/clothing/suit/storage/CMB/trenchcoat/brown, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Grey Trenchcoat", 0, /obj/item/clothing/suit/storage/CMB/trenchcoat/grey, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Labcoat", 0, /obj/item/clothing/suit/storage/labcoat, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), + list("Labcoat, Brown", 0, /obj/item/clothing/suit/storage/labcoat/brown, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Grey Vest", 0, /obj/item/clothing/suit/storage/jacket/marine/vest/grey, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Brown Vest", 0, /obj/item/clothing/suit/storage/jacket/marine/vest, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), list("Tan Vest", 0, /obj/item/clothing/suit/storage/jacket/marine/vest/tan, CIVILIAN_CAN_BUY_SUIT, VENDOR_ITEM_REGULAR), @@ -57,6 +79,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_corporate_liaison, list( list("Tan Fedora", 0, /obj/item/clothing/head/fedora, CIVILIAN_CAN_BUY_HAT, VENDOR_ITEM_REGULAR), list("Brown Fedora", 0, /obj/item/clothing/head/fedora/brown, CIVILIAN_CAN_BUY_HAT, VENDOR_ITEM_REGULAR), list("Grey Fedora", 0, /obj/item/clothing/head/fedora/grey, CIVILIAN_CAN_BUY_HAT, VENDOR_ITEM_REGULAR), + list("Cowboy Hat, Brown", 0, /obj/item/clothing/head/cowboy, CIVILIAN_CAN_BUY_HAT, VENDOR_ITEM_REGULAR), + list("Cowboy Hat, Light-Brown", 0, /obj/item/clothing/head/cowboy/light, CIVILIAN_CAN_BUY_HAT, VENDOR_ITEM_REGULAR), list("GLASSES (CHOOSE 2)", 0, null, null, null), list("BiMex Shades", 0, /obj/item/clothing/glasses/sunglasses/big, CIVILIAN_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), @@ -70,6 +94,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_corporate_liaison, list( list("SHOES (CHOOSE 2)", 0, null, null, null), list("Laceup Shoes, Black", 0, /obj/item/clothing/shoes/laceup, CIVILIAN_CAN_BUY_SHOES, VENDOR_ITEM_RECOMMENDED), list("Laceup Shoes, Brown", 0, /obj/item/clothing/shoes/laceup/brown, CIVILIAN_CAN_BUY_SHOES, VENDOR_ITEM_REGULAR), + list("Fancy Leather Shoes", 0, /obj/item/clothing/shoes/leather/fancy, CIVILIAN_CAN_BUY_SHOES, VENDOR_ITEM_REGULAR), list("Sneakers, Black", 0, /obj/item/clothing/shoes/black, CIVILIAN_CAN_BUY_SHOES, VENDOR_ITEM_REGULAR), list("Corporate Boots", 0, /obj/item/clothing/shoes/marine/corporate, CIVILIAN_CAN_BUY_SHOES, VENDOR_ITEM_REGULAR), @@ -77,15 +102,16 @@ GLOBAL_LIST_INIT(cm_vending_clothing_corporate_liaison, list( list("Black Gloves", 0, /obj/item/clothing/gloves/black, CIVILIAN_CAN_BUY_GLOVES, VENDOR_ITEM_RECOMMENDED), list("Brown Gloves", 0, /obj/item/clothing/gloves/brown, CIVILIAN_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), list("Dress Gloves", 0, /obj/item/clothing/gloves/marine/dress, CIVILIAN_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), + list("Black Leather Gloves", 0, /obj/item/clothing/gloves/black_leather, CIVILIAN_CAN_BUY_GLOVES, VENDOR_ITEM_RECOMMENDED), list("ACCESSORIES (CHOOSE 5)", 0, null, null, null), - list("Black Tie", 0, /obj/item/clothing/accessory/black, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), - list("Red Tie", 0, /obj/item/clothing/accessory/red, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Purple Tie", 0, /obj/item/clothing/accessory/purple, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Blue Tie", 0, /obj/item/clothing/accessory/blue, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Green Tie", 0, /obj/item/clothing/accessory/green, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Gold Tie", 0, /obj/item/clothing/accessory/gold, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Special Tie", 0, /obj/item/clothing/accessory/horrible, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Tie", 0, /obj/item/clothing/accessory/tie/black, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Red Tie", 0, /obj/item/clothing/accessory/tie/red, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Purple Tie", 0, /obj/item/clothing/accessory/tie/purple, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Blue Tie", 0, /obj/item/clothing/accessory/tie, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Green Tie", 0, /obj/item/clothing/accessory/tie/green, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Gold Tie", 0, /obj/item/clothing/accessory/tie/gold, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Special Tie", 0, /obj/item/clothing/accessory/tie/horrible, CIVILIAN_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), )) /obj/structure/machinery/cm_vending/clothing/corporate_liaison diff --git a/code/game/machinery/vending/vendor_types/crew/engineering.dm b/code/game/machinery/vending/vendor_types/crew/engineering.dm index 0a561072457b..d4013220a98e 100644 --- a/code/game/machinery/vending/vendor_types/crew/engineering.dm +++ b/code/game/machinery/vending/vendor_types/crew/engineering.dm @@ -8,7 +8,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_maintenance_technician, list( list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/mt, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), + list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_MAP, VENDOR_ITEM_MANDATORY), list("HELMET (CHOOSE 1)", 0, null, null, null), list("Beret, Engineering", 0, /obj/item/clothing/head/beret/eng, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), @@ -52,6 +52,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_maintenance_technician, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/medical.dm b/code/game/machinery/vending/vendor_types/crew/medical.dm index 9bf21671b22d..4398c8d5b4a3 100644 --- a/code/game/machinery/vending/vendor_types/crew/medical.dm +++ b/code/game/machinery/vending/vendor_types/crew/medical.dm @@ -91,9 +91,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_doctor, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), )) //------------ NURSE --------------- @@ -163,7 +166,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_nurse, list( list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), )) //------------ RESEARCHER --------------- @@ -237,7 +240,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_researcher, list( list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), )) /obj/effect/essentials_set/medical diff --git a/code/game/machinery/vending/vendor_types/crew/mp.dm b/code/game/machinery/vending/vendor_types/crew/mp.dm index c9732251532f..1690e896ece5 100644 --- a/code/game/machinery/vending/vendor_types/crew/mp.dm +++ b/code/game/machinery/vending/vendor_types/crew/mp.dm @@ -42,6 +42,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_military_police, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/pilot_officer.dm b/code/game/machinery/vending/vendor_types/crew/pilot_officer.dm index efc4af9ce785..55e6d92ac98d 100644 --- a/code/game/machinery/vending/vendor_types/crew/pilot_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/pilot_officer.dm @@ -12,7 +12,7 @@ list("PRIMARY FIREARMS", -1, null, null), list("M4RA Battle Rifle", 4, /obj/item/weapon/gun/rifle/m4ra, VENDOR_ITEM_REGULAR), list("M39 Submachine Gun", 4, /obj/item/weapon/gun/smg/m39, VENDOR_ITEM_REGULAR), - list("M37A2 Pump Shotgun", 4, /obj/item/weapon/gun/shotgun/pump, VENDOR_ITEM_REGULAR), + list("M37A2 Pump Shotgun", 4, /obj/item/weapon/gun/shotgun/pump/m37a, VENDOR_ITEM_REGULAR), list("M41A Pulse Rifle MK2", 4, /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_REGULAR), list("PRIMARY AMMUNITION", -1, null, null), @@ -64,29 +64,30 @@ GLOBAL_LIST_INIT(cm_vending_clothing_pilot_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("M30 Tactical Helmet", 0, /obj/item/clothing/head/helmet/marine/pilot, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Insulated Gloves (Yellow)", 0, /obj/item/clothing/gloves/marine/insulated, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("Insulated Gloves (Black)", 0, /obj/item/clothing/gloves/marine/insulated/black, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("MK30 Tactical Helmet", 0, /obj/item/clothing/head/helmet/marine/pilot, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("Leather Satchel", 0, /obj/item/storage/backpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("ARMOR (CHOOSE 1)", 0, null, null, null), - list("M70 Flak Jacket", 0, /obj/item/clothing/suit/armor/vest/pilot, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("M70 Flak Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/pilot/armor, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("M3-VL Pattern Flak Vest", 0, /obj/item/clothing/suit/storage/marine/light/vest/dcc, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null), list("88 Mod 4 Combat Pistol", 0, /obj/item/weapon/gun/pistol/mod88, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR), list("VP78 Pistol", 0, /obj/item/weapon/gun/pistol/vp78, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR), - list("BELT (CHOOSE 1)", 0, null, null, null), + list("BELT (CHOOSE 2)", 0, null, null, null), list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M10 Holster Rig", 0, /obj/item/storage/belt/gun/m10, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), + list("M276 M10 Holster Rig", 0, /obj/item/storage/belt/gun/m10, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), + list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), @@ -106,6 +107,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_pilot_officer, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), @@ -126,7 +129,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_pilot_officer, list( list("Gyroscopic Stabilizer", 10, /obj/item/attachable/gyro, null, VENDOR_ITEM_REGULAR), list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), list("Masterkey Shotgun", 10, /obj/item/attachable/attached_gun/shotgun, null, VENDOR_ITEM_REGULAR), - list("M37 Wooden Stock", 10, /obj/item/attachable/stock/shotgun, null, VENDOR_ITEM_REGULAR), + list("M37A2 Collapsible Stock", 10, /obj/item/attachable/stock/synth/collapsible, null, VENDOR_ITEM_REGULAR), list("M39 Stock", 10, /obj/item/attachable/stock/smg, null, VENDOR_ITEM_REGULAR), list("M41A Solid Stock", 10, /obj/item/attachable/stock/rifle, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 10, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), @@ -158,27 +161,28 @@ GLOBAL_LIST_INIT(cm_vending_clothing_pilot_officer, list( GLOBAL_LIST_INIT(cm_vending_clothing_dropship_crew_chief, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("MK30 Tactical Helmet", 0, /obj/item/clothing/head/helmet/marine/pilot, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("Leather Satchel", 0, /obj/item/storage/backpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("ARMOR (CHOOSE 1)", 0, null, null, null), - list("M70 Flak Jacket", 0, /obj/item/clothing/suit/armor/vest/pilot, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("M70 Flak Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/pilot/armor, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("M3-VL Pattern Flak Vest", 0, /obj/item/clothing/suit/storage/marine/light/vest/dcc, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null), list("88 Mod 4 Combat Pistol", 0, /obj/item/weapon/gun/pistol/mod88, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR), list("VP78 Pistol", 0, /obj/item/weapon/gun/pistol/vp78, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR), - list("BELT (CHOOSE 1)", 0, null, null, null), + list("BELT (CHOOSE 2)", 0, null, null, null), list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), + list("M276 General Revolver Holster Rig", 0, /obj/item/storage/belt/gun/m44, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), + list("M276 General Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR), list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), @@ -202,6 +206,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_dropship_crew_chief, list( list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("GLASSES (CHOOSE 1)", 0, null, null, null), list("Aviator Shades", 0, /obj/item/clothing/glasses/sunglasses/aviator, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), @@ -218,7 +223,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_dropship_crew_chief, list( list("Gyroscopic Stabilizer", 10, /obj/item/attachable/gyro, null, VENDOR_ITEM_REGULAR), list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), list("Masterkey Shotgun", 10, /obj/item/attachable/attached_gun/shotgun, null, VENDOR_ITEM_REGULAR), - list("M37 Wooden Stock", 10, /obj/item/attachable/stock/shotgun, null, VENDOR_ITEM_REGULAR), + list("M37A2 Collapsible Stock", 10, /obj/item/attachable/stock/synth/collapsible, null, VENDOR_ITEM_REGULAR), list("M39 Stock", 10, /obj/item/attachable/stock/smg, null, VENDOR_ITEM_REGULAR), list("M41A Solid Stock", 10, /obj/item/attachable/stock/rifle, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 10, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/sea.dm b/code/game/machinery/vending/vendor_types/crew/sea.dm index 6f1937a22c33..e602f502cfb0 100644 --- a/code/game/machinery/vending/vendor_types/crew/sea.dm +++ b/code/game/machinery/vending/vendor_types/crew/sea.dm @@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_sea, list( list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), )) /obj/structure/machinery/cm_vending/clothing/sea diff --git a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm index 8eb4d74dbcdc..31a22af0b459 100644 --- a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm +++ b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm @@ -75,6 +75,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_military_police_chief, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), @@ -87,7 +89,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_chief_engineer, list( list("SHIPSIDE GEAR", 0, null, null, null), list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Standard Equipment", 0, list(/obj/item/clothing/gloves/yellow, /obj/item/device/radio/headset/almayer/ce, /obj/item/clothing/shoes/marine, /obj/item/clothing/glasses/welding, /obj/item/device/working_joe_pda/uscm, /obj/item/weapon/gun/smg/nailgun/compact/tactical), MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Standard Equipment", 0, list(/obj/item/clothing/gloves/yellow, /obj/item/device/radio/headset/almayer/ce, /obj/item/clothing/shoes/marine, /obj/item/clothing/glasses/welding, /obj/item/device/working_joe_pda/uscm, /obj/item/weapon/gun/smg/nailgun/compact/tactical, /obj/item/ammo_magazine/smg/nailgun), MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("UNIFORM (CHOOSE 1)", 0, null, null, null), list("Chief Engineer Uniform", 0, /obj/item/clothing/under/marine/officer/ce, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), @@ -132,6 +134,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_chief_engineer, list( list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("Engineer kit Pouch", 0, /obj/item/storage/pouch/engikit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null), list("M4A3 Service Pistol", 0, /obj/item/storage/belt/gun/m4a3/full, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), @@ -141,17 +144,18 @@ GLOBAL_LIST_INIT(cm_vending_clothing_chief_engineer, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Small Tool Webbing (Full)", 0, /obj/item/clothing/accessory/storage/tool_webbing/small/equipped, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("DEPLOYMENT GEAR", 0, null, null, null), list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_REGULAR), - list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_COMBAT_SHOES, VENDOR_ITEM_REGULAR), - list("Laser Designator", 0, /obj/item/device/binoculars/range/designator, MARINE_CAN_BUY_MRE, VENDOR_ITEM_REGULAR), + list("Officer Deployment Gear", 0, list(/obj/item/clothing/suit/storage/marine/CIC, /obj/item/clothing/shoes/marine/knife, /obj/item/device/binoculars/range/designator,), MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_REGULAR), list("COMBAT HELMET (CHOOSE 1)", 0, null, null, null), list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_REGULAR), @@ -194,7 +198,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_req_officer, list( list("M44 Custom Revolver", 0, /obj/item/storage/belt/gun/m44/custom, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/CIC, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), @@ -274,7 +278,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_cmo, list( list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("COMBAT EQUIPMENT (COMBAT USE ONLY)", 0, null, null, null), - list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/CIC, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_COMBAT_SHOES, VENDOR_ITEM_MANDATORY), @@ -299,6 +303,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_cmo, list( list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Spare Equipment", 0, null, null, null), list("Doctor's Headset", 15, /obj/item/device/radio/headset/almayer/doc, null, VENDOR_ITEM_REGULAR), @@ -403,13 +408,13 @@ GLOBAL_LIST_INIT(cm_vending_gear_xo, list( //------------UNIFORM/GEAR VENDOR--------------- GLOBAL_LIST_INIT(cm_vending_clothing_xo, list( list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/CIC, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_COMBAT_SHOES, VENDOR_ITEM_MANDATORY), list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), + list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom/xo, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Satchel", 0, /obj/item/storage/backpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), @@ -512,7 +517,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_auxiliary_officer, list( list("Service Peaked Cap", 0, /obj/item/clothing/head/marine/peaked/service, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED), list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/CIC, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm index 25f40eca8fb1..d66fe13ba7ba 100644 --- a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm @@ -19,13 +19,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Service Uniform", 0, /obj/item/clothing/under/marine/officer/bridge, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Operations Uniform", 0, /obj/item/clothing/under/marine/officer/boiler, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), + list("Insulated Gloves (Black)", 0, /obj/item/clothing/gloves/marine/insulated/black, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("JACKET (CHOOSE 1)", 0, null, null, null), list("Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED), list("HAT (CHOOSE 1)", 0, null, null, null), - list("Beret, Green", 0, /obj/item/clothing/head/beret/cm, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), + list("Beret, Green", 0, /obj/item/clothing/head/beret/cm/green, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), list("Beret, Tan", 0, /obj/item/clothing/head/beret/cm/tan, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), list("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), list("Officer Cap", 0, /obj/item/clothing/head/cmcap/bridge, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), @@ -48,7 +48,10 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), @@ -82,7 +85,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( GLOBAL_LIST_INIT(cm_vending_gear_staff_officer_armory, list( list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/CIC, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_COMBAT_SHOES, VENDOR_ITEM_MANDATORY), list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index fabb971ccfe1..cbe4f8be83ae 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -92,27 +92,22 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/synth, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("UNIFORM (CHOOSE 1)", 0, null, null, null), - list("Uniform, Outdated Synth", 0, /obj/item/clothing/under/rank/synthetic/old, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), - list("Uniform, Standard Synth", 0, /obj/item/clothing/under/rank/synthetic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("USCM Standard Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), - list("USCM Medical Uniform", 0, /obj/item/clothing/under/marine/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("WEBBING (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("SHOES (CHOOSE 1)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_REGULAR), list("Shoes, White", 0, /obj/item/clothing/shoes/white, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_RECOMMENDED), - list("HELMET (CHOOSE 1)", 0, null, null, null), - list("Expedition Cap", 0, /obj/item/clothing/head/cmcap/flap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - list("Hard Hat, Orange", 0, /obj/item/clothing/head/hardhat/orange, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - list("Welding Helmet", 0, /obj/item/clothing/head/welding, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - list("SUIT (CHOOSE 1)", 0, null, null, null), list("M3A1 Pattern Synthetic Utility Vest (Mission-Specific Camo)", 0, /obj/item/clothing/suit/storage/marine/light/synvest, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED), list("M3A1 Pattern Synthetic Utility Vest (UA Gray)", 0, /obj/item/clothing/suit/storage/marine/light/synvest/grey, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), @@ -210,26 +205,98 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/uscm/medical_grey path = /obj/item/clothing/under/rank/medical/grey +/datum/gear/synthetic/uscm/standard_synth + path = /obj/item/clothing/under/rank/synthetic + +/datum/gear/synthetic/uscm/standard_synth_old + path = /obj/item/clothing/under/rank/synthetic/old + +/datum/gear/synthetic/uscm/marine_jungle + path = /obj/item/clothing/under/marine/jungle + +/datum/gear/synthetic/uscm/marine_desert + path = /obj/item/clothing/under/marine/desert + +/datum/gear/synthetic/uscm/marine_classic + path = /obj/item/clothing/under/marine/classic + +/datum/gear/synthetic/uscm/marine_snow + path = /obj/item/clothing/under/marine/snow + +/datum/gear/synthetic/uscm/marine_urban + path = /obj/item/clothing/under/marine/urban + /datum/gear/synthetic/uscm/service_tan path = /obj/item/clothing/under/marine/officer/bridge /datum/gear/synthetic/uscm/service_white path = /obj/item/clothing/under/marine/dress -/datum/gear/synthetic/uscm/engineer - path = /obj/item/clothing/under/marine/engineer/standard +/datum/gear/synthetic/uscm/engineer_jungle + path = /obj/item/clothing/under/marine/engineer/jungle + +/datum/gear/synthetic/uscm/engineer_desert + path = /obj/item/clothing/under/marine/engineer/desert -/datum/gear/synthetic/uscm/engineer_dark - path = /obj/item/clothing/under/marine/engineer/darker +/datum/gear/synthetic/uscm/engineer_classic + path = /obj/item/clothing/under/marine/engineer/classic + +/datum/gear/synthetic/uscm/engineer_snow + path = /obj/item/clothing/under/marine/engineer/snow + +/datum/gear/synthetic/uscm/engineer_urban + path = /obj/item/clothing/under/marine/engineer/urban /datum/gear/synthetic/uscm/engineer_officer path = /obj/item/clothing/under/marine/officer/engi -/datum/gear/synthetic/uscm/mp - path = /obj/item/clothing/under/marine/mp/standard +/datum/gear/synthetic/uscm/engineer_OT + path = /obj/item/clothing/under/marine/officer/engi/OT + +/datum/gear/synthetic/uscm/corpsman_jungle + path = /obj/item/clothing/under/marine/medic/jungle + +/datum/gear/synthetic/uscm/corpsman_desert + path = /obj/item/clothing/under/marine/medic/desert + +/datum/gear/synthetic/uscm/corpsman_classic + path = /obj/item/clothing/under/marine/medic/classic + +/datum/gear/synthetic/uscm/corpsman_snow + path = /obj/item/clothing/under/marine/medic/snow + +/datum/gear/synthetic/uscm/corpsman_urban + path = /obj/item/clothing/under/marine/medic/urban + +/datum/gear/synthetic/uscm/mp_jungle + path = /obj/item/clothing/under/marine/mp/jungle -/datum/gear/synthetic/uscm/mp_dark - path = /obj/item/clothing/under/marine/mp/darker +/datum/gear/synthetic/uscm/mp_desert + path = /obj/item/clothing/under/marine/mp/desert + +/datum/gear/synthetic/uscm/mp_classic + path = /obj/item/clothing/under/marine/mp/classic + +/datum/gear/synthetic/uscm/mp_snow + path = /obj/item/clothing/under/marine/mp/snow + +/datum/gear/synthetic/uscm/mp_urban + path = /obj/item/clothing/under/marine/mp/urban + +/datum/gear/synthetic/uscm/operations_uniform_jungle + path = /obj/item/clothing/under/marine/officer/boiler/jungle + +/datum/gear/synthetic/uscm/operations_uniform_desert + path = /obj/item/clothing/under/marine/officer/boiler/desert + +/datum/gear/synthetic/uscm/operations_uniform_classic + path = /obj/item/clothing/under/marine/officer/boiler/classic + +/datum/gear/synthetic/uscm/operations_uniform_snow + path = /obj/item/clothing/under/marine/officer/boiler/snow + +/datum/gear/synthetic/uscm/operations_uniform_urban + path = /obj/item/clothing/under/marine/officer/boiler/urban /datum/gear/synthetic/civilian category = "Civilian Uniforms" @@ -279,18 +346,62 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/civilian/white_suit_pants path = /obj/item/clothing/under/liaison_suit/corporate_formal +/datum/gear/synthetic/civilian/grey_suit_pants + path = /obj/item/clothing/under/detective/grey + +/datum/gear/synthetic/civilian/alt_brown_suit_pants + path = /obj/item/clothing/under/detective/neutral + /datum/gear/synthetic/glasses category = "Glasses" /datum/gear/synthetic/glasses/marine_rpg path = /obj/item/clothing/glasses/regular +/datum/gear/synthetic/glasses/reagent_scanner + path = /obj/item/clothing/glasses/science + + /datum/gear/synthetic/glasses/security_hud path = /obj/item/clothing/glasses/sunglasses/sechud /datum/gear/synthetic/glasses/sunglasses path = /obj/item/clothing/glasses/sunglasses +/datum/gear/synthetic/glasses/sunglasses_aviator_tan + path = /obj/item/clothing/glasses/sunglasses/aviator + +/datum/gear/synthetic/glasses/sunglasses_aviator_silver + path = /obj/item/clothing/glasses/sunglasses/aviator/silver + +/datum/gear/synthetic/glasses/bimex + path = /obj/item/clothing/glasses/sunglasses/big + +/datum/gear/synthetic/glasses/bimex_new + path = /obj/item/clothing/glasses/sunglasses/big/new_bimex + +/datum/gear/synthetic/glasses/bimex_new_black + path = /obj/item/clothing/glasses/sunglasses/big/new_bimex/black + +/datum/gear/synthetic/glasses/bimex_new_bronze + path = /obj/item/clothing/glasses/sunglasses/big/new_bimex/bronze + +/datum/gear/synthetic/glasses/fake_bimex_red + path = /obj/item/clothing/glasses/sunglasses/big/fake/red + +/datum/gear/synthetic/glasses/fake_bimex_orange + path = /obj/item/clothing/glasses/sunglasses/big/fake/orange + +/datum/gear/synthetic/glasses/fake_bimex_yellow + path = /obj/item/clothing/glasses/sunglasses/big/fake/yellow + +/datum/gear/synthetic/glasses/fake_bimex_green + path = /obj/item/clothing/glasses/sunglasses/big/fake/green + +/datum/gear/synthetic/glasses/fake_bimex_blue + path = /obj/item/clothing/glasses/sunglasses/big/fake/blue + + /datum/gear/synthetic/shoes category = "Shoes" @@ -324,6 +435,24 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/headwear/beanie path = /obj/item/clothing/head/beanie +/datum/gear/synthetic/headwear/hardhat_yellow + path = /obj/item/clothing/head/hardhat + +/datum/gear/synthetic/headwear/hardhat_yellow + path = /obj/item/clothing/head/hardhat + +/datum/gear/synthetic/headwear/hardhat_orange + path = /obj/item/clothing/head/hardhat/orange + +/datum/gear/synthetic/headwear/hardhat_white + path = /obj/item/clothing/head/hardhat/white + +/datum/gear/synthetic/headwear/hardhat_blue + path = /obj/item/clothing/head/hardhat/dblue + +/datum/gear/synthetic/headwear/welding_helmet + path = /obj/item/clothing/head/welding + /datum/gear/synthetic/headwear/beret_engineering path = /obj/item/clothing/head/beret/eng @@ -348,6 +477,9 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/headwear/cap path = /obj/item/clothing/head/cmcap +/datum/gear/synthetic/headwear/cap + path = /obj/item/clothing/head/cmcap/flap + /datum/gear/synthetic/headwear/mp_cap path = /obj/item/clothing/head/beret/marine/mp/mpcap @@ -360,9 +492,21 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/headwear/officer_cap path = /obj/item/clothing/head/cmcap/bridge -/datum/gear/synthetic/headwear/fedora +/datum/gear/synthetic/headwear/fedora_tan + path = /obj/item/clothing/head/fedora + +/datum/gear/synthetic/headwear/fedora_grey path = /obj/item/clothing/head/fedora/grey +/datum/gear/synthetic/headwear/fedora_brown + path = /obj/item/clothing/head/fedora/brown + +/datum/gear/synthetic/headwear/trucker_blue + path = /obj/item/clothing/head/soft/trucker + +/datum/gear/synthetic/headwear/trucker_red + path = /obj/item/clothing/head/soft/trucker/red + /datum/gear/synthetic/helmet category = "Helmet" @@ -381,6 +525,9 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/helmet/marine_desert path = /obj/item/clothing/head/helmet/marine/desert +/datum/gear/synthetic/helmet/marine_urban + path = /obj/item/clothing/head/helmet/marine/urban + /datum/gear/synthetic/mask category = "Mask" @@ -426,9 +573,18 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/suit/bomber path = /obj/item/clothing/suit/storage/bomber +/datum/gear/synthetic/suit/grey_bomber + path = /obj/item/clothing/suit/storage/jacket/marine/bomber/grey + +/datum/gear/synthetic/suit/red_bomber + path = /obj/item/clothing/suit/storage/jacket/marine/bomber/red + /datum/gear/synthetic/suit/bomber_alt path = /obj/item/clothing/suit/storage/bomber/alt +/datum/gear/synthetic/suit/khaki_bomber + path = /obj/item/clothing/suit/storage/jacket/marine/bomber + /datum/gear/synthetic/suit/webbing path = /obj/item/clothing/suit/storage/webbing @@ -438,6 +594,9 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/suit/hazardvest path = /obj/item/clothing/suit/storage/hazardvest +/datum/gear/synthetic/suit/hazardvest_hivis + path = /obj/item/clothing/suit/storage/hazardvest/sanitation + /datum/gear/synthetic/suit/hazardvest_blue path = /obj/item/clothing/suit/storage/hazardvest/blue @@ -447,6 +606,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/suit/hazardvest_black path = /obj/item/clothing/suit/storage/hazardvest/black +/datum/gear/synthetic/suit/medicalvest_green + path = /obj/item/clothing/suit/storage/hazardvest/medical_green + +/datum/gear/synthetic/suit/medicalvest_red + path = /obj/item/clothing/suit/storage/hazardvest/medical_red + /datum/gear/synthetic/suit/snowsuit path = /obj/item/clothing/suit/storage/snow_suit/synth @@ -495,6 +660,24 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( /datum/gear/synthetic/suit/vest_gray path = /obj/item/clothing/suit/storage/jacket/marine/vest/grey +/datum/gear/synthetic/suit/tan_trenchcoat + path = /obj/item/clothing/suit/storage/CMB/trenchcoat + +/datum/gear/synthetic/suit/brown_trenchcoat + path = /obj/item/clothing/suit/storage/CMB/trenchcoat/brown + +/datum/gear/synthetic/suit/grey_trenchcoat + path = /obj/item/clothing/suit/storage/CMB/trenchcoat/grey + +/datum/gear/synthetic/suit/blue_overalls + path = /obj/item/clothing/suit/storage/apron/overalls + +/datum/gear/synthetic/suit/tan_overalls + path = /obj/item/clothing/suit/storage/apron/overalls/tan + +/datum/gear/synthetic/suit/red_overalls + path = /obj/item/clothing/suit/storage/apron/overalls/red + /datum/gear/synthetic/backpack category = "Backpack" @@ -535,27 +718,26 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( path = /obj/item/clothing/accessory/armband/medgreen /datum/gear/synthetic/blue_tie - path = /obj/item/clothing/accessory/blue + path = /obj/item/clothing/accessory/tie /datum/gear/synthetic/green_tie - path = /obj/item/clothing/accessory/green + path = /obj/item/clothing/accessory/tie/green /datum/gear/synthetic/black_tie - path = /obj/item/clothing/accessory/black + path = /obj/item/clothing/accessory/tie/black /datum/gear/synthetic/gold_tie - path = /obj/item/clothing/accessory/gold + path = /obj/item/clothing/accessory/tie/gold /datum/gear/synthetic/red_tie - path = /obj/item/clothing/accessory/red + path = /obj/item/clothing/accessory/tie/red /datum/gear/synthetic/purple_tie - path = /obj/item/clothing/accessory/purple + path = /obj/item/clothing/accessory/tie/purple /datum/gear/synthetic/dress_gloves path = /obj/item/clothing/gloves/marine/dress - //------------EXPERIMENTAL TOOLS--------------- /obj/structure/machinery/cm_vending/own_points/experimental_tools name = "\improper W-Y Experimental Tools Vendor" @@ -584,12 +766,12 @@ GLOBAL_LIST_INIT(cm_vending_synth_tools, list( list("Compact Defibrillator", 15, /obj/item/device/defibrillator/compact, null, VENDOR_ITEM_REGULAR), list("Compact Nailgun kit", 15, /obj/effect/essentials_set/cnailgun, null, VENDOR_ITEM_REGULAR), list("Telescopic Baton", 15, /obj/item/weapon/telebaton, null, VENDOR_ITEM_REGULAR), - list("Surgical Webbing Vest", 15, /obj/item/clothing/accessory/storage/surg_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Surgical Webbing Vest (Blue)", 15, /obj/item/clothing/accessory/storage/surg_vest/blue, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Surgical Drop Pouch", 15, /obj/item/clothing/accessory/storage/surg_vest/drop_green, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Surgical Drop Pouch (Blue)", 15, /obj/item/clothing/accessory/storage/surg_vest/drop_blue, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Surgical Drop Pouch (Black)", 15, /obj/item/clothing/accessory/storage/surg_vest/drop_black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Tool Webbing", 15, /obj/item/clothing/accessory/storage/tool_webbing/equipped, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Surgical Webbing Vest", 15, /obj/item/clothing/accessory/storage/surg_vest, null, VENDOR_ITEM_REGULAR), + list("Surgical Webbing Vest (Blue)", 15, /obj/item/clothing/accessory/storage/surg_vest/blue, null, VENDOR_ITEM_REGULAR), + list("Surgical Drop Pouch", 15, /obj/item/clothing/accessory/storage/surg_vest/drop_green, null, VENDOR_ITEM_REGULAR), + list("Surgical Drop Pouch (Blue)", 15, /obj/item/clothing/accessory/storage/surg_vest/drop_blue, null, VENDOR_ITEM_REGULAR), + list("Surgical Drop Pouch (Black)", 15, /obj/item/clothing/accessory/storage/surg_vest/drop_black, null, VENDOR_ITEM_REGULAR), + list("Tool Webbing", 15, /obj/item/clothing/accessory/storage/tool_webbing/equipped, null, VENDOR_ITEM_REGULAR), list("Logistics IMP Backpack", 15, /obj/item/storage/backpack/marine/satchel/big, null, VENDOR_ITEM_REGULAR), list("Expedition Chestrig", 15, /obj/item/storage/backpack/marine/satchel/intel/chestrig, null, VENDOR_ITEM_REGULAR), )) diff --git a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm index 9f616f7d7bdd..531d4700187e 100644 --- a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm +++ b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm @@ -216,7 +216,7 @@ GLOBAL_LIST_INIT(cm_vending_vehicle_crew_arc, list( listed_products = list( list("PRIMARY FIREARMS", -1, null, null), list("M4RA Battle Rifle", 2, /obj/item/weapon/gun/rifle/m4ra, VENDOR_ITEM_REGULAR), - list("M37A2 Pump Shotgun", 2, /obj/item/weapon/gun/shotgun/pump, VENDOR_ITEM_REGULAR), + list("M37A2 Pump Shotgun", 2, /obj/item/weapon/gun/shotgun/pump/m37a, VENDOR_ITEM_REGULAR), list("M39 Submachine Gun", 2, /obj/item/weapon/gun/smg/m39, VENDOR_ITEM_REGULAR), list("M41A Pulse Rifle MK2", 2, /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_REGULAR), @@ -307,6 +307,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_vehicle_crew, list( list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), @@ -318,7 +319,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_vehicle_crew, list( list("Gyroscopic Stabilizer", 10, /obj/item/attachable/gyro, null, VENDOR_ITEM_REGULAR), list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), list("Masterkey Shotgun", 10, /obj/item/attachable/attached_gun/shotgun, null, VENDOR_ITEM_REGULAR), - list("M37 Wooden Stock", 10, /obj/item/attachable/stock/shotgun, null, VENDOR_ITEM_REGULAR), + list("M37A2 Collapsible Stock", 10, /obj/item/attachable/stock/synth/collapsible, null, VENDOR_ITEM_REGULAR), list("M39 Stock", 10, /obj/item/attachable/stock/smg, null, VENDOR_ITEM_REGULAR), list("M41A Solid Stock", 10, /obj/item/attachable/stock/rifle, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 10, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/food.dm b/code/game/machinery/vending/vendor_types/food.dm index 62ed5124727e..585fc52f7305 100644 --- a/code/game/machinery/vending/vendor_types/food.dm +++ b/code/game/machinery/vending/vendor_types/food.dm @@ -107,6 +107,32 @@ list("Vacuum Flask", 5, /obj/item/reagent_container/food/drinks/flask/vacuumflask, VENDOR_ITEM_REGULAR) ) +/obj/structure/machinery/cm_vending/sorted/boozeomat/populate_product_list_and_boxes(scale) + . = ..() + + // If this is groundside and isn't dynamically changing we will spawn with stock randomly removed from it + if(vend_flags & VEND_STOCK_DYNAMIC) + return + if(Check_WO()) + return + var/turf/location = get_turf(src) + if(location && is_ground_level(location.z)) + random_unstock() + +/// Randomly removes amounts of listed_products and reagents +/obj/structure/machinery/cm_vending/sorted/boozeomat/proc/random_unstock() + for(var/list/vendspec as anything in listed_products) + var/amount = vendspec[2] + if(amount <= 0) + continue + + // Chance to just be empty + if(prob(25)) + vendspec[2] = 0 + continue + + // Otherwise its some amount between 1 and the original amount + vendspec[2] = rand(1, 3) /obj/structure/machinery/cm_vending/sorted/boozeomat/chess name = "\improper Chess-O-Mat" diff --git a/code/game/machinery/vending/vendor_types/intelligence_officer.dm b/code/game/machinery/vending/vendor_types/intelligence_officer.dm index 242c6912231c..824045a0721f 100644 --- a/code/game/machinery/vending/vendor_types/intelligence_officer.dm +++ b/code/game/machinery/vending/vendor_types/intelligence_officer.dm @@ -75,7 +75,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_intelligence_officer, list( GLOBAL_LIST_INIT(cm_vending_clothing_intelligence_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Gloves", 0, /obj/item/clothing/gloves/marine/insulated, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("Insulated Gloves (Yellow/Tan)", 0, /obj/item/clothing/gloves/marine/insulated, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("Insulated Gloves (Black)", 0, /obj/item/clothing/gloves/marine/insulated/black, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/intel, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), @@ -87,6 +88,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_intelligence_officer, list( list("BACKPACK (CHOOSE 1)", 0, null, null, null), list("Expedition Pack", 0, /obj/item/storage/backpack/marine/satchel/intel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), list("Expedition Chestrig", 0, /obj/item/storage/backpack/marine/satchel/intel/chestrig, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), + list("Expedition Satchel", 0, /obj/item/storage/backpack/marine/satchel/intel/expeditionsatchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), list("Radio Telephone Pack", 0, /obj/item/storage/backpack/marine/satchel/rto/io, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), list("HELMET (CHOOSE 1)", 0, null, null, null), @@ -122,10 +124,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_intelligence_officer, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch ", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black) ", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), @@ -159,7 +164,7 @@ GLOBAL_LIST_INIT(cm_vending_guns_intelligence_officer, list( list("PRIMARY FIREARMS", -1, null, null), list("M4RA Battle Rifle", 4, /obj/item/weapon/gun/rifle/m4ra, VENDOR_ITEM_REGULAR), list("M39 Submachine Gun", 4, /obj/item/weapon/gun/smg/m39, VENDOR_ITEM_REGULAR), - list("M37A2 Pump Shotgun", 4, /obj/item/weapon/gun/shotgun/pump, VENDOR_ITEM_REGULAR), + list("M37A2 Pump Shotgun", 4, /obj/item/weapon/gun/shotgun/pump/m37a, VENDOR_ITEM_REGULAR), list("M41A Pulse Rifle MK2", 4, /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_REGULAR), list("PRIMARY AMMUNITION", -1, null, null), diff --git a/code/game/machinery/vending/vendor_types/medical.dm b/code/game/machinery/vending/vendor_types/medical.dm index c052d8b0d8f0..11267e047c52 100644 --- a/code/game/machinery/vending/vendor_types/medical.dm +++ b/code/game/machinery/vending/vendor_types/medical.dm @@ -678,6 +678,13 @@ vendor_theme = VENDOR_THEME_CLF allow_supply_link_restock = FALSE +/obj/structure/machinery/cm_vending/sorted/medical/upp + name = "\improper Medical Equipment Vendor" + desc = "A vending machine dispensing various pieces of medical equipment." + req_one_access = list(ACCESS_UPP_GENERAL) + req_access = null + vendor_theme = VENDOR_THEME_UPP + /obj/structure/machinery/cm_vending/sorted/medical/marinemed name = "\improper ColMarTech MarineMed" desc = "Medical pharmaceutical dispenser with basic medical supplies for marines." @@ -715,6 +722,13 @@ vendor_theme = VENDOR_THEME_CLF allow_supply_link_restock = FALSE +/obj/structure/machinery/cm_vending/sorted/medical/marinemed/upp + name = "\improper Basic Medical Supplies Vendor" + desc = "A vending machine dispensing basic medical supplies." + req_one_access = list(ACCESS_UPP_GENERAL) + req_access = null + vendor_theme = VENDOR_THEME_UPP + /obj/structure/machinery/cm_vending/sorted/medical/blood name = "\improper MM Blood Dispenser" desc = "The MarineMed brand blood dispensary is the premier, top-of-the-line blood dispenser of 2105! Get yours today!" //Don't update this year, the joke is it's old. @@ -748,6 +762,11 @@ vendor_theme = VENDOR_THEME_CLF allow_supply_link_restock = FALSE +/obj/structure/machinery/cm_vending/sorted/medical/blood/upp + req_one_access = list(ACCESS_UPP_GENERAL) + req_access = null + vendor_theme = VENDOR_THEME_UPP + //------------WALL MED VENDORS------------ diff --git a/code/game/machinery/vending/vendor_types/prep_upp/requisitions_upp.dm b/code/game/machinery/vending/vendor_types/prep_upp/requisitions_upp.dm index 1b241ec5938b..facc697fa98e 100644 --- a/code/game/machinery/vending/vendor_types/prep_upp/requisitions_upp.dm +++ b/code/game/machinery/vending/vendor_types/prep_upp/requisitions_upp.dm @@ -41,6 +41,7 @@ list("Webbing", floor(scale * 5), /obj/item/clothing/accessory/storage/webbing, VENDOR_ITEM_REGULAR), list("Knife Webbing", floor(scale * 1), /obj/item/clothing/accessory/storage/knifeharness, VENDOR_ITEM_REGULAR), list("Drop Pouch", floor(scale * 2), /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", floor(scale * 2), /obj/item/clothing/accessory/storage/droppouch/black, VENDOR_ITEM_REGULAR), list("External Webbing", floor(scale * 5), /obj/item/clothing/suit/storage/webbing, VENDOR_ITEM_REGULAR), list("BACKPACKS", -1, null, null), diff --git a/code/game/machinery/vending/vendor_types/prep_upp/uniform_upp.dm b/code/game/machinery/vending/vendor_types/prep_upp/uniform_upp.dm index 31c3bd383613..d33db123f2ba 100644 --- a/code/game/machinery/vending/vendor_types/prep_upp/uniform_upp.dm +++ b/code/game/machinery/vending/vendor_types/prep_upp/uniform_upp.dm @@ -26,6 +26,7 @@ list("Black Webbing Vest", 1, /obj/item/clothing/accessory/storage/black_vest, VENDOR_ITEM_REGULAR), list("Webbing", floor(scale * 2), /obj/item/clothing/accessory/storage/webbing, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0.75, /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0.75, /obj/item/clothing/accessory/storage/droppouch/black, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0.75, /obj/item/clothing/accessory/storage/holster, VENDOR_ITEM_REGULAR), list("ARMOR", -1, null, null), diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index 0e78d2ea8276..a8b519f8ff1b 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -19,7 +19,7 @@ /obj/structure/machinery/cm_vending/sorted/cargo_guns/populate_product_list(scale) listed_products = list( list("PRIMARY FIREARMS", -1, null, null), - list("M37A2 Pump Shotgun", floor(scale * 30), /obj/item/weapon/gun/shotgun/pump, VENDOR_ITEM_REGULAR), + list("M37A2 Pump Shotgun", floor(scale * 30), /obj/item/weapon/gun/shotgun/pump/m37a, VENDOR_ITEM_REGULAR), list("M39 Submachinegun", floor(scale * 60), /obj/item/weapon/gun/smg/m39, VENDOR_ITEM_REGULAR), list("M41A Pulse Rifle MK2", floor(scale * 60), /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_REGULAR), list("M4RA Battle Rifle", floor(scale * 20), /obj/item/weapon/gun/rifle/m4ra, VENDOR_ITEM_REGULAR), @@ -41,8 +41,7 @@ list("M56D Heavy Machine Gun", floor(scale * 2), /obj/item/storage/box/guncase/m56d, VENDOR_ITEM_REGULAR), list("M2C Heavy Machine Gun", floor(scale * 2), /obj/item/storage/box/guncase/m2c, VENDOR_ITEM_REGULAR), list("M240 Incinerator Unit", floor(scale * 2), /obj/item/storage/box/guncase/flamer, VENDOR_ITEM_REGULAR), - list("M79 Grenade Launcher", floor(scale * 3), /obj/item/storage/box/guncase/m79, VENDOR_ITEM_REGULAR), - list("XM51 Breaching Scattergun", floor(scale * 3), /obj/item/storage/box/guncase/xm51, VENDOR_ITEM_REGULAR), + list("M85A1 Grenade Launcher", floor(scale * 3), /obj/item/storage/box/guncase/m85a1, VENDOR_ITEM_REGULAR), list("EXPLOSIVES", -1, null, null), list("M15 Fragmentation Grenade", floor(scale * 2), /obj/item/explosive/grenade/high_explosive/m15, VENDOR_ITEM_REGULAR), @@ -61,15 +60,19 @@ list("M40 MFHS Metal Foam Grenade", floor(scale * 6), /obj/item/explosive/grenade/metal_foam, VENDOR_ITEM_REGULAR), list("Plastic Explosives", floor(scale * 3), /obj/item/explosive/plastic, VENDOR_ITEM_REGULAR), list("Breaching Charge", floor(scale * 2), /obj/item/explosive/plastic/breaching_charge, VENDOR_ITEM_REGULAR), + list("M6H-BRUTE Breaching Rocket", floor(scale * 3), /obj/item/ammo_magazine/rocket/brute, VENDOR_ITEM_REGULAR), list("WEBBINGS", -1, null, null), list("Black Webbing Vest", floor(scale * 2), /obj/item/clothing/accessory/storage/black_vest, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", floor(scale * 2), /obj/item/clothing/accessory/storage/black_vest/brown_vest, VENDOR_ITEM_REGULAR), + list("Leg Pouch", floor(scale * 2), /obj/item/clothing/accessory/storage/black_vest/leg_pouch, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", floor(scale * 2), /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, VENDOR_ITEM_REGULAR), list("Shoulder Holster", floor(scale * 1.5), /obj/item/clothing/accessory/storage/holster, VENDOR_ITEM_REGULAR), list("Webbing", floor(scale * 5), /obj/item/clothing/accessory/storage/webbing, VENDOR_ITEM_REGULAR), list("Black Webbing", floor(scale * 5), /obj/item/clothing/accessory/storage/webbing/black, VENDOR_ITEM_REGULAR), list("Knife Webbing", floor(scale * 1), /obj/item/clothing/accessory/storage/knifeharness, VENDOR_ITEM_REGULAR), list("Drop Pouch", floor(scale * 2), /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", floor(scale * 2), /obj/item/clothing/accessory/storage/droppouch/black, VENDOR_ITEM_REGULAR), list("External Webbing", floor(scale * 5), /obj/item/clothing/suit/storage/webbing, VENDOR_ITEM_REGULAR), list("BACKPACKS", -1, null, null), @@ -122,30 +125,36 @@ list("Large Magazine Pouch", floor(scale * 1), /obj/item/storage/pouch/magazine/large, VENDOR_ITEM_REGULAR), list("Large Shotgun Shell Pouch", floor(scale * 1), /obj/item/storage/pouch/shotgun/large, VENDOR_ITEM_REGULAR), - list("MISCELLANEOUS", -1, null, null), + list("FLARE AND LIGHT", -1, null, null), list("Combat Flashlight", floor(scale * 8), /obj/item/device/flashlight/combat, VENDOR_ITEM_REGULAR), - list("Entrenching Tool", floor(scale * 4), /obj/item/tool/shovel/etool/folded, VENDOR_ITEM_REGULAR), - list("Gas Mask", floor(scale * 10), /obj/item/clothing/mask/gas, VENDOR_ITEM_REGULAR), list("M89-S Signal Flare Pack", floor(scale * 2), /obj/item/storage/box/m94/signal, VENDOR_ITEM_REGULAR), list("M94 Marking Flare Pack", floor(scale * 10), /obj/item/storage/box/m94, VENDOR_ITEM_REGULAR), - list("Machete Scabbard (Full)", floor(scale * 6), /obj/item/storage/large_holster/machete/full, VENDOR_ITEM_REGULAR), - list("MB-6 Folding Barricades (x3)", floor(scale * 3), /obj/item/stack/folding_barricade/three, VENDOR_ITEM_REGULAR), + + list("ESSENTIAL DEVICES", -1, null, null), list("Motion Detector", floor(scale * 4), /obj/item/device/motiondetector, VENDOR_ITEM_REGULAR), list("Data Detector", floor(scale * 4), /obj/item/device/motiondetector/intel, VENDOR_ITEM_REGULAR), list("Binoculars", floor(scale * 2), /obj/item/device/binoculars, VENDOR_ITEM_REGULAR), list("Rangefinder", floor(scale * 1), /obj/item/device/binoculars/range, VENDOR_ITEM_REGULAR), list("Laser Designator", floor(scale * 1), /obj/item/device/binoculars/range/designator, VENDOR_ITEM_REGULAR), + list("Fulton Device Stack", floor(scale * 1), /obj/item/stack/fulton, VENDOR_ITEM_REGULAR), + list("Sentry Gun Network Laptop", 4, /obj/item/device/sentry_computer, VENDOR_ITEM_REGULAR), + list("Spare PDT/L Battle Buddy Kit", floor(scale * 4), /obj/item/storage/box/pdt_kit, VENDOR_ITEM_REGULAR), + list("W-Y brand rechargeable mini-battery", floor(scale * 3), /obj/item/cell/crap, VENDOR_ITEM_REGULAR), + + list("MISCELLANEOUS", -1, null, null), + list("Entrenching Tool", floor(scale * 4), /obj/item/tool/shovel/etool/folded, VENDOR_ITEM_REGULAR), + list("Gas Mask", floor(scale * 10), /obj/item/clothing/mask/gas, VENDOR_ITEM_REGULAR), + list("Machete Scabbard (Full)", floor(scale * 6), /obj/item/storage/large_holster/machete/full, VENDOR_ITEM_REGULAR), + list("MB-6 Folding Barricades (x3)", floor(scale * 3), /obj/item/stack/folding_barricade/three, VENDOR_ITEM_REGULAR), list("Welding Goggles", floor(scale * 3), /obj/item/clothing/glasses/welding, VENDOR_ITEM_REGULAR), list("Fire Extinguisher (Portable)", floor(scale * 3), /obj/item/tool/extinguisher/mini, VENDOR_ITEM_REGULAR), list("High-Capacity Power Cell", floor(scale * 1), /obj/item/cell/high, VENDOR_ITEM_REGULAR), - list("Fulton Device Stack", floor(scale * 1), /obj/item/stack/fulton, VENDOR_ITEM_REGULAR), - list("Sentry Gun Network Laptop", 4, /obj/item/device/sentry_computer, VENDOR_ITEM_REGULAR), + list("Nailgun Magazine (7x45mm)", floor(scale * 4), /obj/item/ammo_magazine/smg/nailgun, VENDOR_ITEM_REGULAR), + + list("SKILL PAMPHLETS", -1, null, null), list("JTAC Pamphlet", floor(scale * 1), /obj/item/pamphlet/skill/jtac, VENDOR_ITEM_REGULAR), list("Engineering Pamphlet", floor(scale * 1), /obj/item/pamphlet/skill/engineer, VENDOR_ITEM_REGULAR), list("Powerloader Certification", 0.75, /obj/item/pamphlet/skill/powerloader, VENDOR_ITEM_REGULAR), - list("Spare PDT/L Battle Buddy Kit", floor(scale * 4), /obj/item/storage/box/pdt_kit, VENDOR_ITEM_REGULAR), - list("W-Y brand rechargeable mini-battery", floor(scale * 3), /obj/item/cell/crap, VENDOR_ITEM_REGULAR), - list("Nailgun Magazine (7x45mm)", floor(scale * 4), /obj/item/ammo_magazine/smg/nailgun, VENDOR_ITEM_REGULAR), list("EXPLOSIVES BOXES", -1, null, null), list("M15 Fragmentation Grenade Packet", 0, /obj/item/storage/box/packet/m15, VENDOR_ITEM_REGULAR), @@ -248,7 +257,6 @@ list("Box Of Buckshot Shells", floor(scale * 56), /obj/item/ammo_magazine/shotgun/buckshot, VENDOR_ITEM_REGULAR), list("Box Of Flechette Shells", floor(scale * 56), /obj/item/ammo_magazine/shotgun/flechette, VENDOR_ITEM_REGULAR), list("Box Of Shotgun Slugs", floor(scale * 56), /obj/item/ammo_magazine/shotgun/slugs, VENDOR_ITEM_REGULAR), - list("Box Of Breaching Slugs", floor(scale * 4), /obj/item/ammo_magazine/shotgun/light/breaching, VENDOR_ITEM_REGULAR), list("M4RA Magazine (10x24mm)", floor(scale * 60), /obj/item/ammo_magazine/rifle/m4ra, VENDOR_ITEM_REGULAR), list("M41A MK2 Magazine (10x24mm)", floor(scale * 100), /obj/item/ammo_magazine/rifle, VENDOR_ITEM_REGULAR), list("M39 HV Magazine (10x20mm)", floor(scale * 100), /obj/item/ammo_magazine/smg/m39, VENDOR_ITEM_REGULAR), @@ -264,8 +272,8 @@ list("M4A3 AP Magazine (9mm)", floor(scale * 2), /obj/item/ammo_magazine/pistol/ap, VENDOR_ITEM_REGULAR), list("EXTENDED AMMUNITION", -1, null, null), - list("M10 HV extended magazine (10x20mm)", floor(scale * 10), /obj/item/ammo_magazine/pistol/m10/extended , VENDOR_ITEM_REGULAR), - list("M10 HV drum magazine (10x20mm)", floor(scale * 8), /obj/item/ammo_magazine/pistol/m10/drum , VENDOR_ITEM_REGULAR), + list("M10 HV Extended Magazine (10x20mm)", floor(scale * 10), /obj/item/ammo_magazine/pistol/m10/extended , VENDOR_ITEM_REGULAR), + list("M10 HV Drum Magazine (10x20mm)", floor(scale * 8), /obj/item/ammo_magazine/pistol/m10/drum , VENDOR_ITEM_REGULAR), list("M39 Extended Magazine (10x20mm)", floor(scale * 10), /obj/item/ammo_magazine/smg/m39/extended, VENDOR_ITEM_REGULAR), list("M4RA Extended Magazine (10x24mm)", floor(scale * 10), /obj/item/ammo_magazine/rifle/m4ra/extended, VENDOR_ITEM_REGULAR), list("M41A MK2 Extended Magazine (10x24mm)", floor(scale * 8), /obj/item/ammo_magazine/rifle/extended, VENDOR_ITEM_REGULAR), @@ -288,7 +296,6 @@ list("M41A MK1 AP Magazine (10x24mm)", floor(scale * 2), /obj/item/ammo_magazine/rifle/m41aMK1/ap, VENDOR_ITEM_REGULAR), list("M56D Drum Magazine", floor(scale * 2), /obj/item/ammo_magazine/m56d, VENDOR_ITEM_REGULAR), list("M2C Box Magazine", floor(scale * 2), /obj/item/ammo_magazine/m2c, VENDOR_ITEM_REGULAR), - list("XM51 Magazine (16g)", floor(scale * 3), /obj/item/ammo_magazine/rifle/xm51, VENDOR_ITEM_REGULAR), list("MAGAZINE BOXES", -1, null, null), list("Magazine Box (M10 x 22)", 0, /obj/item/ammo_box/magazine/m10, VENDOR_ITEM_REGULAR), @@ -313,7 +320,6 @@ list("Shotgun Shell Box (Buckshot x 100)", 0, /obj/item/ammo_box/magazine/shotgun/buckshot, VENDOR_ITEM_REGULAR), list("Shotgun Shell Box (Flechette x 100)", 0, /obj/item/ammo_box/magazine/shotgun/flechette, VENDOR_ITEM_REGULAR), list("Shotgun Shell Box (Slugs x 100)", 0, /obj/item/ammo_box/magazine/shotgun, VENDOR_ITEM_REGULAR), - list("Shotgun Shell Box (16g) (Breaching x 120)", 0, /obj/item/ammo_box/magazine/shotgun/light/breaching, VENDOR_ITEM_REGULAR), list("Magazine Box (88 Mod 4 AP x 16)", 0, /obj/item/ammo_box/magazine/mod88, VENDOR_ITEM_REGULAR), list("Magazine Box (SU-6 x 16)", 0, /obj/item/ammo_box/magazine/su6, VENDOR_ITEM_REGULAR), list("Magazine Box (VP78 x 16)", 0, /obj/item/ammo_box/magazine/vp78, VENDOR_ITEM_REGULAR), @@ -426,7 +432,7 @@ list("Vertical Grip", 9.5, /obj/item/attachable/verticalgrip, VENDOR_ITEM_REGULAR), list("STOCK", -1, null, null), - list("M37 Wooden Stock", 4.5, /obj/item/attachable/stock/shotgun, VENDOR_ITEM_REGULAR), + list("M37A2 Collapsible Stock", 4.5, /obj/item/attachable/stock/synth/collapsible, VENDOR_ITEM_REGULAR), list("M39 Arm Brace", 4.5, /obj/item/attachable/stock/smg/collapsible/brace, VENDOR_ITEM_REGULAR), list("M39 Folding Stock", 4.5, /obj/item/attachable/stock/smg/collapsible, VENDOR_ITEM_REGULAR), list("M39 Stock", 4.5, /obj/item/attachable/stock/smg, VENDOR_ITEM_REGULAR), @@ -487,6 +493,7 @@ list("M3 Pattern Padless Marine Armor", 20, /obj/item/clothing/suit/storage/marine/medium/padless, VENDOR_ITEM_REGULAR), list("M3 Pattern Ridged Marine Armor", 20, /obj/item/clothing/suit/storage/marine/medium/padless_lines, VENDOR_ITEM_REGULAR), list("M3 Pattern Skull Marine Armor", 20, /obj/item/clothing/suit/storage/marine/medium/skull, VENDOR_ITEM_REGULAR), + list("M3 Pattern Smooth Marine Armor", 20, /obj/item/clothing/suit/storage/marine/medium/smooth, VENDOR_ITEM_REGULAR), list("M3-EOD Pattern Heavy Armor", 10, /obj/item/clothing/suit/storage/marine/heavy, VENDOR_ITEM_REGULAR), list("M3-L Pattern Light Armor", 10, /obj/item/clothing/suit/storage/marine/light, VENDOR_ITEM_REGULAR), @@ -515,8 +522,23 @@ list("Heat Absorbent Coif", 10, /obj/item/clothing/mask/rebreather/scarf, VENDOR_ITEM_REGULAR), list("MISCELLANEOUS", -1, null, null), + list("Ballistic goggles", 10, /obj/item/clothing/glasses/mgoggles, VENDOR_ITEM_REGULAR), + list("M1A1 Ballistic goggles", 10, /obj/item/clothing/glasses/mgoggles/v2, VENDOR_ITEM_REGULAR), + list("Prescription ballistic goggles", 10, /obj/item/clothing/glasses/mgoggles/prescription, VENDOR_ITEM_REGULAR), + list("Marine RPG glasses", 10, /obj/item/clothing/glasses/regular, VENDOR_ITEM_REGULAR), + list("M5 Integrated Gas Mask", 10, /obj/item/prop/helmetgarb/helmet_gasmask, VENDOR_ITEM_REGULAR), + list("M10 Helmet Netting", 10, /obj/item/prop/helmetgarb/netting, VENDOR_ITEM_REGULAR), + list("M10 Helmet Rain Cover", 10, /obj/item/prop/helmetgarb/raincover, VENDOR_ITEM_REGULAR), + list("Attachable Dogtags", 15, /obj/item/clothing/accessory/dogtags, VENDOR_ITEM_REGULAR), + list("USCM Flair", 15, /obj/item/prop/helmetgarb/flair_uscm, VENDOR_ITEM_REGULAR), + list("Falling Falcons Shoulder Patch", 15, /obj/item/clothing/accessory/patch/falcon, VENDOR_ITEM_REGULAR), + list("Falling Falcons UA Shoulder Patch", 15, /obj/item/clothing/accessory/patch/falconalt, VENDOR_ITEM_REGULAR), + list("USCM Large Chest Patch", 15, /obj/item/clothing/accessory/patch/uscmlarge, VENDOR_ITEM_REGULAR), + list("USCM Shoulder Patch", 15, /obj/item/clothing/accessory/patch, VENDOR_ITEM_REGULAR), + list("United Americas Shoulder patch", 10, /obj/item/clothing/accessory/patch/ua, VENDOR_ITEM_REGULAR), + list("United Americas Flag Shoulder patch", 10, /obj/item/clothing/accessory/patch/uasquare, VENDOR_ITEM_REGULAR), list("Bedroll", 30, /obj/item/roller/bedroll, VENDOR_ITEM_REGULAR), - list("M5 Camera Gear", 3, /obj/item/device/overwatch_camera, VENDOR_ITEM_REGULAR), + list("M5 Camera Gear", 5, /obj/item/device/overwatch_camera, VENDOR_ITEM_REGULAR), ) /obj/structure/machinery/cm_vending/sorted/uniform_supply/ui_state(mob/user) @@ -573,7 +595,7 @@ listed_products = list( list("PRIMARY FIREARMS", -1, null, null), list("M4RA Battle Rifle", floor(scale * 10), /obj/item/weapon/gun/rifle/m4ra, VENDOR_ITEM_REGULAR), - list("M37A2 Pump Shotgun", floor(scale * 15), /obj/item/weapon/gun/shotgun/pump, VENDOR_ITEM_REGULAR), + list("M37A2 Pump Shotgun", floor(scale * 15), /obj/item/weapon/gun/shotgun/pump/m37a, VENDOR_ITEM_REGULAR), list("M39 Submachine Gun", floor(scale * 30), /obj/item/weapon/gun/smg/m39, VENDOR_ITEM_REGULAR), list("M41A Pulse Rifle MK2", floor(scale * 30), /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_RECOMMENDED), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm index bf0d13a8f0d4..601e7357c376 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm @@ -9,8 +9,10 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list( list("JIMA Planted Flag", 0, /obj/item/defenses/handheld/planted_flag, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), list("UA 42-F Sentry Flamer", 0, /obj/item/defenses/handheld/sentry/flamer, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), list("UA 571-C Sentry Gun", 0, /obj/item/defenses/handheld/sentry, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), + list("M6H-BRUTE Breaching Launcher",0, /obj/item/storage/belt/gun/brutepack/full, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), list("Sentry Upgrade kit", 15, /obj/item/engi_upgrade_kit, null, VENDOR_ITEM_REGULAR), + list("ENGINEERING SUPPLIES", 0, null, null, null), list("Airlock Circuit Board", 2, /obj/item/circuitboard/airlock, null, VENDOR_ITEM_REGULAR), list("APC Circuit Board", 2, /obj/item/circuitboard/apc, null, VENDOR_ITEM_REGULAR), @@ -25,6 +27,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list( list("ES-11 Mobile Fuel Canister", 4, /obj/item/tool/weldpack/minitank, null, VENDOR_ITEM_REGULAR), list("EXPLOSIVES", 0, null, null, null), + list("M5510 Laser-Guided Rocket", 8, /obj/item/ammo_magazine/rocket/brute, null, VENDOR_ITEM_RECOMMENDED), list("M40 HEDP High Explosive Packet (x3 grenades)", 18, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR), list("M40 HIDP Incendiary Packet (x3 grenades)", 18, /obj/item/storage/box/packet/incendiary, null, VENDOR_ITEM_REGULAR), list("M40 WPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR), @@ -63,7 +66,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list( list("VP78 Pistol", 8, /obj/item/storage/box/guncase/vp78, null, VENDOR_ITEM_REGULAR), list("SU-6 Smart Pistol", 12, /obj/item/storage/box/guncase/smartpistol, null, VENDOR_ITEM_REGULAR), list("M240 Incinerator Unit", 12, /obj/item/storage/box/guncase/flamer, null, VENDOR_ITEM_REGULAR), - list("M79 Grenade Launcher", 24, /obj/item/storage/box/guncase/m79, null, VENDOR_ITEM_REGULAR), + list("M85A1 Grenade Launcher", 24, /obj/item/storage/box/guncase/m85a1, null, VENDOR_ITEM_REGULAR), list("M56D Heavy Machine Gun", 24, /obj/item/storage/box/guncase/m56d, null, VENDOR_ITEM_REGULAR), list("CLOTHING ITEMS", 0, null, null, null), @@ -115,9 +118,11 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list( GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/engineer, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/engineer, /obj/item/clothing/shoes/marine/knife, /obj/item/device/radio/headset/almayer/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("Insulated Gloves (Black)", 0, /obj/item/clothing/gloves/marine/insulated/black, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("Insulated Gloves (Yellow/Tan)", 0, /obj/item/clothing/gloves/marine/insulated, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), + list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_MAP, VENDOR_ITEM_MANDATORY), list("HELMET (CHOOSE 1)", 0, null, null, null), list("M10 technician helmet", 0, /obj/item/clothing/head/helmet/marine/tech, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), @@ -169,10 +174,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Small Tool Webbing (Full)", 0, /obj/item/clothing/accessory/storage/tool_webbing/small/equipped, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), @@ -192,25 +200,21 @@ GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( /obj/structure/machinery/cm_vending/clothing/engi/alpha squad_tag = SQUAD_MARINE_1 req_access = list(ACCESS_MARINE_ENGPREP, ACCESS_MARINE_ALPHA) - gloves_type = /obj/item/clothing/gloves/marine/insulated headset_type = /obj/item/device/radio/headset/almayer/marine/alpha/engi /obj/structure/machinery/cm_vending/clothing/engi/bravo squad_tag = SQUAD_MARINE_2 req_access = list(ACCESS_MARINE_ENGPREP, ACCESS_MARINE_BRAVO) - gloves_type = /obj/item/clothing/gloves/marine/insulated headset_type = /obj/item/device/radio/headset/almayer/marine/bravo/engi /obj/structure/machinery/cm_vending/clothing/engi/charlie squad_tag = SQUAD_MARINE_3 req_access = list(ACCESS_MARINE_ENGPREP, ACCESS_MARINE_CHARLIE) - gloves_type = /obj/item/clothing/gloves/marine/insulated headset_type = /obj/item/device/radio/headset/almayer/marine/charlie/engi /obj/structure/machinery/cm_vending/clothing/engi/delta squad_tag = SQUAD_MARINE_4 req_access = list(ACCESS_MARINE_ENGPREP, ACCESS_MARINE_DELTA) - gloves_type = /obj/item/clothing/gloves/marine/insulated headset_type = /obj/item/device/radio/headset/almayer/marine/delta/engi //------------ESSENTIAL SETS--------------- diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm index 7d5cbbd8fcf7..bcba66a6f7cc 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm @@ -10,7 +10,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list( list("M240 Pyrotechnician Support Kit", 0, /obj/item/storage/box/kit/mini_pyro, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), list("M2C Heavy Machine Gun", 0, /obj/item/storage/box/guncase/m2c, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), list("M56D Heavy Machine Gun", 0, /obj/item/storage/box/guncase/m56d, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), - list("M79 Grenade Launcher", 0, /obj/item/storage/box/guncase/m79, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), + list("M85A1 Grenade Launcher", 0, /obj/item/storage/box/guncase/m85a1, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), list("MOU-53 Shotgun", 0, /obj/item/storage/box/guncase/mou53, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), list("XM88 Heavy Rifle", 0, /obj/item/storage/box/guncase/xm88, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), list("Basic Engineering Supplies", 0, /obj/item/storage/box/kit/engineering_supply_kit, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR), @@ -40,7 +40,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list( list("Night Vision Optic", 25, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED), list("ENGINEERING SUPPLIES", 0, null, null, null), - list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR), + list("Insulated Gloves (Yellow/Tan)", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR), + list("Insulated Gloves (Black)", 3, /obj/item/clothing/gloves/marine/insulated/black, null, VENDOR_ITEM_REGULAR), list("Metal x10", 5, /obj/item/stack/sheet/metal/small_stack, null, VENDOR_ITEM_RECOMMENDED), list("Plasteel x10", 7, /obj/item/stack/sheet/plasteel/small_stack, null, VENDOR_ITEM_RECOMMENDED), list("Plastic explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_RECOMMENDED), @@ -106,7 +107,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list( list("M240 Incinerator Unit", 18, /obj/item/storage/box/guncase/flamer, null, VENDOR_ITEM_REGULAR), list("VP78 Pistol", 8, /obj/item/storage/box/guncase/vp78, null, VENDOR_ITEM_REGULAR), list("SU-6 Smart Pistol", 12, /obj/item/storage/box/guncase/smartpistol, null, VENDOR_ITEM_REGULAR), - list("M79 Grenade Launcher", 18, /obj/item/storage/box/guncase/m79, null, VENDOR_ITEM_REGULAR), + list("M85A1 Grenade Launcher", 18, /obj/item/storage/box/guncase/m85a1, null, VENDOR_ITEM_REGULAR), list("RADIO KEYS", 0, null, null, null), list("Engineering Radio Encryption Key", 3, /obj/item/device/encryptionkey/engi, null, VENDOR_ITEM_REGULAR), @@ -133,7 +134,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_leader, list( list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/leader), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("B12 Pattern Armor", 0, /obj/item/clothing/suit/storage/marine/medium/leader, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), + list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_MAP, VENDOR_ITEM_MANDATORY), list("BACKPACK (CHOOSE 1)", 0, null, null, null), list("Backpack", 0, /obj/item/storage/backpack/marine, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), @@ -171,10 +172,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_leader, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm index 1e242d94b8fa..0b3683c044a4 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm @@ -128,7 +128,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_medic, list( list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/medic, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Combat Sterile Gloves", 0, /obj/item/clothing/gloves/marine/medical, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), + list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_MAP, VENDOR_ITEM_MANDATORY), list("ARMOR (CHOOSE 1)", 0, null, null, null), list("Light Armor", 0, /obj/item/clothing/suit/storage/marine/light, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), @@ -173,10 +173,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_medic, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), list("Sterile Mask", 0, /obj/item/clothing/mask/surgical, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm index adf246b34a73..a03cdb43667e 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm @@ -7,7 +7,7 @@ desc = "An automated weapon rack hooked up to a big storage of standard-issue weapons." icon_state = "guns" req_access = list() - req_one_access = list(ACCESS_MARINE_DATABASE, ACCESS_MARINE_PREP) + req_one_access = list(ACCESS_MARINE_GENERAL, ACCESS_MARINE_PREP) hackable = TRUE vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_STOCK_DYNAMIC @@ -18,7 +18,7 @@ listed_products = list( list("PRIMARY FIREARMS", -1, null, null), list("M4RA Battle Rifle", floor(scale * 5), /obj/item/weapon/gun/rifle/m4ra, VENDOR_ITEM_REGULAR), - list("M37A2 Pump Shotgun", floor(scale * 10), /obj/item/weapon/gun/shotgun/pump, VENDOR_ITEM_REGULAR), + list("M37A2 Pump Shotgun", floor(scale * 10), /obj/item/weapon/gun/shotgun/pump/m37a, VENDOR_ITEM_REGULAR), list("M39 Submachine Gun", floor(scale * 10), /obj/item/weapon/gun/smg/m39, VENDOR_ITEM_REGULAR), list("M41A Pulse Rifle MK2", floor(scale * 15), /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_RECOMMENDED), @@ -115,9 +115,12 @@ list("WEBBINGS", -1, null, null), list("Brown Webbing Vest", 1, /obj/item/clothing/accessory/storage/black_vest/brown_vest, VENDOR_ITEM_REGULAR), list("Black Webbing Vest", 1, /obj/item/clothing/accessory/storage/black_vest, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 1, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, VENDOR_ITEM_REGULAR), + list("Black Leg Pouch", 1, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, VENDOR_ITEM_REGULAR), list("Webbing", floor(scale * 2), /obj/item/clothing/accessory/storage/webbing, VENDOR_ITEM_REGULAR), list("Black Webbing", floor(scale * 2), /obj/item/clothing/accessory/storage/webbing/black, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0.75, /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0.75, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0.75, /obj/item/clothing/accessory/storage/holster, VENDOR_ITEM_REGULAR), list("ARMOR", -1, null, null), @@ -202,7 +205,7 @@ list("United Americas Shoulder patch", floor(scale * 10), /obj/item/clothing/accessory/patch/ua, VENDOR_ITEM_REGULAR), list("United Americas Flag Shoulder patch", floor(scale * 10), /obj/item/clothing/accessory/patch/uasquare, VENDOR_ITEM_REGULAR), list("Bedroll", floor(scale * 20), /obj/item/roller/bedroll, VENDOR_ITEM_REGULAR), - list("M5 Camera Gear", floor(scale *0.5), /obj/item/device/overwatch_camera, VENDOR_ITEM_REGULAR), + list("M5 Camera Gear", floor(scale * 2), /obj/item/device/overwatch_camera, VENDOR_ITEM_REGULAR), list("OPTICS", -1, null, null, null), list("Advanced Medical Optic (CORPSMAN ONLY)", floor(scale * 4), /obj/item/device/helmet_visor/medical/advanced, VENDOR_ITEM_REGULAR), @@ -216,7 +219,7 @@ /obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/alpha req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_ALPHA, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO) + req_one_access = list(ACCESS_MARINE_ALPHA, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO) /obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/alpha/populate_product_list(scale) ..() @@ -227,7 +230,7 @@ /obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/bravo req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_BRAVO, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO) + req_one_access = list(ACCESS_MARINE_BRAVO, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO) /obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/bravo/populate_product_list(scale) ..() @@ -238,7 +241,7 @@ /obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/charlie req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO) + req_one_access = list(ACCESS_MARINE_CHARLIE, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO) /obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/charlie/populate_product_list(scale) ..() @@ -249,7 +252,7 @@ /obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/delta req_access = list(ACCESS_MARINE_PREP) - req_one_access = list(ACCESS_MARINE_DELTA, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO) + req_one_access = list(ACCESS_MARINE_DELTA, ACCESS_MARINE_GENERAL, ACCESS_MARINE_CARGO) /obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/delta/populate_product_list(scale) ..() @@ -301,10 +304,9 @@ list("M240 Incinerator Tank", floor(scale * 3), /obj/item/ammo_magazine/flamer_tank, VENDOR_ITEM_REGULAR), list("M56D Drum Magazine", floor(scale * 2), /obj/item/ammo_magazine/m56d, VENDOR_ITEM_REGULAR), list("M2C Box Magazine", floor(scale * 2), /obj/item/ammo_magazine/m2c, VENDOR_ITEM_REGULAR), - list("Box of Breaching Shells (16g)", floor(scale * 2), /obj/item/ammo_magazine/shotgun/light/breaching, VENDOR_ITEM_REGULAR), list("HIRR Baton Slugs", floor(scale * 6), /obj/item/explosive/grenade/slug/baton, VENDOR_ITEM_REGULAR), list("M74 AGM-S Star Shell", floor(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst/starshell, VENDOR_ITEM_REGULAR), - list("M74 AGM-S Hornet Shell", floor(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst/hornet_shell, VENDOR_ITEM_REGULAR), + list("M74 AGM-H Hornet Shell", floor(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst/hornet_shell, VENDOR_ITEM_REGULAR), ) //--------------SQUAD ARMAMENTS VENDOR-------------- @@ -403,7 +405,7 @@ list("Vertical Grip", 3, /obj/item/attachable/verticalgrip, VENDOR_ITEM_REGULAR), list("STOCK", -1, null, null), - list("M37 Wooden Stock", 1.5, /obj/item/attachable/stock/shotgun, VENDOR_ITEM_REGULAR), + list("M37A2 Collapsible Stock", 1.5, /obj/item/attachable/stock/synth/collapsible, VENDOR_ITEM_REGULAR), list("M39 Arm Brace", 1.5, /obj/item/attachable/stock/smg/collapsible/brace, VENDOR_ITEM_REGULAR), list("M39 Stock", 1.5, /obj/item/attachable/stock/smg, VENDOR_ITEM_REGULAR), list("M41A Solid Stock", 1.5, /obj/item/attachable/stock/rifle, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm index a1f2c58583dc..796a0c10d0f6 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), + list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_MAP, VENDOR_ITEM_MANDATORY), list("ARMOR (CHOOSE 1)", 0, null, null, null), list("Light Armor", 0, /obj/item/clothing/suit/storage/marine/light, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("RESTRICTED FIREARMS", 0, null, null, null), list("VP78 Pistol", 15, /obj/item/storage/box/guncase/vp78, null, VENDOR_ITEM_REGULAR), list("SU-6 Smart Pistol", 15, /obj/item/storage/box/guncase/smartpistol, null, VENDOR_ITEM_REGULAR), - list("M79 Grenade Launcher", 30, /obj/item/storage/box/guncase/m79, null, VENDOR_ITEM_REGULAR), + list("M85A1 Grenade Launcher", 30, /obj/item/storage/box/guncase/m85a1, null, VENDOR_ITEM_REGULAR), list("EXPLOSIVES", 0, null, null, null), list("M40 HEDP High Explosive Packet (x3 grenades)", 20, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR), @@ -93,8 +93,11 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Webbing", 10, /obj/item/clothing/accessory/storage/webbing, null, VENDOR_ITEM_REGULAR), list("Black Webbing", 10, /obj/item/clothing/accessory/storage/webbing/black, null, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 15, /obj/item/clothing/accessory/storage/black_vest/brown_vest, null, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 15, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, null, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 15, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, null, VENDOR_ITEM_REGULAR), list("Black Webbing Vest", 15, /obj/item/clothing/accessory/storage/black_vest, null, VENDOR_ITEM_REGULAR), list("Drop Pouch", 10, /obj/item/clothing/accessory/storage/droppouch, null, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 10, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 15, /obj/item/clothing/accessory/storage/holster, null, VENDOR_ITEM_REGULAR), list("Machete Scabbard (Full)", 15, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR), list("Machete Pouch (Full)", 15, /obj/item/storage/pouch/machete/full, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm index feb36db34fff..a3fb6a94c8c9 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm @@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_smartgun, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), + list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_MAP, VENDOR_ITEM_MANDATORY), list("BELT", 0, null, null, null), list("M802 Smartgunner Sidearm Belt", 0, /obj/item/storage/belt/gun/smartgunner/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_MANDATORY), @@ -106,10 +106,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_smartgun, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm index f0f0121ab489..c302765f9591 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list( list("WEAPONS SPECIALIST SETS (CHOOSE 1)", 0, null, null, null), list("Demolitionist Set", 0, /obj/item/storage/box/spec/demolitionist, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR), list("Heavy Grenadier Set", 0, /obj/item/storage/box/spec/heavy_grenadier, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR), + list("SHARP Operator Set", 0, /obj/item/storage/box/spec/sharp_operator, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR), list("Pyro Set", 0, /obj/item/storage/box/spec/pyro, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR), list("Scout Set", 0, /obj/item/storage/box/spec/scout, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR), list("Sniper Set", 0, /obj/item/storage/box/spec/sniper, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), @@ -27,6 +28,11 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list( list("84mm High-Explosive Rocket", 40, /obj/item/ammo_magazine/rocket, null, VENDOR_ITEM_REGULAR), list("84mm White-Phosphorus Rocket", 40, /obj/item/ammo_magazine/rocket/wp, null, VENDOR_ITEM_REGULAR), + list("EXTRA SHARP AMMUNITION", 0, null, null, null), + list("SHARP 9X-E Sticky Explosive Dart magazine (darts)", 40, /obj/item/ammo_magazine/rifle/sharp/explosive, null, VENDOR_ITEM_REGULAR), + list("SHARP 9X-T Sticky incendiary Dart magazine (darts)", 40, /obj/item/ammo_magazine/rifle/sharp/incendiary, null, VENDOR_ITEM_REGULAR), + list("SHARP 9X-F Flechette Dart Magazine (darts)", 40, /obj/item/ammo_magazine/rifle/sharp/flechette, null, VENDOR_ITEM_REGULAR), + list("EXTRA GRENADES", 0, null, null, null), list("M40 HEDP Grenades x6", 40, /obj/effect/essentials_set/hedp_6_pack, null, VENDOR_ITEM_REGULAR), list("M40 HIDP Incendiary Grenades x6", 40, /obj/effect/essentials_set/hidp_6_pack, null, VENDOR_ITEM_REGULAR), @@ -80,7 +86,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_specialist, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), + list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_MAP, VENDOR_ITEM_MANDATORY), list("BACKPACK (CHOOSE 1)", 0, null, null, null), list("Backpack", 0, /obj/item/storage/backpack/marine, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), @@ -111,10 +117,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_specialist, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm index aa4b417e081d..caa1b9a1207c 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("RESTRICTED FIREARMS", 0, null, null, null), list("VP78 Pistol", 10, /obj/item/storage/box/guncase/vp78, null, VENDOR_ITEM_REGULAR), list("SU-6 Smart Pistol", 15, /obj/item/storage/box/guncase/smartpistol, null, VENDOR_ITEM_REGULAR), - list("M79 Grenade Launcher", 30, /obj/item/storage/box/guncase/m79, null, VENDOR_ITEM_REGULAR), + list("M85A1 Grenade Launcher", 30, /obj/item/storage/box/guncase/m85a1, null, VENDOR_ITEM_REGULAR), list("ARMORS", 0, null, null, null), list("M3 B12 Pattern Marine Armor", 30, /obj/item/clothing/suit/storage/marine/medium/leader, null, VENDOR_ITEM_REGULAR), @@ -95,10 +95,12 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( GLOBAL_LIST_INIT(cm_vending_clothing_tl, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/rto), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/rto), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("Insulated Gloves (Yellow/Tan)", 0, /obj/item/clothing/gloves/marine/insulated, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("Insulated Gloves (Black)", 0, /obj/item/clothing/gloves/marine/insulated/black, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("M4 Pattern Armor", 0, /obj/item/clothing/suit/storage/marine/medium/rto, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), - list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), + list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_MAP, VENDOR_ITEM_MANDATORY), list("Essential Fireteam Leader Utilities", 0, /obj/effect/essentials_set/tl, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), list("BELT (CHOOSE 1)", 0, null, null, null), @@ -130,11 +132,14 @@ GLOBAL_LIST_INIT(cm_vending_clothing_tl, list( list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing", 0, /obj/item/clothing/accessory/storage/webbing/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("MASK (CHOOSE 1)", 0, null, null, null), list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), @@ -154,25 +159,21 @@ GLOBAL_LIST_INIT(cm_vending_clothing_tl, list( /obj/structure/machinery/cm_vending/clothing/tl/alpha squad_tag = SQUAD_MARINE_1 req_access = list(ACCESS_MARINE_TL_PREP, ACCESS_MARINE_ALPHA) - gloves_type = /obj/item/clothing/gloves/marine/insulated headset_type = /obj/item/device/radio/headset/almayer/marine/alpha/tl /obj/structure/machinery/cm_vending/clothing/tl/bravo squad_tag = SQUAD_MARINE_2 req_access = list(ACCESS_MARINE_TL_PREP, ACCESS_MARINE_BRAVO) - gloves_type = /obj/item/clothing/gloves/marine/insulated headset_type = /obj/item/device/radio/headset/almayer/marine/bravo/tl /obj/structure/machinery/cm_vending/clothing/tl/charlie squad_tag = SQUAD_MARINE_3 req_access = list(ACCESS_MARINE_TL_PREP, ACCESS_MARINE_CHARLIE) - gloves_type = /obj/item/clothing/gloves/marine/insulated headset_type = /obj/item/device/radio/headset/almayer/marine/charlie/tl /obj/structure/machinery/cm_vending/clothing/tl/delta squad_tag = SQUAD_MARINE_4 req_access = list(ACCESS_MARINE_TL_PREP, ACCESS_MARINE_DELTA) - gloves_type = /obj/item/clothing/gloves/marine/insulated headset_type = /obj/item/device/radio/headset/almayer/marine/delta/tl //------------ESSENTIAL SETS--------------- diff --git a/code/game/machinery/vending/vendor_types/squad_prep/tutorial.dm b/code/game/machinery/vending/vendor_types/squad_prep/tutorial.dm index c1cedd85c7fc..578982e38acd 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/tutorial.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/tutorial.dm @@ -28,3 +28,144 @@ GLOBAL_LIST_INIT(cm_vending_clothing_tutorial, list( /obj/structure/machinery/cm_vending/clothing/tutorial/get_listed_products(mob/user) return GLOB.cm_vending_clothing_tutorial + +//------------GEAR VENDOR--------------- + +GLOBAL_LIST_INIT(cm_vending_gear_medic_sandbox, list( + list("MEDICAL SET (MANDATORY)", 0, null, null, null), + list("Essential Medical Set", 0, /obj/effect/essentials_set/medic, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + + list("FIELD SUPPLIES", 0, null, null, null), + list("Burn Kit", 2, /obj/item/stack/medical/advanced/ointment, null, VENDOR_ITEM_RECOMMENDED), + list("Trauma Kit", 2, /obj/item/stack/medical/advanced/bruise_pack, null, VENDOR_ITEM_RECOMMENDED), + list("Medical Splints", 1, /obj/item/stack/medical/splint, null, VENDOR_ITEM_RECOMMENDED), + list("Blood Bag (O-)", 4, /obj/item/reagent_container/blood/OMinus, null, VENDOR_ITEM_REGULAR), + + list("FIRSTAID KITS", 0, null, null, null), + list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), + list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), + list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), + list("Radiation Firstaid Kit", 6, /obj/item/storage/firstaid/rad, null, VENDOR_ITEM_REGULAR), + + list("PILL BOTTLES", 0, null, null, null), + list("Pill Bottle (Bicaridine)", 5, /obj/item/storage/pill_bottle/bicaridine, null, VENDOR_ITEM_RECOMMENDED), + list("Pill Bottle (Dexalin)", 5, /obj/item/storage/pill_bottle/dexalin, null, VENDOR_ITEM_REGULAR), + list("Pill Bottle (Dylovene)", 5, /obj/item/storage/pill_bottle/antitox, null, VENDOR_ITEM_REGULAR), + list("Pill Bottle (Inaprovaline)", 5, /obj/item/storage/pill_bottle/inaprovaline, null, VENDOR_ITEM_REGULAR), + list("Pill Bottle (Kelotane)", 5, /obj/item/storage/pill_bottle/kelotane, null, VENDOR_ITEM_RECOMMENDED), + list("Pill Bottle (Peridaxon)", 5, /obj/item/storage/pill_bottle/peridaxon, null, VENDOR_ITEM_REGULAR), + list("Pill Bottle (Tramadol)", 5, /obj/item/storage/pill_bottle/tramadol, null, VENDOR_ITEM_RECOMMENDED), + + list("AUTOINJECTORS", 0, null, null, null), + list("Autoinjector (Bicaridine)", 1, /obj/item/reagent_container/hypospray/autoinjector/bicaridine, null, VENDOR_ITEM_REGULAR), + list("Autoinjector (Dexalin+)", 1, /obj/item/reagent_container/hypospray/autoinjector/dexalinp, null, VENDOR_ITEM_REGULAR), + list("Autoinjector (Epinephrine)", 2, /obj/item/reagent_container/hypospray/autoinjector/adrenaline, null, VENDOR_ITEM_REGULAR), + list("Autoinjector (Inaprovaline)", 1, /obj/item/reagent_container/hypospray/autoinjector/inaprovaline, null, VENDOR_ITEM_REGULAR), + list("Autoinjector (Kelotane)", 1, /obj/item/reagent_container/hypospray/autoinjector/kelotane, null, VENDOR_ITEM_REGULAR), + list("Autoinjector (Oxycodone)", 2, /obj/item/reagent_container/hypospray/autoinjector/oxycodone, null, VENDOR_ITEM_REGULAR), + list("Autoinjector (Tramadol)", 1, /obj/item/reagent_container/hypospray/autoinjector/tramadol, null, VENDOR_ITEM_REGULAR), + list("Autoinjector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR), + + list("MEDICAL UTILITIES", 0, null, null, null), + list("MS-11 Smart Refill Tank", 6, /obj/item/reagent_container/glass/minitank, null, VENDOR_ITEM_REGULAR), + list("FixOVein", 7, /obj/item/tool/surgery/FixOVein, null, VENDOR_ITEM_REGULAR), + list("Roller Bed", 4, /obj/item/roller, null, VENDOR_ITEM_REGULAR), + list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR), + list("Stasis Bag", 6, /obj/item/bodybag/cryobag, null, VENDOR_ITEM_REGULAR), + + list("ARMORS", 0, null, null, null), + list("M3 B12 Pattern Marine Armor", 24, /obj/item/clothing/suit/storage/marine/medium/leader, null, VENDOR_ITEM_REGULAR), + list("M4 Pattern Armor", 16, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR), + + list("UTILITIES", 0, null, null, null), + list("Fire Extinguisher (Portable)", 3, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR), + list("Whistle", 3, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), + + list("BINOCULARS", 0, null, null, null), + list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), + + list("HELMET OPTICS", 0, null, null, null), + list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), + + list("PAMPHLETS", 0, null, null, null), + list("Engineering Pamphlet", 15, /obj/item/pamphlet/skill/engineer, null, VENDOR_ITEM_REGULAR), + + )) + +/obj/structure/machinery/cm_vending/gear/medic/tutorial + req_access = null + +/obj/structure/machinery/cm_vending/gear/medic/tutorial/get_listed_products(mob/user) + return GLOB.cm_vending_gear_medic_sandbox + +//------------CLOTHING VENDOR--------------- + +GLOBAL_LIST_INIT(cm_vending_clothing_medic_sandbox, list( + list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/medic, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("Combat Sterile Gloves", 0, /obj/item/clothing/gloves/marine/medical, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), + list("MRE", 0, /obj/item/storage/box/mre, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + + list("ARMOR (CHOOSE 1)", 0, null, null, null), + list("Light Armor", 0, /obj/item/clothing/suit/storage/marine/light, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("Medium Armor", 0, /obj/item/clothing/suit/storage/marine/medium, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED), + list("Heavy Armor", 0, /obj/item/clothing/suit/storage/marine/heavy, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + + list("HELMET (CHOOSE 1)", 0, null, null, null), + list("M10 Corpsman Helmet", 0, /obj/item/clothing/head/helmet/marine/medic, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + list("M10 White Corpsman Helmet", 0, /obj/item/clothing/head/helmet/marine/medic/white, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + + list("BACKPACK (CHOOSE 1)", 0, null, null, null), + list("Medical Backpack", 0, /obj/item/storage/backpack/marine/medic, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), + list("Medical Satchel", 0, /obj/item/storage/backpack/marine/satchel/medic, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), + + list("BELT (CHOOSE 1)", 0, null, null, null), + list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_MANDATORY), + list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_MANDATORY), + + list("POUCHES (CHOOSE 2)", 0, null, null, null), + list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Vial Pouch (Full)", 0, /obj/item/storage/pouch/vials/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Magazine Pouch", 0, /obj/item/storage/pouch/magazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + + list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), + list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Leg Pouch", 0, /obj/item/clothing/accessory/storage/black_vest/leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Leg Pouch (Black)", 0, /obj/item/clothing/accessory/storage/black_vest/black_leg_pouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Black Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + + list("MASK (CHOOSE 1)", 0, null, null, null), + list("Sterile Mask", 0, /obj/item/clothing/mask/surgical, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR) + )) + +/obj/structure/machinery/cm_vending/clothing/medic/tutorial + req_access = null + +/obj/structure/machinery/cm_vending/clothing/medic/tutorial/get_listed_products(mob/user) + return GLOB.cm_vending_clothing_medic_sandbox diff --git a/code/game/machinery/vending/vendor_types/wo_vendors.dm b/code/game/machinery/vending/vendor_types/wo_vendors.dm index f5a8e8b47144..3fbfa56b3464 100644 --- a/code/game/machinery/vending/vendor_types/wo_vendors.dm +++ b/code/game/machinery/vending/vendor_types/wo_vendors.dm @@ -127,7 +127,7 @@ listed_products = list( list("PRIMARY FIREARMS", -1, null, null), list("M4RA Battle Rifle", floor(scale * 10), /obj/item/weapon/gun/rifle/m4ra, VENDOR_ITEM_REGULAR), - list("M37A2 Pump Shotgun", floor(scale * 15), /obj/item/weapon/gun/shotgun/pump, VENDOR_ITEM_REGULAR), + list("M37A2 Pump Shotgun", floor(scale * 15), /obj/item/weapon/gun/shotgun/pump/m37a, VENDOR_ITEM_REGULAR), list("M39 Submachine Gun", floor(scale * 30), /obj/item/weapon/gun/smg/m39, VENDOR_ITEM_REGULAR), list("M41A Pulse Rifle MK1", floor(scale * 30), /obj/item/weapon/gun/rifle/m41aMK1, VENDOR_ITEM_REGULAR), list("M41A Pulse Rifle MK2", floor(scale * 30), /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_REGULAR), @@ -189,6 +189,11 @@ list("84mm High-Explosive Rocket", floor(scale * 1), /obj/item/ammo_magazine/rocket, VENDOR_ITEM_REGULAR), list("84mm White-Phosphorus Rocket", floor(scale * 1), /obj/item/ammo_magazine/rocket/wp, VENDOR_ITEM_REGULAR), + list("EXTRA SHARP AMMUNITION", -1, null, null, null), + list("SHARP 9X-E Sticky Explosive Dart magazine (darts)", round(scale * 1.5), /obj/item/ammo_magazine/rifle/sharp/explosive, null, VENDOR_ITEM_REGULAR), + list("SHARP 9X-T Sticky incendiary Dart magazine (darts)", round(scale * 1), /obj/item/ammo_magazine/rifle/sharp/incendiary, null, VENDOR_ITEM_REGULAR), + list("SHARP 9X-F Flechette Dart Magazine (darts)", round(scale * 1), /obj/item/ammo_magazine/rifle/sharp/flechette, null, VENDOR_ITEM_REGULAR), + list("EXTRA GRENADES", -1, null, null, null), list("M40 HEDP Grenade Pack (x6)", floor(scale * 1.5), /obj/effect/essentials_set/hedp_6_pack, VENDOR_ITEM_REGULAR), list("M40 HIDP Grenade Pack (x6)", floor(scale * 1.5), /obj/effect/essentials_set/hidp_6_pack, VENDOR_ITEM_REGULAR), diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 986060dc64b5..33119816e748 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -104,6 +104,10 @@ W.acid_spray_act() continue + if(istype(atm, /obj/item/explosive/mine/sharp)) + var/obj/item/explosive/mine/sharp/sharp_mine = atm + sharp_mine.prime() + // Humans? if(isliving(atm)) //For extinguishing mobs on fire var/mob/living/M = atm @@ -207,6 +211,7 @@ var/mob/living/carbon/human/hooman = carbone var/damage = damage_amount + var/sizzle_sound = pick('sound/effects/sizzle1.ogg', 'sound/effects/sizzle2.ogg') var/buffed_splash = FALSE var/datum/effects/acid/acid_effect = locate() in hooman.effects_list @@ -227,6 +232,7 @@ if (buffed_splash) hooman.KnockDown(stun_duration) to_chat(hooman, SPAN_HIGHDANGER("The acid coating on you starts bubbling and sizzling wildly!")) + playsound(hooman, sizzle_sound, 75, 1) hooman.last_damage_data = cause_data hooman.apply_armoured_damage(damage * 0.25, ARMOR_BIO, BURN, "l_foot", 20) hooman.apply_armoured_damage(damage * 0.25, ARMOR_BIO, BURN, "r_foot", 20) @@ -307,6 +313,9 @@ var/barricade_damage = 40 var/in_weather = FALSE + /// Set when attempting to clear acid off of an item with extinguish_acid() to prevent an item being extinguished multiple times in a tick. + COOLDOWN_DECLARE(clear_acid) + //Sentinel weakest acid /obj/effect/xenomorph/acid/weak name = "weak acid" @@ -332,6 +341,8 @@ ticks_left = 9 handle_weather() RegisterSignal(SSdcs, COMSIG_GLOB_WEATHER_CHANGE, PROC_REF(handle_weather)) + RegisterSignal(acid_t, COMSIG_ITEM_PICKUP, PROC_REF(attempt_pickup)) + RegisterSignal(acid_t, COMSIG_MOVABLE_MOVED, PROC_REF(move_acid)) RegisterSignal(acid_t, COMSIG_PARENT_QDELETING, PROC_REF(cleanup)) START_PROCESSING(SSoldeffects, src) @@ -344,6 +355,20 @@ SIGNAL_HANDLER qdel(src) +/// Called by COMSIG_MOVABLE_MOVED when an item with acid is moved +/obj/effect/xenomorph/acid/proc/move_acid() + SIGNAL_HANDLER + var/turf/new_loc = get_turf(acid_t) + if(!new_loc) + qdel(src) + return + forceMove(new_loc) + +/// Called by COMSIG_ITEM_PICKUP when an item is attempted to be picked up but has acid +/obj/effect/xenomorph/acid/proc/attempt_pickup() + SIGNAL_HANDLER + return COMSIG_ITEM_PICKUP_CANCELLED + /obj/effect/xenomorph/acid/proc/handle_weather() SIGNAL_HANDLER @@ -408,10 +433,19 @@ visible_message(SPAN_XENOWARNING("\The [acid_t] begins to crumble under the acid!")) /obj/effect/xenomorph/acid/proc/finish_melting() - visible_message(SPAN_XENODANGER("[acid_t] collapses under its own weight into a puddle of goop and undigested debris!")) playsound(src, "acid_hit", 25, TRUE) + if(istype(acid_t, /obj/item/weapon/gun)) + var/obj/item/weapon/gun/acid_gun = acid_t + if(acid_gun.has_second_wind) + visible_message(SPAN_XENODANGER("[acid_t] loses its shine as the acid bubbles against it.")) + acid_gun.has_second_wind = FALSE + playsound(src, 'sound/weapons/handling/gun_jam_click.ogg', 25, TRUE) + qdel(src) + return + if(istype(acid_t, /turf)) + visible_message(SPAN_XENODANGER("[acid_t] is terribly damaged by the acid covering it!")) if(istype(acid_t, /turf/closed/wall)) var/turf/closed/wall/wall = acid_t new /obj/effect/acid_hole(wall) @@ -421,21 +455,40 @@ else if (istype(acid_t, /obj/structure/girder)) var/obj/structure/girder/girder = acid_t + visible_message(SPAN_XENODANGER("[acid_t] collapses and falls in on itself as the acid melts its frame!")) girder.dismantle() else if(istype(acid_t, /obj/structure/window/framed)) var/obj/structure/window/framed/window = acid_t + visible_message(SPAN_XENODANGER("[acid_t] audibly cracks and fails as the acid bubbles against it!")) window.deconstruct(disassembled = FALSE) else if(istype(acid_t, /obj/structure/barricade)) + visible_message(SPAN_XENODANGER("[acid_t] cracks and fragments as the acid sizzles against it!")) pass() // Don't delete it, just damaj else for(var/mob/mob in acid_t) mob.forceMove(loc) + visible_message(SPAN_XENODANGER("[acid_t] collapses under its own weight into a puddle of goop and undigested debris!")) qdel(acid_t) qdel(src) +/obj/effect/xenomorph/acid/extinguish_acid() + if(!COOLDOWN_FINISHED(src, clear_acid)) + return + COOLDOWN_START(src, clear_acid, 1 SECONDS) + + if(istype(acid_t, /obj/item/weapon/gun)) + var/obj/item/weapon/gun/acid_gun = acid_t + if(!acid_gun.has_second_wind) + visible_message(SPAN_XENODANGER("[acid_t] seems unaffected and continues to deform!")) + return FALSE + else + visible_message(SPAN_XENODANGER("The sizzling on [acid_t] quiets as the acid is sprayed off of it!")) + qdel(src) + return TRUE + /obj/effect/xenomorph/boiler_bombard name = "???" desc = "" diff --git a/code/game/objects/effects/decals/cleanable/cleanable.dm b/code/game/objects/effects/decals/cleanable/cleanable.dm index b65fe5db9721..bb9715c3bb35 100644 --- a/code/game/objects/effects/decals/cleanable/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable/cleanable.dm @@ -20,11 +20,8 @@ GLOBAL_LIST_EMPTY(cleanable_decal_cache) var/cleaned_up = FALSE keep_as_object = TRUE - garbage = TRUE - keep_as_object = TRUE - /obj/effect/decal/cleanable/Initialize(mapload, ...) . = ..() if (random_icon_states && length(src.random_icon_states) > 0) @@ -38,6 +35,8 @@ GLOBAL_LIST_EMPTY(cleanable_decal_cache) if(C && !can_place_cleanable(C)) return INITIALIZE_HINT_QDEL + SSweather.add_cleanable(src) + place_cleanable(T, overlay_on_initialize) /obj/effect/decal/cleanable/Destroy() @@ -75,6 +74,9 @@ GLOBAL_LIST_EMPTY(cleanable_decal_cache) /obj/effect/decal/cleanable/proc/cleanup_cleanable() cleaned_up = TRUE + + SSweather.cleanable_list -= src + if(!cleanable_turf?.cleanables || !cleanable_turf?.cleanables[cleanable_type]) return clear_overlay() @@ -90,7 +92,7 @@ GLOBAL_LIST_EMPTY(cleanable_decal_cache) overlayed_image.pixel_y = pixel_y if(color) overlayed_image.color = color - + cleanable_turf.overlays += overlayed_image moveToNullspace() // This obj should not be on the turf for performance @@ -98,3 +100,14 @@ GLOBAL_LIST_EMPTY(cleanable_decal_cache) if(overlayed_image) cleanable_turf.overlays -= overlayed_image overlayed_image = null + +/// Gives the cleanable a nice fadeout before disappearing +/obj/effect/decal/cleanable/proc/fade_and_disappear() + var/fade_time = rand(3, 7) SECONDS + + if(overlayed_image) + clear_overlay() + forceMove(cleanable_turf) + + animate(src, alpha = 0, time = fade_time) + QDEL_IN(src, fade_time) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 1c4fdc44157b..352a99a39fac 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -5,14 +5,14 @@ density = FALSE anchored = TRUE layer = TURF_LAYER - icon = 'icons/obj/objects.dmi' + icon = 'icons/effects/effects.dmi' icon_state = "shards" /obj/effect/decal/cleanable/ash name = "ashes" desc = "Ashes to ashes, dust to dust, and into space." gender = PLURAL - icon = 'icons/obj/objects.dmi' + icon = 'icons/effects/effects.dmi' icon_state = "ash" anchored = TRUE @@ -37,6 +37,19 @@ icon_state = "greenglow" light_range = 1 light_color = COLOR_LIGHT_GREEN + +/obj/effect/decal/cleanable/dirt/alt_dirt + icon_state = "stain" + +/obj/effect/decal/cleanable/dirt/alt_dirt/stain + icon_state = "stain_alt" + +/obj/effect/decal/cleanable/dirt/alt_dirt/goo + icon_state = "goo" + +/obj/effect/decal/cleanable/dirt/alt_dirt/goo/goo_alt + icon_state = "goo_alt" + /obj/effect/decal/cleanable/flour name = "flour" desc = "It's still good. Four second rule!" diff --git a/code/game/objects/effects/decals/heavy_cable_decal.dm b/code/game/objects/effects/decals/heavy_cable_decal.dm new file mode 100644 index 000000000000..d803d749431f --- /dev/null +++ b/code/game/objects/effects/decals/heavy_cable_decal.dm @@ -0,0 +1,39 @@ +/// Hybrisa Decals + +/obj/effect/decal/heavy_cable + name = "large power cable" + desc = "This cable is tough. It cannot be cut with simple hand tools." + icon = 'icons/obj/pipes/power_cond_heavy.dmi' + icon_state = "node" + layer = BELOW_ATMOS_PIPE_LAYER +// plane = FLOOR_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/decal/heavy_cable/node_north + icon_state = "0-1" +/obj/effect/decal/heavy_cable/node_south + icon_state = "0-2" +/obj/effect/decal/heavy_cable/node_east + icon_state = "0-4" +/obj/effect/decal/heavy_cable/node_west + icon_state = "0-8" +/obj/effect/decal/heavy_cable/cable_horizontal + icon_state = "1-2" +/obj/effect/decal/heavy_cable/cable_vertical + icon_state = "4-8" +/obj/effect/decal/heavy_cable/node_n_e + icon_state = "1-4" +/obj/effect/decal/heavy_cable/node_n_w + icon_state = "1-8" +/obj/effect/decal/heavy_cable/node_s_e + icon_state = "2-4" +/obj/effect/decal/heavy_cable/node_s_w + icon_state = "2-8" +/obj/effect/decal/heavy_cable/node_n_e_s + icon_state = "1-2-4" +/obj/effect/decal/heavy_cable/node_n_w_e + icon_state = "1-4-8" +/obj/effect/decal/heavy_cable/node_s_w_e + icon_state = "1-2-8" +/obj/effect/decal/heavy_cable/node_n_s_e_w + icon_state = "1-2-4-8" diff --git a/code/game/objects/effects/decals/hybrisa_decals.dm b/code/game/objects/effects/decals/hybrisa_decals.dm index d5c647e931a6..02194c4bb53c 100644 --- a/code/game/objects/effects/decals/hybrisa_decals.dm +++ b/code/game/objects/effects/decals/hybrisa_decals.dm @@ -224,3 +224,15 @@ icon_state = "colorable_rug" layer = TURF_LAYER density = FALSE + +/// Large TWE Logo + +/obj/effect/decal/hybrisa/TWE_logo_large + icon = 'icons/effects/3WE_logo_tile.dmi' + icon_state = "twe_logo_c" + +/obj/effect/decal/hybrisa/TWE_logo_large/directional + icon_state = "twe_logo_directional" + +/obj/effect/decal/hybrisa/TWE_logo_large/directional_1 + icon_state = "twe_logo_directional1" diff --git a/code/game/objects/effects/decals/posters.dm b/code/game/objects/effects/decals/posters.dm index cf4c08a6db60..b16b038f0f0d 100644 --- a/code/game/objects/effects/decals/posters.dm +++ b/code/game/objects/effects/decals/posters.dm @@ -243,3 +243,10 @@ /obj/structure/sign/poster/nspa/Initialize() serial_number = pick(85,86,87) .=..() + +/obj/structure/sign/poster/upp + icon_state = "poster88" + +/obj/structure/sign/poster/upp/Initialize() + serial_number = pick(88,89,90,91,92,93,94,95,96,97,98,99,100) + .=..() diff --git a/code/game/objects/effects/decals/posters/poster_list.dm b/code/game/objects/effects/decals/posters/poster_list.dm index 1d7700ec1070..76453747f88f 100644 --- a/code/game/objects/effects/decals/posters/poster_list.dm +++ b/code/game/objects/effects/decals/posters/poster_list.dm @@ -446,3 +446,68 @@ Template icon_state="poster87" name = "NSPA poster" desc = "A recruitment poster for the NSPA. One Law, One Duty, One Force—Join the NSPA." + +/datum/poster/poster_88 + icon_state="poster88" + name = "The Stars Are Ours" + desc = "A giant man wearing an EVA suit holds fast with a waving flag of the UPP." + +/datum/poster/poster_89 + icon_state="poster89" + name = "The Stars Are Ours" + desc = "A stylized depiction of the Solar System and the stars." + +/datum/poster/poster_90 + icon_state="poster90" + name = "Trust In The Strength Of The Union" + desc = "A stylized depiction of the UPP star." + +/datum/poster/poster_91 + icon_state="poster91" + name = "Through The Union Our Power Is Secured" + desc = "A stylized depiction of the UPP's flag and the words, 'Our Unity is the dream of all Peoples. Trust in the strength of ther Union.'" + +/datum/poster/poster_92 + icon_state="poster92" + name = "We Forge A Path Into the Stars" + desc = "The head of a man in a UPPAC EVA suit smiles looking not at you, but up to the right of the poster." + +/datum/poster/poster_93 + icon_state="poster93" + name = "Our Militaries Secures Our Future" + desc = "A UPPAC Ground Forces soldier stands, rifle at the ready with a defiant and steel-eyed look on his face. The UPP star is in the background." + +/datum/poster/poster_94 + icon_state="poster94" + name = "The People's Armed Collective Is Our Backbone" + desc = "UPPAC Ground Forces soldiers, one of whom is a woman and none of whom have a clear race, stare forward stoically." + +/datum/poster/poster_95 + icon_state="poster95" + name = "The People's Armed Collective Is Our Backbone" + desc = "UPPAC Ground Forces soldiers, one of whom is a woman and none of whom have a clear race, stare forward stoically. The poster reads, 'The People's Armed Collective represent us all in the sacred war of liberation and defense of the People's Union." + +/datum/poster/poster_96 + icon_state="poster96" + name = "Ever Vigilant Against Capitalist Forces" + desc = "A decrepit and desiccated, near claw-like hand reaches towards a stylized solar star shaped into the UPP star. The poster reads, 'Even in its death throes, we must remain vigilant of the encroachment of capitalist forces." + +/datum/poster/poster_97 + icon_state="poster97" + name = "Ever Vigilant Against The Stooges of Capitalism and Imperialism" + desc = "A warped screaming eagle made to look like a vulture bears its talons over Earth which has the UPP roundel super-imposed over it. The poster reads, 'The UA will not break the resolve of the people." + +/datum/poster/poster_98 + icon_state="poster98" + name = "The Stars Are Ours" + desc = "A giant man wearing an EVA suit holds fast with a waving flag of the UPP." + +/datum/poster/poster_99 + icon_state="poster99" + name = "The Stars Are Ours" + desc = "A stylized depiction of the Solar System and the stars." + +/datum/poster/poster_100 + icon_state="poster100" + name = "We Forge A Path Into the Stars" + desc = "The head of a man in a UPPAC EVA suit smiles looking not at you, but up to the right of the poster." diff --git a/code/game/objects/effects/decals/strata_decals.dm b/code/game/objects/effects/decals/strata_decals.dm index 76da6b20f973..ef47193be1eb 100644 --- a/code/game/objects/effects/decals/strata_decals.dm +++ b/code/game/objects/effects/decals/strata_decals.dm @@ -3,6 +3,8 @@ layer = TURF_LAYER anchored = TRUE + + /obj/effect/decal/strata_decals/catwalk/prison //For finding and replacing prison catwalk objects since they nasty icon = 'icons/turf/floors/strata_floor.dmi' icon_state = "catwalk" @@ -28,7 +30,14 @@ /obj/effect/decal/strata_decals/grasses icon_state = "tufts" name = "some foliage" - desc = "A few brave tufts of snow grass." + desc = "A few brave tufts of grass." + +/obj/effect/decal/strata_decals/mud_corner + icon_state = "soro_mud_innercorner" + name = "mud" + desc = null + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + keep_as_object = TRUE ////////////////INDOORS STUFF//////////////////// diff --git a/code/game/objects/effects/decals/warning_stripes.dm b/code/game/objects/effects/decals/warning_stripes.dm index 4bce8e807b51..4ce5f6319777 100644 --- a/code/game/objects/effects/decals/warning_stripes.dm +++ b/code/game/objects/effects/decals/warning_stripes.dm @@ -83,6 +83,7 @@ unacidable = TRUE icon = 'icons/turf/overlays.dmi' layer = TURF_LAYER + keep_as_object = TRUE /obj/effect/decal/sand_overlay/sand1 icon_state = "sand1_s" diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index 1ad4ed34127a..b2da80e40706 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -328,6 +328,7 @@ var/burn_damage = 40 var/applied_fire_stacks = 5 var/xeno_yautja_reduction = 0.75 + var/reagent = new /datum/reagent/napalm/ut() /obj/effect/particle_effect/smoke/phosphorus/Initialize(mapload, oldamount, datum/cause_data/new_cause_data, intensity, max_intensity) burn_damage = min(burn_damage, max_intensity - intensity) // Applies reaction limits @@ -340,6 +341,9 @@ burn_damage = 30 xeno_yautja_reduction = 0.5 +/obj/effect/particle_effect/smoke/phosphorus/sharp + reagent = new /datum/reagent/napalm/blue() + /obj/effect/particle_effect/smoke/phosphorus/Move() . = ..() for(var/mob/living/carbon/affected_mob in get_turf(src)) @@ -370,7 +374,6 @@ if(isyautja(affected_mob) || isxeno(affected_mob)) damage *= xeno_yautja_reduction - var/reagent = new /datum/reagent/napalm/ut() affected_mob.burn_skin(damage) affected_mob.adjust_fire_stacks(applied_fire_stacks, reagent) affected_mob.IgniteMob() @@ -789,6 +792,9 @@ /datum/effect_system/smoke_spread/phosphorus/weak smoke_type = /obj/effect/particle_effect/smoke/phosphorus/weak +/datum/effect_system/smoke_spread/phosphorus/sharp + smoke_type = /obj/effect/particle_effect/smoke/phosphorus/sharp + /datum/effect_system/smoke_spread/cn20 smoke_type = /obj/effect/particle_effect/smoke/cn20 diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm index b8738de68564..80b8bd256af8 100644 --- a/code/game/objects/effects/landmarks/landmarks.dm +++ b/code/game/objects/effects/landmarks/landmarks.dm @@ -65,6 +65,7 @@ /obj/effect/landmark/observer_start/Initialize() . = ..() GLOB.observer_starts += src + new /obj/effect/landmark/spycam_start(loc) /obj/effect/landmark/observer_start/Destroy() GLOB.observer_starts -= src diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm index de78bf062af7..d53b8eaf1788 100644 --- a/code/game/objects/effects/landmarks/survivor_spawner.dm +++ b/code/game/objects/effects/landmarks/survivor_spawner.dm @@ -42,6 +42,7 @@ hostile = TRUE equipment = /datum/equipment_preset/survivor/clf synth_equipment = /datum/equipment_preset/synth/survivor/clf + CO_equipment = /datum/equipment_preset/survivor/clf/coordinator intro_text = list("

You are a survivor of a crash landing!

",\ "You are NOT aware of the xenomorph threat.",\ "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") @@ -57,6 +58,7 @@ hostile = TRUE equipment = /datum/equipment_preset/survivor/clf/leader synth_equipment = /datum/equipment_preset/synth/survivor/clf + CO_equipment = /datum/equipment_preset/survivor/clf/coordinator intro_text = list("

You are a survivor of a crash landing!

",\ "You are NOT aware of the xenomorph threat.",\ "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") @@ -72,6 +74,7 @@ hostile = TRUE equipment = /datum/equipment_preset/survivor/clf/engineer synth_equipment = /datum/equipment_preset/synth/survivor/clf + CO_equipment = /datum/equipment_preset/survivor/clf/coordinator intro_text = list("

You are a survivor of a crash landing!

",\ "You are NOT aware of the xenomorph threat.",\ "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") @@ -87,6 +90,7 @@ hostile = TRUE equipment = /datum/equipment_preset/survivor/clf/medic synth_equipment = /datum/equipment_preset/synth/survivor/clf + CO_equipment = /datum/equipment_preset/survivor/clf/coordinator intro_text = list("

You are a survivor of a crash landing!

",\ "You are NOT aware of the xenomorph threat.",\ "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") @@ -376,7 +380,7 @@ /obj/effect/landmark/survivor_spawner/bigred_crashed_pmc icon_state = "surv_wy" - equipment = /datum/equipment_preset/survivor/pmc + equipment = /datum/equipment_preset/survivor/pmc/standard synth_equipment = /datum/equipment_preset/synth/survivor/pmc intro_text = list("

You are a survivor of a crash landing!

",\ "You are NOT aware of the xenomorph threat.",\ @@ -446,13 +450,13 @@ //Shivas Panic Room Survivors// -/obj/effect/landmark/survivor_spawner/shivas_panic_room_pmc +/obj/effect/landmark/survivor_spawner/shivas_panic_room_commando icon_state = "surv_wy" - equipment = /datum/equipment_preset/survivor/pmc/shivas + equipment = /datum/equipment_preset/survivor/pmc/commando_shivas intro_text = list("

You are the last living security element on the Colony!

",\ "You are aware of the xenomorph threat.",\ "Your primary objective is to survive the outbreak.") - story_text = "You are a mercenary stationed on 'Ifrit' by Weyland-Yutani. This whole outbreak has been a giant mess, you and all other Company personnel ran to the Operations Panic Room, until you heard shooting outside and closed the shutters. You are running low on food, water and ammunition for the weapons. While you were assigned to protecting the people taking shelter in the Panic Room, the rest of your team was spread out throughout the colony. You have not seen any of them since. In their attempts at trying to breach in, the so called 'xenomorphs' have tried attacking the shutters, but to no avail. They will soon try again. You must survive and find a way to contact Weyland-Yutani." + story_text = "You are a commando stationed on 'Ifrit' by Weyland-Yutani. This whole outbreak has been a giant mess, you and all other Company personnel ran to the Operations Panic Room, until you heard shooting outside and closed the shutters. You are running low on food, water and ammunition for the weapons. While you were assigned to protecting the people taking shelter in the Panic Room, the rest of your team was spread out throughout the colony. You have not seen any of them since. In their attempts at trying to breach in, the so called 'xenomorphs' have tried attacking the shutters, but to no avail. They will soon try again. You must survive and find a way to contact Weyland-Yutani." spawn_priority = SPAWN_PRIORITY_VERY_HIGH @@ -563,6 +567,11 @@ equipment = /datum/equipment_preset/survivor/forecon/squad_leader spawn_priority = SPAWN_PRIORITY_HIGH +// Trijent UPP insert + +/obj/effect/landmark/survivor_spawner/upp + icon_state = "surv_upp" + /obj/effect/landmark/survivor_spawner/upp/soldier icon_state = "surv_upp" equipment = /datum/equipment_preset/survivor/upp/soldier @@ -612,3 +621,116 @@ "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_VERY_HIGH + +/// IASF /// + +/obj/effect/landmark/survivor_spawner/twe + icon_state = "surv_twe" + +/obj/effect/landmark/survivor_spawner/twe/iasf/paratrooper + equipment = /datum/equipment_preset/survivor/iasf/paratrooper + synth_equipment = /datum/equipment_preset/synth/survivor/iasf_synth + CO_equipment = /datum/equipment_preset/survivor/hybrisa/iasf_commander + intro_text = list("

You are a member of the IASF Parachute Regiment!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive.") + story_text = "

Outpost Souter was your final posting before withdrawal. With Weyland-Yutani buying out Hybrisa, the TWE began pulling its forces off-world — the IASF included. Your Regiment was standing down, preparing to hand over control during the transition. Then the outbreak hit. You've spent the last weeks barely holding the outpost together, repelling wave after wave while sheltering what few survivors you could. Now, only your squad remains. The outpost is falling apart, the armoury's dry, and the dropship in the hangar still has no fuel. A distress signal was sent over a week ago. All you can do now is hold your ground — and pray someone answers.

" + spawn_priority = SPAWN_PRIORITY_LOW + +/obj/effect/landmark/survivor_spawner/twe/iasf/engi + equipment = /datum/equipment_preset/survivor/iasf/engi + synth_equipment = /datum/equipment_preset/synth/survivor/iasf_synth + CO_equipment = /datum/equipment_preset/survivor/hybrisa/iasf_commander + intro_text = list("

You are a member of the IASF Parachute Regiment!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive.") + story_text = "

Outpost Souter was your final posting before withdrawal. With Weyland-Yutani buying out Hybrisa, the TWE began pulling its forces off-world — the IASF included. Your Regiment was standing down, preparing to hand over control during the transition. Then the outbreak hit. You've spent the last weeks barely holding the outpost together, repelling wave after wave while sheltering what few survivors you could. Now, only your squad remains. The outpost is falling apart, the armoury's dry, and the dropship in the hangar still has no fuel. A distress signal was sent over a week ago. All you can do now is hold your ground — and pray someone answers.

" + spawn_priority = SPAWN_PRIORITY_MEDIUM + + +/obj/effect/landmark/survivor_spawner/twe/iasf/medic + equipment = /datum/equipment_preset/survivor/iasf/medic + synth_equipment = /datum/equipment_preset/synth/survivor/iasf_synth + CO_equipment = /datum/equipment_preset/survivor/hybrisa/iasf_commander + intro_text = list("

You are a member of the IASF Parachute Regiment!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive.") + story_text = "

Outpost Souter was your final posting before withdrawal. With Weyland-Yutani buying out Hybrisa, the TWE began pulling its forces off-world — the IASF included. Your Regiment was standing down, preparing to hand over control during the transition. Then the outbreak hit. You've spent the last weeks barely holding the outpost together, repelling wave after wave while sheltering what few survivors you could. Now, only your squad remains. The outpost is falling apart, the armoury's dry, and the dropship in the hangar still has no fuel. A distress signal was sent over a week ago. All you can do now is hold your ground — and pray someone answers.

" + spawn_priority = SPAWN_PRIORITY_MEDIUM + +/obj/effect/landmark/survivor_spawner/twe/iasf/pilot + equipment = /datum/equipment_preset/survivor/iasf/pilot + synth_equipment = /datum/equipment_preset/synth/survivor/iasf_synth + CO_equipment = /datum/equipment_preset/survivor/hybrisa/iasf_commander + intro_text = list("

You are a member of the IASF Parachute Regiment!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive.") + story_text = "

Outpost Souter was your final posting before withdrawal. With Weyland-Yutani buying out Hybrisa, the TWE began pulling its forces off-world — the IASF included. Your Regiment was standing down, preparing to hand over control during the transition. Then the outbreak hit. You've spent the last weeks barely holding the outpost together, repelling wave after wave while sheltering what few survivors you could. Now, only your squad remains. The outpost is falling apart, the armoury's dry, and the dropship in the hangar still has no fuel. A distress signal was sent over a week ago. All you can do now is hold your ground — and pray someone answers.

" + spawn_priority = SPAWN_PRIORITY_HIGH + +/obj/effect/landmark/survivor_spawner/twe/iasf/squad_leader + equipment = /datum/equipment_preset/survivor/iasf/squad_leader + synth_equipment = /datum/equipment_preset/synth/survivor/iasf_synth + CO_equipment = /datum/equipment_preset/survivor/hybrisa/iasf_commander + intro_text = list("

You are a member of the IASF Parachute Regiment!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive.") + story_text = "

Outpost Souter was your final posting before withdrawal. With Weyland-Yutani buying out Hybrisa, the TWE began pulling its forces off-world — the IASF included. Your Regiment was standing down, preparing to hand over control during the transition. Then the outbreak hit. You've spent the last weeks barely holding the outpost together, repelling wave after wave while sheltering what few survivors you could. Now, only your squad remains. The outpost is falling apart, the armoury's dry, and the dropship in the hangar still has no fuel. A distress signal was sent over a week ago. All you can do now is hold your ground — and pray someone answers.

" + spawn_priority = SPAWN_PRIORITY_VERY_HIGH + +/// Soro UPP - SOF - Survivors + +/obj/effect/landmark/survivor_spawner/SOF_survivor/soldier + equipment = /datum/equipment_preset/survivor/upp/SOF_survivor/soldier + synth_equipment = /datum/equipment_preset/synth/survivor/upp/SOF_synth + intro_text = list("You are a member of a UPP SOF QRF team!",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south west, which was carrying additional weapons") + story_text = "You are part of an SOF QRF team—of the Union of Progressive Peoples, deployed alongside the CEC to build garrisons on distant worlds. On the return trip from the frontier, you receive a distress signal from the Union colony of 'Sorokyne Strata' on the planet 'Thermae I' (LV-976). Your team is sent to investigate.

\ +Intel suggests CANC separatists or a UA/3WE incursion, but as you touch down in the hangar, something feels wrong. No welcome party. No usual hustle of a working colony. Nothing to suggest an incursion of any kind.

\ +Your mission is clear—find out what happened to your supply ship and comrades, retrieve your equipment, and uncover the truth of what really happened to the colony." + spawn_priority = SPAWN_PRIORITY_LOW + +/obj/effect/landmark/survivor_spawner/SOF_survivor/sapper + equipment = /datum/equipment_preset/survivor/upp/SOF_survivor/sapper + synth_equipment = /datum/equipment_preset/synth/survivor/upp/SOF_synth + intro_text = list("You are a member of a UPP SOF QRF team!",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south west, which was carrying additional weapons") + story_text = "You are part of an SOF QRF team—of the Union of Progressive Peoples, deployed alongside the CEC to build garrisons on distant worlds. On the return trip from the frontier, you receive a distress signal from the Union colony of 'Sorokyne Strata' on the planet 'Thermae I' (LV-976). Your team is sent to investigate.

\ +Intel suggests CANC separatists or a UA/3WE incursion, but as you touch down in the hangar, something feels wrong. No welcome party. No usual hustle of a working colony. Nothing to suggest an incursion of any kind.

\ +Your mission is clear—find out what happened to your supply ship and comrades, retrieve your equipment, and uncover the truth of what really happened to the colony." + spawn_priority = SPAWN_PRIORITY_MEDIUM + +/obj/effect/landmark/survivor_spawner/SOF_survivor/medic + equipment = /datum/equipment_preset/survivor/upp/SOF_survivor/medic + synth_equipment = /datum/equipment_preset/synth/survivor/upp/SOF_synth + intro_text = list("You are a member of a UPP SOF QRF team!",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south west, which was carrying additional weapons") + story_text = "You are part of an SOF QRF team—of the Union of Progressive Peoples, deployed alongside the CEC to build garrisons on distant worlds. On the return trip from the frontier, you receive a distress signal from the Union colony of 'Sorokyne Strata' on the planet 'Thermae I' (LV-976). Your team is sent to investigate.

\ +Intel suggests CANC separatists or a UA/3WE incursion, but as you touch down in the hangar, something feels wrong. No welcome party. No usual hustle of a working colony. Nothing to suggest an incursion of any kind.

\ +Your mission is clear—find out what happened to your supply ship and comrades, retrieve your equipment, and uncover the truth of what really happened to the colony." + spawn_priority = SPAWN_PRIORITY_MEDIUM + +/obj/effect/landmark/survivor_spawner/SOF_survivor/specialist + equipment = /datum/equipment_preset/survivor/upp/SOF_survivor/specialist + synth_equipment = /datum/equipment_preset/synth/survivor/upp/SOF_synth + intro_text = list("You are a member of a UPP SOF QRF team!",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south west, which was carrying additional weapons") + story_text = "You are part of an SOF QRF team—of the Union of Progressive Peoples, deployed alongside the CEC to build garrisons on distant worlds. On the return trip from the frontier, you receive a distress signal from the Union colony of 'Sorokyne Strata' on the planet 'Thermae I' (LV-976). Your team is sent to investigate.

\ +Intel suggests CANC separatists or a UA/3WE incursion, but as you touch down in the hangar, something feels wrong. No welcome party. No usual hustle of a working colony. Nothing to suggest an incursion of any kind.

\ +Your mission is clear—find out what happened to your supply ship and comrades, retrieve your equipment, and uncover the truth of what really happened to the colony." + spawn_priority = SPAWN_PRIORITY_HIGH + +/obj/effect/landmark/survivor_spawner/SOF_survivor/squad_leader + equipment = /datum/equipment_preset/survivor/upp/SOF_survivor/squad_leader + synth_equipment = /datum/equipment_preset/synth/survivor/upp/SOF_synth + intro_text = list("You are a member of a UPP SOF QRF team!",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south west, which was carrying additional weapons") + story_text = "You are part of an SOF QRF team—of the Union of Progressive Peoples, deployed alongside the CEC to build garrisons on distant worlds. On the return trip from the frontier, you receive a distress signal from the Union colony of 'Sorokyne Strata' on the planet 'Thermae I' (LV-976). Your team is sent to investigate.

\ +Intel suggests CANC separatists or a UA/3WE incursion, but as you touch down in the hangar, something feels wrong. No welcome party. No usual hustle of a working colony. Nothing to suggest an incursion of any kind.

\ +Your mission is clear—find out what happened to your supply ship and comrades, retrieve your equipment, and uncover the truth of what really happened to the colony." + spawn_priority = SPAWN_PRIORITY_VERY_HIGH diff --git a/code/game/objects/effects/spawners/random.dm b/code/game/objects/effects/spawners/random.dm index 10f14ea69cca..bb2d50e1f164 100644 --- a/code/game/objects/effects/spawners/random.dm +++ b/code/game/objects/effects/spawners/random.dm @@ -229,7 +229,7 @@ /obj/item/toy/sword,\ /obj/item/reagent_container/food/snacks/grown/ambrosiadeus,\ /obj/item/reagent_container/food/snacks/grown/ambrosiavulgaris,\ - /obj/item/clothing/accessory/horrible,\ + /obj/item/clothing/accessory/tie/horrible,\ /obj/item/clothing/shoes/slippers,\ /obj/item/clothing/shoes/slippers_worn,\ /obj/item/clothing/head/collectable/tophat/super) @@ -268,11 +268,7 @@ icon_state = "loot_goggles" /obj/effect/spawner/random/goggles/item_to_spawn() - return pick(prob(4);/obj/item/clothing/glasses/thermal/syndi/bug_b_gone,\ - prob(4);/obj/item/clothing/glasses/thermal/syndi,\ - prob(4);/obj/item/clothing/glasses/thermal/monocle,\ - prob(4);/obj/item/clothing/glasses/thermal/eyepatch,\ - prob(4);/obj/item/clothing/glasses/welding/superior,\ + return pick(prob(4);/obj/item/clothing/glasses/welding/superior,\ prob(4);/obj/item/clothing/glasses/hud/security/jensenshades,\ prob(4);/obj/item/clothing/glasses/meson/refurbished,\ prob(4);/obj/item/clothing/glasses/science,\ @@ -525,7 +521,7 @@ /obj/item/weapon/gun/rifle/m41a = /obj/item/ammo_magazine/rifle, /obj/item/weapon/gun/shotgun/combat = null, /obj/item/weapon/gun/pistol/vp78 = /obj/item/ammo_magazine/pistol/vp78, - /obj/item/weapon/gun/launcher/grenade/m81/m79 = null + /obj/item/weapon/gun/launcher/grenade/m81/m85a1 = null ) /obj/effect/spawner/random/gun/special/lowchance @@ -579,7 +575,6 @@ /obj/effect/spawner/random/warhead name = "random orbital warhead" desc = "This is a random orbital warhead." - icon = 'icons/obj/items/new_assemblies.dmi' icon = 'icons/obj/structures/props/almayer/almayer_props.dmi' icon_state = "ob_warhead_1" spawn_on_roundstart = TRUE diff --git a/code/game/objects/effects/spawners/wo_spawners/supplies.dm b/code/game/objects/effects/spawners/wo_spawners/supplies.dm index 299c120af227..8bfab0bf880a 100644 --- a/code/game/objects/effects/spawners/wo_spawners/supplies.dm +++ b/code/game/objects/effects/spawners/wo_spawners/supplies.dm @@ -99,7 +99,7 @@ /obj/effect/landmark/wo_supplies/guns/rare/flamer icon_state = "m240" icon = 'icons/obj/items/weapons/guns/guns_by_faction/USCM/flamers.dmi' - stuff = list(/obj/item/weapon/gun/flamer) + stuff = list(/obj/item/weapon/gun/flamer/m240) /obj/effect/landmark/wo_supplies/guns/rare/hpr icon_state = "m41ae2" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8099fb2fe7b1..cf0c58f08dd8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -67,6 +67,8 @@ var/flags_item = NO_FLAGS /// This is used to determine on which slots an item can fit. var/flags_equip_slot = NO_FLAGS + ///Last slot that item was equipped to (aka sticky slot) + var/last_equipped_slot //Since any item can now be a piece of clothing, this has to be put here so all items share it. /// This flag is used for various clothing/equipment item stuff @@ -336,6 +338,8 @@ if(isstorage(loc)) var/obj/item/storage/S = loc S.remove_from_storage(src, user.loc, user) + else if(isturf(loc) && HAS_TRAIT(user, TRAIT_HAULED)) + return throwing = 0 @@ -408,15 +412,37 @@ appearance_flags &= ~NO_CLIENT_COLOR //So saturation/desaturation etc. effects affect it. -// called just as an item is picked up (loc is not yet changed) +/// Called just as an item is picked up (loc is not yet changed) and will return TRUE if the pickup wasn't canceled. /obj/item/proc/pickup(mob/user, silent) SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) + if((SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user)) & COMSIG_ITEM_PICKUP_CANCELLED) + if(!silent) + to_chat(user, SPAN_WARNING("Can't pick [src] up!")) + balloon_alert(user, "can't pick up") + return FALSE SEND_SIGNAL(user, COMSIG_MOB_PICKUP_ITEM, src) setDir(SOUTH)//Always rotate it south. This resets it to default position, so you wouldn't be putting things on backwards if(pickup_sound && !silent && src.loc?.z) playsound(src, pickup_sound, pickupvol, pickup_vary) do_pickup_animation(user) + return TRUE + +///Helper function for updating last_equipped_slot when item is drawn from storage +/obj/item/proc/set_last_equipped_slot_of_storage(obj/item/storage/storage_item) + if(!isitem(storage_item)) + return + + var/obj/item/storage_item_storage = storage_item + while(isitem(storage_item_storage.loc)) // for stuff like pouches + storage_item_storage = storage_item_storage.loc + + if(!storage_item_storage) + return + //don't put the fucking clothes back into the backpack we just pulled it out from + if(!isclothing(src)) + last_equipped_slot = slot_to_in_storage_slot(storage_item_storage.last_equipped_slot) + else + last_equipped_slot = storage_item_storage.last_equipped_slot // called when this item 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. /obj/item/proc/on_exit_storage(obj/item/storage/S as obj) @@ -428,6 +454,7 @@ S.flags_atom &= ~USES_HEARING var/atom/location = S.get_loc_turf() do_drop_animation(location) + set_last_equipped_slot_of_storage(S) // called when this item is added into a storage item, which is passed on as S. The loc variable is already set to the storage item. /obj/item/proc/on_enter_storage(obj/item/storage/S as obj) @@ -463,6 +490,9 @@ SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) + if(is_valid_sticky_slot(slot)) + last_equipped_slot = slot + if(item_action_slot_check(user, slot)) add_verb(user, verbs) for(var/v in verbs) diff --git a/code/game/objects/items/XMAS.dm b/code/game/objects/items/XMAS.dm index 69192c170b2a..08db6921bdd9 100644 --- a/code/game/objects/items/XMAS.dm +++ b/code/game/objects/items/XMAS.dm @@ -112,7 +112,7 @@ /obj/item/toy/prize/ripley, /obj/item/toy/prize/seraph, /obj/item/toy/spinningtoy, - /obj/item/clothing/accessory/horrible, + /obj/item/clothing/accessory/tie/horrible, /obj/item/clothing/shoes/slippers, /obj/item/clothing/shoes/slippers_worn, /obj/item/clothing/head/collectable/tophat/super, diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index ccdc4f40b182..efa6342f6c86 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -101,28 +101,39 @@ /obj/structure/closet/bodybag/attackby(obj/item/W, mob/user) if(HAS_TRAIT(W, TRAIT_TOOL_PEN)) var/prior_label_text - var/datum/component/label/labelcomponent = src.GetComponent(/datum/component/label) - if(labelcomponent) + var/datum/component/label/labelcomponent = GetComponent(/datum/component/label) + if(labelcomponent && labelcomponent.has_label()) prior_label_text = labelcomponent.label_name - var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label", prior_label_text)) - if(tmp_label == "" || !tmp_label) - to_chat(user, SPAN_NOTICE("You're going to need to use wirecutters to remove the label.")) + var/tmp_label = tgui_input_text(user, "Enter a label for [src]", "Label", prior_label_text, MAX_NAME_LEN, ui_state=GLOB.not_incapacitated_state) + if(isnull(tmp_label)) + return // Canceled + if(!tmp_label) + if(prior_label_text) + to_chat(user, SPAN_NOTICE("You're going to need to use wirecutters to remove the label.")) return if(length(tmp_label) > MAX_NAME_LEN) to_chat(user, SPAN_WARNING("The label can be at most [MAX_NAME_LEN] characters long.")) - else - user.visible_message(SPAN_NOTICE("[user] labels [src] as \"[tmp_label]\"."), - SPAN_NOTICE("You label [src] as \"[tmp_label]\".")) - AddComponent(/datum/component/label, tmp_label) - playsound(src, "paper_writing", 15, TRUE) + return + if(prior_label_text == tmp_label) + to_chat(user, SPAN_WARNING("The label already says \"[tmp_label]\".")) + return + user.visible_message(SPAN_NOTICE("[user] labels [src] as \"[tmp_label]\"."), + SPAN_NOTICE("You label [src] as \"[tmp_label]\".")) + msg_admin_niche("[key_name(usr)] changed [src]'s name to [tmp_label] [ADMIN_JMP(src)]") + AddComponent(/datum/component/label, tmp_label) + playsound(src, "paper_writing", 15, TRUE) return + else if(HAS_TRAIT(W, TRAIT_TOOL_WIRECUTTERS)) - to_chat(user, SPAN_NOTICE("You cut the tag off the bodybag.")) - src.overlays.Cut() - var/datum/component/label/labelcomponent = src.GetComponent(/datum/component/label) - if(labelcomponent) - labelcomponent.remove_label() + overlays.Cut() + var/datum/component/label/labelcomponent = GetComponent(/datum/component/label) + if(labelcomponent && labelcomponent.has_label()) + log_admin("[key_name(usr)] has removed label from [src].") + user.visible_message(SPAN_NOTICE("[user] cuts the tag off of the [name]."), + SPAN_NOTICE("You cut the tag off the [name].")) + labelcomponent.clear_label() return + else if(istype(W, /obj/item/weapon/zombie_claws)) open() @@ -258,33 +269,43 @@ /obj/structure/closet/bodybag/cryobag/update_icon() . = ..() // Bump up a living player in the bag to layer of an actual corpse and not just an accidentally coverable prop - if(stasis_mob) - layer = LYING_BETWEEN_MOB_LAYER - else + + overlays.Cut() // makes sure any previous triage cards are removed + + if(!stasis_mob) layer = initial(layer) + return + + layer = LYING_BETWEEN_MOB_LAYER + + if(stasis_mob.holo_card_color && !opened) + var/image/holo_card_icon = image('icons/obj/bodybag.dmi', src, "cryocard_[stasis_mob.holo_card_color]") + + if(!holo_card_icon) // makes sure an icon was actually located + return + + overlays |= holo_card_icon /obj/structure/closet/bodybag/cryobag/open() - var/mob/living/L = locate() in contents - if(L) - L.in_stasis = FALSE - stasis_mob = null - STOP_PROCESSING(SSobj, src) . = ..() + if(stasis_mob) + stasis_mob.in_stasis = FALSE + UnregisterSignal(stasis_mob, COMSIG_HUMAN_TRIAGE_CARD_UPDATED) + stasis_mob = null + STOP_PROCESSING(SSobj, src) if(used > max_uses) new /obj/item/trash/used_stasis_bag(loc) qdel(src) -/obj/structure/closet/bodybag/cryobag/store_mobs(stored_units) // overriding this +/obj/structure/closet/bodybag/cryobag/store_mobs(stored_units) + . = ..() var/list/mobs_can_store = list() - for(var/mob/living/carbon/human/H in loc) - if(H.buckled) - continue - if(H.stat == DEAD) // dead, nope + for(var/mob/living/carbon/human/human in loc) + if(human.buckled || (human.stat == DEAD)) continue - mobs_can_store += H - var/mob/living/carbon/human/mob_to_store + mobs_can_store += human if(length(mobs_can_store)) - mob_to_store = pick(mobs_can_store) + var/mob/living/carbon/human/mob_to_store = pick(mobs_can_store) mob_to_store.forceMove(src) stored_units += mob_size return stored_units @@ -292,11 +313,13 @@ /obj/structure/closet/bodybag/cryobag/close() . = ..() last_use = used + 1 - var/mob/living/carbon/human/H = locate() in contents - if(H) - stasis_mob = H + for(var/mob/living/carbon/human/human in contents) + stasis_mob = human + // Uses RegisterSignal with an override, just in case the human escaped the last bag without calling open() somehow + RegisterSignal(human, COMSIG_HUMAN_TRIAGE_CARD_UPDATED, PROC_REF(update_icon), TRUE) START_PROCESSING(SSobj, src) update_icon() + return /obj/structure/closet/bodybag/cryobag/process() used++ diff --git a/code/game/objects/items/books/book.dm b/code/game/objects/items/books/book.dm index d41ded938eb7..937ecba84fe6 100644 --- a/code/game/objects/items/books/book.dm +++ b/code/game/objects/items/books/book.dm @@ -45,7 +45,7 @@ to_chat(user, SPAN_NOTICE("The pages of [title] have been cut out!")) return if(src.dat) - show_browser(user, "Owner: [author].
[dat]", "window=book", width = 800, height = 600) + show_browser(user, "Author: [author].
[dat]","[title]", "window=book", width = 800, height = 600) user.visible_message("[user] opens \"[src.title]\".") onclose(user, "book") else @@ -271,3 +271,98 @@ ``` "} live_preview = TRUE + +/obj/item/lore_book/punch_out + name = "Punch Out! Surviving An Ejection." + book_title = "Punch Out!" + icon_state = "punch_out" + book_author = "Sgt. Nalu \"Puali\" Kaiona" + book_contents = @{" +``` +“Make maluna o ka hilahila.” +(Death before dishonor) +- Scratched beneath Kaiona’s UD-4L Dropship, the 'Lucky Number 7.' +``` + +This motto served as a reminder of fallen comrades, especially 1st Lt. +Jackson Bridges, killed in the Dog War against the CANC. If you’re reading +this, you may one day be fighting for your own survival too. Here's how to +live to tell the tale. + + +*** + +# Step 1: Slow Down + +If your dropship's still responsive, reduce your speed as +much as possible. Damaged controls? Don't push 'em too hard or you'll stall and +fall outta the sky-- **or worse**. If slowing down isn't an option, move to +step 2 and say your prayers. + +# Step 2: Eject! + +Cram yourself into the seat as +best you can and yank the ejection handle. The glass'll be blown off the bird +and shatter, and you'll be shot out of the top like a missile. The system'll +automatically eject your partner too-- or what's left of 'em, Hold on tight, it +ain't over yet. + +# Step 3: Drop and Glide + +Once you're clear of the bird, Check your +surroundings-- if it's all blue sea, ride the chair and prepare for a splash, +it'll inflate a raft. Otherwise, ditch it and go for land, flatter is better. +Remember to bend the knees and prepare to handle the momentum when you hit the +dirt. + +# Step 4: Injuries + +The ejection seat does it's best to get you out of the +bird **alive**, but chances are good it beat you up pretty good in the +process. Stay calm, and try to staunch any heavy bleeds before you hit the dirt, +you aren't gonna want to stop when you land. + +# Step 5: Stay alert, Stay Mobile + +Whatever took you out could be on the lookout to finish you off, first thing you +need to do when you hit the dirt is get to cover, Prog pilots are known to try +to hit a gun strafe as you land. + +
+
+ +*** + +# Step 6: Survive on the ground + +Chances are good you're in hostile territory, +with limited supplies, some injuries, and a nasty adrenaline crash. You need to +secure the gear from your SSK and follow standard SERE procedures, keep your +head low, stay sharp, and stay mobile. + +
+ +Remember, +**survival isn't luck, it's all skill.** + +
+ +**Now get a move on.** + +*** + + + +**Sgt. Kaiona's Current Deployment:** + +
+ +Sgt. Kaiona is currently stationed aboard the USS Almayer with the 2nd +Company, 2nd Battalion, Falling Falcons, 4th Brigade of the 4th United +States Colonial Marine Division. He provides aerial support and helps manage +dropship operations aboard the vessel. +
+ +*** + + "} diff --git a/code/game/objects/items/books/manuals.dm b/code/game/objects/items/books/manuals.dm index d28bb4cd5262..c09554c8f45f 100644 --- a/code/game/objects/items/books/manuals.dm +++ b/code/game/objects/items/books/manuals.dm @@ -9,12 +9,36 @@ unique = 1 +//Engineering related manuals + +/obj/item/book/manual/engineering_guide + name = "Tools, Radiowaves And Electrical Grids" + desc = "A book containing basic and yet important information regarding engineering procedures." + icon_state = "book_engineering" + item_state = "book_engineering" + author = "Colonial Marines Engineer Association" + title = "Tools, Radiowaves And Electrical Grids" + + dat = {" + + + + + + + + + + "} + + /obj/item/book/manual/engineering_construction - name = "Station Repairs and Construction" + name = "Construction Destruction" + desc = "A detailed guide containing a series of diagrams and tables regarding the required resources and proper procedures to building, from barricades to floor tiles." icon_state = "book_engineering" item_state = "book_engineering" - author = "Engineering Encyclopedia" - title = "Station Repairs and Construction" + author = "Colonial Marines Engineer Association" + title = "Construction Destruction: The guide" dat = {" @@ -22,7 +46,7 @@ - + @@ -31,11 +55,75 @@ /obj/item/book/manual/engineering_hacking - name = "Hacking" + name = "Hack-A-Mole: How Electrical Components Work" + desc = "A guide specialized on the knowledge of 'hacking', being that of airlocks, vending machines, or anything else that your multi tool is capable of messing with." icon_state = "book_hacking" item_state = "book_hacking" - author = "Engineering Encyclopedia" - title = "Hacking" + author = "Colonial Marines Engineer Association" + title = "Hack-A-Mole: How Electrical Components Work" + + dat = {" + + + + + + + + + + + "} + +/obj/item/book/manual/ordnance + name = "Ordnance for Recruits or: How I Learned to Stop Worrying and Love the Maxcap" + desc = "A manual containing absurdly detailed information regarding the production, assembly, and handling of all kinds of explosive devices." + icon_state = "book_engineering2" + item_state = "book_engineering2" + author = "Colonial Marines Engineer Association" + title = "Ordnance for Recruits or: How I Learned to Stop Worrying and Love the Maxcap" + + dat = {" + + + + + + + + + + + "} + +/obj/item/book/manual/comms + name = "Subspace Telecommunications And You" + desc = "An instructions manual regarding the use of communication channels and advice on how to be properly heard over the radiowaves while speaking all kinds of languages." + icon_state = "book_particle" + item_state = "book_particle" + author = "Colonial Marines Engineer Association" + title = "Subspace Telecommunications And You" + + dat = {" + + + + + + + + + + + "} + +/obj/item/book/manual/reactor + name = "How to React: Steps to maintain a S-52 Fusion Reactor" + desc = "A manual containing information on how to maintain S-52 Fusion Ship Reactors, very popular engines among space vessels." + icon_state = "book_supermatter" + item_state = "book_supermatter" + author = "Colonial Marines Engineer Association" + title = "How to React: Steps to maintain a S-52 Fusion Reactor" dat = {" @@ -43,7 +131,7 @@ - + @@ -51,11 +139,65 @@ "} +/obj/item/book/manual/orbital_cannon_manual + name = "USCM Orbital Bombardment System Manual" + desc = "This book contains instructions on how to operate a standard-issue United States Colonial Marines Orbital Artillery Cannon." + icon_state = "book_engineering2" + item_state = "book_engineering2" + author = "Colonial Marines Engineer Association" + title = "USCM Orbital Bombardment System Manual" + + dat = {" + + + + + +

Guide to the USCM Orbital Bombardment System

+ +

Step by step instructions:

+
    +
  1. Load a warhead in the Orbital Cannon Tray (Powerloader required).
  2. +
  3. Load the required amount of solid fuel in the Orbital Cannon Tray (See Orbital Cannon Console).
  4. +
  5. Open the Orbital Cannon Console's interface.
  6. +
  7. Load the Tray into the Cannon.
  8. +
  9. Chamber the Tray's content into the cannon barrel. (can't be undone!)
  10. +
  11. The CIC staff can now fire the Orbital Cannon from any overwatch console.
  12. +
  13. After firing, unload the Tray from the Orbital Cannon.
  14. +
  15. Inspect the Tray to make sure it is empty and operational.
  16. +
+ +

Troubleshooting:

+ +
    +
  • If you've loaded a tray with an incorrect payload, you can still unload the tray's payload as long as it hasn't been chambered.
  • +
  • If an incorrect payload is chambered, it can only be removed by firing it.
  • +
  • If the Orbital Cannon Console has no power, check the Weapon Control Room's APC.
  • +
  • If the Orbital Cannon Console is broken, contact USCM HQ for a replacement.
  • +
  • In case of direct damage to the Orbital Cannon itself, do not attempt to use or repair the cannon.
  • +
  • In case of hull breach or fire, make sure to remove the Cannon's payload and move it to a safe location.
  • +
  • If the Orbital Tray jams, apply lubricant to the conveyor belt.
  • +
  • If a cable of the Orbital Cannon System is severed, contact USCM HQ for a replacement.
  • +
  • If the Cannon's cable connector breaks, turn off the Orbital Cannon Console and contact USCM HQ for a replacement.
  • +
+ + + + "} + + /obj/item/book/manual/ripley_build_and_repair name = "APLU \"Ripley\" Construction and Operation Manual" - icon_state = "rdbook" - item_state = "book_dark" - author = "Randall Varn, Einstein Engines Senior Mechanic" + icon_state = "book_borg" + item_state = "book_borg" + author = "Senior Mechanic Harry Snow, Weyland-Yutani Corporation" title = "APLU \"Ripley\" Construction and Operation Manual" dat = {" @@ -129,33 +271,197 @@ "} -/obj/item/book/manual/research_and_development - name = "Research and Development 101" - icon_state = "rdbook" - item_state = "book_white" - author = "Dr. L. Ight" - title = "Research and Development 101" +/obj/item/book/manual/atmospipes + name = "Pipes and You: Getting To Know Your Scary Tools" + icon_state = "book_piping" + item_state = "book_piping" + author = "Colonial Marines Engineer Association" + title = "Pipes and You: Getting To Know Your Scary Tools" + dat = {" + + + + - dat = {" +

Contents

+
    +
  1. Author's Foreword
  2. +
  3. Basic Piping
  4. +
  5. Insulated Pipes
  6. +
  7. Atmospherics Devices
  8. +
  9. Heat Exchange Systems
  10. +
  11. Final Checks
  12. +

- - +

HOW TO NOT SUCK QUITE SO HARD AT ATMOSPHERICS


+ Or: What the fuck does a "passive gate" do?

- - - + Alright. It has come to my attention that a variety of people are unsure of what a "pipe" is and what it does. + Apparently, there is an unnatural fear of these arcane devices and their "gases." Spooky, spooky. So, + this will tell you what every device constructable by an ordinary pipe dispenser within atmospherics actually does. + You are not going to learn what to do with them to be the super best person ever, or how to play guitar with passive gates, + or something like that. Just what stuff does.

- - "} +

Basic Pipes

+ The boring ones.
+ Most ordinary pipes are pretty straightforward. They hold gas. If gas is moving in a direction for some reason, gas will flow in that direction. + That's about it. Even so, here's all of your wonderful pipe options.
+ +
    +
  • Straight pipes: They're pipes. One-meter sections. Straight line. Pretty simple. Just about every pipe and device is based around this + standard one-meter size, so most things will take up as much space as one of these.
  • +
  • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
  • +
  • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
  • +
  • 4-way manifold: A four-way junction.
  • +
  • Pipe cap: Caps off the end of a pipe. Open ends don't actually vent air, because of the way the pipes are assembled, so, uh, use them to decorate your house or something.
  • +
  • Manual valve: A valve that will block off airflow when turned. Can't be used by the AI or cyborgs, because they don't have hands.
  • +
  • Manual T-valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


  • +
+ +

Insulated Pipes

+
  • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
  • +
  • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
  • +
  • 4-way manifold: A four-way junction.
  • +
  • Pipe cap: Caps off the end of a pipe. Open ends don't actually vent air, because of the way the pipes are assembled, so, uh. Use them to decorate your house or something.
  • +
  • Manual Valve: A valve that will block off airflow when turned. Can't be used by the AI or cyborgs, because they don't have hands.
  • +
  • Manual T-Valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


  • + +

    Insulated Pipes


    + Special Public Service Announcement.
    + Our regular pipes are already insulated. These are completely worthless. Punch anyone who uses them.

    + +

    Devices:

    + They actually do something.
    + This is usually where people get frightened, afraid, and start calling on their gods and/or cowering in fear. Yes, I can see you doing that right now. + Stop it. It's unbecoming. Most of these are fairly straightforward.
    + +
      +
    • Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 4500 kPa (kilopascals). + Ordinary atmospheric pressure, for comparison, is 101.3 kPa, and the minimum pressure of room-temperature pure oxygen needed to not suffocate in a matter of minutes is 16 kPa + (though 18 kPa is preferred using internals, for various reasons).
    • +
    • Volume pump: This pump goes based on volume, instead of pressure, and the possible maximum pressure it can create in the pipe on the receiving end is double the gas pump because of this, + clocking in at an incredible 9000 kPa. If a pipe with this is destroyed or damaged, and this pressure of gas escapes, it can be incredibly dangerous depending on the size of the pipe filled. + Don't hook this to the distribution loop, or you will make babies cry and the Chief Engineer brutally beat you.
    • +
    • Passive gate: This is essentially a cap on the pressure of gas allowed to flow in a specific direction. + When turned on, instead of actively pumping gas, it measures the pressure flowing through it, and whatever pressure you set is the maximum: it'll cap after that. + In addition, it only lets gas flow one way. The direction the gas flows is opposite the red handle on it, which is confusing to people used to the red stripe on pumps pointing the way.
    • +
    • Unary vent: The basic vent used in rooms. It pumps gas into the room, but can't suck it back out. Controlled by the room's air alarm system.
    • +
    • Scrubber: The other half of room equipment. Filters air, and can suck it in entirely in what's called a "panic siphon." Activating a panic siphon without very good reason will kill someone. Don't do it.
    • +
    • Meter: A little box with some gauges and numbers. Fasten it to any pipe or manifold and it'll read you the pressure in it. Very useful.
    • +
    • Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference. + Can output this gas at pressures from 0-4500 kPa.
    • +
    • Gas filter: Essentially the opposite of a gas mixer. One side is input. The other two sides are output. One gas type will be filtered into the perpendicular output pipe, + the rest will continue out the other side. Can also output from 0-4500 kPa.
    • +
    + +

    Heat Exchange Systems

    + Will not set you on fire.
    + These systems are used to only transfer heat between two pipes. They will not move gases or any other element, but will equalize the temperature (eventually). Note that because of how gases work (remember: pv=nRt), + a higher temperature will raise pressure, and a lower one will lower temperature.
    + +
  • Pipe: This is a pipe that will exchange heat with the surrounding atmosphere. Place in fire for superheating. Place in space for supercooling.
  • +
  • Bent pipe: Take a wild guess.
  • +
  • Junction: The point where you connect your normal pipes to heat exchange pipes. Not necessary for heat exchangers, but necessary for H/E pipes/bent pipes.
  • +
  • Heat exchanger: These funky-looking bits attach to an open pipe end. Put another heat exchanger directly across from it, and you can transfer heat across two pipes without having to have the gases touch. + This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions...

  • + + That's about it for pipes. Go forth, armed with this knowledge, and try not to break, burn down, or kill anything. Please. + + + + "} + + +/obj/item/book/manual/evaguide + name = "EVA Gear and You: Not Spending All Day Inside" + icon_state = "book_eva" + item_state = "book_eva" + author = "Senior Technician Sandra Rose, Weyland-Yutani Corporation" + title = "EVA Gear and You: Not Spending All Day Inside" + dat = {" + + + + + +

    EVA Gear and You: Not Spending All Day Inside

    + Or: How not to suffocate because there's a hole in your shoes
    + +

    Contents

    +
      +
    1. A foreword on using EVA gear
    2. +
    3. Donning a Civilian Suit
    4. +
    5. Putting on a Hardsuit
    6. +
    7. Final Checks
    8. +
    +
    + + EVA gear. Wonderful to use. It's useful for mining, engineering, and occasionally just surviving, if things are that bad. Most people have EVA training, + but apparently there are some on a space station who don't. This guide should give you a basic idea of how to use this gear, safely. It's split into two sections: + Civilian suits and hardsuits.

    + +

    Civilian Suits

    + The bulkiest things this side of Alpha Centauri
    + These suits are the grey ones that are stored in EVA. They're the more simple to get on, but are also a lot bulkier, and provide less protection from environmental hazards such as radiation or physical impact. + As Medical, Engineering, Security, and Mining all have hardsuits of their own, these don't see much use, but knowing how to put them on is quite useful anyways.

    + + First, take the suit. It should be in three pieces: A top, a bottom, and a helmet. Put the bottom on first, shoes and the like will fit in it. If you have magnetic boots, however, + put them on on top of the suit's feet. Next, get the top on, as you would a shirt. It can be somewhat awkward putting these pieces on, due to the makeup of the suit, + but to an extent they will adjust to you. You can then find the snaps and seals around the waist, where the two pieces meet. Fasten these, and double-check their tightness. + The red indicators around the waist of the lower half will turn green when this is done correctly. Next, put on whatever breathing apparatus you're using, be it a gas mask or a breath mask. Make sure the oxygen tube is fastened into it. + Put on the helmet now, straightforward, and make sure the tube goes into the small opening specifically for internals. Again, fasten seals around the neck, a small indicator light in the inside of the helmet should go from red to off when all is fastened. + There is a small slot on the side of the suit where an emergency oxygen tank or extended emergency oxygen tank will fit, + but it is recommended to have a full-sized tank on your back for EVA.

    + +

    Hardsuits

    + Heavy, uncomfortable, still the best option.
    + These suits come in Engineering, Mining, and the Armory. There's also a couple Medical Hardsuits in EVA. These provide a lot more protection than the standard suits.

    + + Similarly to the other suits, these are split into three parts. Fastening the pant and top are mostly the same as the other spacesuits, with the exception that these are a bit heavier, + though not as bulky. The helmet goes on differently, with the air tube feeding into the suit and out a hole near the left shoulder, while the helmet goes on turned ninety degrees counter-clockwise, + and then is screwed in for one and a quarter full rotations clockwise, leaving the faceplate directly in front of you. There is a small button on the right side of the helmet that activates the helmet light. + The tanks that fasten onto the side slot are emergency tanks, as well as full-sized oxygen tanks, leaving your back free for a backpack or satchel.

    + +

    Final Checks

    +
      +
    • Are all seals fastened correctly?
    • +
    • Do you either have shoes on under the suit, or magnetic boots on over it?
    • +
    • Do you have a mask on and internals on the suit or your back?
    • +
    • Do you have a way to communicate with the station in case something goes wrong?
    • +
    • Do you have a second person watching if this is a training session?

    • +
    + + If you don't have any further issues, go out and do whatever is necessary. + + + + "} + + +//Law related manuals /obj/item/book/manual/security_space_law name = "Standard Operating Procedure" - desc = "A set of USCM guidelines for keeping law and order on their vessels." + desc = "One of the most important books onboard any United States Colonial Marines vessel, or at least that's how you are supposed to feel about it. The book carries within it's pages the USCM guidelines and procedures regarding all kinds of situations." icon_state = "book_sop" item_state = "book_sop" - author = "USCM High Command" + author = "Colonial Marines High Command" title = "Standard Operating Procedure" dat = {" @@ -164,7 +470,7 @@ - + @@ -174,10 +480,10 @@ /obj/item/book/manual/marine_law name = "Marine Law" - desc = "A set of guidelines for keeping law and order on military vessels." - icon_state = "bookSpaceLaw" - item_state = "book_law" - author = "USCM High Command" + desc = "Usually being the favorite read of any member of the Military Police of the USCM, it's whole meaning is to work as the scales for the sword of justice that brandishes onboard the vessels of the United States Colonial Marines, so peace and order can be maintained. It's nicknames may include but are not limited to: Devil's Red Book, Bible of All Sinners, THE Book, ML, Red Brick, Provost's Torture Manual, Provost's Red Devil's Torture Bible of All Sinners." + icon_state = "book_marine_law" + item_state = "book_marine_law" + author = "Colonial Marines Provost Office" title = "Marine Law" dat = {" @@ -186,7 +492,7 @@ - + @@ -194,12 +500,15 @@ "} +//Medical and Research related manuals + + /obj/item/book/manual/surgery name = "Surgical Reference Manual" - desc = "A quick reference manual for surgical procedures." + desc = "A detailed reference manual for surgical procedures. To be read mid-surgery when you forget a simple surgical step." icon_state = "book_medical" item_state = "book_medical" - author = "Weyland-Yutani Medicine Department" + author = "Colonial Marines Bureau of Medicine and Surgery" title = "Surgical Reference Manual" dat = {" @@ -208,7 +517,7 @@ - + @@ -217,12 +526,12 @@ /obj/item/book/manual/medical_diagnostics_manual - name = "WY Medical Diagnostics Manual" - desc = "First, do no harm. A detailed medical practitioner's guide." + name = "Principles and Practice of Medicine" + desc = "Firstly and foremost, do no harm. A detailed, thick and heavy medical practitioner's guide, with the first five full pages only being the book's dedication." icon_state = "book_medical" item_state = "book_medical" - author = "Weyland-Yutani Medicine Department" - title = "WY Medical Diagnostics Manual" + author = "Chief Medical Officer Pierre Corbeau, Colonial Marines Bureau of Medicine and Surgery" + title = "Principles and Practice of Medicine" dat = {" @@ -239,12 +548,13 @@

    The Oath

    - The Medical Oath sworn by recognised medical practitioners in the employ of Weyland-Yutani
    + Below, the Medical Oath sworn by recognised medical practitioners on service everywhere in space, including in the military branches of the United Americas.
    + Ci-dessous, le serment medical prete par des medecins reconnus en service partout dans l'espace, y compris dans les branches militaires des Ameriques unies.
      -
    1. Now, as a new doctor, I solemnly promise that I will, to the best of my ability, serve humanity-caring for the sick, promoting good health, and alleviating pain and suffering.
    2. +
    3. Now, as a practitioner, I solemnly promise that I will, to the best of my ability, serve humanity by caring for the sick, promoting good health, and alleviating pain and suffering.
    4. I recognise that the practice of medicine is a privilege with which comes considerable responsibility and I will not abuse my position.
    5. -
    6. I will practise medicine with integrity, humility, honesty, and compassion-working with my fellow doctors and other colleagues to meet the needs of my patients.
    7. +
    8. I will practise medicine with integrity, humility, honesty, and compassion-working with my fellow practitioners and other colleagues to meet the needs of my patients.
    9. I shall never intentionally do or administer anything to the overall harm of my patients.
    10. I will not permit considerations of gender, race, religion, political affiliation, sexual orientation, nationality, or social standing to influence my duty of care.
    11. I will oppose policies in breach of human rights and will not participate in them. I will strive to change laws that are contrary to my profession's ethics and will work towards a fairer distribution of health resources.
    12. @@ -254,29 +564,141 @@
    13. I make this declaration solemnly, freely, and upon my honour.

    -
    +
    + +

    Main guide

    + + + + + "} + +/obj/item/book/manual/chemistry + name = "Chemical Reactions and How They Can Ruin Your Day" + desc = "A detailed manual containing everything you need to know about chemistry. Recipes and methodology included." + icon_state = "book_chemistry" + item_state = "book_chemistry" + author = "Colonial Marines Bureau of Medicine and Surgery" + title = "Chemical Reactions and How They Can Ruin Your Day" + + dat = {" + + + + + + + + + + + "} + +/obj/item/book/manual/research_and_development + name = "Research and Development: What there is to find?" + desc = "Science: The final frontier. This book contains deeply specialized and educational information regarding research's continuing scientific mission: to explore strange new worlds; to seek out new life, new alloys and new vaccines; to boldly go where no one has researched before!" + icon_state = "book_research_development" + item_state = "book_research_development" + author = "Senior Researcher Glen Brooks, Weyland-Yutani Corporation" + title = "Research and Development: What there is to find?" + + dat = {" + + + + + + + + + + + "} + + +//Un-related manuals + + +/obj/item/book/manual/tychontackle + name = "After Action Report No.55: Operation Tychon Tackle" + desc = "An after action report of the infamous Operation 'Tychon Tackle', so big that it had to be turned into a book. Warning: Some information, such as personal names, have been REDACTED on this print." + icon_state = "book_light_red" + item_state = "book_light_red" + author = "Executive Officer 'REDACTED', USS Heyst, United Americas" + title = "After Action Report No.55: Operation Tychon Tackle" + + dat = {" + + + + + + + + + "} + + +/obj/item/book/manual/upphistory + name = "The Raise And Steadying of the Union of Progressive Peoples, By Robert Mendes" + desc = "A large, supposedly unbiased history book containing what's supposed to be the history of the so-called UPP." + icon_state = "book_upp" + item_state = "book_upp" + author = "Historian Robert Mendes, United Americas" + title = "The Raise And Steadying of the Union of Progressive Peoples, By Robert Mendes" + + dat = {" + + + - - + + + + + "} -/obj/item/book/manual/engineering_guide - name = "Engineering Textbook" - icon_state = "book_engineering2" - item_state = "book_engineering2" - author = "Engineering Encyclopedia" - title = "Engineering Textbook" +/obj/item/book/manual/paperwork + name = "Bureaucracy and paperworking: Everything You Need to Know" + desc = "A book containing all kinds of knowledge and pre-made formularies for the writing of important documents. You need it? This book have it." + icon_state = "book" + item_state = "book" + author = "Colonial Marines High Command" + title = "Bureaucracy and paperworking: Everything You Need to Know" dat = {" - + + + + + + + "} + +/obj/item/book/manual/rank + name = "The Marine Ranks: United States Colonial Marines Chain of Command and Ranking" + desc = "This book contains information regarding all ranks inside the United States Colonial Marines force, and its consequent chain of command." + icon_state = "book" + item_state = "book" + author = "Colonial Marines High Command" + title = "The Marine Ranks: United States Colonial Marines Chain of Command and Ranking" + dat = {" + + + - + + @@ -284,11 +706,12 @@ /obj/item/book/manual/chef_recipes - name = "Chef Recipes" + name = "Pans and Dishes: Your Way Around the Marine Kitchens" + desc = "A huge book containing lots and lots of cooking recipes, perfect for those who wish to actually cook and not only stand in front of the microwave, staring at it." icon_state = "cooked_book" - item_state = "book_green" - author = "Victoria Ponsonby" - title = "Chef Recipes" + item_state = "cooked_book" + author = "Food Service Specialist Louis Covenant, United Americas" + title = "Pans and Dishes: Your Way Around the Marine Kitchens" dat = {" @@ -304,8 +727,8 @@ -

    Food for Dummies

    - Here is a guide on basic food recipes and also how to not poison your customers accidentally. +

    Food for New Mess Technicians

    + This guide is directed to our new Food Service Specialists and for those whose memory aren't their strongest suit.

    Basics:

    Knead an egg and some flour to make dough. Bake that to make a bun or flatten and cut it. @@ -337,18 +760,20 @@

    Fries:

    Add one potato to the processor, then bake them in the microwave. - +

    Further recipes

    + "} /obj/item/book/manual/barman_recipes - name = "Barman Recipes" + name = "Barman Recipes: Mixing Drinks and Changing Lives Under the Blitz" + desc = "One of the most popular recipe books for drinks in the entirety of humankind. Now on it's 39th edition, it was first published in 1946 after the end of the Second World War by Sir Hugh Fairfax, one of the most prestigious barmen of all time." icon_state = "barbook" - item_state = "book_red" - author = "Sir John Rose" - title = "Barman Recipes" + item_state = "barbook" + author = "Sir Hugh Fairfax, Three World Empire" + title = "Barman Recipes: Mixing Drinks and Changing Lives Under the Blitz" dat = {" @@ -364,7 +789,7 @@ -

    Drinks for Dummies

    +

    Drinks for the lads that are new to this wonderful art

    Here's a guide for some basic drinks.

    Black Russian:

    @@ -394,6 +819,8 @@

    Screwdriver:

    Mix vodka and orange juice into a glass. +

    Further recipes

    + "} @@ -401,9 +828,9 @@ /obj/item/book/manual/detective name = "The Film Noir: Proper Procedures for Investigations" - icon_state ="bookDetective" - item_state ="book_red" - author = "Weyland-Yutani" + icon_state ="book_detective" + item_state ="book_detective" + author = "Lawyer Ruben Knight, Weyland-Yutani Corporation" title = "The Film Noir: Proper Procedures for Investigations" dat = {" @@ -445,11 +872,12 @@ /obj/item/book/manual/nuclear - name = "Fission Mailed: Nuclear Sabotage 101" - icon_state = "bookNuclear" - item_state = "book_particle" - author = "The Colonial Liberation Front" - title = "Fission Mailed: Nuclear Sabotage 101" + name = "Fission Mailed: How to Operate a Blockbuster" + desc = "A book containing important information and instructions regarding the operation of a 'Blockbuster' Large Atomic Fission Demolition Device" + icon_state = "book_nuclear" + item_state = "book_nuclear" + author = "Nuclear Regulatory Commission of the United Americas" + title = "Fission Mailed: How to Operate a Blockbuster" dat = {" @@ -463,226 +891,43 @@ -

    Nuclear Explosives 101

    - Hello and thank you for choosing the CLF for your nuclear information needs. Today's crash course will deal with the operation of a Fusion Class Weyland-Yutani made Nuclear Device.

    +

    The Nuclear Explosive

    + Hello and thank you for choosing the Nuclear Regulatory Comission archive for your nuclear information needs. Today's crash course will deal with the operation of a 'Blockbuster' Large Atomic Fission Demolition Device (ELAFDD), designed and manufactured by the Colonial Marines Engineer Association with the purpose of allowing USCM patrol vessels to carry and utilize atomic ordnance without having the capabilities of remotely launching them.

    - First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done, to unbolt it, one must completely log in, which at this time may not be possible.
    + First and foremost, YOU CAN'T DO ANYTHING UNTIL THE BOMB IS IN PLACE. A specific button exists to allow for the deployment and anchoring of the device into place. If this is done, to unbolt it, you must utilize the same button you used to anchor.
    -

    To make the nuclear device functional

    + Secondly, the device requires decryption through dial-up connection, of which is then transmitted by radio back to the receiving vessel, make sure all telecommunication towers available on the designated detonation zone are operating with no problems. + +

    To make the 'Blockbuster' functional

      +
    • Make sure you have proper Identification access to the device's panel.
    • Place the nuclear device in the designated detonation zone.
    • -
    • Extend and anchor the nuclear device from its interface.
    • -
    • Insert the nuclear authorisation disk into the slot.
    • -
    • Type the numeric authorisation code into the keypad. This should have been provided.
      - Note: If you make a mistake, press R to reset the device. -
    • Press the E button to log on to the device.
    • +
    • Extend and anchor the nuclear device through its interface.
    • +
    • Turn the safety of the nuclear device off through its interface.
    • +
    • Make sure all forms of transmission by radio in the designated detonation zone are functional.
    • +
    • When decryption is completed, the device will AUTOMATICALLY begin it's detonation timer.
      + Note: The decryption time will usually take 10 minutes, and the device's timer is fixed to detonate at exactly 3 minutes.

    - You now have activated the device. To deactivate the buttons at anytime, for example when you've already prepped the bomb for detonation, remove the authentication disk OR press R on the keypad.

    - Now the bomb CAN ONLY be detonated using the timer. Manual detonation is not an option. Toggle off the SAFETY.
    - Note: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step.

    - - So use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.
    - Note: THE BOMB IS STILL SET AND WILL DETONATE

    + You now have activated the device. Remember: After decryption is completed, the detonation timer will automatically begin and you are UNABLE to cancel it.

    + The bomb can ONLY be detonated using the timer. Manual detonation is not an option. Toggle off the SAFETY.
    + Note: You wouldn't believe how much, statistically, our personnel forget to toggle it off when operating the device.

    - Now before you remove the disk, if you need to move the bomb, you can toggle off the anchor, move it, and re-anchor.

    + If you wish or need to move the device to any other designated detonation zone at any point in time before the detonation timer begins, you need to firstly cancel decryption, and then toggle off the anchoring of the device, move it, and re-anchor, not forgetting to restart decryption.

    Remember the order:
    - Disk, Code, Safety, Timer, Disk, RUN!

    - Intelligence Analysts believe that normal Weyland-Yutani procedure is for the Commanding Officer, or Captain, to secure the nuclear authentication disk.

    - - Good luck! - - - "} - - -/obj/item/book/manual/atmospipes - name = "Pipes and You: Getting To Know Your Scary Tools" - icon_state = "pipingbook" - item_state = "book_piping" - author = "Maria Crash, Senior Atmospherics Technician" - title = "Pipes and You: Getting To Know Your Scary Tools" - dat = {" - - - - - -

    Contents

    -
      -
    1. Author's Foreword
    2. -
    3. Basic Piping
    4. -
    5. Insulated Pipes
    6. -
    7. Atmospherics Devices
    8. -
    9. Heat Exchange Systems
    10. -
    11. Final Checks
    12. -

    - -

    HOW TO NOT SUCK QUITE SO HARD AT ATMOSPHERICS


    - Or: What the fuck does a "passive gate" do?

    - - Alright. It has come to my attention that a variety of people are unsure of what a "pipe" is and what it does. - Apparently, there is an unnatural fear of these arcane devices and their "gases." Spooky, spooky. So, - this will tell you what every device constructable by an ordinary pipe dispenser within atmospherics actually does. - You are not going to learn what to do with them to be the super best person ever, or how to play guitar with passive gates, - or something like that. Just what stuff does.

    - - -

    Basic Pipes

    - The boring ones.
    - Most ordinary pipes are pretty straightforward. They hold gas. If gas is moving in a direction for some reason, gas will flow in that direction. - That's about it. Even so, here's all of your wonderful pipe options.
    - -
      -
    • Straight pipes: They're pipes. One-meter sections. Straight line. Pretty simple. Just about every pipe and device is based around this - standard one-meter size, so most things will take up as much space as one of these.
    • -
    • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
    • -
    • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
    • -
    • 4-way manifold: A four-way junction.
    • -
    • Pipe cap: Caps off the end of a pipe. Open ends don't actually vent air, because of the way the pipes are assembled, so, uh, use them to decorate your house or something.
    • -
    • Manual valve: A valve that will block off airflow when turned. Can't be used by the AI or cyborgs, because they don't have hands.
    • -
    • Manual T-valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


    • -
    - -

    Insulated Pipes

    -
  • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
  • -
  • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
  • -
  • 4-way manifold: A four-way junction.
  • -
  • Pipe cap: Caps off the end of a pipe. Open ends don't actually vent air, because of the way the pipes are assembled, so, uh. Use them to decorate your house or something.
  • -
  • Manual Valve: A valve that will block off airflow when turned. Can't be used by the AI or cyborgs, because they don't have hands.
  • -
  • Manual T-Valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


  • - -

    Insulated Pipes


    - Special Public Service Announcement.
    - Our regular pipes are already insulated. These are completely worthless. Punch anyone who uses them.

    - -

    Devices:

    - They actually do something.
    - This is usually where people get frightened, afraid, and start calling on their gods and/or cowering in fear. Yes, I can see you doing that right now. - Stop it. It's unbecoming. Most of these are fairly straightforward.
    - -
      -
    • Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 4500 kPa (kilopascals). - Ordinary atmospheric pressure, for comparison, is 101.3 kPa, and the minimum pressure of room-temperature pure oxygen needed to not suffocate in a matter of minutes is 16 kPa - (though 18 kPa is preferred using internals, for various reasons).
    • -
    • Volume pump: This pump goes based on volume, instead of pressure, and the possible maximum pressure it can create in the pipe on the receiving end is double the gas pump because of this, - clocking in at an incredible 9000 kPa. If a pipe with this is destroyed or damaged, and this pressure of gas escapes, it can be incredibly dangerous depending on the size of the pipe filled. - Don't hook this to the distribution loop, or you will make babies cry and the Chief Engineer brutally beat you.
    • -
    • Passive gate: This is essentially a cap on the pressure of gas allowed to flow in a specific direction. - When turned on, instead of actively pumping gas, it measures the pressure flowing through it, and whatever pressure you set is the maximum: it'll cap after that. - In addition, it only lets gas flow one way. The direction the gas flows is opposite the red handle on it, which is confusing to people used to the red stripe on pumps pointing the way.
    • -
    • Unary vent: The basic vent used in rooms. It pumps gas into the room, but can't suck it back out. Controlled by the room's air alarm system.
    • -
    • Scrubber: The other half of room equipment. Filters air, and can suck it in entirely in what's called a "panic siphon." Activating a panic siphon without very good reason will kill someone. Don't do it.
    • -
    • Meter: A little box with some gauges and numbers. Fasten it to any pipe or manifold and it'll read you the pressure in it. Very useful.
    • -
    • Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference. - Can output this gas at pressures from 0-4500 kPa.
    • -
    • Gas filter: Essentially the opposite of a gas mixer. One side is input. The other two sides are output. One gas type will be filtered into the perpendicular output pipe, - the rest will continue out the other side. Can also output from 0-4500 kPa.
    • -
    - -

    Heat Exchange Systems

    - Will not set you on fire.
    - These systems are used to only transfer heat between two pipes. They will not move gases or any other element, but will equalize the temperature (eventually). Note that because of how gases work (remember: pv=nRt), - a higher temperature will raise pressure, and a lower one will lower temperature.
    - -
  • Pipe: This is a pipe that will exchange heat with the surrounding atmosphere. Place in fire for superheating. Place in space for supercooling.
  • -
  • Bent pipe: Take a wild guess.
  • -
  • Junction: The point where you connect your normal pipes to heat exchange pipes. Not necessary for heat exchangers, but necessary for H/E pipes/bent pipes.
  • -
  • Heat exchanger: These funky-looking bits attach to an open pipe end. Put another heat exchanger directly across from it, and you can transfer heat across two pipes without having to have the gases touch. - This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions...

  • - - That's about it for pipes. Go forth, armed with this knowledge, and try not to break, burn down, or kill anything. Please. - - - - "} - - -/obj/item/book/manual/evaguide - name = "EVA Gear and You: Not Spending All Day Inside" - icon_state = "evabook" - item_state = "book_blue" - author = "Maria Crash, Senior Atmospherics Technician" - title = "EVA Gear and You: Not Spending All Day Inside" - dat = {" - - - - - -

    EVA Gear and You: Not Spending All Day Inside

    - Or: How not to suffocate because there's a hole in your shoes
    - -

    Contents

    -
      -
    1. A foreword on using EVA gear
    2. -
    3. Donning a Civilian Suit
    4. -
    5. Putting on a Hardsuit
    6. -
    7. Final Checks
    8. -
    -
    - - EVA gear. Wonderful to use. It's useful for mining, engineering, and occasionally just surviving, if things are that bad. Most people have EVA training, - but apparently there are some on a space station who don't. This guide should give you a basic idea of how to use this gear, safely. It's split into two sections: - Civilian suits and hardsuits.

    - -

    Civilian Suits

    - The bulkiest things this side of Alpha Centauri
    - These suits are the grey ones that are stored in EVA. They're the more simple to get on, but are also a lot bulkier, and provide less protection from environmental hazards such as radiation or physical impact. - As Medical, Engineering, Security, and Mining all have hardsuits of their own, these don't see much use, but knowing how to put them on is quite useful anyways.

    - - First, take the suit. It should be in three pieces: A top, a bottom, and a helmet. Put the bottom on first, shoes and the like will fit in it. If you have magnetic boots, however, - put them on on top of the suit's feet. Next, get the top on, as you would a shirt. It can be somewhat awkward putting these pieces on, due to the makeup of the suit, - but to an extent they will adjust to you. You can then find the snaps and seals around the waist, where the two pieces meet. Fasten these, and double-check their tightness. - The red indicators around the waist of the lower half will turn green when this is done correctly. Next, put on whatever breathing apparatus you're using, be it a gas mask or a breath mask. Make sure the oxygen tube is fastened into it. - Put on the helmet now, straightforward, and make sure the tube goes into the small opening specifically for internals. Again, fasten seals around the neck, a small indicator light in the inside of the helmet should go from red to off when all is fastened. - There is a small slot on the side of the suit where an emergency oxygen tank or extended emergency oxygen tank will fit, - but it is recommended to have a full-sized tank on your back for EVA.

    - -

    Hardsuits

    - Heavy, uncomfortable, still the best option.
    - These suits come in Engineering, Mining, and the Armory. There's also a couple Medical Hardsuits in EVA. These provide a lot more protection than the standard suits.

    - - Similarly to the other suits, these are split into three parts. Fastening the pant and top are mostly the same as the other spacesuits, with the exception that these are a bit heavier, - though not as bulky. The helmet goes on differently, with the air tube feeding into the suit and out a hole near the left shoulder, while the helmet goes on turned ninety degrees counter-clockwise, - and then is screwed in for one and a quarter full rotations clockwise, leaving the faceplate directly in front of you. There is a small button on the right side of the helmet that activates the helmet light. - The tanks that fasten onto the side slot are emergency tanks, as well as full-sized oxygen tanks, leaving your back free for a backpack or satchel.

    - -

    Final Checks

    -
      -
    • Are all seals fastened correctly?
    • -
    • Do you either have shoes on under the suit, or magnetic boots on over it?
    • -
    • Do you have a mask on and internals on the suit or your back?
    • -
    • Do you have a way to communicate with the station in case something goes wrong?
    • -
    • Do you have a second person watching if this is a training session?

    • -
    - - If you don't have any further issues, go out and do whatever is necessary. + Access, Position, Anchor, Safety, Transmission, Decryption, Begin, Vacate

    + Farewell and happy demolitions. "} - +// This book is ultra old /obj/item/book/manual/hydroponics_beekeeping name = "The Ins and Outs of Apiculture - A Precise Art" - icon_state = "bookHydroponicsBees" - item_state = "book_green" + icon_state = "book_hydroponics_bees" + item_state = "book_hydroponics_bees" author = "Beekeeper Dave" title = "The Ins and Outs of Apiculture - A Precise Art" dat = {" @@ -712,59 +957,6 @@ "} -/obj/item/book/manual/orbital_cannon_manual - name = "USCM Orbital Bombardment System Manual" - icon_state = "book_engineering" - item_state = "book_engineering" - author = "USCM R&D" - title = "USCM Orbital Bombardment System Manual" - - dat = {" - - - - - -

    Guide to the USCM Orbital Bombardment System

    - -

    Step by step instructions:

    -
      -
    1. Load a warhead in the Orbital Cannon Tray (Powerloader required).
    2. -
    3. Load the required amount of solid fuel in the Orbital Cannon Tray (See Orbital Cannon Console).
    4. -
    5. Open the Orbital Cannon Console's interface.
    6. -
    7. Load the Tray into the Cannon.
    8. -
    9. Chamber the Tray's content into the cannon barrel. (can't be undone!)
    10. -
    11. The CIC staff can now fire the Orbital Cannon from any overwatch console.
    12. -
    13. After firing, unload the Tray from the Orbital Cannon.
    14. -
    15. Inspect the Tray to make sure it is empty and operational.
    16. -
    - -

    Troubleshooting:

    - -
      -
    • If you've loaded a tray with an incorrect payload, you can still unload the tray's payload as long as it hasn't been chambered.
    • -
    • If an incorrect payload is chambered, it can only be removed by firing it.
    • -
    • If the Orbital Cannon Console has no power, check the Weapon Control Room's APC.
    • -
    • If the Orbital Cannon Console is broken, contact USCM HQ for a replacement.
    • -
    • In case of direct damage to the Orbital Cannon itself, do not attempt to use or repair the cannon.
    • -
    • In case of hull breach or fire, make sure to remove the Cannon's payload and move it to a safe location.
    • -
    • If the Orbital Tray jams, apply lubricant to the conveyor belt.
    • -
    • If a cable of the Orbital Cannon System is severed, contact USCM HQ for a replacement.
    • -
    • If Cannon's cable connector breaks, turn off the Orbital Cannon Console and contact USCM HQ for a replacement.
    • -
    - - - - "} - - /obj/item/book/manual/orbital_cannon_manual/New() . = ..() diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 0eb12bb85a02..b608aae7da57 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -162,11 +162,13 @@ name = "identification holo-badge" desc = "A plain, mass produced holo-badge." icon_state = "data" + item_state = "card-id" /obj/item/card/id/lanyard name = "identification holo-lanyard" desc = "A crude holo-lanyard. As cheap as they come." icon_state = "lanyard" + item_state = "lanyard" /obj/item/card/id/silver name = "identification holo-badge" @@ -178,6 +180,7 @@ name = "corporate doctor badge" desc = "A corporate holo-badge. It is fingerprint locked with clearance level 3 access. It is commonly held by corporate doctors." icon_state = "clearance" + item_state = "silver_id" var/credits_to_give = 15 //gives the equivalent clearance access in credits /obj/item/card/id/silver/clearance_badge/scientist @@ -189,19 +192,21 @@ name = "corporate liaison badge" desc = "A corporate holo-badge in unique corporate orange and white. It is fingerprint locked with clearance level 5 access. It is commonly held by corporate liaisons." icon_state = "cl" + item_state = "cl_id" credits_to_give = 42 /obj/item/card/id/silver/clearance_badge/manager name = "corporate manager badge" desc = "A corporate holo-badge in standard corporate orange and white. It has a unique uncapped bottom. It is fingerprint locked with 5-X clearance level. Commonly held by corporate managers." icon_state = "pmc" + item_state = "cl_id" credits_to_give = 47 /obj/item/card/id/pizza name = "pizza guy badge" desc = "It reads: 'Pizza-guy local union No. 217','We always deliver!'" icon_state = "pizza" - item_state = "gold_id" + item_state = "card-id" /obj/item/card/id/souto name = "Souto Man" @@ -225,27 +230,41 @@ name = "corporate holo-badge" desc = "A corporate holo-badge. It's a unique Corporate orange and white." icon_state = "cl" + item_state = "cl_id" + +/obj/item/card/id/silver/cl/hyperdyne + name = "corporate holo-badge" + desc = "A corporate holo-badge. It's a unique Corporate orange and black." + icon_state = "hyperdyne" /obj/item/card/id/gold/council name = "identification holo-badge" - desc = "A real bronze gold Colonel's holo-badge. Commands respect, authority, and it makes an excellent paperweight." + desc = "A real bronze gold Colonel's holo-badge. Commands respect, authority, and it makes for an excellent paperweight." icon_state = "commodore" + item_state = "commodore_id" /obj/item/card/id/pmc name = "\improper PMC holo-badge" desc = "A corporate holo-badge. It has a unique uncapped bottom." icon_state = "pmc" - registered_name = "The Corporation" + item_state = "cl_id" + registered_name = "The Weyland-Yutani Corporation" assignment = "Corporate Mercenary" /obj/item/card/id/pmc/New() access = get_access(ACCESS_LIST_WY_ALL) ..() +/obj/item/card/id/pmc/commando + name = "\improper W-Y Commando holo-badge" + assignment = "Corporate Commando" + icon_state = "commando" + /obj/item/card/id/pmc/ds name = "\improper Corporate holo-badge" - desc = "It lists a callsign and a blood type. Issued to Whiteout protocol teams only." + desc = "It lists a callsign and a series number. Issued to Whiteout protocol teams only." icon_state = "ds" + item_state = "ds_id" /obj/item/card/id/marshal name = "\improper CMB marshal gold badge" @@ -272,6 +291,7 @@ name = "\improper NSPA silver badge" desc = "The silver badge which represents that the wearer is a NSPA Constable. It is a sign of justice, authority, and protection. Protecting those who can't. This badge represents a commitment to a sworn oath always kept." icon_state = "nspa_silver" + id_type = "Badge" item_state = "silver_id" paygrade = PAY_SHORT_CST @@ -279,6 +299,7 @@ name = "\improper NSPA silver & gold badge" desc = "The silver with gold accents badge which represents that the wearer is a NSPA Senior Constable to Sergeant. It is a sign of justice, authority, and protection. Protecting those who can't. This badge represents a commitment to a sworn oath always kept." icon_state = "nspa_silverandgold" + id_type = "Badge" item_state = "silver_id" paygrade = PAY_SHORT_SGT @@ -286,15 +307,23 @@ name = "\improper NSPA gold badge" desc = "A gold badge signifying that the wearer is one of the higher ranks of the NSPA, usually Inspectors and above. It is a sign of justice, authority, and protection. Protecting those who can't. This badge represents a commitment to a sworn oath always kept." icon_state = "nspa_gold" + id_type = "Badge" item_state = "gold_id" paygrade = PAY_SHORT_CINSP +/obj/item/card/id/PaP + name = "PaP identification holo-badge" + desc = "A standard-issue holo-badge for personnel within the UPP's People's Armed Police. It displays the officer's rank and affiliation." + icon_state = "data" + paygrade = PAY_SHORT_PAP_MLTS + /obj/item/card/id/general name = "general officer holo-badge" desc = "Top brass of the top brass. Issued to only the most dedicated." icon_state = "general" - registered_name = "The USCM" - assignment = "General" + item_state = "general_id" + registered_name = "The United States Colonial Marines" + assignment = "High Command Officer" /obj/item/card/id/general/New() access = get_access(ACCESS_LIST_MARINE_ALL) @@ -303,8 +332,9 @@ name = "provost holo-badge" desc = "Issued to members of the Provost Office." icon_state = "provost" - registered_name = "Provost Office" - assignment = "Provost" + item_state = "provost_id" + registered_name = "United States Colonial Marines Provost Office" + assignment = "Provost Staff" /obj/item/card/id/provost/New() access = get_access(ACCESS_LIST_MARINE_ALL) diff --git a/code/game/objects/items/circuitboards/airlock.dm b/code/game/objects/items/circuitboards/airlock.dm index 1928fb72354b..4370b5582ef8 100644 --- a/code/game/objects/items/circuitboards/airlock.dm +++ b/code/game/objects/items/circuitboards/airlock.dm @@ -19,7 +19,7 @@ icon_state = "door_electronics_smoked" /obj/item/circuitboard/airlock/attack_self(mob/user as mob) - if (!ishuman(user) && !istype(user,/mob/living/silicon/robot)) + if (!ishuman(user)) return ..(user) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index 9ae3ed0962b5..b16e435a1edf 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -9,6 +9,12 @@ var/uses = 10 /// for lipstick var/open = TRUE + /// Last world.time someone attempted to apply the makeup, for anti-spam. + var/last_apply_time + /// How long the anti-spam cooldown on applying the makeup is. + var/apply_delay_length = 5 SECONDS + /// the cooldown for applying makeup. + COOLDOWN_DECLARE(apply_delay) //FACEPAINT /obj/item/facepaint/green @@ -80,48 +86,64 @@ paint_type = "full_camo_urban" icon_state = "full_camo_urban" - /obj/item/facepaint/skull name = "skull paint" desc = "Paint, for your face. Make your enemies need a change of underwear from the sheer terror a goddamn skull on your face will bring to them. WARNING: DOES NOT MIX WELL WITH BEARDS." paint_type = "skull_camo" icon_state = "skull_camo" +/obj/item/facepaint/clown + name = "clown makeup paint" + desc = "Paint, for your face. Used for entertainers and alike, or maybe you just feel that way." + paint_type = "clown_camo" + icon_state = "clown_camo" + +/obj/item/facepaint/clown/alt + + paint_type = "clown_camo_alt" + icon_state = "clown_camo_alt" + /obj/item/facepaint/sunscreen_stick name= "\improper USCM issue sunscreen" desc = "A stick of SPF 50 sunscreen, issued to you by the good brass of the Corps. Whereas the previously issued sunscreen was toxic upon ingestion, this batch improves upon that by only containing excessive amounts of cadmium." paint_type = "sunscreen_stick" icon_state = "sunscreen_stick" -/obj/item/facepaint/attack(mob/M, mob/user) +/obj/item/facepaint/attack(mob/target, mob/user) if(user.a_intent == INTENT_HARM) return ..() - if(!ismob(M)) + if(!ismob(target)) return FALSE - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/mob/living/carbon/human/Huser = user - Huser.animation_attack_on(H) + if(!COOLDOWN_FINISHED(src, apply_delay)) // Stops players from spamming each other with popups. + to_chat(user, SPAN_WARNING("You just attempted to apply some makeup, slow down!")) + return FALSE + + COOLDOWN_START(src, apply_delay, apply_delay_length) + + if(ishuman(target)) + var/mob/living/carbon/human/human_target = target + var/mob/living/carbon/human/human_user = user + human_user.animation_attack_on(human_target) if(!open) to_chat(user, SPAN_WARNING("The lid is on!")) return FALSE - if(H.lip_style) //if they already have lipstick on + if(human_target.lip_style) //if they already have lipstick on to_chat(user, SPAN_WARNING("You need to wipe the old makeup off with paper first!")) return - if(H == user) - paint_face(H, user) + if(human_target == user) + paint_face(human_target, user) return TRUE else - to_chat(user, SPAN_NOTICE("You attempt to apply [src] on [H]...")) - to_chat(H, SPAN_NOTICE("[user] is trying to apply [src] on your face...")) - if(alert(H,"Will you allow [user] to apply makeup to your face?",,"Sure","No") == "Sure") - if( user && loc == user && (user in range(1,H)) ) //Have to be close and hold the thing. - paint_face(H, user) + to_chat(user, SPAN_NOTICE("You attempt to apply [src] on [human_target]...")) + to_chat(human_target, SPAN_NOTICE("[user] is trying to apply [src] on your face...")) + if(alert(human_target,"Will you allow [user] to apply makeup to your face?",,"Sure","No") == "Sure") + if( user && loc == user && (user in range(1,human_target)) ) //Have to be close and hold the thing. + paint_face(human_target, user) return TRUE to_chat(user, SPAN_WARNING("Foiled!")) diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index f32d589e48a0..247c63aab59c 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -130,7 +130,7 @@ QDEL_NULL(coord) /obj/item/device/binoculars/range/clicked(mob/user, list/mods) - if(mods["ctrl"]) + if(mods[CTRL_CLICK]) if(!CAN_PICKUP(user, src)) return ..() stop_targeting(user) @@ -140,13 +140,13 @@ /obj/item/device/binoculars/range/handle_click(mob/living/carbon/human/user, atom/targeted_atom, list/mods) if(!istype(user)) return - if(mods["ctrl"]) + if(mods[CTRL_CLICK]) if(user.stat != CONSCIOUS) to_chat(user, SPAN_WARNING("You cannot use [src] while incapacitated.")) return FALSE if(SEND_SIGNAL(user, COMSIG_BINOCULAR_HANDLE_CLICK, src)) return FALSE - if(mods["click_catcher"]) + if(mods[CLICK_CATCHER]) return FALSE if(user.z != targeted_atom.z && !coord) to_chat(user, SPAN_WARNING("You cannot get a direct laser from where you are.")) @@ -232,7 +232,7 @@ data["xcoord"] = src.last_x data["ycoord"] = src.last_y - data["zcoord"] = src.last_z + data["zcoord"] = src.last_z return data @@ -268,7 +268,7 @@ . += SPAN_NOTICE("[src] is currently set to [range_mode ? "range finder" : "CAS marking"] mode.") /obj/item/device/binoculars/range/designator/clicked(mob/user, list/mods) - if(mods["alt"]) + if(mods[ALT_CLICK]) if(!CAN_PICKUP(user, src)) return ..() toggle_bino_mode(user) @@ -375,6 +375,7 @@ to_chat(user, SPAN_NOTICE("TARGET ACQUIRED. LASER TARGETING IS ONLINE. DON'T MOVE.")) var/obj/effect/overlay/temp/laser_target/LT = new (TU, las_name, user, tracking_id) laser = LT + SEND_SIGNAL(src, COMSIG_DESIGNATOR_LASE) var/turf/userloc = get_turf(user) msg_admin_niche("Laser target [las_name] has been designated by [key_name(user, 1)] at ([TU.x], [TU.y], [TU.z]). [ADMIN_JMP(userloc)]") @@ -384,6 +385,7 @@ while(laser) if(!do_after(user, 30, INTERRUPT_ALL, BUSY_ICON_GENERIC)) QDEL_NULL(laser) + SEND_SIGNAL(src, COMSIG_DESIGNATOR_LASE_OFF) break //IMPROVED LASER DESIGNATER, faster cooldown, faster target acquisition, can be found only in scout spec kit @@ -425,7 +427,7 @@ overlays += cas_laser_overlay /datum/action/item_action/specialist/spotter_target - ability_primacy = SPEC_PRIMARY_ACTION_1 + ability_primacy = SPEC_PRIMARY_ACTION_2 var/minimum_laze_distance = 2 /datum/action/item_action/specialist/spotter_target/New(mob/living/user, obj/item/holder) @@ -632,7 +634,7 @@ return FALSE var/list/modifiers = params2list(params) //Only single clicks. - if(modifiers["middle"] || modifiers["shift"] || modifiers["alt"] || modifiers["ctrl"]) + if(modifiers[MIDDLE_CLICK] || modifiers[SHIFT_CLICK] || modifiers[ALT_CLICK] || modifiers[CTRL_CLICK]) return FALSE var/turf/SS = get_turf(src) //Stand Still, not what you're thinking. diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index ea894d0e2f0e..c7e9ef03ed2f 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -115,7 +115,7 @@ return //Job knowledge requirement - if(istype(user) && !noskill) + if(user.skills && !noskill) if(!skillcheck(user, skill_to_check, skill_level)) if(!skill_to_check_alt || (!skillcheck(user, skill_to_check_alt, skill_level_alt))) to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) @@ -200,7 +200,7 @@ //job knowledge requirement if(user.skills && !noskill) if(!skillcheck(user, skill_to_check, skill_level)) - if(skill_to_check_alt && !skillcheck(user, skill_to_check_alt, skill_level_alt)) + if(!skill_to_check_alt || (!skillcheck(user, skill_to_check_alt, skill_level_alt))) to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) return @@ -219,7 +219,7 @@ playsound(get_turf(src), sound_charge_skill4, 25, 0) else if(user.get_skill_duration_multiplier(SKILL_MEDICAL) == 0.75) playsound(get_turf(src), sound_charge_skill3, 25, 0) - else + else playsound(get_turf(src), sound_charge, 25, 0) //Do NOT vary this tune, it needs to be precisely 7 seconds //Taking square root not to make defibs too fast... @@ -259,7 +259,7 @@ msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(target)] with [src].") return - if(!target.client) //Freak case, no client at all. This is a braindead mob (like a colonist) + if(!target.client && !(target.status_flags & FAKESOUL)) //Freak case, no client at all. This is a braindead mob (like a colonist) user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: No soul detected, Attempting to revive...")) if(isobserver(target.mind?.current) && !target.client) //Let's call up the correct ghost! Also, bodies with clients only, thank you. @@ -286,7 +286,8 @@ msg_admin_niche("[key_name_admin(user)] successfully revived [key_name_admin(target)] with [src].") playsound(get_turf(src), sound_success, 25, 0) user.track_life_saved(user.job) - user.life_revives_total++ + if(!user.statistic_exempt && ishuman(target)) + user.life_revives_total++ target.handle_revive() if(heart) heart.take_damage(rand(min_heart_damage_dealt, max_heart_damage_dealt), TRUE) // Make death and revival leave lasting consequences @@ -301,6 +302,22 @@ if(heart && prob(25)) heart.take_damage(rand(min_heart_damage_dealt, max_heart_damage_dealt), TRUE) // Make death and revival leave lasting consequences +/obj/item/device/defibrillator/low_charge/Initialize(mapload, ...) //for survivors and such + . = ..() + dcell.charge = 100 + update_icon() + +/obj/item/device/defibrillator/upgraded + name = "upgraded emergency defibrillator" + icon_state = "adv_defib" + item_state = "adv_defib" + desc = "An advanced rechargeable defibrillator using induction to deliver shocks through metallic objects, such as armor, and does so with much greater efficiency than the standard variant, not damaging the heart." + + blocked_by_suit = FALSE + min_heart_damage_dealt = 0 + max_heart_damage_dealt = 0 + damage_heal_threshold = 35 + /obj/item/device/defibrillator/compact_adv name = "advanced compact defibrillator" desc = "An advanced compact defibrillator that trades capacity for strong immediate power. Ignores armor and heals strongly and quickly, at the cost of very low charge. It does not damage the heart." diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 2bef7bade5e1..fbc34327471f 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -23,6 +23,8 @@ var/on = FALSE var/raillight_compatible = TRUE //Can this be turned into a rail light ? var/toggleable = TRUE + /// Should the flashlight rotate when thrown? + var/rotation_on_throw = FALSE var/can_be_broken = TRUE //can xenos swipe at this to break it/turn it off? var/breaking_sound = 'sound/handling/click_2.ogg' //sound used when this happens @@ -40,8 +42,9 @@ icon_state = initial(icon_state) /obj/item/device/flashlight/animation_spin(speed = 5, loop_amount = -1, clockwise = TRUE, sections = 3, angular_offset = 0, pixel_fuzz = 0) - clockwise = pick(TRUE, FALSE) - angular_offset = rand(360) + if(rotation_on_throw) + clockwise = pick(TRUE, FALSE) + angular_offset = rand(360) return ..() /obj/item/device/flashlight/proc/update_brightness(mob/user = null) @@ -324,6 +327,7 @@ actions = list() //just pull it manually, neckbeard. raillight_compatible = 0 can_be_broken = FALSE + rotation_on_throw = TRUE var/burnt_out = FALSE var/fuel = 16 MINUTES var/fuel_rate = AMOUNT_PER_TIME(1 SECONDS, 1 SECONDS) @@ -403,12 +407,13 @@ /obj/item/device/flashlight/flare/animation_spin(speed = 5, loop_amount = -1, clockwise = TRUE, sections = 3, angular_offset = 0, pixel_fuzz = 0) pixel_fuzz = 16 return ..() + /obj/item/device/flashlight/flare/pickup() + . = ..() if(transform) apply_transform(matrix()) // reset rotation pixel_x = 0 pixel_y = 0 - return ..() /obj/item/device/flashlight/flare/proc/burn_out() turn_off() diff --git a/code/game/objects/items/devices/motion_detector.dm b/code/game/objects/items/devices/motion_detector.dm index 29fa20305ede..5ec7c9b9657d 100644 --- a/code/game/objects/items/devices/motion_detector.dm +++ b/code/game/objects/items/devices/motion_detector.dm @@ -113,7 +113,7 @@ /obj/item/device/motiondetector/clicked(mob/user, list/mods) if (isobserver(user) || isxeno(user)) return - if (mods["alt"]) + if (mods[ALT_CLICK]) if(!CAN_PICKUP(user, src)) return ..() if(!long_range_locked) @@ -322,6 +322,11 @@ desc = "A device that usually picks up non-USCM signals, but this one's been hacked to detect all non-UPP movement instead. Fight fire with fire!" iff_signal = FACTION_UPP +/obj/item/device/motiondetector/hacked/clf + name = "hacked motion detector" + desc = "A device that usually picks up non-USCM signals, but this one's been reprogrammed to detect all non-CLF movement instead." + iff_signal = FACTION_CLF + /obj/item/device/motiondetector/hacked/elite_merc name = "hacked motion detector" desc = "A device that usually picks up non-USCM signals, but this one's been hacked to detect all non-freelancer movement instead. Fight fire with fire!" diff --git a/code/game/objects/items/devices/personal_data_transmitter.dm b/code/game/objects/items/devices/personal_data_transmitter.dm index 8a4a446fdf40..c3c61a621be2 100644 --- a/code/game/objects/items/devices/personal_data_transmitter.dm +++ b/code/game/objects/items/devices/personal_data_transmitter.dm @@ -147,6 +147,7 @@ desc = "A personal data transmitter bracelet, also known as a PDT, is a form of personal locator typically surgically implanted into the body of extrasolar colonists, among others. Its purpose is to allow rapid location of the associated personnel anywhere within a certain radius of the receiving equipment, sometimes up to 30km distance. This bracelet forms part of the PDT/L variant, which is a wearable version of the PDT technology. Both it and the linked locator tube share a serial number for ease of detection in case of mixup." icon = 'icons/obj/items/clothing/accessory/watches.dmi' icon_state = "" + worn_accessory_limit = 1 accessory_icons = list( WEAR_BODY = 'icons/mob/humans/onmob/clothing/accessory/watches.dmi', WEAR_JACKET = 'icons/mob/humans/onmob/clothing/accessory/watches.dmi' diff --git a/code/game/objects/items/devices/portable_vendor.dm b/code/game/objects/items/devices/portable_vendor.dm index 68cfcbefb2d4..12b91977044a 100644 --- a/code/game/objects/items/devices/portable_vendor.dm +++ b/code/game/objects/items/devices/portable_vendor.dm @@ -27,7 +27,7 @@ var/broken = FALSE var/contraband = FALSE var/covert = FALSE //covert = no light, no sound - var/delay = 3 //fabricating time, in seconds + var/delay = 3 SECONDS //fabricating time, in seconds var/list/purchase_log = list() @@ -197,7 +197,7 @@ fabricating = TRUE update_overlays() - addtimer(CALLBACK(src, PROC_REF(spawn_product), product[3], user), delay SECONDS) + addtimer(CALLBACK(src, PROC_REF(spawn_product), product[3], user), delay) /obj/item/device/portable_vendor/proc/spawn_product(typepath, mob/user) var/obj/new_item = new typepath(get_turf(src)) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index ccc6617a3ade..a9046135eea5 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -152,7 +152,7 @@ /obj/item/device/encryptionkey/io name = "\improper Marine Intelligence Officer Radio Encryption Key" icon_state = "cap_key" - channels = list(RADIO_CHANNEL_ALMAYER = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, SQUAD_MARINE_1 = FALSE, SQUAD_MARINE_2 = FALSE, SQUAD_MARINE_3 = FALSE, SQUAD_MARINE_4 = FALSE, SQUAD_MARINE_5 = FALSE, SQUAD_MARINE_CRYO = FALSE) + channels = list(RADIO_CHANNEL_ALMAYER = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, SQUAD_MARINE_1 = FALSE, SQUAD_MARINE_2 = FALSE, SQUAD_MARINE_3 = FALSE, SQUAD_MARINE_4 = FALSE, SQUAD_MARINE_5 = FALSE, SQUAD_MARINE_CRYO = FALSE) /obj/item/device/encryptionkey/vc name = "\improper Marine Vehicle Crewman Radio Encryption Key" @@ -174,7 +174,7 @@ /obj/item/device/encryptionkey/squadlead name = "\improper Squad Leader Radio Encryption Key" icon_state = "sl_key" - channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_JTAC = TRUE) + channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_REQ = TRUE) /obj/item/device/encryptionkey/squadlead/acting abstract = TRUE @@ -259,6 +259,15 @@ icon_state = "pmc_key" channels = list(RADIO_CHANNEL_WY_WO = TRUE, RADIO_CHANNEL_WY = TRUE) +//--------------------------------------------------- +//Hyperdyne Keys + +/obj/item/device/encryptionkey/hyperdyne + name = "\improper Hyperdyne Corporation encryption key" + icon_state = "ce_key" + channels = list(RADIO_CHANNEL_HYPERDYNE = TRUE) + tracking_options = list("Corporate Liaison" = TRACKER_CL) + //--------------------------------------------------- //UPP Keys /obj/item/device/encryptionkey/upp diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 9a4574871502..453a6971367b 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -468,6 +468,18 @@ initial_keys = list(/obj/item/device/encryptionkey/ce) volume = RADIO_VOLUME_CRITICAL multibroadcast_cooldown = LOW_MULTIBROADCAST_COOLDOWN + misc_tracking = TRUE + + inbuilt_tracking_options = list( + "Landing Zone" = TRACKER_LZ, + "Alpha SL" = TRACKER_ASL, + "Bravo SL" = TRACKER_BSL, + "Charlie SL" = TRACKER_CSL, + "Delta SL" = TRACKER_DSL, + "Echo SL" = TRACKER_ESL, + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL + ) /obj/item/device/radio/headset/almayer/cmo name = "chief medical officer's headset" @@ -585,6 +597,21 @@ initial_keys = list(/obj/item/device/encryptionkey/mcom) volume = RADIO_VOLUME_CRITICAL multibroadcast_cooldown = LOW_MULTIBROADCAST_COOLDOWN + misc_tracking = TRUE + locate_setting = TRACKER_CO + + inbuilt_tracking_options = list( + "Commanding Officer" = TRACKER_CO, + "Executive Officer" = TRACKER_XO, + "Landing Zone" = TRACKER_LZ, + "Alpha SL" = TRACKER_ASL, + "Bravo SL" = TRACKER_BSL, + "Charlie SL" = TRACKER_CSL, + "Delta SL" = TRACKER_DSL, + "Echo SL" = TRACKER_ESL, + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL + ) /obj/item/device/radio/headset/almayer/mcom/alt initial_keys = list(/obj/item/device/encryptionkey/mcom/alt) @@ -640,6 +667,36 @@ additional_hud_types = list(MOB_HUD_FACTION_WY, MOB_HUD_FACTION_CMB) volume = RADIO_VOLUME_CRITICAL +/obj/item/device/radio/headset/almayer/mcom/cdrcom/xo + locate_setting = TRACKER_CO + + inbuilt_tracking_options = list( + "Commanding Officer" = TRACKER_CO, + "Landing Zone" = TRACKER_LZ, + "Alpha SL" = TRACKER_ASL, + "Bravo SL" = TRACKER_BSL, + "Charlie SL" = TRACKER_CSL, + "Delta SL" = TRACKER_DSL, + "Echo SL" = TRACKER_ESL, + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL + ) + +/obj/item/device/radio/headset/almayer/mcom/cdrcom/co + locate_setting = TRACKER_XO + + inbuilt_tracking_options = list( + "Executive Officer" = TRACKER_XO, + "Landing Zone" = TRACKER_LZ, + "Alpha SL" = TRACKER_ASL, + "Bravo SL" = TRACKER_BSL, + "Charlie SL" = TRACKER_CSL, + "Delta SL" = TRACKER_DSL, + "Echo SL" = TRACKER_ESL, + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL + ) + /obj/item/device/radio/headset/almayer/mcom/sea name = "marine senior enlisted advisor headset" desc = "Issued only to senior enlisted advisors. Channels are as follows: :v - marine command, :p - military police, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel" @@ -661,20 +718,6 @@ icon_state = "ms_headset" initial_keys = list(/obj/item/device/encryptionkey/cmpcom/synth) volume = RADIO_VOLUME_CRITICAL - misc_tracking = TRUE - locate_setting = TRACKER_CO - - inbuilt_tracking_options = list( - "Commanding Officer" = TRACKER_CO, - "Executive Officer" = TRACKER_XO, - "Landing Zone" = TRACKER_LZ, - "Alpha SL" = TRACKER_ASL, - "Bravo SL" = TRACKER_BSL, - "Charlie SL" = TRACKER_CSL, - "Delta SL" = TRACKER_DSL, - "Echo SL" = TRACKER_ESL, - "Foxtrot SL" = TRACKER_FSL - ) /obj/item/device/radio/headset/almayer/mcom/ai initial_keys = list(/obj/item/device/encryptionkey/cmpcom/synth/ai) @@ -699,7 +742,7 @@ /obj/item/device/radio/headset/almayer/marine/alpha/lead name = "marine alpha leader radio headset" - desc = "This is used by the marine Alpha squad leader. Channels are as follows: :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." + desc = "This is used by the marine Alpha squad leader. Channels are as follows: :u - requisitions, :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/squadlead) volume = RADIO_VOLUME_CRITICAL @@ -713,7 +756,8 @@ "Charlie SL" = TRACKER_CSL, "Delta SL" = TRACKER_DSL, "Echo SL" = TRACKER_ESL, - "Foxtrot SL" = TRACKER_FSL + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL ) /obj/item/device/radio/headset/almayer/marine/alpha/tl @@ -741,7 +785,7 @@ /obj/item/device/radio/headset/almayer/marine/bravo/lead name = "marine bravo leader radio headset" - desc = "This is used by the marine Bravo squad leader. Channels are as follows: :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." + desc = "This is used by the marine Bravo squad leader. Channels are as follows: :u - requisitions, :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/squadlead) volume = RADIO_VOLUME_CRITICAL @@ -755,7 +799,8 @@ "Charlie SL" = TRACKER_CSL, "Delta SL" = TRACKER_DSL, "Echo SL" = TRACKER_ESL, - "Foxtrot SL" = TRACKER_FSL + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL ) /obj/item/device/radio/headset/almayer/marine/bravo/tl @@ -783,7 +828,7 @@ /obj/item/device/radio/headset/almayer/marine/charlie/lead name = "marine charlie leader radio headset" - desc = "This is used by the marine Charlie squad leader. Channels are as follows: :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." + desc = "This is used by the marine Charlie squad leader. Channels are as follows: :u - requisitions, :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/squadlead) volume = RADIO_VOLUME_CRITICAL @@ -797,7 +842,8 @@ "Bravo SL" = TRACKER_BSL, "Delta SL" = TRACKER_DSL, "Echo SL" = TRACKER_ESL, - "Foxtrot SL" = TRACKER_FSL + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL ) /obj/item/device/radio/headset/almayer/marine/charlie/tl @@ -825,7 +871,7 @@ /obj/item/device/radio/headset/almayer/marine/delta/lead name = "marine delta leader radio headset" - desc = "This is used by the marine Delta squad leader. Channels are as follows: :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." + desc = "This is used by the marine Delta squad leader. Channels are as follows: :u - requisitions, :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/squadlead) volume = RADIO_VOLUME_CRITICAL @@ -839,7 +885,8 @@ "Bravo SL" = TRACKER_BSL, "Charlie SL" = TRACKER_CSL, "Echo SL" = TRACKER_ESL, - "Foxtrot SL" = TRACKER_FSL + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL ) /obj/item/device/radio/headset/almayer/marine/delta/tl @@ -867,7 +914,7 @@ /obj/item/device/radio/headset/almayer/marine/echo/lead name = "marine echo leader radio headset" - desc = "This is used by the marine Echo squad leader. Channels are as follows: :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." + desc = "This is used by the marine Echo squad leader. Channels are as follows: :u - requisitions, :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/squadlead) volume = RADIO_VOLUME_CRITICAL @@ -881,7 +928,8 @@ "Bravo SL" = TRACKER_BSL, "Charlie SL" = TRACKER_CSL, "Delta SL" = TRACKER_DSL, - "Foxtrot SL" = TRACKER_FSL + "Foxtrot SL" = TRACKER_FSL, + "Intel SL" = TRACKER_ISL ) /obj/item/device/radio/headset/almayer/marine/echo/tl @@ -910,7 +958,7 @@ /obj/item/device/radio/headset/almayer/marine/cryo/lead name = "marine foxtrot leader radio headset" - desc = "This is used by the marine Foxtrot squad leader. Channels are as follows: :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." + desc = "This is used by the marine Foxtrot squad leader. Channels are as follows: :u - requisitions, :v - marine command, :j - JTAC. When worn, grants access to Squad Leader tracker. Click tracker with empty hand to open Squad Info window." initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/squadlead) volume = RADIO_VOLUME_CRITICAL @@ -1030,6 +1078,23 @@ has_hud = TRUE hud_type = MOB_HUD_FACTION_WY +/obj/item/device/radio/headset/distress/WY/guard + misc_tracking = TRUE + locate_setting = TRACKER_CL + inbuilt_tracking_options = list( + "Corporate Liaison" = TRACKER_CL + ) + additional_hud_types = list(MOB_HUD_FACTION_WY) + +/obj/item/device/radio/headset/distress/hyperdyne + name = "HC corporate headset" + desc = "A headset commonly worn by Hyperdyne corporate personnel." + icon_state = "generic_headset" + frequency = HDC_FREQ + initial_keys = list(/obj/item/device/encryptionkey/colony, /obj/item/device/encryptionkey/hyperdyne) + has_hud = TRUE + hud_type = MOB_HUD_FACTION_HC + /obj/item/device/radio/headset/distress/dutch name = "Dutch's Dozen headset" desc = "A special headset used by small groups of trained operatives. Or terrorists. To access the colony channel, use :h." @@ -1037,6 +1102,34 @@ initial_keys = list(/obj/item/device/encryptionkey/colony) ignore_z = TRUE +/obj/item/device/radio/headset/distress/cbrn + name = "\improper CBRN headset" + desc = "A headset given to CBRN marines. Channels are as follows: :g - public, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel" + frequency = CBRN_FREQ + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/mcom) + ignore_z = TRUE + has_hud = TRUE + +/obj/item/device/radio/headset/distress/forecon + name = "\improper Force Recon headset" + desc = "A headset given to FORECON marines. Channels are as follows: :g - public, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel" + frequency = FORECON_FREQ + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/mcom) + ignore_z = TRUE + has_hud = TRUE + +//WY Headsets + +/obj/item/device/radio/headset/distress/wy_android + name = "W-Y android headset" + desc = "A special headset used by unidentified androids. Channels are as follows: :o - colony :y - Corporate #pmc - PMC" + frequency = WY_WO_FREQ + icon_state = "ms_headset" + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/WY, /obj/item/device/encryptionkey/pmc/command) + has_hud = TRUE + hud_type = MOB_HUD_FACTION_WO + additional_hud_types = list(MOB_HUD_FACTION_WY, MOB_HUD_FACTION_PMC) + /obj/item/device/radio/headset/distress/pmc name = "PMC headset" desc = "A special headset used by corporate personnel. Channels are as follows: :g - public, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel, :y - Corporate." @@ -1053,21 +1146,22 @@ ) additional_hud_types = list(MOB_HUD_FACTION_WY) -/obj/item/device/radio/headset/distress/cbrn - name = "\improper CBRN headset" - desc = "A headset given to CBRN marines. Channels are as follows: :g - public, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel" - frequency = CBRN_FREQ - initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/mcom) - ignore_z = TRUE - has_hud = TRUE +/obj/item/device/radio/headset/distress/pmc/commando + name = "W-Y commando headset" + desc = "A special headset used by unidentified operatives. Channels are as follows: :g - public, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel, :y - Corporate." + icon_state = "pmc_headset" + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/mcom/cl, /obj/item/device/encryptionkey/colony, /obj/item/device/encryptionkey/WY, /obj/item/device/encryptionkey/pmc) + maximum_keys = 5 -/obj/item/device/radio/headset/distress/forecon - name = "\improper Force Recon headset" - desc = "A headset given to FORECON marines. Channels are as follows: :g - public, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel" - frequency = FORECON_FREQ - initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/mcom) - ignore_z = TRUE - has_hud = TRUE +/obj/item/device/radio/headset/distress/pmc/commando/hvh + name = "W-Y commando headset" + desc = "A special headset used by unidentified operatives. Channels are as follows: :o - colony :y - Corporate #pmc - PMC." + icon_state = "pmc_headset" + initial_keys = list(/obj/item/device/encryptionkey/colony, /obj/item/device/encryptionkey/WY, /obj/item/device/encryptionkey/pmc) + +/obj/item/device/radio/headset/distress/pmc/commando/leader + name = "W-Y commando leader headset" + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/mcom/cl, /obj/item/device/encryptionkey/colony, /obj/item/device/encryptionkey/WY, /obj/item/device/encryptionkey/pmc/command) /obj/item/device/radio/headset/distress/pmc/hvh desc = "A special headset used by corporate personnel. Channels are as follows: :o - colony." @@ -1108,6 +1202,7 @@ desc = "A special headset used by corporate directors. Channels are as follows: :o - colony, #z - command, #f - medical, #e - engineering, #o - JTAC, #p - general" maximum_keys = 4 initial_keys = list(/obj/item/device/encryptionkey/colony, /obj/item/device/encryptionkey/pmc/command, /obj/item/device/encryptionkey/commando, /obj/item/device/encryptionkey/mcom/cl) + additional_hud_types = list(MOB_HUD_FACTION_WY, MOB_HUD_FACTION_WO, MOB_HUD_FACTION_TWE, MOB_HUD_FACTION_MARINE) /obj/item/device/radio/headset/distress/pmc/command/director/hvh maximum_keys = 3 @@ -1178,16 +1273,6 @@ desc = "A special headset used by small groups of trained operatives. Or terrorists. Channels are as follows: :o - colony, #a - medical, #b - engineering, #c - command, #d - combat controller, #g clf general" initial_keys = list(/obj/item/device/encryptionkey/colony, /obj/item/device/encryptionkey/clf/command) -//WY Headsets -/obj/item/device/radio/headset/distress/commando - name = "Commando headset" - desc = "A special headset used by unidentified operatives. Channels are as follows: :g - public, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel." - frequency = WY_WO_FREQ - icon_state = "pmc_headset" - initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/mcom) - has_hud = TRUE - hud_type = MOB_HUD_FACTION_WO - /obj/item/device/radio/headset/distress/contractor name = "VAI Headset" desc = "A special headset used by Vanguard's Arrow Incorporated mercenaries, features a non-standard brace. Channels are as follows: :g - public, :v - marine command, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel." @@ -1206,6 +1291,17 @@ hud_type = MOB_HUD_FACTION_TWE volume = RADIO_VOLUME_IMPORTANT +/obj/item/device/radio/headset/distress/iasf + name = "IASF Headset" + desc = "A sleek headset used by the IASF. Low profile enough to fit under any headgear." + frequency = RMC_FREQ + icon_state = "vai_headset" + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/royal_marine) + has_hud = TRUE + hud_type = MOB_HUD_FACTION_IASF + additional_hud_types = list(MOB_HUD_FACTION_TWE, MOB_HUD_FACTION_IASF, MOB_HUD_FACTION_MARINE) + volume = RADIO_VOLUME_IMPORTANT + //CMB Headsets /obj/item/device/radio/headset/distress/CMB name = "\improper CMB Earpiece" @@ -1231,7 +1327,7 @@ /obj/item/device/radio/headset/distress/NSPA name = "NSPA Headset" - desc = "NSPA headset." + desc = "A special headset used by the NSPA." frequency = RMC_FREQ icon_state = "vai_headset" initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/royal_marine) @@ -1246,8 +1342,10 @@ icon_state = "mhc_headset" frequency = HC_FREQ initial_keys = list(/obj/item/device/encryptionkey/highcom) - additional_hud_types = list(MOB_HUD_FACTION_WY, MOB_HUD_FACTION_CMB, MOB_HUD_FACTION_TWE) + additional_hud_types = list(MOB_HUD_FACTION_WY, MOB_HUD_FACTION_CMB, MOB_HUD_FACTION_TWE, MOB_HUD_FACTION_MARINE) volume = RADIO_VOLUME_CRITICAL + has_hud = TRUE + hud_type = MOB_HUD_SECURITY_ADVANCED /obj/item/device/radio/headset/almayer/provost name = "USCM Provost headset" @@ -1255,8 +1353,10 @@ icon_state = "pvst_headset" frequency = PVST_FREQ initial_keys = list(/obj/item/device/encryptionkey/provost) - additional_hud_types = list(MOB_HUD_FACTION_CMB) + additional_hud_types = list(MOB_HUD_FACTION_CMB, MOB_HUD_FACTION_MARINE) volume = RADIO_VOLUME_CRITICAL + has_hud = TRUE + hud_type = MOB_HUD_SECURITY_ADVANCED /obj/item/device/radio/headset/almayer/sof name = "USCM SOF headset" @@ -1293,3 +1393,15 @@ ignore_z = FALSE has_hud = TRUE hud_type = MOB_HUD_FACTION_UPP + +/obj/item/device/radio/headset/distress/PaP + name = "\improper UPP PaP headset" + desc = "A special headset used by the People's Armed Police of the UPP." + frequency = UPP_FREQ + icon_state = "sec_headset" + initial_keys = list(/obj/item/device/encryptionkey/colony, /obj/item/device/encryptionkey/upp) + ignore_z = FALSE + has_hud = TRUE + hud_type = MOB_HUD_FACTION_PAP + additional_hud_types = list(MOB_HUD_FACTION_UPP) + volume = RADIO_VOLUME_IMPORTANT diff --git a/code/game/objects/items/devices/radio/listening_bugs.dm b/code/game/objects/items/devices/radio/listening_bugs.dm index a3a381997795..04507550ca24 100644 --- a/code/game/objects/items/devices/radio/listening_bugs.dm +++ b/code/game/objects/items/devices/radio/listening_bugs.dm @@ -273,17 +273,18 @@ -///An automatically active bug used to listen to things by a Fax Responder. +///An automatically active bug used to listen to things by a Fax Responder. Mapping side, not intended for spawning in manually. /obj/item/device/radio/listening_bug/radio_linked/fax name = "Comms Relay Device" subspace_switchable = FALSE broadcasting = TRUE bug_broadcast_level = LISTENING_BUG_NEVER //Don't want fax responder devices broadcasting to ghosts because it will duplicate a lot of messages every round all the time. alpha = 0 - mouse_opacity = 0 + mouse_opacity = FALSE + anchored = TRUE explo_proof = TRUE - unacidable = TRUE emp_proof = TRUE + unacidable = TRUE /obj/item/device/radio/listening_bug/radio_linked/fax/wy frequency = FAX_WY_FREQ diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 4a6140430b99..f75cfbf389e8 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -229,6 +229,9 @@ to each individual headset. */ + if(should_block_game_interaction(M)) + return + //#### Grab the connection datum ####// var/datum/radio_frequency/connection = handle_message_mode(M, message, channel) if(!istype(connection)) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a1d7509935ca..910df1224816 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -96,18 +96,21 @@ K9 SCANNER QDEL_NULL(last_health_display) return ..() -/obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/user) +/obj/item/device/healthanalyzer/attack(mob/living/target_mob, mob/living/user) + if(!istype(target_mob, /mob/living/carbon) || isxeno(target_mob)) + to_chat(user, SPAN_WARNING("[src] can't make sense of this creature.")) + return if(!popup_window) - last_scan = M.health_scan(user, FALSE, TRUE, popup_window, alien) + last_scan = target_mob.health_scan(user, FALSE, TRUE, popup_window, alien) else if (!last_health_display) - last_health_display = new(M) + last_health_display = new(target_mob) else - last_health_display.target_mob = M + last_health_display.target_mob = target_mob SStgui.close_user_uis(user, src) last_scan = last_health_display.ui_data(user, DETAIL_LEVEL_HEALTHANALYSER) last_health_display.look_at(user, DETAIL_LEVEL_HEALTHANALYSER, bypass_checks = FALSE, ignore_delay = FALSE, alien = alien) - to_chat(user, SPAN_NOTICE("[user] has analyzed [M]'s vitals.")) + to_chat(user, SPAN_NOTICE("[user] has analyzed [target_mob]'s vitals.")) playsound(src.loc, 'sound/items/healthanalyzer.ogg', 50) src.add_fingerprint(user) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 9521de9a039a..83a4cccbab5f 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -118,7 +118,7 @@ eject(user) /obj/item/device/taperecorder/clicked(mob/user, list/mods) - if(mods["alt"]) + if(mods[ALT_CLICK]) if(!CAN_PICKUP(user, src)) return ..() if(loc == user) diff --git a/code/game/objects/items/explosives/explosive.dm b/code/game/objects/items/explosives/explosive.dm index f951a1540d5e..461d4adcef99 100644 --- a/code/game/objects/items/explosives/explosive.dm +++ b/code/game/objects/items/explosives/explosive.dm @@ -59,7 +59,7 @@ . = ..() /obj/item/explosive/clicked(mob/user, list/mods) - if(mods["alt"]) + if(mods[ALT_CLICK]) if(!CAN_PICKUP(user, src)) return ..() if(!has_blast_wave_dampener) diff --git a/code/game/objects/items/explosives/grenades/flashbang.dm b/code/game/objects/items/explosives/grenades/flashbang.dm index de4af15667e9..1e4392572651 100644 --- a/code/game/objects/items/explosives/grenades/flashbang.dm +++ b/code/game/objects/items/explosives/grenades/flashbang.dm @@ -136,7 +136,7 @@ to_chat(M, SPAN_HELPFUL("Your gear protects you from the worst of the 'bang'.")) M.Stun(weaken_amount) - M.KnockDown(weaken_amount) + M.KnockDown(weaken_amount) M.KnockOut(paralyze_amount) if(deafen_amount) M.SetEarDeafness(max(M.ear_deaf, deafen_amount)) @@ -331,7 +331,7 @@ M.apply_effect(paralyze_amount, PARALYZE) if(flash_amount) - M.flash_eyes(EYE_PROTECTION_FLASH, TRUE, /atom/movable/screen/fullscreen/flash, flash_amount) + M.flash_eyes(EYE_PROTECTION_FLASH, TRUE, flash_amount, /atom/movable/screen/fullscreen/flash) if(deafen_amount) M.SetEarDeafness(max(M.ear_deaf, deafen_amount)) diff --git a/code/game/objects/items/explosives/grenades/grenade.dm b/code/game/objects/items/explosives/grenades/grenade.dm index 2ddd588890d1..a4cf1671bedb 100644 --- a/code/game/objects/items/explosives/grenades/grenade.dm +++ b/code/game/objects/items/explosives/grenades/grenade.dm @@ -43,6 +43,9 @@ if(harmful && ishuman(user) && !user.allow_gun_usage) to_chat(user, SPAN_WARNING("Your programming prevents you from using this!")) return FALSE + if(harmful && ishuman(user) && MODE_HAS_MODIFIER(/datum/gamemode_modifier/ceasefire)) + to_chat(user, SPAN_WARNING("You will not break the ceasefire by doing that!")) + return FALSE if(HAS_TRAIT(user, TRAIT_HAULED)) // If somehow they have a grenade in hand while hauled, we don't want them to prime it return FALSE diff --git a/code/game/objects/items/explosives/grenades/marines.dm b/code/game/objects/items/explosives/grenades/marines.dm index 3807a6aaa779..61ac28fa867e 100644 --- a/code/game/objects/items/explosives/grenades/marines.dm +++ b/code/game/objects/items/explosives/grenades/marines.dm @@ -542,6 +542,9 @@ if(!human.allow_gun_usage) to_chat(user, SPAN_WARNING("Your programming prevents you from using this!")) return + if(MODE_HAS_MODIFIER(/datum/gamemode_modifier/ceasefire)) + to_chat(user, SPAN_WARNING("You will not break the ceasefire by doing that!")) + return if(user_turf && (user_turf.density || locate(/obj/structure/fence) in user_turf)) to_chat(user, SPAN_WARNING("You can't plant a mine here.")) @@ -635,6 +638,8 @@ if((mob_dist < (range-3))) // 2 tiles around small superslow mob.Superslow(2) mob.Slow(damage_applied/xeno_slowdown_numerator) + if(iswydroid(mob)) + mob.emote("pain") if(mob_dist < 1) // Range based stuff, standing ontop of the equivalent of a canned lighting bolt should mess you up. mob.Superslow(3) // Note that humans will likely be in stamcrit so it's always worse for them when ontop of it and we can just balancing it on xenos. @@ -924,11 +929,15 @@ // abstract grenades used for hijack explosions /obj/item/explosive/grenade/high_explosive/bursting_pipe + AUTOWIKI_SKIP(TRUE) + name = "bursting pipe" alpha = 0 mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/item/explosive/grenade/incendiary/bursting_pipe + AUTOWIKI_SKIP(TRUE) + name = "bursting pipe" alpha = 0 mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/game/objects/items/explosives/mine.dm b/code/game/objects/items/explosives/mine.dm index 7da5809bbfd7..7e97b3353796 100644 --- a/code/game/objects/items/explosives/mine.dm +++ b/code/game/objects/items/explosives/mine.dm @@ -8,7 +8,7 @@ icon_state = "m20" force = 5 w_class = SIZE_SMALL - //layer = MOB_LAYER - 0.1 //You can't just randomly hide claymores under boxes. Booby-trapping bodies is fine though + layer = ABOVE_LYING_MOB_LAYER //You can't just randomly hide claymores under boxes. Booby-trapping bodies is fine though throwforce = 5 throw_range = 6 throw_speed = SPEED_VERY_FAST @@ -23,10 +23,15 @@ ) shrapnel_spread = 60 use_dir = TRUE + var/iff_signal = FACTION_MARINE var/triggered = FALSE var/hard_iff_lock = FALSE var/obj/effect/mine_tripwire/tripwire + /// Whether this mine will ignore MOB_SIZE_XENO_VERY_SMALL or smaller xenos - only configureable if customizeable + var/ignore_small_xeno = FALSE + /// How many times a xeno projectile has hit this mine + var/spit_hit_count = 0 var/map_deployed = FALSE @@ -61,6 +66,10 @@ to_chat(user, SPAN_WARNING("It's too cramped in here to deploy \a [src].")) return TRUE +/obj/item/explosive/mine/get_examine_text(mob/user) + . = ..() + if(customizable && !isxeno(user)) + . += " The sensitivity dial is turned [ignore_small_xeno ? "down" : "up"]" //Arming @@ -111,9 +120,8 @@ update_icon() -//Disarming -/obj/item/explosive/mine/attackby(obj/item/W, mob/user) - if(HAS_TRAIT(W, TRAIT_TOOL_MULTITOOL)) +/obj/item/explosive/mine/attackby(obj/item/tool, mob/user) + if(HAS_TRAIT(tool, TRAIT_TOOL_MULTITOOL)) if(active) if(user.action_busy) return @@ -121,7 +129,7 @@ user.visible_message(SPAN_NOTICE("[user] starts disarming [src]."), SPAN_NOTICE("You start disarming [src].")) else - user.visible_message(SPAN_NOTICE("[user] starts fiddling with \the [src], trying to disarm it."), + user.visible_message(SPAN_NOTICE("[user] starts fiddling with [src], trying to disarm it."), SPAN_NOTICE("You start disarming [src], but you don't know its IFF data. This might end badly...")) if(!do_after(user, 30, INTERRUPT_NO_NEEDHAND, BUSY_ICON_FRIENDLY)) user.visible_message(SPAN_WARNING("[user] stops disarming [src]."), @@ -131,7 +139,7 @@ if(prob(75)) triggered = TRUE if(tripwire) - var/direction = GLOB.reverse_dir[src.dir] + var/direction = GLOB.reverse_dir[dir] var/step_direction = get_step(src, direction) tripwire.forceMove(step_direction) prime() @@ -140,6 +148,16 @@ user.visible_message(SPAN_NOTICE("[user] finishes disarming [src]."), SPAN_NOTICE("You finish disarming [src].")) disarm() + else if(HAS_TRAIT(tool, TRAIT_TOOL_WIRECUTTERS)) + if(customizable) + if(ignore_small_xeno) + to_chat(user, SPAN_NOTICE("You have reverted [src] to its original sensitivity.")) + else + to_chat(user, SPAN_NOTICE("You have adjusted [src] to be less sensitive.")) + ignore_small_xeno = !ignore_small_xeno + return + to_chat(user, SPAN_NOTICE("[src] has no sensitivity dial to adjust.")) + return else return ..() @@ -159,7 +177,7 @@ if(!customizable) set_tripwire() - return; + return if(!detonator) active = TRUE @@ -186,32 +204,32 @@ //Mine can also be triggered if you "cross right in front of it" (same tile) -/obj/item/explosive/mine/Crossed(atom/A) +/obj/item/explosive/mine/Crossed(atom/movable/target) ..() - if(isliving(A)) - var/mob/living/L = A - if(!L.stat == DEAD)//so dragged corpses don't trigger mines. - return - else - try_to_prime(A) + try_to_prime(target) -/obj/item/explosive/mine/Collided(atom/movable/AM) - try_to_prime(AM) +/obj/item/explosive/mine/Collided(atom/movable/target) + try_to_prime(target) -/obj/item/explosive/mine/proc/try_to_prime(mob/living/L) +/obj/item/explosive/mine/proc/try_to_prime(mob/living/enemy) if(!active || triggered || (customizable && !detonator)) return - if(!istype(L)) + if(!istype(enemy)) return - if(L.stat == DEAD) + if(enemy.stat == DEAD) return - if(L.get_target_lock(iff_signal)) + if(ignore_small_xeno && isxeno(enemy)) + var/mob/living/carbon/xenomorph/xeno = enemy + if(xeno.mob_size <= MOB_SIZE_XENO_VERY_SMALL) + return + if(enemy.get_target_lock(iff_signal)) return - if(HAS_TRAIT(L, TRAIT_ABILITY_BURROWED)) + if(HAS_TRAIT(enemy, TRAIT_ABILITY_BURROWED)) return - L.visible_message(SPAN_DANGER("[icon2html(src, viewers(src))] The [name] clicks as [L] moves in front of it."), - SPAN_DANGER("[icon2html(src, L)] The [name] clicks as you move in front of it."), + + enemy.visible_message(SPAN_DANGER("[icon2html(src, viewers(src))] The [name] clicks as [enemy] moves in front of it."), + SPAN_DANGER("[icon2html(src, enemy)] The [name] clicks as you move in front of it."), SPAN_DANGER("You hear a click.")) triggered = TRUE @@ -233,17 +251,21 @@ if(!QDELETED(src)) disarm() - -/obj/item/explosive/mine/attack_alien(mob/living/carbon/xenomorph/M) +/obj/item/explosive/mine/attack_alien(mob/living/carbon/xenomorph/xeno) if(triggered) //Mine is already set to go off return XENO_NO_DELAY_ACTION - if(M.a_intent == INTENT_HELP) - to_chat(M, SPAN_XENONOTICE("If you hit this hard enough, it would probably explode.")) + if(xeno.a_intent == INTENT_HELP) + to_chat(xeno, SPAN_XENONOTICE("If you hit this hard enough, it would probably explode.")) return XENO_NO_DELAY_ACTION - M.animation_attack_on(src) - M.visible_message(SPAN_DANGER("[M] has slashed [src]!"), + if(tripwire) + if(xeno.mob_size <= MOB_SIZE_XENO_VERY_SMALL) + to_chat(xeno, SPAN_XENONOTICE("Slashing that would be suicide!")) + return XENO_NO_DELAY_ACTION + + xeno.animation_attack_on(src) + xeno.visible_message(SPAN_DANGER("[xeno] has slashed [src]!"), SPAN_DANGER("You slash [src]!")) playsound(loc, 'sound/weapons/slice.ogg', 25, 1) @@ -264,6 +286,15 @@ if(!QDELETED(src)) disarm() +/obj/item/explosive/mine/bullet_act(obj/projectile/xeno_projectile) + if(!triggered && istype(xeno_projectile.ammo, /datum/ammo/xeno)) //xeno projectile + spit_hit_count++ + if(spit_hit_count >= 2) // Check if hit two times + visible_message(SPAN_DANGER("[src] is hit by [xeno_projectile] and violently detonates!")) // Acid is hot for claymore + triggered = TRUE + prime() + if(!QDELETED(src)) + disarm() /obj/effect/mine_tripwire name = "claymore tripwire" @@ -342,3 +373,153 @@ /obj/item/explosive/mine/sebb/prime() new /obj/item/explosive/grenade/sebb/primed(get_turf(src)) qdel(src) + +/obj/item/explosive/mine/sharp + name = "\improper P9 SHARP explosive dart" + desc = "An experimental P9 SHARP proximity triggered explosive dart designed by Armat Systems for use by the United States Colonial Marines. This one has full 360 detection range." + icon_state = "sharp_explosive_mine" + layer = ABOVE_OBJ_LAYER + shrapnel_spread = 360 + health = 50 + var/disarmed = FALSE + var/explosion_size = 100 + var/explosion_falloff = 50 + var/mine_level = 1 + var/deploy_time = 0 + var/mine_state = "" + var/timer_id + +/obj/item/explosive/mine/sharp/proc/upgrade_mine() + mine_level++ + icon_state = mine_state + "_[mine_level]" + if(mine_level < 4) + timer_id = addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/explosive/mine/sharp, upgrade_mine)), 30 SECONDS, TIMER_DELETE_ME | TIMER_STOPPABLE) + +/obj/item/explosive/mine/sharp/check_for_obstacles(mob/living/user) + return FALSE + +/obj/item/explosive/mine/sharp/attackby(obj/item/W, mob/user) + if(user.action_busy) + return + else if(HAS_TRAIT(W, TRAIT_TOOL_MULTITOOL)) + user.visible_message(SPAN_NOTICE("[user] starts disarming [src]."), \ + SPAN_NOTICE("You start disarming [src].")) + if(!do_after(user, 30, INTERRUPT_NO_NEEDHAND, BUSY_ICON_FRIENDLY)) + user.visible_message(SPAN_WARNING("[user] stops disarming [src]."), \ + SPAN_WARNING("You stop disarming [src].")) + return + if(!active)//someone beat us to it + return + user.visible_message(SPAN_NOTICE("[user] finishes disarming [src]."), \ + SPAN_NOTICE("You finish disarming [src].")) + disarm() + return + +/obj/item/explosive/mine/sharp/set_tripwire() + if(!active && !tripwire) + for(var/direction in CARDINAL_ALL_DIRS) + var/tripwire_loc = get_turf(get_step(loc,direction)) + tripwire = new(tripwire_loc) + tripwire.linked_claymore = src + active = TRUE + +/obj/item/explosive/mine/sharp/prime(mob/user) + set waitfor = FALSE + if(!cause_data) + cause_data = create_cause_data(initial(name), user) + if(mine_level == 1) + explosion_size = 100 + else if(mine_level == 2) + explosion_size = 100 + explosion_falloff = 25 + else if(mine_level == 3) + explosion_size = 125 + explosion_falloff = 30 + else + explosion_size = 125 + explosion_falloff = 25 + cell_explosion(loc, explosion_size, explosion_falloff, EXPLOSION_FALLOFF_SHAPE_LINEAR, CARDINAL_ALL_DIRS, cause_data) + playsound(loc, 'sound/weapons/gun_sharp_explode.ogg', 100) + qdel(src) + +/obj/item/explosive/mine/sharp/disarm() + anchored = FALSE + active = FALSE + triggered = FALSE + icon_state = "sharp_mine_disarmed" + desc = "A disarmed P9 SHARP rifle dart, useless now." + QDEL_NULL(tripwire) + disarmed = TRUE + deltimer(timer_id) + add_to_garbage(src) + + +/obj/item/explosive/mine/sharp/attack_self(mob/living/user) + if(disarmed) + return + . = ..() + +/obj/item/explosive/mine/sharp/deploy_mine(mob/user) + if(disarmed) + return + if(!hard_iff_lock && user) + iff_signal = user.faction + + cause_data = create_cause_data(initial(name), user) + if(user) + user.drop_inv_item_on_ground(src) + setDir(user ? user.dir : dir) //The direction it is planted in is the direction the user faces at that time + activate_sensors() + update_icon() + deploy_time = world.time + mine_state = icon_state + timer_id = addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/explosive/mine/sharp, upgrade_mine)), 30 SECONDS, TIMER_DELETE_ME | TIMER_STOPPABLE) + for(var/mob/living/carbon/mob in range(1, src)) + try_to_prime(mob) + +/obj/item/explosive/mine/sharp/attack_alien() + if(disarmed) + ..() + else + return + +//basically copy pasted from welding kit code +/obj/item/explosive/mine/sharp/bullet_act(obj/projectile/bullet) + var/damage = bullet.damage + health -= damage + ..() + healthcheck() + return TRUE + +/obj/item/explosive/mine/sharp/proc/healthcheck() + if(health <= 0) + prime() + +/obj/item/explosive/mine/sharp/incendiary + name = "\improper P9 SHARP incendiary dart" + desc = "An experimental P9 SHARP proximity triggered explosive dart designed by Armat Systems for use by the United States Colonial Marines. This one has full 360 detection range." + icon_state = "sharp_incendiary_mine" + +/obj/item/explosive/mine/sharp/incendiary/prime(mob/user) + set waitfor = FALSE + if(!cause_data) + cause_data = create_cause_data(initial(name), user) + if(mine_level == 1) + var/datum/effect_system/smoke_spread/phosphorus/smoke = new /datum/effect_system/smoke_spread/phosphorus/sharp + var/smoke_radius = 2 + smoke.set_up(smoke_radius, 0, loc) + smoke.start() + playsound(loc, 'sound/weapons/gun_sharp_explode.ogg', 100) + else if(mine_level == 2) + var/datum/reagent/napalm/green/reagent = new() + new /obj/flamer_fire(loc, cause_data, reagent, 2) + playsound(loc, 'sound/weapons/gun_flamethrower3.ogg', 45) + else if(mine_level == 3) + var/datum/reagent/napalm/ut/reagent = new() + new /obj/flamer_fire(loc, cause_data, reagent, 2) + playsound(loc, 'sound/weapons/gun_flamethrower3.ogg', 45) + else + var/datum/reagent/napalm/ut/reagent = new() + new /obj/flamer_fire(loc, cause_data, reagent, 3) + playsound(loc, 'sound/weapons/gun_flamethrower3.ogg', 45) + qdel(src) diff --git a/code/game/objects/items/explosives/plastic.dm b/code/game/objects/items/explosives/plastic.dm index 6c27d3aaad28..f5aa47b58ea1 100644 --- a/code/game/objects/items/explosives/plastic.dm +++ b/code/game/objects/items/explosives/plastic.dm @@ -68,8 +68,6 @@ to_chat(user, SPAN_NOTICE("Timer set for [timer] seconds.")) /obj/item/explosive/plastic/afterattack(atom/target, mob/user, flag) - setDir(get_dir(user, target)) - if(user.action_busy || !flag) return if(!skillcheck(user, req_skill, req_skill_level)) @@ -94,6 +92,7 @@ disarm() return + setDir(get_dir(user, target)) user.drop_held_item() cause_data = create_cause_data(initial(name), user) plant_target = target diff --git a/code/game/objects/items/gift_wrappaper.dm b/code/game/objects/items/gift_wrappaper.dm index 1470b39403fe..5adfd22ae0b5 100644 --- a/code/game/objects/items/gift_wrappaper.dm +++ b/code/game/objects/items/gift_wrappaper.dm @@ -101,7 +101,7 @@ /obj/item/toy/sword, /obj/item/reagent_container/food/snacks/grown/ambrosiadeus, /obj/item/reagent_container/food/snacks/grown/ambrosiavulgaris, - /obj/item/clothing/accessory/horrible) + /obj/item/clothing/accessory/tie/horrible) if(!ispath(gift_type,/obj/item)) return diff --git a/code/game/objects/items/handheld_distress_beacon.dm b/code/game/objects/items/handheld_distress_beacon.dm index 05af16b13efc..26e537e02ef9 100644 --- a/code/game/objects/items/handheld_distress_beacon.dm +++ b/code/game/objects/items/handheld_distress_beacon.dm @@ -87,8 +87,8 @@ beacon_type = "Bodyguard beacon" recipient = "the Corporate Security Division" - ert_paths = list(/datum/emergency_call/goon/bodyguard) // "Weyland-Yutani Goon (Executive Bodyguard Detail)" - ert_short_names = list("SEND BODYGUARD") + ert_paths = list(/datum/emergency_call/wy_bodyguard, /datum/emergency_call/wy_bodyguard/goon, /datum/emergency_call/wy_bodyguard/pmc/sec, /datum/emergency_call/wy_bodyguard/pmc, /datum/emergency_call/wy_bodyguard/commando, /datum/emergency_call/wy_bodyguard/android) // "Weyland-Yutani Goon (Executive Bodyguard Detail)" + ert_short_names = list("SEND W-Y GUARD", "SEND GOON", "SEND PMC RIOT", "SEND PMC", "SEND COMMANDO", "SEND COMBAT ANDROID") // Provost office distress beacon held by Inspectors+ /obj/item/handheld_distress_beacon/provost diff --git a/code/game/objects/items/implants/implantneurostim.dm b/code/game/objects/items/implants/implantneurostim.dm index 21ee2542649b..510e13a32d7a 100644 --- a/code/game/objects/items/implants/implantneurostim.dm +++ b/code/game/objects/items/implants/implantneurostim.dm @@ -62,7 +62,7 @@ var/mob_pain_msg = "Excruciating pain shoots through [part ? "your [part.display_name]" : "you"]!" M.visible_message(SPAN_DANGER("[M] convulses in pain!"), SPAN_DANGER(mob_pain_msg)) - M.flash_eyes(1, TRUE) + M.flash_eyes(EYE_PROTECTION_FLAVOR, TRUE) M.apply_effect(10, STUN) M.apply_effect(10, WEAKEN) M.apply_damage(100, HALLOSS, part) diff --git a/code/game/objects/items/ore.dm b/code/game/objects/items/ore.dm index 51127fb4b596..561c4651b6ad 100644 --- a/code/game/objects/items/ore.dm +++ b/code/game/objects/items/ore.dm @@ -7,6 +7,8 @@ /obj/item/ore/uranium name = "pitchblende" + desc = "An ore containing Uranium. Just looking at it makes your head feel fuzzy... it's slightly luminescent." + desc_lore = "Colonies all over the Neroid Sector mine extensively for pitchblende - uranium ore. It finds use in outdated fission reactors, nuclear weapons, and more commonly armor-piercing munitions. A W-Y funded research team determined that radiation poisoning from using these munitions is 'negligible'." icon_state = "Uranium ore" oretag = "uranium" @@ -69,7 +71,7 @@ /obj/item/ore/slag name = "Slag" - desc = "Completely useless" + desc = "Completely useless." icon_state = "slag" oretag = "slag" black_market_value = 0 diff --git a/code/game/objects/items/pamphlets.dm b/code/game/objects/items/pamphlets.dm index 0135c7fb5ad6..9fa944e6487c 100644 --- a/code/game/objects/items/pamphlets.dm +++ b/code/game/objects/items/pamphlets.dm @@ -54,6 +54,12 @@ icon_state = "pamphlet_medical" trait = /datum/character_trait/skills/medical +/obj/item/pamphlet/skill/science + name = "scientific instructional pamphlet" + desc = "A pamphlet used to quickly impart vital knowledge. This one has a scientific insignia." + icon_state = "pamphlet_science" + trait = /datum/character_trait/skills/science + /obj/item/pamphlet/skill/engineer name = "engineer instructional pamphlet" desc = "A pamphlet used to quickly impart vital knowledge. This one has an engineering insignia." diff --git a/code/game/objects/items/props/rocks.dm b/code/game/objects/items/props/rocks.dm index 2c2f19c9379e..df734c223084 100644 --- a/code/game/objects/items/props/rocks.dm +++ b/code/game/objects/items/props/rocks.dm @@ -48,3 +48,13 @@ . = ..() dir = pick(dir_list_limited)//only 4 variants of this, and thusly on 4 directions on the icon to randomize from +/obj/structure/prop/colorable_rock/colorable + name = "rocks" + desc = "A solidified collection of local minerals. When melted, becomes a substance best known as lava." + icon_state = "ground_colorable" + icon = 'icons/obj/structures/props/natural/rocks.dmi' + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + layer = TURF_LAYER + +/obj/structure/prop/colorable_rock/colorable/alt + icon_state = "ground_colorable_alt" diff --git a/code/game/objects/items/reagent_containers/autoinjectors.dm b/code/game/objects/items/reagent_containers/autoinjectors.dm index d7b2e1310d7e..7ace5e447cdd 100644 --- a/code/game/objects/items/reagent_containers/autoinjectors.dm +++ b/code/game/objects/items/reagent_containers/autoinjectors.dm @@ -23,10 +23,11 @@ var/mixed_chem = FALSE var/display_maptext = FALSE var/maptext_label + var/custom_chem_icon maptext_height = 16 - maptext_width = 16 - maptext_x = 18 - maptext_y = 3 + maptext_width = 24 + maptext_x = 4 + maptext_y = 2 /obj/item/reagent_container/hypospray/autoinjector/Initialize() . = ..() @@ -53,13 +54,19 @@ /obj/item/reagent_container/hypospray/autoinjector/update_icon() overlays.Cut() - if(uses_left) - overlays += "[chemname]_[uses_left]" if((isstorage(loc) || ismob(loc)) && display_maptext) maptext = SPAN_LANGCHAT("[maptext_label]") else maptext = "" + if(custom_chem_icon && uses_left) + var/image/cust_fill = image('icons/obj/items/syringe.dmi', src, "[custom_chem_icon]_[uses_left]") + cust_fill.color = mix_color_from_reagents(reagents.reagent_list) + overlays += cust_fill + return + if(uses_left) + overlays += "[chemname]_[uses_left]" + /obj/item/reagent_container/hypospray/autoinjector/get_examine_text(mob/user) . = ..() if(uses_left) @@ -200,6 +207,26 @@ amount_per_transfer_from_this = 15 uses_left = 1 +/obj/item/reagent_container/hypospray/autoinjector/meralyne + name = "meralyne autoinjector" + desc = "An auto-injector loaded with 3 uses of Meralyne, an advanced brute and circulatory damage medicine." + chemname = "meralyne" + custom_chem_icon = "custom" + amount_per_transfer_from_this = REAGENTS_OVERDOSE * INJECTOR_PERCENTAGE_OF_OD + volume = (REAGENTS_OVERDOSE * INJECTOR_PERCENTAGE_OF_OD) * INJECTOR_USES + display_maptext = TRUE + maptext_label = "Me" + +/obj/item/reagent_container/hypospray/autoinjector/dermaline + name = "dermaline autoinjector" + desc = "An auto-injector loaded with 3 uses of Dermaline, an advanced burn medicine." + chemname = "dermaline" + custom_chem_icon = "custom" + amount_per_transfer_from_this = REAGENTS_OVERDOSE * INJECTOR_PERCENTAGE_OF_OD + volume = (REAGENTS_OVERDOSE * INJECTOR_PERCENTAGE_OF_OD) * INJECTOR_USES + display_maptext = TRUE + maptext_label = "De" + /obj/item/reagent_container/hypospray/autoinjector/inaprovaline name = "inaprovaline autoinjector" chemname = "inaprovaline" @@ -250,6 +277,11 @@ else maptext = "" +/obj/item/reagent_container/hypospray/autoinjector/ultrazine/empty + name = "empty ultrazine autoinjector" + volume = 0 + uses_left = 0 + /obj/item/reagent_container/hypospray/autoinjector/ultrazine/liaison name = "white autoinjector" desc = "You know what they say, don't jab yourself with suspicious syringes." @@ -261,6 +293,8 @@ desc = "A strange glowing crystal with a spike at one end." icon = 'icons/obj/items/hunter/pred_gear.dmi' icon_state = "crystal" + injectSFX = 'sound/items/pred_crystal_inject.ogg' + injectVOL = 15 amount_per_transfer_from_this = REAGENTS_OVERDOSE volume = REAGENTS_OVERDOSE uses_left = 1 @@ -319,7 +353,7 @@ /obj/item/reagent_container/hypospray/autoinjector/empty name = "autoinjector (C-T)" desc = "A custom-made auto-injector, likely from research." - chemname = "custom" + custom_chem_icon = "custom" mixed_chem = TRUE amount_per_transfer_from_this = 5 volume = 15 @@ -330,13 +364,6 @@ . = ..() . += SPAN_NOTICE("It transfers [amount_per_transfer_from_this]u per injection and has a maximum of [volume/amount_per_transfer_from_this] injections.") -/obj/item/reagent_container/hypospray/autoinjector/empty/update_icon() - overlays.Cut() - if(uses_left) - var/image/cust_fill = image('icons/obj/items/syringe.dmi', src, "[chemname]_[uses_left]") - cust_fill.color = mix_color_from_reagents(reagents.reagent_list) - overlays += cust_fill - /obj/item/reagent_container/hypospray/autoinjector/empty/small name = "autoinjector (C-S)" amount_per_transfer_from_this = 15 @@ -355,7 +382,7 @@ /obj/item/reagent_container/hypospray/autoinjector/empty/skillless name = "Autoinjector (E-T)" desc = "A custom-made EZ autoinjector, likely from research. Injects its entire payload immediately and doesn't require any training." - chemname = "custom_ez" + custom_chem_icon = "custom_ez" icon_state = "empty_ez" skilllock = SKILL_MEDICAL_DEFAULT amount_per_transfer_from_this = 15 @@ -398,7 +425,7 @@ skilllock = SKILL_MEDICAL_MEDIC volume = 90 amount_per_transfer_from_this = 15 - chemname = "custom_medic" + custom_chem_icon = "custom_medic" icon_state = "empty_medic" uses_left = 0 diff --git a/code/game/objects/items/reagent_containers/food/cans.dm b/code/game/objects/items/reagent_containers/food/cans.dm index c95353decf06..966f5ea3b734 100644 --- a/code/game/objects/items/reagent_containers/food/cans.dm +++ b/code/game/objects/items/reagent_containers/food/cans.dm @@ -132,7 +132,7 @@ playsound(M.loc, consume_sound, 15, 1) return 1 - else if( istype(M, /mob/living/carbon/human) ) + else if( istype(M, /mob/living/carbon) ) if (!open) to_chat(user, SPAN_NOTICE("You need to open the [object_fluff]!")) return diff --git a/code/game/objects/items/reagent_containers/food/condiment.dm b/code/game/objects/items/reagent_containers/food/condiment.dm index 13385203bf9f..12b6cea01a21 100644 --- a/code/game/objects/items/reagent_containers/food/condiment.dm +++ b/code/game/objects/items/reagent_containers/food/condiment.dm @@ -22,7 +22,7 @@ if(M == user) to_chat(M, SPAN_NOTICE("You swallow some of contents of [src].")) - else if(istype(M, /mob/living/carbon/human)) + else if(istype(M, /mob/living/carbon)) user.affected_message(M, SPAN_HELPFUL("You start feeding [user == M ? "yourself" : "[M]"] [src]."), SPAN_HELPFUL("[user] starts feeding you [src]."), @@ -120,7 +120,7 @@ if("cornoil") name = "Corn Oil" desc = "A delicious oil used in cooking. Made from corn." - icon_state = "oliveoil" + icon_state = "cornoil" center_of_mass = "x=16;y=6" if("sugar") name = "Sugar" diff --git a/code/game/objects/items/reagent_containers/food/drinks.dm b/code/game/objects/items/reagent_containers/food/drinks.dm index 4162345cedb5..2912a5590f65 100644 --- a/code/game/objects/items/reagent_containers/food/drinks.dm +++ b/code/game/objects/items/reagent_containers/food/drinks.dm @@ -40,7 +40,7 @@ playsound(M.loc,'sound/items/drink.ogg', 15, 1) return TRUE - else if(istype(M, /mob/living/carbon/human)) + else if(istype(M, /mob/living/carbon)) user.affected_message(M, SPAN_HELPFUL("You start feeding [user == M ? "yourself" : "[M]"] [src]."), diff --git a/code/game/objects/items/reagent_containers/food/fish_snacks.dm b/code/game/objects/items/reagent_containers/food/fish_snacks.dm index 90780c964247..d67daeee8e66 100644 --- a/code/game/objects/items/reagent_containers/food/fish_snacks.dm +++ b/code/game/objects/items/reagent_containers/food/fish_snacks.dm @@ -11,7 +11,6 @@ var/guttable = TRUE var/gutted = FALSE var/gut_icon_state = null - var/gut_time = 3 var/initial_desc = "" var/list/guttable_atoms = list(/obj/item/reagent_container/food/snacks/meat, /obj/item/reagent_container/food/snacks/meat/synthmeat)//placeholders, for now var/base_gut_meat = /obj/item/reagent_container/food/snacks/meat @@ -54,27 +53,25 @@ to_chat(user, SPAN_WARNING("[src] cannot be gutted.")) return if(W.sharp == IS_SHARP_ITEM_ACCURATE || W.sharp == IS_SHARP_ITEM_BIG) - user.visible_message("[user] starts to cut [W] open and clean it.", "You start to gut [src].") + user.visible_message("[user] cuts [src] open and cleans it.", "You gut [src].") playsound(loc, 'sound/effects/blobattack.ogg', 25, 1) - if(do_after(user, gut_time SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE, src, INTERRUPT_ALL)) - var/gut_loot = roll(total_length/2 - min_length) - if(gut_loot <= 0) - gut_loot = 1 - - gibs(user.loc) - new base_gut_meat(user.loc)//always spawn at least one meat per gut - playsound(loc, 'sound/effects/splat.ogg', 25, 1)//replace - for(var/i = 1, i < gut_loot, i++) - var/T = pick(guttable_atoms) - new T(user.loc) - gutted = TRUE - update_desc() - update_icon() - return + var/gut_loot = roll(total_length / 2 - min_length) + if(gut_loot <= 0) + gut_loot = 1 + + gibs(user.loc) + new base_gut_meat(get_turf(user)) //always spawn at least one meat per gut + playsound(loc, 'sound/effects/splat.ogg', 25, 1)//replace + gutted = TRUE + update_desc() + update_icon() + for(var/i in 1 to gut_loot) + var/atom_type = pick(guttable_atoms) + new atom_type(get_turf(user)) /obj/item/reagent_container/food/snacks/fishable/crab name = "\improper spindle crab" - desc = "Looks like a little crab" + desc = "Looks like a little crab." icon_state = "crab" gut_icon_state = "crab_gutted" guttable = TRUE @@ -108,6 +105,11 @@ max_length = 14 base_gut_meat = /obj/item/reagent_container/food/snacks/meat/fish/squid guttable_atoms = list(/obj/item/reagent_container/food/snacks/meat/fish/squid) + bitesize = 1 + +/obj/item/reagent_container/food/snacks/fishable/squid/whorl/Initialize() + . = ..() + reagents.add_reagent("fish", 1) /obj/item/reagent_container/food/snacks/fishable/squid/sock name = "sock squid" @@ -119,11 +121,12 @@ max_length = 5 base_gut_meat = /obj/item/reagent_container/food/snacks/meat/fish/squid/alt guttable_atoms = list(/obj/item/reagent_container/food/snacks/meat/fish/squid/alt) + bitesize = 1 /obj/item/reagent_container/food/snacks/fishable/squid/sock/Initialize() . = ..() reagents.add_reagent("fish", 1) - bitesize = 1 + //----------------// //WORMS @@ -134,11 +137,12 @@ guttable = TRUE gut_icon_state = "worm_redring_gutted" base_gut_meat = /obj/item/fish_bait + bitesize = 1 /obj/item/reagent_container/food/snacks/fishable/worm/Initialize() . = ..() reagents.add_reagent("enzyme", 1) - bitesize = 1 + //todo, attackby with a knife so you can make bait objects for fishing with /obj/item/reagent_container/food/snacks/fishable/quadtopus name = "quadtopus" @@ -153,11 +157,12 @@ icon_state = "shell_clam" guttable = TRUE base_gut_meat = /obj/item/ore/pearl + bitesize = 1 /obj/item/reagent_container/food/snacks/fishable/shell/clam/Initialize() . = ..() reagents.add_reagent("fish", 1) - bitesize = 1 + //--------------------// // Pan Fish, Regular fish you can gut and clean (additional fish past this point) @@ -176,7 +181,7 @@ /obj/item/reagent_container/food/snacks/fishable/fish/bluegill/Initialize() . = ..() reagents.add_reagent("fish", 4) - bitesize = 2 + /obj/item/reagent_container/food/snacks/fishable/fish/bass name = "bass" @@ -193,7 +198,7 @@ /obj/item/reagent_container/food/snacks/fishable/fish/bass/Initialize() . = ..() reagents.add_reagent("fish", 4) - bitesize = 3 + /obj/item/reagent_container/food/snacks/fishable/fish/catfish name = "catfish" @@ -202,11 +207,46 @@ icon_state = "catfish" min_length = 10 max_length = 108 + bitesize = 6 /obj/item/reagent_container/food/snacks/fishable/fish/catfish/Initialize() . = ..() reagents.add_reagent("fish", 4) - bitesize = 6 + + +/obj/item/reagent_container/food/snacks/fishable/fish/salmon + + name = "salmon" + desc = "A red and scaly river-dwelling fish!" + guttable = TRUE + icon_state = "salmon" + min_length = 12 + max_length = 44 + gut_icon_state = "salmon_gutted" + bitesize = 5 + base_gut_meat = /obj/item/reagent_container/food/snacks/meat/fish/salmon + guttable_atoms = list(/obj/item/reagent_container/food/snacks/meat/fish/salmon) + +/obj/item/reagent_container/food/snacks/fishable/fish/salmon/Initialize() + . = ..() + reagents.add_reagent("fish", 4) + +/obj/item/reagent_container/food/snacks/fishable/fish/white_perch + + name = "white perch" + desc = "A small and spiny invasive fish, kill it!" + guttable = TRUE + icon_state = "white_perch" + min_length = 6 + max_length = 22 + gut_icon_state = "white_perch_gutted" + bitesize = 5 + base_gut_meat = /obj/item/reagent_container/food/snacks/meat/fish/white_perch + guttable_atoms = list(/obj/item/reagent_container/food/snacks/meat/fish/white_perch) + +/obj/item/reagent_container/food/snacks/fishable/fish/white_perch/Initialize() + . = ..() + reagents.add_reagent("fish", 4) //--------------------// //Urchins, spikey bottom-feeding creatures @@ -217,6 +257,11 @@ guttable = FALSE min_length = 2 max_length = 9 + bitesize = 1 + +/obj/item/reagent_container/food/snacks/fishable/urchin/purple/Initialize() + . = ..() + reagents.add_reagent("fish", 1) /obj/item/reagent_container/food/snacks/fishable/urchin/red name = "red urchin" @@ -225,4 +270,10 @@ icon_state = "urchin_red" min_length = 2 max_length = 9 + bitesize = 1 + +/obj/item/reagent_container/food/snacks/fishable/urchin/red/Initialize() + . = ..() + reagents.add_reagent("fish", 1) + //finished code on worm and clam fish and items, added 3 new fish types (catfish being non-guttable is on purpose), worm now drops bait when gutted diff --git a/code/game/objects/items/reagent_containers/food/mre_food/uscm.dm b/code/game/objects/items/reagent_containers/food/mre_food/uscm.dm index d4225b6e3768..b954b5dc1118 100644 --- a/code/game/objects/items/reagent_containers/food/mre_food/uscm.dm +++ b/code/game/objects/items/reagent_containers/food/mre_food/uscm.dm @@ -26,7 +26,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/porkribs name = "boneless pork ribs" icon_state = "boneless pork ribs" - desc = "You can't even taste processed meat taste under all those spices!" + desc = "You can't even taste the processed meat protein under all those spices!" /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/porkribs/Initialize() . = ..() @@ -37,7 +37,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/grilledchicken name = "grilled chicken" icon_state = "grilled chicken" - desc = "Doesn't actually tastes like grilled one, but do you really expect that luxury here?" + desc = "Doesn't actually taste like grilled chicken, but did you really expect that luxury here?" /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/grilledchicken/Initialize() . = ..() @@ -47,7 +47,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/pizzasquare name = "pizza square" icon_state = "pizza square" - desc = "An American classic, been added and removed from the menu about 27 times at this point, still loved despite being cheap parody of a real thing." + desc = "An American classic that's been added and removed from the menu about 27 times. Still loved despite being a cheap parody of the real thing." /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/pizzasquare/Initialize() . = ..() @@ -61,7 +61,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/pepperonisquare name = "pepperoni pizza square" icon_state = "pepperoni square" - desc = "A newer addition to the timeless MRE classic, very similar." + desc = "A newer addition to the standard MRE. Like the ordinary pizza square, its texture is that of a piece of greased cardboard. However, this one has some overly spiced circles of imitation pepperoni." /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/pepperonisquare/Initialize() . = ..() @@ -74,7 +74,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/chickentender name = "chicken tender" icon_state = "chicken tender" - desc = "Really tasty and has nice crumbs texture, but makes you wish for some good chicken wings..." + desc = "Surprisingly tasty, but mostly succeeds in making you want the real thing." /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/chickentender/Initialize() . = ..() @@ -85,7 +85,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/grilledchickenbreast name = "grilled chicken breast" icon_state = "grilled chicken breast" - desc = "Very plain grilled chicken meat, simple but yet very classic taste." + desc = "Doesn't actually taste like grilled chicken, but if you're fine with bland food and don't mind the chewy texture, it's not that bad." /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/grilledchickenbreast/Initialize() . = ..() @@ -95,7 +95,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/spaghettichunks name = "meat spaghetti" icon_state = "spaghetti chunks" - desc = "Spaghetti with some cooked meat chunks, all covered in a tomato sauce." + desc = "Limp, rubbery noodles with some cooked meat chunks, all covered in a tomato sauce. It's unpleasantly cold and somewhat slimy. Might be more appetizing if you heated it up, but you don't have the time for that." /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/spaghettichunks/Initialize() . = ..() @@ -107,7 +107,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/chiliconcarne name = "chili con carne" icon_state = "chili con carne" - desc = "Spicy minced meat dish, there is no limit on adding chili in there, having some milk in near proximity is recommended." + desc = "An incredibly spicy minced meat dish. There's probably more chili powder than meat in here. Having some milk in close proximity is recommended." /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/chiliconcarne/Initialize() . = ..() @@ -120,7 +120,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/noodlesoup name = "noodle soup" icon_state = "noodle soup" - desc = "Very nourishing noodle soup with vegetables and a chicken flavor, will keep you warm for a long time if heated." + desc = "A watery noodle soup with vegetables, a chicken flavor, and some nutrient powder to round out the meal. Will keep you warm for a long time if heated." /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/noodlesoup/Initialize() . = ..() @@ -132,7 +132,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/feijoada name = "feijoada" icon_state = "brazilian-style feijoada" - desc = "A Brazillian dish filled with black beans, different kinds of meat, vegetables and spices, very nourishing and rich in flavor." + desc = "A Brazillian dish filled with black beans, different kinds of meat, vegetables and spices. Rich in flavor and very filling." /obj/item/reagent_container/food/snacks/mre_food/uscm/entree/feijoada/Initialize() . = ..() @@ -163,7 +163,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/cracker name = "cracker" icon_state = "cracker" - desc = "Crumbs easily but it's the most satisfying part." + desc = "Crumbles easily. You'll never quite get the crumbs out of your uniform." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/cracker/Initialize() . = ..() @@ -173,7 +173,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/mashedpotatoes name = "mashed potatoes" icon_state = "mashed potatoes" - desc = "Really soft and gentle, goes well with a main dish." + desc = "Great for someone with a busted jaw, and fans of room temperature puree." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/mashedpotatoes/Initialize() . = ..() @@ -185,7 +185,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/risotto name = "risotto" icon_state = "risotto" - desc = "A bit more exotic, but Italian cuisine never dissapoints." + desc = "A bit more exotic, but Italian cuisine never disappoints. Budget imitation Italian made with a shelf life of 3-5 years, however, often does." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/risotto/Initialize() . = ..() @@ -197,7 +197,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/onigiri name = "rice onigiri" icon_state = "rice onigiri" - desc = "Cooked rice in a form of a triangle, covered in a seaweed at the bottom, doesn't fall apart, surprisingly." + desc = "Cooked rice in the form of a triangle with a seaweed wrap at the bottom. Well... you think it might be seaweed." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/onigiri/Initialize() . = ..() @@ -208,7 +208,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/cornbread name = "cornbread" icon_state = "cornbread" - desc = "Almost universally hated, very dry and simple taste of it really gets old fast. Requisitions probably has ass-load of it in the back. Nobody eats that shit." + desc = "Universally hated for being incredibly dry and tasting like uncooked flour. Requisitions probably has an ass-load of it in the back. Nobody eats that shit." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/cornbread/Initialize() . = ..() @@ -219,7 +219,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/kale name = "marinated kale" icon_state = "kale" - desc = "A sort of cabbage, marinated in spices, still has a lot of moist and crunch to it." + desc = "Dried plant covered in spices. Kale can be a hard sell even when it's not military grade." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/kale/Initialize() . = ..() @@ -230,7 +230,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/tortillas name = "tortillas" icon_state = "tortillas" - desc = "A kind of flat bread, goes well with adding other things onto it." + desc = "Added to the MRE with the idea of wrapping your entree in it. This idea literally falls apart when you get a spaghetti square." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/tortillas/Initialize() . = ..() @@ -239,7 +239,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/biscuits name = "biscuits" icon_state = "biscuits" - desc = "An assortment of biscuits, go well with adding other things onto them." + desc = "An assortment of biscuits. Always hard and somewhat stale, but goes well with other things." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/biscuits/Initialize() . = ..() @@ -249,7 +249,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/cinnamonappleslices name = "cinnamon apple slices" icon_state = "cinnamon apple slices" - desc = "A bit gooey pieces of apple in cinnamon sauce, a bit sticky but tasty." + desc = "Gooey pieces of apple in a cinnamon sauce. Noteable for being sweet and even somewhat delicious, but also terribly sticky. Wash your hands after eating, or your gun will be horribly tacky for a year." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/cinnamonappleslices/Initialize() . = ..() @@ -259,7 +259,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/side/boiledrice name = "boiled rice" icon_state = "rice" - desc = "A packet of plain boiled rice, a bit boring but would go well with additives." + desc = "A packet of plain boiled rice. Bland and boring, but would go well with additives." /obj/item/reagent_container/food/snacks/mre_food/uscm/side/boiledrice/Initialize() . = ..() @@ -282,7 +282,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/biscuit name = "biscuit" icon_state = "biscuit" - desc = "Reminds you of a cracker, but has a lot more different grains in it, which gives it more unique texture and flavor." + desc = "Reminds you of a cracker, but this one's whole grain. Purportedly part of a USCM health initiative, it has a unique texture and flavor." /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/biscuit/Initialize() . = ..() @@ -292,7 +292,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/meatballs name = "meatballs" icon_state = "meatballs" - desc = "You can even taste muscle fibers, despite it being a cooked minced meat." + desc = "Despite being a ball of cooked, minced meat, you can still taste the gristle." /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/meatballs/Initialize() . = ..() @@ -303,7 +303,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/pretzels name = "pretzels" icon_state = "pretzels" - desc = "Really salty and crunchy, thirst provoking." + desc = "Salty and crunchy, these pretzels will have you parched in no time." /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/pretzels/Initialize() . = ..() @@ -313,7 +313,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/sushi name = "sushi" icon_state = "sushi" - desc = "You kinda highly doubt that raw fish wouldn't go bad in here, it barely smells like one... is it even fish?..." + desc = "You highly doubt that raw fish wouldn't go bad in here. It barely smells like the real thing... is this even fish?" /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/sushi/Initialize() . = ..() @@ -325,7 +325,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/peanuts name = "peanuts" icon_state = "peanuts" - desc = "Some crunchy salted peanuts, easy to get addicted to." + desc = "Some crunchy salted peanuts. Surprisingly, not a bad snack. You might even find yourself wanting more." /obj/item/reagent_container/food/snacks/mre_food/uscm/snack/peanuts/Initialize() . = ..() @@ -355,7 +355,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/spicedapples name = "spiced apples" icon_state = "spiced apples" - desc = "A bit dry pieces of apple in cinnamon spice, makes your mouth water, but still tasty." + desc = "Dried apple slices spiced with cinnamon. Gives you cottonmouth, but that's why MREs include water." /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/spicedapples/Initialize() . = ..() @@ -365,7 +365,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/chocolatebrownie name = "chocolate brownie" icon_state = "chocolate brownie" - desc = "Coco filled cake base with a chocolate frosting on top, has a deep chocolate flavor." + desc = "A chocolatey square of cake. Home-made brownies are dense and chewy in a good way. This brownie is not home-made." /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/chocolatebrownie/Initialize() . = ..() @@ -376,7 +376,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/sugarcookie name = "sugar cookie" icon_state = "sugar cookie" - desc = "Baked cookie frosted with a caramelized sugar." + desc = "A sweet cookie. A little hard, but still better than most of the entrees." /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/sugarcookie/Initialize() . = ..() @@ -397,7 +397,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/flan name = "flan" icon_state = "flan" - desc = "A soft milky biscuit pie." + desc = "A soft milky biscuit pie. Somewhat flaky and crumbly to the touch." /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/flan/Initialize() . = ..() @@ -409,7 +409,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/honeyflan name = "honey flan" icon_state = "honey flan" - desc = "A soft milky biscuit pie, covered in honey topping." + desc = "A soft milky biscuit pie, covered in a honey topping. The topping itself is more of a thick gel than a syrupy sauce. Maybe the manufacturer learned from the cinnamon apple slices." /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/honeyflan/Initialize() . = ..() @@ -421,7 +421,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/lemonpie name = "lemon pie" icon_state = "lemon pie" - desc = "A creamy pie with a milky lemon filling and a thick crust." + desc = "A pie with a thick, overpoweringly lemon flavored filling and a dry, chunky crust." /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/lemonpie/Initialize() . = ..() @@ -434,7 +434,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/limepie name = "key lime pie" icon_state = "key lime pie" - desc = "A creamy pie with a milky lime filling and a thick crust." + desc = "A pie with an overpoweringly sour lime flavored filling and a dry, chunky crust" /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/limepie/Initialize() . = ..() @@ -447,7 +447,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/brigadeiro name = "brigadeiro balls" icon_state = "brigadeiro balls" - desc = "A traditional Brazillian dessert, made out of condensed milk, cocoa and butter, very soft and sugary in taste." + desc = "A traditional Brazillian dessert, made out of condensed milk, cocoa and butter. Allegedly." /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/brigadeiro/Initialize() . = ..() @@ -459,7 +459,7 @@ /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/strawberrytoaster name = "strawberry toaster pastry" icon_state = "strawberry toaster pastry" - desc = "A crunchy biscuit with a strawberry jam inside it, with a frosting on top." + desc = "A crunchy biscuit with artifical tasting strawberry jam inside of it. Dry frosting on the top completes the look of a popular breakfast product. Despite the impression, this is actually a toaster pastry: the manufacturer wanted to avoid copyright infringement." /obj/item/reagent_container/food/snacks/mre_food/uscm/dessert/strawberrytoaster/Initialize() . = ..() @@ -475,7 +475,7 @@ name = "spread packet (cheese)" icon = 'icons/obj/items/food/mre_food/uscm.dmi' icon_state = "spread" - desc = "A creamy and cheesy spread, made out of a processed cheese, combines well with tortillas and other snacks." + desc = "A creamy and cheesy spread, made out of a processed cheese. Combines well with tortillas and other snacks." open_sound = "rip" open_message = "You pull open the package of the spread!" volume = 6 @@ -504,7 +504,7 @@ /obj/item/reagent_container/food/drinks/cans/spread/jalapeno name = "spread packet (jalapeno cheese)" - desc = "A creamy and cheesy spread, made out of a processed cheese, combines well with tortillas and other snacks, this one has a spicy jalapeno flavor." + desc = "A creamy and cheesy spread, made out of a processed cheese. Combines well with tortillas and other snacks; this one has a spicy jalapeno flavor." flavor = "jalapeno cheese spread" /obj/item/reagent_container/food/drinks/cans/spread/jalapeno/Initialize() @@ -514,7 +514,7 @@ /obj/item/reagent_container/food/drinks/cans/spread/peanut_butter name = "spread packet (peanut butter)" - desc = "A creamy and nutty spread, made out of a processed peanuts, combines well with tortillas and other snacks." + desc = "A creamy and nutty spread, made out of processed peanuts. Combines well with tortillas and other snacks." flavor = "peanut butter" /obj/item/reagent_container/food/drinks/cans/spread/peanut_butter/Initialize() @@ -526,7 +526,7 @@ /obj/item/reagent_container/food/drinks/beverage_drink name = "beverage powder packet" - desc = "A packet of a beverage, to be mixed with water, makes a ready-in-a-field drink." + desc = "Powdered flavoring that can be mixed in water for a ready-in-a-field drink." icon = 'icons/obj/items/food/mre_food/uscm.dmi' icon_state = "beverage" volume = 20 @@ -541,7 +541,7 @@ /obj/item/reagent_container/food/drinks/beverage_drink/orange name = "electrolyte beverage powder packet (orange)" - desc = "A packet of an electrolyte beverage, to be mixed with water, makes a ready-in-a-field drink. Has a citrusy orange flavor." + desc = "Powdered orange flavoring that can be mixed in water for a ready-in-a-field drink. Contains electrolytes that are supposed to help with hydration." /obj/item/reagent_container/food/drinks/beverage_drink/orange/Initialize() . = ..() @@ -549,7 +549,7 @@ /obj/item/reagent_container/food/drinks/beverage_drink/lemonlime name = "electrolyte beverage powder packet (lemon-lime)" - desc = "A packet of an electrolyte beverage, to be mixed with water, makes a ready-in-a-field drink. Has a citrusy lemon-lime flavor." + desc = "Powdered lemon-lime flavoring that can be mixed in water for a ready-in-a-field drink. Contains electrolytes that are supposed to help with hydration." /obj/item/reagent_container/food/drinks/beverage_drink/lemonlime/Initialize() . = ..() @@ -557,7 +557,7 @@ /obj/item/reagent_container/food/drinks/beverage_drink/chocolate name = "protein drink beverage powder packet (milk chocolate)" - desc = "A packet of a protein drink, to be mixed with water, makes a ready-in-a-field drink. Has a chocolate flavor." + desc = "A packet of powdered protein mix that can be added to water for a ready-in-a-field drink. Has a chocolate flavor." /obj/item/reagent_container/food/drinks/beverage_drink/chocolate/Initialize() . = ..() @@ -565,7 +565,7 @@ /obj/item/reagent_container/food/drinks/beverage_drink/chocolate_hazelnut name = "protein drink beverage powder packet (chocolate hazelnut)" - desc = "A packet of a protein drink, to be mixed with water, makes a ready-in-a-field drink. Has a chocolate hazelnut flavor." + desc = "A packet of powdered protein mix that can be added to water for a ready-in-a-field drink. Has a chocolate hazelnut flavor." /obj/item/reagent_container/food/drinks/beverage_drink/chocolate_hazelnut/Initialize() . = ..() diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index ea3a6c8f91aa..c0ebf2dc0ad1 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -2217,7 +2217,7 @@ /obj/item/reagent_container/food/snacks/sliceable/meatbread name = "meatbread loaf" - desc = "The culinary base of every self-respecting eloquen/tg/entleman." + desc = "The culinary base of every self-respecting eloquent gentleman." icon_state = "meatbread" icon = 'icons/obj/items/food/bread.dmi' slice_path = /obj/item/reagent_container/food/snacks/meatbreadslice @@ -3519,6 +3519,7 @@ reagents.add_reagent("nutriment", 4) reagents.add_reagent("coco", 2) reagents.add_reagent("tramadol", 1) //May be powergamed but it's a single unit. + reagents.add_reagent("bicaridine", 2) //The namesake of the bar. /obj/item/reagent_container/food/snacks/wrapped/twe_bar name = "ORP oat bisuit" diff --git a/code/game/objects/items/reagent_containers/food/snacks/meat.dm b/code/game/objects/items/reagent_containers/food/snacks/meat.dm index 252f0dfb6a58..c1c02e9b05ed 100644 --- a/code/game/objects/items/reagent_containers/food/snacks/meat.dm +++ b/code/game/objects/items/reagent_containers/food/snacks/meat.dm @@ -74,8 +74,8 @@ /obj/item/reagent_container/food/snacks/meat/fish name = "fish meat" desc = "Meat from a fish." - icon_state = "fish_meat" - icon = 'icons/obj/items/fishing_atoms.dmi' + icon_state = "fishfillet" + icon = 'icons/obj/items/food/fish.dmi' /obj/item/reagent_container/food/snacks/meat/fish/crab name = "crab meat" @@ -107,3 +107,15 @@ name = "bluegill meat" desc = "Small strips of pan frying meat!" icon_state = "bluegill_meat" + +/obj/item/reagent_container/food/snacks/meat/fish/salmon + + name = "salmon meat" + desc = "Considered a 'fancy' cut of fish!" + icon_state = "salmon_meat" + +/obj/item/reagent_container/food/snacks/meat/fish/white_perch + + name = "white perch meat" + desc = "meat of an invasive fish, its oily.." + icon_state = "white_perch_meat" diff --git a/code/game/objects/items/reagent_containers/glass.dm b/code/game/objects/items/reagent_containers/glass.dm index d247827c6db6..a4fb442653f9 100644 --- a/code/game/objects/items/reagent_containers/glass.dm +++ b/code/game/objects/items/reagent_containers/glass.dm @@ -171,30 +171,35 @@ reagents.clear_reagents() return -/obj/item/reagent_container/glass/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/reagent_container/glass/attackby(obj/item/W, mob/user) if(HAS_TRAIT(W, TRAIT_TOOL_PEN)) var/prior_label_text - var/datum/component/label/labelcomponent = src.GetComponent(/datum/component/label) - if(labelcomponent) + var/datum/component/label/labelcomponent = GetComponent(/datum/component/label) + if(labelcomponent && labelcomponent.has_label()) prior_label_text = labelcomponent.label_name - var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label", prior_label_text)) - if(tmp_label == "" || !tmp_label) - if(labelcomponent) - labelcomponent.remove_label() - user.visible_message(SPAN_NOTICE("[user] removes the label from \the [src]."), - SPAN_NOTICE("You remove the label from \the [src].")) - return - else - return + var/tmp_label = tgui_input_text(user, "Enter a label for [src] (or nothing to remove)", "Label", prior_label_text, MAX_NAME_LEN, ui_state=GLOB.not_incapacitated_state) + if(isnull(tmp_label)) + return // Canceled + if(!tmp_label) + if(prior_label_text) + log_admin("[key_name(usr)] has removed label from [src].") + user.visible_message(SPAN_NOTICE("[user] removes label from [src]."), + SPAN_NOTICE("You remove the label from [src].")) + labelcomponent.clear_label() + return if(length(tmp_label) > MAX_NAME_LEN) to_chat(user, SPAN_WARNING("The label can be at most [MAX_NAME_LEN] characters long.")) - else - user.visible_message(SPAN_NOTICE("[user] labels [src] as \"[tmp_label]\"."), - SPAN_NOTICE("You label [src] as \"[tmp_label]\".")) - AddComponent(/datum/component/label, tmp_label) - playsound(src, "paper_writing", 15, TRUE) - else - . = ..() + return + if(prior_label_text == tmp_label) + to_chat(user, SPAN_WARNING("The label already says \"[tmp_label]\".")) + return + user.visible_message(SPAN_NOTICE("[user] labels [src] as \"[tmp_label]\"."), + SPAN_NOTICE("You label [src] as \"[tmp_label]\".")) + AddComponent(/datum/component/label, tmp_label) + playsound(src, "paper_writing", 15, TRUE) + return + + return ..() /obj/item/reagent_container/glass/beaker name = "beaker" @@ -209,7 +214,7 @@ update_icon() /obj/item/reagent_container/glass/beaker/pickup(mob/user) - ..() + . = ..() update_icon() /obj/item/reagent_container/glass/beaker/dropped(mob/user) @@ -632,7 +637,7 @@ update_icon() /obj/item/reagent_container/glass/bucket/pickup(mob/user) - ..() + . = ..() update_icon() /obj/item/reagent_container/glass/bucket/dropped(mob/user) diff --git a/code/game/objects/items/reagent_containers/glass/bottle.dm b/code/game/objects/items/reagent_containers/glass/bottle.dm index e608cae2c541..106c4da15196 100644 --- a/code/game/objects/items/reagent_containers/glass/bottle.dm +++ b/code/game/objects/items/reagent_containers/glass/bottle.dm @@ -17,7 +17,7 @@ update_icon() /obj/item/reagent_container/glass/bottle/pickup(mob/user) - ..() + . = ..() update_icon() /obj/item/reagent_container/glass/bottle/dropped(mob/user) diff --git a/code/game/objects/items/reagent_containers/hypospray.dm b/code/game/objects/items/reagent_containers/hypospray.dm index b220382ac9ec..3386a3da21fc 100644 --- a/code/game/objects/items/reagent_containers/hypospray.dm +++ b/code/game/objects/items/reagent_containers/hypospray.dm @@ -44,7 +44,7 @@ //Transfer amount switch// /obj/item/reagent_container/hypospray/clicked(mob/user, list/mods) - if(!isnull(possible_transfer_amounts) && mods["alt"]) //Autoinjectors aren't supposed to have toggleable transfer amounts. + if(!isnull(possible_transfer_amounts) && mods[ALT_CLICK]) //Autoinjectors aren't supposed to have toggleable transfer amounts. if(!CAN_PICKUP(user, src)) return ..() amount_per_transfer_from_this = next_in_list(amount_per_transfer_from_this, possible_transfer_amounts) diff --git a/code/game/objects/items/reagent_containers/pill.dm b/code/game/objects/items/reagent_containers/pill.dm index d97a5ecb8bed..4569d18b5e95 100644 --- a/code/game/objects/items/reagent_containers/pill.dm +++ b/code/game/objects/items/reagent_containers/pill.dm @@ -276,3 +276,9 @@ /obj/item/reagent_container/pill/stimulant pill_initial_reagents = list("antag_stimulant" = 10) pill_icon_class = "stim" + +/obj/item/reagent_container/pill/imialky + pill_desc = "An Imidazoline-Alkysine (2:1) pill. Heals brain and eye damage." + pill_initial_reagents = list("imidazoline" = 10, "alkysine" = 5) + pill_icon_class = "alky" + diff --git a/code/game/objects/items/reagent_containers/robot_parts.dm b/code/game/objects/items/reagent_containers/robot_parts.dm index f08dd9a2f261..4005328c8c02 100644 --- a/code/game/objects/items/reagent_containers/robot_parts.dm +++ b/code/game/objects/items/reagent_containers/robot_parts.dm @@ -200,10 +200,7 @@ /obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob) ..() if(istype(W, /obj/item/device/flash)) - if(istype(user,/mob/living/silicon/robot)) - to_chat(user, SPAN_DANGER("How do you propose to do that?")) - return - else if(src.flash1 && src.flash2) + if(src.flash1 && src.flash2) to_chat(user, SPAN_NOTICE(" You have already inserted the eyes!")) return else if(src.flash1) diff --git a/code/game/objects/items/reagent_containers/spray.dm b/code/game/objects/items/reagent_containers/spray.dm index ab2e3fd65d0a..828a904956e1 100644 --- a/code/game/objects/items/reagent_containers/spray.dm +++ b/code/game/objects/items/reagent_containers/spray.dm @@ -78,6 +78,9 @@ if(!human_user.allow_gun_usage && reagents.contains_harmful_substances()) to_chat(user, SPAN_WARNING("Your programming prevents you from using this!")) return FALSE + if(MODE_HAS_MODIFIER(/datum/gamemode_modifier/ceasefire)) + to_chat(user, SPAN_WARNING("You will not break the ceasefire by doing that!")) + return FALSE var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src)) D.create_reagents(amount_per_transfer_from_this) diff --git a/code/game/objects/items/reagent_containers/syringes.dm b/code/game/objects/items/reagent_containers/syringes.dm index 0201bd23cdb8..ef4b99bea283 100644 --- a/code/game/objects/items/reagent_containers/syringes.dm +++ b/code/game/objects/items/reagent_containers/syringes.dm @@ -37,7 +37,7 @@ /obj/item/reagent_container/syringe/pickup(mob/user) - ..() + . = ..() update_icon() /obj/item/reagent_container/syringe/dropped(mob/user) @@ -311,7 +311,7 @@ update_icon() /obj/item/reagent_container/ld50_syringe/pickup(mob/user) - ..() + . = ..() update_icon() /obj/item/reagent_container/ld50_syringe/dropped(mob/user) diff --git a/code/game/objects/items/shards.dm b/code/game/objects/items/shards.dm index c46147b61084..2743cac8a724 100644 --- a/code/game/objects/items/shards.dm +++ b/code/game/objects/items/shards.dm @@ -272,3 +272,55 @@ /obj/item/shard/shrapnel/tutorial damage_on_move = 0 +/obj/item/sharp + name = "sharp dart shrapnel" + desc = "It looks like a used 9X-E Sticky Explosive Dart, useless now." + icon = 'icons/obj/items/weapons/projectiles.dmi' + icon_state = "sharp_explosive_dart" + sharp = IS_SHARP_ITEM_BIG + w_class = SIZE_SMALL + edge = TRUE + force = 0 + throwforce = 0 + garbage = TRUE + var/damage_on_move = 3 + var/count = 1 + +/obj/item/sharp/Initialize(mapload, dir) + . = ..() + if(dir && dir <= 6) + turn_object(90) + else + turn_object(270) + +/obj/item/sharp/proc/on_embed(mob/embedded_mob, obj/limb/target_organ) + return + +/obj/item/sharp/proc/on_embedded_movement(mob/living/embedded_mob) + if(!ishuman(embedded_mob)) + return + var/mob/living/carbon/human/H = embedded_mob + if(H.species.flags & NO_SHRAPNEL) + return + var/obj/limb/organ = embedded_organ + if(istype(organ)) + organ.take_damage(damage_on_move * count, 0, 0, no_limb_loss = TRUE) + embedded_mob.pain.apply_pain(damage_on_move * count) + +/obj/item/sharp/proc/turn_object(amount) + var/matrix/initial_matrix = matrix(transform) + initial_matrix.Turn(amount) + apply_transform(initial_matrix) + +/obj/item/sharp/explosive + name = "\improper 9X-E Sticky Explosive Dart" + +/obj/item/sharp/incendiary + name = "\improper 9X-T Sticky Incendiary Dart" + desc = "It looks like a used 9X-T Sticky Incendiary Dart, useless now." + icon_state = "sharp_incendiary_dart" + +/obj/item/sharp/flechette + name = "\improper 9X-F Flechette Dart" + desc = "It looks like a used 9X-F Flechette Dart, useless now." + icon_state = "sharp_flechette_dart" diff --git a/code/game/objects/items/stacks/flags.dm b/code/game/objects/items/stacks/flags.dm index aa967596993a..02e478307d0a 100644 --- a/code/game/objects/items/stacks/flags.dm +++ b/code/game/objects/items/stacks/flags.dm @@ -301,3 +301,23 @@ desc = "The flag of the Union of Progressive Peoples. Unity through Strength, Freedom through Unity." icon_state = "flag_upp_planted" flag_type = /obj/item/flag/plantable/upp + +// COLONIAL LIBERATION FRONT FLAG // +////////////////////////// + +/obj/item/flag/plantable/clf + name = "\improper Colonial Liberation Front flag" + desc = "The flag of the Colonial Liberation Front. This one looks ready to be planted into the ground." + icon = 'icons/obj/structures/plantable_flag.dmi' + icon_state = "flag_clf" + flag_type = /obj/structure/flag/plantable/clf + faction = FACTION_CLF + play_warcry = TRUE + warcry_sound = 'sound/effects/flag_warcry_clf.ogg' + warcry_extra_sound = 'sound/effects/flag_warcry_clf_extra.ogg' + +/obj/structure/flag/plantable/clf + name = "\improper Colonial Liberation Front flag" + desc = "The flag of the Colonial Liberation Front — a symbol of resistance and resolve. Strength forged in unity. Freedom earned through struggle." + icon_state = "flag_clf_planted" + flag_type = /obj/item/flag/plantable/clf diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 25e69e9e9d14..16d370c66cd5 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -199,6 +199,26 @@ to_chat(user, SPAN_WARNING("There are no wounds on [possessive] [affecting.display_name].")) return TRUE +/obj/item/stack/medical/advanced/bruise_pack/upgraded + name = "upgraded trauma kit" + singular_name = "upgraded trauma kit" + stack_id = "upgraded trauma kit" + + icon_state = "traumakit_upgraded" + desc = "An upgraded trauma treatment kit. Three times as effective as standard-issue, and non-replenishable. Use sparingly on only the most critical wounds." + + max_amount = 10 + amount = 10 + +/obj/item/stack/medical/advanced/bruise_pack/upgraded/Initialize(mapload, ...) + . = ..() + heal_brute = initial(heal_brute) * 3 // 3x stronger + +/obj/item/stack/medical/advanced/bruise_pack/upgraded/low_amount/Initialize(mapload, ...) + . = ..() + amount = rand(1,4) + update_icon() + /obj/item/stack/medical/advanced/bruise_pack/predator name = "mending herbs" singular_name = "mending herb" @@ -209,16 +229,7 @@ heal_brute = 15 stack_id = "mending herbs" alien = TRUE -/obj/item/stack/medical/advanced/ointment/predator - name = "soothing herbs" - singular_name = "soothing herb" - desc = "A poultice made of cold, blue petals that is rubbed on burns." - icon = 'icons/obj/items/hunter/pred_gear.dmi' - icon_state = "burn_herbs" - item_state = "burn_herbs" - heal_burn = 15 - stack_id = "soothing herbs" - alien = TRUE + /obj/item/stack/medical/advanced/ointment name = "burn kit" singular_name = "burn kit" @@ -269,6 +280,37 @@ to_chat(user, SPAN_WARNING("There are no burns on [possessive] [affecting.display_name].")) return TRUE +/obj/item/stack/medical/advanced/ointment/upgraded + name = "upgraded burn kit" + singular_name = "upgraded burn kit" + stack_id = "upgraded burn kit" + + icon_state = "burnkit_upgraded" + desc = "An upgraded burn treatment kit. Three times as effective as standard-issue, and non-replenishable. Use sparingly on only the most critical burns." + + max_amount = 10 + amount = 10 + +/obj/item/stack/medical/advanced/ointment/upgraded/Initialize(mapload, ...) + . = ..() + heal_burn = initial(heal_burn) * 3 // 3x stronger + +/obj/item/stack/medical/advanced/ointment/upgraded/low_amount/Initialize(mapload, ...) + . = ..() + amount = rand(1,4) + update_icon() + +/obj/item/stack/medical/advanced/ointment/predator + name = "soothing herbs" + singular_name = "soothing herb" + desc = "A poultice made of cold, blue petals that is rubbed on burns." + icon = 'icons/obj/items/hunter/pred_gear.dmi' + icon_state = "burn_herbs" + item_state = "burn_herbs" + heal_burn = 15 + stack_id = "soothing herbs" + alien = TRUE + /obj/item/stack/medical/splint name = "medical splints" singular_name = "medical splint" @@ -335,3 +377,24 @@ if(affecting.apply_splints(src, user, M, indestructible_splints)) // Referenced in external organ helpers. use(1) playsound(user, 'sound/handling/splint1.ogg', 25, 1, 2) + +/obj/item/stack/medical/splint/nano + name = "nano splints" + singular_name = "nano splint" + + icon_state = "nanosplint" + desc = "Advanced technology allows these splints to hold bones in place while being flexible and damage-resistant. These aren't plentiful, so use them sparingly on critical areas." + + indestructible_splints = TRUE + amount = 5 + max_amount = 5 + + stack_id = "nano splint" + +/obj/item/stack/medical/splint/nano/low_amount/Initialize(mapload, ...) + . = ..() + amount = rand(1,2) + update_icon() + +/obj/item/stack/medical/splint/nano/research + desc = "Advanced technology allows these splints to hold bones in place while being flexible and damage-resistant. Those are made from durable carbon fiber and dont look cheap, better use them sparingly." diff --git a/code/game/objects/items/stacks/predator.dm b/code/game/objects/items/stacks/predator.dm index 42874b907e02..39bce4b82c98 100644 --- a/code/game/objects/items/stacks/predator.dm +++ b/code/game/objects/items/stacks/predator.dm @@ -40,8 +40,8 @@ if(rturf.density) to_chat(user, SPAN_WARNING("They're in a wall!")) return TRUE - if(rarea.ceiling == CEILING_NONE) - to_chat(user, SPAN_WARNING("There's no ceiling to hang them from!")) + if(rarea.ceiling == CEILING_NONE && !(rarea.flags_area & AREA_YAUTJA_HANGABLE)) + to_chat(user, SPAN_WARNING("There's nothing to hang them from!")) return TRUE user.visible_message(SPAN_NOTICE("[user] secures the rope."), SPAN_NOTICE("You secure the rope.")) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index c65cbb3b0633..caa533ce427c 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -21,17 +21,32 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ new/datum/stack_recipe("sandstone wall", /turf/closed/wall/mineral/sandstone, 5, time = 50, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_ENGI, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ new/datum/stack_recipe("sandstone floor", /turf/open/floor/sandstone/runed, 1, on_floor = 1), \ new/datum/stack_recipe("sandstone handrail (crenellations)", /obj/structure/barricade/handrail/sandstone, 2, time = 2 SECONDS, one_per_turf = ONE_TYPE_PER_BORDER, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_TRAINED, min_time = 1 SECONDS), \ - new/datum/stack_recipe("sandstone handrail (flat)", /obj/structure/barricade/handrail/sandstone/b, 2, time = 2 SECONDS, one_per_turf = ONE_TYPE_PER_BORDER, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_TRAINED, min_time = 1 SECONDS), + new/datum/stack_recipe("sandstone handrail (flat)", /obj/structure/barricade/handrail/sandstone/b, 2, time = 2 SECONDS, one_per_turf = ONE_TYPE_PER_BORDER, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_TRAINED, min_time = 1 SECONDS), \ + new/datum/stack_recipe("dark sandstone handrail (cren.)", /obj/structure/barricade/handrail/sandstone/dark, 2, time = 2 SECONDS, one_per_turf = ONE_TYPE_PER_BORDER, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_TRAINED, min_time = 1 SECONDS), \ + new/datum/stack_recipe("dark sandstone handrail (flat)", /obj/structure/barricade/handrail/sandstone/b/dark, 2, time = 2 SECONDS, one_per_turf = ONE_TYPE_PER_BORDER, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_TRAINED, min_time = 1 SECONDS), )) GLOBAL_LIST_INIT(runedsandstone_recipes, list ( \ new/datum/stack_recipe("temple door", /obj/structure/machinery/door/airlock/sandstone/runed, 15, time = 10, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ - new/datum/stack_recipe("temple wall", /turf/closed/wall/mineral/sandstone/runed, 5, time = 50, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ - new/datum/stack_recipe("runed temple wall", /turf/closed/wall/mineral/sandstone/runed/decor, 5, time = 50, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ - new/datum/stack_recipe("temple floor", /turf/open/floor/sandstone/runed, 1, on_floor = 1), \ + new/datum/stack_recipe("dark temple door", /obj/structure/machinery/door/airlock/sandstone/runed/dark, 15, time = 10, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ + new/datum/stack_recipe_list("temple walls",list( \ + new/datum/stack_recipe("temple wall", /turf/closed/wall/mineral/sandstone/runed, 5, time = 50, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ + new/datum/stack_recipe("runed temple wall", /turf/closed/wall/mineral/sandstone/runed/decor, 5, time = 50, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ + new/datum/stack_recipe("dark engraved wall", /turf/closed/wall/cult, 5, time = 50, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ + ), 5), \ + new/datum/stack_recipe_list("temple floors",list( \ + new/datum/stack_recipe("tan floor", /turf/open/floor/sandstone/runed, 1, on_floor = 1), \ + new/datum/stack_recipe("engraved floor", /turf/open/floor/sandstone/cult, 1, on_floor = 1), \ + new/datum/stack_recipe("dark red floor", /turf/open/floor/sandstone/red, 1, on_floor = 1), \ + new/datum/stack_recipe("sun runed floor", /turf/open/floor/sandstone/red2, 1, on_floor = 1), \ + new/datum/stack_recipe("square runed floor", /turf/open/floor/sandstone/red3, 1, on_floor = 1), \ + ), 1), \ new/datum/stack_recipe("brazier frame", /obj/structure/prop/brazier/frame, 5, time = 5 SECONDS, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ new/datum/stack_recipe("wall torch frame", /obj/item/prop/torch_frame, 2, time = 2 SECONDS, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ new/datum/stack_recipe("alien chair", /obj/structure/bed/chair/comfy/yautja, 2, time = 2 SECONDS, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ + new/datum/stack_recipe("alien bed", /obj/structure/bed/alien/yautja, 3, time = 3 SECONDS, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ + new/datum/stack_recipe("tan statue", /obj/structure/showcase/yautja, 10, time = 30, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ + new/datum/stack_recipe("grey statue", /obj/structure/showcase/yautja/alt, 10, time = 30, skill_req = SKILL_ANTAG, skill_lvl = SKILL_ANTAG_HUNTER, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ )) GLOBAL_LIST_INIT(silver_recipes, list ( \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 590c8d68e6ec..c37e87219cdd 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -157,7 +157,8 @@ GLOBAL_LIST_INIT_TYPED(wood_recipes, /datum/stack_recipe, list ( \ new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ new/datum/stack_recipe("baseball bat", /obj/item/weapon/baseballbat, 10, time = 20, on_floor = 1), \ new/datum/stack_recipe("wooden cross", /obj/structure/prop/wooden_cross, 2, time = 10, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ - new/datum/stack_recipe("wooden pole", /obj/item/weapon/pole, 3, time = 10, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1) \ + new/datum/stack_recipe("wooden pole", /obj/item/weapon/pole, 3, time = 10, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ + new/datum/stack_recipe("fishing pole",/obj/item/fishing_pole, 25, time = 20, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1) \ )) /obj/item/stack/sheet/wood @@ -237,6 +238,10 @@ GLOBAL_LIST_INIT_TYPED(cardboard_recipes, /datum/stack_recipe, list ( \ new/datum/stack_recipe("empty speed loader box (M44 Heavy)", /obj/item/ammo_box/magazine/m44/heavy/empty), \ new/datum/stack_recipe("empty speed loader box (M44 Marksman)", /obj/item/ammo_box/magazine/m44/marksman/empty), \ null, \ + new/datum/stack_recipe("empty magazine box (M10)", /obj/item/ammo_box/magazine/m10/empty), \ + new/datum/stack_recipe("empty magazine box (M10 Ext)", /obj/item/ammo_box/magazine/m10/extended/empty), \ + new/datum/stack_recipe("empty magazine box (M10 Drum)", /obj/item/ammo_box/magazine/m10/drum/empty), \ + null, \ new/datum/stack_recipe("empty magazine box (M39)", /obj/item/ammo_box/magazine/m39/empty), \ new/datum/stack_recipe("empty magazine box (M39 AP)", /obj/item/ammo_box/magazine/m39/ap/empty), \ new/datum/stack_recipe("empty magazine box (M39 Ext)", /obj/item/ammo_box/magazine/m39/ext/empty), \ @@ -252,6 +257,7 @@ GLOBAL_LIST_INIT_TYPED(cardboard_recipes, /datum/stack_recipe, list ( \ new/datum/stack_recipe("empty magazine box (M4RA)", /obj/item/ammo_box/magazine/m4ra/empty), \ new/datum/stack_recipe("empty magazine box (M4RA AP)", /obj/item/ammo_box/magazine/m4ra/ap/empty), \ new/datum/stack_recipe("empty magazine box (M4RA Incen)", /obj/item/ammo_box/magazine/m4ra/incen/empty), \ + new/datum/stack_recipe("empty magazine box (M4RA Ext)", /obj/item/ammo_box/magazine/m4ra/ext/empty), \ null, \ new/datum/stack_recipe("empty magazine box (M41A)", /obj/item/ammo_box/magazine/empty), \ new/datum/stack_recipe("empty magazine box (M41A AP)", /obj/item/ammo_box/magazine/ap/empty), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d554bd6829e4..5158181aba99 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -93,7 +93,7 @@ Also change the icon to reflect the amount of sheets, if possible.*/ var/datum/stack_recipe_list/srl = recipe_list[recipes_sublist] recipe_list = srl.recipes var/t1 = text("Constructions from []Amount Left: []
    ", src, src.amount) - for(var/i = 1; i <= length(recipe_list), i++) + for(var/i = 1; i <= length(recipe_list); i++) var/E = recipe_list[i] if(isnull(E)) t1 += "
    " @@ -331,7 +331,7 @@ Also change the icon to reflect the amount of sheets, if possible.*/ break /obj/item/stack/clicked(mob/user, list/mods) - if(mods["alt"]) + if(mods[ALT_CLICK]) if(!CAN_PICKUP(user, src)) return if(amount <= 1) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 1a24ed4e37c8..9a155dc4371a 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -340,9 +340,33 @@ name = "leather satchel" desc = "A very fancy satchel made of fine leather. Looks pretty pricey." icon_state = "satchel" + item_state = "satchel" worn_accessible = TRUE storage_slots = null max_storage_space = 15 + item_state_slots = list(WEAR_BACK = "satchel") + var/mode = TRUE + +/obj/item/storage/backpack/satchel/post_skin_selection() + toggle_mode() + +/obj/item/storage/backpack/satchel/verb/toggle_mode() + set category = "Object" + set name = "Change Side of Strap" + set desc = "Changes which arm the strap of the satchel will be on." + set src in usr + if(!ishuman(usr)) + return + if(mode) + // Strap in the same arm + item_state_slots[WEAR_BACK] = "[item_state]_b" + mode = FALSE + else + // Strap in the opposite arm + item_state_slots[WEAR_BACK] = item_state + mode = TRUE + update_icon() + usr.update_inv_back() /obj/item/storage/backpack/satchel/withwallet @@ -359,54 +383,77 @@ /obj/item/storage/backpack/satchel/blue icon_state = "satchel_blue" + item_state = "satchel_blue" /obj/item/storage/backpack/satchel/black icon_state = "satchel_black" + item_state = "satchel_black" /obj/item/storage/backpack/satchel/norm name = "satchel" desc = "A trendy-looking satchel." icon_state = "satchel-norm" + item_state = "satchel-sec" + +/obj/item/storage/backpack/satchel/norm/blue + icon_state = "satchel-chem" + +/obj/item/storage/backpack/satchel/norm/red_line + icon_state = "satchel-med" + +/obj/item/storage/backpack/satchel/norm/orange_line + icon_state = "satchel-eng" + +/obj/item/storage/backpack/satchel/norm/green + icon_state = "satchel_hyd" /obj/item/storage/backpack/satchel/eng name = "industrial satchel" desc = "A tough satchel with extra pockets." icon_state = "satchel-eng" + item_state = "satchel-eng" /obj/item/storage/backpack/satchel/med name = "medical satchel" desc = "A sterile satchel used in medical departments." icon_state = "satchel-med" + item_state = "satchel-med" /obj/item/storage/backpack/satchel/vir name = "virologist satchel" desc = "A sterile satchel with virologist colors." icon_state = "satchel-vir" + item_state = "satchel-vir" /obj/item/storage/backpack/satchel/chem name = "chemist satchel" desc = "A sterile satchel with chemist colors." icon_state = "satchel-chem" + item_state = "satchel-chem" /obj/item/storage/backpack/satchel/gen name = "geneticist satchel" desc = "A sterile satchel with geneticist colors." icon_state = "satchel-gen" + item_state = "satchel-gen" /obj/item/storage/backpack/satchel/tox name = "scientist satchel" desc = "Useful for holding research materials." icon_state = "satchel-tox" + item_state = "satchel-tox" /obj/item/storage/backpack/satchel/sec //Universal between USCM MPs & Colony, should be split at some point. name = "security satchel" desc = "A robust satchel composed of two drop pouches and a large internal pocket. Made of a stiff fabric, it isn't very comfy to wear." icon_state = "satchel-sec" + item_state = "satchel-sec" /obj/item/storage/backpack/satchel/hyd name = "hydroponics satchel" desc = "A green satchel for plant-related work." icon_state = "satchel_hyd" + item_state = "satchel_hyd" //==========================// MARINE BACKPACKS\\================================\\ //=======================================================================\\ @@ -456,7 +503,7 @@ item_icons = list( WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/backpacks_by_faction/UA.dmi' ) - can_hold = list(/obj/item/ammo_box, /obj/item/stack/folding_barricade) + can_hold = list(/obj/item/ammo_box, /obj/item/stack/folding_barricade, /obj/item/stack/sandbags, /obj/item/stack/sandbags_empty) max_w_class = SIZE_MASSIVE throw_range = 0 xeno_types = null @@ -533,7 +580,23 @@ name = "\improper USCM expedition chestrig" desc = "A heavy-duty IMP based chestrig, can quickly be accessed with only one hand. Usually issued to USCM intelligence officers." icon_state = "intel_chestrig" - max_storage_space = 20 + +/obj/item/storage/backpack/marine/satchel/intel/expeditionsatchel + name = "\improper USCM lightweight expedition satchel" + desc = "A heavy-duty IMP based satchel, reinforced with kevlar so it doesn't rip. Can quickly be accessed with only one hand. Usually issued to USCM intelligence officers." + icon_state = "intel_satchel" + icon = 'icons/obj/items/clothing/backpack/backpacks_by_faction/UA.dmi' + item_state_slots = list( + WEAR_BACK = "intel_satchel", + WEAR_R_HAND = "marinesatch", + WEAR_L_HAND = "marinesatch", + ) + item_icons = list( + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/classic_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/classic_righthand.dmi', + WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/backpacks_by_faction/UA.dmi' + ) + flags_atom = FPRINT|NO_GAMEMODE_SKIN /obj/item/storage/backpack/marine/satchel name = "\improper USCM satchel" @@ -853,16 +916,20 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r unacidable = TRUE explo_proof = TRUE uniform_restricted = list(/obj/item/clothing/suit/storage/marine/M3S) //Need to wear Scout armor and helmet to equip this. - flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes var/camo_active = FALSE var/camo_alpha = 10 var/allow_gun_usage = FALSE - var/cloak_cooldown + var/cloak_cooldown = 0 + var/allowed_stealth_shooting = FALSE + var/fluff_item = "cloak" + var/camo_on_sound = 'sound/effects/cloak_scout_on.ogg' + var/camo_off_sound = 'sound/effects/cloak_scout_off.ogg' actions_types = list(/datum/action/item_action/specialist/toggle_cloak) /obj/item/storage/backpack/marine/satchel/scout_cloak/select_gamemode_skin(expected_type, list/override_icon_state, list/override_protection) - . = ..() + if(flags_atom & NO_GAMEMODE_SKIN) + return switch(SSmapping.configs[GROUND_MAP].camouflage_type) if("urban") icon_state = "u_scout_cloak" @@ -895,15 +962,15 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r return if(H.back != src) - to_chat(H, SPAN_WARNING("You must be wearing the cloak to activate it!")) + to_chat(H, SPAN_WARNING("You must be wearing the [fluff_item] to activate it!")) return if(camo_active) deactivate_camouflage(H) return - if(cloak_cooldown && cloak_cooldown > world.time) - to_chat(H, SPAN_WARNING("Your cloak is malfunctioning and can't be enabled right now!")) + if(cloak_cooldown > world.time) + to_chat(H, SPAN_WARNING("Your [fluff_item] is malfunctioning and can't be enabled right now!")) return RegisterSignal(H, COMSIG_GRENADE_PRE_PRIME, PROC_REF(cloak_grenade_callback)) @@ -912,13 +979,14 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r camo_active = TRUE ADD_TRAIT(H, TRAIT_CLOAKED, TRAIT_SOURCE_EQUIPMENT(WEAR_BACK)) - H.visible_message(SPAN_DANGER("[H] vanishes into thin air!"), SPAN_NOTICE("You activate your cloak's camouflage."), max_distance = 4) - playsound(H.loc, 'sound/effects/cloak_scout_on.ogg', 15, TRUE) + H.visible_message(SPAN_DANGER("[H] vanishes into thin air!"), SPAN_NOTICE("You activate your [fluff_item]'s camouflage."), max_distance = 4) + playsound(H.loc, camo_on_sound, 15, TRUE) H.unset_interaction() H.alpha = camo_alpha H.FF_hit_evade = 1000 - H.allow_gun_usage = allow_gun_usage + if(!allowed_stealth_shooting) + H.allow_gun_usage = allow_gun_usage var/datum/mob_hud/security/advanced/SA = GLOB.huds[MOB_HUD_SECURITY_ADVANCED] SA.remove_from_hud(H) @@ -926,12 +994,13 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r XI.remove_from_hud(H) anim(H.loc, H, 'icons/mob/mob.dmi', null, "cloak", null, H.dir) + cloak_cooldown = world.time + 0.8 SECONDS return TRUE /obj/item/storage/backpack/marine/satchel/scout_cloak/proc/wrapper_fizzle_camouflage() SIGNAL_HANDLER var/mob/wearer = src.loc - wearer.visible_message(SPAN_DANGER("[wearer]'s cloak fizzles out!"), SPAN_DANGER("Your cloak fizzles out!")) + wearer.visible_message(SPAN_DANGER("[wearer]'s [fluff_item] fizzles out!"), SPAN_DANGER("Your [fluff_item] fizzles out!")) var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread sparks.set_up(5, 4, src) sparks.start() @@ -942,6 +1011,10 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r if(!istype(H)) return FALSE + if(cloak_cooldown > world.time) + to_chat(H, SPAN_WARNING("Your [fluff_item] is malfunctioning and can't be disabled right now!")) + return + UnregisterSignal(H, list( COMSIG_GRENADE_PRE_PRIME, COMSIG_HUMAN_EXTINGUISH, @@ -953,8 +1026,8 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r camo_active = FALSE REMOVE_TRAIT(H, TRAIT_CLOAKED, TRAIT_SOURCE_EQUIPMENT(WEAR_BACK)) - H.visible_message(SPAN_DANGER("[H] shimmers into existence!"), SPAN_WARNING("Your cloak's camouflage has deactivated!"), max_distance = 4) - playsound(H.loc, 'sound/effects/cloak_scout_off.ogg', 15, TRUE) + H.visible_message(SPAN_DANGER("[H] shimmers into existence!"), SPAN_WARNING("Your [fluff_item]'s camouflage has deactivated!"), max_distance = 4) + playsound(H.loc, camo_off_sound, 15, TRUE) H.alpha = initial(H.alpha) H.FF_hit_evade = initial(H.FF_hit_evade) @@ -967,18 +1040,19 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r if(anim) anim(H.loc, H,'icons/mob/mob.dmi', null, "uncloak", null, H.dir) + cloak_cooldown = world.time + 0.8 SECONDS addtimer(CALLBACK(src, PROC_REF(allow_shooting), H), 1.5 SECONDS) // This proc is to cancel priming grenades in /obj/item/explosive/grenade/attack_self() /obj/item/storage/backpack/marine/satchel/scout_cloak/proc/cloak_grenade_callback(mob/user) SIGNAL_HANDLER - to_chat(user, SPAN_WARNING("Your cloak prevents you from priming the grenade!")) - - return COMPONENT_GRENADE_PRIME_CANCEL + if(!allowed_stealth_shooting) + to_chat(user, SPAN_WARNING("Your cloak prevents you from priming the grenade!")) + return COMPONENT_GRENADE_PRIME_CANCEL /obj/item/storage/backpack/marine/satchel/scout_cloak/proc/allow_shooting(mob/living/carbon/human/H) - if(camo_active && !allow_gun_usage) + if(camo_active && !allow_gun_usage && !allowed_stealth_shooting) return H.allow_gun_usage = TRUE @@ -1003,6 +1077,22 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r var/obj/item/storage/backpack/marine/satchel/scout_cloak/SC = holder_item SC.camouflage() +/obj/item/storage/backpack/marine/satchel/scout_cloak/wy_invis_droid + name = "M7X Mark II optical camouflage powerpack" + desc = "A heavy-duty powerpack carried by Weyland-Yutani combat androids. Powers the reverse-engineered optical camouflage system utilized by M7X Mark II Apesuit." + icon_state = "invis_android_powerpack" + flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes + icon = 'icons/obj/items/clothing/backpack/backpacks_by_faction/WY.dmi' + item_icons = list( + WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/backpacks_by_faction/WY.dmi' + ) + uniform_restricted = list(/obj/item/clothing/suit/storage/marine/veteran/pmc/wy_droid/dark) + allow_gun_usage = TRUE + allowed_stealth_shooting = TRUE + fluff_item = "powerpack" + camo_on_sound = 'sound/effects/pred_cloakon.ogg' + camo_off_sound = 'sound/effects/pred_cloakoff.ogg' + // Welder Backpacks // /obj/item/storage/backpack/marine/engineerpack @@ -1198,6 +1288,22 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r /obj/item/storage/backpack/lightpack/five_slot max_storage_space = 15 +/obj/item/storage/backpack/lightpack/black + name = "\improper lightweight combat pack" + desc = "A small, lightweight pack for expeditions and short-range operations." + icon_state = "ERT_satchel_black" + +/obj/item/storage/backpack/lightpack/black/five_slot + max_storage_space = 15 + +/obj/item/storage/backpack/lightpack/black/medic + name = "\improper lightweight medic combat pack" + desc = "A small, lightweight medic pack for expeditions and short-range operations." + icon_state = "ERT_satchel_medic_black" + +/obj/item/storage/backpack/lightpack/black/medic/five_slot + max_storage_space = 15 + /obj/item/storage/backpack/marine/engineerpack/ert name = "\improper lightweight technician welderpack" desc = "A small, lightweight pack for expeditions and short-range operations. Features a small fueltank for quick blowtorch refueling." @@ -1214,6 +1320,14 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r max_fuel = 100 max_storage_space = 12 +/obj/item/storage/backpack/marine/engineerpack/ert/black + icon_state = "ERT_satchel_welder_black" + max_storage_space = 20 + +/obj/item/storage/backpack/marine/engineerpack/ert/black/four_slot + max_fuel = 100 + max_storage_space = 12 + /obj/item/storage/backpack/molle name = "\improper T13 MOLLE Satchel" desc = "Tactical satchel manufactured by one of the Alphatech subsidiaries. Very lightweight beltbag variant that utilizes UA standard MOLLE fastening systems. Can be often found in hands of colonial security and various private military groups." @@ -1232,10 +1346,62 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r /obj/item/storage/backpack/molle/backpack/surv worn_accessible = FALSE -/obj/item/storage/backpack/commando - name = "commando bag" - desc = "A heavy-duty bag carried by Weyland-Yutani commandos." - icon_state = "commandopack" +//----------WY---------- + +/obj/item/storage/backpack/pmc + name = "\improper W-Y combat pack" + desc = "A small, lightweight pack for expeditions and short-range operations, designed for Weyland-Yutani security and private military personnel." + icon = 'icons/obj/items/clothing/backpack/backpacks_by_faction/WY.dmi' + icon_state = "pmc_satchel" + item_icons = list( + WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/backpacks_by_faction/WY.dmi' + ) + worn_accessible = TRUE + max_storage_space = 15 + +/obj/item/storage/backpack/pmc/medic + name = "\improper W-Y medic combat pack" + icon = 'icons/obj/items/clothing/backpack/backpacks_by_faction/WY.dmi' + icon_state = "pmc_medic_satchel" + +/obj/item/storage/backpack/pmc/medic/guard + icon_state = "pmc_guard_medic_satchel" + +/obj/item/storage/backpack/pmc/backpack + name = "\improper PMC combat backpack" + desc = "Ergonomic, protected, high capacity backpack, designed for Weyland-Yutani PMCs." + icon_state = "pmc_backpack" + max_storage_space = 21 + +/obj/item/storage/backpack/pmc/backpack/commando + name = "\improper W-Y Commando combat backpack" + desc = "Ergonomic, protected, high capacity backpack, designed for Weyland-Yutani Commandos." + icon_state = "commando_backpack" + +/obj/item/storage/backpack/pmc/backpack/commando/leader + icon_state = "commando_leader_backpack" + +/obj/item/storage/backpack/marine/engineerpack/ert/pmc + name = "\improper PMC technician welderpack" + desc = "Ergonomic, protected, high capacity backpack, designed for Weyland-Yutani PMCs. Features a small fueltank for quick blowtorch refueling." + icon_state = "pmc_welderpack" + icon = 'icons/obj/items/clothing/backpack/backpacks_by_faction/WY.dmi' + item_icons = list( + WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/backpacks_by_faction/WY.dmi' + ) + flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes + worn_accessible = TRUE + max_fuel = 180 + +/obj/item/storage/backpack/pmc/backpack/commando/apesuit + name = "Dog Catcher bag" + desc = "A heavy-duty bag carried by Weyland-Yutani Dog Catchers." + icon_state = "apesuit_pack" + +/obj/item/storage/backpack/combat_droid + name = "combat android powerpack" + desc = "A heavy-duty powerpack carried by Weyland-Yutani combat androids." + icon_state = "combat_android_powerpack" icon = 'icons/obj/items/clothing/backpack/backpacks_by_faction/WY.dmi' item_icons = list( WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/backpacks_by_faction/WY.dmi' @@ -1327,6 +1493,7 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r name = "\improper V86 Thermal Cloak" desc = "A thermo-optic camouflage cloak commonly used by UPP commando units." uniform_restricted = list(/obj/item/clothing/suit/storage/marine/faction/UPP/commando) //Need to wear UPP commando armor to equip this. + flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes max_storage_space = 21 camo_alpha = 10 diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 0b2863194315..54e9a659c076 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -153,7 +153,7 @@ /obj/item/stack/sandbags_empty, /obj/item/stack/sandbags, /obj/item/stack/barbed_wire, - /obj/item/defenses/handheld/sentry, + /obj/item/defenses/handheld, /obj/item/stack/rods, /obj/item/stack/tile, /obj/item/device/defibrillator/synthetic, @@ -165,7 +165,7 @@ /obj/item/stack/sheet, /obj/item/stack/sandbags_empty, /obj/item/stack/sandbags, - /obj/item/defenses/handheld/sentry, + /obj/item/defenses/handheld, ) /obj/item/storage/belt/medical @@ -334,6 +334,54 @@ ) flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes +/obj/item/storage/belt/medical/lifesaver/wy + name = "\improper WY-TM625 pattern medical bag" + desc = "The WY-TM625 is the standard load-bearing equipment of the W-Y security forces. This configuration mounts a duffel bag filled with a range of injectors and light medical supplies, and is common among medics. \nRight click its sprite and click \"toggle belt mode\" to take pills out of bottles by simply clicking them." + icon_state = "wy_medicbag" + item_state = "wy_medicbag" + icon = 'icons/obj/items/clothing/belts/belts_by_faction/WY.dmi' + item_icons = list( + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/WY.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_righthand.dmi' + ) + item_state_slots = list( + WEAR_L_HAND = "medicbag", + WEAR_R_HAND = "medicbag" + ) + flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes + +/obj/item/storage/belt/medical/lifesaver/wy/full/fill_preset_inventory() + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + new /obj/item/reagent_container/hypospray/autoinjector/adrenaline(src) + new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/storage/pill_bottle/bicaridine(src) + new /obj/item/storage/pill_bottle/dexalin(src) + new /obj/item/storage/pill_bottle/antitox(src) + new /obj/item/storage/pill_bottle/kelotane(src) + new /obj/item/storage/pill_bottle/inaprovaline(src) + new /obj/item/storage/pill_bottle/tramadol(src) + new /obj/item/storage/pill_bottle/peridaxon(src) + new /obj/item/stack/medical/splint/nano(src) + new /obj/item/device/healthanalyzer(src) + new /obj/item/storage/pill_bottle/imidazoline(src) + new /obj/item/storage/pill_bottle/alkysine(src) + +/obj/item/storage/belt/medical/lifesaver/wy/partial/fill_preset_inventory() + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + new /obj/item/stack/medical/splint/nano(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/storage/pill_bottle/bicaridine(src) + new /obj/item/storage/pill_bottle/kelotane(src) + new /obj/item/storage/pill_bottle/inaprovaline(src) + new /obj/item/storage/pill_bottle/tramadol(src) + new /obj/item/device/healthanalyzer(src) + /obj/item/storage/belt/medical/lifesaver/full/forecon/fill_preset_inventory() new /obj/item/storage/pill_bottle/bicaridine(src) new /obj/item/storage/pill_bottle/bicaridine(src) @@ -439,6 +487,68 @@ new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) new /obj/item/device/healthanalyzer(src) +/obj/item/storage/belt/medical/lifesaver/upp/black + icon_state = "medicbag_black_u" + item_state = "medicbag_black_u" + +/obj/item/storage/belt/medical/lifesaver/upp/black/full/fill_preset_inventory() + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/reagent_container/hypospray/autoinjector/adrenaline(src) + new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/storage/pill_bottle/bicaridine(src) + new /obj/item/storage/pill_bottle/bicaridine(src) + new /obj/item/storage/pill_bottle/kelotane(src) + new /obj/item/storage/pill_bottle/kelotane(src) + new /obj/item/storage/pill_bottle/dexalin(src) + new /obj/item/storage/pill_bottle/antitox(src) + new /obj/item/storage/pill_bottle/inaprovaline(src) + new /obj/item/storage/pill_bottle/tramadol(src) + new /obj/item/storage/pill_bottle/peridaxon(src) + +/obj/item/storage/belt/medical/lifesaver/upp/black/partial/fill_preset_inventory() + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/storage/pill_bottle/bicaridine(src) + new /obj/item/storage/pill_bottle/kelotane(src) + new /obj/item/storage/pill_bottle/inaprovaline(src) + new /obj/item/storage/pill_bottle/tramadol(src) + +/obj/item/storage/belt/medical/lifesaver/upp/black/synth/fill_preset_inventory() + new /obj/item/storage/pill_bottle/bicaridine(src) + new /obj/item/storage/pill_bottle/bicaridine(src) + new /obj/item/storage/pill_bottle/kelotane(src) + new /obj/item/storage/pill_bottle/kelotane(src) + new /obj/item/storage/pill_bottle/tramadol(src) + new /obj/item/storage/pill_bottle/tramadol(src) + new /obj/item/storage/pill_bottle/antitox(src) + new /obj/item/storage/pill_bottle/alkysine(src) + new /obj/item/storage/pill_bottle/imidazoline(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/device/healthanalyzer(src) + /obj/item/storage/belt/security name = "\improper M276 pattern security rig" desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This configuration is commonly seen among USCM Military Police and peacekeepers, though it can hold some light munitions." @@ -464,6 +574,7 @@ /obj/item/clothing/glasses, /obj/item/ammo_magazine/pistol, /obj/item/ammo_magazine/handful, + /obj/item/ammo_magazine/revolver, /obj/item/reagent_container/food/snacks/donut/normal, /obj/item/reagent_container/food/snacks/donut/jelly, /obj/item/weapon/baton, @@ -477,6 +588,44 @@ /obj/item/device/clue_scanner, ) +/obj/item/storage/belt/security/brown + name = "\improper 6B80 pattern ammo rig" + desc = "The 6B80 is an outdated but reliable ammo rig, formerly standard for the UPP Army. Its modular belt holds various munitions, still used by UPP security forces and reserves for its rugged design." + icon_state = "securitybelt_brown" + item_state = "security_brown"//Could likely use a better one. + w_class = SIZE_LARGE + storage_slots = 5 + max_w_class = SIZE_MEDIUM + max_storage_space = 20 + can_hold = list( + /obj/item/attachable/bayonet, + /obj/item/device/flashlight/flare, + /obj/item/ammo_magazine/rifle, + /obj/item/ammo_magazine/smg, + /obj/item/ammo_magazine/pistol, + /obj/item/ammo_magazine/revolver, + /obj/item/ammo_magazine/sniper, + /obj/item/ammo_magazine/handful, + /obj/item/explosive/grenade, + /obj/item/explosive/mine, + /obj/item/reagent_container/food/snacks, + ) + bypass_w_limit = list( + /obj/item/ammo_magazine/rifle, + /obj/item/ammo_magazine/smg, + ) + +/obj/item/storage/belt/security/brown/full/fill_preset_inventory() + new /obj/item/ammo_magazine/rifle/ak4047(src) + new /obj/item/ammo_magazine/rifle/ak4047(src) + new /obj/item/ammo_magazine/rifle/ak4047(src) + new /obj/item/ammo_magazine/rifle/ak4047(src) + new /obj/item/ammo_magazine/rifle/ak4047(src) + +/obj/item/storage/belt/security/brown/half_full/fill_preset_inventory() + new /obj/item/ammo_magazine/rifle/ak4047(src) + new /obj/item/ammo_magazine/rifle/ak4047(src) + /obj/item/storage/belt/security/MP name = "\improper M276 pattern military police rig" desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This version is filled with an array of small pouches, meant to carry non-lethal equipment and restraints." @@ -540,6 +689,26 @@ new /obj/item/restraint/handcuffs(src) new /obj/item/explosive/grenade/flashbang(src) +/obj/item/storage/belt/security/MP/WY + name = "\improper M276-C corporate security rig" + desc = "A Weyland-Yutani adaptation of the M276 load-bearing equipment, designed for corporate security forces. This modular black rig features multiple pouches for carrying restraints, ammunition, and a mix of lethal and non-lethal equipment for maintaining order." + +/obj/item/storage/belt/security/MP/WY/full/fill_preset_inventory() + new /obj/item/weapon/gun/energy/taser(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/baton(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/reagent_container/spray/pepper(src) + new /obj/item/device/clue_scanner(src) + +/obj/item/storage/belt/security/MP/WY/full/synth/fill_preset_inventory() + new /obj/item/explosive/grenade/flashbang(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/baton(src) + new /obj/item/reagent_container/spray/pepper(src) + new /obj/item/device/clue_scanner(src) + new /obj/item/restraint/handcuffs(src) + /obj/item/storage/belt/marine name = "\improper M276 pattern ammo load rig" desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This is the standard variant, designed for bulk ammunition-carrying operations." @@ -709,6 +878,29 @@ new /obj/item/ammo_magazine/smartgun(src) new /obj/item/ammo_magazine/smartgun(src) +/obj/item/storage/belt/marine/sharp + name = "\improper M103 pattern SHARP magazine belt" + desc = "A specially modified M103 pattern rig designed to hold P9 SHARP rifle magazines, instead of tank shells." + icon_state = "tankbelt" + item_state = "tankbelt" + icon = 'icons/obj/items/clothing/belts/belts.dmi' + item_icons = list( + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_righthand.dmi', + ) + item_state_slots = list( + WEAR_L_HAND = "utility", + WEAR_R_HAND = "utility") + storage_slots = 8 + max_storage_space = 8 + can_hold = list( + /obj/item/ammo_magazine/rifle/sharp/explosive, + /obj/item/ammo_magazine/rifle/sharp/flechette, + /obj/item/ammo_magazine/rifle/sharp/incendiary, + ) + flags_atom = NO_NAME_OVERRIDE|NO_GAMEMODE_SKIN + /obj/item/storage/belt/marine/upp name = "\improper Type 41 pattern load rig" desc = "The Type 41 load rig is the standard-issue load-bearing equipment of the UPP military. The primary function of this belt is to provide easy access to mags for the Type 71 during operations. Despite being designed for the Type 71 weapon system, the pouches are modular enough to fit other types of ammo and equipment." @@ -739,6 +931,38 @@ new /obj/item/ammo_magazine/rifle/type71/ap(src) new /obj/item/ammo_magazine/rifle/type71/ap(src) +/obj/item/storage/belt/marine/wy + name = "\improper WY-TM402 pattern ammo load rig" + desc = "The WY-TM402 is the standard load-bearing equipment of the W-Y security forces. It consists of a modular belt with various clips. This is the standard variant, designed for bulk ammunition-carrying operations." + icon = 'icons/obj/items/clothing/belts/belts_by_faction/WY.dmi' + icon_state = "wy_ammobelt" + item_icons = list( + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/WY.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_righthand.dmi' + ) + flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes + item_state_slots = list( + WEAR_WAIST = "wy_ammobelt", + WEAR_L_HAND = "marinebelt", + WEAR_R_HAND = "marinebelt" + ) + +/obj/item/storage/belt/marine/wy/m39_pmc/fill_preset_inventory() + new /obj/item/ammo_magazine/smg/m39/ap(src) + new /obj/item/ammo_magazine/smg/m39/ap(src) + new /obj/item/ammo_magazine/smg/m39/ap(src) + new /obj/item/ammo_magazine/smg/m39/extended(src) + new /obj/item/ammo_magazine/smg/m39/extended(src) + +/obj/item/storage/belt/marine/wy/nsg23_pmc/fill_preset_inventory() + new /obj/item/ammo_magazine/rifle/nsg23/extended(src) + new /obj/item/ammo_magazine/rifle/nsg23/extended(src) + new /obj/item/ammo_magazine/rifle/nsg23/ap(src) + new /obj/item/ammo_magazine/rifle/nsg23/ap(src) + new /obj/item/ammo_magazine/rifle/nsg23/ap(src) + + // M56E HMG gunner belt /obj/item/storage/belt/marine/m2c name = "\improper M804 heavygunner storage rig" @@ -1105,6 +1329,12 @@ else return ..() +/obj/item/storage/belt/grenade/bugkiller + +/obj/item/storage/belt/grenade/bugkiller/fill_preset_inventory() + new /obj/item/explosive/grenade/custom/antiweed(src) + new /obj/item/explosive/grenade/custom/antiweed(src) + new /obj/item/explosive/grenade/custom/antiweed(src) ////////////////////////////// GUN BELTS ///////////////////////////////////// @@ -1212,7 +1442,7 @@ /obj/item/storage/belt/gun/attack_hand(mob/user, mods) if(length(holstered_guns) && ishuman(user) && loc == user) var/obj/item/I - if(mods && mods["alt"] && length(contents) > length(holstered_guns)) //Withdraw the most recently inserted magazine, if possible. + if(mods && mods[ALT_CLICK] && length(contents) > length(holstered_guns) && !HAS_TRAIT(user, TRAIT_HAULED)) //Withdraw the most recently inserted magazine, if possible. var/list/magazines = contents - holstered_guns I = magazines[length(magazines)] else //Otherwise find and draw the last-inserted gun. @@ -1393,6 +1623,52 @@ for(var/i = 1 to storage_slots - 1) new /obj/item/ammo_magazine/pistol/vp78(src) +/obj/item/storage/belt/gun/m4a3/wy + name = "\improper WY-TM892 pattern general pistol holster rig" + desc = "The WY-TM892 is the standard load-bearing equipment of the W-Y security forces. It consists of a modular belt with various clips. This version has a holster assembly that allows one to carry the most common pistols. It also contains side pouches that can store most pistol magazines." + icon = 'icons/obj/items/clothing/belts/belts_by_faction/WY.dmi' + icon_state = "wy_holster" + item_state = "marinebelt" + item_icons = list( + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/WY.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_righthand.dmi' + ) + flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes + holster_slots = list( + "1" = list( + "icon_x" = -3, + "icon_y" = 0)) + +/obj/item/storage/belt/gun/m4a3/wy/mod88/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/mod88()) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/mod88(src) + +/obj/item/storage/belt/gun/m4a3/wy/mod88_near_empty/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/mod88()) + for(var/i = 1 to 3) + new /obj/item/ammo_magazine/pistol/mod88(src) + +/obj/item/storage/belt/gun/m4a3/wy/es4/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/es4()) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/es4(src) + +/obj/item/storage/belt/gun/m4a3/wy/vp78/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/vp78()) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/vp78(src) + +/obj/item/storage/belt/gun/m4a3/wy/vp78_whiteout/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/vp78/whiteout()) + new /obj/item/ammo_magazine/pistol/vp78/incendiary(src) + new /obj/item/ammo_magazine/pistol/vp78/incendiary(src) + new /obj/item/ammo_magazine/pistol/vp78/rubber(src) + new /obj/item/ammo_magazine/pistol/vp78/rubber(src) + new /obj/item/ammo_magazine/pistol/vp78/rubber(src) + new /obj/item/ammo_magazine/pistol/vp78/rubber(src) + /obj/item/storage/belt/gun/m4a3/m1911/fill_preset_inventory() handle_item_insertion(new /obj/item/weapon/gun/pistol/m1911()) new /obj/item/ammo_magazine/pistol/m1911(src) @@ -1531,6 +1807,16 @@ for(var/i = 1 to storage_slots - 1) new /obj/item/ammo_magazine/smg/m39/extended(src) +/obj/item/storage/belt/gun/m39/full/whiteout/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/smg/m39/elite/compact/heap(src)) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/smg/m39/heap(src) + +/obj/item/storage/belt/gun/m39/full/whiteout_low_threat/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/smg/m39/elite/compact(src)) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/smg/m39/ap(src) + #define MAXIMUM_MAGAZINE_COUNT 2 /obj/item/storage/belt/gun/m10 @@ -1840,6 +2126,39 @@ new /obj/item/ammo_magazine/revolver/mateba/highimpact/ap(src) new /obj/item/ammo_magazine/revolver/mateba/highimpact/ap(src) +/obj/item/storage/belt/gun/mateba/commando + name = "commando WY-T190 pattern Mateba holster rig" + desc = "The M276 is the standard load-bearing equipment of the Weyland Yutani. \ + It consists of a modular belt with various clips. This version is for the powerful Mateba magnum revolver, \ + along with five small pouches for speedloaders. This specific one is tinted black and engraved with gold, heavily customized for a high-ranking official." + icon_state = "amateba_holster" + item_state = "marinebelt" + icon = 'icons/obj/items/clothing/belts/belts.dmi' + item_icons = list( + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_righthand.dmi' + ) + flags_atom = NO_NAME_OVERRIDE|NO_GAMEMODE_SKIN + +/obj/item/storage/belt/gun/mateba/commando/full/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/revolver/mateba/engraved/tactical()) + new /obj/item/ammo_magazine/revolver/mateba(src) + new /obj/item/ammo_magazine/revolver/mateba(src) + new /obj/item/ammo_magazine/revolver/mateba(src) + new /obj/item/ammo_magazine/revolver/mateba(src) + new /obj/item/ammo_magazine/revolver/mateba(src) + new /obj/item/ammo_magazine/revolver/mateba(src) + +/obj/item/storage/belt/gun/mateba/commando/full/deathsquad/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/revolver/mateba/engraved/tactical()) + new /obj/item/ammo_magazine/revolver/mateba/highimpact(src) + new /obj/item/ammo_magazine/revolver/mateba/highimpact(src) + new /obj/item/ammo_magazine/revolver/mateba/highimpact(src) + new /obj/item/ammo_magazine/revolver/mateba/highimpact/ap(src) + new /obj/item/ammo_magazine/revolver/mateba/highimpact/ap(src) + new /obj/item/ammo_magazine/revolver/mateba/highimpact/ap(src) + /obj/item/storage/belt/gun/mateba/general name = "luxurious M276 pattern Mateba holster rig" desc = "The M276 is the standard load-bearing equipment of the USCM. \ @@ -1909,6 +2228,7 @@ item_state = "upp_belt" icon = 'icons/obj/items/clothing/belts/belts_by_faction/UPP.dmi' item_icons = list( + WEAR_J_STORE = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/UPP.dmi', WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/UPP.dmi', WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_lefthand.dmi', WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_righthand.dmi' @@ -2109,6 +2429,51 @@ for(var/i in 1 to storage_slots - 1) new /obj/item/ammo_magazine/revolver/webley(src) +/obj/item/storage/belt/gun/iasf_para_belt + name = "\improper IASF paratrooper belt" + desc = "A sturdy belt fitted with a black leather holster designed for IASF Paratroopers. A large utility pouch and several smaller compartments provide ample space for extra ammunition and field essentials—standard gear for IASF airborne forces dropping into hostile territory." + icon_state = "iasf_pistol_para" + item_state = "iasf_pistol_para" + icon = 'icons/obj/items/clothing/belts/belts_by_faction/TWE.dmi' + item_icons = list( + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/TWE.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_righthand.dmi' + ) + storage_slots = 8 + can_hold = list( + /obj/item/weapon/gun/revolver, + /obj/item/ammo_magazine/revolver, + /obj/item/weapon/gun/pistol, + /obj/item/ammo_magazine/pistol, + ) + flags_atom = FPRINT|NO_NAME_OVERRIDE|NO_GAMEMODE_SKIN + holster_slots = list( + "1" = list( + "icon_x" = -1, + "icon_y" = -3)) + +/obj/item/storage/belt/gun/iasf_para_belt/full/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/revolver/m44/custom/webley/IASF_webley()) + for(var/i in 1 to storage_slots - 1) + new /obj/item/ammo_magazine/revolver/webley(src) + +/obj/item/storage/belt/gun/iasf_para_belt/webley_near_empty/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/revolver/m44/custom/webley/IASF_webley()) + for(var/i = 1 to 3) + new /obj/item/ammo_magazine/revolver/webley(src) + +/obj/item/storage/belt/gun/iasf_para_belt/custom + name = "\improper IASF custom paratrooper belt" + desc = "A modified IASF paratrooper belt featuring a black leather holster with gold inlay, a large utility pouch and several smaller compartments provide ample space for extra ammunition and field essentials—standard gear for IASF airborne forces dropping into hostile territory." + icon_state = "iasf_pistol_para_custom" + item_state = "iasf_pistol_para_custom" + +/obj/item/storage/belt/gun/iasf_para_belt/custom/full/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/l54_custom()) + for(var/i in 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/l54_custom(src) + /obj/item/storage/belt/gun/smartgunner name = "\improper M802 pattern smartgunner sidearm rig" desc = "The M802 is a limited-issue mark of USCM load-bearing equipment, designed to carry smartgun ammunition and a sidearm." @@ -2135,11 +2500,12 @@ new /obj/item/ammo_magazine/smartgun(src) /obj/item/storage/belt/gun/smartgunner/pmc - name = "\improper M802 pattern 'Dirty' smartgunner sidearm rig" - desc = "A modification of the standard M802 load-bearing equipment, designed to carry smartgun ammunition and a sidearm." - icon = 'icons/obj/items/clothing/belts/belts_by_map/snow.dmi' + name = "\improper WY-TM410 pattern 'Dirty' smartgunner sidearm rig" + desc = "A special pattern of W-Y made combat belt, designed to carry smartgun ammunition and a sidearm." + icon = 'icons/obj/items/clothing/belts/belts_by_faction/WY.dmi' + icon_state = "wy_sgbelt" item_icons = list( - WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_map/snow.dmi', + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/WY.dmi', WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_lefthand.dmi', WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_righthand.dmi' ) @@ -2158,16 +2524,17 @@ /obj/item/storage/belt/gun/smartgunner/pmc/full/fill_preset_inventory() handle_item_insertion(new /obj/item/weapon/gun/pistol/vp78()) new /obj/item/ammo_magazine/pistol/vp78(src) - new /obj/item/ammo_magazine/smartgun/dirty(src) + new /obj/item/ammo_magazine/pistol/vp78(src) new /obj/item/ammo_magazine/smartgun/dirty(src) new /obj/item/ammo_magazine/smartgun/dirty(src) -/obj/item/storage/belt/gun/smartgunner/whiteout - name = "\improper M802 pattern 'Terminator' smartgunner sidearm rig" - desc = "A modification of the standard M802 load-bearing equipment, designed to carry smartgun ammunition and a Mateba revolver." - icon = 'icons/obj/items/clothing/belts/belts_by_map/snow.dmi' +/obj/item/storage/belt/gun/smartgunner/commando + name = "\improper WY-TM410 pattern 'Terminator' smartgunner sidearm rig" + desc = "A special pattern of W-Y made combat belt, designed to carry smartgun ammunition and a sidearm." + icon = 'icons/obj/items/clothing/belts/belts_by_faction/WY.dmi' + icon_state = "wy_sgbelt" item_icons = list( - WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_map/snow.dmi', + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/WY.dmi', WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_lefthand.dmi', WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items_by_map/snow_righthand.dmi' ) @@ -2183,9 +2550,9 @@ /obj/item/ammo_magazine/smartgun, ) -/obj/item/storage/belt/gun/smartgunner/whiteout/full/fill_preset_inventory() - handle_item_insertion(new /obj/item/weapon/gun/revolver/mateba/pmc()) - new /obj/item/ammo_magazine/revolver/mateba/highimpact/ap(src) +/obj/item/storage/belt/gun/smartgunner/commando/full/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/vp78/whiteout()) + new /obj/item/ammo_magazine/smartgun/dirty(src) new /obj/item/ammo_magazine/smartgun/dirty(src) new /obj/item/ammo_magazine/smartgun/dirty(src) new /obj/item/ammo_magazine/smartgun/dirty(src) @@ -2259,16 +2626,23 @@ /obj/item/tool/weldingtool, /obj/item/tool/wirecutters, /obj/item/tool/wrench, - /obj/item/tool/shovel/etool, /obj/item/tool/extinguisher/mini, + /obj/item/tool/shovel/etool, + /obj/item/stack/cable_coil, + /obj/item/weapon/gun/smg/nailgun/compact, + /obj/item/cell, + /obj/item/circuitboard, + /obj/item/stock_parts, + /obj/item/device/demo_scanner, + /obj/item/device/reagent_scanner, + /obj/item/device/assembly, /obj/item/device/multitool, /obj/item/device/flashlight, /obj/item/device/t_scanner, /obj/item/device/analyzer, + /obj/item/explosive/plastic, /obj/item/device/lightreplacer, - /obj/item/weapon/gun/smg/nailgun/compact, - /obj/item/stack/cable_coil, - /obj/item/cell, + /obj/item/device/defibrillator/synthetic, /obj/item/ammo_magazine/pistol, /obj/item/ammo_magazine/revolver, /obj/item/ammo_magazine/handful, @@ -2426,6 +2800,16 @@ new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src) new /obj/item/device/healthanalyzer(src) +/obj/item/storage/belt/medical/rmc/survivor/fill_preset_inventory() + new /obj/item/storage/pill_bottle/packet/bicaridine(src) + new /obj/item/storage/pill_bottle/packet/kelotane(src) + new /obj/item/storage/pill_bottle/packet/tramadol(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/storage/pill_bottle/packet/tricordrazine(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/device/healthanalyzer(src) + /obj/item/storage/belt/gun/l905 name = "\improper L905 gunbelt" desc = "Finely-tooled leather, a L905, and six magazines. More than enough for the standard RMC commando." @@ -2452,3 +2836,41 @@ handle_item_insertion(new /obj/item/weapon/gun/pistol/vp78()) for(var/i in 1 to storage_slots - 1) new /obj/item/ammo_magazine/pistol/vp78(src) + +/obj/item/storage/belt/gun/type47/SOF_belt + name = "\improper Type 47-S pistol holster rig" + icon_state = "korovin_black_holster" + item_state = "upp_belt" + +/obj/item/storage/belt/gun/type47/SOF_belt/t73/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/t73()) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/t73(src) + +/obj/item/storage/belt/gun/type47/SOF_belt/revolver/upp/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/revolver/upp()) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/revolver/upp(src) + +/obj/item/storage/belt/gun/l54 + name = "\improper pistol belt" + desc = "A dark brown leather pistol belt commonly issued to NSPA officers. Although designed for the L54 service pistol, it accommodates most sidearms along with spare magazines. Standard issue across TWE law enforcement, military, and security forces." + icon_state = "l54_holster" + item_state = "l54_holster" + icon = 'icons/obj/items/clothing/belts/belts_by_faction/TWE.dmi' + item_icons = list( + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/belts_by_faction/TWE.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_righthand.dmi' + ) + flags_atom = FPRINT|NO_NAME_OVERRIDE|NO_GAMEMODE_SKIN + storage_slots = 7 + can_hold = list( + /obj/item/weapon/gun/pistol, + /obj/item/ammo_magazine/pistol, + ) + +/obj/item/storage/belt/gun/l54/full/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/l54()) + for(var/i in 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/l54(src) diff --git a/code/game/objects/items/storage/bible.dm b/code/game/objects/items/storage/bible.dm index 662fb09c2bca..e9b1852098dc 100644 --- a/code/game/objects/items/storage/bible.dm +++ b/code/game/objects/items/storage/bible.dm @@ -1,6 +1,6 @@ /obj/item/storage/bible - name = "bible" - desc = "Apply to head repeatedly." + name = "Holy Bible" + desc = "A book containing the sacred texts of that one popular guy you heard a lot about." icon = 'icons/obj/items/books.dmi' item_icons = list( WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items/books_lefthand.dmi', @@ -10,6 +10,9 @@ throw_speed = SPEED_FAST throw_range = 5 w_class = SIZE_MEDIUM + attack_verb = list("blessed", "whacked", "purified") + pickup_sound = "sound/handling/book_pickup.ogg" + drop_sound = "sound/handling/book_pickup.ogg" cant_hold = list( /obj/item/tool/screwdriver, /obj/item/tool/crowbar, @@ -30,20 +33,19 @@ var/deity_name = "Christ" /obj/item/storage/bible/booze - name = "bible" - desc = "To be applied to the head repeatedly." - icon_state ="bible" + name = "Mister Booze's Holy Bible" + desc = "You will wind up wearing tattered shoes if you mess with Mister Booze, so if you've been so stiff you thought you died, you'll feel better once you have testified! All spirits contained within this bible are for medicinal purposes only." /obj/item/storage/bible/booze/fill_preset_inventory() + new /obj/item/reagent_container/food/drinks/bottle/whiskey(src) + new /obj/item/reagent_container/food/drinks/bottle/whiskey(src) + new /obj/item/reagent_container/food/drinks/cans/beer(src) new /obj/item/reagent_container/food/drinks/cans/beer(src) new /obj/item/reagent_container/food/drinks/cans/beer(src) - new /obj/item/spacecash(src) - new /obj/item/spacecash(src) - new /obj/item/spacecash(src) /obj/item/storage/bible/hefa name = "Holy texts of the High Explosive Fragmenting Anti-personnel hand grenade." - desc = "Praise be he, reverend Clearsmire who has brought us into the light of the shrapnel! Sworn to the holy service of the HEFA lord are we, and while few, we are the voices of the silent many! Printed in the RESS." + desc = "Praised be thee, reverend Clearsmire who has brought us into the light of the shrapnel! Sworn to the holy service of the HEFA lord are we, and while few, we are the voices of the silent many! Printed in the RESS." icon_state ="tome_hefa" /obj/item/storage/bible/hefa/Initialize() diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index ccc51192cb2c..b9e940b4dfdc 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -463,6 +463,7 @@ /obj/item/storage/box/zipcuffs name = "box of zip cuffs" desc = "A box full of zip cuffs." + w_class = SIZE_MEDIUM icon_state = "handcuff" item_state = "handcuff" @@ -997,8 +998,8 @@ new /obj/item/reagent_container/food/snacks/grown/banana(src) //chanterelle -/obj/item/storage/box/chanterelles - name = "box of chanterelle" +/obj/item/storage/box/chanterelle + name = "box of chanterelles" /obj/item/storage/box/chanterelle/fill_preset_inventory() for(var/i in 1 to 7) diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 14ec99b73fbe..8d0099c2dcf0 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -1,5 +1,5 @@ /obj/item/storage/briefcase - name = "briefcase" + name = "brown briefcase" desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional." icon = 'icons/obj/items/storage/briefcases.dmi' item_icons = list( @@ -33,9 +33,9 @@ M.apply_effect(min(drowsy_threshold, 10) , DROWSY) M.apply_damage(force, BRUTE, affecting, sharp=0) //log and damage the custom hit - user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)])" - M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)])" - msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)]) in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) + user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)])" + M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)])" + msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)]) in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) else //Regular attack text . = ..() @@ -43,8 +43,37 @@ return /obj/item/storage/briefcase/stowaway - name = "briefcase" - desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional." + name = "suitcase" + desc = "An old suitcase suited for when you want to travel. This one sure has seen better days." icon_state = "suitcase" item_state = "suitcase" force = 8 + +/obj/item/storage/briefcase/black + name = "black briefcase" + icon_state = "briefcase_b" + item_state = "briefcase_b" + +/obj/item/storage/briefcase/maroon + name = "maroon briefcase" + icon_state = "briefcase_c" + item_state = "briefcase_c" + +/obj/item/storage/briefcase/flap + name = "flap-closure brown briefcase" + desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional. This one is less rigid, made with a flap and softer leather." + icon_state = "briefcase_d" + item_state = "briefcase_d" + +/obj/item/storage/briefcase/flap/black + name = "flap-closure black briefcase" + icon_state = "briefcase_e" + item_state = "briefcase_e" + +/obj/item/storage/briefcase/flap/maroon + name = "flap-closure maroon briefcase" + icon_state = "briefcase_f" + item_state = "briefcase_f" + + + diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 7afcea1ff23f..1b588eba5bab 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -177,6 +177,7 @@ /obj/item/storage/fancy/cigarettes/emeraldgreen name = "\improper Emerald Green Packet" desc = "They remind you of a gross, tar-filled version of Ireland. These cheap cigarettes are Weyland-Yutani's entry into the general market." + desc_lore = "Instantly recognizable by their price that undercuts even water, these cigarettes have become a fixture wherever budgets and morale run low. Nobody is quite sure what goes into the blend, but most agree you don't buy Emerald Greens for the flavor." icon_state = "cigpacket" item_state = "cigpacket" item_state_slots = list(WEAR_AS_GARB = "cig_cig") @@ -256,6 +257,7 @@ /obj/item/storage/fancy/cigarettes/kpack name = "\improper Koorlander Gold packet" desc = "Lovingly machine-rolled for YOUR pleasure. For when you want to look cool and the risk of a slow horrible death isn't really a factor." + desc_lore = "Popularized by Seegson workers during the construction of Sevastopol Station, these cigarettes lit easily, burned evenly, and offered a straightforward, dependable smoke. The flat, dusty flavor and steady draw quickly made them a colonial staple. Koorlander later scaled production on frontier farming worlds and locked in exclusive trade deals with the USCM." icon_state = "kpacket" icon = 'icons/obj/items/smoking/packets/koorlander.dmi' item_state = "kpacket" @@ -272,6 +274,7 @@ /obj/item/storage/fancy/cigarettes/lady_finger name = "\improper Lady Fingers packet" desc = "These intensely strong unfiltered menthol cigarettes don't seem very ladylike. They don't seem very fingerlike for that matter, either. Smoking may kill, but poor branding is almost as bad." + desc_lore = "A bold experiment in marketing, these brutal, unfiltered menthol cigarettes come in dusty rose packaging aimed at the women of the USCM. The scent is so overpowering that they are sometimes used to keep bugs out of field tents. Despite the effort, they are rarely chosen and mostly sit untouched in vending machines, quietly daring someone to try. Whether anyone actually likes them is another question." icon_state = "lfpacket" icon = 'icons/obj/items/smoking/packets/lady_fingers.dmi' item_state = "lfpacket" diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 539704691274..8f065ffad8a6 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -15,6 +15,7 @@ WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/equipment/medical_righthand.dmi', ) icon_state = "firstaid" + var/empty_icon = "kit_empty" throw_speed = SPEED_FAST throw_range = 8 use_sound = "toolbox" @@ -35,6 +36,7 @@ /obj/item/roller, /obj/item/bodybag, /obj/item/reagent_container/blood, + /obj/item/tool/surgery/FixOVein, ) storage_flags = STORAGE_FLAGS_BOX required_skill_for_nest_opening = SKILL_MEDICAL @@ -55,7 +57,7 @@ /obj/item/storage/firstaid/update_icon() if(content_watchers || !length(contents)) - icon_state = "kit_empty" + icon_state = empty_icon else icon_state = icon_full @@ -210,6 +212,96 @@ /obj/item/storage/firstaid/synth/empty/fill_preset_inventory() return +/obj/item/storage/firstaid/whiteout + name = "elite repair kit" + desc = "An expensive looking, carbon finish kit box, has a big W-Y logo on front. Contains advanced equipment for repairing a damaged synthetic, including a reset key." + icon_state = "whiteout" + empty_icon = "whiteout_empty" + item_state = "whiteout" + can_hold = list( + /obj/item/device/healthanalyzer, + /obj/item/reagent_container/dropper, + /obj/item/reagent_container/pill, + /obj/item/reagent_container/glass/bottle, + /obj/item/reagent_container/syringe, + /obj/item/storage/pill_bottle, + /obj/item/stack/medical, + /obj/item/reagent_container/hypospray, + /obj/item/storage/syringe_case, + /obj/item/tool/surgery/surgical_line, + /obj/item/tool/surgery/synthgraft, + /obj/item/stack/nanopaste, + /obj/item/stack/cable_coil, + /obj/item/tool/weldingtool, + /obj/item/device/defibrillator/synthetic, + ) + +/obj/item/storage/firstaid/whiteout/fill_preset_inventory() + new /obj/item/stack/nanopaste(src) + new /obj/item/stack/nanopaste(src) + new /obj/item/stack/nanopaste(src) + new /obj/item/stack/nanopaste(src) + new /obj/item/stack/cable_coil/white(src) + new /obj/item/device/defibrillator/synthetic/noskill(src) + new /obj/item/tool/weldingtool/largetank(src) + +/obj/item/storage/firstaid/whiteout/empty/fill_preset_inventory() + return + +/obj/item/storage/firstaid/whiteout/medical + name = "elite field revival kit" + desc = "An expensive looking, carbon finish kit box, has a big W-Y logo on front. Contains advanced medical tools for providing medical aid to high priority figures." + icon_state = "whiteout_medical" + empty_icon = "whiteout_empty" + item_state = "whiteout" + can_hold = list( + /obj/item/device/healthanalyzer, + /obj/item/reagent_container/dropper, + /obj/item/reagent_container/pill, + /obj/item/reagent_container/glass/bottle, + /obj/item/reagent_container/syringe, + /obj/item/storage/pill_bottle, + /obj/item/stack/medical, + /obj/item/reagent_container/hypospray, + /obj/item/storage/syringe_case, + /obj/item/tool/surgery/surgical_line, + /obj/item/tool/surgery/synthgraft, + /obj/item/stack/nanopaste, + /obj/item/stack/cable_coil, + /obj/item/tool/weldingtool, + /obj/item/device/defibrillator, + /obj/item/tool/surgery/scalpel/manager, + /obj/item/storage/box/czsp/medic_upgraded_kits/full, + /obj/item/storage/surgical_case, + /obj/item/roller, + ) + +/obj/item/storage/firstaid/whiteout/medical/fill_preset_inventory() + new /obj/item/storage/box/czsp/medic_upgraded_kits/full(src) + new /obj/item/storage/box/czsp/medic_upgraded_kits/full(src) + new /obj/item/stack/medical/splint/nano(src) + new /obj/item/storage/surgical_case/elite/whiteout(src) + new /obj/item/storage/syringe_case/whiteout(src) + new /obj/item/device/defibrillator/compact(src) + new /obj/item/roller/surgical(src) + +/obj/item/storage/firstaid/whiteout/medical/commando/fill_preset_inventory() + new /obj/item/storage/box/czsp/medic_upgraded_kits/full(src) + new /obj/item/storage/box/czsp/medic_upgraded_kits/full(src) + new /obj/item/stack/medical/splint/nano(src) + new /obj/item/reagent_container/blood/OMinus(src) + new /obj/item/storage/syringe_case/commando(src) + new /obj/item/storage/surgical_case/elite/commando(src) + new /obj/item/roller/surgical(src) + +/obj/item/storage/firstaid/whiteout/medical/commando/looted/fill_preset_inventory() //for commando insert + new /obj/item/storage/box/czsp/medic_upgraded_kits/looted(src) + new /obj/item/storage/box/czsp/medic_upgraded_kits/looted(src) + new /obj/item/stack/medical/splint/nano/low_amount(src) + new /obj/item/storage/syringe_case/commando/looted(src) + new /obj/item/storage/surgical_case/elite/commando/looted(src) + new /obj/item/roller(src) + /obj/item/storage/firstaid/rad name = "radiation first-aid kit" desc = "Contains treatment for radiation exposure. With medical training you can fit this in a backpack." @@ -314,6 +406,77 @@ new /obj/item/reagent_container/hypospray/autoinjector/oxycodone( src ) new /obj/item/reagent_container/hypospray/autoinjector/oxycodone( src ) +/obj/item/storage/syringe_case/whiteout + +/obj/item/storage/syringe_case/whiteout/fill_preset_inventory() + new /obj/item/reagent_container/hypospray/autoinjector/stimulant/redemption_stimulant( src ) + new /obj/item/reagent_container/hypospray/autoinjector/emergency( src ) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone( src ) + +/obj/item/storage/syringe_case/commando + +/obj/item/storage/syringe_case/commando/fill_preset_inventory() + new /obj/item/reagent_container/hypospray/autoinjector/emergency( src ) + new /obj/item/reagent_container/hypospray/autoinjector/inaprovaline( src ) + new /obj/item/reagent_container/hypospray/autoinjector/adrenaline( src ) + +/obj/item/storage/syringe_case/commando/looted //for surv insert + +/obj/item/storage/syringe_case/commando/looted/fill_preset_inventory() + new /obj/item/reagent_container/hypospray/autoinjector/ultrazine/empty( src ) + new /obj/item/reagent_container/hypospray/autoinjector/inaprovaline( src ) + new /obj/item/reagent_container/hypospray/autoinjector/adrenaline( src ) + +/obj/item/storage/box/czsp/first_aid + name = "first-aid combat support kit" + desc = "Contains upgraded medical kits, nanosplints and an upgraded defibrillator." + icon = 'icons/obj/items/storage/kits.dmi' + icon_state = "medicbox" + storage_slots = 3 + +/obj/item/storage/box/czsp/first_aid/Initialize() + . = ..() + new /obj/item/stack/medical/bruise_pack(src) + new /obj/item/stack/medical/ointment(src) + if(prob(5)) + new /obj/item/device/healthanalyzer(src) + +/obj/item/storage/box/czsp/medical + name = "medical combat support kit" + desc = "Contains upgraded medical kits, nanosplints and an upgraded defibrillator." + icon = 'icons/obj/items/storage/kits.dmi' + icon_state = "medicbox" + storage_slots = 4 + +/obj/item/storage/box/czsp/medical/Initialize() + . = ..() + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + new /obj/item/stack/medical/splint/nano(src) + new /obj/item/device/defibrillator/upgraded(src) + +/obj/item/storage/box/czsp/medic_upgraded_kits + name = "medical upgrade kit" + icon = 'icons/obj/items/storage/kits.dmi' + icon_state = "upgradedkitbox" + desc = "This kit holds upgraded trauma and burn kits, for critical injuries." + w_class = SIZE_SMALL + max_w_class = SIZE_MEDIUM + storage_slots = 2 + +/obj/item/storage/box/czsp/medic_upgraded_kits/full/Initialize() + . = ..() + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + +/obj/item/storage/box/czsp/medic_upgraded_kits/looted/Initialize() + . = ..() + if(prob(35)) + new /obj/item/stack/medical/advanced/bruise_pack/upgraded/low_amount(src) + if(prob(35)) + new /obj/item/stack/medical/advanced/ointment/upgraded/low_amount(src) + + //---------SURGICAL CASE--------- @@ -353,6 +516,42 @@ new /obj/item/tool/surgery/hemostat(src) new /obj/item/tool/surgery/retractor(src) +/obj/item/storage/surgical_case/elite + name = "elite surgical case" + desc = "It's an expensive looking medical case for storing compactly placed field surgical tools. Has a bright reflective W-Y logo on it.\ + \nBefore surgery: Verify correct location and patient is adequately numb to pain.\ + \nStep one: Open an incision at the site with the scalpel.\ + \nStep two: Clamp bleeders with the hemostat.\ + \nStep three: Draw back the skin with the retracter.\ + \nStep four: Patch the damaged vein with a surgical line.\ + \nStep five: Close the incision with a surgical line." + icon_state = "surgical_case_elite" + storage_slots = 5 + +/obj/item/storage/surgical_case/elite/commando/fill_preset_inventory() + new /obj/item/tool/surgery/scalpel(src) + new /obj/item/tool/surgery/hemostat(src) + new /obj/item/tool/surgery/retractor(src) + new /obj/item/tool/surgery/surgical_line(src) + new /obj/item/tool/surgery/synthgraft(src) + +/obj/item/storage/surgical_case/elite/commando/looted/fill_preset_inventory() + if(prob(65)) + new /obj/item/tool/surgery/scalpel(src) + if(prob(65)) + new /obj/item/tool/surgery/hemostat(src) + if(prob(65)) + new /obj/item/tool/surgery/retractor(src) + new /obj/item/tool/surgery/surgical_line(src) + new /obj/item/tool/surgery/synthgraft(src) + +/obj/item/storage/surgical_case/elite/whiteout + storage_slots = 3 + +/obj/item/storage/surgical_case/elite/whiteout/fill_preset_inventory() + new /obj/item/tool/surgery/scalpel/manager(src) + new /obj/item/tool/surgery/surgical_line(src) + new /obj/item/tool/surgery/synthgraft(src) /obj/item/storage/surgical_case/rmc_surgical_case name = "\improper RMC surgical case" @@ -363,12 +562,7 @@ \nStep three: Draw back the skin with the retracter.\ \nStep four: Patch the damaged vein with a surgical line.\ \nStep five: Close the incision with a surgical line." - icon = 'icons/obj/items/storage/medical.dmi' - icon_state = "surgical_case" - throw_speed = SPEED_FAST - throw_range = 8 storage_slots = 5 - w_class = SIZE_SMALL can_hold = list( /obj/item/tool/surgery/scalpel, /obj/item/tool/surgery/hemostat, @@ -415,9 +609,9 @@ var/display_maptext = TRUE var/maptext_label maptext_height = 16 - maptext_width = 16 - maptext_x = 18 - maptext_y = 3 + maptext_width = 24 + maptext_x = 4 + maptext_y = 2 var/base_icon = "pill_canister" var/static/list/possible_colors = list( @@ -579,7 +773,7 @@ if(loc != user) return ..() - if(!mods || !mods["alt"]) + if(!mods || !mods[ALT_CLICK]) return ..() if(!ishuman(user)) @@ -614,7 +808,7 @@ set src in usr if(src && ishuman(usr)) - var/str = copytext(reject_bad_text(input(usr,"Label text? (2 CHARACTERS MAXIMUM)", "Set \the [src]'s on-sprite label", "")), 1, 3) + var/str = copytext(reject_bad_text(input(usr,"Label text? (3 CHARACTERS MAXIMUM)", "Set \the [src]'s on-sprite label", "")), 1, 4) if(!str || !length(str)) to_chat(usr, SPAN_NOTICE("You clear the label off \the [src].")) maptext_label = null @@ -722,6 +916,12 @@ /obj/item/storage/pill_bottle/imidazoline/skillless skilllock = SKILL_MEDICAL_DEFAULT +/obj/item/storage/pill_bottle/imialky + name = "\improper Imidazoline-Alkysine pill bottle" + icon_state = "pill_canister9" + pill_type_to_fill = /obj/item/reagent_container/pill/imialky + maptext_label = "IA" + //PERIDAXON /obj/item/storage/pill_bottle/peridaxon name = "\improper Peridaxon pill bottle" diff --git a/code/game/objects/items/storage/internal.dm b/code/game/objects/items/storage/internal.dm index 6c2cde7f5a16..c984676f626c 100644 --- a/code/game/objects/items/storage/internal.dm +++ b/code/game/objects/items/storage/internal.dm @@ -92,7 +92,7 @@ //Returns 1 if the master item's parent's attack_hand() should be called, 0 otherwise. //It's strange, but no other way of doing it without the ability to call another proc's parent, really. /obj/item/storage/internal/proc/handle_attack_hand(mob/living/user as mob, mods) - if(user.body_position == LYING_DOWN) // what about stuns? huh? + if(user.body_position == LYING_DOWN && !HAS_TRAIT(user, TRAIT_HAULED)) // what about stuns? huh? return FALSE if(ishuman(user)) @@ -109,7 +109,7 @@ master_object.add_fingerprint(user) //Checks that it's in the user's inventory somewhere - not safe with items inside storage without additional checks on master_object's end. if(user.contains(master_object)) - if((mods && mods["alt"] || storage_flags & STORAGE_USING_DRAWING_METHOD) && ishuman(user) && length(contents)) + if((mods && mods[ALT_CLICK] || storage_flags & STORAGE_USING_DRAWING_METHOD) && ishuman(user) && length(contents)) var/obj/item/I if(storage_flags & STORAGE_USING_FIFO_DRAWING) I = contents[1] diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm index 0a5e6838d808..a3dd4d2deaf4 100644 --- a/code/game/objects/items/storage/large_holster.dm +++ b/code/game/objects/items/storage/large_holster.dm @@ -10,7 +10,7 @@ max_w_class = SIZE_LARGE storage_slots = 1 max_storage_space = 4 - storage_flags = STORAGE_FLAGS_DEFAULT|STORAGE_USING_DRAWING_METHOD|STORAGE_ALLOW_QUICKDRAW + storage_flags = STORAGE_FLAGS_DEFAULT|STORAGE_USING_DRAWING_METHOD|STORAGE_ALLOW_QUICKDRAW|STORAGE_ALLOW_WHILE_HAULED ///Icon/item states change based on contents; this stores base icon state. var/base_icon var/drawSound = 'sound/weapons/gun_rifle_draw.ogg' @@ -63,7 +63,7 @@ playsound(src, drawSound, 15, TRUE) /obj/item/storage/large_holster/m37 - name = "\improper L44 M37A2 scabbard" + name = "\improper L44 shotgun scabbard" desc = "A large leather holster fitted for USCM-issue shotguns. It has harnesses that allow it to be secured to the back for easy storage." icon_state = "m37_holster" icon = 'icons/obj/items/clothing/backpack/backpacks_by_map/jungle.dmi' @@ -75,6 +75,7 @@ /obj/item/weapon/gun/shotgun/pump, /obj/item/weapon/gun/shotgun/combat, /obj/item/weapon/gun/shotgun/double/mou53, + /obj/item/weapon/gun/shotgun/pump/m37a, ) flags_atom = FPRINT // has gamemode skin @@ -169,7 +170,7 @@ /obj/item/storage/large_holster/ceremonial_sword name = "ceremonial sword scabbard" - desc = "A large, vibrantly colored scabbard used to carry a ceremonial sword." + desc = "A large, old-styled scabbard used to carry a ceremonial sword." icon_state = "ceremonial_sword_holster"//object icon is duplicate of katana holster, needs new icon at some point. item_icons = list( WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/scabbards.dmi', @@ -183,6 +184,24 @@ /obj/item/storage/large_holster/ceremonial_sword/full/fill_preset_inventory() new /obj/item/weapon/sword/ceremonial(src) +/obj/item/storage/large_holster/dragon_katana + name = "\improper dragon katana scabbard" + desc = "A large, cherry colored katana scabbard with an illustration of a dragon on it. It can be strapped to the back or worn at the belt. Because of the sturdy wood casing of the scabbard, it makes an okay defensive weapon in a pinch." + icon_state = "dragon_katana_holster" + item_icons = list( + WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/holster.dmi', + WEAR_WAIST = 'icons/mob/humans/onmob/clothing/belts/scabbards.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_righthand.dmi' + ) + force = 12 + attack_verb = list("bludgeoned", "struck", "cracked") + flags_equip_slot = SLOT_WAIST|SLOT_BACK + can_hold = list(/obj/item/weapon/sword/dragon_katana) + +/obj/item/storage/large_holster/dragon_katana/full/fill_preset_inventory() + new /obj/item/weapon/sword/dragon_katana(src) + /obj/item/storage/large_holster/m39 name = "\improper M276 pattern M39 holster rig" desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This holster features a larger frame and stiff backboard to support a submachinegun. It's designed for the M39, but the clips are adjustable enough to fit most compact submachineguns. Due to its unorthodox design, it isn't a very common sight, and is only specially issued." @@ -211,7 +230,8 @@ gun_offset = W.hud_offset W.hud_offset = 0 - W.pixel_x = 0 + W.pixel_x = -16 + W.pixel_y = -13 W.transform = turn(matrix(0.82, MATRIX_SCALE), 90) //0.82x is the right size and gives reasonably accurate results with pixel scaling. W.vis_flags |= VIS_INHERIT_ID //Means the gun is just visual and doesn't block picking up or clicking on the holster. @@ -226,7 +246,8 @@ W.appearance_flags &= ~PIXEL_SCALE W.hud_offset = gun_offset - W.pixel_x = gun_offset + W.pixel_x = 0 + W.pixel_y = 0 W.transform = null W.vis_flags &= ~VIS_INHERIT_ID @@ -245,8 +266,7 @@ handle_item_insertion(new /obj/item/weapon/gun/smg/m39()) /obj/item/storage/large_holster/m39/full/elite/fill_preset_inventory() - handle_item_insertion(new /obj/item/weapon/gun/smg/m39/elite()) - + handle_item_insertion(new /obj/item/weapon/gun/smg/m39/elite/compact()) /obj/item/storage/large_holster/fuelpack name = "\improper Broiler-T flexible refueling system" @@ -258,11 +278,11 @@ var/obj/item/ammo_magazine/flamer_tank/large/B/fuelB var/obj/item/ammo_magazine/flamer_tank/large/X/fuelX var/obj/item/ammo_magazine/flamer_tank/large/active_fuel - var/obj/item/weapon/gun/flamer/M240T/linked_flamer + var/obj/item/weapon/gun/flamer/m240/spec/linked_flamer var/toggling = FALSE var/image/flamer_overlay actions_types = list(/datum/action/item_action/specialist/toggle_fuel) - can_hold = list(/obj/item/weapon/gun/flamer/M240T) + can_hold = list(/obj/item/weapon/gun/flamer/m240/spec) /obj/item/storage/large_holster/fuelpack/Initialize() . = ..() @@ -386,7 +406,7 @@ switch_fuel(A, user) return - var/obj/item/weapon/gun/flamer/M240T/F = A + var/obj/item/weapon/gun/flamer/m240/spec/F = A if(istype(F) && !(F.fuelpack)) F.link_fuelpack(user) if(F.current_mag && !(F.current_mag in list(fuel,fuelB,fuelX))) @@ -468,3 +488,35 @@ if (!istype(FP)) return FP.toggle_fuel() + +/obj/item/storage/belt/gun/brutepack + name = "\improper M271A2 Pattern Launcher Rig" + desc = "A special-issue harness designed to allow the user to freely and securely holster a M6H-BRUTE launcher system on their back without impeding movement, while also having several other integrated storage packs for additional ammo and equipment." + icon = 'icons/obj/items/clothing/backpack/backpacks_by_faction/UA.dmi' + icon_state = "bruterig" + map_specific_decoration = FALSE + item_icons = list( + WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/backpacks_by_faction/UA.dmi' + ) + flags_equip_slot = SLOT_BACK //yes we are belt subtype that is worn on back + storage_slots = 7 + max_w_class = SIZE_MEDIUM + can_hold = list( + /obj/item/ammo_magazine, + /obj/item/weapon/gun/launcher/rocket/brute, + ) + bypass_w_limit = list(/obj/item/weapon/gun/launcher/rocket/brute) + + +/obj/item/storage/belt/gun/brutepack/update_icon() + . = ..() + var/mob/living/carbon/human/user = loc + if(istype(user)) + user.update_inv_back() + +/obj/item/storage/belt/gun/brutepack/full/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/launcher/rocket/brute()) + new /obj/item/ammo_magazine/rocket/brute(src) + new /obj/item/ammo_magazine/rocket/brute(src) + new /obj/item/ammo_magazine/rocket/brute(src) + diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 5ba9578aab6e..299365db9b9f 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -5,11 +5,11 @@ desc = "A locked box." icon = 'icons/obj/items/storage/briefcases.dmi' item_icons = list( - WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items/storage_lefthand.dmi', - WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items/storage_righthand.dmi', + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/equipment/briefcases_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/equipment/briefcases_righthand.dmi', ) icon_state = "lockbox+l" - item_state = "box" + item_state = "lockbox" w_class = SIZE_LARGE max_w_class = SIZE_MEDIUM max_storage_space = 14 //The sum of the w_classes of all the items in this storage item. diff --git a/code/game/objects/items/storage/misc.dm b/code/game/objects/items/storage/misc.dm index fa523a5278a2..33ae5ff1feab 100644 --- a/code/game/objects/items/storage/misc.dm +++ b/code/game/objects/items/storage/misc.dm @@ -140,6 +140,36 @@ new /obj/item/ammo_magazine/pistol/t73(src) new /obj/item/ammo_magazine/pistol/t73(src) +/obj/item/storage/box/action + name = "AC71 'Action' storing case" + desc = "A small case containing an AC71 Action, a holdout pistol by Spearhead Armory. It was most likely brought by a marine from home, or taken from a colony without permission." + icon = 'icons/obj/items/storage/kits.dmi' + icon_state = "m43case" + w_class = SIZE_SMALL + max_w_class = SIZE_TINY + storage_slots = 3 + can_hold = list(/obj/item/weapon/gun/pistol/action, /obj/item/ammo_magazine/pistol/action) + +/obj/item/storage/box/action/fill_preset_inventory() + new /obj/item/weapon/gun/pistol/action(src) + new /obj/item/ammo_magazine/pistol/action(src) + new /obj/item/ammo_magazine/pistol/action(src) + +/obj/item/storage/box/plinker + name = "W62 'Whisper' storing case" + desc = "A small case containing a W62 Whisper, a .22 ratkiller made by Spearhead Armory. It was most likely brought by a marine from home, or taken from a colony without permission." + icon = 'icons/obj/items/storage/kits.dmi' + icon_state = "m43case" + w_class = SIZE_MEDIUM + max_w_class = SIZE_SMALL + storage_slots = 3 + can_hold = list(/obj/item/weapon/gun/pistol/holdout, /obj/item/ammo_magazine/pistol/holdout) + +/obj/item/storage/box/plinker/fill_preset_inventory() + new /obj/item/weapon/gun/pistol/holdout(src) + new /obj/item/ammo_magazine/pistol/holdout(src) + new /obj/item/ammo_magazine/pistol/holdout(src) + /obj/item/storage/box/co2_knife name = "M8 cartridge bayonet packaging" desc = "Contains one M8 Cartridge Bayonet and two sister CO2 cartridges. Thanks for being a dedicated Boots magazine subscriber!" diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index 503edeebe0c6..8d8df55e3bef 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -58,6 +58,7 @@ max_w_class = SIZE_MEDIUM cant_hold = list( //Prevent inventory bloat /obj/item/storage/firstaid, + /obj/item/storage/toolkit, /obj/item/storage/bible, /obj/item/storage/box, ) @@ -164,6 +165,25 @@ new /obj/item/device/radio(src) new /obj/item/attachable/bayonet(src) new /obj/item/stack/medical/splint(src) + +/obj/item/storage/pouch/survival/black + icon_state = "soctools" + +/obj/item/storage/pouch/survival/full/black + icon_state = "soctools" + +/obj/item/storage/pouch/survival/full/wy + icon_state = "soctools" + +/obj/item/storage/pouch/survival/full/wy/fill_preset_inventory() + new /obj/item/device/flashlight/combat(src) + new /obj/item/tool/crowbar/tactical(src) + new /obj/item/storage/pill_bottle/packet/tricordrazine(src) + new /obj/item/stack/medical/bruise_pack(src) + new /obj/item/device/radio(src) + new /obj/item/attachable/bayonet/wy(src) + new /obj/item/stack/medical/splint(src) + /obj/item/storage/pouch/survival/synth name = "synth survival pouch" desc = "An emergency pouch given to synthetics in the event of an emergency." @@ -188,6 +208,17 @@ new /obj/item/device/radio(src) new /obj/item/attachable/bayonet(src) +/obj/item/storage/pouch/survival/synth/black + icon_state = "soctools" + +/obj/item/storage/pouch/survival/synth/black/full/fill_preset_inventory() + new /obj/item/tool/crowbar/red(src) + new /obj/item/tool/weldingtool(src) + new /obj/item/stack/cable_coil(src) + new /obj/item/stack/sheet/metal/large_stack(src) + new /obj/item/device/radio(src) + new /obj/item/attachable/bayonet(src) + /obj/item/storage/pouch/firstaid name = "first-aid pouch" desc = "A small pouch that can hold basic medical equipment, such as autoinjectors and bandages." @@ -201,6 +232,9 @@ /obj/item/stack/medical/splint, ) +/obj/item/storage/pouch/firstaid/wy + icon_state = "wy_firstaid" + /obj/item/storage/pouch/firstaid/full desc = "Contains a variety of autoinjectors for quickly treating injuries." @@ -210,6 +244,9 @@ new /obj/item/reagent_container/hypospray/autoinjector/tramadol(src) new /obj/item/reagent_container/hypospray/autoinjector/emergency(src) +/obj/item/storage/pouch/firstaid/full/black + icon_state = "wy_firstaid" + /obj/item/storage/pouch/firstaid/full/alternate desc = "Contains a first-aid autoinjector, bandages, ointment, and splints." @@ -219,6 +256,9 @@ new /obj/item/stack/medical/ointment(src) new /obj/item/stack/medical/bruise_pack(src) +/obj/item/storage/pouch/firstaid/full/alternate/wy + icon_state = "wy_firstaid" + /obj/item/storage/pouch/firstaid/full/pills desc = "Contains a variety of pill packets for treating many injuries." @@ -228,6 +268,9 @@ new /obj/item/storage/pill_bottle/packet/tramadol(src) new /obj/item/storage/pill_bottle/packet/tramadol(src) +/obj/item/storage/pouch/firstaid/full/pills/wy + icon_state = "wy_firstaid" + /obj/item/storage/pouch/firstaid/ert desc = "It can contain autoinjectors, ointments, and bandages. This one has some extra stuff." icon_state = "firstaid" @@ -240,6 +283,8 @@ new /obj/item/reagent_container/hypospray/autoinjector/emergency(src) new /obj/item/stack/medical/bruise_pack(src) +/obj/item/storage/pouch/firstaid/ert/wy + icon_state = "wy_firstaid" ///Pistol pouch. /obj/item/storage/pouch/pistol @@ -378,7 +423,7 @@ /obj/item/storage/pouch/pistol/command/attack_hand(mob/user, mods) //Mostly copied from gunbelt. if(current_gun && ishuman(user) && loc == user) - if(mods && mods["alt"] && length(contents) > 1) //Withdraw the most recently inserted nongun item if possible. + if(mods && mods[ALT_CLICK] && length(contents) > 1) //Withdraw the most recently inserted nongun item if possible. var/obj/item/I = contents[length(contents)] if(isgun(I)) I = contents[length(contents) - 1] @@ -410,6 +455,9 @@ /obj/item/ammo_magazine/handful, ) +/obj/item/storage/pouch/magazine/wy + icon_state = "wy_ammo_mag_small" + /obj/item/storage/pouch/magazine/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/ammo_magazine/shotgun)) var/obj/item/ammo_magazine/shotgun/M = W @@ -426,6 +474,9 @@ icon_state = "large_ammo_mag" storage_slots = 4 +/obj/item/storage/pouch/magazine/large/black //evil dark pouch for evil corporation + icon_state = "wy_ammo_mag" + /obj/item/storage/pouch/magazine/pistol name = "pistol magazine pouch" desc = "It can carry pistol magazines and revolver speedloaders." @@ -485,38 +536,54 @@ for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/rifle/type71(src) -/obj/item/storage/pouch/magazine/large/pmc_m39/fill_preset_inventory() +/obj/item/storage/pouch/magazine/large/wy + icon_state = "wy_ammo_mag" + +/obj/item/storage/pouch/magazine/large/wy/pmc_m39/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/smg/m39/ap(src) -/obj/item/storage/pouch/magazine/large/nsg_ap/fill_preset_inventory() +/obj/item/storage/pouch/magazine/large/wy/nsg_ap/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/rifle/nsg23/ap(src) -/obj/item/storage/pouch/magazine/large/nsg_ext/fill_preset_inventory() +/obj/item/storage/pouch/magazine/large/wy/nsg_ext/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/rifle/nsg23/extended(src) -/obj/item/storage/pouch/magazine/large/nsg_heap/fill_preset_inventory() +/obj/item/storage/pouch/magazine/large/wy/nsg_heap/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/rifle/nsg23/heap(src) -/obj/item/storage/pouch/magazine/large/pmc_p90/fill_preset_inventory() +/obj/item/storage/pouch/magazine/large/wy/pmc_p90/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/smg/fp9000(src) -/obj/item/storage/pouch/magazine/large/pmc_lmg/fill_preset_inventory() +/obj/item/storage/pouch/magazine/large/wy/pmc_lmg/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/rifle/lmg(src) -/obj/item/storage/pouch/magazine/large/pmc_sniper/fill_preset_inventory() +/obj/item/storage/pouch/magazine/large/wy/pmc_sniper/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/sniper/elite(src) -/obj/item/storage/pouch/magazine/large/pmc_rifle/fill_preset_inventory() +/obj/item/storage/pouch/magazine/large/wy/pmc_rifle/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/rifle/ap(src) +/obj/item/storage/pouch/magazine/large/wy/smg_heap/fill_preset_inventory() + for(var/i = 1 to storage_slots) + new /obj/item/ammo_magazine/smg/m39/heap(src) + +/obj/item/storage/pouch/magazine/large/pmc_sg + name = "smartgun drum pouch" + desc = "A heavy pouch designed for carrying a surplus of smargun drums." + icon_state = "wy_sgdrums_ammo" + storage_slots = 3 + can_hold = list( + /obj/item/ammo_magazine/smartgun, + ) + /obj/item/storage/pouch/magazine/large/pmc_sg/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/smartgun/dirty(src) @@ -529,14 +596,13 @@ for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/rifle/m16/ap(src) +/obj/item/storage/pouch/magazine/large/rifle_heap + icon_state = "wy_ammo_mag" + /obj/item/storage/pouch/magazine/large/rifle_heap/fill_preset_inventory() for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/rifle/heap(src) -/obj/item/storage/pouch/magazine/large/smg_heap/fill_preset_inventory() - for(var/i = 1 to storage_slots) - new /obj/item/ammo_magazine/smg/m39/heap(src) - /obj/item/storage/pouch/magazine/large/m60/fill_preset_inventory() for(var/i in 1 to storage_slots) new /obj/item/ammo_magazine/m60(src) @@ -693,6 +759,36 @@ new /obj/item/reagent_container/hypospray/autoinjector/stimulant/redemption_stimulant(src) new /obj/item/reagent_container/hypospray/autoinjector/stimulant/speed_stimulant(src) +/obj/item/storage/pouch/medical/socmed/commando/fill_preset_inventory() + new /obj/item/device/healthanalyzer(src) + new /obj/item/stack/medical/splint/nano(src) + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + new /obj/item/reagent_container/hypospray/autoinjector/bicaridine(src) + new /obj/item/reagent_container/hypospray/autoinjector/meralyne(src) + new /obj/item/reagent_container/hypospray/autoinjector/kelotane(src) + new /obj/item/reagent_container/hypospray/autoinjector/dermaline(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/reagent_container/hypospray/autoinjector/tricord(src) + new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src) + +/obj/item/storage/pouch/medical/socmed/commando/deathsquad/fill_preset_inventory() + new /obj/item/device/healthanalyzer(src) + new /obj/item/stack/medical/splint/nano(src) + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/bruise_pack/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + new /obj/item/stack/medical/advanced/ointment/upgraded(src) + new /obj/item/reagent_container/hypospray/autoinjector/meralyne(src) + new /obj/item/reagent_container/hypospray/autoinjector/dermaline(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/reagent_container/hypospray/autoinjector/tricord(src) + new /obj/item/reagent_container/hypospray/autoinjector/stimulant/speed_stimulant(src) + new /obj/item/reagent_container/hypospray/autoinjector/stimulant/brain_stimulant(src) + new /obj/item/reagent_container/hypospray/autoinjector/stimulant/redemption_stimulant(src) + /obj/item/storage/pouch/medical/socmed/not_op/fill_preset_inventory() new /obj/item/device/healthanalyzer(src) new /obj/item/stack/medical/splint(src) @@ -801,6 +897,9 @@ new /obj/item/reagent_container/hypospray/autoinjector/tramadol(src) new /obj/item/reagent_container/hypospray/autoinjector/emergency(src) +/obj/item/storage/pouch/autoinjector/full/wy + icon_state = "wy_medicpack" + /obj/item/storage/pouch/syringe name = "syringe pouch" desc = "It can carry syringes." @@ -915,6 +1014,18 @@ new /obj/item/stack/medical/advanced/bruise_pack(src) new /obj/item/stack/medical/advanced/ointment(src) +/obj/item/storage/pouch/medkit/wy + icon_state = "wy_medkit" + +/obj/item/storage/pouch/medkit/wy/full_advanced/fill_preset_inventory() + new /obj/item/reagent_container/hypospray/autoinjector/tricord(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/splint(src) + /obj/item/storage/pouch/pressurized_reagent_canister name = "Pressurized Reagent Canister Pouch" max_w_class = SIZE_SMALL @@ -1257,11 +1368,17 @@ new /obj/item/stack/sheet/metal(src, 50) new /obj/item/stack/sandbags_empty(src, 50) +/obj/item/storage/pouch/construction/full/wy + icon_state = "wy_construction" + /obj/item/storage/pouch/construction/full_barbed_wire/fill_preset_inventory() new /obj/item/stack/sheet/plasteel(src, 50) new /obj/item/stack/sheet/metal(src, 50) new /obj/item/stack/barbed_wire(src, 20) +/obj/item/storage/pouch/construction/full_barbed_wire/wy + icon_state = "wy_construction" + /obj/item/storage/pouch/construction/low_grade_full/fill_preset_inventory() new /obj/item/stack/sheet/plasteel(src, 30) new /obj/item/stack/sheet/metal(src, 50) @@ -1354,6 +1471,15 @@ new /obj/item/explosive/plastic(src) new /obj/item/explosive/plastic(src) +/obj/item/storage/pouch/tools/tactical/sof/full/fill_preset_inventory() + new /obj/item/tool/screwdriver/tactical(src) + new /obj/item/tool/wirecutters/tactical(src) + new /obj/item/tool/crowbar/tactical(src) + new /obj/item/stack/cable_coil(src) + new /obj/item/device/multitool(src) + new /obj/item/tool/wrench(src) + new /obj/item/tool/weldingtool(src) + /obj/item/storage/pouch/tools/tactical/upp name = "synthetic tools pouch" desc = "Special issue tools pouch for UPP synthetics. Due to the enhanced strength of the synthetic and its inability to feel discomfort, this pouch is designed to maximize internal space with no concern for its wearer's comfort." @@ -1393,6 +1519,15 @@ new /obj/item/tool/weldingtool(src) new /obj/item/tool/wrench(src) +/obj/item/storage/pouch/tools/uppsynth/black + icon_state = "soctools" + +/obj/item/storage/pouch/tools/uppsynth/black/full/fill_preset_inventory() + new /obj/item/tool/crowbar(src) + new /obj/item/tool/wirecutters(src) + new /obj/item/tool/weldingtool(src) + new /obj/item/tool/wrench(src) + /obj/item/storage/pouch/tools/tactical/sec name = "tactical security pouch" desc = "A custom fit security pouch, capable of fitting a variety of security tools in different compartments." @@ -1550,7 +1685,7 @@ WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/clothing/belts_righthand.dmi' ) max_w_class = SIZE_LARGE - storage_flags = STORAGE_FLAGS_POUCH|STORAGE_USING_DRAWING_METHOD|STORAGE_ALLOW_QUICKDRAW + storage_flags = STORAGE_FLAGS_POUCH|STORAGE_USING_DRAWING_METHOD|STORAGE_ALLOW_QUICKDRAW|STORAGE_ALLOW_WHILE_HAULED can_hold = list(/obj/item/weapon/sword/machete) var/sheathe_sound = 'sound/weapons/gun_rifle_draw.ogg' diff --git a/code/game/objects/items/storage/smartpack.dm b/code/game/objects/items/storage/smartpack.dm index 4f9f1737c9e9..cdc25f2eea12 100644 --- a/code/game/objects/items/storage/smartpack.dm +++ b/code/game/objects/items/storage/smartpack.dm @@ -10,7 +10,7 @@ WEAR_BACK = 'icons/mob/humans/onmob/clothing/back/smartpack.dmi' ) flags_atom = FPRINT|NO_GAMEMODE_SKIN // same sprite for all gamemodes - max_storage_space = 14 + max_storage_space = 15 worn_accessible = TRUE actions_types = list(/datum/action/item_action/toggle) xeno_types = null diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index cf9c900292cc..81c19767bef2 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -43,7 +43,7 @@ var/required_skill_level_for_nest_opening = null /obj/item/storage/MouseDrop(obj/over_object as obj) - if(CAN_PICKUP(usr, src)) + if(CAN_PICKUP(usr, src) && !HAS_TRAIT(usr, TRAIT_HAULED)) if(over_object == usr) // this must come before the screen objects only block open(usr) return @@ -67,14 +67,14 @@ add_fingerprint(usr) /obj/item/storage/clicked(mob/user, list/mods) - if(!mods["shift"] && mods["middle"] && CAN_PICKUP(user, src)) + if(!mods[SHIFT_CLICK] && mods[MIDDLE_CLICK] && CAN_PICKUP(user, src)) handle_mmb_open(user) return TRUE //Allow alt-clicking to remove items directly from storage. //Does so by passing the alt mod back to do_click(), which eventually delivers it to attack_hand(). //This ensures consistent click behaviour between alt-click and left-mouse drawing. - if(mods["alt"] && loc == user && !user.get_active_hand()) + if(mods[ALT_CLICK] && loc == user && !user.get_active_hand()) return FALSE return ..() @@ -309,7 +309,7 @@ GLOBAL_LIST_EMPTY_TYPED(item_storage_box_cache, /datum/item_storage_box) var/obj/item/I = user.get_active_hand() var/user_carried_master = user.contains(master) // Placing something in the storage screen - if(I && !mods["alt"] && !mods["shift"] && !mods["ctrl"]) //These mods should be caught later on and either examine or do nothing. + if(I && !mods[ALT_CLICK] && !mods[SHIFT_CLICK] && !mods[CTRL_CLICK]) //These mods should be caught later on and either examine or do nothing. if(world.time <= user.next_move && !user_carried_master) //Click delay doesn't apply to clicking items in your first-layer inventory. return TRUE user.next_move = world.time @@ -318,7 +318,7 @@ GLOBAL_LIST_EMPTY_TYPED(item_storage_box_cache, /datum/item_storage_box) return TRUE // examining or taking something out of the storage screen by clicking on item border overlay - var/list/screen_loc_params = splittext(mods["screen-loc"], ",") + var/list/screen_loc_params = splittext(mods[SCREEN_LOC], ",") var/list/screen_loc_X = splittext(screen_loc_params[1],":") var/click_x = text2num(screen_loc_X[1])*32+text2num(screen_loc_X[2]) - 144 @@ -466,6 +466,9 @@ GLOBAL_LIST_EMPTY_TYPED(item_storage_box_cache, /datum/item_storage_box) if(L.mode) return 0 + if(istype(W, /obj/item/tool/yautja_cleaner) && user.a_intent == INTENT_HARM) //Cleaner both needs to be able to melt containers and be stored within them. + return + if(W.heat_source && !(W.flags_item & IGNITING_ITEM)) to_chat(usr, SPAN_ALERT("[W] is ignited, you can't store it!")) return @@ -638,10 +641,12 @@ W is always an item. stop_warning prevents messaging. user may be null.**/ return handle_item_insertion(W, prevent_warning, user) /obj/item/storage/attack_hand(mob/user, mods) - if(HAS_TRAIT(user, TRAIT_HAULED)) + if(HAS_TRAIT(user, TRAIT_HAULED) && !HAS_FLAG(storage_flags, STORAGE_ALLOW_WHILE_HAULED)) + if(loc == user) + open(user) return - if (loc == user) - if((mods && mods["alt"] || storage_flags & STORAGE_USING_DRAWING_METHOD) && ishuman(user) && length(contents)) //Alt mod can reach attack_hand through the clicked() override. + if(loc == user) + if((mods && mods[ALT_CLICK] || storage_flags & STORAGE_USING_DRAWING_METHOD) && ishuman(user) && length(contents)) //Alt mod can reach attack_hand through the clicked() override. var/obj/item/I if(storage_flags & STORAGE_USING_FIFO_DRAWING) I = contents[1] diff --git a/code/game/objects/items/tools/experimental_tools.dm b/code/game/objects/items/tools/experimental_tools.dm index cb3965c2016b..ff28db3e1f9e 100644 --- a/code/game/objects/items/tools/experimental_tools.dm +++ b/code/game/objects/items/tools/experimental_tools.dm @@ -22,7 +22,7 @@ /obj/item/tool/crew_monitor/dropped(mob/user) . = ..() - SStgui.close_uis(src) + SStgui.close_uis(radar) /obj/item/clothing/suit/auto_cpr name = "autocompressor" //autocompressor diff --git a/code/game/objects/items/tools/extinguisher.dm b/code/game/objects/items/tools/extinguisher.dm index 19446517de88..028bd5bc2269 100644 --- a/code/game/objects/items/tools/extinguisher.dm +++ b/code/game/objects/items/tools/extinguisher.dm @@ -123,6 +123,8 @@ var/obj/structure/bed/chair/C = null if(istype(user.buckled, /obj/structure/bed/chair)) C = user.buckled + if(!C) + return var/obj/B = user.buckled var/movementdirection = turn(direction,180) if(C) @@ -201,7 +203,7 @@ if(isliving(atm)) //For extinguishing mobs on fire var/mob/living/M = atm M.ExtinguishMob() - if(iscarbon(atm) || istype(atm, /obj/structure/barricade)) + if(iscarbon(atm) || istype(atm, /obj/structure/barricade) || istype(atm, /obj/effect/xenomorph/acid)) atm.extinguish_acid() T = get_turf(W) if(T == target) diff --git a/code/game/objects/items/tools/kitchen_tools.dm b/code/game/objects/items/tools/kitchen_tools.dm index 441c46283fde..908ee7259af7 100644 --- a/code/game/objects/items/tools/kitchen_tools.dm +++ b/code/game/objects/items/tools/kitchen_tools.dm @@ -265,9 +265,9 @@ M.apply_effect(min(drowsy_threshold, 10) , DROWSY) M.apply_damage(force, BRUTE, affecting, sharp=0) //log and damage the custom hit - user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)])" - M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)])" - msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)]) in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) + user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)])" + M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)])" + msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)]) in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) else //Regular attack text . = ..() diff --git a/code/game/objects/items/tools/misc_tools.dm b/code/game/objects/items/tools/misc_tools.dm index 3a496e338357..ab289d9cfb39 100644 --- a/code/game/objects/items/tools/misc_tools.dm +++ b/code/game/objects/items/tools/misc_tools.dm @@ -53,7 +53,8 @@ if(istype(A, /obj/item/tool/surgery) || istype(A, /obj/item/reagent_container/pill)) to_chat(user, SPAN_WARNING("That wouldn't be sanitary.")) return - if((istype(A, /obj/vehicle/multitile)) || (istype(A, /obj/structure))) // disallow naming structures + //disallow naming structures and vehicles, but not crates! + if(istype(A, /obj/vehicle/multitile) || (istype(A, /obj/structure) && !istype(A, /obj/structure/closet/crate) && !istype(A, /obj/structure/closet/coffin/woodencrate))) to_chat(user, SPAN_WARNING("The label won't stick to that.")) return if(isturf(A)) @@ -68,9 +69,9 @@ return var/datum/component/label/labelcomponent = A.GetComponent(/datum/component/label) - if(labelcomponent) + if(labelcomponent && labelcomponent.has_label()) if(labelcomponent.label_name == label) - to_chat(user, SPAN_WARNING("It already has the same label.")) + to_chat(user, SPAN_WARNING("The label already says \"[label]\".")) return user.visible_message(SPAN_NOTICE("[user] labels [A] as \"[label]\"."), @@ -89,19 +90,19 @@ mode = !mode icon_state = "labeler[mode]" if(mode) - to_chat(user, SPAN_NOTICE("You turn on \the [src].")) + to_chat(user, SPAN_NOTICE("You turn on [src].")) //Now let them choose the text. - var/str = copytext(reject_bad_text(input(user,"Label text?", "Set label", "")), 1, MAX_NAME_LEN) + var/str = copytext(reject_bad_text(tgui_input_text(user, "Label text?", "Set label", "", MAX_NAME_LEN, ui_state=GLOB.not_incapacitated_state)), 1, MAX_NAME_LEN) if(!str || !length(str)) to_chat(user, SPAN_NOTICE("Label text cleared. You can now remove labels.")) label = null return label = str to_chat(user, SPAN_NOTICE("You set the text to '[str]'.")) - else - to_chat(user, SPAN_NOTICE("You turn off \the [src].")) - + return + to_chat(user, SPAN_NOTICE("You turn off [src].")) + return /* Allow the user of the labeler to remove a label, if there is no text set @@ -110,19 +111,19 @@ */ -/obj/item/tool/hand_labeler/proc/remove_label(atom/A, mob/user) - var/datum/component/label/label = A.GetComponent(/datum/component/label) - if(label) - user.visible_message(SPAN_NOTICE("[user] removes label from [A]."), - SPAN_NOTICE("You remove the label from [A].")) - label.remove_label() - log_admin("[user] has removed label from [A.name]. (CKEY: ([user.ckey]))") - playsound(A, remove_label_sound, 20, TRUE) - return - else - to_chat(user, SPAN_NOTICE("There is no label to remove.")) +/obj/item/tool/hand_labeler/proc/remove_label(atom/target, mob/user) + var/datum/component/label/label = target.GetComponent(/datum/component/label) + if(label && label.has_label()) + user.visible_message(SPAN_NOTICE("[user] removes label from [target]."), + SPAN_NOTICE("You remove the label from [target].")) + log_admin("[key_name(usr)] has removed label from [target].") + label.clear_label() + playsound(target, remove_label_sound, 20, TRUE) return + to_chat(user, SPAN_NOTICE("There is no label to remove.")) + return + /** Allow the user to refill the labeller @I what is the item trying to be used @@ -221,13 +222,13 @@ if(input == oldname || !input) to_chat(user, SPAN_NOTICE("You changed [target] to... well... [target].")) else - msg_admin_niche("[key_name(usr)] changed \the [src]'s name to [input] [ADMIN_JMP(src)]") + msg_admin_niche("[key_name(usr)] changed [src]'s name to [input] [ADMIN_JMP(src)]") target.AddComponent(/datum/component/rename, input, target.desc) var/datum/component/label/label = target.GetComponent(/datum/component/label) if(label) - label.remove_label() + label.clear_label() label.apply_label() - to_chat(user, SPAN_NOTICE("You have successfully renamed \the [oldname] to [target].")) + to_chat(user, SPAN_NOTICE("You have successfully renamed [oldname] to [target].")) obj_target.renamedByPlayer = TRUE playsound(target, "paper_writing", 15, TRUE) @@ -254,7 +255,7 @@ //reapply any label to name var/datum/component/label/label = target.GetComponent(/datum/component/label) if(label) - label.remove_label() + label.clear_label() label.apply_label() to_chat(user, SPAN_NOTICE("You have successfully reset [target]'s name and description.")) @@ -365,7 +366,7 @@ /obj/item/tool/pen/sleepypen/Initialize() . = ..() create_reagents(30) - reagents.add_reagent("chloralhydrate", 22) + reagents.add_reagent("chloralhydrate", 15) /obj/item/tool/pen/sleepypen/attack(mob/M as mob, mob/user as mob) if(!(istype(M,/mob))) diff --git a/code/game/objects/items/toys/cards.dm b/code/game/objects/items/toys/cards.dm index 10175561768b..02eab0543aef 100644 --- a/code/game/objects/items/toys/cards.dm +++ b/code/game/objects/items/toys/cards.dm @@ -49,6 +49,12 @@ for(var/number in list("ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king")) cards += new /datum/playing_card("[number] of [suit]", "[suit]_[number]", "back_[base_icon]", card_id++) +/obj/item/toy/deck/attack_alien(mob/living/carbon/xenomorph/xeno) + if(HAS_TRAIT(xeno, TRAIT_CARDPLAYING_THUMBS)) + attack_hand(xeno) + return XENO_NONCOMBAT_ACTION + return + /obj/item/toy/deck/uno name = "deck of UNO cards" desc = "A simple deck of the Weyland-Yutani classic UNO playing cards." @@ -111,7 +117,7 @@ if(usr.stat || !Adjacent(usr)) return - if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS)) + if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_CARDPLAYING_THUMBS)) return var/mob/living/carbon/human/user = usr @@ -140,7 +146,7 @@ if(user.stat || !Adjacent(user)) return - if(!ishuman(user) && !HAS_TRAIT(user, TRAIT_OPPOSABLE_THUMBS)) + if(!ishuman(user) && !HAS_TRAIT(user, TRAIT_CARDPLAYING_THUMBS)) return var/cards_length = length(cards) @@ -186,7 +192,7 @@ if(usr.stat || !Adjacent(usr)) return - if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS)) + if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_CARDPLAYING_THUMBS)) return var/mob/living/carbon/user = usr @@ -218,7 +224,7 @@ if(usr.stat || !Adjacent(usr)) return - if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS)) + if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_CARDPLAYING_THUMBS)) return if(!length(cards)) @@ -268,7 +274,7 @@ if(!usr || !over) return - if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS)) + if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_CARDPLAYING_THUMBS)) return if(get_dist(usr, over) > 3) @@ -303,6 +309,12 @@ . = ..() QDEL_NULL_LIST(cards) +/obj/item/toy/handcard/attack_alien(mob/living/carbon/xenomorph/xeno) + if(HAS_TRAIT(xeno, TRAIT_CARDPLAYING_THUMBS)) + attack_hand(xeno) + return XENO_NONCOMBAT_ACTION + return + /obj/item/toy/handcard/aceofspades icon_state = "spades_ace" desc = "An Ace of Spades" @@ -337,7 +349,7 @@ if(usr.stat) return - if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS)) + if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_CARDPLAYING_THUMBS)) return pile_state = !pile_state @@ -353,7 +365,7 @@ if(usr.stat) return - if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS)) + if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_CARDPLAYING_THUMBS)) return //fuck any qsorts and merge sorts. This needs to be brutally easy @@ -444,7 +456,7 @@ return if(usr.stat) return - if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS)) + if(!ishuman(usr) && !HAS_TRAIT(usr, TRAIT_CARDPLAYING_THUMBS)) return if(isstorage(loc)) diff --git a/code/game/objects/items/toys/toy_weapons.dm b/code/game/objects/items/toys/toy_weapons.dm index a9845c2bc7f8..7afd9870ac6a 100644 --- a/code/game/objects/items/toys/toy_weapons.dm +++ b/code/game/objects/items/toys/toy_weapons.dm @@ -202,16 +202,33 @@ * Toy swords */ /obj/item/toy/sword - name = "toy sword" - desc = "A cheap, plastic replica of an energy sword. Realistic sounds! Ages 8 and up." + name = "blue toy light-sword" + desc = "A cheap, plastic replica of a light-sword, very popular toy among fans of those new Star Skirmishes movies. Realistic sounds! Ages 8 and up." icon = 'icons/obj/items/weapons/melee/energy.dmi' + item_icons = list( + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/weapons/melee/energy_lefthand.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/weapons/melee/energy_righthand.dmi', + ) icon_state = "sword0" item_state = "sword0" var/active = 0 + var/sword_type = "blue" w_class = SIZE_SMALL flags_item = NOSHIELD attack_verb = list("attacked", "struck", "hit") +/obj/item/toy/sword/red + name = "red toy light-sword" + sword_type = "red" + +/obj/item/toy/sword/green + name = "green toy light-sword" + sword_type = "green" + +/obj/item/toy/sword/purple + name = "green toy light-sword" + sword_type = "purple" + /obj/item/toy/sword/attack_self(mob/user) ..() @@ -219,8 +236,8 @@ if (active) to_chat(user, SPAN_NOTICE(" You extend the plastic blade with a quick flick of your wrist.")) playsound(user, 'sound/weapons/saberon.ogg', 15, 1) - icon_state = "swordblue" - item_state = "swordblue" + icon_state = "sword[sword_type]" + item_state = "sword[sword_type]" w_class = SIZE_LARGE else to_chat(user, SPAN_NOTICE(" You push the plastic blade back down into the handle.")) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index f4861161525f..57e439827f55 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -72,14 +72,6 @@ name = "Kepler Flamehot wrapper" icon_state = "flamehotkepler" -/obj/item/trash/liquidfood - name = "\improper \"LiquidFood\" ration" - icon_state = "liquidfood" - -/obj/item/trash/pistachios - name = "Pistachios pack" - icon_state = "pistachios_pack" - /obj/item/trash/popcorn name = "Popcorn" icon_state = "popcorn" diff --git a/code/game/objects/items/weapons/blades.dm b/code/game/objects/items/weapons/blades.dm index 8de41912baee..11981ce7eefa 100644 --- a/code/game/objects/items/weapons/blades.dm +++ b/code/game/objects/items/weapons/blades.dm @@ -110,12 +110,6 @@ item_state = "katana" force = MELEE_FORCE_VERY_STRONG -/obj/item/weapon/sword/yautja - name = "duelling blade" - desc = "A primitive yet deadly sword used in yautja rituals and duels. Though crude compared to their advanced weaponry, its sharp edge demands respect." - icon_state = "yautja_sword" - item_state = "yautja_sword" - //To do: replace the toys. /obj/item/weapon/sword/katana/replica name = "replica katana" @@ -123,6 +117,13 @@ force = MELEE_FORCE_WEAK throwforce = 7 +/obj/item/weapon/sword/dragon_katana + name = "dragon katana" + desc = "A finely made Japanese sword, with a cherry colored handle. The blade has been filed to a molecular edge, and is extremely deadly. This one seems to have been handcrafted." + icon_state = "dragon_katana" + item_state = "dragon_katana" + force = MELEE_FORCE_VERY_STRONG + /obj/item/weapon/throwing_knife name ="\improper M11 throwing knife" icon = 'icons/obj/items/weapons/melee/knives.dmi' @@ -147,21 +148,6 @@ flags_armor_protection = SLOT_FACE flags_item = CAN_DIG_SHRAPNEL -/obj/item/weapon/unathiknife - name = "duelling knife" - desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude." - icon = 'icons/obj/items/weapons/melee/knives.dmi' - icon_state = "unathiknife" - item_icons = list( - WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/weapons/melee/knives_lefthand.dmi', - WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/weapons/melee/knives_righthand.dmi' - ) - hitsound = 'sound/weapons/bladeslice.ogg' - attack_verb = list("ripped", "torn", "cut") - force = MELEE_FORCE_STRONG - throwforce = MELEE_FORCE_STRONG - edge = 1 - ///For digging shrapnel out of OTHER people, not yourself. Triggered by human/attackby() so target is definitely human. User might not be. /obj/item/proc/dig_out_shrapnel_check(mob/living/carbon/human/target, mob/living/carbon/human/user) if(user.a_intent == INTENT_HELP && (target == user || skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC))) //Squad medics and above, or yourself @@ -250,8 +236,8 @@ inhand_x_dimension = 64 inhand_y_dimension = 64 item_icons = list( - WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/weapons/melee/knives_lefthand.dmi', - WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/weapons/melee/knives_righthand.dmi' + WEAR_L_HAND = 'icons/mob/humans/onmob/inhands/items/items_lefthand_64.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/inhands/items/items_righthand_64.dmi' ) /obj/item/weapon/straight_razor diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 15edfe7da065..f51e12d5745d 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -105,10 +105,11 @@ return /obj/item/weapon/telebaton/proc/stun(mob/living/carbon/human/target, mob/living/user) + var/stun_sound = pick('sound/weapons/baton.ogg', 'sound/effects/woodstave.ogg') if(target.check_shields(src, 0, "[user]'s [name]")) return FALSE // Visuals and sound - playsound(target, 'sound/weapons/baton.ogg', 50, TRUE, 7) + playsound(target, stun_sound, 50, TRUE, 7) user.animation_attack_on(target) user.flick_attack_overlay(target, "punch") log_interact(user, target, "[key_name(user)] stunned [key_name(target)] with \the [src]") diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index fc1830862789..5dea16121c81 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -281,6 +281,7 @@ hitsound = "swing_hit" var/detonating = FALSE + var/gib_user = TRUE var/wielded_attack_verb = list("charged") var/wielded_hitsound = null var/unwielded_attack_verb = list("whacked") @@ -331,17 +332,20 @@ detonating = TRUE playsound(user, 'sound/items/Wirecutter.ogg', 50, 1) - sleep(3) + addtimer(CALLBACK(src, PROC_REF(lungemine_detonate), target, user), 0.3 SECONDS) +/obj/item/weapon/twohanded/lungemine/proc/lungemine_detonate(atom/target, mob/user) var/turf/epicenter = get_turf(target) - target.ex_act(400, null, src, user, 100) cell_explosion(epicenter, detonation_force, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data(initial(name), user)) + if(gib_user) + user.gib() qdel(src) /obj/item/weapon/twohanded/lungemine/damaged name = "damaged lunge mine" desc = "A crude but intimidatingly bulky shaped explosive charge, fixed to the end of a pole. To use it, one must grasp it firmly in both hands, and thrust the prongs of the shaped charge into the target. That the resulting explosion occurs directly in front of the user's face was not an apparent concern of the designer. A true hero's weapon. This one seems pretty badly damaged, you probably shouldn't even pick it up from the ground." detonation_force = 50 + gib_user = FALSE /obj/item/weapon/twohanded/breacher name = "\improper D2 Breaching Hammer" @@ -372,13 +376,13 @@ var/move_delay_addition = 1.5 /obj/item/weapon/twohanded/breacher/synth/pickup(mob/user) + . = ..() if(!(HAS_TRAIT(user, TRAIT_SUPER_STRONG))) to_chat(user, SPAN_HIGHDANGER("You barely manage to lift [src] above your knees. This thing will probably be useless to you.")) user.apply_effect(3, EYE_BLUR) RegisterSignal(user, COMSIG_HUMAN_POST_MOVE_DELAY, PROC_REF(handle_movedelay)) return - ..() /obj/item/weapon/twohanded/breacher/synth/proc/handle_movedelay(mob/living/M, list/movedata) SIGNAL_HANDLER diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 3bcb80a80449..96be5b8b4ffe 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -92,12 +92,6 @@ force = MELEE_FORCE_STRONG w_class = SIZE_MEDIUM -/obj/item/weapon/baseballbat/metal/yautja - name = "duelling club" - desc = "A crude metal club adorned with a skull. Used as a non-lethal training weapon for young yautja honing their combat skills." - icon_state = "hunter_club" - item_state = "hunter_club" - /obj/item/weapon/butterfly name = "butterfly knife" desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket." @@ -235,9 +229,9 @@ ///////////////////////// M.last_damage_data = create_cause_data(initial(name), user) - user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)])" - M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)])" - msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYE: [uppertext(damtype)]) in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z]).", user.loc.x, user.loc.y, user.loc.z) + user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)])" + M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)])" + msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(intent_text(user.a_intent))]) (DAMTYPE: [uppertext(damtype)]) in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z]).", user.loc.x, user.loc.y, user.loc.z) ///////////////////////// diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 8a9e6c18348d..a15da2ef98d3 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -318,6 +318,8 @@ if(M.stat != DEAD) to_chat(user, SPAN_WARNING("[M] resists your attempt to buckle!")) return + if(M.stat != DEAD) + return do_buckle(M, user) // the actual buckling proc diff --git a/code/game/objects/prop.dm b/code/game/objects/prop.dm index abf174c44a2c..acd7f4d74d54 100644 --- a/code/game/objects/prop.dm +++ b/code/game/objects/prop.dm @@ -273,39 +273,91 @@ //books /obj/item/prop/magazine/book name = "generic prop book" - desc = "some generic hardcover book, probably sucked" + desc = "Some generic hardcover book containing letters that, when grouped, form what we usually call 'words'. It's pages are made of paper, a material created with cellulose, being that a component usually found in trees." icon = 'icons/obj/items/books.dmi' - icon_state = "bookSpaceLaw" - item_state = "book_red" + icon_state = "book_white" + item_state = "book_white" -/obj/item/prop/magazine/book/spacebeast +/obj/item/prop/magazine/book/spacebeast //The presence of this book is actually anachronistic, given that it was only published in 2183 name = "\improper Space Beast, by Robert Morse" desc = "An autobiography focusing on the events of 'Fury 161' in August 2179 following the arrival of 'Ellen Ripley' and an unknown alien creature known as 'The Dragon' the books writing is extremely crude and was book banned shorty after publication." + icon_state = "book_dark" + item_state = "book_dark" /obj/item/prop/magazine/book/borntokill name = "\improper Born to Kill" - desc = "An autobiography penned by Derik A.W. Tomahawk it recounts his service in the USCM. The book was harshly criticised for its bland and uncreative writing and wasn't well received by the general public or members of the UA military. However, artificial soldiers typically value the information contained within." + desc = "An autobiography penned by Derik A.W. Tomahawk it recounts his service in the United States Colonial Marines (USCM), more specifically in the third fleet. The book was harshly criticised by the general public and even some members of the United Americas (UA) military for it's bland, repetitive and lifeless writing, consequently giving it quite a bad reception. However, artificial soldiers typically like and value the information contained within." + icon_state = "book_green" + item_state = "book_green" /obj/item/prop/magazine/book/bladerunner name = "\improper Bladerunner: A True Detectives Story" desc = "In the dark undercity of Luna 2119, blade runner Richard Ford is called out of retirement to terminate a cult of replicants who have escaped Earth seeking the meaning of their existence." + icon_state = "book_tan" + item_state = "book_tan" /obj/item/prop/magazine/book/starshiptroopers name = "Starship Troopers" - desc = "Written by Robert A. Heinlein, this book really missed the mark when it comes to the individual equipment it depicts 'troopers' having, but it's still issued to every marine in basic so it must have some value." + desc = "Written by Robert A. Heinlein, this book really missed the mark when it comes to the individual equipment it depicts our 'troopers' having, but it's still issued to every marine in basic so it must have some value." + icon_state = "book_blue" + item_state = "book_blue" /obj/item/prop/magazine/book/theartofwar name = "The Art of War" - desc = "A treatise on war written by Sun Tzu a great general, strategist, and philosopher from ancient Earth. This book is on the Commandant of the United States Colonial Marine Corps reading list and most officers can be found in possession of a copy. Most officers who've read it claim to know a little bit more about fighting than most enlisted but results may vary. " + desc = "A treatise on war written by the legendary Sun Tzu, a great general, strategist, and philosopher from ancient Earth. This book is on the Commandant of the United States Colonial Marine Corps reading list and most officers can be found in possession of a copy. Most officers who've read it claim to know a little bit more about fighting than most who did not, but results may vary a lot. " + icon_state = "book_red" + item_state = "book_red" //boots magazine /obj/item/prop/magazine/boots name = "generic Boots! magazine" desc = "The only official USCM magazine!" + icon = 'icons/obj/items/paper.dmi' + icon_state = "boots!" + +/obj/item/prop/magazine/boots/n07 + name = "Boots!: Issue No.7" + desc = "The only official USCM magazine, the headline reads 'The Future Soldier!'. The short paragraph following describes the B18 Defensive Armor on how it is designed to make the modern marine invincible and that it has recently finished trials, raising the expectations of the brass for this new piece of gear." + +/obj/item/prop/magazine/boots/n45 + name = "Boots!: Issue No. 45" + desc = "The only official USCM magazine, the headline reads 'Your sidearm and You!' with the subtitle 'Your best sleeping companion' right below it. The first part of the article explains basic sidearm maintenance and includes a small advertisement for a well-known gunsmith on Gateway Station. The second describes the best positions to sleep with your sidearm under the pillow in case of unexpected seditious activity." + +/obj/item/prop/magazine/boots/n054 + name = "Boots!: Issue No.54" + desc = "The only official USCM magazine, the headline reads 'ARMAT strikes back against litigants in M41A-MK2 self cleaning case'." + +/obj/item/prop/magazine/boots/n055 + name = "Boots!: Issue No.55" + desc = "The only official USCM magazine, the headline reads 'TEN tips to keep your UD4 cockpit both safer and more relaxing'." + +/obj/item/prop/magazine/boots/n058 + name = "Boots!: Issue No.58" + desc = "The only official USCM magazine, the headline reads 'Swift, Silent, Deadly: Tientsin'. The article then goes on to describe the experience of the 1st FORECON Battalion veterans in the Tientsin campaign and the harsh jungle environment they had to go through when dealing with UPP and Local Guerrillas." + +/obj/item/prop/magazine/boots/n070 + name = "Boots!: Issue No.70" + desc = "The only official USCM magazine, the headline reads “Marine 70, The Future of Warfare.” The article then goes on to detail the plans and implementation of Marine 70, a program designed to help modernize the USCM for 2170." + +/obj/item/prop/magazine/boots/n113 + name = "Boots!: Issue No.113" + desc = "The only official USCM magazine, the headline reads 'Canberra, the Forward edge of the battle'. The article then goes on to detail the Fierce urban combat the marines had to face against Australian rebels, a few accounts from tankers on the effectiveness of the new M40 Ridgeway, and recent sightings of Marines Special Forces (Raiders) in the AO." /obj/item/prop/magazine/boots/n117 name = "Boots!: Issue No.117" - desc = "The only official USCM magazine, the headline reads 'STOP CANNING' the short paragraph further explains the dangers of marines throwing CN-20 Nerve gas into bathrooms as a prank." + desc = "The only official USCM magazine, the headline reads 'STOP CANNING'. The short paragraph further explains the dangers of marines throwing CN-20 Nerve gas into bathrooms as a prank." + +/obj/item/prop/magazine/boots/n120 + name = "Boots!: Special Commemorative Issue No.120" + desc = "The only official USCM magazine, the headline reads 'Wallace Kelly Haar, 2136-2181'." + +/obj/item/prop/magazine/boots/n125 + name = "Boots!: Issue No. 125" + desc = "The only official USCM magazine, the headline reads 'Bravo Squad… not just for FOB duty!'. Despite the title the article primarily consists of photos of barricades and diagrams on arrangements for ammo boxes." + +/obj/item/prop/magazine/boots/n131 + name = "Boots!: Issue No. 131" + desc = "The only official USCM magazine, the headline reads 'NO HOTBOXING'. The following paragraph goes into detail about how the HSDP smoke grenades are not safe for long period inhalation exposure and how hypoxia is a poor way to get high." /obj/item/prop/magazine/boots/n150 name = "Boots!: Issue No.150" @@ -315,13 +367,9 @@ name = "Boots!: Issue No.160" desc = "The only official USCM magazine, the headline reads 'Corporate Liaison 'emotionally exhausted' from screwing so many people over.'" -/obj/item/prop/magazine/boots/n054 - name = "Boots!: Issue No.54" - desc = "The only official USCM magazine, the headline reads 'ARMAT strikes back against litigants in M41A-MK2 self cleaning case'" - -/obj/item/prop/magazine/boots/n055 - name = "Boots!: Issue No.55" - desc = "The only official USCM magazine, the headline reads 'TEN tips to keep your UD4 cockpit both safer and more relaxing.'" +/obj/item/prop/magazine/boots/n189 + name = "Boots!: Issue No.189" + desc = "The only official USCM magazine, the headline reads 'Military Police Edition, those that help marines help themselves!'. As with every copy you have ever seen of Issue 189, someone has taken the time to deface it with crude language and unseemly drawings." // Massive Digger by dimdimich1996 diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 57cd15f5ad71..56088b033534 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -10,7 +10,7 @@ var/list/debris var/unslashable = FALSE var/wrenchable = FALSE - health = 100 + health = STRUCTURE_HEALTH_BASE anchored = TRUE projectile_coverage = PROJECTILE_COVERAGE_MEDIUM can_block_movement = TRUE @@ -112,6 +112,12 @@ if(!can_climb(user)) return FALSE + if(istype(loc, /turf/open_space) && user.a_intent != INTENT_HARM) + var/turf/open_space/open = loc + open.climb_down(user) + return FALSE + + var/list/climbdata = list("climb_delay" = climb_delay) SEND_SIGNAL(user, COMSIG_LIVING_CLIMB_STRUCTURE, climbdata) var/final_climb_delay = climbdata["climb_delay"] //so it doesn't set structure's climb_delay to permanently be modified diff --git a/code/game/objects/structures/airlock_assembly.dm b/code/game/objects/structures/airlock_assembly.dm index b3571c8ea1cb..da7080ba8905 100644 --- a/code/game/objects/structures/airlock_assembly.dm +++ b/code/game/objects/structures/airlock_assembly.dm @@ -221,7 +221,11 @@ if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return airlock_type = tgui_input_list(user,"Select an airlock type." , "Airlock Type" , airlock_types) - update_icon() + if(airlock_type) + update_icon() + else + to_chat(user, SPAN_WARNING("You must choose a type")) + return if(iswelder(attacking_item)) if(!HAS_TRAIT(attacking_item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 5d9c94179453..efd5cdefe535 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -54,6 +54,29 @@ addtimer(CALLBACK(src, PROC_REF(update_icon)), 0) starting_maxhealth = maxhealth +/obj/structure/barricade/metal/Initialize(mapload, mob/user) + . = ..() + var/area/area = get_area(src) + if(area.flags_area & AREA_NOSECURECADES && !mapload) + anchored = FALSE + build_state = BARRICADE_BSTATE_MOVABLE + to_chat(user, SPAN_WARNING("[src] does not properly secure on this surface!")) + +/obj/structure/barricade/plasteel/Initialize(mapload, mob/user) + . = ..() + var/area/area = get_area(src) + if(area.flags_area & AREA_NOSECURECADES && !mapload) + anchored = FALSE + build_state = BARRICADE_BSTATE_MOVABLE + to_chat(user, SPAN_WARNING("[src] does not properly secure on this surface!")) + +/obj/structure/barricade/deployable/Initialize(mapload, mob/user) + . = ..() + var/area/area = get_area(src) + if(area.flags_area & AREA_NOSECURECADES && !mapload) + anchored = FALSE + to_chat(user, SPAN_WARNING("[src] does not properly secure on this surface!")) + /obj/structure/barricade/initialize_pass_flags(datum/pass_flags_container/pass_flags) ..() if (pass_flags) @@ -92,8 +115,6 @@ layer = initial(layer) - 0.01 else layer = initial(layer) - if(!anchored) - layer = initial(layer) else if(can_change_dmg_state) icon_state = "[barricade_type]_closed_[damage_state]" @@ -101,6 +122,11 @@ icon_state = "[barricade_type]_closed" layer = OBJ_LAYER + // Pixelshift to indicate anchored state + pixel_y = initial(pixel_y) + if(!anchored) + pixel_y += 2 + if(upgraded) switch(upgraded) if(BARRICADE_UPGRADE_BURN) @@ -131,7 +157,21 @@ ..() /obj/structure/barricade/Collided(atom/movable/atom_movable) - ..() + // Similar behavior to /atom/movable/Collided(atom/movable/AM) but we account for something in our same location + if(isliving(atom_movable) && !anchored) + var/blocked = FALSE + for(var/atom/movable/other_moveable as anything in loc) + if(other_moveable == src || other_moveable == atom_movable) + continue + if(!other_moveable.density || !other_moveable.can_block_movement) + continue + blocked = TRUE + break + if(!blocked) + var/target_dir = get_dir(atom_movable, src) || dir + var/turf/target_turf = get_step(loc, target_dir) + Move(target_turf) + SEND_SIGNAL(src, COMSIG_STRUCTURE_COLLIDED, atom_movable) if(istype(atom_movable, /mob/living/carbon/xenomorph/crusher)) var/mob/living/carbon/xenomorph/crusher/living_carbon = atom_movable @@ -262,6 +302,7 @@ bullet.damage = bullet.damage * burn_multiplier else bullet.damage = bullet.damage * brute_projectile_multiplier + playsound(src, barricade_hitsound, 35, 1) if(istype(bullet.ammo, /datum/ammo/xeno/boiler_gas)) take_damage(floor(50 * burn_multiplier)) @@ -429,7 +470,7 @@ update_icon() /obj/structure/barricade/clicked(mob/user, list/mods) - if(mods["alt"]) + if(mods[ALT_CLICK]) rotate(user) return TRUE diff --git a/code/game/objects/structures/barricade/deployable.dm b/code/game/objects/structures/barricade/deployable.dm index ab54551f7342..727629f763b9 100644 --- a/code/game/objects/structures/barricade/deployable.dm +++ b/code/game/objects/structures/barricade/deployable.dm @@ -1,6 +1,6 @@ /obj/structure/barricade/deployable name = "portable composite barricade" - desc = "A plasteel-carbon composite barricade. Resistant to most acids while being simple to repair. There are two pushplates that allow this barricade to fold into a neat package. Use a blowtorch to repair." + desc = "A plasteel-carbon composite barricade. This MB-6 model is simple to repair. There are two pushplates that allow this barricade to fold into a neat package. Use a blowtorch to repair." icon_state = "folding_0" health = 350 maxhealth = 350 @@ -13,7 +13,6 @@ can_wire = FALSE can_change_dmg_state = 1 climbable = FALSE - unacidable = TRUE anchored = TRUE repair_materials = list("metal" = 0.3, "plasteel" = 0.45) var/build_state = BARRICADE_BSTATE_SECURED //Look at __game.dm for barricade defines diff --git a/code/game/objects/structures/barricade/folding.dm b/code/game/objects/structures/barricade/folding.dm index 3b8336a5d511..a3de3efb4aba 100644 --- a/code/game/objects/structures/barricade/folding.dm +++ b/code/game/objects/structures/barricade/folding.dm @@ -176,6 +176,9 @@ if(!area.allow_construction) to_chat(user, SPAN_WARNING("[src] must be secured on a proper surface!")) return + if(area.flags_area & AREA_NOSECURECADES) + to_chat(user, SPAN_WARNING("[src] must be secured on a proper surface!")) + return var/turf/open/T = loc if(!(istype(T) && T.allow_construction)) to_chat(user, SPAN_WARNING("[src] must be secured on a proper surface!")) diff --git a/code/game/objects/structures/barricade/handrail.dm b/code/game/objects/structures/barricade/handrail.dm index a99bc11857f2..cd9a1d01c1e8 100644 --- a/code/game/objects/structures/barricade/handrail.dm +++ b/code/game/objects/structures/barricade/handrail.dm @@ -40,8 +40,9 @@ layer = initial(layer) - 0.01 else layer = initial(layer) + pixel_y = initial(pixel_y) if(!anchored) - layer = initial(layer) + pixel_y += 2 if(build_state == BARRICADE_BSTATE_FORTIFIED) if(reinforced) overlays += image('icons/obj/structures/handrail.dmi', icon_state = "[barricade_type]_reinforced_[damage_state]") @@ -221,6 +222,9 @@ return . = ..() +/obj/structure/barricade/handrail/no_vault + autoclimb = FALSE + /obj/structure/barricade/handrail/type_b icon_state = "handrail_b_0" @@ -248,6 +252,12 @@ /obj/structure/barricade/handrail/sandstone/b icon_state = "hr_sandstone_b" +/obj/structure/barricade/handrail/sandstone/dark + color = "#2E1E21" + +/obj/structure/barricade/handrail/sandstone/b/dark + color = "#2E1E21" + /obj/structure/barricade/handrail/pizza name = "\improper diner half-wall" icon_state = "hr_sandstone" //temp, getting sprites soontm diff --git a/code/game/objects/structures/barricade/non_folding.dm b/code/game/objects/structures/barricade/non_folding.dm index 71b84904f2f6..ab19430ebeba 100644 --- a/code/game/objects/structures/barricade/non_folding.dm +++ b/code/game/objects/structures/barricade/non_folding.dm @@ -243,6 +243,9 @@ if(!(istype(turf) && turf.allow_construction)) to_chat(user, SPAN_WARNING("[src] must be secured on a proper surface!")) return + if(area.flags_area & AREA_NOSECURECADES) + to_chat(user, SPAN_WARNING("[src] must be secured on a proper surface!")) + return playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) return diff --git a/code/game/objects/structures/barricade/sandbags.dm b/code/game/objects/structures/barricade/sandbags.dm index c4edc9e108e3..16a1644599a4 100644 --- a/code/game/objects/structures/barricade/sandbags.dm +++ b/code/game/objects/structures/barricade/sandbags.dm @@ -20,11 +20,6 @@ if(direction) setDir(direction) - if(dir == SOUTH) - pixel_y = -7 - else if(dir == NORTH) - pixel_y = 7 - ..(loc, user) for(var/i = 1 to amount-1) @@ -33,6 +28,11 @@ /obj/structure/barricade/sandbags/update_icon() ..() + if(dir == SOUTH) + pixel_y = -7 + else if(dir == NORTH) + pixel_y = 7 + icon_state = "sandbag[build_stage]" if(dir > 2) layer = OBJ_LAYER //This prevents cades from becoming invisible under a north/south facing plasteel cade. @@ -43,21 +43,25 @@ changed = TRUE build_stage = BARRICADE_SANDBAG_4 maxhealth = BARRICADE_SANDBAG_TRESHOLD_4 + damage_state = BARRICADE_DMG_NONE stack_amount = 4 if(health <= BARRICADE_SANDBAG_TRESHOLD_3 && build_stage != BARRICADE_SANDBAG_3) changed = TRUE build_stage = BARRICADE_SANDBAG_3 maxhealth = BARRICADE_SANDBAG_TRESHOLD_3 + damage_state = BARRICADE_DMG_SLIGHT stack_amount = 3 if(health <= BARRICADE_SANDBAG_TRESHOLD_2 && build_stage != BARRICADE_SANDBAG_2) changed = TRUE build_stage = BARRICADE_SANDBAG_2 maxhealth = BARRICADE_SANDBAG_TRESHOLD_2 + damage_state = BARRICADE_DMG_MODERATE stack_amount = 2 if(health <= BARRICADE_SANDBAG_TRESHOLD_1 && build_stage != BARRICADE_SANDBAG_1) changed = TRUE build_stage = BARRICADE_SANDBAG_1 maxhealth = BARRICADE_SANDBAG_TRESHOLD_1 + damage_state = BARRICADE_DMG_HEAVY stack_amount = 1 if(changed && is_wired) maxhealth += 50 diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index c03c3a387ddc..901198b67638 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -82,6 +82,28 @@ LINEN BINS /obj/item/bedsheet/colorable icon_state = "sheetce" +/obj/item/bedsheet/bedroll + icon_state = "bedroll_sheet" + +/obj/item/bedsheet/bedroll/blue + icon_state = "bedroll_sheet" + color = "#8cb9e2" + +/obj/item/bedsheet/bedroll/red + icon_state = "bedroll_sheet" + color = "#df4f4f" + +/obj/item/bedsheet/bedroll/pink + icon_state = "bedroll_sheet" + color = "#eaa8b2" + +/obj/item/bedsheet/bedroll/green + icon_state = "bedroll_sheet" + color = "#b3e290" + +/obj/item/bedsheet/bedroll/yellow + icon_state = "bedroll_sheet" + color = "#e2df90" /obj/structure/bedsheetbin name = "linen bin" diff --git a/code/game/objects/structures/blocker.dm b/code/game/objects/structures/blocker.dm index 82fe44c0e0c4..8aafd66434e4 100644 --- a/code/game/objects/structures/blocker.dm +++ b/code/game/objects/structures/blocker.dm @@ -5,6 +5,7 @@ anchored = TRUE unacidable = TRUE unslashable = TRUE + explo_proof = TRUE icon = 'icons/landmarks.dmi' icon_state = "map_blocker" diff --git a/code/game/objects/structures/cargo_container.dm b/code/game/objects/structures/cargo_container.dm index ea408c46acf6..e07a880b9a5b 100644 --- a/code/game/objects/structures/cargo_container.dm +++ b/code/game/objects/structures/cargo_container.dm @@ -106,6 +106,32 @@ /obj/structure/cargo_container/wy/right icon_state = "wy_r" +/obj/structure/cargo_container/wy2 + name = "Weyland-Yutani Cargo Container" + desc = "A huge industrial shipping container.\nThis one is from The Weyland-Yutani Corporation, you have probably heard of them before." + +/obj/structure/cargo_container/wy2/left + icon_state = "wy2_l" + +/obj/structure/cargo_container/wy2/mid + icon_state = "wy2_m" + +/obj/structure/cargo_container/wy2/right + icon_state = "wy2_r" + +/obj/structure/cargo_container/armat + name = "ARMAT Cargo Container" + desc = "A large industrial container. This one is from ARMAT, the defense contractors behind the M41A and other marine weaponry." + +/obj/structure/cargo_container/armat/left + icon_state = "armat_l" + +/obj/structure/cargo_container/armat/mid + icon_state = "armat_m" + +/obj/structure/cargo_container/armat/right + icon_state = "armat_r" + /obj/structure/cargo_container/hd name = "Hyperdyne Systems Cargo Container" desc = "A huge industrial shipping container.\nThis one is from Hyperdyne Systems, a manufacturer of synthetics, prosthetics, and weapons.\nWe don't speak about their former affiliations with the UPP." @@ -361,3 +387,129 @@ /obj/structure/cargo_container/uscm/right icon_state = "uscm_r" + +/obj/structure/cargo_container/upp_small + name = "UPP Cargo Container" + desc = "A small industrial shipping container.\nThis one is from the Union of Progressive Peoples, as indicated by the red star symbol on the side." + bound_height = 32 + layer = ABOVE_XENO_LAYER + +/obj/structure/cargo_container/upp_small/container_1/left + icon_state = "upp_1_l" + +/obj/structure/cargo_container/upp_small/container_1/right + icon_state = "upp_1_r" + +/obj/structure/cargo_container/upp_small/container_2/left + icon_state = "upp_2_l" + +/obj/structure/cargo_container/upp_small/container_2/right + icon_state = "upp_2_r" + +/obj/structure/cargo_container/upp_small/container_3/left + icon_state = "upp_3_l" + +/obj/structure/cargo_container/upp_small/container_3/right + icon_state = "upp_3_r" + +/obj/structure/cargo_container/upp_small/container_4/left + icon_state = "upp_4_l" + +/obj/structure/cargo_container/upp_small/container_4/right + icon_state = "upp_4_r" + +/obj/structure/cargo_container/upp_small/container_5/left + icon_state = "upp_5_l" + +/obj/structure/cargo_container/upp_small/container_5/right + icon_state = "upp_5_r" + +/obj/structure/cargo_container/upp_small/container_6/left + icon_state = "upp_6_l" + +/obj/structure/cargo_container/upp_small/container_6/right + icon_state = "upp_6_r" + +/obj/structure/cargo_container/upp_small/container_7/left + icon_state = "upp_7_l" + +/obj/structure/cargo_container/upp_small/container_7/right + icon_state = "upp_7_r" + +/obj/structure/cargo_container/upp_small/container_8/left + icon_state = "upp_8_l" + +/obj/structure/cargo_container/upp_small/container_8/right + icon_state = "upp_8_r" + +/obj/structure/cargo_container/upp_small/container_9/left + icon_state = "upp_9_l" + +/obj/structure/cargo_container/upp_small/container_9/right + icon_state = "upp_9_r" + +/obj/structure/cargo_container/upp_small/container_10/left + icon_state = "upp_10_l" + +/obj/structure/cargo_container/upp_small/container_10/right + icon_state = "upp_10_r" + +/obj/structure/cargo_container/upp_small/container_11/left + icon_state = "upp_11_l" + +/obj/structure/cargo_container/upp_small/container_11/right + icon_state = "upp_11_r" + +/obj/structure/cargo_container/upp_small/container_12/left + icon_state = "upp_12_l" + +/obj/structure/cargo_container/upp_small/container_12/right + icon_state = "upp_12_r" + +/obj/structure/cargo_container/upp_small/container_13/left + icon_state = "upp_13_l" + +/obj/structure/cargo_container/upp_small/container_13/right + icon_state = "upp_13_r" + +/obj/structure/cargo_container/upp_small/container_14/left + icon_state = "upp_14_l" + +/obj/structure/cargo_container/upp_small/container_14/right + icon_state = "upp_14_r" + +/obj/structure/cargo_container/upp_small/container_15/left + icon_state = "upp_15_l" + +/obj/structure/cargo_container/upp_small/container_15/right + icon_state = "upp_15_r" + +/obj/structure/cargo_container/upp_small/container_16/left + icon_state = "upp_16_l" + +/obj/structure/cargo_container/upp_small/container_16/right + icon_state = "upp_16_r" + +/obj/structure/cargo_container/upp_small/container_17/left + icon_state = "upp_17_l" + +/obj/structure/cargo_container/upp_small/container_17/right + icon_state = "upp_17_r" + +/obj/structure/cargo_container/upp_small/container_18/left + icon_state = "upp_18_l" + +/obj/structure/cargo_container/upp_small/container_18/right + icon_state = "upp_18_r" + +/obj/structure/cargo_container/upp_small/container_19/left + icon_state = "upp_19_l" + +/obj/structure/cargo_container/upp_small/container_19/right + icon_state = "upp_19_r" + +/obj/structure/cargo_container/upp_small/container_20/left + icon_state = "upp_20_l" + +/obj/structure/cargo_container/upp_small/container_20/right + icon_state = "upp_20_r" diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 8f610994c487..f7d88d3cd98b 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -47,3 +47,8 @@ icon = 'icons/turf/floors/catwalks.dmi' icon_state = "catwalk0" base_state = "catwalk0" + +/obj/structure/catwalk/strata + icon = 'icons/turf/floors/strata_floor.dmi' + icon_state = "plating_catwalk" + base_state = "catwalk" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 29d700fe7e88..6cb02285b87f 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -254,6 +254,9 @@ return user.drop_inv_item_to_loc(W,loc) + //If we're trying to label a crate, label it, don't open it. The code that lets a hand labeler label crates but not lockers is in misc_tools.dm + else if(istype(W, /obj/item/tool/hand_labeler)) + return else if(istype(W, /obj/item/packageWrap) || istype(W, /obj/item/explosive/plastic)) return else if(iswelder(W)) 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 94b246e79a99..d452872c5e0f 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -57,8 +57,8 @@ * Lawyer */ /obj/structure/closet/lawcloset - name = "legal closet" - desc = "It's a storage unit for courtroom apparel and items." + name = "suit closet" + desc = "It's a storage unit for formal apparel and items." icon_state = "blue" icon_closed = "blue" icon_opened = "blue_open" @@ -69,8 +69,11 @@ new /obj/item/clothing/under/lawyer/black(src) new /obj/item/clothing/under/lawyer/red(src) new /obj/item/clothing/under/lawyer/bluesuit(src) - new /obj/item/clothing/suit/storage/lawyer/bluejacket(src) + new /obj/item/clothing/suit/storage/jacket/marine/lawyer/bluejacket(src) + new /obj/item/clothing/suit/storage/jacket/marine/lawyer/redjacket(src) + new /obj/item/clothing/suit/storage/jacket/marine/lawyer/purpjacket(src) + new /obj/item/clothing/suit/storage/jacket/marine/lawyer/blackjacket(src) + new /obj/item/clothing/under/lawyer/purpsuit(src) - new /obj/item/clothing/suit/storage/lawyer/purpjacket(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/black(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 31b142a924e0..98b2030d3d5f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -68,9 +68,9 @@ else new /obj/item/storage/backpack/satchel/eng(src) // new /obj/item/device/radio/headset/almayer/ct(src) - new /obj/item/clothing/under/rank/miner(src) + new /obj/item/clothing/under/hybrisa/kelland_mining(src) new /obj/item/clothing/gloves/black(src) - new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/shoes/jackboots(src) new /obj/item/device/analyzer(src) new /obj/item/storage/bag/ore(src) new /obj/item/device/flashlight/lantern(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm index f497ab0354c1..908402642c8d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm @@ -74,8 +74,8 @@ GLOBAL_LIST_EMPTY(co_secure_boxes) . = ..() new /obj/item/clothing/head/helmet/marine/MP/SO(src) new /obj/item/clothing/head/helmet/marine/MP/SO(src) - new /obj/item/clothing/suit/storage/marine/MP/SO(src) - new /obj/item/clothing/suit/storage/marine/MP/SO(src) + new /obj/item/clothing/suit/storage/marine/CIC(src) + new /obj/item/clothing/suit/storage/marine/CIC(src) new /obj/item/device/radio/headset/almayer/mcom(src) new /obj/item/clothing/gloves/marine(src) new /obj/item/clothing/gloves/marine(src) @@ -133,7 +133,7 @@ GLOBAL_LIST_EMPTY(co_secure_boxes) new /obj/item/clothing/head/helmet/marine/pilot(src) new /obj/item/clothing/under/marine/officer/pilot(src) new /obj/item/clothing/shoes/marine(src) - new /obj/item/clothing/suit/armor/vest/pilot(src) + new /obj/item/clothing/suit/storage/jacket/marine/pilot/armor(src) new /obj/item/storage/belt/gun/m39(src) new /obj/item/storage/backpack/marine/satchel(src) new /obj/item/clothing/gloves/yellow(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 e7e430e4fad3..f856e33fdc14 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -89,9 +89,9 @@ /obj/structure/closet/secure_closet/security/soro/Initialize() . = ..() if(prob(50)) - new /obj/item/storage/backpack/security(src) + new /obj/item/storage/backpack/lightpack/black/five_slot(src) else - new /obj/item/storage/backpack/satchel/sec(src) + new /obj/item/storage/backpack/lightpack/black/five_slot(src) new /obj/item/storage/belt/security(src) new /obj/item/device/flash(src) new /obj/item/reagent_container/spray/pepper(src) @@ -101,11 +101,9 @@ new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/device/hailer(src) new /obj/item/clothing/accessory/storage/black_vest(src) - new /obj/item/clothing/suit/storage/snow_suit/soviet(src) - new /obj/item/clothing/head/ushanka(src) - new /obj/item/clothing/mask/rebreather/scarf(src) - new /obj/item/clothing/under/rank/veteran/soviet_uniform_01(src) - new /obj/item/storage/belt/gun/type47/t73(src) + new /obj/item/clothing/mask/gas/upp_pfb(src) + new /obj/item/clothing/under/marine/veteran/UPP/pap(src) + new /obj/item/storage/belt/gun/type47/SOF_belt/t73(src) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index a29ec2879f4a..0cecc698279d 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -112,7 +112,7 @@ return if(opened) user.drop_inv_item_to_loc(W, loc) - else if(istype(W, /obj/item/packageWrap) || istype(W, /obj/item/stack/fulton)) + else if(istype(W, /obj/item/packageWrap) || istype(W, /obj/item/stack/fulton) || istype(W, /obj/item/tool/hand_labeler)) //If it does something to the crate, don't open it. return else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 1e0fc367fca5..495e9f23f0c7 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -429,6 +429,7 @@ GLOBAL_LIST_INIT(rbarrel_color_list, list(COLOR_SILVER, num_mags = 5 name = "\improper Black market firearm crate" stuff = list( /obj/item/weapon/gun/pistol/holdout = /obj/item/ammo_magazine/pistol/holdout, + /obj/item/weapon/gun/pistol/action = /obj/item/ammo_magazine/pistol/action, /obj/item/weapon/gun/pistol/highpower = /obj/item/ammo_magazine/pistol/highpower, /obj/item/weapon/gun/pistol/m1911 = /obj/item/ammo_magazine/pistol/m1911, /obj/item/weapon/gun/pistol/heavy = /obj/item/ammo_magazine/pistol/heavy, diff --git a/code/game/objects/structures/crates_lockers/largecrate_supplies.dm b/code/game/objects/structures/crates_lockers/largecrate_supplies.dm index cf51b79613d7..1949b77d6a73 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_supplies.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_supplies.dm @@ -112,7 +112,7 @@ /obj/structure/largecrate/supply/weapons/shotgun name = "\improper M37A2 pump action shotgun weapons chest (x10)" desc = "A weapons chest containing ten M37A2 pump shotguns." - supplies = list(/obj/item/weapon/gun/shotgun/pump = 10) + supplies = list(/obj/item/weapon/gun/shotgun/pump/m37a = 10) /obj/structure/largecrate/supply/weapons/m39 name = "\improper M39 sub machinegun weapons chest (x8)" @@ -127,7 +127,7 @@ /obj/structure/largecrate/supply/weapons/flamers name = "\improper M240A1 incinerator weapons chest (x4)" desc = "A weapons chest containing four M240A1 incinerator units." - supplies = list(/obj/item/weapon/gun/flamer = 4) + supplies = list(/obj/item/weapon/gun/flamer/m240 = 4) /obj/structure/largecrate/supply/weapons/hpr name = "\improper M41AE2 heavy pulse rifle weapons chest (x2)" @@ -267,6 +267,11 @@ desc = "A supply crate containing sixty W-Y brand ration packets." supplies = list(/obj/item/ammo_box/magazine/misc/mre/wy = 5) +/obj/structure/largecrate/supply/supplies/mre/twe + name = "\improper TWE ORP rations crate (x60)" + desc = "A supply crate containing sixty TWE ORP ration packets." + supplies = list(/obj/item/ammo_box/magazine/misc/mre/twe = 5) + /obj/structure/largecrate/supply/supplies/wy_emergency_food name = "\improper WY emergency nutrition briquettes crate (x100)" desc = "A supply crate containing one hundred WY emergency nutrition briquettes." diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index adb45256a919..4a3817baf9b7 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -361,7 +361,7 @@ ICEY GRASS. IT LOOKS LIKE IT'S MADE OF ICE. overlay_type = "tallgrass_overlay_corner" center = FALSE -//ICE COLONY - SOROKYNE// +//ICE COLONY /obj/structure/flora/grass/tallgrass/ice color = COLOR_G_ICE icon_state = "tallgrass" @@ -372,6 +372,17 @@ ICEY GRASS. IT LOOKS LIKE IT'S MADE OF ICE. overlay_type = "tallgrass_overlay_corner" center = FALSE +// SOROKYNE +/obj/structure/flora/grass/tallgrass/jungle_alt + color = COLOR_G_SORO + icon_state = "tallgrass" + desc = "A thick carpet of bristling junglegrass, vibrant and untamed." + +/obj/structure/flora/grass/tallgrass/jungle_alt/corner + icon_state = "tallgrass_corner" + overlay_type = "tallgrass_overlay_corner" + center = FALSE + //LV - JUNGLE MAPS// /obj/structure/flora/grass/tallgrass/jungle @@ -773,3 +784,25 @@ ICEY GRASS. IT LOOKS LIKE IT'S MADE OF ICE. desc = "Looks like some of that fruit might be edible." icon_tag = "plant" variations = 7 + +// Large Jungle Bush - SORO - (Colorable) + +/obj/structure/flora/jungle/thickbush/large_jungle_bush + name = "bush" + desc = "A large jungle bush, it'll take something sharp and a lot of determination to clear away." + icon = 'icons/obj/structures/props/natural/vegetation/colorable_junge_bush.dmi' + icon_state = "bush1" + density = FALSE + layer = ABOVE_XENO_LAYER + fire_flag = FLORA_BURN_NO_SPREAD + health = 100 + +/obj/structure/flora/jungle/thickbush/large_jungle_bush/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/vegetation_hit.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION diff --git a/code/game/objects/structures/hunter_props.dm b/code/game/objects/structures/hunter_props.dm index f0a70829cf90..0a2231cad891 100644 --- a/code/game/objects/structures/hunter_props.dm +++ b/code/game/objects/structures/hunter_props.dm @@ -330,12 +330,12 @@ if(!click_data) return - if(!click_data["icon-x"] || !click_data["icon-y"]) + if(!click_data[ICON_X] || !click_data[ICON_Y]) return // Calculation to apply new pixelshift. - var/mouse_x = text2num(click_data["icon-x"])-1 // Ranging from 0 to 31 - var/mouse_y = text2num(click_data["icon-y"])-1 + var/mouse_x = text2num(click_data[ICON_X])-1 // Ranging from 0 to 31 + var/mouse_y = text2num(click_data[ICON_Y])-1 var/cell_x = clamp(floor(mouse_x/CELLSIZE), 0, CELLS-1) // Ranging from 0 to CELLS-1 var/cell_y = clamp(floor(mouse_y/CELLSIZE), 0, CELLS-1) diff --git a/code/game/objects/structures/hybrisa_props.dm b/code/game/objects/structures/hybrisa_props.dm index cce2d84a5fbd..9a4cf5a35875 100644 --- a/code/game/objects/structures/hybrisa_props.dm +++ b/code/game/objects/structures/hybrisa_props.dm @@ -1331,14 +1331,8 @@ // Misc -/obj/structure/prop/hybrisa/misc/picture - name = "framed picture" - desc = "A golden framed picture of an ominous skeletal figure ordorned in golden garb, fancy for a pile of bones..." - icon = 'icons/obj/structures/props/wall_decorations/decals.dmi' - icon_state = "pictureframe" - /obj/structure/prop/hybrisa/misc/commandosuitemptyprop - name = "Weyland-Yutani 'Ape-Suit' showcase" + name = "Weyland-Yutani 'M5X Apesuit' showcase" desc = "A display model of the Weyland-Yutani 'Apesuit', shame it's only a model..." icon_state = "dogcatchersuitempty1" diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 17aa81da325f..fbe07749f2a5 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -14,6 +14,8 @@ var/is_watching = 0 var/obj/structure/machinery/camera/cam var/busy = FALSE //Ladders are wonderful creatures, only one person can use it at a time + var/static/list/direction_selection = list("up" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_ladder_up"), "down" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_ladder_down")) + /obj/structure/ladder/Initialize(mapload, ...) . = ..() @@ -24,6 +26,12 @@ GLOB.ladder_list += src return INITIALIZE_HINT_LATELOAD +/obj/structure/ladder/get_examine_text(mob/user) + . = ..() + . += SPAN_NOTICE("Drag-click to look up or down [src].") + if(ishuman(user)) + . += SPAN_NOTICE("Click [src] with unprimed grenades/flares to prime and toss it up or down.") + /obj/structure/ladder/LateInitialize() . = ..() @@ -73,17 +81,17 @@ if(busy) to_chat(user, SPAN_WARNING("Someone else is currently using [src].")) return + var/ladder_dir_name var/obj/structure/ladder/ladder_dest if(up && down) - ladder_dir_name = alert("Go up or down the ladder?", "Ladder", "Up", "Down", "Cancel") - if(ladder_dir_name == "Cancel") - return - ladder_dir_name = lowertext(ladder_dir_name) - if(ladder_dir_name == "up") + ladder_dest = lowertext(show_radial_menu(user, src, direction_selection, require_near = TRUE)) + if(ladder_dest == "up") ladder_dest = up - else + ladder_dir_name = ("up") + if(ladder_dest == "down") ladder_dest = down + ladder_dir_name = ("down") else if(up) ladder_dir_name = "up" ladder_dest = up @@ -91,7 +99,10 @@ ladder_dir_name = "down" ladder_dest = down else - return //just in case + return FALSE //just in case + + if(!ladder_dest) + return step(user, get_dir(user, src)) user.visible_message(SPAN_NOTICE("[user] starts climbing [ladder_dir_name] [src]."), @@ -141,44 +152,58 @@ is_watching = 0 user.reset_view(null) +/obj/structure/ladder/proc/handle_move(mob/moved_mob, oldLoc, direct) + SIGNAL_HANDLER + moved_mob.unset_interaction() + UnregisterSignal(moved_mob, COMSIG_MOVABLE_MOVED) + //Peeking up/down -/obj/structure/ladder/MouseDrop(over_object, src_location, over_location) - if((over_object == usr && (in_range(src, usr)))) - if(islarva(usr) || isobserver(usr) || usr.is_mob_incapacitated() || usr.blinded) - to_chat(usr, "You can't do that in your current state.") - return - if(is_watching) - to_chat(usr, "Someone's already looking through [src].") +/obj/structure/ladder/MouseDrop(over_object, src_location, over_location, mob/user) + //Are we capable of looking? + if(usr.is_mob_incapacitated() || get_dist(usr, src) > 1 || usr.blinded || !usr.client) + return + + + if(isliving(usr)) + var/mob/living/living_usr = usr + if(living_usr.body_position == LYING_DOWN) return - if(up && down) - switch( alert("Look up or down the ladder?", "Ladder", "Up", "Down", "Cancel") ) - if("Up") - usr.visible_message(SPAN_NOTICE("[usr] looks up [src]!"), - SPAN_NOTICE("You look up [src]!")) - is_watching = 2 - usr.set_interaction(src) - - if("Down") - usr.visible_message(SPAN_NOTICE("[usr] looks down [src]!"), - SPAN_NOTICE("You look down [src]!")) - is_watching = 1 - usr.set_interaction(src) - - if("Cancel") - return - else if(up) + var/obj/structure/ladder/looking_at + if(up && down) + looking_at = lowertext(show_radial_menu(usr, src, direction_selection, require_near = TRUE)) + if(looking_at == "up") + looking_at = up + is_watching = 2 usr.visible_message(SPAN_NOTICE("[usr] looks up [src]!"), SPAN_NOTICE("You look up [src]!")) - is_watching = 2 + RegisterSignal(usr, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) usr.set_interaction(src) - - - else if(down) - usr.visible_message(SPAN_NOTICE("[usr] looks down [src]!"), - SPAN_NOTICE("You look down [src]!")) + if(looking_at == "down") + looking_at = down is_watching = 1 + usr.visible_message(SPAN_NOTICE("[usr] looks down [src]!"), SPAN_NOTICE("You look down [src]!")) + RegisterSignal(usr, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) usr.set_interaction(src) + else if(up) + looking_at = up + is_watching = 2 + usr.visible_message(SPAN_NOTICE("[usr] looks up [src]!"), + SPAN_NOTICE("You look up [src]!")) + RegisterSignal(usr, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) + usr.set_interaction(src) + else if(down) + looking_at = down + is_watching = 1 + usr.visible_message(SPAN_NOTICE("[usr] looks down [src]!"), + SPAN_NOTICE("You look down [src]!")) + RegisterSignal(usr, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) + usr.set_interaction(src) + else + return FALSE //just in case + + if(!looking_at) + return add_fingerprint(usr) @@ -193,14 +218,13 @@ var/ladder_dir_name var/obj/structure/ladder/ladder_dest if(up && down) - ladder_dir_name = alert("Throw up or down?", "Ladder", "Up", "Down", "Cancel") - if(ladder_dir_name == "Cancel") - return - ladder_dir_name = lowertext(ladder_dir_name) - if(ladder_dir_name == "up") + ladder_dest = lowertext(show_radial_menu(user, src, direction_selection, require_near = TRUE)) + if(ladder_dest == "up") ladder_dest = up - else + ladder_dir_name = ("up") + if(ladder_dest == "down") ladder_dest = down + ladder_dir_name = ("down") else if(up) ladder_dir_name = "up" ladder_dest = up @@ -208,7 +232,10 @@ ladder_dir_name = "down" ladder_dest = down else - return //just in case + return FALSE //just in case + + if(!ladder_dest) + return if(G.antigrief_protection && user.faction == FACTION_MARINE && explosive_antigrief_check(G, user)) to_chat(user, SPAN_WARNING("\The [G.name]'s safe-area accident inhibitor prevents you from priming the grenade!")) @@ -234,14 +261,13 @@ var/ladder_dir_name var/obj/structure/ladder/ladder_dest if(up && down) - ladder_dir_name = alert("Throw up or down?", "Ladder", "Up", "Down", "Cancel") - if(ladder_dir_name == "Cancel") - return - ladder_dir_name = lowertext(ladder_dir_name) - if(ladder_dir_name == "up") + ladder_dest = lowertext(show_radial_menu(user, src, direction_selection, require_near = TRUE)) + if(ladder_dest == "up") ladder_dest = up - else + ladder_dir_name = ("up") + if(ladder_dest == "down") ladder_dest = down + ladder_dir_name = ("down") else if(up) ladder_dir_name = "up" ladder_dest = up @@ -249,7 +275,11 @@ ladder_dir_name = "down" ladder_dest = down else - return //just in case + return FALSE //just in case + + + if(!ladder_dest) + return user.visible_message(SPAN_WARNING("[user] takes position to throw [F] [ladder_dir_name] [src]."), SPAN_WARNING("You take position to throw [F] [ladder_dir_name] [src].")) @@ -260,6 +290,10 @@ F.forceMove(ladder_dest.loc) F.setDir(pick(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) step_away(F,src,rand(1, 5)) + if(istype(W, /obj/item/device/flashlight/flare)) + var/obj/item/device/flashlight/flare/the_flare = W + if(!the_flare.on) + the_flare.turn_on() else return attack_hand(user) diff --git a/code/game/objects/structures/landing_signs.dm b/code/game/objects/structures/landing_signs.dm index 7e97fa83ef5c..4093288800e2 100644 --- a/code/game/objects/structures/landing_signs.dm +++ b/code/game/objects/structures/landing_signs.dm @@ -43,11 +43,11 @@ /obj/structure/lz_sign/sorokyne_sign name = "Sorokyne landing sign" - desc = "A large sign that reads 'Sorokyne - СОРОКІНО - POP. 110' The Company logo is proudly emblazoned in the corner. Don't eat the resin coated snow." + desc = "A large sign that reads 'Sorokyne - СОРОКІНО - POP. 110' The UPP 'Star' logo is proudly emblazoned in the corner." icon_state = "sorokyne_sign_1" /obj/structure/lz_sign/sorokyne_sign/interior - desc = "A large sign that reads 'Sorokyne - СОРОКІНО - POP. 110' The Company logo is proudly emblazoned in the corner. Someone has crudely written 'FUCK OFF' in teal paint across the majority of the sign." + desc = "A large sign that reads 'Sorokyne - СОРОКІНО - POP. 110' The UPP 'Star' is proudly emblazoned in the corner. Someone has crudely written 'FUCK OFF' in teal paint across the majority of the sign." icon_state = "sorokyne_sign_2" /obj/structure/lz_sign/new_varadero diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 820da0772f4e..00824071dd35 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -171,18 +171,22 @@ hardness = 3 /obj/structure/mineral_door/silver + icon_state = "silver" mineralType = "silver" hardness = 3 /obj/structure/mineral_door/gold + icon_state = "gold" mineralType = "gold" /obj/structure/mineral_door/uranium + icon_state = "uranium" mineralType = "uranium" hardness = 3 light_range = 2 /obj/structure/mineral_door/sandstone + icon_state = "sandstone" mineralType = "sandstone" hardness = 0.5 @@ -194,6 +198,7 @@ opacity = FALSE /obj/structure/mineral_door/transparent/phoron + icon_state = "phoron" mineralType = "phoron" /obj/structure/mineral_door/transparent/phoron/attackby(obj/item/W as obj, mob/user as mob) @@ -211,10 +216,12 @@ /obj/structure/mineral_door/transparent/diamond + icon_state = "diamond" mineralType = "diamond" hardness = 10 /obj/structure/mineral_door/wood + icon_state = "wood" mineralType = "wood" hardness = 1 diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index f2667f8d4309..ece04b2878b1 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -1,3 +1,10 @@ +#define PRACTICE_LEVEL_LOW list(XENO_HEALTH_RUNNER, XENO_NO_ARMOR) //runner +#define PRACTICE_LEVEL_MEDIUM_LOW list(XENO_HEALTH_TIER_6, XENO_NO_ARMOR)//drone +#define PRACTICE_LEVEL_MEDIUM list(XENO_HEALTH_TIER_6, XENO_ARMOR_TIER_1) //warrior +#define PRACTICE_LEVEL_HIGH list(XENO_HEALTH_TIER_10, XENO_ARMOR_TIER_3)//crusher +#define PRACTICE_LEVEL_VERY_HIGH list(XENO_HEALTH_QUEEN, XENO_ARMOR_TIER_2)//queen +#define PRACTICE_LEVEL_EXTREMELY_HIGH list(XENO_HEALTH_KING, XENO_ARMOR_FACTOR_TIER_5)//king + /obj/structure/showcase name = "Showcase" icon = 'icons/obj/structures/props/stationobjs.dmi' @@ -71,12 +78,60 @@ /obj/structure/target name = "shooting target" - anchored = FALSE - desc = "A shooting target." - icon = 'icons/obj/objects.dmi' + desc = "A shooting target. Installed on a holographic display mount to help assess the damage done. While being a close replica of real threats a marine would encounter, its not a real target - special firing procedures seen in weapons such as XM88 or Holotarget ammo wont have any effect." + icon = 'icons/obj/structures/props/target_dummies.dmi' icon_state = "target_a" density = FALSE - health = 5000 + health = 10000 + wrenchable = TRUE + anchored = TRUE + ///mode that dictates how difficult the target should be to flatten(kill) + var/list/practice_mode = PRACTICE_LEVEL_LOW + ///health of the target mode + var/practice_health = 230 +/obj/structure/target/Initialize(mapload, ...) + . = ..() + icon_state = pick("target_a", "target_q") + +/obj/structure/target/get_examine_text(mob/user) + . = ..() + . += SPAN_BOLDNOTICE("It seems to have a control panel on it.") + . += SPAN_NOTICE("It appears to be at [floor(max(1, practice_health)/practice_mode[1]*100)]% health.") + if(practice_health <= 0) + . += SPAN_WARNING("[src] is currently rebooting!") + +/obj/structure/target/bullet_act(obj/projectile/bullet) + . = ..() + if(practice_health <= 0 || !anchored) + return + var/damage_dealt = floor(armor_damage_reduction(GLOB.xeno_ranged, bullet.damage, practice_mode[2], bullet.ammo.penetration)) + langchat_speech(damage_dealt, get_mobs_in_view(7, src) , GLOB.all_languages, skip_language_check = TRUE, animation_style = LANGCHAT_FAST_POP, additional_styles = list("langchat_small")) + practice_health -= damage_dealt + animation_flash_color(src, "#FF0000", 1) + playsound(loc, get_sfx("ballistic_hit"), 20, TRUE, 7) + if(practice_health <= 0) + start_practice_health_reset() + +/obj/structure/target/attack_hand(mob/user) + . = ..() + var/list/sorted_options = list("Very light target" = PRACTICE_LEVEL_LOW, "Light target" = PRACTICE_LEVEL_MEDIUM_LOW, "Standard target" = PRACTICE_LEVEL_MEDIUM, "Heavy target" = PRACTICE_LEVEL_HIGH, "Super-heavy target" = PRACTICE_LEVEL_VERY_HIGH, "Impossible" = PRACTICE_LEVEL_EXTREMELY_HIGH) + var/picked_option = tgui_input_list(user, "Select target difficulty.", "Target difficulty", sorted_options, 20 SECONDS) + if(picked_option) + practice_mode = sorted_options[picked_option] + practice_health = practice_mode[1] + user.visible_message(SPAN_NOTICE("[user] adjusted the difficulty of [src]."), SPAN_NOTICE("You adjusted the difficulty of [src] to [lowertext(picked_option)]")) + +/obj/structure/target/proc/start_practice_health_reset() + animate(src, transform = matrix(0, MATRIX_ROTATE), time = 1, easing = EASE_IN) + animate(transform = matrix(270, MATRIX_ROTATE), time = 1, easing = EASE_OUT) + langchat_speech("[src] folds to the ground!", get_mobs_in_view(7, src) , GLOB.all_languages, skip_language_check = TRUE, additional_styles = list("langchat_small")) + playsound(loc, 'sound/machines/chime.ogg', 50, TRUE, 7) + addtimer(CALLBACK(src, PROC_REF(raise_target)), 5 SECONDS) + +/obj/structure/target/proc/raise_target() + animate(src, transform = matrix(0, MATRIX_ROTATE), time = 1, easing = EASE_OUT) + langchat_speech("[src] raises back into position!", get_mobs_in_view(7, src) , GLOB.all_languages, skip_language_check = TRUE, additional_styles = list("langchat_small")) + practice_health = practice_mode[1] /obj/structure/target/syndicate icon_state = "target_s" @@ -299,10 +354,20 @@ /obj/structure/stairs/multiz var/direction + layer = OBJ_LAYER // Cannot be obstructed by weeds + var/list/blockers = list() /obj/structure/stairs/multiz/Initialize(mapload, ...) . = ..() RegisterSignal(loc, COMSIG_TURF_ENTERED, PROC_REF(on_turf_entered)) + for(var/turf/blocked_turf in range(1, src)) + blockers += new /obj/effect/build_blocker(blocked_turf, src) + new /obj/structure/blocker/anti_cade(blocked_turf) + +/obj/structure/stairs/multiz/Destroy() + QDEL_LIST(blockers) + + . = ..() /obj/structure/stairs/multiz/proc/on_turf_entered(turf/source, atom/movable/enterer) if(!istype(enterer, /mob)) @@ -329,7 +394,7 @@ actual_turf = SSmapping.get_turf_above(target_turf) else actual_turf = SSmapping.get_turf_below(target_turf) - + if(actual_turf) if(istype(mover, /mob)) var/mob/mover_mob = mover @@ -527,3 +592,9 @@ #undef DOUBLE_BAND #undef TRIPLE_BAND +#undef PRACTICE_LEVEL_LOW +#undef PRACTICE_LEVEL_MEDIUM_LOW +#undef PRACTICE_LEVEL_MEDIUM +#undef PRACTICE_LEVEL_HIGH +#undef PRACTICE_LEVEL_VERY_HIGH +#undef PRACTICE_LEVEL_EXTREMELY_HIGH diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 8e9a433a9686..c3f3dfa47e18 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -92,27 +92,32 @@ return else if(HAS_TRAIT(W, TRAIT_TOOL_PEN)) var/prior_label_text - var/datum/component/label/labelcomponent = src.GetComponent(/datum/component/label) - if(labelcomponent) + var/datum/component/label/labelcomponent = GetComponent(/datum/component/label) + if(labelcomponent && labelcomponent.has_label()) prior_label_text = labelcomponent.label_name - var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label", prior_label_text)) - if(tmp_label == "" || !tmp_label) - if(labelcomponent) - labelcomponent.remove_label() - user.visible_message(SPAN_NOTICE("[user] removes the label from \the [src]."), - SPAN_NOTICE("You remove the label from \the [src].")) - return - else - return + var/tmp_label = tgui_input_text(user, "Enter a label for [src] (or nothing to remove)", "Label", prior_label_text, MAX_NAME_LEN, ui_state=GLOB.not_incapacitated_state) + if(isnull(tmp_label)) + return // Canceled + if(!tmp_label) + if(prior_label_text) + log_admin("[key_name(usr)] has removed label from [src].") + user.visible_message(SPAN_NOTICE("[user] removes label from [src]."), + SPAN_NOTICE("You remove the label from [src].")) + labelcomponent.clear_label() + return if(length(tmp_label) > MAX_NAME_LEN) to_chat(user, SPAN_WARNING("The label can be at most [MAX_NAME_LEN] characters long.")) - else - user.visible_message(SPAN_NOTICE("[user] labels [src] as \"[tmp_label]\"."), - SPAN_NOTICE("You label [src] as \"[tmp_label]\".")) - AddComponent(/datum/component/label, tmp_label) - playsound(src, "paper_writing", 15, TRUE) - else - . = ..() + return + if(prior_label_text == tmp_label) + to_chat(user, SPAN_WARNING("The label already says \"[tmp_label]\".")) + return + user.visible_message(SPAN_NOTICE("[user] labels [src] as \"[tmp_label]\"."), + SPAN_NOTICE("You label [src] as \"[tmp_label]\".")) + AddComponent(/datum/component/label, tmp_label) + playsound(src, "paper_writing", 15, TRUE) + return + + return ..() /obj/structure/morgue/relaymove(mob/living/user) if(user.is_mob_incapacitated()) diff --git a/code/game/objects/structures/pipes/unary_misc.dm b/code/game/objects/structures/pipes/unary_misc.dm index e137d3916a27..b5e32c956293 100644 --- a/code/game/objects/structures/pipes/unary_misc.dm +++ b/code/game/objects/structures/pipes/unary_misc.dm @@ -105,19 +105,3 @@ /obj/structure/pipes/unary/outlet_injector/hide(invis) update_underlays() - - -/obj/structure/pipes/unary/oxygen_generator - icon = 'icons/obj/pipes/oxygen_generator.dmi' - icon_state = "intact_off" - density = TRUE - name = "Oxygen Generator" - desc = "" - dir = SOUTH - valid_directions = list(SOUTH) - -/obj/structure/pipes/unary/oxygen_generator/update_icon() - if(connected_to) - icon_state = "intact_on" - else - icon_state = "exposed_off" diff --git a/code/game/objects/structures/pipes/vents/pump_scrubber.dm b/code/game/objects/structures/pipes/vents/pump_scrubber.dm index 1d383bf1dddb..28eb14de8422 100644 --- a/code/game/objects/structures/pipes/vents/pump_scrubber.dm +++ b/code/game/objects/structures/pipes/vents/pump_scrubber.dm @@ -21,22 +21,34 @@ name = "Reinforced Air Vent" explodey = FALSE -/// Vents that are linked to ARES Security Protocols, allowing the ARES Interface to trigger security measures. /obj/structure/pipes/vents/pump/no_boom/gas name = "Security Air Vent" - var/datum/ares_link/link var/vent_tag COOLDOWN_DECLARE(vent_trigger_cooldown) + var/network_id /obj/structure/pipes/vents/pump/no_boom/gas/Initialize() - link_systems(override = FALSE) + GLOB.gas_vents += src . = ..() /obj/structure/pipes/vents/pump/no_boom/gas/Destroy() + GLOB.gas_vents -= src + return ..() + +/// Vents that are linked to ARES Security Protocols, allowing the ARES Interface to trigger security measures. +/obj/structure/pipes/vents/pump/no_boom/gas/ares + var/datum/ares_link/link + network_id = MAIN_AI_SYSTEM + +/obj/structure/pipes/vents/pump/no_boom/gas/ares/Initialize() + link_systems(override = FALSE) + . = ..() + +/obj/structure/pipes/vents/pump/no_boom/gas/ares/Destroy() delink() return ..() -/obj/structure/pipes/vents/pump/no_boom/gas/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) +/obj/structure/pipes/vents/pump/no_boom/gas/ares/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) if(link && !override) return FALSE delink() @@ -45,7 +57,7 @@ new_link.linked_vents += src return TRUE -/obj/structure/pipes/vents/pump/no_boom/gas/proc/delink() +/obj/structure/pipes/vents/pump/no_boom/gas/ares/proc/delink() if(link) link.linked_vents -= src link = null diff --git a/code/game/objects/structures/platforms.dm b/code/game/objects/structures/platforms.dm index 25a7a4f7a2fe..4943abf5bb33 100644 --- a/code/game/objects/structures/platforms.dm +++ b/code/game/objects/structures/platforms.dm @@ -232,6 +232,12 @@ /obj/structure/platform/metal/stair_cut/shiva_right icon_state = "shiva_stair_alt" +/obj/structure/platform/metal/stair_cut/almayer_smooth_left + icon_state = "platform_sm_stair" + +/obj/structure/platform/metal/stair_cut/almayer_smooth_right + icon_state = "platform_sm_stair_alt" + //------------------------------// // Stone Stairs Platforms // //------------------------------// @@ -246,6 +252,12 @@ /obj/structure/platform/stone/stair_cut/shiva_right icon_state = "strata_platform_stair_alt" +/obj/structure/platform/stone/stair_cut/soro_left + icon_state = "strata_rock_platform_stair" + +/obj/structure/platform/stone/stair_cut/soro_right + icon_state = "strata_rock_platform_stair_alt" + /obj/structure/platform/stone/stair_cut/kutjevo_left icon_state = "kutjevo_rock_stair" @@ -285,6 +297,17 @@ /obj/structure/platform/metal/almayer/west dir = WEST +/obj/structure/platform/metal/almayer_smooth + icon_state = "platform_sm" + +/obj/structure/platform/metal/almayer_smooth/north + dir = NORTH + +/obj/structure/platform/metal/almayer_smooth/east + dir = EAST + +/obj/structure/platform/metal/almayer_smooth/west + dir = WEST /obj/structure/platform/metal/kutjevo icon_state = "kutjevo_platform" @@ -389,6 +412,19 @@ /obj/structure/platform/stone/strata/west dir = WEST +// Soro Rock + +/obj/structure/platform/stone/soro + name = "rock edge" + desc = "A solid chunk of desolate rocks. Looks like you could climb it." + icon_state = "strata_rock_platform" + +/obj/structure/platform/stone/soro/north + dir = NORTH +/obj/structure/platform/stone/soro/east + dir = EAST +/obj/structure/platform/stone/soro/west + dir = WEST /obj/structure/platform/stone/mineral icon_state = "stone" @@ -446,6 +482,29 @@ /obj/structure/platform_decoration/metal/almayer/southwest dir = SOUTHWEST +/obj/structure/platform_decoration/metal/almayer_smooth + icon_state = "platform_sm_deco" + +/obj/structure/platform_decoration/metal/almayer_smooth/north + dir = NORTH + +/obj/structure/platform_decoration/metal/almayer_smooth/east + dir = EAST + +/obj/structure/platform_decoration/metal/almayer_smooth/west + dir = WEST + +/obj/structure/platform_decoration/metal/almayer_smooth/northeast + dir = NORTHEAST + +/obj/structure/platform_decoration/metal/almayer_smooth/northwest + dir = NORTHWEST + +/obj/structure/platform_decoration/metal/almayer_smooth/southeast + dir = SOUTHEAST + +/obj/structure/platform_decoration/metal/almayer_smooth/southwest + dir = SOUTHWEST /obj/structure/platform_decoration/metal/kutjevo name = "raised metal corner" @@ -542,6 +601,18 @@ /obj/structure/platform_decoration/stone/strata/west dir = WEST +/obj/structure/platform_decoration/stone/soro + name = "rock corner" + desc = "Solid chunks of desolate rocks." + icon_state = "strata_rock_platform_deco" + +/obj/structure/platform_decoration/stone/soro/north + dir = NORTH +/obj/structure/platform_decoration/stone/soro/east + dir = EAST +/obj/structure/platform_decoration/stone/soro/west + dir = WEST + /obj/structure/platform_decoration/stone/mineral icon_state = "stone_deco" diff --git a/code/game/objects/structures/props.dm b/code/game/objects/structures/props.dm index 2a25eb1ccd65..0d39ef72b6b0 100644 --- a/code/game/objects/structures/props.dm +++ b/code/game/objects/structures/props.dm @@ -988,7 +988,6 @@ new_info_tag.fallen_names = list(dogtag_name) new_info_tag.fallen_assgns = list(dogtag_assign) new_info_tag.fallen_blood_types = list(dogtag_blood) - GLOB.fallen_list_cross -= dogtag_name return ..() /obj/structure/prop/wooden_cross/attackby(obj/item/W, mob/living/user) @@ -1000,7 +999,8 @@ dogtag_name = popleft(dog.fallen_names) dogtag_assign = popleft(dog.fallen_assgns) dogtag_blood = popleft(dog.fallen_blood_types) - GLOB.fallen_list_cross += dogtag_name + if(!(dogtag_name in GLOB.fallen_list_cross)) + GLOB.fallen_list_cross += dogtag_name update_icon() if(!length(dog.fallen_names)) qdel(dog) diff --git a/code/game/objects/structures/reagent_dispensers.dm b/code/game/objects/structures/reagent_dispensers.dm index a213f011d7b5..47d1c1f511ab 100644 --- a/code/game/objects/structures/reagent_dispensers.dm +++ b/code/game/objects/structures/reagent_dispensers.dm @@ -130,7 +130,7 @@ if(!reagents || reagents.locked) return ..() - if(mods["alt"]) + if(mods[ALT_CLICK]) dispensing = !dispensing if(dispensing) to_chat(user, SPAN_NOTICE("[src] is now dispensing")) diff --git a/code/game/objects/structures/roof.dm b/code/game/objects/structures/roof.dm index 46981ed550cb..fa6f5fd9c804 100644 --- a/code/game/objects/structures/roof.dm +++ b/code/game/objects/structures/roof.dm @@ -51,6 +51,7 @@ /obj/structure/roof/Destroy(force, ...) if(linked_master) linked_master.remove_roof(src) + linked_master = null; for(var/icon in GLOB.player_list) var/mob/mob = icon mob.client.images -= normal_image @@ -111,7 +112,7 @@ if(connected_nodes) for(var/obj/effect/roof_node/roof_node in connected_nodes) qdel(roof_node) - if(connected_nodes) + if(connected_roof) for(var/obj/structure/roof/roof in connected_roof) qdel(roof) return ..() diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 6e9f8f4c8c8a..aed54406d3ad 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -30,6 +30,9 @@ anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT +/obj/effect/mist/steam + name = "steam" + icon_state = "steam" /obj/structure/machinery/shower/attack_hand(mob/M as mob) on = !on diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 3cbfef00246c..23bcd1bf37e8 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -701,6 +701,49 @@ icon = 'icons/obj/structures/props/furniture/clock.dmi' icon_state = "cat_clock_motion" +//===================// +// Calendar // +//=================// + +/obj/structure/sign/calendar + name = "wall calendar" + desc = "Classic office decoration and a place to stare at maniacally." + icon_state = "calendar_civ" + var/calendar_faction + /obj/structure/sign/catclock/get_examine_text(mob/user) . = ..() . += SPAN_NOTICE("The [src] reads: [worldtime2text()]") + +/obj/structure/sign/calendar/get_examine_text(mob/user) + . = ..() + . += SPAN_INFO("The current date is: [time2text(world.realtime, "DDD, MMM DD")], [GLOB.game_year].") + if(length(GLOB.holidays)) + . += SPAN_INFO("Events:") + for(var/holidayname in GLOB.holidays) + var/datum/holiday/holiday = GLOB.holidays[holidayname] + if(holiday.holiday_faction) + if(holiday.holiday_faction != calendar_faction) + continue + . += SPAN_INFO("[holiday.name]") + . += SPAN_BOLDNOTICE("[holiday.greet_text]") + +/obj/structure/sign/calendar/upp + icon_state = "calendar_upp" + desc = "Classic office decoration with a spot to stare at maniacally. Features a UPP logo, written in Russian." + calendar_faction = FACTION_UPP + +/obj/structure/sign/calendar/wy + icon_state = "calendar_wy" + desc = "Classic office decoration and a place to stare at maniacally, produced by Weyland-Yutani." + calendar_faction = FACTION_WY + +/obj/structure/sign/calendar/twe + icon_state = "calendar_twe" + desc = "Classic office decoration and a place to stare at maniacally, has a pattern resembling a Union Jack on it." + calendar_faction = FACTION_TWE + +/obj/structure/sign/calendar/ua + icon_state = "calendar_ua" + desc = "Classic office decoration and a place to stare at maniacally, has a vertically placed UA flag and some army symbolics." + calendar_faction = FACTION_MARINE diff --git a/code/game/objects/structures/sink.dm b/code/game/objects/structures/sink.dm index c221cb3b185f..ec6f15280277 100644 --- a/code/game/objects/structures/sink.dm +++ b/code/game/objects/structures/sink.dm @@ -106,6 +106,29 @@ SPAN_NOTICE("You wash \a [I] using \the [src].")) +/obj/structure/sink/clicked(mob/user, list/mods) + if(!mods[ALT_CLICK]) + return ..() + + var/obj/item/held_item = user.get_active_hand() + if(!held_item) + user.visible_message(SPAN_NOTICE("[user] runs their hand along \the [src].")) + return TRUE + + // Check if it's a reagent container + var/obj/item/reagent_container/RG = held_item + if(!istype(RG) || !RG.is_open_container()) + return TRUE + + var/remaining_space = RG.volume - RG.reagents.total_volume + if(remaining_space > 0) + RG.reagents.add_reagent("water", remaining_space) + user.visible_message(SPAN_NOTICE("[user] fills \the [RG] completely using \the [src]."), SPAN_NOTICE("You fill \the [RG] completely using \the [src].")) + else + user.visible_message(SPAN_NOTICE("[user] tries to fill \the [RG] but it's already full."), SPAN_NOTICE("The [RG] is already full.")) + + return TRUE + /obj/structure/sink/kitchen name = "kitchen sink" icon_state = "sink_alt" diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index b3564c783682..0750a495476e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -88,6 +88,9 @@ if(buckling_y) buckled_bodybag.pixel_y = buckled_bodybag.buckle_offset + buckling_y add_fingerprint(user) + var/mob/living/carbon/human/contained_mob = locate() in B.contents + if(contained_mob) + SEND_SIGNAL(src, COMSIG_LIVING_BED_BUCKLED, contained_mob) /obj/structure/bed/unbuckle() if(buckled_bodybag) @@ -118,6 +121,7 @@ ..() if(mob.loc == src.loc && buckling_sound && mob.buckled) playsound(src, buckling_sound, 20) + SEND_SIGNAL(src, COMSIG_LIVING_BED_BUCKLED, mob) /obj/structure/bed/Move(NewLoc, direct) . = ..() @@ -211,21 +215,24 @@ accepts_bodybag = TRUE base_bed_icon = "roller" -/obj/structure/bed/roller/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/roller_holder) && !buckled_bodybag) - if(buckled_mob || buckled_bodybag) - manual_unbuckle() - else - visible_message(SPAN_NOTICE("[user] collapses [name].")) - new/obj/item/roller(get_turf(src)) - qdel(src) - return - . = ..() - -/obj/structure/bed/roller/buckle_mob(mob/M, mob/user) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(C.handcuffed) +/obj/structure/bed/roller/MouseDrop(atom/over_object) + if(foldabletype && !buckled_mob && !buckled_bodybag) + var/mob/living/carbon/human/user = over_object + if(!length(contents)) + new foldabletype(src) + var/obj/item/roller/rollerholder = locate(foldabletype) in contents + if (!istype(over_object, /mob/living/carbon/human)) + return + if (user == usr && !user.is_mob_incapacitated() && Adjacent(user) && in_range(src, over_object)) + user.put_in_hands(rollerholder) + user.visible_message(SPAN_INFO("[user] grabs [src] from the floor!"), + SPAN_INFO("You grab [src] from the floor!")) + forceMove(rollerholder) + +/obj/structure/bed/roller/buckle_mob(mob/mob, mob/user) + if(iscarbon(mob)) + var/mob/living/carbon/target_mob = mob + if(target_mob.handcuffed) to_chat(user, SPAN_DANGER("You cannot buckle someone who is handcuffed onto this bed.")) return ..() @@ -259,13 +266,6 @@ buildstacktype = /obj/item/stack/sheet/plasteel can_carry_big = TRUE -/obj/structure/bed/roller/heavy/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/roller_holder) && !buckled_bodybag) - if(buckled_mob || buckled_bodybag) - manual_unbuckle() - return - return ..() - /obj/item/roller name = "roller bed" desc = "A collapsed roller bed that can be carried around." @@ -285,6 +285,18 @@ ..() deploy_roller(user, user.loc) +/// Handles the switch between a item/roller to a structure/bed/roller, and storing one within the other when not in use +/obj/item/roller/proc/deploy_roller(mob/user, atom/location) + if(!length(contents)) + new rollertype(src) + var/obj/structure/bed/roller/roller = locate(rollertype) in contents + roller.forceMove(location) + to_chat(user, SPAN_NOTICE("You deploy [roller].")) + roller.add_fingerprint(user) + user.temp_drop_inv_item(src) + forceMove(roller) + SEND_SIGNAL(user, COMSIG_MOB_ITEM_ROLLER_DEPLOYED, roller) + /obj/item/roller/afterattack(obj/target, mob/user, proximity) if(!proximity) return @@ -293,45 +305,6 @@ if(!T.density) deploy_roller(user, target) -/obj/item/roller/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/roller_holder) && rollertype == /obj/structure/bed/roller) - var/obj/item/roller_holder/RH = W - if(!RH.held) - to_chat(user, SPAN_NOTICE("You pick up [src].")) - forceMove(RH) - RH.held = src - return - . = ..() - -/obj/item/roller/proc/deploy_roller(mob/user, atom/location) - var/obj/structure/bed/roller/R = new rollertype(location) - R.add_fingerprint(user) - user.temp_drop_inv_item(src) - qdel(src) - -/obj/item/roller_holder - name = "roller bed rack" - desc = "A rack for carrying a collapsed roller bed." - icon = 'icons/obj/structures/rollerbed.dmi' - icon_state = "folded" - var/obj/item/roller/held - -/obj/item/roller_holder/Initialize() - . = ..() - held = new /obj/item/roller(src) - -/obj/item/roller_holder/attack_self(mob/user) - ..() - - if(!held) - to_chat(user, SPAN_WARNING("The rack is empty.")) - return - - var/obj/structure/bed/roller/R = new(user.loc) - to_chat(user, SPAN_NOTICE("You deploy [R].")) - R.add_fingerprint(user) - QDEL_NULL(held) - ////////////////////////////////////////////// // PORTABLE SURGICAL BED // ////////////////////////////////////////////// @@ -373,6 +346,8 @@ GLOBAL_LIST_EMPTY(activated_medevac_stretchers) accepts_bodybag = TRUE var/stretcher_activated var/view_range = 5 + /// Allows Medevac beds to act like they're working, but not interact with the Medevac system itself. Set prop variable to TRUE when you'd like to bypass regular functions on a Medevac bed + var/prop var/obj/structure/dropship_equipment/medevac_system/linked_medevac surgery_duration_multiplier = SURGERY_SURFACE_MULT_AWFUL //On the one hand, it's a big stretcher. On the other hand, you have a big sheet covering the patient and those damned Fulton hookups everywhere. var/faction = FACTION_MARINE @@ -381,6 +356,11 @@ GLOBAL_LIST_EMPTY(activated_medevac_stretchers) name = "UPP medevac stretcher" faction = FACTION_UPP +/obj/structure/bed/medevac_stretcher/prop + prop = TRUE + foldabletype = null + stretcher_activated = TRUE + /obj/structure/bed/medevac_stretcher/Destroy() if(stretcher_activated) stretcher_activated = FALSE @@ -428,6 +408,10 @@ GLOBAL_LIST_EMPTY(activated_medevac_stretchers) to_chat(user, SPAN_WARNING("You can't reach the beacon activation button while buckled to [src].")) return + if(prop) + to_chat(user, SPAN_NOTICE("[src]'s beacon is locked in the [stretcher_activated ? "on" : "off"] position.")) + return + if(stretcher_activated) stretcher_activated = FALSE GLOB.activated_medevac_stretchers -= src @@ -485,6 +469,58 @@ GLOBAL_LIST_EMPTY(activated_medevac_stretchers) icon_state = "bedroll" rollertype = /obj/structure/bed/bedroll +/obj/structure/bed/bedroll/comfy + name = "unfolded comfy bedroll" + desc = "A bedroll so comfy, it’s technically illegal in three sectors for causing excessive napping." + icon_state = "bedroll_comfy_o" + foldabletype = /obj/item/roller/bedroll/comfy + +/obj/item/roller/bedroll/comfy + name = "folded comfy bedroll" + desc = "Folded and innocent-looking — but don’t be fooled. It's technically illegal in three sectors for causing excessive napping." + icon_state = "bedroll_comfy" + rollertype = /obj/structure/bed/bedroll/comfy + +/obj/structure/bed/bedroll/comfy/blue + color = "#8cb9e2" + foldabletype = /obj/item/roller/bedroll/comfy/blue + +/obj/item/roller/bedroll/comfy/blue + color = "#8cb9e2" + rollertype = /obj/structure/bed/bedroll/comfy/blue + +/obj/structure/bed/bedroll/comfy/red + color = "#df4f4f" + foldabletype = /obj/item/roller/bedroll/comfy/red + +/obj/item/roller/bedroll/comfy/red + color = "#df4f4f" + rollertype = /obj/structure/bed/bedroll/comfy/red + +/obj/structure/bed/bedroll/comfy/pink + color = "#eaa8b2" + foldabletype = /obj/item/roller/bedroll/comfy/pink + +/obj/item/roller/bedroll/comfy/pink + color = "#eaa8b2" + rollertype = /obj/structure/bed/bedroll/comfy/pink + +/obj/structure/bed/bedroll/comfy/green + color = "#b3e290" + foldabletype = /obj/item/roller/bedroll/comfy/green + +/obj/item/roller/bedroll/comfy/green + color = "#b3e290" + rollertype = /obj/structure/bed/bedroll/comfy/green + +/obj/structure/bed/bedroll/comfy/yellow + color = "#e2df90" + foldabletype = /obj/item/roller/bedroll/comfy/yellow + +/obj/item/roller/bedroll/comfy/yellow + color = "#e2df90" + rollertype = /obj/structure/bed/bedroll/comfy/yellow + //Hospital Rollers (non foldable) /obj/structure/bed/roller/hospital diff --git a/code/game/objects/structures/stool_bed_chair_nest/xeno_nest.dm b/code/game/objects/structures/stool_bed_chair_nest/xeno_nest.dm index 7e440ec728df..ad330a7c4b7c 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/xeno_nest.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/xeno_nest.dm @@ -279,19 +279,26 @@ REMOVE_TRAIT(buckled_mob, TRAIT_NO_STRAY, TRAIT_SOURCE_BUCKLE) var/mob/living/carbon/human/buckled_human = buckled_mob - var/mob/dead/observer/G = ghost_of_buckled_mob - var/datum/mind/M = G?.mind + var/mob/dead/observer/ghost_mob = ghost_of_buckled_mob + var/datum/mind/ghost_mind = ghost_mob?.mind ghost_of_buckled_mob = null . = ..() //Very important that this comes after, since it deletes the nest and clears ghost_of_buckled_mob - if(!istype(buckled_human) || !istype(G) || !istype(M) || buckled_human.undefibbable || buckled_human.mind || M.original != buckled_human || buckled_human.chestburst) + if(!istype(buckled_human) || buckled_human.undefibbable || buckled_human.chestburst) + return + + var/client/user_client = ghost_mob?.client || buckled_human.client + if(user_client?.prefs.toggles_flashing & FLASH_UNNEST) + window_flash(user_client) + + if(!istype(ghost_mob) || !istype(ghost_mind) || buckled_human.mind || ghost_mind.original != buckled_human) return // Zealous checking as most is handled by ghost code - to_chat(G, FONT_SIZE_HUGE(SPAN_DANGER("You have been freed from your nest and may go back to your body! (Look for 'Re-enter Corpse' in Ghost verbs, or click here!)"))) - sound_to(G, 'sound/effects/attackblob.ogg') - if(buckled_human.client?.prefs.toggles_flashing & FLASH_UNNEST) - window_flash(buckled_human.client) - G.can_reenter_corpse = TRUE + + to_chat(ghost_mob, FONT_SIZE_HUGE(SPAN_DANGER("You have been freed from your nest and may go back to your body! (Look for 'Re-enter Corpse' in Ghost verbs, or click here!)"))) + sound_to(ghost_mob, 'sound/effects/attackblob.ogg') + + ghost_mob.can_reenter_corpse = TRUE /obj/structure/bed/nest/ex_act(power) if(power >= EXPLOSION_THRESHOLD_VLOW) diff --git a/code/game/objects/structures/surface.dm b/code/game/objects/structures/surface.dm index 0d86f131ebbd..6ca0a5b466a2 100644 --- a/code/game/objects/structures/surface.dm +++ b/code/game/objects/structures/surface.dm @@ -20,12 +20,12 @@ if(!click_data) return - if(!click_data["icon-x"] || !click_data["icon-y"]) + if(!click_data[ICON_X] || !click_data[ICON_Y]) return // Calculation to apply new pixelshift. - var/mouse_x = text2num(click_data["icon-x"])-1 // Ranging from 0 to 31 - var/mouse_y = text2num(click_data["icon-y"])-1 + var/mouse_x = text2num(click_data[ICON_X])-1 // Ranging from 0 to 31 + var/mouse_y = text2num(click_data[ICON_Y])-1 var/cell_x = clamp(floor(mouse_x/CELLSIZE), 0, CELLS-1) // Ranging from 0 to CELLS-1 var/cell_y = clamp(floor(mouse_y/CELLSIZE), 0, CELLS-1) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index e1f9835efe8e..8222a46bc78f 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -642,7 +642,7 @@ /obj/structure/surface/rack name = "rack" desc = "A bunch of metal shelves stacked on top of eachother. Excellent for storage purposes, less so as cover." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures/tables.dmi' icon_state = "rack" density = TRUE layer = TABLE_LAYER diff --git a/code/game/objects/structures/vulture_spotter.dm b/code/game/objects/structures/vulture_spotter.dm index bd95403b70ed..816174da063d 100644 --- a/code/game/objects/structures/vulture_spotter.dm +++ b/code/game/objects/structures/vulture_spotter.dm @@ -116,7 +116,7 @@ unscope() /obj/structure/vulture_spotter_tripod/clicked(mob/user, list/mods) - if(mods["alt"]) + if(mods[ALT_CLICK]) if(in_range(src, user) && !user.is_mob_incapacitated()) rotate(user) return TRUE diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index eb7ea5cf816e..ab7eca486931 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -157,7 +157,7 @@ else to_chat(user, SPAN_NOTICE("You need a tighter grip.")) - if(cistern && !istype(user,/mob/living/silicon/robot)) //STOP PUTTING YOUR MODULES IN THE TOILET. + if(cistern) if(I.w_class > SIZE_MEDIUM) to_chat(user, SPAN_NOTICE("\The [I] does not fit.")) return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 29cc8d1fc3f6..64c565ca1b28 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -328,7 +328,7 @@ deconstruct(FALSE) /obj/structure/window/clicked(mob/user, list/mods) - if(mods["alt"]) + if(mods[ALT_CLICK]) revrotate(user) return TRUE @@ -1062,6 +1062,66 @@ basestate = "paddedsec_rwindow" window_frame = /obj/structure/window_frame/corsat/security +//UPP windows + +/obj/structure/window/framed/upp_ship + name = "window" + icon = 'icons/turf/walls/upp_windows.dmi' + icon_state = "uppwall_window0" + basestate = "uppwall_window" + desc = "A glass window inside a wall frame." + health = 40 + window_frame = /obj/structure/window_frame/upp_ship + +/obj/structure/window/framed/upp_ship/reinforced + name = "reinforced window" + desc = "A glass window. Light refracts incorrectly when looking through. It looks rather strong. Might take a few good hits to shatter it." + health = 100 + reinf = 1 + window_frame = /obj/structure/window_frame/upp_ship/reinforced + +/obj/structure/window/framed/upp_ship/hull + name = "hull window" + desc = "A glass window with a special rod matrix inside a wall frame. This one was made out of exotic materials to prevent hull breaches. No way to get through here." + // icon_state = "upp_rwindow0" + not_damageable = TRUE + not_deconstructable = TRUE + unslashable = TRUE + unacidable = TRUE + health = 1000000 + window_frame = /obj/structure/window_frame/upp_ship/hull + +//UPP almayer retexture windows + +/obj/structure/window/framed/upp + name = "window" + icon = 'icons/turf/walls/upp_almayer_windows.dmi' + icon_state = "upp_window0" + basestate = "upp_window" + desc = "A glass window inside a wall frame." + health = 40 + window_frame = /obj/structure/window_frame/upp + +/obj/structure/window/framed/upp/reinforced + name = "reinforced window" + icon_state = "upp_rwindow0" + basestate = "upp_rwindow" + desc = "A glass window. Light refracts incorrectly when looking through. It looks rather strong. Might take a few good hits to shatter it." + health = 100 + reinf = 1 + window_frame = /obj/structure/window_frame/upp/reinforced + +/obj/structure/window/framed/upp/hull + name = "hull window" + desc = "A glass window. Something tells you this one is somehow indestructible." + not_damageable = TRUE + not_deconstructable = TRUE + unslashable = TRUE + unacidable = TRUE + health = 1000000 + window_frame = /obj/structure/window_frame/upp/hull +// icon_state = "upp_rwindow0" + // Hybrisa Windows diff --git a/code/game/objects/structures/window_frame.dm b/code/game/objects/structures/window_frame.dm index d0d464fb0bd0..136071d95c78 100644 --- a/code/game/objects/structures/window_frame.dm +++ b/code/game/objects/structures/window_frame.dm @@ -317,6 +317,37 @@ /obj/structure/window_frame/corsat/security window_type = /obj/structure/window/framed/corsat/security +//upp frames + +/obj/structure/window_frame/upp_ship + icon = 'icons/turf/walls/upp_windows.dmi' + icon_state = "uppwall_window0_frame" + basestate = "uppwall_window" + +/obj/structure/window_frame/upp_ship/reinforced + reinforced = TRUE + +/obj/structure/window_frame/upp_ship/hull + unslashable = TRUE + unacidable = TRUE + +//upp almayer retexture frames + +/obj/structure/window_frame/upp + icon = 'icons/turf/walls/upp_almayer_windows.dmi' + icon_state = "upp_window0_frame" + basestate = "upp_window0" + +/obj/structure/window_frame/upp/reinforced + icon_state = "upp_window0_frame" + basestate = "upp_rwindow0" + reinforced = TRUE + +/obj/structure/window_frame/upp/hull + icon_state = "upp_window0_frame" + basestate = "upp_rwindow0" + unslashable = TRUE + unacidable = TRUE // Hybrisa Window Frames diff --git a/code/game/runtimes.dm b/code/game/runtimes.dm index 41c18c221ae7..08660c3fb142 100644 --- a/code/game/runtimes.dm +++ b/code/game/runtimes.dm @@ -1,3 +1,5 @@ +#define MAXIMUM_STACK_DEPTH 10 + /* Custom runtime handling */ @@ -47,6 +49,24 @@ GLOBAL_REAL_VAR(total_runtimes) return runtime_hashes[hash] = 1 + var/depth = 1 + var/list/datum/static_callee/error_callees = list() + + try + for(var/callee/called = caller, called, called = called.caller) + error_callees += clone_callee(called) + depth++ + + if(depth > MAXIMUM_STACK_DEPTH) + break + reverse_range(error_callees) + + SSsentry.envelopes += new /datum/error_envelope( + E.name, + error_callees, + ) + catch + // Single error logging to STUI var/text = "\[[time_stamp()]]RUNTIME: [E.name] - [E.file]@[E.line]" if(GLOB?.STUI?.runtime) @@ -56,3 +76,34 @@ GLOBAL_REAL_VAR(total_runtimes) stui_init_runtimes.Add(text) log_runtime("runtime error: [E.name]\n[E.desc]") + +/datum/static_callee + var/list/_args + var/file + var/line + var/proc + var/_src + var/_usr + var/name + +/datum/static_callee/New(list/_args, file, line, proc, _src, _usr, name) + src._args = _args.Copy() + src.file = file + src.line = line + src.proc = proc + src._src = _src // sigh + src._usr = _usr + src.name = name + +/proc/clone_callee(callee/to_clone) as /datum/static_callee + return new /datum/static_callee( + to_clone.args, + to_clone.file, + to_clone.line, + to_clone.proc, + to_clone.src, + to_clone.usr, + to_clone.name, + ) + +#undef MAXIMUM_STACK_DEPTH diff --git a/code/game/sim_manager/datums/simulator.dm b/code/game/sim_manager/datums/simulator.dm index 98e76c1d9bad..6af35c53da13 100644 --- a/code/game/sim_manager/datums/simulator.dm +++ b/code/game/sim_manager/datums/simulator.dm @@ -105,6 +105,7 @@ var/mob/living/carbon/xenomorph/xeno_dummy = new spawn_path(get_turf(spawn_loc)) xeno_dummy.hardcore = TRUE + xeno_dummy.can_heal = FALSE delete_targets += xeno_dummy addtimer(CALLBACK(src, PROC_REF(sim_turf_garbage_collection)), 30 SECONDS, TIMER_STOPPABLE) diff --git a/code/game/sound.dm b/code/game/sound.dm index af4f798e40e2..ec19f4b171e1 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -416,7 +416,7 @@ if("talk_phone") sound = pick('sound/machines/telephone/talk_phone1.ogg', 'sound/machines/telephone/talk_phone2.ogg', 'sound/machines/telephone/talk_phone3.ogg', 'sound/machines/telephone/talk_phone4.ogg', 'sound/machines/telephone/talk_phone5.ogg', 'sound/machines/telephone/talk_phone6.ogg', 'sound/machines/telephone/talk_phone7.ogg') if("bone_break") - sound = pick('sound/effects/bone_break1.ogg','sound/effects/bone_break2.ogg','sound/effects/bone_break3.ogg','sound/effects/bone_break4.ogg','sound/effects/bone_break5.ogg','sound/effects/bone_break6.ogg','sound/effects/bone_break7.ogg') + sound = pick('sound/effects/bone_break1.ogg','sound/effects/bone_break2.ogg','sound/effects/bone_break3.ogg','sound/effects/bone_break4.ogg','sound/effects/bone_break5.ogg','sound/effects/bone_break6.ogg','sound/effects/bone_break7.ogg','sound/effects/crack1.ogg', 'sound/effects/crack2.ogg', 'sound/effects/crackandbleed.ogg') if("plush") sound = pick('sound/items/plush1.ogg', 'sound/items/plush2.ogg', 'sound/items/plush3.ogg') // working joe @@ -435,8 +435,6 @@ sound = pick('sound/voice/pred_pain_rare1.ogg') if("pred_death") sound = pick('sound/voice/pred_death1.ogg', 'sound/voice/pred_death2.ogg') - if("pred_laugh4") - sound = pick('sound/voice/pred_laugh4.ogg', 'sound/voice/pred_laugh5.ogg') if("clownstep") sound = pick('sound/effects/clownstep1.ogg', 'sound/effects/clownstep2.ogg') if("giant_lizard_growl") @@ -445,6 +443,12 @@ sound = pick('sound/effects/giant_lizard_hiss1.ogg', 'sound/effects/giant_lizard_hiss2.ogg') if("evo_screech") sound = pick('sound/voice/alien_echoroar_1.ogg', 'sound/voice/alien_echoroar_2.ogg', 'sound/voice/alien_echoroar_3.ogg') + if("wy_droid_pain") + sound = pick('sound/voice/wy_droid/wy_droid_pain1.ogg', 'sound/voice/wy_droid/wy_droid_pain2.ogg', 'sound/voice/wy_droid/wy_droid_pain3.ogg', 'sound/voice/wy_droid/wy_droid_pain4.ogg', 'sound/voice/wy_droid/wy_droid_pain5.ogg') + if("wy_droid_death") + sound = pick('sound/voice/wy_droid/wy_droid_death1.ogg', 'sound/voice/wy_droid/wy_droid_death2.ogg', 'sound/voice/wy_droid/wy_droid_death3.ogg', 'sound/voice/wy_droid/wy_droid_death4.ogg', 'sound/voice/wy_droid/wy_droid_death5.ogg', 'sound/voice/wy_droid/wy_droid_death6.ogg', 'sound/voice/wy_droid/wy_droid_death7.ogg') + if("wy_droid_cloaker_death") + sound = pick('sound/voice/wy_droid/wy_stealth_droid_death1.ogg', 'sound/voice/wy_droid/wy_stealth_droid_death2.ogg') return sound /client/proc/generate_sound_queues() diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 9836d4827eaa..8b3d0cc30295 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -28,6 +28,8 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) /area/supply/station/upp name = "Supply Shuttle UPP" + + /area/supply/dock name = "Supply Shuttle" icon_state = "shuttle3" @@ -1418,6 +1420,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) post_signal("supply_vehicle") var/dat = "" + var/turf/upper_turf = get_turf(SSshuttle.getDock("almayer vehicle")) if(!SSshuttle.vehicle_elevator) return @@ -1426,7 +1429,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) if (SSshuttle.vehicle_elevator.mode != SHUTTLE_IDLE) dat += "Moving" else - if(is_mainship_level(SSshuttle.vehicle_elevator.z)) + if(SSshuttle.vehicle_elevator.z == upper_turf.z) dat += "Raised" if(!spent) dat += "
    \[Lower\]" @@ -1451,12 +1454,19 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) /obj/structure/machinery/computer/supply/asrs/vehicle/Topic(href, href_list) . = ..() + + var/turf/upper_turf = get_turf(SSshuttle.getDock("almayer vehicle")) + var/turf/lower_turf = get_turf(SSshuttle.getDock("adminlevel vehicle")) + if(.) return + if(!is_mainship_level(z)) return + if(spent) return + if(!linked_supply_controller) world.log << "## ERROR: Eek. The linked_supply_controller controller datum is missing somehow." return @@ -1469,10 +1479,10 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) usr.set_interaction(src) if(href_list["get_vehicle"]) - if(is_mainship_level(SSshuttle.vehicle_elevator.z) || SSshuttle.vehicle_elevator.mode != SHUTTLE_IDLE) + if((SSshuttle.vehicle_elevator.z == upper_turf.z) || SSshuttle.vehicle_elevator.mode != SHUTTLE_IDLE) to_chat(usr, SPAN_WARNING("The elevator needs to be in the cargo bay dock to call a vehicle up!")) return - // dunno why the +1 is needed but the vehicles spawn off-center + var/turf/middle_turf = get_turf(SSshuttle.vehicle_elevator) var/obj/vehicle/multitile/ordered_vehicle @@ -1483,6 +1493,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) if(VO?.has_vehicle_lock()) return + spent = TRUE ordered_vehicle = new VO.ordered_vehicle(middle_turf) SSshuttle.vehicle_elevator.request(SSshuttle.getDock("almayer vehicle")) @@ -1495,6 +1506,10 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) if(!is_mainship_level(SSshuttle.vehicle_elevator.z)) return + if(SSshuttle.vehicle_elevator.z == lower_turf.z) + to_chat(usr, SPAN_WARNING("The elevator is already lowered!")) + return + SSshuttle.vehicle_elevator.request(SSshuttle.getDock("adminlevel vehicle")) add_fingerprint(usr) diff --git a/code/game/supplyshuttle_upp.dm b/code/game/supplyshuttle_upp.dm index 863473ed4d69..bfee10975100 100644 --- a/code/game/supplyshuttle_upp.dm +++ b/code/game/supplyshuttle_upp.dm @@ -21,6 +21,16 @@ GLOBAL_DATUM_INIT(supply_controller_upp, /datum/controller/supply/upp, new()) /obj/item/paper/manifest/upp name = "UPP Supply Manifest" +/obj/structure/machinery/computer/supply/asrs/upp/attack_hand(mob/user as mob) //does not return when on non alamyer z level + if(!allowed(user)) + to_chat(user, SPAN_DANGER("Access Denied.")) + return + + if(..()) + return + + tgui_interact(user) + /obj/item/paper/manifest/upp/generate_contents() info = " \ - - - - - - - - - - - - - -
    - - -
    - - - A fatal exception has occurred at 002B:C562F1B7 in TGUI. - The current application will be terminated. - Send the copy of the following stack trace to an authorized - Weyland-Yutani incident handler at https://github.com/cmss13-devs/cmss13/issues. - Thank you for your cooperation. - -
    - -
    - - - - - + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + + A fatal exception has occurred at 002B:C562F1B7 in TGUI. The current + application will be terminated. Send the copy of the following stack + trace to an authorized Weyland-Yutani incident handler at + https://github.com/cmss13-devs/cmss13/issues. Thank you for your + cooperation. + +
    + +
    + + + + + diff --git a/tgui/rspack.config-dev.cjs b/tgui/rspack.config-dev.cjs new file mode 100644 index 000000000000..0f7e0b1d49da --- /dev/null +++ b/tgui/rspack.config-dev.cjs @@ -0,0 +1,127 @@ +const { defineConfig } = require('@rspack/cli'); +const { rspack } = require('@rspack/core'); + +const createStats = (verbose) => ({ + assets: verbose, + builtAt: verbose, + cached: false, + children: false, + chunks: false, + colors: true, + entrypoints: true, + hash: false, + modules: false, + performance: false, + timings: verbose, + version: verbose, +}); + +/** + * 04/25/2025 + * There is a bug in rspack, possibly only ours, with the experimental css + * feature that throws an error in tgui-dev. This prevents hot reloading from + * working properly and there doesn't seem to be any way to fix it. + * + * This config exists to switch to the old css loader during development. + * + * `TypeError: Cannot read properties of null (reading 'removeChild')` + */ +module.exports = (env = {}, argv) => { + /** @type {import('@rspack/core').Configuration} */ + const config = defineConfig({ + cache: false, + experiments: undefined, + mode: 'development', + module: { + rules: [ + { + test: /\.([tj]s(x)?|cjs)$/, + use: [ + { + loader: 'builtin:swc-loader', + options: { + isModule: 'unknown', + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + runtime: 'automatic', + }, + }, + }, + }, + }, + ], + type: 'javascript/auto', + }, + { + test: /\.(s)?css$/, + use: [ + { + loader: rspack.CssExtractRspackPlugin.loader, + }, + { + loader: require.resolve('css-loader'), + }, + { + loader: require.resolve('sass-loader'), + options: { + api: 'modern-compiler', + implementation: 'sass-embedded', + }, + }, + ], + type: 'javascript/auto', + }, + { + test: /\.(png|jpg)$/, + oneOf: [ + { + issuer: /\.(s)?css$/, + type: 'asset/inline', + }, + { + type: 'asset/resource', + }, + ], + }, + { + test: /\.svg$/, + oneOf: [ + { + issuer: /\.(s)?css$/, + type: 'asset/inline', + }, + { + type: 'asset/resource', + }, + ], + }, + ], + }, + plugins: [ + new rspack.EnvironmentPlugin({ + NODE_ENV: 'development', + WEBPACK_HMR_ENABLED: env.WEBPACK_HMR_ENABLED || argv.hot || false, + DEV_SERVER_IP: env.DEV_SERVER_IP || null, + }), + new rspack.CssExtractRspackPlugin({ + filename: '[name].bundle.css', + chunkFilename: '[name].bundle.css', + }), + ], + }); + config.devtool = 'cheap-module-source-map'; + config.devServer = { + progress: false, + quiet: false, + noInfo: false, + clientLogLevel: 'silent', + stats: createStats(false), + }; + + return config; +}; diff --git a/tgui/webpack.config.js b/tgui/rspack.config.cjs similarity index 53% rename from tgui/webpack.config.js rename to tgui/rspack.config.cjs index a738f6b1732d..2dfa2639d96e 100644 --- a/tgui/webpack.config.js +++ b/tgui/rspack.config.cjs @@ -4,9 +4,9 @@ * @license MIT */ -const webpack = require('webpack'); const path = require('path'); -const ExtractCssPlugin = require('mini-css-extract-plugin'); +const { defineConfig } = require('@rspack/cli'); +const { rspack } = require('@rspack/core'); const createStats = (verbose) => ({ assets: verbose, @@ -26,14 +26,27 @@ const createStats = (verbose) => ({ module.exports = (env = {}, argv) => { const mode = argv.mode || 'production'; const bench = env.TGUI_BENCH; - const config = { + + /** @type {import('@rspack/core').Configuration} */ + const config = defineConfig({ + cache: true, + experiments: { + cache: { + type: 'persistent', + storage: { + type: 'filesystem', + directory: path.resolve(__dirname, '.yarn/rspack'), + }, + }, + css: true, + }, mode: mode === 'production' ? 'production' : 'development', context: path.resolve(__dirname), - target: ['web', 'es5', 'browserslist:ie 11'], + target: ['web', 'browserslist:edge >= 123'], entry: { - tgui: ['./packages/tgui-polyfill', './packages/tgui'], - 'tgui-panel': ['./packages/tgui-polyfill', './packages/tgui-panel'], - 'tgui-say': ['./packages/tgui-polyfill', './packages/tgui-say'], + tgui: ['./packages/tgui'], + 'tgui-panel': ['./packages/tgui-panel'], + 'tgui-say': ['./packages/tgui-say'], }, output: { path: argv.useTmpFolder @@ -43,10 +56,20 @@ module.exports = (env = {}, argv) => { chunkFilename: '[name].bundle.js', chunkLoadTimeout: 15000, publicPath: '/', + assetModuleFilename: '[name][ext]', }, resolve: { + pnp: true, extensions: ['.tsx', '.ts', '.js', '.jsx'], - alias: {}, + alias: { + tgui: path.resolve(__dirname, './packages/tgui'), + 'tgui-panel': path.resolve(__dirname, './packages/tgui-panel'), + 'tgui-say': path.resolve(__dirname, './packages/tgui-say'), + 'tgui-dev-server': path.resolve( + __dirname, + './packages/tgui-dev-server', + ), + }, }, module: { rules: [ @@ -54,38 +77,58 @@ module.exports = (env = {}, argv) => { test: /\.([tj]s(x)?|cjs)$/, use: [ { - loader: require.resolve('swc-loader'), + loader: 'builtin:swc-loader', + options: { + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + runtime: 'automatic', + }, + }, + }, + }, }, ], + type: 'javascript/auto', }, { - test: /\.scss$/, + test: /\.(s)?css$/, use: [ { - loader: ExtractCssPlugin.loader, + loader: require.resolve('sass-loader'), options: { - esModule: false, + api: 'modern-compiler', + implementation: 'sass-embedded', }, }, + ], + type: 'css', + }, + { + test: /\.(png|jpg)$/, + oneOf: [ { - loader: require.resolve('css-loader'), - options: { - esModule: false, - }, + issuer: /\.(s)?css$/, + type: 'asset/inline', }, { - loader: require.resolve('sass-loader'), + type: 'asset/resource', }, ], }, { - test: /\.(png|jpg|svg)$/, - use: [ + test: /\.svg$/, + oneOf: [ { - loader: require.resolve('url-loader'), - options: { - esModule: false, - }, + issuer: /\.(s)?css$/, + type: 'asset/inline', + }, + { + type: 'asset/resource', }, ], }, @@ -98,47 +141,23 @@ module.exports = (env = {}, argv) => { hints: false, }, devtool: false, - cache: { - type: 'filesystem', - cacheLocation: path.resolve(__dirname, `.yarn/webpack/${mode}`), - buildDependencies: { - config: [__filename], - }, - }, + stats: createStats(true), plugins: [ - new webpack.EnvironmentPlugin({ + new rspack.EnvironmentPlugin({ NODE_ENV: env.NODE_ENV || mode, WEBPACK_HMR_ENABLED: env.WEBPACK_HMR_ENABLED || argv.hot || false, DEV_SERVER_IP: env.DEV_SERVER_IP || null, }), - new ExtractCssPlugin({ - filename: '[name].bundle.css', - chunkFilename: '[name].bundle.css', - }), ], - }; + }); if (bench) { config.entry = { - 'tgui-bench': [ - './packages/tgui-polyfill', - './packages/tgui-bench/entrypoint', - ], + 'tgui-bench': ['./packages/tgui-bench/entrypoint'], }; } - // Production build specific options - if (mode === 'production') { - const { EsbuildPlugin } = require('esbuild-loader'); - config.optimization.minimizer = [ - new EsbuildPlugin({ - target: 'ie11', - css: true, - }), - ]; - } - // Development build specific options if (mode !== 'production') { config.devtool = 'cheap-module-source-map'; diff --git a/tgui/tsconfig.json b/tgui/tsconfig.json index 9241d7bc9cbb..3f2a867a4239 100644 --- a/tgui/tsconfig.json +++ b/tgui/tsconfig.json @@ -5,25 +5,17 @@ "checkJs": false, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "isolatedModules": false, + "isolatedModules": true, "jsx": "preserve", - "lib": [ - "DOM", - "DOM.Iterable", - "ESNext", - "ScriptHost" - ], + "lib": ["DOM", "DOM.Iterable", "ESNext", "ScriptHost"], "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "Bundler", "noEmit": true, "resolveJsonModule": true, "skipLibCheck": true, "strict": false, "strictNullChecks": true, - "target": "ES5" + "target": "ESNext" }, - "include": [ - "./*.d.ts", - "./packages" - ] + "include": ["./*.d.ts", "./packages", "vitest.config.mts"] } diff --git a/tgui/vitest.config.mts b/tgui/vitest.config.mts new file mode 100644 index 000000000000..bd750f7ff0bc --- /dev/null +++ b/tgui/vitest.config.mts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: [ + 'packages/**/__tests__/*.{ts,tsx}', + 'packages/**/*.{spec,test}.{ts,tsx}', + ], + exclude: ['packages/tgui-bench/**/*'], + environment: 'jsdom', + restoreMocks: true, + }, +}); diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 25b310d0db20..22ec790ee8ce 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -5,600 +5,269 @@ __metadata: version: 8 cacheKey: 10c0 -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: 10c0/53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f - languageName: node - linkType: hard - -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": - version: 7.24.2 - resolution: "@babel/code-frame@npm:7.24.2" - dependencies: - "@babel/highlight": "npm:^7.24.2" - picocolors: "npm:^1.0.0" - checksum: 10c0/d1d4cba89475ab6aab7a88242e1fd73b15ecb9f30c109b69752956434d10a26a52cbd37727c4eca104b6d45227bd1dfce39a6a6f4a14c9b2f07f871e968cf406 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.23.5": - version: 7.24.1 - resolution: "@babel/compat-data@npm:7.24.1" - checksum: 10c0/8a1935450345c326b14ea632174696566ef9b353bd0d6fb682456c0774342eeee7654877ced410f24a731d386fdcbf980b75083fc764964d6f816b65792af2f5 - languageName: node - linkType: hard - -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": - version: 7.24.3 - resolution: "@babel/core@npm:7.24.3" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.24.1" - "@babel/parser": "npm:^7.24.1" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/e6e756b6de27d0312514a005688fa1915c521ad4269a388913eff2120a546538078f8488d6d16e86f851872f263cb45a6bbae08738297afb9382600d2ac342a9 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.7.2": - version: 7.24.1 - resolution: "@babel/generator@npm:7.24.1" - dependencies: - "@babel/types": "npm:^7.24.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/f0eea7497657cdf68cfb4b7d181588e1498eefd1f303d73b0d8ca9b21a6db27136a6f5beb8f988b6bdcd4249870826080950450fd310951de42ecf36df274881 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" - dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" - dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.23.0" - checksum: 10c0/d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.24.3 - resolution: "@babel/helper-module-imports@npm:7.24.3" - dependencies: - "@babel/types": "npm:^7.24.0" - checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/211e1399d0c4993671e8e5c2b25383f08bee40004ace5404ed4065f0e9258cc85d99c1b82fd456c030ce5cfd4d8f310355b54ef35de9924eabfc3dff1331d946 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.24.0 - resolution: "@babel/helper-plugin-utils@npm:7.24.0" - checksum: 10c0/90f41bd1b4dfe7226b1d33a4bb745844c5c63e400f9e4e8bf9103a7ceddd7d425d65333b564d9daba3cebd105985764d51b4bd4c95822b97c2e3ac1201a8a5da - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.24.1 - resolution: "@babel/helper-string-parser@npm:7.24.1" - checksum: 10c0/2f9bfcf8d2f9f083785df0501dbab92770111ece2f90d120352fda6dd2a7d47db11b807d111e6f32aa1ba6d763fe2dc6603d153068d672a5d0ad33ca802632b2 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 10c0/dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helpers@npm:7.24.1" - dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/b3445860ae749fc664682b291f092285e949114e8336784ae29f88eb4c176279b01cc6740005a017a0389ae4b4e928d5bbbc01de7da7e400c972e3d6f792063a - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.24.2": - version: 7.24.2 - resolution: "@babel/highlight@npm:7.24.2" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.20" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/98ce00321daedeed33a4ed9362dc089a70375ff1b3b91228b9f05e6591d387a81a8cba68886e207861b8871efa0bc997ceabdd9c90f6cce3ee1b2f7f941b42db - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/parser@npm:7.24.1" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/d2a8b99aa5f33182b69d5569367403a40e7c027ae3b03a1f81fd8ac9b06ceb85b31f6ee4267fb90726dc2ac99909c6bdaa9cf16c379efab73d8dfe85cee32c50 - languageName: node - linkType: hard - -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 - languageName: node - linkType: hard - -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.8.3": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.12.13" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-meta@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.24.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/6cec76fbfe6ca81c9345c2904d8d9a8a0df222f9269f0962ed6eb2eb8f3f10c2f15e993d1ef09dbaf97726bf1792b5851cf5bd9a769f966a19448df6be95d19a - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" +"@asamuzakjp/css-color@npm:^3.1.1": + version: 3.1.1 + resolution: "@asamuzakjp/css-color@npm:3.1.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + "@csstools/css-calc": "npm:^2.1.2" + "@csstools/css-color-parser": "npm:^3.0.8" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + lru-cache: "npm:^10.4.3" + checksum: 10c0/4abb010fd29de8acae8571eba738468c22cb45a1f77647df3c59a80f1c83d83d728cae3ebbf99e5c73f2517761abaaffbe5e4176fc46b5f9bf60f1478463b51e languageName: node linkType: hard -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 +"@bufbuild/protobuf@npm:^2.0.0": + version: 2.2.5 + resolution: "@bufbuild/protobuf@npm:2.2.5" + checksum: 10c0/bd4f7b0e76c47ec656204cfe3f9a9413c4027cf36c1c9be23dccb8c880ad8e9da610133376848b2011904e8d89fdda5e7f4870b51a1417d037bdc0fbe4e74cf5 languageName: node linkType: hard -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af +"@csstools/color-helpers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/color-helpers@npm:5.0.2" + checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b languageName: node linkType: hard -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" +"@csstools/css-calc@npm:^2.1.2": + version: 2.1.2 + resolution: "@csstools/css-calc@npm:2.1.2" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/34ced30553968ef5d5f9e00e3b90b48c47480cf130e282e99d57ec9b09f803aab8bc06325683e72a1518b5e7180a3da8b533f1b462062757c21989a53b482e1a languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.8.3": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" +"@csstools/css-color-parser@npm:^3.0.8": + version: 3.0.8 + resolution: "@csstools/css-color-parser@npm:3.0.8" dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" + "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/css-calc": "npm:^2.1.2" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/90722c5a62ca94e9d578ddf59be604a76400b932bd3d4bd23cb1ae9b7ace8fcf83c06995d2b31f96f4afef24a7cefba79beb11ed7ee4999d7ecfec3869368359 languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.24.1 - resolution: "@babel/plugin-syntax-typescript@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" +"@csstools/css-parser-algorithms@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-parser-algorithms@npm:3.0.4" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/7a81e277dcfe3138847e8e5944e02a42ff3c2e864aea6f33fd9b70d1556d12b0e70f0d56cc1985d353c91bcbf8fe163e6cc17418da21129b7f7f1d8b9ac00c93 - languageName: node - linkType: hard - -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0, @babel/template@npm:^7.3.3": - version: 7.24.0 - resolution: "@babel/template@npm:7.24.0" - dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.24.0" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/traverse@npm:7.24.1" - dependencies: - "@babel/code-frame": "npm:^7.24.1" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/c087b918f6823776537ba246136c70e7ce0719fc05361ebcbfd16f4e6f2f6f1f8f4f9167f1d9b675f27d12074839605189cc9d689de20b89a85e7c140f23daab - languageName: node - linkType: hard - -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": - version: 7.24.0 - resolution: "@babel/types@npm:7.24.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.23.4" - "@babel/helper-validator-identifier": "npm:^7.22.20" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/777a0bb5dbe038ca4c905fdafb1cdb6bdd10fe9d63ce13eca0bd91909363cbad554a53dc1f902004b78c1dcbc742056f877f2c99eeedff647333b1fadf51235d + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/d411f07765e14eede17bccc6bd4f90ff303694df09aabfede3fd104b2dfacfd4fe3697cd25ddad14684c850328f3f9420ebfa9f78380892492974db24ae47dbd languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 +"@csstools/css-tokenizer@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/css-tokenizer@npm:3.0.3" + checksum: 10c0/c31bf410e1244b942e71798e37c54639d040cb59e0121b21712b40015fced2b0fb1ffe588434c5f8923c9cd0017cfc1c1c8f3921abc94c96edf471aac2eba5e5 languageName: node linkType: hard -"@discoveryjs/json-ext@npm:0.5.7, @discoveryjs/json-ext@npm:^0.5.0": +"@discoveryjs/json-ext@npm:0.5.7, @discoveryjs/json-ext@npm:^0.5.7": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/aix-ppc64@npm:0.20.2" +"@esbuild/aix-ppc64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/aix-ppc64@npm:0.25.2" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm64@npm:0.20.2" +"@esbuild/android-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/android-arm64@npm:0.25.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm@npm:0.20.2" +"@esbuild/android-arm@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/android-arm@npm:0.25.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-x64@npm:0.20.2" +"@esbuild/android-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/android-x64@npm:0.25.2" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-arm64@npm:0.20.2" +"@esbuild/darwin-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/darwin-arm64@npm:0.25.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-x64@npm:0.20.2" +"@esbuild/darwin-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/darwin-x64@npm:0.25.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-arm64@npm:0.20.2" +"@esbuild/freebsd-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/freebsd-arm64@npm:0.25.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-x64@npm:0.20.2" +"@esbuild/freebsd-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/freebsd-x64@npm:0.25.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm64@npm:0.20.2" +"@esbuild/linux-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-arm64@npm:0.25.2" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm@npm:0.20.2" +"@esbuild/linux-arm@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-arm@npm:0.25.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ia32@npm:0.20.2" +"@esbuild/linux-ia32@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-ia32@npm:0.25.2" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-loong64@npm:0.20.2" +"@esbuild/linux-loong64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-loong64@npm:0.25.2" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-mips64el@npm:0.20.2" +"@esbuild/linux-mips64el@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-mips64el@npm:0.25.2" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ppc64@npm:0.20.2" +"@esbuild/linux-ppc64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-ppc64@npm:0.25.2" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-riscv64@npm:0.20.2" +"@esbuild/linux-riscv64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-riscv64@npm:0.25.2" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-s390x@npm:0.20.2" +"@esbuild/linux-s390x@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-s390x@npm:0.25.2" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-x64@npm:0.20.2" +"@esbuild/linux-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-x64@npm:0.25.2" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/netbsd-x64@npm:0.20.2" +"@esbuild/netbsd-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/netbsd-arm64@npm:0.25.2" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/netbsd-x64@npm:0.25.2" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/openbsd-x64@npm:0.20.2" +"@esbuild/openbsd-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/openbsd-arm64@npm:0.25.2" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/openbsd-x64@npm:0.25.2" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/sunos-x64@npm:0.20.2" +"@esbuild/sunos-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/sunos-x64@npm:0.25.2" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-arm64@npm:0.20.2" +"@esbuild/win32-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/win32-arm64@npm:0.25.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-ia32@npm:0.20.2" +"@esbuild/win32-ia32@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/win32-ia32@npm:0.25.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-x64@npm:0.20.2" +"@esbuild/win32-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/win32-x64@npm:0.25.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" + version: 4.6.0 + resolution: "@eslint-community/eslint-utils@npm:4.6.0" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + checksum: 10c0/a64131c1b43021e3a84267f6011fd678a936718097c9be169c37a40ada2c7016bec7d6685ecc88112737d57733f36837bb90d9425ad48d2e2aa351d999d32443 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 languageName: node linkType: hard @@ -619,60 +288,97 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 10c0/9a518bb8625ba3350613903a6d8c622352ab0c6557a59fe6ff6178bf882bf57123f9d92aa826ee8ac3ee74b9c6203fe630e9ee00efb03d753962dcf65ee4bd94 +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 languageName: node linkType: hard -"@fastify/accept-negotiator@npm:^1.0.0": - version: 1.1.0 - resolution: "@fastify/accept-negotiator@npm:1.1.0" - checksum: 10c0/1cb9a298c992b812869158ddc6093557a877b30e5f77618a7afea985a0667c50bc7113593bf0f7f9dc9b82b94c16e8ab127a0afc3efde6677fd645539f6d08e5 +"@fastify/accept-negotiator@npm:^2.0.0": + version: 2.0.1 + resolution: "@fastify/accept-negotiator@npm:2.0.1" + checksum: 10c0/b68386f8b3b69c73f79a54983bd86afc752c4373897ec1ad798356a325a69224ebd003c1aa47e11fc40b46f23bf2384ebb3907fe44214af806cc8ff6af913f18 languageName: node linkType: hard -"@fastify/ajv-compiler@npm:^1.0.0": - version: 1.1.0 - resolution: "@fastify/ajv-compiler@npm:1.1.0" +"@fastify/ajv-compiler@npm:^4.0.0": + version: 4.0.2 + resolution: "@fastify/ajv-compiler@npm:4.0.2" dependencies: - ajv: "npm:^6.12.6" - checksum: 10c0/e8c4c468f74db2d5d14ce3e765e8317e302413960f63474e6ef18039b1d711e2712e87808035f3e075b9fdf8f47af1b481979eb1ca8d82e0773ff6a9fd49d903 + ajv: "npm:^8.12.0" + ajv-formats: "npm:^3.0.1" + fast-uri: "npm:^3.0.0" + checksum: 10c0/ca048db219cc958fb1b962f5dfc141f29e067ecb28a8dbe782bbef80ae3c920021468009cad613f0ed68db410890bb09c773ba2f33cb13e055b48c9c338bd8fa languageName: node linkType: hard -"@fastify/error@npm:^2.0.0": - version: 2.0.0 - resolution: "@fastify/error@npm:2.0.0" - checksum: 10c0/32b98cb663e462e3d60a31a46306481f7b84657cfdd301dcd7fa9f77389f180e51c641dc4c6900d423daa264e70172bf23493fae031b6af4844b6cc7f17fe77d +"@fastify/error@npm:^4.0.0": + version: 4.1.0 + resolution: "@fastify/error@npm:4.1.0" + checksum: 10c0/11215eb80ec0bd0a6333d8e939461123269cdbb2eb9ec853faee50f2b8284cbd7a826e654665ff37c120bdfc4a6e0f2f17f33f84f2255291a234b012dd129d53 languageName: node linkType: hard -"@fastify/send@npm:^2.0.0": - version: 2.1.0 - resolution: "@fastify/send@npm:2.1.0" +"@fastify/fast-json-stringify-compiler@npm:^5.0.0": + version: 5.0.3 + resolution: "@fastify/fast-json-stringify-compiler@npm:5.0.3" dependencies: - "@lukeed/ms": "npm:^2.0.1" + fast-json-stringify: "npm:^6.0.0" + checksum: 10c0/1f0e33c973fc228de44d997a8a1a43e883a580a8c971773bb9cb2375b0114694f81b47c52ac7e788eb6372d1f3dfc10be3176bad354a80d502d8b26a93dbc6c9 + languageName: node + linkType: hard + +"@fastify/forwarded@npm:^3.0.0": + version: 3.0.0 + resolution: "@fastify/forwarded@npm:3.0.0" + checksum: 10c0/bd139ee46c193ed9e04af2539f31fcb9e542b91917820f6cf401d5715c4c8bcccaae4a148e0ca14eeddee077ad8a3ab73e6f0f1ad769aff861fcef5f0a28e0d2 + languageName: node + linkType: hard + +"@fastify/merge-json-schemas@npm:^0.2.0": + version: 0.2.1 + resolution: "@fastify/merge-json-schemas@npm:0.2.1" + dependencies: + dequal: "npm:^2.0.3" + checksum: 10c0/dfa884a8f62d53f71de273fdcd0e501b213367767a7d8c522ae87ba6fb571b3eea85175d6e019036d7c0c5419be60305abe54899b9459f76ed5333358699efcb + languageName: node + linkType: hard + +"@fastify/proxy-addr@npm:^5.0.0": + version: 5.0.0 + resolution: "@fastify/proxy-addr@npm:5.0.0" + dependencies: + "@fastify/forwarded": "npm:^3.0.0" + ipaddr.js: "npm:^2.1.0" + checksum: 10c0/5a7d667480c3699015aa9bc12a47b6044106f412725d91a1b90f4a7845390c710486f05d322a895c633fb32a5ba1a17e598cb72e727337862034034443d59bcd + languageName: node + linkType: hard + +"@fastify/send@npm:^3.2.0": + version: 3.3.1 + resolution: "@fastify/send@npm:3.3.1" + dependencies: + "@lukeed/ms": "npm:^2.0.2" escape-html: "npm:~1.0.3" fast-decode-uri-component: "npm:^1.0.1" - http-errors: "npm:2.0.0" - mime: "npm:^3.0.0" - checksum: 10c0/0e1c10022660fa1f1959b7c414d1be2c47ab42be1da8e21cd72a4df3104c516fdf7b590ee67f897037dd4c85b716fac63929e894d7699623549646604f6db14b + http-errors: "npm:^2.0.0" + mime: "npm:^3" + checksum: 10c0/bd7b9538217ad9e7ec702b9bbad2c3b985370023b03159cfec884184c5b2035ca69b56dc951530727166f85c52e46b76043639e1b320c0803778091342f2174f languageName: node linkType: hard -"@fastify/static@npm:^6.12.0": - version: 6.12.0 - resolution: "@fastify/static@npm:6.12.0" +"@fastify/static@npm:^8.1.1": + version: 8.1.1 + resolution: "@fastify/static@npm:8.1.1" dependencies: - "@fastify/accept-negotiator": "npm:^1.0.0" - "@fastify/send": "npm:^2.0.0" - content-disposition: "npm:^0.5.3" - fastify-plugin: "npm:^4.0.0" - glob: "npm:^8.0.1" - p-limit: "npm:^3.1.0" - checksum: 10c0/9248c9851c4bb24965e88eb2f0825fda2b2b08ddb83aa5f08e529b8a522cf20978f81e8e4837e2cb550b39ea433790b0fd82db4b2f0673133325e265c9099fff + "@fastify/accept-negotiator": "npm:^2.0.0" + "@fastify/send": "npm:^3.2.0" + content-disposition: "npm:^0.5.4" + fastify-plugin: "npm:^5.0.0" + fastq: "npm:^1.17.1" + glob: "npm:^11.0.0" + checksum: 10c0/ff6c1f508db308b323813b5bdddab898b0d0b92b481e1ffcc34ae43143e20a6d7c0645043a03c5c7663005277e2a9519f21adb3cf5f73d962379b0d0fb075e3b languageName: node linkType: hard @@ -683,14 +389,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" + "@humanwhocodes/object-schema": "npm:^2.0.3" debug: "npm:^4.3.1" minimatch: "npm:^3.0.5" - checksum: 10c0/66f725b4ee5fdd8322c737cb5013e19fac72d4d69c8bf4b7feb192fcb83442b035b92186f8e9497c220e58b2d51a080f28a73f7899bc1ab288c3be172c467541 + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e languageName: node linkType: hard @@ -701,7 +407,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": +"@humanwhocodes/object-schema@npm:^2.0.3": version: 2.0.3 resolution: "@humanwhocodes/object-schema@npm:2.0.3" checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c @@ -722,321 +428,165 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/load-nyc-config@npm:^1.0.0": - version: 1.1.0 - resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" dependencies: - camelcase: "npm:^5.3.1" - find-up: "npm:^4.1.0" - get-package-type: "npm:^0.1.0" - js-yaml: "npm:^3.13.1" - resolve-from: "npm:^5.0.0" - checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 languageName: node linkType: hard -"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": - version: 0.1.3 - resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a languageName: node linkType: hard -"@jest/console@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/console@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - slash: "npm:^3.0.0" - checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e languageName: node linkType: hard -"@jest/core@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/core@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/reporters": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-changed-files: "npm:^29.7.0" - jest-config: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-resolve-dependencies: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-ansi: "npm:^6.0.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 languageName: node linkType: hard -"@jest/create-cache-key-function@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/create-cache-key-function@npm:29.7.0" +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" dependencies: - "@jest/types": "npm:^29.6.3" - checksum: 10c0/5c47ef62205264adf77b1ff26b969ce9fe84920b8275c3c5e83f4236859d6ae5e4e7027af99eef04a8e334c4e424d44af3e167972083406070aca733ac2a2795 + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 languageName: node linkType: hard -"@jest/environment@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/environment@npm:29.7.0" - dependencies: - "@jest/fake-timers": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - jest-mock: "npm:^29.7.0" - checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 languageName: node linkType: hard -"@jest/expect-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect-utils@npm:29.7.0" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: - jest-get-type: "npm:^29.6.3" - checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 languageName: node linkType: hard -"@jest/expect@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect@npm:29.7.0" - dependencies: - expect: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e - languageName: node - linkType: hard - -"@jest/fake-timers@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/fake-timers@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@sinonjs/fake-timers": "npm:^10.0.2" - "@types/node": "npm:*" - jest-message-util: "npm:^29.7.0" - jest-mock: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c - languageName: node - linkType: hard - -"@jest/globals@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/globals@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - jest-mock: "npm:^29.7.0" - checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea +"@jsonjoy.com/base64@npm:^1.1.1": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 10c0/88717945f66dc89bf58ce75624c99fe6a5c9a0c8614e26d03e406447b28abff80c69fb37dabe5aafef1862cf315071ae66e5c85f6018b437d95f8d13d235e6eb languageName: node linkType: hard -"@jest/reporters@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/reporters@npm:29.7.0" +"@jsonjoy.com/json-pack@npm:^1.0.3": + version: 1.2.0 + resolution: "@jsonjoy.com/json-pack@npm:1.2.0" dependencies: - "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - collect-v8-coverage: "npm:^1.0.0" - exit: "npm:^0.1.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^6.0.0" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" - istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - slash: "npm:^3.0.0" - string-length: "npm:^4.0.1" - strip-ansi: "npm:^6.0.0" - v8-to-istanbul: "npm:^9.0.1" + "@jsonjoy.com/base64": "npm:^1.1.1" + "@jsonjoy.com/util": "npm:^1.1.2" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^1.20.0" peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 + tslib: 2 + checksum: 10c0/0744cfe2f54d896003ad240f0f069b41a152feb53b6134c5e65961126b9e5fdfc74a46f63b1dfa280e80a3d176c57e06de072bf03d749ec1982e41677a1ce5d5 languageName: node linkType: hard -"@jest/schemas@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/schemas@npm:29.6.3" - dependencies: - "@sinclair/typebox": "npm:^0.27.8" - checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be +"@jsonjoy.com/util@npm:^1.1.2, @jsonjoy.com/util@npm:^1.3.0": + version: 1.5.0 + resolution: "@jsonjoy.com/util@npm:1.5.0" + peerDependencies: + tslib: 2 + checksum: 10c0/0065ae12c4108d8aede01a479c8d2b5a39bce99e9a449d235befc753f57e8385d9c1115720529f26597840b7398d512898155423d9859fd638319fb0c827365d languageName: node linkType: hard -"@jest/source-map@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/source-map@npm:29.6.3" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.18" - callsites: "npm:^3.0.0" - graceful-fs: "npm:^4.2.9" - checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 +"@leichtgewicht/ip-codec@npm:^2.0.1": + version: 2.0.5 + resolution: "@leichtgewicht/ip-codec@npm:2.0.5" + checksum: 10c0/14a0112bd59615eef9e3446fea018045720cd3da85a98f801a685a818b0d96ef2a1f7227e8d271def546b2e2a0fe91ef915ba9dc912ab7967d2317b1a051d66b languageName: node linkType: hard -"@jest/test-result@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-result@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - collect-v8-coverage: "npm:^1.0.0" - checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 +"@lukeed/ms@npm:^2.0.2": + version: 2.0.2 + resolution: "@lukeed/ms@npm:2.0.2" + checksum: 10c0/843b922717313bcde4943f478145d8bc13115b9b91d83bbaed53739b5644122984412310aed574792f4e6b492f2cbda178175f601856d310f67e14834c3f17a0 languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-sequencer@npm:29.7.0" - dependencies: - "@jest/test-result": "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - slash: "npm:^3.0.0" - checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b +"@module-federation/error-codes@npm:0.13.0": + version: 0.13.0 + resolution: "@module-federation/error-codes@npm:0.13.0" + checksum: 10c0/a8aec3037dbc2b093266a5861d1ac8fb6b766d2d4167cb9bbd31165cbd26c89ee34d39536c6c39ae37198ae51761867e585fc530f63ea66b16841ad281975857 languageName: node linkType: hard -"@jest/transform@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/transform@npm:29.7.0" +"@module-federation/runtime-core@npm:0.13.0": + version: 0.13.0 + resolution: "@module-federation/runtime-core@npm:0.13.0" dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" - babel-plugin-istanbul: "npm:^6.1.1" - chalk: "npm:^4.0.0" - convert-source-map: "npm:^2.0.0" - fast-json-stable-stringify: "npm:^2.1.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pirates: "npm:^4.0.4" - slash: "npm:^3.0.0" - write-file-atomic: "npm:^4.0.2" - checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6 - languageName: node - linkType: hard - -"@jest/types@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/types@npm:29.6.3" - dependencies: - "@jest/schemas": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - "@types/istanbul-reports": "npm:^3.0.0" - "@types/node": "npm:*" - "@types/yargs": "npm:^17.0.8" - chalk: "npm:^4.0.0" - checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 + "@module-federation/error-codes": "npm:0.13.0" + "@module-federation/sdk": "npm:0.13.0" + checksum: 10c0/36aeeb616115213d5be731c81c42f8982a8d0bd1a523b4a46804f2eb6e215f25c071764c85a9435a7680d86ae047149cc52d8bd6def79a48184b6397679dc4ad languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" +"@module-federation/runtime-tools@npm:0.13.0": + version: 0.13.0 + resolution: "@module-federation/runtime-tools@npm:0.13.0" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + "@module-federation/runtime": "npm:0.13.0" + "@module-federation/webpack-bundler-runtime": "npm:0.13.0" + checksum: 10c0/bcd17af41e70be71fa481dc2432e55e6ed92b1c55431ea73f40bb31027e603777de1e85e6eea1af11606834201c78f43b31c18f9045c2b5cd6bb29eb4d23b696 languageName: node linkType: hard -"@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" +"@module-federation/runtime@npm:0.13.0": + version: 0.13.0 + resolution: "@module-federation/runtime@npm:0.13.0" dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 + "@module-federation/error-codes": "npm:0.13.0" + "@module-federation/runtime-core": "npm:0.13.0" + "@module-federation/sdk": "npm:0.13.0" + checksum: 10c0/d7690ecc498c81638b23c75d512051edb0de4d3a004e0c6915d0fe9497a1f3d204856f15fbf91be3044e0d5752dfdf332d611cc32ae9c84a89815be17e4b3440 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 +"@module-federation/sdk@npm:0.13.0": + version: 0.13.0 + resolution: "@module-federation/sdk@npm:0.13.0" + checksum: 10c0/45c05b28caf8fdbd052d43e63b5df85f71fea83dfa7b6631cdbad6dc60a53de2cc145a8ecc9770db9701f115f2d1de9bce58fe23f41eb6c3da5f81c23dc1eefb languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@module-federation/webpack-bundler-runtime@npm:0.13.0": + version: 0.13.0 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.13.0" dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 - languageName: node - linkType: hard - -"@lukeed/ms@npm:^2.0.1": - version: 2.0.2 - resolution: "@lukeed/ms@npm:2.0.2" - checksum: 10c0/843b922717313bcde4943f478145d8bc13115b9b91d83bbaed53739b5644122984412310aed574792f4e6b492f2cbda178175f601856d310f67e14834c3f17a0 + "@module-federation/runtime": "npm:0.13.0" + "@module-federation/sdk": "npm:0.13.0" + checksum: 10c0/db08e586930f307c5258bc4233f4dfe95981d9518dcd546d57adc0bb97ada991e1f1696e6a3dfa372db37df08dfe6d1c603aa6d13615b6a46867f2e7638243e7 languageName: node linkType: hard @@ -1067,16 +617,16 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" dependencies: agent-base: "npm:^7.1.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.1" lru-cache: "npm:^10.0.1" socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 languageName: node linkType: hard @@ -1090,12 +640,12 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 languageName: node linkType: hard @@ -1109,724 +659,946 @@ __metadata: languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@polka/url@npm:^1.0.0-next.24": - version: 1.0.0-next.25 - resolution: "@polka/url@npm:1.0.0-next.25" - checksum: 10c0/ef61f0a0fe94bb6e1143fc5b9d5a12e6ca9dbd2c57843ebf81db432c21b9f1005c09e8a1ef8b6d5ddfa42146ca65b640feb2d353bd0d3546da46ba59e48a5349 - languageName: node - linkType: hard - -"@popperjs/core@npm:^2.11.8": - version: 2.11.8 - resolution: "@popperjs/core@npm:2.11.8" - checksum: 10c0/4681e682abc006d25eb380d0cf3efc7557043f53b6aea7a5057d0d1e7df849a00e281cd8ea79c902a35a414d7919621fc2ba293ecec05f413598e0b23d5a1e63 - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e +"@parcel/watcher-android-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-android-arm64@npm:2.5.1" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@sinonjs/commons@npm:^3.0.0": - version: 3.0.1 - resolution: "@sinonjs/commons@npm:3.0.1" - dependencies: - type-detect: "npm:4.0.8" - checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 +"@parcel/watcher-darwin-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.1" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^10.0.2": - version: 10.3.0 - resolution: "@sinonjs/fake-timers@npm:10.3.0" - dependencies: - "@sinonjs/commons": "npm:^3.0.0" - checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 +"@parcel/watcher-darwin-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.1" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-darwin-arm64@npm:1.4.11" - conditions: os=darwin & cpu=arm64 +"@parcel/watcher-freebsd-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.1" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-darwin-x64@npm:1.4.11" - conditions: os=darwin & cpu=x64 +"@parcel/watcher-linux-arm-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.1" + conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.11" - conditions: os=linux & cpu=arm +"@parcel/watcher-linux-arm-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.1" + conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-linux-arm64-gnu@npm:1.4.11" +"@parcel/watcher-linux-arm64-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-linux-arm64-musl@npm:1.4.11" +"@parcel/watcher-linux-arm64-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-linux-x64-gnu@npm:1.4.11" +"@parcel/watcher-linux-x64-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-linux-x64-musl@npm:1.4.11" +"@parcel/watcher-linux-x64-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-win32-arm64-msvc@npm:1.4.11" +"@parcel/watcher-win32-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-win32-ia32-msvc@npm:1.4.11" +"@parcel/watcher-win32-ia32@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.4.11": - version: 1.4.11 - resolution: "@swc/core-win32-x64-msvc@npm:1.4.11" +"@parcel/watcher-win32-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-x64@npm:2.5.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.4.11": - version: 1.4.11 - resolution: "@swc/core@npm:1.4.11" - dependencies: - "@swc/core-darwin-arm64": "npm:1.4.11" - "@swc/core-darwin-x64": "npm:1.4.11" - "@swc/core-linux-arm-gnueabihf": "npm:1.4.11" - "@swc/core-linux-arm64-gnu": "npm:1.4.11" - "@swc/core-linux-arm64-musl": "npm:1.4.11" - "@swc/core-linux-x64-gnu": "npm:1.4.11" - "@swc/core-linux-x64-musl": "npm:1.4.11" - "@swc/core-win32-arm64-msvc": "npm:1.4.11" - "@swc/core-win32-ia32-msvc": "npm:1.4.11" - "@swc/core-win32-x64-msvc": "npm:1.4.11" - "@swc/counter": "npm:^0.1.2" - "@swc/types": "npm:^0.1.5" - peerDependencies: - "@swc/helpers": ^0.5.0 +"@parcel/watcher@npm:^2.4.1": + version: 2.5.1 + resolution: "@parcel/watcher@npm:2.5.1" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.1" + "@parcel/watcher-darwin-arm64": "npm:2.5.1" + "@parcel/watcher-darwin-x64": "npm:2.5.1" + "@parcel/watcher-freebsd-x64": "npm:2.5.1" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.1" + "@parcel/watcher-linux-arm-musl": "npm:2.5.1" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.1" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.1" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.1" + "@parcel/watcher-linux-x64-musl": "npm:2.5.1" + "@parcel/watcher-win32-arm64": "npm:2.5.1" + "@parcel/watcher-win32-ia32": "npm:2.5.1" + "@parcel/watcher-win32-x64": "npm:2.5.1" + detect-libc: "npm:^1.0.3" + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" dependenciesMeta: - "@swc/core-darwin-arm64": + "@parcel/watcher-android-arm64": optional: true - "@swc/core-darwin-x64": + "@parcel/watcher-darwin-arm64": optional: true - "@swc/core-linux-arm-gnueabihf": + "@parcel/watcher-darwin-x64": optional: true - "@swc/core-linux-arm64-gnu": + "@parcel/watcher-freebsd-x64": optional: true - "@swc/core-linux-arm64-musl": + "@parcel/watcher-linux-arm-glibc": optional: true - "@swc/core-linux-x64-gnu": + "@parcel/watcher-linux-arm-musl": optional: true - "@swc/core-linux-x64-musl": + "@parcel/watcher-linux-arm64-glibc": optional: true - "@swc/core-win32-arm64-msvc": + "@parcel/watcher-linux-arm64-musl": optional: true - "@swc/core-win32-ia32-msvc": + "@parcel/watcher-linux-x64-glibc": optional: true - "@swc/core-win32-x64-msvc": + "@parcel/watcher-linux-x64-musl": optional: true - peerDependenciesMeta: - "@swc/helpers": + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": optional: true - checksum: 10c0/7860541ba95fc15e6abe1993eb87fdfe05aad3418862b3f790f26cf1de1284e387300020ac60a8487404fd4364af2cc7f9e8a3c4dba49a8683c5d08cd4cb95c4 + checksum: 10c0/8f35073d0c0b34a63d4c8d2213482f0ebc6a25de7b2cdd415d19cb929964a793cb285b68d1d50bfb732b070b3c82a2fdb4eb9c250eab709a1cd9d63345455a82 languageName: node linkType: hard -"@swc/counter@npm:^0.1.2, @swc/counter@npm:^0.1.3": - version: 0.1.3 - resolution: "@swc/counter@npm:0.1.3" - checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd languageName: node linkType: hard -"@swc/jest@npm:^0.2.36": - version: 0.2.36 - resolution: "@swc/jest@npm:0.2.36" - dependencies: - "@jest/create-cache-key-function": "npm:^29.7.0" - "@swc/counter": "npm:^0.1.3" - jsonc-parser: "npm:^3.2.0" - peerDependencies: - "@swc/core": "*" - checksum: 10c0/7f1993f9201420bb499c92ab28797352bcbf9e3a6c7b5a1806fdc34c9c3b46ea9e5b2f070c0e13fcf7f3c3fadbbc38777840baabb178f589bf1f67543763adb6 +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.29 + resolution: "@polka/url@npm:1.0.0-next.29" + checksum: 10c0/0d58e081844095cb029d3c19a659bfefd09d5d51a2f791bc61eba7ea826f13d6ee204a8a448c2f5a855c17df07b37517373ff916dd05801063c0568ae9937684 languageName: node linkType: hard -"@swc/types@npm:^0.1.5": - version: 0.1.6 - resolution: "@swc/types@npm:0.1.6" - dependencies: - "@swc/counter": "npm:^0.1.3" - checksum: 10c0/043a0e56d69db8733827ad69db55d0ffbd6976fd24ef629a488e57040067ac84d057a57e08bc5a3db545d44b01d6aa43c22df1152c637af450d366e57cde6e22 +"@popperjs/core@npm:^2.11.8": + version: 2.11.8 + resolution: "@popperjs/core@npm:2.11.8" + checksum: 10c0/4681e682abc006d25eb380d0cf3efc7557043f53b6aea7a5057d0d1e7df849a00e281cd8ea79c902a35a414d7919621fc2ba293ecec05f413598e0b23d5a1e63 languageName: node linkType: hard -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: 10c0/073bfa548026b1ebaf1659eb8961e526be22fa77139b10d60e712f46d2f0f05f4e6c8bec62a087d41088ee9e29faa7f54838568e475ab2f776171003c3920858 +"@rollup/rollup-android-arm-eabi@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.0" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@types/babel__core@npm:^7.1.14": - version: 7.20.5 - resolution: "@types/babel__core@npm:7.20.5" - dependencies: - "@babel/parser": "npm:^7.20.7" - "@babel/types": "npm:^7.20.7" - "@types/babel__generator": "npm:*" - "@types/babel__template": "npm:*" - "@types/babel__traverse": "npm:*" - checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff +"@rollup/rollup-android-arm64@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-android-arm64@npm:4.40.0" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@types/babel__generator@npm:*": - version: 7.6.8 - resolution: "@types/babel__generator@npm:7.6.8" - dependencies: - "@babel/types": "npm:^7.0.0" - checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 +"@rollup/rollup-darwin-arm64@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.40.0" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@types/babel__template@npm:*": - version: 7.4.4 - resolution: "@types/babel__template@npm:7.4.4" - dependencies: - "@babel/parser": "npm:^7.1.0" - "@babel/types": "npm:^7.0.0" - checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b +"@rollup/rollup-darwin-x64@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.40.0" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.5 - resolution: "@types/babel__traverse@npm:7.20.5" - dependencies: - "@babel/types": "npm:^7.20.7" - checksum: 10c0/033abcb2f4c084ad33e30c3efaad82161240f351e3c71b6154ed289946b33b363696c0fbd42502b68e4582a87413c418321f40eb1ea863e34fe525641345e05b +"@rollup/rollup-freebsd-arm64@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.40.0" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@types/eslint-scope@npm:^3.7.3": - version: 3.7.7 - resolution: "@types/eslint-scope@npm:3.7.7" - dependencies: - "@types/eslint": "npm:*" - "@types/estree": "npm:*" - checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc +"@rollup/rollup-freebsd-x64@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.40.0" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@types/eslint@npm:*": - version: 8.56.7 - resolution: "@types/eslint@npm:8.56.7" - dependencies: - "@types/estree": "npm:*" - "@types/json-schema": "npm:*" - checksum: 10c0/159bb5ae2f78d905b9263240c75d07b60c26e1bcaecee8c775a7bb0cf7362f5dcdd286259ba6289ab62f989b87048090b2420619f7170a0abbd83cb68b5e0699 +"@rollup/rollup-linux-arm-gnueabihf@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.40.0" + conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d +"@rollup/rollup-linux-arm-musleabihf@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.40.0" + conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@types/graceful-fs@npm:^4.1.3": - version: 4.1.9 - resolution: "@types/graceful-fs@npm:4.1.9" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b +"@rollup/rollup-linux-arm64-gnu@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.40.0" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.6 - resolution: "@types/istanbul-lib-coverage@npm:2.0.6" - checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 +"@rollup/rollup-linux-arm64-musl@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.40.0" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@types/istanbul-lib-report@npm:*": - version: 3.0.3 - resolution: "@types/istanbul-lib-report@npm:3.0.3" - dependencies: - "@types/istanbul-lib-coverage": "npm:*" - checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c +"@rollup/rollup-linux-loongarch64-gnu@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.40.0" + conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.4 - resolution: "@types/istanbul-reports@npm:3.0.4" - dependencies: - "@types/istanbul-lib-report": "npm:*" - checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.0" + conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@types/jest@npm:^29.5.12": - version: 29.5.12 - resolution: "@types/jest@npm:29.5.12" - dependencies: - expect: "npm:^29.0.0" - pretty-format: "npm:^29.0.0" - checksum: 10c0/25fc8e4c611fa6c4421e631432e9f0a6865a8cb07c9815ec9ac90d630271cad773b2ee5fe08066f7b95bebd18bb967f8ce05d018ee9ab0430f9dfd1d84665b6f +"@rollup/rollup-linux-riscv64-gnu@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.40.0" + conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@types/jsdom@npm:^20.0.0": - version: 20.0.1 - resolution: "@types/jsdom@npm:20.0.1" - dependencies: - "@types/node": "npm:*" - "@types/tough-cookie": "npm:*" - parse5: "npm:^7.0.0" - checksum: 10c0/3d4b2a3eab145674ee6da482607c5e48977869109f0f62560bf91ae1a792c9e847ac7c6aaf243ed2e97333cb3c51aef314ffa54a19ef174b8f9592dfcb836b25 +"@rollup/rollup-linux-riscv64-musl@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.40.0" + conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db +"@rollup/rollup-linux-s390x-gnu@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.40.0" + conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@types/marked@npm:4.3.2": - version: 4.3.2 - resolution: "@types/marked@npm:4.3.2" - checksum: 10c0/6f44d28da5c940a719d6c6aca41e33f49c5fe957f7972939cc1cbb47d045951f4d969f382d655345d0463e47db1994635d2862018716fcef2fa85ceeceb116e7 +"@rollup/rollup-linux-x64-gnu@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.40.0" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^20.12.3": - version: 20.12.3 - resolution: "@types/node@npm:20.12.3" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/45c8485a0e55276b42c26ba1df6c480e4e1a3a3abbf4ea0ff6b4e2823c4f77e32b7e166d4263d464f207cfea5bd4de8879b8df2c7132a727b0346a30191d6bea +"@rollup/rollup-linux-x64-musl@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.40.0" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@types/prop-types@npm:*": - version: 15.7.12 - resolution: "@types/prop-types@npm:15.7.12" - checksum: 10c0/1babcc7db6a1177779f8fde0ccc78d64d459906e6ef69a4ed4dd6339c920c2e05b074ee5a92120fe4e9d9f1a01c952f843ebd550bee2332fc2ef81d1706878f8 +"@rollup/rollup-win32-arm64-msvc@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.40.0" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@types/react-dom@npm:^18.2.24": - version: 18.2.24 - resolution: "@types/react-dom@npm:18.2.24" - dependencies: - "@types/react": "npm:*" - checksum: 10c0/9ec38e5ab4727c56ef17bd8e938ead88748ba19db314b8d9807714a5cae430f5b799514667b221b4f2dc8d9b4ca17dd1c3da8c41c083c2de9eddcc31bec6b8ff +"@rollup/rollup-win32-ia32-msvc@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.40.0" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^18.2.74": - version: 18.2.74 - resolution: "@types/react@npm:18.2.74" - dependencies: - "@types/prop-types": "npm:*" - csstype: "npm:^3.0.2" - checksum: 10c0/347e38b4c5dc20d50ff71bf04b7caaef490e5ff695e74a0088a13fbb2a0c5d125a5ecfd142adfa30f0176da0e2734942c91ba61d95ce269c43b3265bd7379361 +"@rollup/rollup-win32-x64-msvc@npm:4.40.0": + version: 4.40.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.40.0" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@types/semver@npm:^7.5.0": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa +"@rspack/binding-darwin-arm64@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-darwin-arm64@npm:1.3.8" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@types/stack-utils@npm:^2.0.0": - version: 2.0.3 - resolution: "@types/stack-utils@npm:2.0.3" - checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c +"@rspack/binding-darwin-x64@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-darwin-x64@npm:1.3.8" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@types/tough-cookie@npm:*": - version: 4.0.5 - resolution: "@types/tough-cookie@npm:4.0.5" - checksum: 10c0/68c6921721a3dcb40451543db2174a145ef915bc8bcbe7ad4e59194a0238e776e782b896c7a59f4b93ac6acefca9161fccb31d1ce3b3445cb6faa467297fb473 +"@rspack/binding-linux-arm64-gnu@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.3.8" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@types/webpack-env@npm:^1.18.4": - version: 1.18.4 - resolution: "@types/webpack-env@npm:1.18.4" - checksum: 10c0/3fa77dbff0ed71685404576b0a1cf74587567fe2ee1cfd11d56d6eefcab7a61e4c9ead0eced264e289d2cf0fc74296dbd55ed6c95774fe0fd6264d156c5a59f0 +"@rspack/binding-linux-arm64-musl@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.3.8" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@types/wicg-file-system-access@npm:^2023.10.5": - version: 2023.10.5 - resolution: "@types/wicg-file-system-access@npm:2023.10.5" - checksum: 10c0/3c6099320a2517ab405bd65712eb19ba2c1f7f0c30f952744102b76809ed9ad5205f881c79ebe6f92ac7af7a13667df8c23dd59b0a5182119c74afa17335bfd3 +"@rspack/binding-linux-x64-gnu@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.3.8" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@types/yargs-parser@npm:*": - version: 21.0.3 - resolution: "@types/yargs-parser@npm:21.0.3" - checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 +"@rspack/binding-linux-x64-musl@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-linux-x64-musl@npm:1.3.8" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@types/yargs@npm:^17.0.8": - version: 17.0.32 - resolution: "@types/yargs@npm:17.0.32" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10c0/2095e8aad8a4e66b86147415364266b8d607a3b95b4239623423efd7e29df93ba81bb862784a6e08664f645cc1981b25fd598f532019174cd3e5e1e689e1cccf +"@rspack/binding-win32-arm64-msvc@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.3.8" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/parser@npm:7.5.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:7.5.0" - "@typescript-eslint/types": "npm:7.5.0" - "@typescript-eslint/typescript-estree": "npm:7.5.0" - "@typescript-eslint/visitor-keys": "npm:7.5.0" - debug: "npm:^4.3.4" - peerDependencies: - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/65521202ff024e79594272fbb7e4731ecf9d2fdd2f58fc81450bfd2bca94ce9c17b0eadd7338c01701f5cf16d38b6c025ed3fc322380b1e4b5424b7484098cda +"@rspack/binding-win32-ia32-msvc@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.3.8" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rspack/binding-win32-x64-msvc@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.3.8" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/scope-manager@npm:7.5.0" +"@rspack/binding@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding@npm:1.3.8" dependencies: - "@typescript-eslint/types": "npm:7.5.0" - "@typescript-eslint/visitor-keys": "npm:7.5.0" - checksum: 10c0/a017b151a6b39ef591f8e2e65598e005e1b4b2d5494e4b91bddb5856b3a4d57dd8a58d2bc7a140e627eb574f93a2c8fe55f1307aa264c928ffd31d9e190bc5dd + "@rspack/binding-darwin-arm64": "npm:1.3.8" + "@rspack/binding-darwin-x64": "npm:1.3.8" + "@rspack/binding-linux-arm64-gnu": "npm:1.3.8" + "@rspack/binding-linux-arm64-musl": "npm:1.3.8" + "@rspack/binding-linux-x64-gnu": "npm:1.3.8" + "@rspack/binding-linux-x64-musl": "npm:1.3.8" + "@rspack/binding-win32-arm64-msvc": "npm:1.3.8" + "@rspack/binding-win32-ia32-msvc": "npm:1.3.8" + "@rspack/binding-win32-x64-msvc": "npm:1.3.8" + dependenciesMeta: + "@rspack/binding-darwin-arm64": + optional: true + "@rspack/binding-darwin-x64": + optional: true + "@rspack/binding-linux-arm64-gnu": + optional: true + "@rspack/binding-linux-arm64-musl": + optional: true + "@rspack/binding-linux-x64-gnu": + optional: true + "@rspack/binding-linux-x64-musl": + optional: true + "@rspack/binding-win32-arm64-msvc": + optional: true + "@rspack/binding-win32-ia32-msvc": + optional: true + "@rspack/binding-win32-x64-msvc": + optional: true + checksum: 10c0/8e7c6cd4298de884ddabad09e07ff10bf098fe17b1850aa64bdc9fafd8c54da209c852feb14b46dcf098680b6f87bb7a8bb62e5a2a66e2ce12781d8dd678250b languageName: node linkType: hard -"@typescript-eslint/types@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/types@npm:7.5.0" - checksum: 10c0/f3394f71f422dbd89f63b230f20e9769c12e47a287ff30ca03a80714e57ea21279b6f12a8ab14bafb00b59926f20a88894b2d1e72679f7ff298bae112679d4b3 +"@rspack/cli@npm:^1.3.7": + version: 1.3.8 + resolution: "@rspack/cli@npm:1.3.8" + dependencies: + "@discoveryjs/json-ext": "npm:^0.5.7" + "@rspack/dev-server": "npm:1.1.1" + colorette: "npm:2.0.20" + exit-hook: "npm:^4.0.0" + interpret: "npm:^3.1.1" + rechoir: "npm:^0.8.0" + webpack-bundle-analyzer: "npm:4.10.2" + yargs: "npm:17.7.2" + peerDependencies: + "@rspack/core": ^1.0.0-alpha || ^1.x + bin: + rspack: bin/rspack.js + checksum: 10c0/1330e75a0808b6190a7145b7c6d95379580c5d31820133e0f3bee61772d5cc056aea9140084386254c679d911bd94881c78ccb8b33812d3e4c51b6f29ab9d738 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.5.0" +"@rspack/core@npm:^1.3.7": + version: 1.3.8 + resolution: "@rspack/core@npm:1.3.8" dependencies: - "@typescript-eslint/types": "npm:7.5.0" - "@typescript-eslint/visitor-keys": "npm:7.5.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - minimatch: "npm:9.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + "@module-federation/runtime-tools": "npm:0.13.0" + "@rspack/binding": "npm:1.3.8" + "@rspack/lite-tapable": "npm:1.0.1" + caniuse-lite: "npm:^1.0.30001715" + peerDependencies: + "@swc/helpers": ">=0.5.1" peerDependenciesMeta: - typescript: + "@swc/helpers": optional: true - checksum: 10c0/ea3a270c725d6be273188b86110e0393052cd64d1c54a56eb5ea405e6d3fbbe84fb3b1ce1b8496a4078ac1eefd37aedcf12be91876764f6de31d5aa5131c7bcd + checksum: 10c0/58a5a3ebe4fb638dc1a98ade56d7269f936a37cef2c9a824e5ce324fa6e90b12d2505e1b61cf54037c83b1ff2c73d7626d1e09334a9644f2997c44ce3dd493cc languageName: node linkType: hard -"@typescript-eslint/utils@npm:^7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/utils@npm:7.5.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.12" - "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:7.5.0" - "@typescript-eslint/types": "npm:7.5.0" - "@typescript-eslint/typescript-estree": "npm:7.5.0" - semver: "npm:^7.5.4" +"@rspack/dev-server@npm:1.1.1": + version: 1.1.1 + resolution: "@rspack/dev-server@npm:1.1.1" + dependencies: + chokidar: "npm:^3.6.0" + express: "npm:^4.21.2" + http-proxy-middleware: "npm:^2.0.7" + mime-types: "npm:^2.1.35" + p-retry: "npm:^6.2.0" + webpack-dev-middleware: "npm:^7.4.2" + webpack-dev-server: "npm:5.2.0" + ws: "npm:^8.18.0" peerDependencies: - eslint: ^8.56.0 - checksum: 10c0/c815ed6909769648953d6963c069038f7cac0c979051b25718feb30e0d3337b9647b75b8de00ac03fe960f0cc8dc4e8a81d4aac4719090a99785e0068712bd24 + "@rspack/core": "*" + checksum: 10c0/54599cddd510aa4ca5ec3ab0082ab20f0d9b104bd49332a2a411cc487ba1b74d59d4f640311dac21e0b4109fd420d54553372d3d5c0e5d0604697f3f2318e14b languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.5.0" - dependencies: - "@typescript-eslint/types": "npm:7.5.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/eecf02b8dd54e83738a143aca87b902af4b357028a90fd34ed7a2f40a3ae2f6a188b9ba53903f23c80e868f1fffbb039e9ddb63525438d659707cc7bfb269317 +"@rspack/lite-tapable@npm:1.0.1": + version: 1.0.1 + resolution: "@rspack/lite-tapable@npm:1.0.1" + checksum: 10c0/90bb1bc414dc51ea2d0933e09f78d25584f3f50a85f4cb8228930bd29e5931bf55eff4f348a06c51dd3149fc73b8ae3920bf0ae5ae8a0c9fe1d9b404e6ecf5b7 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: 10c0/073bfa548026b1ebaf1659eb8961e526be22fa77139b10d60e712f46d2f0f05f4e6c8bec62a087d41088ee9e29faa7f54838568e475ab2f776171003c3920858 languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" +"@types/body-parser@npm:*": + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 10c0/37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a +"@types/bonjour@npm:^3.5.13": + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/eebedbca185ac3c39dd5992ef18d9e2a9f99e7f3c2f52f5561f90e9ed482c5d224c7962db95362712f580ed5713264e777a98d8f0bd8747f4eadf62937baed16 languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: 10c0/a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a +"@types/connect-history-api-fallback@npm:^1.5.4": + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" + dependencies: + "@types/express-serve-static-core": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/1b4035b627dcd714b05a22557f942e24a57ca48e7377dde0d2f86313fe685bc0a6566512a73257a55b5665b96c3041fb29228ac93331d8133011716215de8244 languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" - dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 +"@types/estree@npm:1.0.7, @types/estree@npm:^1.0.0": + version: 1.0.7 + resolution: "@types/estree@npm:1.0.7" + checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 10c0/79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": + version: 5.0.6 + resolution: "@types/express-serve-static-core@npm:5.0.6" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/aced8cc88c1718adbbd1fc488756b0f22d763368d9eff2ae21b350698fab4a77d8d13c3699056dc662a887e43a8b67a3e8f6289ff76102ecc6bad4a7710d31a6 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.19.6 + resolution: "@types/express-serve-static-core@npm:4.19.6" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/4281f4ead71723f376b3ddf64868ae26244d434d9906c101cf8d436d4b5c779d01bd046e4ea0ed1a394d3e402216fabfa22b1fa4dba501061cd7c81c54045983 languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" +"@types/express@npm:*": + version: 5.0.1 + resolution: "@types/express@npm:5.0.1" dependencies: - "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10c0/59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/serve-static": "npm:*" + checksum: 10c0/e1385028c7251360ce916aab0e304187b613ca18cb9aa3fa90794a337e5b2e0c76330d467f41d3b3e936ce5336c4f3e63e323dc01192cf20f9686905daa6d00a languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" +"@types/express@npm:^4.17.21": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10c0/12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 10c0/14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" +"@types/http-proxy@npm:^1.17.8": + version: 1.17.16 + resolution: "@types/http-proxy@npm:1.17.16" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/helper-wasm-section": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-opt": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b + "@types/node": "npm:*" + checksum: 10c0/b71bbb7233b17604f1158bbbe33ebf8bb870179d2b6e15dc9483aa2a785ce0d19ffb6c2237225b558addf24211d1853c95e337ee496df058eb175b433418a941 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 +"@types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb +"@types/marked@npm:4.3.2": + version: 4.3.2 + resolution: "@types/marked@npm:4.3.2" + checksum: 10c0/6f44d28da5c940a719d6c6aca41e33f49c5fe957f7972939cc1cbb47d045951f4d969f382d655345d0463e47db1994635d2862018716fcef2fa85ceeceb116e7 + languageName: node + linkType: hard + +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" +"@types/node-forge@npm:^1.3.0": + version: 1.3.11 + resolution: "@types/node-forge@npm:1.3.11" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e + "@types/node": "npm:*" + checksum: 10c0/3d7d23ca0ba38ac0cf74028393bd70f31169ab9aba43f21deb787840170d307d662644bac07287495effe2812ddd7ac8a14dbd43f16c2936bbb06312e96fc3b9 languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" +"@types/node@npm:*, @types/node@npm:^22.14.0": + version: 22.14.1 + resolution: "@types/node@npm:22.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a + undici-types: "npm:~6.21.0" + checksum: 10c0/d49c4d00403b1c2348cf0701b505fd636d80aabe18102105998dc62fdd36dcaf911e73c7a868c48c21c1022b825c67b475b65b1222d84b704d8244d152bb7f86 languageName: node linkType: hard -"@webpack-cli/configtest@npm:^2.1.1": - version: 2.1.1 - resolution: "@webpack-cli/configtest@npm:2.1.1" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - checksum: 10c0/a8da1f15702cb289807da99235ed95326ed7dabeb1a36ca59bd3a5dbe6adcc946a9a2767936050fc4d5ed14efab0e5b5a641dfe8e3d862c36caa5791ac12759d +"@types/prop-types@npm:*": + version: 15.7.14 + resolution: "@types/prop-types@npm:15.7.14" + checksum: 10c0/1ec775160bfab90b67a782d735952158c7e702ca4502968aa82565bd8e452c2de8601c8dfe349733073c31179116cf7340710160d3836aa8a1ef76d1532893b1 languageName: node linkType: hard -"@webpack-cli/info@npm:^2.0.2": - version: 2.0.2 - resolution: "@webpack-cli/info@npm:2.0.2" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - checksum: 10c0/ca88a35604dc9aedac7c26e8f6793c5039dc1eea2b12a85fbfd669a5f21ecf9cf169d7fd157ea366a62666e3fa05b776306a96742ac61a9868f44fdce6b40f7d +"@types/qs@npm:*": + version: 6.9.18 + resolution: "@types/qs@npm:6.9.18" + checksum: 10c0/790b9091348e06dde2c8e4118b5771ab386a8c22a952139a2eb0675360a2070d0b155663bf6f75b23f258fd0a1f7ffc0ba0f059d99a719332c03c40d9e9cd63b languageName: node linkType: hard -"@webpack-cli/serve@npm:^2.0.5": - version: 2.0.5 - resolution: "@webpack-cli/serve@npm:2.0.5" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x +"@types/range-parser@npm:*": + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c + languageName: node + linkType: hard + +"@types/react-dom@npm:^18.3.1": + version: 18.3.6 + resolution: "@types/react-dom@npm:18.3.6" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10c0/e77ac076096bd4b2e0a99130c47959762a927e536b83412e470ac5198d4b8d111cfd787ff2ab7c22bc39c114c0c5fef80046ea0cccb02a655e021a435859314a + languageName: node + linkType: hard + +"@types/react@npm:^18.3.1": + version: 18.3.20 + resolution: "@types/react@npm:18.3.20" + dependencies: + "@types/prop-types": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10c0/65fa867c91357e4c4c646945c8b99044360f8973cb7f928ec4de115fe3207827985d45be236e6fd6c092b09f631c2126ce835c137be30718419e143d73300d8f + languageName: node + linkType: hard + +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: 10c0/07481551a988cc90b423351919928b9ddcd14e3f5591cac3ab950851bb20646e55a10e89141b38bc3093d2056d4df73700b22ff2612976ac86a6367862381884 + languageName: node + linkType: hard + +"@types/send@npm:*": + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c + languageName: node + linkType: hard + +"@types/serve-index@npm:^1.9.4": + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" + dependencies: + "@types/express": "npm:*" + checksum: 10c0/94c1b9e8f1ea36a229e098e1643d5665d9371f8c2658521718e259130a237c447059b903bac0dcc96ee2c15fd63f49aa647099b7d0d437a67a6946527a837438 + languageName: node + linkType: hard + +"@types/serve-static@npm:*, @types/serve-static@npm:^1.15.5": + version: 1.15.7 + resolution: "@types/serve-static@npm:1.15.7" + dependencies: + "@types/http-errors": "npm:*" + "@types/node": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae + languageName: node + linkType: hard + +"@types/sockjs@npm:^0.3.36": + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/b20b7820ee813f22de4f2ce98bdd12c68c930e016a8912b1ed967595ac0d8a4cbbff44f4d486dd97f77f5927e7b5725bdac7472c9ec5b27f53a5a13179f0612f + languageName: node + linkType: hard + +"@types/trusted-types@npm:^2.0.7": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 10c0/4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c + languageName: node + linkType: hard + +"@types/webpack-env@npm:^1.18.8": + version: 1.18.8 + resolution: "@types/webpack-env@npm:1.18.8" + checksum: 10c0/527a5d1eb75c5243e4f3665d956c7c340f899955dd25d16c9fd9750406f32e95a3a17d207640295038e8235c0c2a2daf084f420e088e58b965d82fc74f6012d7 + languageName: node + linkType: hard + +"@types/wicg-file-system-access@npm:^2023.10.6": + version: 2023.10.6 + resolution: "@types/wicg-file-system-access@npm:2023.10.6" + checksum: 10c0/6d1086450b28351ea5c8c6078411930984a16588b40d999f9abdc42c9bff63de93101bd7b1edcaba5c5c9ea83acdeb277bcaff913f39f6dac12091459974631f + languageName: node + linkType: hard + +"@types/ws@npm:^8.18.1, @types/ws@npm:^8.5.10": + version: 8.18.1 + resolution: "@types/ws@npm:8.18.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/61aff1129143fcc4312f083bc9e9e168aa3026b7dd6e70796276dcfb2c8211c4292603f9c4864fae702f2ed86e4abd4d38aa421831c2fd7f856c931a481afbab + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^8.28.0": + version: 8.29.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.29.1" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.29.1" + "@typescript-eslint/type-utils": "npm:8.29.1" + "@typescript-eslint/utils": "npm:8.29.1" + "@typescript-eslint/visitor-keys": "npm:8.29.1" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.3.1" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/a3ed7556edcac374cab622862f2f9adedc91ca305d6937db6869a0253d675858c296cb5413980e8404fc39737117faaf35b00c6804664b3c542bdc417502532f + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^8.28.0": + version: 8.29.1 + resolution: "@typescript-eslint/parser@npm:8.29.1" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.29.1" + "@typescript-eslint/types": "npm:8.29.1" + "@typescript-eslint/typescript-estree": "npm:8.29.1" + "@typescript-eslint/visitor-keys": "npm:8.29.1" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/af3570ff58c42c2014e5c117bebf91120737fb139d94415ca2711844990e95252c3006ccc699871fe3f592cc1a3f4ebfdc9dd5f6cb29b6b128c2524fcf311b75 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.29.1": + version: 8.29.1 + resolution: "@typescript-eslint/scope-manager@npm:8.29.1" + dependencies: + "@typescript-eslint/types": "npm:8.29.1" + "@typescript-eslint/visitor-keys": "npm:8.29.1" + checksum: 10c0/8b87a04f01ebc13075e352509bca8f31c757c3220857fa473ac155f6bdf7f30fe82765d0c3d8e790f7fad394a32765bd9f716b97c08e17581d358c76086d51af + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.29.1": + version: 8.29.1 + resolution: "@typescript-eslint/type-utils@npm:8.29.1" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.29.1" + "@typescript-eslint/utils": "npm:8.29.1" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/72cc01dbac866b0a7c7b1f637ad03ffd22f6d3617f70f06f485cf3096fddfc821fdc56de1a072cc6af70250c63698a3e5a910f67fe46eea941955b6e0da1b2bd + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.29.1": + version: 8.29.1 + resolution: "@typescript-eslint/types@npm:8.29.1" + checksum: 10c0/bbcb9e4f38df4485092b51ac6bb62d65f321d914ab58dc0ff1eaa7787dc0b4a39e237c2617b9f2c2bcb91a343f30de523e3544f69affa1ee4287a3ef2fc10ce7 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.29.1": + version: 8.29.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.29.1" + dependencies: + "@typescript-eslint/types": "npm:8.29.1" + "@typescript-eslint/visitor-keys": "npm:8.29.1" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/33c46c667d9262e5625d5d0064338711b342e62c5675ded6811a2cb13ee5de2f71b90e9d0be5cb338b11b1a329c376a6bbf6c3d24fa8fb457b2eefc9f3298513 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.29.1, @typescript-eslint/utils@npm:^8.28.0": + version: 8.29.1 + resolution: "@typescript-eslint/utils@npm:8.29.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:8.29.1" + "@typescript-eslint/types": "npm:8.29.1" + "@typescript-eslint/typescript-estree": "npm:8.29.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/1b2704b769b0c9353cf26a320ecf9775ba51c94c7c30e2af80ca31f4cb230f319762ab06535fcb26b6963144bbeaa53233b34965907c506283861b013f5b95fc + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.29.1": + version: 8.29.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.29.1" + dependencies: + "@typescript-eslint/types": "npm:8.29.1" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/0c12e83c84a754161c89e594a96454799669979c7021a8936515ec574a1fa1d6e3119e0eacf502e07a0fa7254974558ea7a48901c8bfed3c46579a61b655e4f5 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a + languageName: node + linkType: hard + +"@vitest/expect@npm:3.1.1": + version: 3.1.1 + resolution: "@vitest/expect@npm:3.1.1" + dependencies: + "@vitest/spy": "npm:3.1.1" + "@vitest/utils": "npm:3.1.1" + chai: "npm:^5.2.0" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/ef4528d0ebb89eb3cc044cf597d051c35df8471bb6ba4029e9b3412aa69d0d85a0ce4eb49531fc78fe1ebd97e6428260463068cc96a8d8c1a80150dedfd1ab3a + languageName: node + linkType: hard + +"@vitest/mocker@npm:3.1.1": + version: 3.1.1 + resolution: "@vitest/mocker@npm:3.1.1" + dependencies: + "@vitest/spy": "npm:3.1.1" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 peerDependenciesMeta: - webpack-dev-server: + msw: + optional: true + vite: optional: true - checksum: 10c0/36079d34971ff99a58b66b13f4184dcdd8617853c48cccdbc3f9ab7ea9e5d4fcf504e873c298ea7aa15e0b51ad2c4aee4d7a70bd7d9364e60f57b0eb93ca15fc + checksum: 10c0/9264558809e2d7c77ae9ceefad521dc5f886a567aaf0bdd021b73089b8906ffd92c893f3998d16814f38fc653c7413836f508712355c87749a0e86c7d435eec1 languageName: node linkType: hard -"@xmldom/xmldom@npm:^0.7.2": - version: 0.7.13 - resolution: "@xmldom/xmldom@npm:0.7.13" - checksum: 10c0/cb02e4e8d986acf18578a5f25d1bce5e18d08718f40d8a0cdd922a4c112c8e00daf94de4e43f9556ed147c696b135f2ab81fa9a2a8a0416f60af15d156b60e40 +"@vitest/pretty-format@npm:3.1.1, @vitest/pretty-format@npm:^3.1.1": + version: 3.1.1 + resolution: "@vitest/pretty-format@npm:3.1.1" + dependencies: + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/540cd46d317fc80298c93b185f3fb48dfe90eaaa3942fd700fde6e88d658772c01b56ad5b9b36e4ac368a02e0fc8e0dc72bbdd6dd07a5d75e89ef99c8df5ba6e languageName: node linkType: hard -"@xtuc/ieee754@npm:^1.2.0": - version: 1.2.0 - resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f +"@vitest/runner@npm:3.1.1": + version: 3.1.1 + resolution: "@vitest/runner@npm:3.1.1" + dependencies: + "@vitest/utils": "npm:3.1.1" + pathe: "npm:^2.0.3" + checksum: 10c0/35a541069c3c94a2dd02fca2d70cc8d5e66ba2e891cfb80da354174f510aeb96774ffb34fff39cecde9d5c969be4dd20e240a900beb9b225b7512a615ecc5503 languageName: node linkType: hard -"@xtuc/long@npm:4.2.2": - version: 4.2.2 - resolution: "@xtuc/long@npm:4.2.2" - checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 +"@vitest/snapshot@npm:3.1.1": + version: 3.1.1 + resolution: "@vitest/snapshot@npm:3.1.1" + dependencies: + "@vitest/pretty-format": "npm:3.1.1" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + checksum: 10c0/43e5fc5db580f20903eb1493d07f08752df8864f7b9b7293a202b2ffe93d8c196a5614d66dda096c6bacc16e12f1836f33ba41898812af6d32676d1eb501536a languageName: node linkType: hard -"abab@npm:^2.0.6": - version: 2.0.6 - resolution: "abab@npm:2.0.6" - checksum: 10c0/0b245c3c3ea2598fe0025abf7cc7bb507b06949d51e8edae5d12c1b847a0a0c09639abcb94788332b4e2044ac4491c1e8f571b51c7826fd4b0bda1685ad4a278 +"@vitest/spy@npm:3.1.1": + version: 3.1.1 + resolution: "@vitest/spy@npm:3.1.1" + dependencies: + tinyspy: "npm:^3.0.2" + checksum: 10c0/896659d4b42776cfa2057a1da2c33adbd3f2ebd28005ca606d1616d08d2e726dc1460fb37f1ea7f734756b5bccf926c7165f410e63f0a3b8d992eb5489528b08 + languageName: node + linkType: hard + +"@vitest/utils@npm:3.1.1": + version: 3.1.1 + resolution: "@vitest/utils@npm:3.1.1" + dependencies: + "@vitest/pretty-format": "npm:3.1.1" + loupe: "npm:^3.1.3" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/a9cfe0c0f095b58644ce3ba08309de5be8564c10dad9e62035bd378e60b2834e6a256e6e4ded7dcf027fdc2371301f7965040ad3e6323b747d5b3abbb7ceb0d6 + languageName: node + linkType: hard + +"@xmldom/xmldom@npm:^0.7.2": + version: 0.7.13 + resolution: "@xmldom/xmldom@npm:0.7.13" + checksum: 10c0/cb02e4e8d986acf18578a5f25d1bce5e18d08718f40d8a0cdd922a4c112c8e00daf94de4e43f9556ed147c696b135f2ab81fa9a2a8a0416f60af15d156b60e40 languageName: node linkType: hard @@ -1837,36 +1609,27 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 +"abbrev@npm:^3.0.0": + version: 3.0.1 + resolution: "abbrev@npm:3.0.1" + checksum: 10c0/21ba8f574ea57a3106d6d35623f2c4a9111d9ee3e9a5be47baed46ec2457d2eac46e07a5c4a60186f88cb98abbe3e24f2d4cca70bc2b12f1692523e2209a9ccf languageName: node linkType: hard -"abstract-logging@npm:^2.0.0": +"abstract-logging@npm:^2.0.1": version: 2.0.1 resolution: "abstract-logging@npm:2.0.1" checksum: 10c0/304879d9babcf6772260e5ddde632e6428e1f42f7a7a116d4689e97ad813a20e0ec2dd1e0a122f3617557f40091b9ca85735de4b48c17a2041268cb47b3f8ef1 languageName: node linkType: hard -"acorn-globals@npm:^7.0.0": - version: 7.0.1 - resolution: "acorn-globals@npm:7.0.1" +"accepts@npm:~1.3.4, accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" dependencies: - acorn: "npm:^8.1.0" - acorn-walk: "npm:^8.0.2" - checksum: 10c0/7437f58e92d99292dbebd0e79531af27d706c9f272f31c675d793da6c82d897e75302a8744af13c7f7978a8399840f14a353b60cf21014647f71012982456d2b - languageName: node - linkType: hard - -"acorn-import-assertions@npm:^1.9.0": - version: 1.9.0 - resolution: "acorn-import-assertions@npm:1.9.0" - peerDependencies: - acorn: ^8 - checksum: 10c0/3b4a194e128efdc9b86c2b1544f623aba4c1aa70d638f8ab7dc3971a5b4aa4c57bd62f99af6e5325bb5973c55863b4112e708a6f408bad7a138647ca72283afe + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 languageName: node linkType: hard @@ -1879,19 +1642,21 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.0.2": - version: 8.3.2 - resolution: "acorn-walk@npm:8.3.2" - checksum: 10c0/7e2a8dad5480df7f872569b9dccff2f3da7e65f5353686b1d6032ab9f4ddf6e3a2cb83a9b52cf50b1497fd522154dda92f0abf7153290cc79cd14721ff121e52 +"acorn-walk@npm:^8.0.0": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" +"acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" bin: acorn: bin/acorn - checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 languageName: node linkType: hard @@ -1904,21 +1669,19 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 languageName: node linkType: hard "agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" + version: 4.6.0 + resolution: "agentkeepalive@npm:4.6.0" dependencies: humanize-ms: "npm:^1.2.1" - checksum: 10c0/394ea19f9710f230722996e156607f48fdf3a345133b0b1823244b7989426c16019a428b56c82d3eabef616e938812981d9009f4792ecc66bd6a59e991c62612 + checksum: 10c0/235c182432f75046835b05f239708107138a40103deee23b6a08caee5136873709155753b394ec212e49e60e94a378189562cb01347765515cff61b692c69187 languageName: node linkType: hard @@ -1946,12 +1709,17 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" +"ajv-formats@npm:^3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: "npm:^8.0.0" peerDependencies: - ajv: ^6.9.1 - checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a languageName: node linkType: hard @@ -1966,7 +1734,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.11.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.12.6": +"ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -1978,24 +1746,24 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.1.0, ajv@npm:^8.9.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" +"ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: - fast-deep-equal: "npm:^3.1.1" + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: "npm:^0.21.3" - checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 +"ansi-html-community@npm:^0.0.8": + version: 0.0.8 + resolution: "ansi-html-community@npm:0.0.8" + bin: + ansi-html: bin/ansi-html + checksum: 10c0/45d3a6f0b4f10b04fdd44bef62972e2470bfd917bf00439471fa7473d92d7cbe31369c73db863cc45dda115cb42527f39e232e9256115534b8ee5806b0caeed4 languageName: node linkType: hard @@ -2007,18 +1775,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc languageName: node linkType: hard @@ -2031,13 +1790,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df - languageName: node - linkType: hard - "ansi-styles@npm:^6.1.0": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" @@ -2045,7 +1797,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": +"anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -2062,13 +1814,6 @@ __metadata: languageName: node linkType: hard -"archy@npm:^1.0.0": - version: 1.0.0 - resolution: "archy@npm:1.0.0" - checksum: 10c0/200c849dd1c304ea9914827b0555e7e1e90982302d574153e28637db1a663c53de62bad96df42d50e8ce7fc18d05e3437d9aa8c4b383803763755f0956c7d308 - languageName: node - linkType: hard - "are-we-there-yet@npm:^3.0.0": version: 3.0.1 resolution: "are-we-there-yet@npm:3.0.1" @@ -2079,7 +1824,7 @@ __metadata: languageName: node linkType: hard -"argparse@npm:^1.0.6, argparse@npm:^1.0.7": +"argparse@npm:^1.0.6": version: 1.0.10 resolution: "argparse@npm:1.0.10" dependencies: @@ -2095,17 +1840,24 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.4" - checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -2119,14 +1871,7 @@ __metadata: languageName: node linkType: hard -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 - languageName: node - linkType: hard - -"array.prototype.findlast@npm:^1.2.4": +"array.prototype.findlast@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlast@npm:1.2.5" dependencies: @@ -2141,67 +1886,68 @@ __metadata: linkType: hard "array.prototype.flat@npm:^1.3.1": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b - languageName: node - linkType: hard - -"array.prototype.flatmap@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flatmap@npm:1.3.2" + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/67b3f1d602bb73713265145853128b1ad77cc0f9b833c7e1e056b323fbeac41a4ff1c9c99c7b9445903caea924d9ca2450578d9011913191aa88cc3c3a4b54f4 + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a languageName: node linkType: hard -"array.prototype.toreversed@npm:^1.1.2": - version: 1.1.2 - resolution: "array.prototype.toreversed@npm:1.1.2" +"array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/2b7627ea85eae1e80ecce665a500cc0f3355ac83ee4a1a727562c7c2a1d5f1c0b4dd7b65c468ec6867207e452ba01256910a2c0b41486bfdd11acf875a7a3435 + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 languageName: node linkType: hard -"array.prototype.tosorted@npm:^1.1.3": - version: 1.1.3 - resolution: "array.prototype.tosorted@npm:1.1.3" +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" dependencies: - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.7" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.3" - es-errors: "npm:^1.1.0" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/a27e1ca51168ecacf6042901f5ef021e43c8fa04b6c6b6f2a30bac3645cd2b519cecbe0bc45db1b85b843f64dc3207f0268f700b4b9fbdec076d12d432cf0865 + checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943 languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" dependencies: array-buffer-byte-length: "npm:^1.0.1" - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.3" - es-errors: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.3" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" is-array-buffer: "npm:^3.0.4" - is-shared-array-buffer: "npm:^1.0.2" - checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 + checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 + languageName: node + linkType: hard + +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 languageName: node linkType: hard @@ -2228,102 +1974,24 @@ __metadata: languageName: node linkType: hard -"avvio@npm:^7.1.2": - version: 7.2.5 - resolution: "avvio@npm:7.2.5" +"avvio@npm:^9.0.0": + version: 9.1.0 + resolution: "avvio@npm:9.1.0" dependencies: - archy: "npm:^1.0.0" - debug: "npm:^4.0.0" - fastq: "npm:^1.6.1" - queue-microtask: "npm:^1.1.2" - checksum: 10c0/20ca0bf216647ff09ebaa9f206cd55dbe768a72b915ad41e517223ed4595ab7ec72eeff99a5da88d47a7ecc53002424d2b4c68b09559e3ab918c296ced5100d8 + "@fastify/error": "npm:^4.0.0" + fastq: "npm:^1.17.1" + checksum: 10c0/bdc294a7e8f38e1e21f9d338d97d7240025db54f1005fc419cfe0499a35edf2276ab1fe91135739faa3a9437358ec6912d5a56f23361b061880333cb4f1c7884 languageName: node linkType: hard -"axios@npm:^1.6.8": - version: 1.6.8 - resolution: "axios@npm:1.6.8" +"axios@npm:^1.8.4": + version: 1.8.4 + resolution: "axios@npm:1.8.4" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9 - languageName: node - linkType: hard - -"babel-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "babel-jest@npm:29.7.0" - dependencies: - "@jest/transform": "npm:^29.7.0" - "@types/babel__core": "npm:^7.1.14" - babel-plugin-istanbul: "npm:^6.1.1" - babel-preset-jest: "npm:^29.6.3" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - slash: "npm:^3.0.0" - peerDependencies: - "@babel/core": ^7.8.0 - checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 - languageName: node - linkType: hard - -"babel-plugin-istanbul@npm:^6.1.1": - version: 6.1.1 - resolution: "babel-plugin-istanbul@npm:6.1.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@istanbuljs/load-nyc-config": "npm:^1.0.0" - "@istanbuljs/schema": "npm:^0.1.2" - istanbul-lib-instrument: "npm:^5.0.4" - test-exclude: "npm:^6.0.0" - checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-plugin-jest-hoist@npm:29.6.3" - dependencies: - "@babel/template": "npm:^7.3.3" - "@babel/types": "npm:^7.3.3" - "@types/babel__core": "npm:^7.1.14" - "@types/babel__traverse": "npm:^7.0.6" - checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e - languageName: node - linkType: hard - -"babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" - dependencies: - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-bigint": "npm:^7.8.3" - "@babel/plugin-syntax-class-properties": "npm:^7.8.3" - "@babel/plugin-syntax-import-meta": "npm:^7.8.3" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/5ba39a3a0e6c37d25e56a4fb843be632dac98d54706d8a0933f9bcb1a07987a96d55c2b5a6c11788a74063fb2534fe68c1f1dbb6c93626850c785e0938495627 - languageName: node - linkType: hard - -"babel-preset-jest@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-preset-jest@npm:29.6.3" - dependencies: - babel-plugin-jest-hoist: "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 + checksum: 10c0/450993c2ba975ffccaf0d480b68839a3b2435a5469a71fa2fb0b8a55cdb2c2ae47e609360b9c1e2b2534b73dfd69e2733a1cf9f8215bee0bcd729b72f801b0ce languageName: node linkType: hard @@ -2334,10 +2002,10 @@ __metadata: languageName: node linkType: hard -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f +"batch@npm:0.6.1": + version: 0.6.1 + resolution: "batch@npm:0.6.1" + checksum: 10c0/925a13897b4db80d4211082fe287bcf96d297af38e26448c857cee3e095c9792e3b8f26b37d268812e7f38a589f694609de8534a018b1937d7dc9f84e6b387c5 languageName: node linkType: hard @@ -2357,6 +2025,36 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 + languageName: node + linkType: hard + +"bonjour-service@npm:^1.2.1": + version: 1.3.0 + resolution: "bonjour-service@npm:1.3.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + multicast-dns: "npm:^7.2.5" + checksum: 10c0/5721fd9f9bb968e9cc16c1e8116d770863dd2329cb1f753231de1515870648c225142b7eefa71f14a5c22bc7b37ddd7fdeb018700f28a8c936d50d4162d433c7 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -2376,35 +2074,19 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: "npm:^7.0.1" - checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 languageName: node linkType: hard -"browserslist@npm:^4.21.10, browserslist@npm:^4.22.2": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" - dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" - bin: - browserslist: cli.js - checksum: 10c0/8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 - languageName: node - linkType: hard - -"bser@npm:2.1.1": - version: 2.1.1 - resolution: "bser@npm:2.1.1" - dependencies: - node-int64: "npm:^0.4.0" - checksum: 10c0/24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227 +"buffer-builder@npm:^0.2.0": + version: 0.2.0 + resolution: "buffer-builder@npm:0.2.0" + checksum: 10c0/e50c3a379f4acaea75ade1ee3e8c07ed6d7c5dfc3f98adbcf0159bfe1a4ce8ca1fe3689e861fcdb3fcef0012ebd4345a6112a5b8a1185295452bb66d7b6dc8a1 languageName: node linkType: hard @@ -2424,6 +2106,29 @@ __metadata: languageName: node linkType: hard +"bundle-name@npm:^4.1.0": + version: 4.1.0 + resolution: "bundle-name@npm:4.1.0" + dependencies: + run-applescript: "npm:^7.0.0" + checksum: 10c0/8e575981e79c2bcf14d8b1c027a3775c095d362d1382312f444a7c861b0e21513c0bd8db5bd2b16e50ba0709fa622d4eab6b53192d222120305e68359daece29 + languageName: node + linkType: hard + +"bytes@npm:3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + "cacache@npm:^16.1.0": version: 16.1.3 resolution: "cacache@npm:16.1.3" @@ -2450,11 +2155,11 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.2 - resolution: "cacache@npm:18.0.2" +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" dependencies: - "@npmcli/fs": "npm:^3.1.0" + "@npmcli/fs": "npm:^4.0.0" fs-minipass: "npm:^3.0.0" glob: "npm:^10.2.2" lru-cache: "npm:^10.0.1" @@ -2462,24 +2167,43 @@ __metadata: minipass-collect: "npm:^2.0.1" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/7992665305cc251a984f4fdbab1449d50e88c635bc43bf2785530c61d239c61b349e5734461baa461caaee65f040ab14e2d58e694f479c0810cffd181ba5eabc + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: - es-define-property: "npm:^1.0.0" es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + set-function-length: "npm:^1.2.2" + checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 languageName: node linkType: hard @@ -2500,24 +2224,10 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 - languageName: node - linkType: hard - -"camelcase@npm:^6.2.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001605 - resolution: "caniuse-lite@npm:1.0.30001605" - checksum: 10c0/ceb96a0ecfdaee6510c00aebaaa63db20aaeafab03450d4e3b214e009cb632f87385a70c299cdd1ca4c17e1473883d8fa2051c5b2d083a454338c0c779b25cbc +"caniuse-lite@npm:^1.0.30001715": + version: 1.0.30001715 + resolution: "caniuse-lite@npm:1.0.30001715" + checksum: 10c0/0109a7da797ffbe1aa197baa5242b205011098eecec1087ef3d0c58ceea19be325ab6679b2751a78660adc3051a9f77e99d5789938fd1eb1235e6fdf6a1dbf8e languageName: node linkType: hard @@ -2532,14 +2242,16 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" +"chai@npm:^5.2.0": + version: 5.2.0 + resolution: "chai@npm:5.2.0" dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + assertion-error: "npm:^2.0.1" + check-error: "npm:^2.1.1" + deep-eql: "npm:^5.0.1" + loupe: "npm:^3.1.0" + pathval: "npm:^2.0.0" + checksum: 10c0/dfd1cb719c7cebb051b727672d382a35338af1470065cb12adb01f4ee451bbf528e0e0f9ab2016af5fc1eea4df6e7f4504dc8443f8f00bd8fb87ad32dc516f7d languageName: node linkType: hard @@ -2573,14 +2285,14 @@ __metadata: languageName: node linkType: hard -"char-regex@npm:^1.0.2": - version: 1.0.2 - resolution: "char-regex@npm:1.0.2" - checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: 10c0/979f13eccab306cf1785fa10941a590b4e7ea9916ea2a4f8c87f0316fc3eab07eabefb6e587424ef0f88cbcd3805791f172ea739863ca3d7ce2afc54641c7f0e languageName: node linkType: hard -"chokidar@npm:>=3.0.0 <4.0.0": +"chokidar@npm:^3.5.2, chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -2599,6 +2311,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^4.0.0": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -2606,24 +2327,33 @@ __metadata: languageName: node linkType: hard -"chrome-trace-event@npm:^1.0.2": - version: 1.0.3 - resolution: "chrome-trace-event@npm:1.0.3" - checksum: 10c0/080ce2d20c2b9e0f8461a380e9585686caa768b1c834a464470c9dc74cda07f27611c7b727a2cd768a9cecd033297fdec4ce01f1e58b62227882c1059dec321c +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 languageName: node linkType: hard -"ci-info@npm:^3.2.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a +"clean-css-cli@npm:^5.6.3": + version: 5.6.3 + resolution: "clean-css-cli@npm:5.6.3" + dependencies: + chokidar: "npm:^3.5.2" + clean-css: "npm:^5.3.3" + commander: "npm:7.x" + glob: "npm:^7.1.6" + bin: + cleancss: bin/cleancss + checksum: 10c0/678562c4b3ba4bd150cee0fd838b0cb9b645e3260dd5ff8b9e1456215e86bb6389e3a7f542194c125eaf700034e60ab14570837d7e36663bd5a283904f86f656 languageName: node linkType: hard -"cjs-module-lexer@npm:^1.0.0": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 10c0/0de9a9c3fad03a46804c0d38e7b712fb282584a9c7ef1ed44cae22fb71d9bb600309d66a9711ac36a596fd03422f5bb03e021e8f369c12a39fa1786ae531baab +"clean-css@npm:^5.3.3": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: "npm:~0.6.0" + checksum: 10c0/381de7523e23f3762eb180e327dcc0cedafaf8cb1cd8c26b7cc1fc56e0829a92e734729c4f955394d65ed72fb62f82d8baf78af34b33b8a7d41ebad2accdd6fb languageName: node linkType: hard @@ -2658,40 +2388,6 @@ __metadata: languageName: node linkType: hard -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: "npm:^2.0.4" - kind-of: "npm:^6.0.2" - shallow-clone: "npm:^3.0.0" - checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 - languageName: node - linkType: hard - -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 - languageName: node - linkType: hard - -"collect-v8-coverage@npm:^1.0.0": - version: 1.0.2 - resolution: "collect-v8-coverage@npm:1.0.2" - checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -2701,13 +2397,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -2724,13 +2413,20 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.14": +"colorette@npm:2.0.20, colorette@npm:^2.0.10": version: 2.0.20 resolution: "colorette@npm:2.0.20" checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 languageName: node linkType: hard +"colorjs.io@npm:^0.5.0": + version: 0.5.2 + resolution: "colorjs.io@npm:0.5.2" + checksum: 10c0/2e6ea43629e325e721b92429239de3a6f42fb6d88ba6e4c2aeff0288c196d876f2f7ee82aea95bd40072d5cdc8cb87f042f4d94c134dcabf0e34a717e4caacb9 + languageName: node + linkType: hard + "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -2740,10 +2436,10 @@ __metadata: languageName: node linkType: hard -"commander@npm:^10.0.1": - version: 10.0.1 - resolution: "commander@npm:10.0.1" - checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 +"commander@npm:7.x, commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a languageName: node linkType: hard @@ -2754,19 +2450,38 @@ __metadata: languageName: node linkType: hard -"commander@npm:^7.2.0": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a - languageName: node - linkType: hard - "common@workspace:*, common@workspace:packages/common": version: 0.0.0-use.local resolution: "common@workspace:packages/common" + dependencies: + vitest: "npm:^3.1.1" languageName: unknown linkType: soft +"compressible@npm:~2.0.18": + version: 2.0.18 + resolution: "compressible@npm:2.0.18" + dependencies: + mime-db: "npm:>= 1.43.0 < 2" + checksum: 10c0/8a03712bc9f5b9fe530cc5a79e164e665550d5171a64575d7dcf3e0395d7b4afa2d79ab176c61b5b596e28228b350dd07c1a2a6ead12fd81d1b6cd632af2fef7 + languageName: node + linkType: hard + +"compression@npm:^1.7.4": + version: 1.8.0 + resolution: "compression@npm:1.8.0" + dependencies: + bytes: "npm:3.1.2" + compressible: "npm:~2.0.18" + debug: "npm:2.6.9" + negotiator: "npm:~0.6.4" + on-headers: "npm:~1.0.2" + safe-buffer: "npm:5.2.1" + vary: "npm:~1.1.2" + checksum: 10c0/804d3c8430939f4fd88e5128333f311b4035f6425a7f2959d74cfb5c98ef3a3e3e18143208f3f9d0fcae4cd3bcf3d2fbe525e0fcb955e6e146e070936f025a24 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -2774,6 +2489,13 @@ __metadata: languageName: node linkType: hard +"connect-history-api-fallback@npm:^2.0.0": + version: 2.0.0 + resolution: "connect-history-api-fallback@npm:2.0.0" + checksum: 10c0/90fa8b16ab76e9531646cc70b010b1dbd078153730c510d3142f6cf07479ae8a812c5a3c0e40a28528dd1681a62395d0cfdef67da9e914c4772ac85d69a3ed87 + languageName: node + linkType: hard + "console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" @@ -2792,7 +2514,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:^0.5.3": +"content-disposition@npm:0.5.4, content-disposition@npm:^0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -2801,24 +2523,31 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af languageName: node linkType: hard -"cookie@npm:^0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: 10c0/c01ca3ef8d7b8187bae434434582288681273b5a9ed27521d4d7f9f7928fe0c920df0decd9f9d3bbd2d14ac432b8c8cf42b98b3bdd5bfe0e6edddeebebe8b61d +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 + languageName: node + linkType: hard + +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 10c0/5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde languageName: node linkType: hard -"core-js@npm:^3.36.1": - version: 3.36.1 - resolution: "core-js@npm:3.36.1" - checksum: 10c0/4f0ad2464535d809ba659226feca15bff14b9b5452518bddff8d81b9c94b0227b3027d9838f22f1dce664958acb4107b935cc0037695ae545edc2a303bca98bf +"cookie@npm:^1.0.1": + version: 1.0.2 + resolution: "cookie@npm:1.0.2" + checksum: 10c0/fd25fe79e8fbcfcaf6aa61cd081c55d144eeeba755206c058682257cb38c4bd6795c6620de3f064c740695bb65b7949ebb1db7a95e4636efb8357a335ad3f54b languageName: node linkType: hard @@ -2829,55 +2558,38 @@ __metadata: languageName: node linkType: hard -"create-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "create-jest@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - prompts: "npm:^2.0.1" - bin: - create-jest: bin/create-jest.js - checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 languageName: node linkType: hard -"css-loader@npm:^6.10.0": - version: 6.10.0 - resolution: "css-loader@npm:6.10.0" +"css-loader@npm:^7.1.2": + version: 7.1.2 + resolution: "css-loader@npm:7.1.2" dependencies: icss-utils: "npm:^5.1.0" postcss: "npm:^8.4.33" - postcss-modules-extract-imports: "npm:^3.0.0" - postcss-modules-local-by-default: "npm:^4.0.4" - postcss-modules-scope: "npm:^3.1.1" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" postcss-modules-values: "npm:^4.0.0" postcss-value-parser: "npm:^4.2.0" semver: "npm:^7.5.4" peerDependencies: "@rspack/core": 0.x || 1.x - webpack: ^5.0.0 + webpack: ^5.27.0 peerDependenciesMeta: "@rspack/core": optional: true webpack: optional: true - checksum: 10c0/acadd2a93f505bf8a8d1c6912a476ef953585f195412b6aa1f2581053bcce8563b833f2a6666c1e1521f4b35fb315176563495a38933becc89e3143cfa7dce45 + checksum: 10c0/edec9ed71e3c416c9c6ad41c138834c94baf7629de3b97a3337ae8cec4a45e05c57bdb7c4b4d267229fc04b8970d0d1c0734ded8dcd0ac8c7c286b36facdbbf0 languageName: node linkType: hard @@ -2890,35 +2602,13 @@ __metadata: languageName: node linkType: hard -"cssom@npm:^0.5.0": - version: 0.5.0 - resolution: "cssom@npm:0.5.0" - checksum: 10c0/8c4121c243baf0678c65dcac29b201ff0067dfecf978de9d5c83b2ff127a8fdefd2bfd54577f5ad8c80ed7d2c8b489ae01c82023545d010c4ecb87683fb403dd - languageName: node - linkType: hard - -"cssom@npm:~0.3.6": - version: 0.3.8 - resolution: "cssom@npm:0.3.8" - checksum: 10c0/d74017b209440822f9e24d8782d6d2e808a8fdd58fa626a783337222fe1c87a518ba944d4c88499031b4786e68772c99dfae616638d71906fe9f203aeaf14411 - languageName: node - linkType: hard - -"cssstyle@npm:^2.3.0": - version: 2.3.0 - resolution: "cssstyle@npm:2.3.0" - dependencies: - cssom: "npm:~0.3.6" - checksum: 10c0/863400da2a458f73272b9a55ba7ff05de40d850f22eb4f37311abebd7eff801cf1cd2fb04c4c92b8c3daed83fe766e52e4112afb7bc88d86c63a9c2256a7d178 - languageName: node - linkType: hard - -"cssstyle@npm:^3.0.0": - version: 3.0.0 - resolution: "cssstyle@npm:3.0.0" +"cssstyle@npm:^4.2.1": + version: 4.3.0 + resolution: "cssstyle@npm:4.3.0" dependencies: - rrweb-cssom: "npm:^0.6.0" - checksum: 10c0/23acee092c1cec670fb7b8110e48abd740dc4e574d3b74848743067cb3377a86a1f64cf02606aabd7bb153785e68c2c1e09ce53295ddf7a4b470b3c7c55ec807 + "@asamuzakjp/css-color": "npm:^3.1.1" + rrweb-cssom: "npm:^0.8.0" + checksum: 10c0/770ccb288a99257fd0d5b129e03878f848e922d3b017358acb02e8dd530e8f0c7c6f74e6ae5367d715e2da36a490a734b4177fc1b78f3f08eca25f204a56a692 languageName: node linkType: hard @@ -2946,65 +2636,53 @@ __metadata: languageName: node linkType: hard -"data-urls@npm:^3.0.2": - version: 3.0.2 - resolution: "data-urls@npm:3.0.2" - dependencies: - abab: "npm:^2.0.6" - whatwg-mimetype: "npm:^3.0.0" - whatwg-url: "npm:^11.0.0" - checksum: 10c0/051c3aaaf3e961904f136aab095fcf6dff4db23a7fc759dd8ba7b3e6ba03fc07ef608086caad8ab910d864bd3b5e57d0d2f544725653d77c96a2c971567045f4 - languageName: node - linkType: hard - -"data-urls@npm:^4.0.0": - version: 4.0.0 - resolution: "data-urls@npm:4.0.0" +"data-urls@npm:^5.0.0": + version: 5.0.0 + resolution: "data-urls@npm:5.0.0" dependencies: - abab: "npm:^2.0.6" - whatwg-mimetype: "npm:^3.0.0" - whatwg-url: "npm:^12.0.0" - checksum: 10c0/928d9a21db31d3dcee125d514fddfeb88067c348b1225e9d2c6ca55db16e1cbe49bf58c092cae7163de958f415fd5c612c2aef2eef87896e097656fce205d766 + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^14.0.0" + checksum: 10c0/1b894d7d41c861f3a4ed2ae9b1c3f0909d4575ada02e36d3d3bc584bdd84278e20709070c79c3b3bff7ac98598cb191eb3e86a89a79ea4ee1ef360e1694f92ad languageName: node linkType: hard -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.6" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/8984119e59dbed906a11fcfb417d7d861936f16697a0e7216fe2c6c810f6b5e8f4a5281e73f2c28e8e9259027190ac4a33e2a65fdd7fa86ac06b76e838918583 + is-data-view: "npm:^1.0.2" + checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c languageName: node linkType: hard -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/b7d9e48a0cf5aefed9ab7d123559917b2d7e0d65531f43b2fd95b9d3a6b46042dd3fca597c42bba384e66b70d7ad66ff23932f8367b241f53d93af42cfe04ec2 + is-data-view: "npm:^1.0.2" + checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 languageName: node linkType: hard -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.6" + call-bound: "npm:^1.0.2" es-errors: "npm:^1.3.0" is-data-view: "npm:^1.0.1" - checksum: 10c0/21b0d2e53fd6e20cc4257c873bf6d36d77bd6185624b84076c0a1ddaa757b49aaf076254006341d35568e89f52eecd1ccb1a502cfb620f2beca04f48a6a62a8f + checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 languageName: node linkType: hard -"dateformat@npm:^4.6.3": - version: 4.6.3 - resolution: "dateformat@npm:4.6.3" - checksum: 10c0/e2023b905e8cfe2eb8444fb558562b524807a51cdfe712570f360f873271600b5c94aebffaf11efb285e2c072264a7cf243eadb68f3eba0f8cc85fb86cd25df6 +"dateformat@npm:^5.0.3": + version: 5.0.3 + resolution: "dateformat@npm:5.0.3" + checksum: 10c0/ccc7a5351080f7ae00496e246ed4d3afdba770f9a8267348d0d04387e23414ef219d9bb6f273a6d628c0ff5f0255ab75977d668dc7ab066b916a196950bdde9a languageName: node linkType: hard @@ -3015,34 +2693,38 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de languageName: node linkType: hard -"decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3": - version: 10.4.3 - resolution: "decimal.js@npm:10.4.3" - checksum: 10c0/6d60206689ff0911f0ce968d40f163304a6c1bc739927758e6efc7921cfa630130388966f16bf6ef6b838cb33679fbe8e7a78a2f3c478afce841fd55ac8fb8ee +"decimal.js@npm:^10.4.3": + version: 10.5.0 + resolution: "decimal.js@npm:10.5.0" + checksum: 10c0/785c35279df32762143914668df35948920b6c1c259b933e0519a69b7003fc0a5ed2a766b1e1dda02574450c566b21738a45f15e274b47c2ac02072c0d1f3ac3 languageName: node linkType: hard -"dedent@npm:^1.0.0": - version: 1.5.1 - resolution: "dedent@npm:1.5.1" - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - checksum: 10c0/f8612cd5b00aab58b18bb95572dca08dc2d49720bfa7201a444c3dae430291e8a06d4928614a6ec8764d713927f44bce9c990d3b8238fca2f430990ddc17c070 +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 10c0/7102cf3b7bb719c6b9c0db2e19bf0aa9318d141581befe8c7ce8ccd39af9eaa4346e5e05adef7f9bd7015da0f13a3a25dcfe306ef79dc8668aedbecb658dd247 languageName: node linkType: hard @@ -3053,10 +2735,20 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2": - version: 4.3.1 - resolution: "deepmerge@npm:4.3.1" - checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 +"default-browser-id@npm:^5.0.0": + version: 5.0.0 + resolution: "default-browser-id@npm:5.0.0" + checksum: 10c0/957fb886502594c8e645e812dfe93dba30ed82e8460d20ce39c53c5b0f3e2afb6ceaec2249083b90bdfbb4cb0f34e1f73fde3d68cac00becdbcfd894156b5ead + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.2.1 + resolution: "default-browser@npm:5.2.1" + dependencies: + bundle-name: "npm:^4.1.0" + default-browser-id: "npm:^5.0.0" + checksum: 10c0/73f17dc3c58026c55bb5538749597db31f9561c0193cd98604144b704a981c95a466f8ecc3c2db63d8bfd04fb0d426904834cfc91ae510c6aeb97e13c5167c4d languageName: node linkType: hard @@ -3071,7 +2763,14 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 10c0/5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -3103,26 +2802,49 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^3.0.0": - version: 3.1.0 - resolution: "detect-newline@npm:3.1.0" - checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d +"depd@npm:~1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 10c0/acb24aaf936ef9a227b6be6d495f0d2eb20108a9a6ad40585c5bda1a897031512fef6484e4fdbb80bd249fdaa82841fa1039f416ece03188e677ba11bcfda249 languageName: node linkType: hard -"diff-sequences@npm:^29.6.3": - version: 29.6.3 - resolution: "diff-sequences@npm:29.6.3" - checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 languageName: node linkType: hard -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 + languageName: node + linkType: hard + +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: 10c0/4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d + languageName: node + linkType: hard + +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + languageName: node + linkType: hard + +"dns-packet@npm:^5.2.2": + version: 5.6.1 + resolution: "dns-packet@npm:5.6.1" dependencies: - path-type: "npm:^4.0.0" - checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + "@leichtgewicht/ip-codec": "npm:^2.0.1" + checksum: 10c0/8948d3d03063fb68e04a1e386875f8c3bcc398fc375f535f2b438fad8f41bf1afa6f5e70893ba44f4ae884c089247e0a31045722fa6ff0f01d228da103f1811d languageName: node linkType: hard @@ -3144,19 +2866,15 @@ __metadata: languageName: node linkType: hard -"domexception@npm:^4.0.0": - version: 4.0.0 - resolution: "domexception@npm:4.0.0" +"dompurify@npm:^3.2.4": + version: 3.2.5 + resolution: "dompurify@npm:3.2.5" dependencies: - webidl-conversions: "npm:^7.0.0" - checksum: 10c0/774277cd9d4df033f852196e3c0077a34dbd15a96baa4d166e0e47138a80f4c0bdf0d94e4703e6ff5883cec56bb821a6fff84402d8a498e31de7c87eb932a294 - languageName: node - linkType: hard - -"dompurify@npm:^2.4.9": - version: 2.4.9 - resolution: "dompurify@npm:2.4.9" - checksum: 10c0/cb847f5eacd9ff326dfc4566875709d050dc78c58837cc3afb83386992f6e7002295358cb9f75d66a9b638fe6da71b7d02ffa82f121713f78f7f3891394dece8 + "@types/trusted-types": "npm:^2.0.7" + dependenciesMeta: + "@types/trusted-types": + optional: true + checksum: 10c0/b564167cc588933ad2d25c185296716bdd7124e9d2a75dac76efea831bb22d1230ce5205a1ab6ce4c1010bb32ac35f7a5cb2dd16c78cbf382111f1228362aa59 languageName: node linkType: hard @@ -3170,6 +2888,17 @@ __metadata: languageName: node linkType: hard +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + "duplexer@npm:^0.1.2": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -3184,17 +2913,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.668": - version: 1.4.724 - resolution: "electron-to-chromium@npm:1.4.724" - checksum: 10c0/bc7a3f153d952325bac09c1e67325bfc6d686130541550d1b7429cf72a1202256eed09299c4d8010684aa3683332336f05324acf03bc0be7c7060f4e0820c267 - languageName: node - linkType: hard - -"emittery@npm:^0.13.1": - version: 0.13.1 - resolution: "emittery@npm:0.13.1" - checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 languageName: node linkType: hard @@ -3212,10 +2934,17 @@ __metadata: languageName: node linkType: hard -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec + languageName: node + linkType: hard + +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb languageName: node linkType: hard @@ -3228,17 +2957,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.16.0": - version: 5.16.0 - resolution: "enhanced-resolve@npm:5.16.0" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 10c0/dd69669cbb638ccacefd03e04d5e195ee6a99b7f5f8012f86d2df7781834de357923e06064ea621137c4ce0b37cc12b872b4e6d1ac6ab15fe98e7f1dfbbb08c4 - languageName: node - linkType: hard - -"entities@npm:^4.4.0": +"entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 @@ -3252,15 +2971,6 @@ __metadata: languageName: node linkType: hard -"envinfo@npm:^7.7.3": - version: 7.11.1 - resolution: "envinfo@npm:7.11.1" - bin: - envinfo: dist/cli.js - checksum: 10c0/4550cce03d4d8a7b137d548faaf9c920356474231636cb4a6e74ae75db3b9cb04aa0a052ee391e2363af5db697166c207ba76e106338d758c6126830b3e16d75 - languageName: node - linkType: hard - "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -3268,155 +2978,152 @@ __metadata: languageName: node linkType: hard -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce - languageName: node - linkType: hard - -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": + version: 1.23.9 + resolution: "es-abstract@npm:1.23.9" dependencies: - array-buffer-byte-length: "npm:^1.0.1" - arraybuffer.prototype.slice: "npm:^1.0.3" + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - data-view-buffer: "npm:^1.0.1" - data-view-byte-length: "npm:^1.0.1" - data-view-byte-offset: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.0.3" - es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.4" - get-symbol-description: "npm:^1.0.2" - globalthis: "npm:^1.0.3" - gopd: "npm:^1.0.1" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.0" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" - internal-slot: "npm:^1.0.7" - is-array-buffer: "npm:^3.0.4" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.1" - is-negative-zero: "npm:^2.0.3" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.3" - is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.13" - is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" + is-data-view: "npm:^1.0.2" + is-regex: "npm:^1.2.1" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.0" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.3" object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.5" - regexp.prototype.flags: "npm:^1.5.2" - safe-array-concat: "npm:^1.1.2" - safe-regex-test: "npm:^1.0.3" - string.prototype.trim: "npm:^1.2.9" - string.prototype.trimend: "npm:^1.0.8" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.3" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.2" - typed-array-byte-length: "npm:^1.0.1" - typed-array-byte-offset: "npm:^1.0.2" - typed-array-length: "npm:^1.0.6" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.15" - checksum: 10c0/d27e9afafb225c6924bee9971a7f25f20c314f2d6cb93a63cada4ac11dcf42040896a6c22e5fb8f2a10767055ed4ddf400be3b1eb12297d281726de470b75666 + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.18" + checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b languageName: node linkType: hard -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c languageName: node linkType: hard -"es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.17": - version: 1.0.18 - resolution: "es-iterator-helpers@npm:1.0.18" +"es-iterator-helpers@npm:^1.2.1": + version: 1.2.1 + resolution: "es-iterator-helpers@npm:1.2.1" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.0" + es-abstract: "npm:^1.23.6" es-errors: "npm:^1.3.0" es-set-tostringtag: "npm:^2.0.3" function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - globalthis: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.7" - iterator.prototype: "npm:^1.1.2" - safe-array-concat: "npm:^1.1.2" - checksum: 10c0/93be402e01fa3d8bf62fcadd2fb3055126ffcfe8846911b10b85918ef46775252696c84e6191ec8125bedb61e92242ad1a54a86118436ba19814720cb9ff4aed + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + iterator.prototype: "npm:^1.1.4" + safe-array-concat: "npm:^1.1.3" + checksum: 10c0/97e3125ca472d82d8aceea11b790397648b52c26d8768ea1c1ee6309ef45a8755bb63225a43f3150c7591cffc17caf5752459f1e70d583b4184370a8f04ebd2f languageName: node linkType: hard -"es-module-lexer@npm:^1.2.1": - version: 1.5.0 - resolution: "es-module-lexer@npm:1.5.0" - checksum: 10c0/d199853404f3381801eb102befb84a8fc48f93ed86b852c2461c2c4ad4bbbc91128f3d974ff9b8718628260ae3f36e661295ab3e419222868aa31269284e34c9 +"es-module-lexer@npm:^1.6.0": + version: 1.6.0 + resolution: "es-module-lexer@npm:1.6.0" + checksum: 10c0/667309454411c0b95c476025929881e71400d74a746ffa1ff4cb450bd87f8e33e8eef7854d68e401895039ac0bac64e7809acbebb6253e055dd49ea9e3ea9212 languageName: node linkType: hard -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: es-errors: "npm:^1.3.0" - checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 + checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" +"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" dependencies: - get-intrinsic: "npm:^1.2.4" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.1" - checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" +"es-shim-unscopables@npm:^1.0.2": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 + hasown: "npm:^2.0.2" + checksum: 10c0/1b9702c8a1823fc3ef39035a4e958802cf294dd21e917397c561d0b3e195f383b978359816b1732d02b255ccf63e1e4815da0065b95db8d7c992037be3bbbcdb languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" dependencies: - is-callable: "npm:^1.1.4" - is-date-object: "npm:^1.0.1" - is-symbol: "npm:^1.0.2" - checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.0.5" + is-symbol: "npm:^1.0.4" + checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b languageName: node linkType: hard -"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.53, es5-ext@npm:^0.10.62, es5-ext@npm:^0.10.64, es5-ext@npm:~0.10.14, es5-ext@npm:~0.10.2, es5-ext@npm:~0.10.46": +"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.62, es5-ext@npm:^0.10.64, es5-ext@npm:~0.10.14, es5-ext@npm:~0.10.2": version: 0.10.64 resolution: "es5-ext@npm:0.10.64" dependencies: @@ -3461,47 +3168,35 @@ __metadata: languageName: node linkType: hard -"esbuild-loader@npm:^4.1.0": - version: 4.1.0 - resolution: "esbuild-loader@npm:4.1.0" - dependencies: - esbuild: "npm:^0.20.0" - get-tsconfig: "npm:^4.7.0" - loader-utils: "npm:^2.0.4" - webpack-sources: "npm:^1.4.3" - peerDependencies: - webpack: ^4.40.0 || ^5.0.0 - checksum: 10c0/6752f48a88c85524ef316b5c7251e44f206da7aac4c63a02e8b4e8ff915d7215a7713710d41575dc749d0ac56cb0becf3f5b2cf543df875f4027b6009d73d7bc - languageName: node - linkType: hard - -"esbuild@npm:^0.20.0": - version: 0.20.2 - resolution: "esbuild@npm:0.20.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.20.2" - "@esbuild/android-arm": "npm:0.20.2" - "@esbuild/android-arm64": "npm:0.20.2" - "@esbuild/android-x64": "npm:0.20.2" - "@esbuild/darwin-arm64": "npm:0.20.2" - "@esbuild/darwin-x64": "npm:0.20.2" - "@esbuild/freebsd-arm64": "npm:0.20.2" - "@esbuild/freebsd-x64": "npm:0.20.2" - "@esbuild/linux-arm": "npm:0.20.2" - "@esbuild/linux-arm64": "npm:0.20.2" - "@esbuild/linux-ia32": "npm:0.20.2" - "@esbuild/linux-loong64": "npm:0.20.2" - "@esbuild/linux-mips64el": "npm:0.20.2" - "@esbuild/linux-ppc64": "npm:0.20.2" - "@esbuild/linux-riscv64": "npm:0.20.2" - "@esbuild/linux-s390x": "npm:0.20.2" - "@esbuild/linux-x64": "npm:0.20.2" - "@esbuild/netbsd-x64": "npm:0.20.2" - "@esbuild/openbsd-x64": "npm:0.20.2" - "@esbuild/sunos-x64": "npm:0.20.2" - "@esbuild/win32-arm64": "npm:0.20.2" - "@esbuild/win32-ia32": "npm:0.20.2" - "@esbuild/win32-x64": "npm:0.20.2" +"esbuild@npm:^0.25.0": + version: 0.25.2 + resolution: "esbuild@npm:0.25.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.2" + "@esbuild/android-arm": "npm:0.25.2" + "@esbuild/android-arm64": "npm:0.25.2" + "@esbuild/android-x64": "npm:0.25.2" + "@esbuild/darwin-arm64": "npm:0.25.2" + "@esbuild/darwin-x64": "npm:0.25.2" + "@esbuild/freebsd-arm64": "npm:0.25.2" + "@esbuild/freebsd-x64": "npm:0.25.2" + "@esbuild/linux-arm": "npm:0.25.2" + "@esbuild/linux-arm64": "npm:0.25.2" + "@esbuild/linux-ia32": "npm:0.25.2" + "@esbuild/linux-loong64": "npm:0.25.2" + "@esbuild/linux-mips64el": "npm:0.25.2" + "@esbuild/linux-ppc64": "npm:0.25.2" + "@esbuild/linux-riscv64": "npm:0.25.2" + "@esbuild/linux-s390x": "npm:0.25.2" + "@esbuild/linux-x64": "npm:0.25.2" + "@esbuild/netbsd-arm64": "npm:0.25.2" + "@esbuild/netbsd-x64": "npm:0.25.2" + "@esbuild/openbsd-arm64": "npm:0.25.2" + "@esbuild/openbsd-x64": "npm:0.25.2" + "@esbuild/sunos-x64": "npm:0.25.2" + "@esbuild/win32-arm64": "npm:0.25.2" + "@esbuild/win32-ia32": "npm:0.25.2" + "@esbuild/win32-x64": "npm:0.25.2" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -3537,8 +3232,12 @@ __metadata: optional: true "@esbuild/linux-x64": optional: true + "@esbuild/netbsd-arm64": + optional: true "@esbuild/netbsd-x64": optional: true + "@esbuild/openbsd-arm64": + optional: true "@esbuild/openbsd-x64": optional: true "@esbuild/sunos-x64": @@ -3551,14 +3250,14 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/66398f9fb2c65e456a3e649747b39af8a001e47963b25e86d9c09d2a48d61aa641b27da0ce5cad63df95ad246105e1d83e7fee0e1e22a0663def73b1c5101112 + checksum: 10c0/87ce0b78699c4d192b8cf7e9b688e9a0da10e6f58ff85a368bf3044ca1fa95626c98b769b5459352282e0065585b6f994a5e6699af5cccf9d31178960e2b58fd languageName: node linkType: hard "escalade@npm:^3.1.1": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 languageName: node linkType: hard @@ -3569,20 +3268,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 - languageName: node - linkType: hard - "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -3590,24 +3275,6 @@ __metadata: languageName: node linkType: hard -"escodegen@npm:^2.0.0": - version: 2.1.0 - resolution: "escodegen@npm:2.1.0" - dependencies: - esprima: "npm:^4.0.1" - estraverse: "npm:^5.2.0" - esutils: "npm:^2.0.2" - source-map: "npm:~0.6.1" - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: bin/escodegen.js - esgenerate: bin/esgenerate.js - checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 - languageName: node - linkType: hard - "eslint-config-prettier@npm:^9.1.0": version: 9.1.0 resolution: "eslint-config-prettier@npm:9.1.0" @@ -3620,80 +3287,61 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.34.1": - version: 7.34.1 - resolution: "eslint-plugin-react@npm:7.34.1" - dependencies: - array-includes: "npm:^3.1.7" - array.prototype.findlast: "npm:^1.2.4" - array.prototype.flatmap: "npm:^1.3.2" - array.prototype.toreversed: "npm:^1.1.2" - array.prototype.tosorted: "npm:^1.1.3" + version: 7.37.5 + resolution: "eslint-plugin-react@npm:7.37.5" + dependencies: + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.3" + array.prototype.tosorted: "npm:^1.1.4" doctrine: "npm:^2.1.0" - es-iterator-helpers: "npm:^1.0.17" + es-iterator-helpers: "npm:^1.2.1" estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.7" - object.fromentries: "npm:^2.0.7" - object.hasown: "npm:^1.1.3" - object.values: "npm:^1.1.7" + object.entries: "npm:^1.1.9" + object.fromentries: "npm:^2.0.8" + object.values: "npm:^1.2.1" prop-types: "npm:^15.8.1" resolve: "npm:^2.0.0-next.5" semver: "npm:^6.3.1" - string.prototype.matchall: "npm:^4.0.10" + string.prototype.matchall: "npm:^4.0.12" + string.prototype.repeat: "npm:^1.0.0" peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/7c61b1314d37a4ac2f2474f9571f801f1a1a5d81dcd4abbb5d07145406518722fb792367267757ee116bde254be9753242d6b93c9619110398b3fe1746e4848c + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10c0/c850bfd556291d4d9234f5ca38db1436924a1013627c8ab1853f77cac73ec19b020e861e6c7b783436a48b6ffcdfba4547598235a37ad4611b6739f65fd8ad57 languageName: node linkType: hard "eslint-plugin-simple-import-sort@npm:^12.0.0": - version: 12.0.0 - resolution: "eslint-plugin-simple-import-sort@npm:12.0.0" + version: 12.1.1 + resolution: "eslint-plugin-simple-import-sort@npm:12.1.1" peerDependencies: eslint: ">=5.0.0" - checksum: 10c0/5405f01e4ca5b3c9a2a1b019e39fa858bb081872eb9602fb85d2e4913356fec0a9b3f997e957b1df0c370908ec124114148491e442d57e911b8249728d474398 + checksum: 10c0/0ad1907ad9ddbadd1db655db0a9d0b77076e274b793a77b982c8525d808d868e6ecfce24f3a411e8a1fa551077387f9ebb38c00956073970ebd7ee6a029ce2b3 languageName: node linkType: hard "eslint-plugin-sonarjs@npm:^0.25.0": - version: 0.25.0 - resolution: "eslint-plugin-sonarjs@npm:0.25.0" + version: 0.25.1 + resolution: "eslint-plugin-sonarjs@npm:0.25.1" peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/5fc9264f7fda28a2f58b4dcd928d86a9981eca80242e275f11bcd8d8fcecd11da3ee6d709f46e8c4aa644340f939bce46ae0501ff20e2301920d38152935907a + checksum: 10c0/41bb79da06a0a8d33936a1a2d0b8d46f5e63b86652f9310a7740cc6586bd1e3f8ef8b4fd0175af4c431e69fff31ea57661ba657e3bf31d9f9462a15b23537c11 languageName: node linkType: hard -"eslint-plugin-unused-imports@npm:^3.1.0": - version: 3.1.0 - resolution: "eslint-plugin-unused-imports@npm:3.1.0" - dependencies: - eslint-rule-composer: "npm:^0.3.0" +"eslint-plugin-unused-imports@npm:^4.1.4": + version: 4.1.4 + resolution: "eslint-plugin-unused-imports@npm:4.1.4" peerDependencies: - "@typescript-eslint/eslint-plugin": 6 - 7 - eslint: 8 + "@typescript-eslint/eslint-plugin": ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true - checksum: 10c0/712268fc10e7a5b169070c5ec2655733f4cdcf079848b2812ebe716b429a16cb87f315d3c0004cf128ba3874f68dd938eec8394a03587484e97e146494b48cda - languageName: node - linkType: hard - -"eslint-rule-composer@npm:^0.3.0": - version: 0.3.0 - resolution: "eslint-rule-composer@npm:0.3.0" - checksum: 10c0/1f0c40d209e1503a955101a0dbba37e7fc67c8aaa47a5b9ae0b0fcbae7022c86e52b3df2b1b9ffd658e16cd80f31fff92e7222460a44d8251e61d49e0af79a07 - languageName: node - linkType: hard - -"eslint-scope@npm:5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + checksum: 10c0/3899f64b0e8b23fa6b81e2754fc10f93d8741e051d70390a8100ca39af7878bde8625f234b76111af69562ef2512104b52c3703e986ccb3ac9adc07911896acf languageName: node linkType: hard @@ -3707,22 +3355,29 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 languageName: node linkType: hard +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 + languageName: node + linkType: hard + "eslint@npm:^8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" + version: 8.57.1 + resolution: "eslint@npm:8.57.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" "@ungap/structured-clone": "npm:^1.2.0" @@ -3758,7 +3413,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 10c0/00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 languageName: node linkType: hard @@ -3785,22 +3440,12 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0, esprima@npm:^4.0.1": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 - languageName: node - linkType: hard - "esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 languageName: node linkType: hard @@ -3813,13 +3458,6 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d - languageName: node - linkType: hard - "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -3827,6 +3465,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -3834,6 +3481,13 @@ __metadata: languageName: node linkType: hard +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + "event-emitter@npm:^0.3.5": version: 0.3.5 resolution: "event-emitter@npm:0.3.5" @@ -3844,54 +3498,70 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.2.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 +"eventemitter3@npm:^4.0.0": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b languageName: node linkType: hard -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.0" - human-signals: "npm:^2.1.0" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.1" - onetime: "npm:^5.1.2" - signal-exit: "npm:^3.0.3" - strip-final-newline: "npm:^2.0.0" - checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f +"exit-hook@npm:^4.0.0": + version: 4.0.0 + resolution: "exit-hook@npm:4.0.0" + checksum: 10c0/7fb33eaeb9050aee9479da9c93d42b796fb409c40e1d2b6ea2f40786ae7d7db6dc6a0f6ecc7bc24e479f957b7844bcb880044ded73320334743c64e3ecef48d7 languageName: node linkType: hard -"exit@npm:^0.1.2": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 +"expect-type@npm:^1.2.0": + version: 1.2.1 + resolution: "expect-type@npm:1.2.1" + checksum: 10c0/b775c9adab3c190dd0d398c722531726cdd6022849b4adba19dceab58dda7e000a7c6c872408cd73d665baa20d381eca36af4f7b393a4ba60dd10232d1fb8898 languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.7.0": - version: 29.7.0 - resolution: "expect@npm:29.7.0" - dependencies: - "@jest/expect-utils": "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 +"exponential-backoff@npm:^3.1.1": + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 languageName: node linkType: hard -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 +"express@npm:^4.21.2": + version: 4.21.2 + resolution: "express@npm:4.21.2" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.3" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.7.1" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.3.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.12" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.13.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10c0/38168fd0a32756600b56e6214afecf4fc79ec28eca7f7a91c2ab8d50df4f47562ca3f9dee412da7f5cea6b1a1544b33b40f9f8586dbacfbdada0fe90dbb10a1f languageName: node linkType: hard @@ -3925,13 +3595,6 @@ __metadata: languageName: node linkType: hard -"fast-content-type-parse@npm:^1.0.0": - version: 1.1.0 - resolution: "fast-content-type-parse@npm:1.1.0" - checksum: 10c0/882bf990fa5d64be1825ce183818db43900ece0d7ef184cb9409bae8ed1001acbe536a657b1496382cb3e308e71ab39cc399bbdae70cba1745eecaeca4e55384 - languageName: node - linkType: hard - "fast-decode-uri-component@npm:^1.0.1": version: 1.0.1 resolution: "fast-decode-uri-component@npm:1.0.1" @@ -3946,35 +3609,37 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" +"fast-glob@npm:^3.3.2": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b languageName: node linkType: hard -"fast-json-stringify@npm:^2.5.2": - version: 2.7.13 - resolution: "fast-json-stringify@npm:2.7.13" +"fast-json-stringify@npm:^6.0.0": + version: 6.0.1 + resolution: "fast-json-stringify@npm:6.0.1" dependencies: - ajv: "npm:^6.11.0" - deepmerge: "npm:^4.2.2" + "@fastify/merge-json-schemas": "npm:^0.2.0" + ajv: "npm:^8.12.0" + ajv-formats: "npm:^3.0.1" + fast-uri: "npm:^3.0.0" + json-schema-ref-resolver: "npm:^2.0.0" rfdc: "npm:^1.2.0" - string-similarity: "npm:^4.0.1" - checksum: 10c0/9c63e9e575bd75153afe456bd5c1d8afbfade79c79578f89fc0b8d599cdd65f3e731c826241caf472e11a915e6351a4c4c3f8295096be3fb01a79d2dbbbb22ed + checksum: 10c0/898aecd164707bced980fef61b0480dd80a47f87674d7643a75a60e5eca346018ba2552de200260030215d89f218d9cd7f342df14eec88ed44d45c81e4aa0eb4 languageName: node linkType: hard @@ -3985,73 +3650,86 @@ __metadata: languageName: node linkType: hard -"fast-redact@npm:^3.0.0": - version: 3.5.0 - resolution: "fast-redact@npm:3.5.0" - checksum: 10c0/7e2ce4aad6e7535e0775bf12bd3e4f2e53d8051d8b630e0fa9e67f68cb0b0e6070d2f7a94b1d0522ef07e32f7c7cda5755e2b677a6538f1e9070ca053c42343a +"fast-querystring@npm:^1.0.0": + version: 1.1.2 + resolution: "fast-querystring@npm:1.1.2" + dependencies: + fast-decode-uri-component: "npm:^1.0.1" + checksum: 10c0/e8223273a9b199722f760f5a047a77ad049a14bd444b821502cb8218f5925e3a5fffb56b64389bca73ab2ac6f1aa7aebbe4e203e5f6e53ff5978de97c0fde4e3 languageName: node linkType: hard -"fast-safe-stringify@npm:^2.0.8": - version: 2.1.1 - resolution: "fast-safe-stringify@npm:2.1.1" - checksum: 10c0/d90ec1c963394919828872f21edaa3ad6f1dddd288d2bd4e977027afff09f5db40f94e39536d4646f7e01761d704d72d51dce5af1b93717f3489ef808f5f4e4d +"fast-redact@npm:^3.1.1": + version: 3.5.0 + resolution: "fast-redact@npm:3.5.0" + checksum: 10c0/7e2ce4aad6e7535e0775bf12bd3e4f2e53d8051d8b630e0fa9e67f68cb0b0e6070d2f7a94b1d0522ef07e32f7c7cda5755e2b677a6538f1e9070ca053c42343a languageName: node linkType: hard -"fastest-levenshtein@npm:^1.0.12": - version: 1.0.16 - resolution: "fastest-levenshtein@npm:1.0.16" - checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b +"fast-uri@npm:^3.0.0, fast-uri@npm:^3.0.1": + version: 3.0.6 + resolution: "fast-uri@npm:3.0.6" + checksum: 10c0/74a513c2af0584448aee71ce56005185f81239eab7a2343110e5bad50c39ad4fb19c5a6f99783ead1cac7ccaf3461a6034fda89fffa2b30b6d99b9f21c2f9d29 languageName: node linkType: hard -"fastify-plugin@npm:^4.0.0": - version: 4.5.1 - resolution: "fastify-plugin@npm:4.5.1" - checksum: 10c0/f58f79cd9d3c88fd7f79a3270276c6339fc57bbe72ef14d20b73779193c404e317ac18e8eae2c5071b3909ebee45d7eb6871da4e65464ac64ed0d9746b4e9b9f +"fastify-plugin@npm:^5.0.0": + version: 5.0.1 + resolution: "fastify-plugin@npm:5.0.1" + checksum: 10c0/c5e5932e7b8c5713ff881adeade3e8ee8fc288e8249d79cd193a2a2438eef1ad58ae5814f12835acbf04025dbddf2628787cd845f3e550dee847f494a08f7c5b languageName: node linkType: hard -"fastify@npm:^3.29.5": - version: 3.29.5 - resolution: "fastify@npm:3.29.5" +"fastify@npm:^5.1.0": + version: 5.3.0 + resolution: "fastify@npm:5.3.0" + dependencies: + "@fastify/ajv-compiler": "npm:^4.0.0" + "@fastify/error": "npm:^4.0.0" + "@fastify/fast-json-stringify-compiler": "npm:^5.0.0" + "@fastify/proxy-addr": "npm:^5.0.0" + abstract-logging: "npm:^2.0.1" + avvio: "npm:^9.0.0" + fast-json-stringify: "npm:^6.0.0" + find-my-way: "npm:^9.0.0" + light-my-request: "npm:^6.0.0" + pino: "npm:^9.0.0" + process-warning: "npm:^5.0.0" + rfdc: "npm:^1.3.1" + secure-json-parse: "npm:^4.0.0" + semver: "npm:^7.6.0" + toad-cache: "npm:^3.7.0" + checksum: 10c0/db98502a47117f96748bad73eed61665893349ee917e1eaf0e913dcfa81a0b68a61665a7bb92533b6aaba5d3daacd032374a2e1621526e28456bae9ef8dcff78 + languageName: node + linkType: hard + +"fastq@npm:^1.17.1, fastq@npm:^1.6.0": + version: 1.19.1 + resolution: "fastq@npm:1.19.1" dependencies: - "@fastify/ajv-compiler": "npm:^1.0.0" - "@fastify/error": "npm:^2.0.0" - abstract-logging: "npm:^2.0.0" - avvio: "npm:^7.1.2" - fast-content-type-parse: "npm:^1.0.0" - fast-json-stringify: "npm:^2.5.2" - find-my-way: "npm:^4.5.0" - flatstr: "npm:^1.0.12" - light-my-request: "npm:^4.2.0" - pino: "npm:^6.13.0" - process-warning: "npm:^1.0.0" - proxy-addr: "npm:^2.0.7" - rfdc: "npm:^1.1.4" - secure-json-parse: "npm:^2.0.0" - semver: "npm:^7.3.2" - tiny-lru: "npm:^8.0.1" - checksum: 10c0/83a4850c38b1ac8934eff07030f2d0b5ed37b190cbaf05d22b3ca93f00e4735dfe62e48f183bcc5af76b6697512a32e692e6e1765cf51c69819216629f125b3b + reusify: "npm:^1.0.4" + checksum: 10c0/ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 languageName: node linkType: hard -"fastq@npm:^1.6.0, fastq@npm:^1.6.1": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" +"faye-websocket@npm:^0.11.3": + version: 0.11.4 + resolution: "faye-websocket@npm:0.11.4" dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + websocket-driver: "npm:>=0.5.1" + checksum: 10c0/c6052a0bb322778ce9f89af92890f6f4ce00d5ec92418a35e5f4c6864a4fe736fec0bcebd47eac7c0f0e979b01530746b1c85c83cb04bae789271abf19737420 languageName: node linkType: hard -"fb-watchman@npm:^2.0.0": - version: 2.0.2 - resolution: "fb-watchman@npm:2.0.2" - dependencies: - bser: "npm:2.1.1" - checksum: 10c0/feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581 +"fdir@npm:^6.4.3": + version: 6.4.3 + resolution: "fdir@npm:6.4.3" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/d13c10120e9625adf21d8d80481586200759928c19405a816b77dd28eaeb80e7c59c5def3e2941508045eb06d34eb47fad865ccc8bf98e6ab988bb0ed160fb6f languageName: node linkType: hard @@ -4064,18 +3742,6 @@ __metadata: languageName: node linkType: hard -"file-loader@npm:^6.2.0": - version: 6.2.0 - resolution: "file-loader@npm:6.2.0" - dependencies: - loader-utils: "npm:^2.0.0" - schema-utils: "npm:^3.0.0" - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/e176a57c2037ab0f78e5755dbf293a6b7f0f8392350a120bd03cc2ce2525bea017458ba28fea14ca535ff1848055e86d1a3a216bdb2561ef33395b27260a1dd3 - languageName: node - linkType: hard - "file-uri-to-path@npm:1.0.0": version: 1.0.0 resolution: "file-uri-to-path@npm:1.0.0" @@ -4083,34 +3749,38 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 languageName: node linkType: hard -"find-my-way@npm:^4.5.0": - version: 4.5.1 - resolution: "find-my-way@npm:4.5.1" +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" dependencies: - fast-decode-uri-component: "npm:^1.0.1" - fast-deep-equal: "npm:^3.1.3" - safe-regex2: "npm:^2.0.0" - semver-store: "npm:^0.3.0" - checksum: 10c0/3e56f50befde96d4b0a0a8118bd7fe283184e54ed61ac359ce62e7229229ab8b4a5aebe02edfcc126f0b6eef38660b59347293d61752bc845aae823cace8042a + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f languageName: node linkType: hard -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" +"find-my-way@npm:^9.0.0": + version: 9.3.0 + resolution: "find-my-way@npm:9.3.0" dependencies: - locate-path: "npm:^5.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + fast-deep-equal: "npm:^3.1.3" + fast-querystring: "npm:^1.0.0" + safe-regex2: "npm:^5.0.0" + checksum: 10c0/f221bc0c70b2c2a6f9282fd3e0ac1911fcbb68ac718da043ddcefdec3b9d884a54d6ef1bf92e1b2ff83400e50f3c22141206a8ea3308bf0e9e37fd177843425d languageName: node linkType: hard @@ -4135,66 +3805,51 @@ __metadata: languageName: node linkType: hard -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe - languageName: node - linkType: hard - -"flatstr@npm:^1.0.12": - version: 1.0.12 - resolution: "flatstr@npm:1.0.12" - checksum: 10c0/f99cf801fd3606e8b4aa96b93ec09caab42bc304526ff55a80db03db0ef73c9a014e983a6d72009c4f1bc50e2483d137041fae18a325dc0d851d045c4d6929a9 - languageName: node - linkType: hard - "flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 languageName: node linkType: hard -"follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: "npm:^1.1.3" - checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + is-callable: "npm:^1.2.7" + checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee languageName: node linkType: hard "foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" dependencies: - cross-spawn: "npm:^7.0.0" + cross-spawn: "npm:^7.0.6" signal-exit: "npm:^4.0.1" - checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 languageName: node linkType: hard -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" +"form-data@npm:^4.0.0, form-data@npm:^4.0.1": + version: 4.0.2 + resolution: "form-data@npm:4.0.2" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" mime-types: "npm:^2.1.12" - checksum: 10c0/cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + checksum: 10c0/e534b0cf025c831a0929bf4b9bbe1a9a6b03e273a8161f9947286b9b13bf8fb279c6944aae0070c4c311100c6d6dbb815cd955dc217728caf73fad8dc5b8ee9c languageName: node linkType: hard @@ -4205,6 +3860,13 @@ __metadata: languageName: node linkType: hard +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -4230,7 +3892,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -4240,7 +3902,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -4256,15 +3918,17 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" functions-have-names: "npm:^1.2.3" - checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 languageName: node linkType: hard @@ -4291,13 +3955,6 @@ __metadata: languageName: node linkType: hard -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 - languageName: node - linkType: hard - "geometry-interfaces@npm:^1.1.4": version: 1.1.4 resolution: "geometry-interfaces@npm:1.1.4" @@ -4312,50 +3969,42 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 - languageName: node - linkType: hard - -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a languageName: node linkType: hard -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.5" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c languageName: node linkType: hard -"get-tsconfig@npm:^4.7.0": - version: 4.7.3 - resolution: "get-tsconfig@npm:4.7.3" +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/b15ca9d5d0887ebfccadc9fe88b6ff3827a5691ec90e7608a5e9c74bef959c14aba62f6bb88ac7f50322395731789a2cf654244f00e10f4f76349911b6846d6f + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b languageName: node linkType: hard @@ -4377,29 +4026,39 @@ __metadata: languageName: node linkType: hard -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 +"glob@npm:^10.2.2": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.3.12 - resolution: "glob@npm:10.3.12" +"glob@npm:^11.0.0": + version: 11.0.1 + resolution: "glob@npm:11.0.1" dependencies: foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.6" - minimatch: "npm:^9.0.1" - minipass: "npm:^7.0.4" - path-scurry: "npm:^1.10.2" + jackspeak: "npm:^4.0.1" + minimatch: "npm:^10.0.0" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" bin: glob: dist/esm/bin.mjs - checksum: 10c0/f60cefdc1cf3f958b2bb5823e1b233727f04916d489dc4641d76914f016e6704421e06a83cbb68b0cb1cb9382298b7a88075b844ad2127fc9727ea22b18b0711 + checksum: 10c0/2b32588be52e9e90f914c7d8dec32f3144b81b84054b0f70e9adfebf37cd7014570489f2a79d21f7801b9a4bd4cca94f426966bfd00fb64a5b705cfe10da3a03 languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0, glob@npm:^7.2.3": +"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -4426,13 +4085,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -4442,39 +4094,24 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.3": - version: 1.0.3 - resolution: "globalthis@npm:1.0.3" - dependencies: - define-properties: "npm:^1.1.3" - checksum: 10c0/0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" dependencies: - array-union: "npm:^2.1.0" - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.2.9" - ignore: "npm:^5.2.0" - merge2: "npm:^1.4.1" - slash: "npm:^3.0.0" - checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -4497,6 +4134,13 @@ __metadata: languageName: node linkType: hard +"handle-thing@npm:^2.0.0": + version: 2.0.1 + resolution: "handle-thing@npm:2.0.1" + checksum: 10c0/7ae34ba286a3434f1993ebd1cc9c9e6b6d8ea672182db28b1afc0a7119229552fa7031e3e5f3cd32a76430ece4e94b7da6f12af2eb39d6239a7693e4bd63a998 + languageName: node + linkType: hard + "handlebars@npm:^4.7.7": version: 4.7.8 resolution: "handlebars@npm:4.7.8" @@ -4515,17 +4159,10 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 languageName: node linkType: hard @@ -4545,21 +4182,23 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 languageName: node linkType: hard -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -4575,7 +4214,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": +"hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -4594,23 +4233,35 @@ __metadata: languageName: node linkType: hard -"highlight.js@npm:^11.9.0": - version: 11.9.0 - resolution: "highlight.js@npm:11.9.0" - checksum: 10c0/27cfa8717dc9d200aecbdb383eb122d5f45ce715d2f468583785d36fbfe5076ce033abb02486dc13b407171721cda6f474ed3f3a5a8e8c3d91367fa5f51ee374 +"highlight.js@npm:^11.11.1": + version: 11.11.1 + resolution: "highlight.js@npm:11.11.1" + checksum: 10c0/40f53ac19dac079891fcefd5bd8a21cf2e8931fd47da5bd1dca73b7e4375c1defed0636fc39120c639b9c44119b7d110f7f0c15aa899557a5a1c8910f3c0144c languageName: node linkType: hard -"html-encoding-sniffer@npm:^3.0.0": - version: 3.0.0 - resolution: "html-encoding-sniffer@npm:3.0.0" +"hpack.js@npm:^2.1.6": + version: 2.1.6 + resolution: "hpack.js@npm:2.1.6" dependencies: - whatwg-encoding: "npm:^2.0.0" - checksum: 10c0/b17b3b0fb5d061d8eb15121c3b0b536376c3e295ecaf09ba48dd69c6b6c957839db124fe1e2b3f11329753a4ee01aa7dedf63b7677999e86da17fbbdd82c5386 + inherits: "npm:^2.0.1" + obuf: "npm:^1.0.0" + readable-stream: "npm:^2.0.1" + wbuf: "npm:^1.1.0" + checksum: 10c0/55b9e824430bab82a19d079cb6e33042d7d0640325678c9917fcc020c61d8a08ca671b6c942c7f0aae9bb6e4b67ffb50734a72f9e21d66407c3138c1983b70f0 languageName: node linkType: hard -"html-escaper@npm:^2.0.0, html-escaper@npm:^2.0.2": +"html-encoding-sniffer@npm:^4.0.0": + version: 4.0.0 + resolution: "html-encoding-sniffer@npm:4.0.0" + dependencies: + whatwg-encoding: "npm:^3.1.1" + checksum: 10c0/523398055dc61ac9b34718a719cb4aa691e4166f29187e211e1607de63dc25ac7af52ca7c9aead0c4b3c0415ffecb17326396e1202e2e86ff4bca4c0ee4c6140 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.2": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 @@ -4624,7 +4275,14 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:2.0.0": +"http-deceiver@npm:^1.2.7": + version: 1.2.7 + resolution: "http-deceiver@npm:1.2.7" + checksum: 10c0/8bb9b716f5fc55f54a451da7f49b9c695c3e45498a789634daec26b61e4add7c85613a4a9e53726c39d09de7a163891ecd6eb5809adb64500a840fd86fe81d03 + languageName: node + linkType: hard + +"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" dependencies: @@ -4637,6 +4295,25 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:~1.6.2": + version: 1.6.3 + resolution: "http-errors@npm:1.6.3" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.3" + setprototypeof: "npm:1.1.0" + statuses: "npm:>= 1.4.0 < 2" + checksum: 10c0/17ec4046ee974477778bfdd525936c254b872054703ec2caa4d6f099566b8adade636ae6aeeacb39302c5cd6e28fb407ebd937f500f5010d0b6850750414ff78 + languageName: node + linkType: hard + +"http-parser-js@npm:>=0.5.1": + version: 0.5.10 + resolution: "http-parser-js@npm:0.5.10" + checksum: 10c0/8bbcf1832a8d70b2bd515270112116333add88738a2cc05bfb94ba6bde3be4b33efee5611584113818d2bcf654fdc335b652503be5a6b4c0b95e46f214187d93 + languageName: node + linkType: hard + "http-proxy-agent@npm:^5.0.0": version: 5.0.0 resolution: "http-proxy-agent@npm:5.0.0" @@ -4648,7 +4325,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0": +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -4658,7 +4335,36 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": +"http-proxy-middleware@npm:^2.0.7": + version: 2.0.9 + resolution: "http-proxy-middleware@npm:2.0.9" + dependencies: + "@types/http-proxy": "npm:^1.17.8" + http-proxy: "npm:^1.18.1" + is-glob: "npm:^4.0.1" + is-plain-obj: "npm:^3.0.0" + micromatch: "npm:^4.0.2" + peerDependencies: + "@types/express": ^4.17.13 + peerDependenciesMeta: + "@types/express": + optional: true + checksum: 10c0/8e9032af625f7c9f2f0d318f6cdb14eb725cc16ffe7b4ccccea25cf591fa819bb7c3bb579e0b543e0ae9c73059b505a6d728290c757bff27bae526a6ed11c05e + languageName: node + linkType: hard + +"http-proxy@npm:^1.18.1": + version: 1.18.1 + resolution: "http-proxy@npm:1.18.1" + dependencies: + eventemitter3: "npm:^4.0.0" + follow-redirects: "npm:^1.0.0" + requires-port: "npm:^1.0.0" + checksum: 10c0/148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -4668,20 +4374,13 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": - version: 7.0.4 - resolution: "https-proxy-agent@npm:7.0.4" +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" dependencies: - agent-base: "npm:^7.0.2" + agent-base: "npm:^7.1.2" debug: "npm:4" - checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac languageName: node linkType: hard @@ -4694,6 +4393,22 @@ __metadata: languageName: node linkType: hard +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 10c0/885ba3177c7181d315a856ee9c0005ff8eb5dcb1ce9e9d61be70987895d934d84686c37c981cceeb53216d4c9c15c1cc25f1804e84cc6a74a16993c5d7fd0893 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + "iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -4712,39 +4427,27 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd +"ignore@npm:^5.2.0, ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard -"immutable@npm:^4.0.0": - version: 4.3.5 - resolution: "immutable@npm:4.3.5" - checksum: 10c0/63d2d7908241a955d18c7822fd2215b6e89ff5a1a33cc72cd475b013cbbdef7a705aa5170a51ce9f84a57f62fdddfaa34e7b5a14b33d8a43c65cc6a881d6e894 +"immutable@npm:^5.0.2": + version: 5.1.1 + resolution: "immutable@npm:5.1.1" + checksum: 10c0/5fd129ee9e448884003cc4f9e43bb91bab3b39dfeb3b49ddfb8bd563e0620eb47ae1f5b3ef96615d3ec38b52ab9a966dcacf9e39df00ed1a8ad062ddfba01cdf languageName: node linkType: hard "import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 - languageName: node - linkType: hard - -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" - dependencies: - pkg-dir: "npm:^4.2.0" - resolve-cwd: "npm:^3.0.0" - bin: - import-local-fixture: fixtures/cli.js - checksum: 10c0/c67ecea72f775fe8684ca3d057e54bdb2ae28c14bf261d2607c269c18ea0da7b730924c06262eca9aed4b8ab31e31d65bc60b50e7296c85908a56e2f7d41ecd2 + checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec languageName: node linkType: hard @@ -4779,21 +4482,28 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:~2.0.1": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.1, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard -"internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 + languageName: node + linkType: hard + +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" dependencies: es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 languageName: node linkType: hard @@ -4821,38 +4531,43 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" - dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 +"ipaddr.js@npm:^2.1.0": + version: 2.2.0 + resolution: "ipaddr.js@npm:2.2.0" + checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 languageName: node linkType: hard -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d languageName: node linkType: hard "is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" dependencies: - has-bigints: "npm:^1.0.1" - checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + has-bigints: "npm:^1.0.2" + checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 languageName: node linkType: hard @@ -4865,47 +4580,59 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f languageName: node linkType: hard -"is-core-module@npm:^2.13.0": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 + hasown: "npm:^2.0.2" + checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd languageName: node linkType: hard -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" is-typed-array: "npm:^1.1.13" - checksum: 10c0/a3e6ec84efe303da859107aed9b970e018e2bee7ffcb48e2f8096921a493608134240e672a2072577e5f23a729846241d9634806e8a0e51d9129c56d5f65442d + checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f + languageName: node + linkType: hard + +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 languageName: node linkType: hard @@ -4916,12 +4643,12 @@ __metadata: languageName: node linkType: hard -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/81caecc984d27b1a35c68741156fc651fb1fa5e3e6710d21410abc527eb226d400c0943a167922b2e920f6b3e58b0dede9aa795882b038b85f50b3a4b877db86 + call-bound: "npm:^1.0.3" + checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 languageName: node linkType: hard @@ -4932,19 +4659,15 @@ __metadata: languageName: node linkType: hard -"is-generator-fn@npm:^2.0.0": - version: 2.1.0 - resolution: "is-generator-fn@npm:2.1.0" - checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d - languageName: node - linkType: hard - "is-generator-function@npm:^1.0.10": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a languageName: node linkType: hard @@ -4957,6 +4680,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -4971,19 +4705,20 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.3": - version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e +"is-network-error@npm:^1.0.0": + version: 1.1.0 + resolution: "is-network-error@npm:1.1.0" + checksum: 10c0/89eef83c2a4cf43d853145ce175d1cf43183b7a58d48c7a03e7eed4eb395d0934c1f6d101255cdd8c8c2980ab529bfbe5dd9edb24e1c3c28d2b3c814469b5b7d languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 languageName: node linkType: hard @@ -5001,19 +4736,10 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: "npm:^3.0.1" - checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 - languageName: node - linkType: hard - -"is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c +"is-plain-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "is-plain-obj@npm:3.0.0" + checksum: 10c0/8e6483bfb051d42ec9c704c0ede051a821c6b6f9a6c7a3e3b55aa855e00981b0580c8f3b1f5e2e62649b39179b1abfee35d6f8086d999bfaa32c1908d29b07bc languageName: node linkType: hard @@ -5031,13 +4757,15 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 languageName: node linkType: hard @@ -5048,46 +4776,42 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: - call-bind: "npm:^1.0.7" - checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + call-bound: "npm:^1.0.3" + checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" dependencies: - has-symbols: "npm:^1.0.2" - checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e languageName: node linkType: hard -"is-typed-array@npm:^1.1.13": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" dependencies: - which-typed-array: "npm:^1.1.14" - checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca + which-typed-array: "npm:^1.1.16" + checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 languageName: node linkType: hard @@ -5098,22 +4822,31 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + call-bound: "npm:^1.0.3" + checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b languageName: node linkType: hard "is-weakset@npm:^2.0.3": - version: 2.0.3 - resolution: "is-weakset@npm:2.0.3" + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/8ad6141b6a400e7ce7c7442a13928c676d07b1f315ab77d9912920bf5f4170622f43126f111615788f26c3b1871158a6797c862233124507db0bcc33a9537d1a + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 + languageName: node + linkType: hard + +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: "npm:^1.0.0" + checksum: 10c0/d3317c11995690a32c362100225e22ba793678fe8732660c6de511ae71a0ff05b06980cf21f98a6bf40d7be0e9e9506f859abe00a1118287d63e53d0a3d06947 languageName: node linkType: hard @@ -5131,6 +4864,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -5145,594 +4885,49 @@ __metadata: languageName: node linkType: hard -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.2 - resolution: "istanbul-lib-coverage@npm:3.2.2" - checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^5.0.4": - version: 5.2.1 - resolution: "istanbul-lib-instrument@npm:5.2.1" - dependencies: - "@babel/core": "npm:^7.12.3" - "@babel/parser": "npm:^7.14.7" - "@istanbuljs/schema": "npm:^0.1.2" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^6.3.0" - checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.2 - resolution: "istanbul-lib-instrument@npm:6.0.2" - dependencies: - "@babel/core": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@istanbuljs/schema": "npm:^0.1.3" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^7.5.4" - checksum: 10c0/405c6ac037bf8c7ee7495980b0cd5544b2c53078c10534d0c9ceeb92a9ea7dcf8510f58ccfce31336458a8fa6ccef27b570bbb602abaa8c1650f5496a807477c - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.1 - resolution: "istanbul-lib-report@npm:3.0.1" - dependencies: - istanbul-lib-coverage: "npm:^3.0.0" - make-dir: "npm:^4.0.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 - languageName: node - linkType: hard - -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - source-map: "npm:^0.6.1" - checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.1.3": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" - dependencies: - html-escaper: "npm:^2.0.0" - istanbul-lib-report: "npm:^3.0.0" - checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 - languageName: node - linkType: hard - -"iterator.prototype@npm:^1.1.2": - version: 1.1.2 - resolution: "iterator.prototype@npm:1.1.2" +"iterator.prototype@npm:^1.1.4": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" dependencies: - define-properties: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - reflect.getprototypeof: "npm:^1.0.4" - set-function-name: "npm:^2.0.1" - checksum: 10c0/a32151326095e916f306990d909f6bbf23e3221999a18ba686419535dcd1749b10ded505e89334b77dc4c7a58a8508978f0eb16c2c8573e6d412eb7eb894ea79 + define-data-property: "npm:^1.1.4" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + get-proto: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 languageName: node linkType: hard -"jackspeak@npm:^2.3.6": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" dependencies: "@isaacs/cliui": "npm:^8.0.2" "@pkgjs/parseargs": "npm:^0.11.0" dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 - languageName: node - linkType: hard - -"jest-changed-files@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-changed-files@npm:29.7.0" - dependencies: - execa: "npm:^5.0.0" - jest-util: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b - languageName: node - linkType: hard - -"jest-circus@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-circus@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - co: "npm:^4.6.0" - dedent: "npm:^1.0.0" - is-generator-fn: "npm:^2.0.0" - jest-each: "npm:^29.7.0" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - pretty-format: "npm:^29.7.0" - pure-rand: "npm:^6.0.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e - languageName: node - linkType: hard - -"jest-cli@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-cli@npm:29.7.0" - dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - create-jest: "npm:^29.7.0" - exit: "npm:^0.1.2" - import-local: "npm:^3.0.2" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - yargs: "npm:^17.3.1" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a - languageName: node - linkType: hard - -"jest-config@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-config@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/test-sequencer": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-jest: "npm:^29.7.0" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - deepmerge: "npm:^4.2.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-circus: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - parse-json: "npm:^5.2.0" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-json-comments: "npm:^3.1.1" - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 - languageName: node - linkType: hard - -"jest-diff@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-diff@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - diff-sequences: "npm:^29.6.3" - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 - languageName: node - linkType: hard - -"jest-docblock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-docblock@npm:29.7.0" - dependencies: - detect-newline: "npm:^3.0.0" - checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 - languageName: node - linkType: hard - -"jest-each@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-each@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - jest-get-type: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - pretty-format: "npm:^29.7.0" - checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 - languageName: node - linkType: hard - -"jest-environment-jsdom@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-environment-jsdom@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/fake-timers": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/jsdom": "npm:^20.0.0" - "@types/node": "npm:*" - jest-mock: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jsdom: "npm:^20.0.0" - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: 10c0/139b94e2c8ec1bb5a46ce17df5211da65ce867354b3fd4e00fa6a0d1da95902df4cf7881273fc6ea937e5c325d39d6773f0d41b6c469363334de9d489d2c321f - languageName: node - linkType: hard - -"jest-environment-node@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-environment-node@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/fake-timers": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - jest-mock: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b - languageName: node - linkType: hard - -"jest-get-type@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-get-type@npm:29.6.3" - checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b - languageName: node - linkType: hard - -"jest-haste-map@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-haste-map@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/graceful-fs": "npm:^4.1.3" - "@types/node": "npm:*" - anymatch: "npm:^3.0.3" - fb-watchman: "npm:^2.0.0" - fsevents: "npm:^2.3.2" - graceful-fs: "npm:^4.2.9" - jest-regex-util: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - walker: "npm:^1.0.8" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c - languageName: node - linkType: hard - -"jest-leak-detector@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-leak-detector@npm:29.7.0" - dependencies: - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 - languageName: node - linkType: hard - -"jest-matcher-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-matcher-utils@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - jest-diff: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e - languageName: node - linkType: hard - -"jest-message-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-message-util@npm:29.7.0" - dependencies: - "@babel/code-frame": "npm:^7.12.13" - "@jest/types": "npm:^29.6.3" - "@types/stack-utils": "npm:^2.0.0" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 - languageName: node - linkType: hard - -"jest-mock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-mock@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - jest-util: "npm:^29.7.0" - checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac - languageName: node - linkType: hard - -"jest-pnp-resolver@npm:^1.2.2": - version: 1.2.3 - resolution: "jest-pnp-resolver@npm:1.2.3" - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac - languageName: node - linkType: hard - -"jest-regex-util@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-regex-util@npm:29.6.3" - checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b - languageName: node - linkType: hard - -"jest-resolve-dependencies@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve-dependencies@npm:29.7.0" - dependencies: - jest-regex-util: "npm:^29.6.3" - jest-snapshot: "npm:^29.7.0" - checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d - languageName: node - linkType: hard - -"jest-resolve@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-pnp-resolver: "npm:^1.2.2" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - resolve: "npm:^1.20.0" - resolve.exports: "npm:^2.0.0" - slash: "npm:^3.0.0" - checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 - languageName: node - linkType: hard - -"jest-runner@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runner@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/environment": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - emittery: "npm:^0.13.1" - graceful-fs: "npm:^4.2.9" - jest-docblock: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-leak-detector: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-resolve: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - source-map-support: "npm:0.5.13" - checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 - languageName: node - linkType: hard - -"jest-runtime@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runtime@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/fake-timers": "npm:^29.7.0" - "@jest/globals": "npm:^29.7.0" - "@jest/source-map": "npm:^29.6.3" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - cjs-module-lexer: "npm:^1.0.0" - collect-v8-coverage: "npm:^1.0.0" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-mock: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-bom: "npm:^4.0.0" - checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 - languageName: node - linkType: hard - -"jest-snapshot@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-snapshot@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@babel/generator": "npm:^7.7.2" - "@babel/plugin-syntax-jsx": "npm:^7.7.2" - "@babel/plugin-syntax-typescript": "npm:^7.7.2" - "@babel/types": "npm:^7.3.3" - "@jest/expect-utils": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" - chalk: "npm:^4.0.0" - expect: "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-diff: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - natural-compare: "npm:^1.4.0" - pretty-format: "npm:^29.7.0" - semver: "npm:^7.5.3" - checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 - languageName: node - linkType: hard - -"jest-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-util@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - graceful-fs: "npm:^4.2.9" - picomatch: "npm:^2.2.3" - checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 - languageName: node - linkType: hard - -"jest-validate@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-validate@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - camelcase: "npm:^6.2.0" - chalk: "npm:^4.0.0" - jest-get-type: "npm:^29.6.3" - leven: "npm:^3.1.0" - pretty-format: "npm:^29.7.0" - checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2 + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 languageName: node linkType: hard -"jest-watcher@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-watcher@npm:29.7.0" - dependencies: - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - emittery: "npm:^0.13.1" - jest-util: "npm:^29.7.0" - string-length: "npm:^4.0.1" - checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 - languageName: node - linkType: hard - -"jest-worker@npm:^27.4.5": - version: 27.5.1 - resolution: "jest-worker@npm:27.5.1" - dependencies: - "@types/node": "npm:*" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b - languageName: node - linkType: hard - -"jest-worker@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-worker@npm:29.7.0" - dependencies: - "@types/node": "npm:*" - jest-util: "npm:^29.7.0" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 - languageName: node - linkType: hard - -"jest@npm:^29.7.0": - version: 29.7.0 - resolution: "jest@npm:29.7.0" +"jackspeak@npm:^4.0.1": + version: 4.1.0 + resolution: "jackspeak@npm:4.1.0" dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - import-local: "npm:^3.0.2" - jest-cli: "npm:^29.7.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10c0/08a6a24a366c90b83aef3ad6ec41dcaaa65428ffab8d80bc7172add0fbb8b134a34f415ad288b2a6fbd406526e9a62abdb40ed4f399fbe00cb45c44056d4dce0 languageName: node linkType: hard -"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": +"js-tokens@npm:^3.0.0 || ^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed languageName: node linkType: hard -"js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b - languageName: node - linkType: hard - "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -5751,87 +4946,37 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^20.0.0": - version: 20.0.3 - resolution: "jsdom@npm:20.0.3" - dependencies: - abab: "npm:^2.0.6" - acorn: "npm:^8.8.1" - acorn-globals: "npm:^7.0.0" - cssom: "npm:^0.5.0" - cssstyle: "npm:^2.3.0" - data-urls: "npm:^3.0.2" - decimal.js: "npm:^10.4.2" - domexception: "npm:^4.0.0" - escodegen: "npm:^2.0.0" - form-data: "npm:^4.0.0" - html-encoding-sniffer: "npm:^3.0.0" - http-proxy-agent: "npm:^5.0.0" - https-proxy-agent: "npm:^5.0.1" - is-potential-custom-element-name: "npm:^1.0.1" - nwsapi: "npm:^2.2.2" - parse5: "npm:^7.1.1" - saxes: "npm:^6.0.0" - symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^4.1.2" - w3c-xmlserializer: "npm:^4.0.0" - webidl-conversions: "npm:^7.0.0" - whatwg-encoding: "npm:^2.0.0" - whatwg-mimetype: "npm:^3.0.0" - whatwg-url: "npm:^11.0.0" - ws: "npm:^8.11.0" - xml-name-validator: "npm:^4.0.0" - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: 10c0/b109073bb826a966db7828f46cb1d7371abecd30f182b143c52be5fe1ed84513bbbe995eb3d157241681fcd18331381e61e3dc004d4949f3a63bca02f6214902 - languageName: node - linkType: hard - -"jsdom@npm:^22.1.0": - version: 22.1.0 - resolution: "jsdom@npm:22.1.0" +"jsdom@npm:^26.0.0": + version: 26.0.0 + resolution: "jsdom@npm:26.0.0" dependencies: - abab: "npm:^2.0.6" - cssstyle: "npm:^3.0.0" - data-urls: "npm:^4.0.0" + cssstyle: "npm:^4.2.1" + data-urls: "npm:^5.0.0" decimal.js: "npm:^10.4.3" - domexception: "npm:^4.0.0" - form-data: "npm:^4.0.0" - html-encoding-sniffer: "npm:^3.0.0" - http-proxy-agent: "npm:^5.0.0" - https-proxy-agent: "npm:^5.0.1" + form-data: "npm:^4.0.1" + html-encoding-sniffer: "npm:^4.0.0" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.6" is-potential-custom-element-name: "npm:^1.0.1" - nwsapi: "npm:^2.2.4" - parse5: "npm:^7.1.2" - rrweb-cssom: "npm:^0.6.0" + nwsapi: "npm:^2.2.16" + parse5: "npm:^7.2.1" + rrweb-cssom: "npm:^0.8.0" saxes: "npm:^6.0.0" symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^4.1.2" - w3c-xmlserializer: "npm:^4.0.0" + tough-cookie: "npm:^5.0.0" + w3c-xmlserializer: "npm:^5.0.0" webidl-conversions: "npm:^7.0.0" - whatwg-encoding: "npm:^2.0.0" - whatwg-mimetype: "npm:^3.0.0" - whatwg-url: "npm:^12.0.1" - ws: "npm:^8.13.0" - xml-name-validator: "npm:^4.0.0" + whatwg-encoding: "npm:^3.1.1" + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^14.1.0" + ws: "npm:^8.18.0" + xml-name-validator: "npm:^5.0.0" peerDependencies: - canvas: ^2.5.0 + canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true - checksum: 10c0/a1c1501c611d1fe833e0a28796a234325aa09d4c597a9d8ccf6970004a9d946d261469502eadb555bdd7a55f5a2fbf3ce60c727cd99acb0d63f257fb9afcd33d - languageName: node - linkType: hard - -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + checksum: 10c0/e48725ba4027edcfc9bca5799eaec72c6561ecffe3675a8ff87fe9c3541ca4ff9f82b4eff5b3d9c527302da0d859b2f60e9364347a5d42b77f5c76c436c569dc languageName: node linkType: hard @@ -5842,10 +4987,12 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 +"json-schema-ref-resolver@npm:^2.0.0": + version: 2.0.1 + resolution: "json-schema-ref-resolver@npm:2.0.1" + dependencies: + dequal: "npm:^2.0.3" + checksum: 10c0/3ea894d79dd176b4ef31f1a3b7b335447b854780f2bc49af2918de0502d3eabad1889232a7a72c37f1c7ca429acc2eaad940ca5fd25f8ead044d5fecb00e0378 languageName: node linkType: hard @@ -5870,22 +5017,6 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c - languageName: node - linkType: hard - -"jsonc-parser@npm:^3.2.0": - version: 3.2.1 - resolution: "jsonc-parser@npm:3.2.1" - checksum: 10c0/ada66dec143d7f9cb0e2d0d29c69e9ce40d20f3a4cb96b0c6efb745025ac7f9ba647d7ac0990d0adfc37a2d2ae084a12009a9c833dbdbeadf648879a99b9df89 - languageName: node - linkType: hard - "jsx-ast-utils@npm:^2.4.1 || ^3.0.0": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -5907,24 +5038,13 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.2": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 - languageName: node - linkType: hard - -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b - languageName: node - linkType: hard - -"leven@npm:^3.1.0": - version: 3.1.0 - resolution: "leven@npm:3.1.0" - checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df +"launch-editor@npm:^2.6.1": + version: 2.10.0 + resolution: "launch-editor@npm:2.10.0" + dependencies: + picocolors: "npm:^1.0.0" + shell-quote: "npm:^1.8.1" + checksum: 10c0/8b5a26be6b0da1da039ed2254b837dea0651a6406ea4dc4c9a5b28ea72862f1b12880135c495baf9d8a08997473b44034172506781744cf82e155451a40b7d51 languageName: node linkType: hard @@ -5938,49 +5058,14 @@ __metadata: languageName: node linkType: hard -"light-my-request@npm:^4.2.0": - version: 4.12.0 - resolution: "light-my-request@npm:4.12.0" - dependencies: - ajv: "npm:^8.1.0" - cookie: "npm:^0.5.0" - process-warning: "npm:^1.0.0" - set-cookie-parser: "npm:^2.4.1" - checksum: 10c0/d95b9e5bec2fe32ec02d77791c2e5786358f396f27c9c15c97f224e8bb94e357e143f89b67856f20ee2f980136f2c9ac3a934177f8d10b3c184a81c578b00e6f - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d - languageName: node - linkType: hard - -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 - languageName: node - linkType: hard - -"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" - dependencies: - big.js: "npm:^5.2.2" - emojis-list: "npm:^3.0.0" - json5: "npm:^2.1.2" - checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" +"light-my-request@npm:^6.0.0": + version: 6.6.0 + resolution: "light-my-request@npm:6.6.0" dependencies: - p-locate: "npm:^4.1.0" - checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + cookie: "npm:^1.0.1" + process-warning: "npm:^4.0.0" + set-cookie-parser: "npm:^2.6.0" + checksum: 10c0/1440853cd3822ab83fbb1be4456099082dec8e9e3a4ea35c9d8d7d17a7ab98c83ad0a4c39a73a8c2b31b9ca70c57506e5b7a929495c149463ca0daca0d90dc6f languageName: node linkType: hard @@ -6018,6 +5103,13 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0, loupe@npm:^3.1.3": + version: 3.1.3 + resolution: "loupe@npm:3.1.3" + checksum: 10c0/f5dab4144254677de83a35285be1b8aba58b3861439ce4ba65875d0d5f3445a4a496daef63100ccf02b2dbc25bf58c6db84c9cb0b96d6435331e9d0a33b48541 + languageName: node + linkType: hard + "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -6027,28 +5119,17 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.2.0 - resolution: "lru-cache@npm:10.2.0" - checksum: 10c0/c9847612aa2daaef102d30542a8d6d9b2c2bb36581c1bf0dc3ebf5e5f3352c772a749e604afae2e46873b930a9e9523743faac4e5b937c576ab29196774712ee - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 +"lru-cache@npm:^11.0.0": + version: 11.1.0 + resolution: "lru-cache@npm:11.1.0" + checksum: 10c0/85c312f7113f65fae6a62de7985348649937eb34fb3d212811acbf6704dc322a421788aca253b62838f1f07049a84cc513d88f494e373d3756514ad263670a64 languageName: node linkType: hard @@ -6068,12 +5149,12 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "make-dir@npm:4.0.0" +"magic-string@npm:^0.30.17": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" dependencies: - semver: "npm:^7.5.3" - checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 languageName: node linkType: hard @@ -6101,31 +5182,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.0 - resolution: "make-fetch-happen@npm:13.0.0" +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" + minipass-fetch: "npm:^4.0.0" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 - languageName: node - linkType: hard - -"makeerror@npm:1.0.12": - version: 1.0.12 - resolution: "makeerror@npm:1.0.12" - dependencies: - tmpl: "npm:1.0.5" - checksum: 10c0/b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 languageName: node linkType: hard @@ -6138,36 +5210,69 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 + languageName: node + linkType: hard + +"memfs@npm:^4.6.0": + version: 4.17.0 + resolution: "memfs@npm:4.17.0" + dependencies: + "@jsonjoy.com/json-pack": "npm:^1.0.3" + "@jsonjoy.com/util": "npm:^1.3.0" + tree-dump: "npm:^1.0.1" + tslib: "npm:^2.0.0" + checksum: 10c0/2901f69e80e1fbefa8aafe994a253fff6f34eb176d8b80d57476311611e516a11ab4dd93f852c8739fe04f2b57d6a4ca7a1828fa0bd401ce631bcac214b3d58b + languageName: node + linkType: hard + "memoizee@npm:^0.4.15": - version: 0.4.15 - resolution: "memoizee@npm:0.4.15" + version: 0.4.17 + resolution: "memoizee@npm:0.4.17" dependencies: - d: "npm:^1.0.1" - es5-ext: "npm:^0.10.53" + d: "npm:^1.0.2" + es5-ext: "npm:^0.10.64" es6-weak-map: "npm:^2.0.3" event-emitter: "npm:^0.3.5" is-promise: "npm:^2.2.2" lru-queue: "npm:^0.1.0" next-tick: "npm:^1.1.0" timers-ext: "npm:^0.1.7" - checksum: 10c0/297e65cd8256bdf24c48f5e158da80d4c9688db0d6e65c5dcc13fa768e782ddeb71aec36925359931b5efef0efc6666b5bb2af6deb3de63d4258a3821ed16fce + checksum: 10c0/19821d055f0f641e79b718f91d6d89a6c92840643234a6f4e91d42aa330e8406f06c47d3828931e177c38830aa9b959710e5b7f0013be452af46d0f9eae4baf4 languageName: node linkType: hard -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 languageName: node linkType: hard -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": +"merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb languageName: node linkType: hard +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + "microbuffer@npm:^1.0.0": version: 1.0.0 resolution: "microbuffer@npm:1.0.0" @@ -6175,13 +5280,13 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: - braces: "npm:^3.0.2" + braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 languageName: node linkType: hard @@ -6192,7 +5297,14 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27": +"mime-db@npm:>= 1.43.0 < 2": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.31, mime-types@npm:^2.1.35, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -6201,44 +5313,41 @@ __metadata: languageName: node linkType: hard -"mime@npm:^3.0.0": - version: 3.0.0 - resolution: "mime@npm:3.0.0" +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" bin: mime: cli.js - checksum: 10c0/402e792a8df1b2cc41cb77f0dcc46472b7944b7ec29cb5bbcd398624b6b97096728f1239766d3fdeb20551dd8d94738344c195a6ea10c4f906eb0356323b0531 + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 languageName: node linkType: hard -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 +"mime@npm:^3": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: 10c0/402e792a8df1b2cc41cb77f0dcc46472b7944b7ec29cb5bbcd398624b6b97096728f1239766d3fdeb20551dd8d94738344c195a6ea10c4f906eb0356323b0531 languageName: node linkType: hard -"mini-css-extract-plugin@npm:^2.8.1": - version: 2.8.1 - resolution: "mini-css-extract-plugin@npm:2.8.1" - dependencies: - schema-utils: "npm:^4.0.0" - tapable: "npm:^2.2.1" - peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/ef0064f32051294e76141ba74ddf139d313ba26f3abcef1a3906347ca75df8e69c490351bd4c2f373b0cf5c934f39c7d643c8615421c24e4d2c724345294f80a +"minimalistic-assert@npm:^1.0.0": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd languageName: node linkType: hard -"minimatch@npm:9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" +"minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + checksum: 10c0/e6c29a81fe83e1877ad51348306be2e8aeca18c88fdee7a99df44322314279e15799e41d7cb274e4e8bb0b451a3bc622d6182e157dfa1717d6cda75e9cd8cd5d languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -6256,12 +5365,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed languageName: node linkType: hard @@ -6305,18 +5414,18 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" dependencies: encoding: "npm:^0.1.13" minipass: "npm:^7.0.3" minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" + minizlib: "npm:^3.0.1" dependenciesMeta: encoding: optional: true - checksum: 10c0/1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 + checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c languageName: node linkType: hard @@ -6363,10 +5472,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 10c0/6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 languageName: node linkType: hard @@ -6380,6 +5489,15 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^3.0.1": + version: 3.0.2 + resolution: "minizlib@npm:3.0.2" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/9f3bd35e41d40d02469cb30470c55ccc21cae0db40e08d1d0b1dff01cc8cc89a6f78e9c5d2b7c844e485ec0a8abc2238111213fdc5b2038e6d1012eacf316f78 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -6389,42 +5507,63 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + languageName: node + linkType: hard + "mrmime@npm:^2.0.0": - version: 2.0.0 - resolution: "mrmime@npm:2.0.0" - checksum: 10c0/312b35ed288986aec90955410b21ed7427fd1e4ee318cb5fc18765c8d029eeded9444faa46589e5b1ed6b35fb2054a802ac8dcb917ddf6b3e189cb3bf11a965c + version: 2.0.1 + resolution: "mrmime@npm:2.0.1" + checksum: 10c0/af05afd95af202fdd620422f976ad67dc18e6ee29beb03dd1ce950ea6ef664de378e44197246df4c7cdd73d47f2e7143a6e26e473084b9e4aa2095c0ad1e1761 languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d languageName: node linkType: hard -"ms@npm:^2.0.0": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 languageName: node linkType: hard +"multicast-dns@npm:^7.2.5": + version: 7.2.5 + resolution: "multicast-dns@npm:7.2.5" + dependencies: + dns-packet: "npm:^5.2.2" + thunky: "npm:^1.0.2" + bin: + multicast-dns: cli.js + checksum: 10c0/5120171d4bdb1577764c5afa96e413353bff530d1b37081cb29cccc747f989eb1baf40574fe8e27060fc1aef72b59c042f72b9b208413de33bcf411343c69057 + languageName: node + linkType: hard + "nan@npm:^2.14.2": - version: 2.19.0 - resolution: "nan@npm:2.19.0" + version: 2.22.2 + resolution: "nan@npm:2.22.2" dependencies: node-gyp: "npm:latest" - checksum: 10c0/b8d05d75f92ee9d94affa50d0aa41b6c698254c848529452d7ab67c2e0d160a83f563bfe2cbd53e077944eceb48c757f83c93634c7c9ff404c9ec1ed4e5ced1a + checksum: 10c0/971f963b8120631880fa47a389c71b00cadc1c1b00ef8f147782a3f4387d4fc8195d0695911272d57438c11562fb27b24c4ae5f8c05d5e4eeb4478ba51bb73c5 languageName: node linkType: hard -"nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" +"nanoid@npm:^3.3.8": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" bin: nanoid: bin/nanoid.cjs - checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 + checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b languageName: node linkType: hard @@ -6444,13 +5583,27 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 languageName: node linkType: hard +"negotiator@npm:^0.6.3, negotiator@npm:~0.6.4": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -6458,7 +5611,7 @@ __metadata: languageName: node linkType: hard -"next-tick@npm:1, next-tick@npm:^1.1.0": +"next-tick@npm:^1.1.0": version: 1.1.0 resolution: "next-tick@npm:1.1.0" checksum: 10c0/3ba80dd805fcb336b4f52e010992f3e6175869c8d88bf4ff0a81d5d66e6049f89993463b28211613e58a6b7fe93ff5ccbba0da18d4fa574b96289e8f0b577f28 @@ -6475,6 +5628,22 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 + languageName: node + linkType: hard + +"node-forge@npm:^1": + version: 1.3.1 + resolution: "node-forge@npm:1.3.1" + checksum: 10c0/e882819b251a4321f9fc1d67c85d1501d3004b4ee889af822fd07f64de3d1a8e272ff00b689570af0465d65d6bf5074df9c76e900e0aff23e60b847f2a46fbe8 + languageName: node + linkType: hard + "node-gyp@npm:^9.0.0": version: 9.4.1 resolution: "node-gyp@npm:9.4.1" @@ -6497,36 +5666,22 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" + version: 11.2.0 + resolution: "node-gyp@npm:11.2.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^4.0.0" + tar: "npm:^7.4.3" + tinyglobby: "npm:^0.2.12" + which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c - languageName: node - linkType: hard - -"node-int64@npm:^0.4.0": - version: 0.4.0 - resolution: "node-int64@npm:0.4.0" - checksum: 10c0/a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a - languageName: node - linkType: hard - -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 + checksum: 10c0/bd8d8c76b06be761239b0c8680f655f6a6e90b48e44d43415b11c16f7e8c15be346fba0cbf71588c7cdfb52c419d928a7d3db353afc1d952d19756237d8f10b9 languageName: node linkType: hard @@ -6541,14 +5696,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.0 - resolution: "nopt@npm:7.2.0" +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" dependencies: - abbrev: "npm:^2.0.0" + abbrev: "npm:^3.0.0" bin: nopt: bin/nopt.js - checksum: 10c0/9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff + checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef languageName: node linkType: hard @@ -6559,15 +5714,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: "npm:^3.0.0" - checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac - languageName: node - linkType: hard - "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -6580,10 +5726,10 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.2.2, nwsapi@npm:^2.2.4": - version: 2.2.7 - resolution: "nwsapi@npm:2.2.7" - checksum: 10c0/44be198adae99208487a1c886c0a3712264f7bbafa44368ad96c003512fed2753d4e22890ca1e6edb2690c3456a169f2a3c33bfacde1905cf3bf01c7722464db +"nwsapi@npm:^2.2.16": + version: 2.2.20 + resolution: "nwsapi@npm:2.2.20" + checksum: 10c0/07f4dafa3186aef7c007863e90acd4342a34ba9d44b22f14f644fdb311f6086887e21c2fc15efaa826c2bc39ab2bc841364a1a630e7c87e0cb723ba59d729297 languageName: node linkType: hard @@ -6594,10 +5740,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 10c0/fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d +"object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 languageName: node linkType: hard @@ -6608,30 +5754,33 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" object-keys: "npm:^1.1.1" - checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 + checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc languageName: node linkType: hard -"object.entries@npm:^1.1.7": - version: 1.1.8 - resolution: "object.entries@npm:1.1.8" +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/db9ea979d2956a3bc26c262da4a4d212d36f374652cc4c13efdd069c1a519c16571c137e2893d1c46e1cb0e15c88fd6419eaf410c945f329f09835487d7e65d3 + es-object-atoms: "npm:^1.1.1" + checksum: 10c0/d4b8c1e586650407da03370845f029aa14076caca4e4d4afadbc69cfb5b78035fd3ee7be417141abdb0258fa142e59b11923b4c44d8b1255b28f5ffcc50da7db languageName: node linkType: hard -"object.fromentries@npm:^2.0.7": +"object.fromentries@npm:^2.0.8": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" dependencies: @@ -6643,25 +5792,45 @@ __metadata: languageName: node linkType: hard -"object.hasown@npm:^1.1.3": - version: 1.1.4 - resolution: "object.hasown@npm:1.1.4" +"object.values@npm:^1.1.6, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" es-object-atoms: "npm:^1.0.0" - checksum: 10c0/f23187b08d874ef1aea060118c8259eb7f99f93c15a50771d710569534119062b90e087b92952b2d0fb1bb8914d61fb0b43c57fb06f622aaad538fe6868ab987 + checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 languageName: node linkType: hard -"object.values@npm:^1.1.6, object.values@npm:^1.1.7": - version: 1.2.0 - resolution: "object.values@npm:1.2.0" +"obuf@npm:^1.0.0, obuf@npm:^1.1.2": + version: 1.1.2 + resolution: "obuf@npm:1.1.2" + checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 + languageName: node + linkType: hard + +"on-exit-leak-free@npm:^2.1.0": + version: 2.1.2 + resolution: "on-exit-leak-free@npm:2.1.2" + checksum: 10c0/faea2e1c9d696ecee919026c32be8d6a633a7ac1240b3b87e944a380e8a11dc9c95c4a1f8fb0568de7ab8db3823e790f12bda45296b1d111e341aad3922a0570 + languageName: node + linkType: hard + +"on-finished@npm:2.4.1, on-finished@npm:^2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/15809dc40fd6c5529501324fec5ff08570b7d70fb5ebbe8e2b3901afec35cf2b3dc484d1210c6c642cd3e7e0a5e18dd1d6850115337fef46bdae14ab0cb18ac3 + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 + languageName: node + linkType: hard + +"on-headers@npm:~1.0.2": + version: 1.0.2 + resolution: "on-headers@npm:1.0.2" + checksum: 10c0/f649e65c197bf31505a4c0444875db0258e198292f34b884d73c2f751e91792ef96bb5cf89aa0f4fecc2e4dc662461dda606b1274b0e564f539cae5d2f5fc32f languageName: node linkType: hard @@ -6674,12 +5843,15 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" +"open@npm:^10.0.3": + version: 10.1.0 + resolution: "open@npm:10.1.0" dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + default-browser: "npm:^5.2.1" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + is-wsl: "npm:^3.1.0" + checksum: 10c0/c86d0b94503d5f735f674158d5c5d339c25ec2927562f00ee74590727292ed23e1b8d9336cb41ffa7e1fa4d3641d29b199b4ea37c78cb557d72b511743e90ebb languageName: node linkType: hard @@ -6693,29 +5865,31 @@ __metadata: linkType: hard "optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - "@aashutoshrathi/word-wrap": "npm:^1.2.3" deep-is: "npm:^0.1.3" fast-levenshtein: "npm:^2.0.6" levn: "npm:^0.4.1" prelude-ls: "npm:^1.2.1" type-check: "npm:^0.4.0" - checksum: 10c0/66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 languageName: node linkType: hard -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" dependencies: - p-try: "npm:^2.0.0" - checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -6724,15 +5898,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: "npm:^2.2.0" - checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 - languageName: node - linkType: hard - "p-locate@npm:^5.0.0": version: 5.0.0 resolution: "p-locate@npm:5.0.0" @@ -6751,10 +5916,28 @@ __metadata: languageName: node linkType: hard -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + languageName: node + linkType: hard + +"p-retry@npm:^6.2.0": + version: 6.2.1 + resolution: "p-retry@npm:6.2.1" + dependencies: + "@types/retry": "npm:0.12.2" + is-network-error: "npm:^1.0.0" + retry: "npm:^0.13.1" + checksum: 10c0/10d014900107da2c7071ad60fffe4951675f09930b7a91681643ea224ae05649c05001d9e78436d902fe8b116d520dd1f60e72e091de097e2640979d56f3fb60 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b languageName: node linkType: hard @@ -6784,24 +5967,19 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" +"parse5@npm:^7.2.1": + version: 7.2.1 + resolution: "parse5@npm:7.2.1" dependencies: - "@babel/code-frame": "npm:^7.0.0" - error-ex: "npm:^1.3.1" - json-parse-even-better-errors: "npm:^2.3.0" - lines-and-columns: "npm:^1.1.6" - checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + entities: "npm:^4.5.0" + checksum: 10c0/829d37a0c709215a887e410a7118d754f8e1afd7edb529db95bc7bbf8045fb0266a7b67801331d8e8d9d073ea75793624ec27ce9ff3b96862c3b9008f4d68e80 languageName: node linkType: hard -"parse5@npm:^7.0.0, parse5@npm:^7.1.1, parse5@npm:^7.1.2": - version: 7.1.2 - resolution: "parse5@npm:7.1.2" - dependencies: - entities: "npm:^4.4.0" - checksum: 10c0/297d7af8224f4b5cb7f6617ecdae98eeaed7f8cbd78956c42785e230505d5a4f07cef352af10d3006fa5c1544b76b57784d3a22d861ae071bbc460c649482bf4 +"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 languageName: node linkType: hard @@ -6839,7 +6017,7 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": +"path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c @@ -6853,74 +6031,102 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.2": - version: 1.10.2 - resolution: "path-scurry@npm:1.10.2" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/d723777fbf9627f201e64656680f66ebd940957eebacf780e6cce1c2919c29c116678b2d7dbf8821b3a2caa758d125f4444005ccec886a25c8f324504e48e601 +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/3da4adedaa8e7ef8d6dc4f35a0ff8f05a9b4d8365f2b28047752b62d4c1ad73eec21e37b1579ef2d075920157856a3b52ae8309c480a6f1a8bbe06ff8e52b33c + languageName: node + linkType: hard + +"path-to-regexp@npm:0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b + languageName: node + linkType: hard + +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 languageName: node linkType: hard -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be languageName: node linkType: hard -"pino-std-serializers@npm:^3.1.0": - version: 3.2.0 - resolution: "pino-std-serializers@npm:3.2.0" - checksum: 10c0/ae08159372b5bbe69f13770a7f20ba7ded0bb97b2c6f42f780995582135ca907e66504f06371c12f991dbfcd489280f942786c02a9e8e952974d455cb0a477c9 +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc languageName: node linkType: hard -"pino@npm:^6.13.0": - version: 6.14.0 - resolution: "pino@npm:6.14.0" +"pino-abstract-transport@npm:^2.0.0": + version: 2.0.0 + resolution: "pino-abstract-transport@npm:2.0.0" dependencies: - fast-redact: "npm:^3.0.0" - fast-safe-stringify: "npm:^2.0.8" - flatstr: "npm:^1.0.12" - pino-std-serializers: "npm:^3.1.0" - process-warning: "npm:^1.0.0" - quick-format-unescaped: "npm:^4.0.3" - sonic-boom: "npm:^1.0.2" - bin: - pino: bin.js - checksum: 10c0/5d3cb22c804e2bf2439ace64a46a7901d0a138cb75715ad8a8bbcf3ddb09dc5e33a9fc8a49527c3345d317619748c6de94d28481911ae931c21b953e24048425 + split2: "npm:^4.0.0" + checksum: 10c0/02c05b8f2ffce0d7c774c8e588f61e8b77de8ccb5f8125afd4a7325c9ea0e6af7fb78168999657712ae843e4462bb70ac550dfd6284f930ee57f17f486f25a9f languageName: node linkType: hard -"pirates@npm:^4.0.4": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 +"pino-std-serializers@npm:^7.0.0": + version: 7.0.0 + resolution: "pino-std-serializers@npm:7.0.0" + checksum: 10c0/73e694d542e8de94445a03a98396cf383306de41fd75ecc07085d57ed7a57896198508a0dec6eefad8d701044af21eb27253ccc352586a03cf0d4a0bd25b4133 languageName: node linkType: hard -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" +"pino@npm:^9.0.0": + version: 9.6.0 + resolution: "pino@npm:9.6.0" dependencies: - find-up: "npm:^4.0.0" - checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + atomic-sleep: "npm:^1.0.0" + fast-redact: "npm:^3.1.1" + on-exit-leak-free: "npm:^2.1.0" + pino-abstract-transport: "npm:^2.0.0" + pino-std-serializers: "npm:^7.0.0" + process-warning: "npm:^4.0.0" + quick-format-unescaped: "npm:^4.0.3" + real-require: "npm:^0.2.0" + safe-stable-stringify: "npm:^2.3.1" + sonic-boom: "npm:^4.0.1" + thread-stream: "npm:^3.0.0" + bin: + pino: bin.js + checksum: 10c0/bcd1e9d9b301bea13b95689ca9ad7105ae9451928fb6c0b67b3e58c5fe37cea1d40665f3d6641e3da00be0bbc17b89031e67abbc8ea6aac6164f399309fd78e7 languageName: node linkType: hard @@ -6932,42 +6138,42 @@ __metadata: linkType: hard "possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 languageName: node linkType: hard -"postcss-modules-extract-imports@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-extract-imports@npm:3.0.0" +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 10c0/f8879d66d8162fb7a3fcd916d37574006c584ea509107b1cfb798a5e090175ef9470f601e46f0a305070d8ff2500e07489a5c1ac381c29a1dc1120e827ca7943 + checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 languageName: node linkType: hard -"postcss-modules-local-by-default@npm:^4.0.4": - version: 4.0.4 - resolution: "postcss-modules-local-by-default@npm:4.0.4" +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" dependencies: icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" + postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 10c0/9ebf464867eb10b29b73501b1466dcac8352ed852ef68ec23571f515daa74401d7ace9a6c72f354542081fdbb47d098c9bc6b05373b553a6e35779d072f967bb + checksum: 10c0/b0b83feb2a4b61f5383979d37f23116c99bc146eba1741ca3cf1acca0e4d0dbf293ac1810a6ab4eccbe1ee76440dd0a9eb2db5b3bba4f99fc1b3ded16baa6358 languageName: node linkType: hard -"postcss-modules-scope@npm:^3.1.1": - version: 3.1.1 - resolution: "postcss-modules-scope@npm:3.1.1" +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" dependencies: - postcss-selector-parser: "npm:^6.0.4" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.1.0 - checksum: 10c0/3ef6ac14fcda1581bc43e37622256bd87b99ea49c59b2aae648d057d57f5ecc634648cce9910166220a797567af674bc09246ccc010f1dd58d2863b805719109 + checksum: 10c0/bd2d81f79e3da0ef6365b8e2c78cc91469d05b58046b4601592cdeef6c4050ed8fe1478ae000a1608042fc7e692cb51fecbd2d9bce3f4eace4d32e883ffca10b languageName: node linkType: hard @@ -6982,13 +6188,13 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.0.16 - resolution: "postcss-selector-parser@npm:6.0.16" +"postcss-selector-parser@npm:^7.0.0": + version: 7.1.0 + resolution: "postcss-selector-parser@npm:7.1.0" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/0e11657cb3181aaf9ff67c2e59427c4df496b4a1b6a17063fae579813f80af79d444bf38f82eeb8b15b4679653fd3089e66ef0283f9aab01874d885e6cf1d2cf + checksum: 10c0/0fef257cfd1c0fe93c18a3f8a6e739b4438b527054fd77e9a62730a89b2d0ded1b59314a7e4aaa55bc256204f40830fecd2eb50f20f8cb7ab3a10b52aa06c8aa languageName: node linkType: hard @@ -6999,14 +6205,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.33": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" +"postcss@npm:^8.4.33, postcss@npm:^8.5.3": + version: 8.5.3 + resolution: "postcss@npm:8.5.3" dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.2.0" - checksum: 10c0/955407b8f70cf0c14acf35dab3615899a2a60a26718a63c848cf3c29f2467b0533991b985a2b994430d890bd7ec2b1963e36352b0774a19143b5f591540f7c06 + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 languageName: node linkType: hard @@ -7017,37 +6223,40 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.2.5": - version: 3.2.5 - resolution: "prettier@npm:3.2.5" +"prettier@npm:^3.5.3": + version: 3.5.3 + resolution: "prettier@npm:3.5.3" bin: prettier: bin/prettier.cjs - checksum: 10c0/ea327f37a7d46f2324a34ad35292af2ad4c4c3c3355da07313339d7e554320f66f65f91e856add8530157a733c6c4a897dc41b577056be5c24c40f739f5ee8c6 + checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": - version: 29.7.0 - resolution: "pretty-format@npm:29.7.0" - dependencies: - "@jest/schemas": "npm:^29.6.3" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^18.0.0" - checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 languageName: node linkType: hard -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 languageName: node linkType: hard -"process-warning@npm:^1.0.0": - version: 1.0.0 - resolution: "process-warning@npm:1.0.0" - checksum: 10c0/43ec4229d64eb5c58340c8aacade49eb5f6fd513eae54140abf365929ca20987f0a35c5868125e2b583cad4de8cd257beb5667d9cc539d9190a7a4c3014adf22 +"process-warning@npm:^4.0.0": + version: 4.0.1 + resolution: "process-warning@npm:4.0.1" + checksum: 10c0/577a268b9fd5c3d9f6dbb4348220099391d830905642845d591e7ee8b1e45043d98b7b9826a3c1379bdd1686cdfe0f6cf349cb812affc5853b662e6a9896579e + languageName: node + linkType: hard + +"process-warning@npm:^5.0.0": + version: 5.0.0 + resolution: "process-warning@npm:5.0.0" + checksum: 10c0/941f48863d368ec161e0b5890ba0c6af94170078f3d6b5e915c19b36fb59edb0dc2f8e834d25e0d375a8bf368a49d490f080508842168832b93489d17843ec29 languageName: node linkType: hard @@ -7068,16 +6277,6 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: "npm:^3.0.3" - sisteransi: "npm:^1.0.5" - checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 - languageName: node - linkType: hard - "prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" @@ -7089,7 +6288,7 @@ __metadata: languageName: node linkType: hard -"proxy-addr@npm:^2.0.7": +"proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" dependencies: @@ -7106,35 +6305,23 @@ __metadata: languageName: node linkType: hard -"psl@npm:^1.1.33": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 10c0/6a3f805fdab9442f44de4ba23880c4eba26b20c8e8e0830eff1cb31007f6825dace61d17203c58bfe36946842140c97a1ba7f67bc63ca2d88a7ee052b65d97ab - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.0": +"punycode@npm:^2.1.0, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard -"pure-rand@npm:^6.0.0": - version: 6.1.0 - resolution: "pure-rand@npm:6.1.0" - checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 - languageName: node - linkType: hard - -"querystringify@npm:^2.1.1": - version: 2.2.0 - resolution: "querystringify@npm:2.2.0" - checksum: 10c0/3258bc3dbdf322ff2663619afe5947c7926a6ef5fb78ad7d384602974c467fadfc8272af44f5eb8cddd0d011aae8fabf3a929a8eee4b86edcc0a21e6bd10f9aa +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 languageName: node linkType: hard -"queue-microtask@npm:^1.1.2, queue-microtask@npm:^1.2.2": +"queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 @@ -7148,24 +6335,34 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" +"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 languageName: node linkType: hard -"react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" +"react-dom@npm:^18.3.1": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.0" + scheduler: "npm:^0.23.2" peerDependencies: - react: ^18.2.0 - checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a + react: ^18.3.1 + checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 languageName: node linkType: hard @@ -7183,13 +6380,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: 10c0/6eb5e4b28028c23e2bfcf73371e72cd4162e4ac7ab445ddae2afe24e347a37d6dc22fae6e1748632cd43c6d4f9b8f86dcf26bf9275e1874f436d129952528ae0 - languageName: node - linkType: hard - "react-popper@npm:^2.3.0": version: 2.3.0 resolution: "react-popper@npm:2.3.0" @@ -7204,12 +6394,12 @@ __metadata: languageName: node linkType: hard -"react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" +"react@npm:^18.3.1": + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: loose-envify: "npm:^1.1.0" - checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 + checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 languageName: node linkType: hard @@ -7225,7 +6415,22 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^2.0.1": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -7236,6 +6441,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -7245,6 +6457,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.2.0": + version: 0.2.0 + resolution: "real-require@npm:0.2.0" + checksum: 10c0/23eea5623642f0477412ef8b91acd3969015a1501ed34992ada0e3af521d3c865bb2fe4cdbfec5fe4b505f6d1ef6a03e5c3652520837a8c3b53decff7e74b6a0 + languageName: node + linkType: hard + "rechoir@npm:^0.8.0": version: 0.8.0 resolution: "rechoir@npm:0.8.0" @@ -7254,37 +6473,33 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.6 - resolution: "reflect.getprototypeof@npm:1.0.6" +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.1" + es-abstract: "npm:^1.23.9" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - globalthis: "npm:^1.0.3" - which-builtin-type: "npm:^1.1.3" - checksum: 10c0/baf4ef8ee6ff341600f4720b251cf5a6cb552d6a6ab0fdc036988c451bf16f920e5feb0d46bd4f530a5cce568f1f7aca2d77447ca798920749cfc52783c39b55 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.14.1": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" +"regexp.prototype.flags@npm:^1.5.3": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: "npm:^1.0.6" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 10c0/0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 languageName: node linkType: hard @@ -7309,15 +6524,6 @@ __metadata: languageName: node linkType: hard -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: "npm:^5.0.0" - checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 - languageName: node - linkType: hard - "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -7325,37 +6531,16 @@ __metadata: languageName: node linkType: hard -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 - languageName: node - linkType: hard - -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab - languageName: node - linkType: hard - -"resolve.exports@npm:^2.0.0": - version: 2.0.2 - resolution: "resolve.exports@npm:2.0.2" - checksum: 10c0/cc4cffdc25447cf34730f388dca5021156ba9302a3bad3d7f168e790dc74b2827dff603f1bc6ad3d299bac269828dca96dd77e036dc9fba6a2a1807c47ab5c98 - languageName: node - linkType: hard - "resolve@npm:^1.20.0": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" + version: 1.22.10 + resolution: "resolve@npm:1.22.10" dependencies: - is-core-module: "npm:^2.13.0" + is-core-module: "npm:^2.16.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 languageName: node linkType: hard @@ -7373,15 +6558,15 @@ __metadata: linkType: hard "resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: - is-core-module: "npm:^2.13.0" + is-core-module: "npm:^2.16.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 languageName: node linkType: hard @@ -7398,10 +6583,10 @@ __metadata: languageName: node linkType: hard -"ret@npm:~0.2.0": - version: 0.2.2 - resolution: "ret@npm:0.2.2" - checksum: 10c0/1a41e543913cda851abb1dae4852efa97bb693ce58fde3b51cc1cae94e2599dd70b91ad6268a4a07fc238305be06fed91723ef6d08863c48a0d02e0a74b943cd +"ret@npm:~0.5.0": + version: 0.5.0 + resolution: "ret@npm:0.5.0" + checksum: 10c0/220868b194f87bf1998e32e409086eec6b39e860c052bf267f8ad4d0131706a9773d45fd3f91acfb1a7c928fce002b694ab86fdba90bc8d4b8df68fa8645c5cc languageName: node linkType: hard @@ -7412,17 +6597,24 @@ __metadata: languageName: node linkType: hard +"retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 + languageName: node + linkType: hard + "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa languageName: node linkType: hard -"rfdc@npm:^1.1.4, rfdc@npm:^1.2.0": - version: 1.3.1 - resolution: "rfdc@npm:1.3.1" - checksum: 10c0/69f65e3ed30970f8055fac9fbbef9ce578800ca19554eab1dcbffe73a4b8aef536bc4248313889cf25e3b4e38b212c721eabe30856575bf2b2bc3d90f8ba93ef +"rfdc@npm:^1.2.0, rfdc@npm:^1.3.1": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 languageName: node linkType: hard @@ -7437,71 +6629,406 @@ __metadata: languageName: node linkType: hard -"rrweb-cssom@npm:^0.6.0": - version: 0.6.0 - resolution: "rrweb-cssom@npm:0.6.0" - checksum: 10c0/3d9d90d53c2349ea9c8509c2690df5a4ef930c9cf8242aeb9425d4046f09d712bb01047e00da0e1c1dab5db35740b3d78fd45c3e7272f75d3724a563f27c30a3 +"rollup@npm:^4.30.1": + version: 4.40.0 + resolution: "rollup@npm:4.40.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.40.0" + "@rollup/rollup-android-arm64": "npm:4.40.0" + "@rollup/rollup-darwin-arm64": "npm:4.40.0" + "@rollup/rollup-darwin-x64": "npm:4.40.0" + "@rollup/rollup-freebsd-arm64": "npm:4.40.0" + "@rollup/rollup-freebsd-x64": "npm:4.40.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.40.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.40.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.40.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.40.0" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.40.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.40.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.40.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.40.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.40.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.40.0" + "@rollup/rollup-linux-x64-musl": "npm:4.40.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.40.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.40.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.40.0" + "@types/estree": "npm:1.0.7" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/90aa57487d4a9a7de1a47bf42a6091f83f1cb7fe1814650dfec278ab8ddae5736b86535d4c766493517720f334dfd4aa0635405ca8f4f36ed8d3c0f875f2a801 + languageName: node + linkType: hard + +"rrweb-cssom@npm:^0.8.0": + version: 0.8.0 + resolution: "rrweb-cssom@npm:0.8.0" + checksum: 10c0/56f2bfd56733adb92c0b56e274c43f864b8dd48784d6fe946ef5ff8d438234015e59ad837fc2ad54714b6421384141c1add4eb569e72054e350d1f8a50b8ac7b + languageName: node + linkType: hard + +"run-applescript@npm:^7.0.0": + version: 7.0.0 + resolution: "run-applescript@npm:7.0.0" + checksum: 10c0/bd821bbf154b8e6c8ecffeaf0c33cebbb78eb2987476c3f6b420d67ab4c5301faa905dec99ded76ebb3a7042b4e440189ae6d85bbbd3fc6e8d493347ecda8bfe + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"rxjs@npm:^7.4.0": + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" + isarray: "npm:^2.0.5" + checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 + languageName: node + linkType: hard + +"safe-regex2@npm:^5.0.0": + version: 5.0.0 + resolution: "safe-regex2@npm:5.0.0" + dependencies: + ret: "npm:~0.5.0" + checksum: 10c0/83d5b1b60a5a97cb71a6e615518ec4a47761b3600aba389089be59a417498185250db2368080afc2f5e91237d68809c6c634b97a2e1cc8bd56a4c7eef2eeb6cf + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"sass-embedded-android-arm64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-android-arm64@npm:1.86.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"sass-embedded-android-arm@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-android-arm@npm:1.86.3" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"sass-embedded-android-ia32@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-android-ia32@npm:1.86.3" + conditions: os=android & cpu=ia32 + languageName: node + linkType: hard + +"sass-embedded-android-riscv64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-android-riscv64@npm:1.86.3" + conditions: os=android & cpu=riscv64 + languageName: node + linkType: hard + +"sass-embedded-android-x64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-android-x64@npm:1.86.3" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"sass-embedded-darwin-arm64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-darwin-arm64@npm:1.86.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"sass-embedded-darwin-x64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-darwin-x64@npm:1.86.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"sass-embedded-linux-arm64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-arm64@npm:1.86.3" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"sass-embedded-linux-arm@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-arm@npm:1.86.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"sass-embedded-linux-ia32@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-ia32@npm:1.86.3" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"sass-embedded-linux-musl-arm64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-musl-arm64@npm:1.86.3" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"sass-embedded-linux-musl-arm@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-musl-arm@npm:1.86.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"sass-embedded-linux-musl-ia32@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-musl-ia32@npm:1.86.3" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"sass-embedded-linux-musl-riscv64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-musl-riscv64@npm:1.86.3" + conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 +"sass-embedded-linux-musl-x64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-musl-x64@npm:1.86.3" + conditions: os=linux & cpu=x64 languageName: node linkType: hard -"safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" - dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - has-symbols: "npm:^1.0.3" - isarray: "npm:^2.0.5" - checksum: 10c0/12f9fdb01c8585e199a347eacc3bae7b5164ae805cdc8c6707199dbad5b9e30001a50a43c4ee24dc9ea32dbb7279397850e9208a7e217f4d8b1cf5d90129dec9 +"sass-embedded-linux-riscv64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-riscv64@npm:1.86.3" + conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 +"sass-embedded-linux-x64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-linux-x64@npm:1.86.3" + conditions: os=linux & cpu=x64 languageName: node linkType: hard -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.6" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.1.4" - checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 +"sass-embedded-win32-arm64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-win32-arm64@npm:1.86.3" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"safe-regex2@npm:^2.0.0": - version: 2.0.0 - resolution: "safe-regex2@npm:2.0.0" - dependencies: - ret: "npm:~0.2.0" - checksum: 10c0/f499e4fc69caafd7dd8023759e69a32991baa66e90bec5e2a7777b907943b27068dbff4e7a32cc8231f1354fcb779142f419e85498ae1e37384dc60619509c27 +"sass-embedded-win32-ia32@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-win32-ia32@npm:1.86.3" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 +"sass-embedded-win32-x64@npm:1.86.3": + version: 1.86.3 + resolution: "sass-embedded-win32-x64@npm:1.86.3" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"sass-loader@npm:^14.1.1": - version: 14.1.1 - resolution: "sass-loader@npm:14.1.1" +"sass-embedded@npm:^1.85.1": + version: 1.86.3 + resolution: "sass-embedded@npm:1.86.3" + dependencies: + "@bufbuild/protobuf": "npm:^2.0.0" + buffer-builder: "npm:^0.2.0" + colorjs.io: "npm:^0.5.0" + immutable: "npm:^5.0.2" + rxjs: "npm:^7.4.0" + sass-embedded-android-arm: "npm:1.86.3" + sass-embedded-android-arm64: "npm:1.86.3" + sass-embedded-android-ia32: "npm:1.86.3" + sass-embedded-android-riscv64: "npm:1.86.3" + sass-embedded-android-x64: "npm:1.86.3" + sass-embedded-darwin-arm64: "npm:1.86.3" + sass-embedded-darwin-x64: "npm:1.86.3" + sass-embedded-linux-arm: "npm:1.86.3" + sass-embedded-linux-arm64: "npm:1.86.3" + sass-embedded-linux-ia32: "npm:1.86.3" + sass-embedded-linux-musl-arm: "npm:1.86.3" + sass-embedded-linux-musl-arm64: "npm:1.86.3" + sass-embedded-linux-musl-ia32: "npm:1.86.3" + sass-embedded-linux-musl-riscv64: "npm:1.86.3" + sass-embedded-linux-musl-x64: "npm:1.86.3" + sass-embedded-linux-riscv64: "npm:1.86.3" + sass-embedded-linux-x64: "npm:1.86.3" + sass-embedded-win32-arm64: "npm:1.86.3" + sass-embedded-win32-ia32: "npm:1.86.3" + sass-embedded-win32-x64: "npm:1.86.3" + supports-color: "npm:^8.1.1" + sync-child-process: "npm:^1.0.2" + varint: "npm:^6.0.0" + dependenciesMeta: + sass-embedded-android-arm: + optional: true + sass-embedded-android-arm64: + optional: true + sass-embedded-android-ia32: + optional: true + sass-embedded-android-riscv64: + optional: true + sass-embedded-android-x64: + optional: true + sass-embedded-darwin-arm64: + optional: true + sass-embedded-darwin-x64: + optional: true + sass-embedded-linux-arm: + optional: true + sass-embedded-linux-arm64: + optional: true + sass-embedded-linux-ia32: + optional: true + sass-embedded-linux-musl-arm: + optional: true + sass-embedded-linux-musl-arm64: + optional: true + sass-embedded-linux-musl-ia32: + optional: true + sass-embedded-linux-musl-riscv64: + optional: true + sass-embedded-linux-musl-x64: + optional: true + sass-embedded-linux-riscv64: + optional: true + sass-embedded-linux-x64: + optional: true + sass-embedded-win32-arm64: + optional: true + sass-embedded-win32-ia32: + optional: true + sass-embedded-win32-x64: + optional: true + bin: + sass: dist/bin/sass.js + checksum: 10c0/c16e796d038d79001761ed7e09dd71eba2f1b9284f04f55560513d3d28d29dd1dd15dd6f2257f36fb6841089d2d7a2f8e5a5272ded77a928f6189c60d17cc3dc + languageName: node + linkType: hard + +"sass-loader@npm:^16.0.3": + version: 16.0.5 + resolution: "sass-loader@npm:16.0.5" dependencies: neo-async: "npm:^2.6.2" peerDependencies: @@ -7521,27 +7048,31 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/303ae65c38019723c1d534d6c70ba051b2744ea52c9e07c1c761303962540e8f3147bd73ff0ce2767c7435bc76f544f5cbc5db03617689f30ec9ffb26494289d + checksum: 10c0/216422b7b9e6e3f22739dc96887d883d2415f188d5c47631fd28c80608b5fae71167b26d0c74a1e917614e4d494fa73b1190ad5ca2f587c1afee84dc1d30f003 languageName: node linkType: hard -"sass@npm:^1.72.0": - version: 1.72.0 - resolution: "sass@npm:1.72.0" +"sass@npm:^1.80.6": + version: 1.86.3 + resolution: "sass@npm:1.86.3" dependencies: - chokidar: "npm:>=3.0.0 <4.0.0" - immutable: "npm:^4.0.0" + "@parcel/watcher": "npm:^2.4.1" + chokidar: "npm:^4.0.0" + immutable: "npm:^5.0.2" source-map-js: "npm:>=0.6.2 <2.0.0" + dependenciesMeta: + "@parcel/watcher": + optional: true bin: sass: sass.js - checksum: 10c0/7df1bb470648edc4b528976b1b165c78d4c6731f680afac7cdc8324142f1ef4304598d317d98dac747a2ae8eee17271d760def90bba072021a8b19b459336ccd + checksum: 10c0/ba819a0828f732adf7a94cd8ca017bce92bc299ffb878836ed1da80a30612bfbbf56a5e42d6dff3ad80d919c2025afb42948fc7b54a7bc61a9a2d58e1e0c558a languageName: node linkType: hard "sax@npm:^1.2.4": - version: 1.3.0 - resolution: "sax@npm:1.3.0" - checksum: 10c0/599dbe0ba9d8bd55e92d920239b21d101823a6cedff71e542589303fa0fa8f3ece6cf608baca0c51be846a2e88365fac94a9101a9c341d94b98e30c4deea5bea + version: 1.4.1 + resolution: "sax@npm:1.4.1" + checksum: 10c0/6bf86318a254c5d898ede6bd3ded15daf68ae08a5495a2739564eb265cd13bcc64a07ab466fb204f67ce472bb534eb8612dac587435515169593f4fffa11de7c languageName: node linkType: hard @@ -7554,53 +7085,52 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: "npm:^1.1.0" - checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd - languageName: node - linkType: hard - -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.8" - ajv: "npm:^6.12.5" - ajv-keywords: "npm:^3.5.2" - checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 + checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 languageName: node linkType: hard -"schema-utils@npm:^4.0.0": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0": + version: 4.3.0 + resolution: "schema-utils@npm:4.3.0" dependencies: "@types/json-schema": "npm:^7.0.9" ajv: "npm:^8.9.0" ajv-formats: "npm:^2.1.1" ajv-keywords: "npm:^5.1.0" - checksum: 10c0/8dab7e7800316387fd8569870b4b668cfcecf95ac551e369ea799bbcbfb63fb0365366d4b59f64822c9f7904d8c5afcfaf5a6124a4b08783e558cd25f299a6b4 + checksum: 10c0/c23f0fa73ef71a01d4a2bb7af4c91e0d356ec640e071aa2d06ea5e67f042962bb7ac7c29a60a295bb0125878801bc3209197a2b8a833dd25bd38e37c3ed21427 languageName: node linkType: hard -"secure-json-parse@npm:^2.0.0": - version: 2.7.0 - resolution: "secure-json-parse@npm:2.7.0" - checksum: 10c0/f57eb6a44a38a3eeaf3548228585d769d788f59007454214fab9ed7f01fbf2e0f1929111da6db28cf0bcc1a2e89db5219a59e83eeaec3a54e413a0197ce879e4 +"secure-json-parse@npm:^4.0.0": + version: 4.0.0 + resolution: "secure-json-parse@npm:4.0.0" + checksum: 10c0/1a298cf00e1de91e833cee5eb406d6e77fb2f7eca9bef3902047d49e7f5d3e6c21b5de61ff73466c831e716430bfe87d732a6e645a7dabb5f1e8a8e4d3e15eb4 languageName: node linkType: hard -"semver-store@npm:^0.3.0": - version: 0.3.0 - resolution: "semver-store@npm:0.3.0" - checksum: 10c0/4197aecef21dce734e8053e990c27f179136b106dbba69a8f52c1fb82779c670e456b21bbd0193bf10abe129ee44aa817eda75a3470f50f7b9284920d8af4fba +"select-hose@npm:^2.0.0": + version: 2.0.0 + resolution: "select-hose@npm:2.0.0" + checksum: 10c0/01cc52edd29feddaf379efb4328aededa633f0ac43c64b11a8abd075ff34f05b0d280882c4fbcbdf1a0658202c9cd2ea8d5985174dcf9a2dac7e3a4996fa9b67 + languageName: node + linkType: hard + +"selfsigned@npm:^2.4.1": + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" + dependencies: + "@types/node-forge": "npm:^1.3.0" + node-forge: "npm:^1" + checksum: 10c0/521829ec36ea042f7e9963bf1da2ed040a815cf774422544b112ec53b7edc0bc50a0f8cc2ae7aa6cc19afa967c641fd96a15de0fc650c68651e41277d2e1df09 languageName: node linkType: hard -"semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -7609,14 +7139,33 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.6.0 - resolution: "semver@npm:7.6.0" - dependencies: - lru-cache: "npm:^6.0.0" +"semver@npm:^7.3.5, semver@npm:^7.5.4, semver@npm:^7.6.0": + version: 7.7.1 + resolution: "semver@npm:7.7.1" bin: semver: bin/semver.js - checksum: 10c0/fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 + checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 + languageName: node + linkType: hard + +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 languageName: node linkType: hard @@ -7631,12 +7180,30 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.1": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" +"serve-index@npm:^1.9.1": + version: 1.9.1 + resolution: "serve-index@npm:1.9.1" + dependencies: + accepts: "npm:~1.3.4" + batch: "npm:0.6.1" + debug: "npm:2.6.9" + escape-html: "npm:~1.0.3" + http-errors: "npm:~1.6.2" + mime-types: "npm:~2.1.17" + parseurl: "npm:~1.3.2" + checksum: 10c0/a666471a24196f74371edf2c3c7bcdd82adbac52f600804508754b5296c3567588bf694258b19e0cb23a567acfa20d9721bfdaed3286007b81f9741ada8a3a9c + languageName: node + linkType: hard + +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" dependencies: - randombytes: "npm:^2.1.0" - checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.19.0" + checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f languageName: node linkType: hard @@ -7647,14 +7214,14 @@ __metadata: languageName: node linkType: hard -"set-cookie-parser@npm:^2.4.1": - version: 2.6.0 - resolution: "set-cookie-parser@npm:2.6.0" - checksum: 10c0/739da029f0e56806a103fcd5501d9c475e19e77bd8274192d7ae5c374ae714a82bba9a7ac00b0330a18227c5644b08df9e442240527be578f5a6030f9bb2bb80 +"set-cookie-parser@npm:^2.6.0": + version: 2.7.1 + resolution: "set-cookie-parser@npm:2.7.1" + checksum: 10c0/060c198c4c92547ac15988256f445eae523f57f2ceefeccf52d30d75dedf6bff22b9c26f756bd44e8e560d44ff4ab2130b178bd2e52ef5571bf7be3bd7632d9a languageName: node linkType: hard -"set-function-length@npm:^1.2.1": +"set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" dependencies: @@ -7668,7 +7235,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -7680,6 +7247,24 @@ __metadata: languageName: node linkType: hard +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a + languageName: node + linkType: hard + +"setprototypeof@npm:1.1.0": + version: 1.1.0 + resolution: "setprototypeof@npm:1.1.0" + checksum: 10c0/a77b20876689c6a89c3b42f0c3596a9cae02f90fc902570cbd97198e9e8240382086c9303ad043e88cee10f61eae19f1004e51d885395a1e9bf49f9ebed12872 + languageName: node + linkType: hard + "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -7687,15 +7272,6 @@ __metadata: languageName: node linkType: hard -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: "npm:^6.0.2" - checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e - languageName: node - linkType: hard - "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -7712,19 +7288,69 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" +"shell-quote@npm:^1.8.1": + version: 1.8.2 + resolution: "shell-quote@npm:1.8.2" + checksum: 10c0/85fdd44f2ad76e723d34eb72c753f04d847ab64e9f1f10677e3f518d0e5b0752a176fd805297b30bb8c3a1556ebe6e77d2288dbd7b7b0110c7e941e9e9c20ce1 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.7" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 languageName: node linkType: hard -"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 + languageName: node + linkType: hard + +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -7749,20 +7375,6 @@ __metadata: languageName: node linkType: hard -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b - languageName: node - linkType: hard - "slugify@npm:^1.6.0": version: 1.6.6 resolution: "slugify@npm:1.6.6" @@ -7787,6 +7399,17 @@ __metadata: languageName: node linkType: hard +"sockjs@npm:^0.3.24": + version: 0.3.24 + resolution: "sockjs@npm:0.3.24" + dependencies: + faye-websocket: "npm:^0.11.3" + uuid: "npm:^8.3.2" + websocket-driver: "npm:^0.7.4" + checksum: 10c0/aa102c7d921bf430215754511c81ea7248f2dcdf268fbdb18e4d8183493a86b8793b164c636c52f474a886f747447c962741df2373888823271efdb9d2594f33 + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -7799,57 +7422,39 @@ __metadata: linkType: hard "socks-proxy-agent@npm:^8.0.3": - version: 8.0.3 - resolution: "socks-proxy-agent@npm:8.0.3" + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: "npm:^7.1.1" + agent-base: "npm:^7.1.2" debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 languageName: node linkType: hard -"socks@npm:^2.6.2, socks@npm:^2.7.1": - version: 2.8.1 - resolution: "socks@npm:2.8.1" +"socks@npm:^2.6.2, socks@npm:^2.8.3": + version: 2.8.4 + resolution: "socks@npm:2.8.4" dependencies: ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: 10c0/ac77b515c260473cc7c4452f09b20939e22510ce3ae48385c516d1d5784374d5cc75be3cb18ff66cc985a7f4f2ef8fef84e984c5ec70aad58355ed59241f40a8 + checksum: 10c0/00c3271e233ccf1fb83a3dd2060b94cc37817e0f797a93c560b9a7a86c4a0ec2961fb31263bdd24a3c28945e24868b5f063cd98744171d9e942c513454b50ae5 languageName: node linkType: hard -"sonic-boom@npm:^1.0.2": - version: 1.4.1 - resolution: "sonic-boom@npm:1.4.1" +"sonic-boom@npm:^4.0.1": + version: 4.2.0 + resolution: "sonic-boom@npm:4.2.0" dependencies: atomic-sleep: "npm:^1.0.0" - flatstr: "npm:^1.0.12" - checksum: 10c0/3498b835071365cc94aac0eae50c5ee3c2552a4e48cf6dce59ae2d995af6c62a8f529377852b39b073b8190b772a9fb2cdb48f515c0fec4948646dea862fb120 - languageName: node - linkType: hard - -"source-list-map@npm:^2.0.0": - version: 2.0.1 - resolution: "source-list-map@npm:2.0.1" - checksum: 10c0/2e5e421b185dcd857f46c3c70e2e711a65d717b78c5f795e2e248c9d67757882ea989b80ebc08cf164eeeda5f4be8aa95d3b990225070b2daaaf3257c5958149 - languageName: node - linkType: hard - -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4 + checksum: 10c0/ae897e6c2cd6d3cb7cdcf608bc182393b19c61c9413a85ce33ffd25891485589f39bece0db1de24381d0a38fc03d08c9862ded0c60f184f1b852f51f97af9684 languageName: node linkType: hard -"source-map-support@npm:0.5.13": - version: 0.5.13 - resolution: "source-map-support@npm:0.5.13" - dependencies: - buffer-from: "npm:^1.0.0" - source-map: "npm:^0.6.0" - checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf languageName: node linkType: hard @@ -7863,7 +7468,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 @@ -7877,6 +7482,40 @@ __metadata: languageName: node linkType: hard +"spdy-transport@npm:^3.0.0": + version: 3.0.0 + resolution: "spdy-transport@npm:3.0.0" + dependencies: + debug: "npm:^4.1.0" + detect-node: "npm:^2.0.4" + hpack.js: "npm:^2.1.6" + obuf: "npm:^1.1.2" + readable-stream: "npm:^3.0.6" + wbuf: "npm:^1.7.3" + checksum: 10c0/eaf7440fa90724fffc813c386d4a8a7427d967d6e46d7c51d8f8a533d1a6911b9823ea9218703debbae755337e85f110185d7a00ae22ec5c847077b908ce71bb + languageName: node + linkType: hard + +"spdy@npm:^4.0.2": + version: 4.0.2 + resolution: "spdy@npm:4.0.2" + dependencies: + debug: "npm:^4.1.0" + handle-thing: "npm:^2.0.0" + http-deceiver: "npm:^1.2.7" + select-hose: "npm:^2.0.0" + spdy-transport: "npm:^3.0.0" + checksum: 10c0/983509c0be9d06fd00bb9dff713c5b5d35d3ffd720db869acdd5ad7aa6fc0e02c2318b58f75328957d8ff772acdf1f7d19382b6047df342044ff3e2d6805ccdf + languageName: node + linkType: hard + +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 10c0/b292beb8ce9215f8c642bb68be6249c5a4c7f332fc8ecadae7be5cbdf1ea95addc95f0459ef2e7ad9d45fd1064698a097e4eb211c83e772b49bc0ee423e91534 + languageName: node + linkType: hard + "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -7891,12 +7530,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" dependencies: minipass: "npm:^7.0.3" - checksum: 10c0/b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d languageName: node linkType: hard @@ -7909,21 +7548,19 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:^2.0.3": - version: 2.0.6 - resolution: "stack-utils@npm:2.0.6" - dependencies: - escape-string-regexp: "npm:^2.0.0" - checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 languageName: node linkType: hard -"stacktrace-parser@npm:^0.1.10": - version: 0.1.10 - resolution: "stacktrace-parser@npm:0.1.10" +"stacktrace-parser@npm:^0.1.11": + version: 0.1.11 + resolution: "stacktrace-parser@npm:0.1.11" dependencies: type-fest: "npm:^0.7.1" - checksum: 10c0/f9c9cd55b0642a546e5f0516a87124fc496dcc2c082b96b156ed094c51e423314795cd1839cd4c59026349cf392d3414f54fc42165255602728588a58a9f72d3 + checksum: 10c0/4633d9afe8cd2f6c7fb2cebdee3cc8de7fd5f6f9736645fd08c0f66872a303061ce9cc0ccf46f4216dc94a7941b56e331012398dc0024dc25e46b5eb5d4ff018 languageName: node linkType: hard @@ -7934,20 +7571,17 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1": - version: 4.0.2 - resolution: "string-length@npm:4.0.2" - dependencies: - char-regex: "npm:^1.0.2" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c +"statuses@npm:>= 1.4.0 < 2": + version: 1.5.0 + resolution: "statuses@npm:1.5.0" + checksum: 10c0/e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 languageName: node linkType: hard -"string-similarity@npm:^4.0.1": - version: 4.0.4 - resolution: "string-similarity@npm:4.0.4" - checksum: 10c0/fce331b818efafa701f692ddc2e170bd3ceaf6e7ca56a445b36b139981effe0884d8edc794a65005e54304da55ba054edfcff16a339bd301c9b94983fbc62047 +"std-env@npm:^3.8.1": + version: 3.9.0 + resolution: "std-env@npm:3.9.0" + checksum: 10c0/4a6f9218aef3f41046c3c7ecf1f98df00b30a07f4f35c6d47b28329bc2531eef820828951c7d7b39a1c5eb19ad8a46e3ddfc7deb28f0a2f3ceebee11bab7ba50 languageName: node linkType: hard @@ -7973,46 +7607,61 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.10": - version: 4.0.11 - resolution: "string.prototype.matchall@npm:4.0.11" +"string.prototype.matchall@npm:^4.0.12": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" + es-abstract: "npm:^1.23.6" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.7" - regexp.prototype.flags: "npm:^1.5.2" + get-intrinsic: "npm:^1.2.6" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + regexp.prototype.flags: "npm:^1.5.3" set-function-name: "npm:^2.0.2" - side-channel: "npm:^1.0.6" - checksum: 10c0/915a2562ac9ab5e01b7be6fd8baa0b2b233a0a9aa975fcb2ec13cc26f08fb9a3e85d5abdaa533c99c6fc4c5b65b914eba3d80c4aff9792a4c9fed403f28f7d9d + side-channel: "npm:^1.1.0" + checksum: 10c0/1a53328ada73f4a77f1fdf1c79414700cf718d0a8ef6672af5603e709d26a24f2181208144aed7e858b1bcc1a0d08567a570abfb45567db4ae47637ed2c2f85c languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.9": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.7" + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.0" + es-abstract: "npm:^1.23.5" es-object-atoms: "npm:^1.0.0" - checksum: 10c0/dcef1a0fb61d255778155006b372dff8cc6c4394bc39869117e4241f41a2c52899c0d263ffc7738a1f9e61488c490b05c0427faa15151efad721e1a9fb2663c2 + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" define-properties: "npm:^1.2.1" es-object-atoms: "npm:^1.0.0" - checksum: 10c0/0a0b54c17c070551b38e756ae271865ac6cc5f60dabf2e7e343cceae7d9b02e1a1120a824e090e79da1b041a74464e8477e2da43e2775c85392be30a6f60963c + checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 languageName: node linkType: hard @@ -8043,6 +7692,15 @@ __metadata: languageName: node linkType: hard +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -8061,20 +7719,6 @@ __metadata: languageName: node linkType: hard -"strip-bom@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f - languageName: node - linkType: hard - "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -8082,24 +7726,6 @@ __metadata: languageName: node linkType: hard -"style-loader@npm:^3.3.4": - version: 3.3.4 - resolution: "style-loader@npm:3.3.4" - peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/8f8027fc5c6e91400cbb60066e7db3315810f8eaa0d19b2a254936eb0bec399ba8a7043b1789da9d05ab7c3ba50faf9267765ae0bf3571e48aa34ecdc774be37 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -8109,7 +7735,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0": +"supports-color@npm:^8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -8172,18 +7798,6 @@ __metadata: languageName: node linkType: hard -"swc-loader@npm:^0.2.6": - version: 0.2.6 - resolution: "swc-loader@npm:0.2.6" - dependencies: - "@swc/counter": "npm:^0.1.3" - peerDependencies: - "@swc/core": ^1.2.147 - webpack: ">=2" - checksum: 10c0/b06926c5cb153931589c2166aa4c7c052cc53c68758acdda480d1eb59ecddf7d74b168e33166c4f807cc9dbae4395de9d80a14ad43e265fffaa775638abf71ce - languageName: node - linkType: hard - "symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" @@ -8191,10 +7805,19 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 +"sync-child-process@npm:^1.0.2": + version: 1.0.2 + resolution: "sync-child-process@npm:1.0.2" + dependencies: + sync-message-port: "npm:^1.0.0" + checksum: 10c0/f73c87251346fba28da8ac5bc8ed4c9474504a5250ab4bd44582beae8e25c230e0a5b7b16076488fee1aed39a1865de5ed4cec19c6fa4efdbb1081c514615170 + languageName: node + linkType: hard + +"sync-message-port@npm:^1.0.0": + version: 1.1.3 + resolution: "sync-message-port@npm:1.1.3" + checksum: 10c0/d259b08ab6da284135ba45bc13724268688b469371259f5978b2905e2c79342032b9240093b2483e83cfeccfd3a5e8300978e67090385f9b6b38941fcce1aec4 languageName: node linkType: hard @@ -8212,50 +7835,31 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.20" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.26.0" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d languageName: node linkType: hard -"terser@npm:^5.26.0, terser@npm:^5.30.2": - version: 5.30.2 - resolution: "terser@npm:5.30.2" +"terser@npm:^5.39.0": + version: 5.39.0 + resolution: "terser@npm:5.39.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 10c0/6ad6beee2b8e2fdeb8b5451acfd88802becca7f2556ef2d1891b9ae90512f68d4a0d45558ceaf535f0a7cfaa152d7a7f4832a640ce3dca1ed9c4ef84c68893ee - languageName: node - linkType: hard - -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" - dependencies: - "@istanbuljs/schema": "npm:^0.1.2" - glob: "npm:^7.1.4" - minimatch: "npm:^3.0.4" - checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/83326545ea1aecd6261030568b6191ccfa4cb6aa61d9ea41746a52479f50017a78b77e4725fbbc207c5df841ffa66a773c5ac33636e95c7ab94fe7e0379ae5c7 languageName: node linkType: hard @@ -8278,12 +7882,15 @@ __metadata: version: 0.0.0-use.local resolution: "tgui-bench@workspace:packages/tgui-bench" dependencies: - "@fastify/static": "npm:^6.12.0" + "@fastify/static": "npm:^8.1.1" + "@types/react": "npm:^18.3.1" + "@types/react-dom": "npm:^18.3.1" common: "workspace:*" - fastify: "npm:^3.29.5" + fastify: "npm:^5.1.0" lodash: "npm:^4.17.21" platform: "npm:^1.3.6" - react: "npm:^18.2.0" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" tgui: "workspace:*" languageName: unknown linkType: soft @@ -8292,11 +7899,12 @@ __metadata: version: 0.0.0-use.local resolution: "tgui-dev-server@workspace:packages/tgui-dev-server" dependencies: - axios: "npm:^1.6.8" - glob: "npm:^7.2.3" + "@rspack/core": "npm:^1.3.7" + "@types/ws": "npm:^8.18.1" + axios: "npm:^1.8.4" source-map: "npm:^0.7.4" - stacktrace-parser: "npm:^0.1.10" - ws: "npm:^8.16.0" + stacktrace-parser: "npm:^0.1.11" + ws: "npm:^8.18.1" languageName: unknown linkType: soft @@ -8304,40 +7912,37 @@ __metadata: version: 0.0.0-use.local resolution: "tgui-panel@workspace:packages/tgui-panel" dependencies: - "@types/node": "npm:^20.12.3" - "@types/react": "npm:^18.2.74" + "@types/react": "npm:^18.3.1" + "@types/react-dom": "npm:^18.3.1" common: "workspace:*" - dompurify: "npm:^2.4.9" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" + dompurify: "npm:^3.2.4" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" tgui: "workspace:*" tgui-dev-server: "workspace:*" - tgui-polyfill: "workspace:*" languageName: unknown linkType: soft -"tgui-polyfill@workspace:*, tgui-polyfill@workspace:packages/tgui-polyfill": +"tgui-say@workspace:packages/tgui-say": version: 0.0.0-use.local - resolution: "tgui-polyfill@workspace:packages/tgui-polyfill" + resolution: "tgui-say@workspace:packages/tgui-say" dependencies: - core-js: "npm:^3.36.1" - regenerator-runtime: "npm:^0.14.1" - terser: "npm:^5.30.2" - unfetch: "npm:^5.0.0" + "@types/react": "npm:^18.3.1" + "@types/react-dom": "npm:^18.3.1" + common: "workspace:*" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" + tgui: "workspace:*" + vitest: "npm:^3.1.1" languageName: unknown linkType: soft -"tgui-say@workspace:packages/tgui-say": +"tgui-setup@workspace:packages/tgui-setup": version: 0.0.0-use.local - resolution: "tgui-say@workspace:packages/tgui-say" + resolution: "tgui-setup@workspace:packages/tgui-setup" dependencies: - "@types/react": "npm:^18.2.74" - "@types/react-dom": "npm:^18.2.24" - common: "workspace:*" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - tgui: "workspace:*" - tgui-polyfill: "workspace:*" + clean-css-cli: "npm:^5.6.3" + terser: "npm:^5.39.0" languageName: unknown linkType: soft @@ -8345,38 +7950,28 @@ __metadata: version: 0.0.0-use.local resolution: "tgui-workspace@workspace:." dependencies: - "@swc/core": "npm:^1.4.11" - "@swc/jest": "npm:^0.2.36" - "@types/jest": "npm:^29.5.12" - "@types/node": "npm:^20.12.3" - "@types/webpack-env": "npm:^1.18.4" - "@types/wicg-file-system-access": "npm:^2023.10.5" - "@typescript-eslint/parser": "npm:^7.5.0" - "@typescript-eslint/utils": "npm:^7.5.0" - css-loader: "npm:^6.10.0" - esbuild-loader: "npm:^4.1.0" + "@rspack/cli": "npm:^1.3.7" + "@rspack/core": "npm:^1.3.7" + "@types/node": "npm:^22.14.0" + "@types/webpack-env": "npm:^1.18.8" + "@types/wicg-file-system-access": "npm:^2023.10.6" + "@typescript-eslint/eslint-plugin": "npm:^8.28.0" + "@typescript-eslint/parser": "npm:^8.28.0" + "@typescript-eslint/utils": "npm:^8.28.0" + css-loader: "npm:^7.1.2" eslint: "npm:^8.57.0" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-react: "npm:^7.34.1" eslint-plugin-simple-import-sort: "npm:^12.0.0" eslint-plugin-sonarjs: "npm:^0.25.0" - eslint-plugin-unused-imports: "npm:^3.1.0" - file-loader: "npm:^6.2.0" - jest: "npm:^29.7.0" - jest-circus: "npm:^29.7.0" - jest-environment-jsdom: "npm:^29.7.0" - jsdom: "npm:^22.1.0" - mini-css-extract-plugin: "npm:^2.8.1" - prettier: "npm:^3.2.5" - sass: "npm:^1.72.0" - sass-loader: "npm:^14.1.1" - style-loader: "npm:^3.3.4" - swc-loader: "npm:^0.2.6" - typescript: "npm:^5.4.3" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.91.0" - webpack-bundle-analyzer: "npm:^4.10.1" - webpack-cli: "npm:^5.1.4" + eslint-plugin-unused-imports: "npm:^4.1.4" + jsdom: "npm:^26.0.0" + prettier: "npm:^3.5.3" + sass: "npm:^1.80.6" + sass-embedded: "npm:^1.85.1" + sass-loader: "npm:^16.0.3" + typescript: "npm:5.8.3" + vitest: "npm:^3.1.1" languageName: unknown linkType: soft @@ -8386,50 +7981,117 @@ __metadata: dependencies: "@popperjs/core": "npm:^2.11.8" "@types/marked": "npm:4.3.2" - "@types/react": "npm:^18.2.74" + "@types/react": "npm:^18.3.1" + "@types/react-dom": "npm:^18.3.1" common: "workspace:*" - dateformat: "npm:^4.6.3" - dompurify: "npm:^2.4.9" - highlight.js: "npm:^11.9.0" - jest: "npm:^29.7.0" + dateformat: "npm:^5.0.3" + dompurify: "npm:^3.2.4" + highlight.js: "npm:^11.11.1" js-yaml: "npm:^4.1.0" marked: "npm:^4.3.0" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" react-popper: "npm:^2.3.0" tgui-dev-server: "workspace:*" - tgui-polyfill: "workspace:*" + vitest: "npm:^3.1.1" languageName: unknown linkType: soft +"thingies@npm:^1.20.0": + version: 1.21.0 + resolution: "thingies@npm:1.21.0" + peerDependencies: + tslib: ^2 + checksum: 10c0/7570ee855aecb73185a672ecf3eb1c287a6512bf5476449388433b2d4debcf78100bc8bfd439b0edd38d2bc3bfb8341de5ce85b8557dec66d0f27b962c9a8bc1 + languageName: node + linkType: hard + +"thread-stream@npm:^3.0.0": + version: 3.1.0 + resolution: "thread-stream@npm:3.1.0" + dependencies: + real-require: "npm:^0.2.0" + checksum: 10c0/c36118379940b77a6ef3e6f4d5dd31e97b8210c3f7b9a54eb8fe6358ab173f6d0acfaf69b9c3db024b948c0c5fd2a7df93e2e49151af02076b35ada3205ec9a6 + languageName: node + linkType: hard + +"thunky@npm:^1.0.2": + version: 1.1.0 + resolution: "thunky@npm:1.1.0" + checksum: 10c0/369764f39de1ce1de2ba2fa922db4a3f92e9c7f33bcc9a713241bc1f4a5238b484c17e0d36d1d533c625efb00e9e82c3e45f80b47586945557b45abb890156d2 + languageName: node + linkType: hard + "timers-ext@npm:^0.1.7": - version: 0.1.7 - resolution: "timers-ext@npm:0.1.7" + version: 0.1.8 + resolution: "timers-ext@npm:0.1.8" dependencies: - es5-ext: "npm:~0.10.46" - next-tick: "npm:1" - checksum: 10c0/fc43c6a01f52875e57d301ae9ec47b3021c6d9b96de5bc6e4e5fc4a3d2b25ebaab69faf6fe85520efbef0ad784537748f88f7efd7b6b2bf0a177c8bc7a66ca7c + es5-ext: "npm:^0.10.64" + next-tick: "npm:^1.1.0" + checksum: 10c0/d0222d0c171d08df69e51462e3fa2085744d13f8ac82b27597db05db1a09bc4244e03ea3cebe89ba279fd43f45daa39156acbe5b6ae5a9b9d62d300543312533 languageName: node linkType: hard -"tiny-lru@npm:^8.0.1": - version: 8.0.2 - resolution: "tiny-lru@npm:8.0.2" - checksum: 10c0/32dc73db748ae50bf43498f81150ed23922c924d7a3665ea240c7041abbbd5e8667c05328fd520ca923b4d10b89e69a4ba671365eaac221c6f7eb8b898530506 +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c languageName: node linkType: hard -"tmpl@npm:1.0.5": - version: 1.0.5 - resolution: "tmpl@npm:1.0.5" - checksum: 10c0/f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9 +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10c0/3efbf791a911be0bf0821eab37a3445c2ba07acc1522b1fa84ae1e55f10425076f1290f680286345ed919549ad67527d07281f1c19d584df3b74326909eb1f90 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.12 + resolution: "tinyglobby@npm:0.2.12" + dependencies: + fdir: "npm:^6.4.3" + picomatch: "npm:^4.0.2" + checksum: 10c0/7c9be4fd3625630e262dcb19015302aad3b4ba7fc620f269313e688f2161ea8724d6cb4444baab5ef2826eb6bed72647b169a33ec8eea37501832a2526ff540f + languageName: node + linkType: hard + +"tinypool@npm:^1.0.2": + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 10c0/31ac184c0ff1cf9a074741254fe9ea6de95026749eb2b8ec6fd2b9d8ca94abdccda731f8e102e7f32e72ed3b36d32c6975fd5f5523df3f1b6de6c3d8dfd95e63 languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": +"tinyrainbow@npm:^2.0.0": version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 10c0/c83c52bef4e0ae7fb8ec6a722f70b5b6fa8d8be1c85792e829f56c0e1be94ab70b293c032dc5048d4d37cfe678f1f5babb04bdc65fd123098800148ca989184f + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.2": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 10c0/55ffad24e346622b59292e097c2ee30a63919d5acb7ceca87fc0d1c223090089890587b426e20054733f97a58f20af2c349fb7cc193697203868ab7ba00bcea0 + languageName: node + linkType: hard + +"tldts-core@npm:^6.1.86": + version: 6.1.86 + resolution: "tldts-core@npm:6.1.86" + checksum: 10c0/8133c29375f3f99f88fce5f4d62f6ecb9532b106f31e5423b27c1eb1b6e711bd41875184a456819ceaed5c8b94f43911b1ad57e25c6eb86e1fc201228ff7e2af + languageName: node + linkType: hard + +"tldts@npm:^6.1.32": + version: 6.1.86 + resolution: "tldts@npm:6.1.86" + dependencies: + tldts-core: "npm:^6.1.86" + bin: + tldts: bin/cli.js + checksum: 10c0/27ae7526d9d78cb97b2de3f4d102e0b4321d1ccff0648a7bb0e039ed54acbce86bacdcd9cd3c14310e519b457854e7bafbef1f529f58a1e217a737ced63f0940 languageName: node linkType: hard @@ -8442,6 +8104,13 @@ __metadata: languageName: node linkType: hard +"toad-cache@npm:^3.7.0": + version: 3.7.0 + resolution: "toad-cache@npm:3.7.0" + checksum: 10c0/7dae2782ee20b22c9798bb8b71dec7ec6a0091021d2ea9dd6e8afccab6b65b358fdba49a02209fac574499702e2c000660721516c87c2538d1b2c0ba03e8c0c3 + languageName: node + linkType: hard + "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -8456,49 +8125,46 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.1.2": - version: 4.1.3 - resolution: "tough-cookie@npm:4.1.3" +"tough-cookie@npm:^5.0.0": + version: 5.1.2 + resolution: "tough-cookie@npm:5.1.2" dependencies: - psl: "npm:^1.1.33" - punycode: "npm:^2.1.1" - universalify: "npm:^0.2.0" - url-parse: "npm:^1.5.3" - checksum: 10c0/4fc0433a0cba370d57c4b240f30440c848906dee3180bb6e85033143c2726d322e7e4614abb51d42d111ebec119c4876ed8d7247d4113563033eebbc1739c831 + tldts: "npm:^6.1.32" + checksum: 10c0/5f95023a47de0f30a902bba951664b359725597d8adeabc66a0b93a931c3af801e1e697dae4b8c21a012056c0ea88bd2bf4dfe66b2adcf8e2f42cd9796fe0626 languageName: node linkType: hard -"tr46@npm:^3.0.0": - version: 3.0.0 - resolution: "tr46@npm:3.0.0" +"tr46@npm:^5.1.0": + version: 5.1.0 + resolution: "tr46@npm:5.1.0" dependencies: - punycode: "npm:^2.1.1" - checksum: 10c0/cdc47cad3a9d0b6cb293e39ccb1066695ae6fdd39b9e4f351b010835a1f8b4f3a6dc3a55e896b421371187f22b48d7dac1b693de4f6551bdef7b6ab6735dfe3b + punycode: "npm:^2.3.1" + checksum: 10c0/d761f7144e0cb296187674ef245c74f761e334d7cf25ca73ef60e4c72c097c75051031c093fa1a2fee04b904977b316716a7915854bcae8fb1a371746513cbe8 languageName: node linkType: hard -"tr46@npm:^4.1.1": - version: 4.1.1 - resolution: "tr46@npm:4.1.1" - dependencies: - punycode: "npm:^2.3.0" - checksum: 10c0/92085dcf186f56a49ba4124a581d9ae6a5d0cd4878107c34e2e670b9ddc49da85e4950084bb3e75015195cc23f37ae1c02d45064e94dd6018f5e789aa51d93a8 +"tree-dump@npm:^1.0.1": + version: 1.0.2 + resolution: "tree-dump@npm:1.0.2" + peerDependencies: + tslib: 2 + checksum: 10c0/d1d180764e9c691b28332dbd74226c6b6af361dfb1e134bb11e60e17cb11c215894adee50ffc578da5dcf546006693947be8b6665eb1269b56e2f534926f1c1f languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" +"ts-api-utils@npm:^2.0.1": + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" peerDependencies: - typescript: ">=4.2.0" - checksum: 10c0/f54a0ba9ed56ce66baea90a3fa087a484002e807f28a8ccb2d070c75e76bde64bd0f6dce98b3802834156306050871b67eec325cb4e918015a360a3f0868c77c + typescript: ">=4.8.4" + checksum: 10c0/9806a38adea2db0f6aa217ccc6bc9c391ddba338a9fe3080676d0d50ed806d305bb90e8cef0276e793d28c8a929f400abb184ddd7ff83a416959c0f4d2ce754f languageName: node linkType: hard -"tslib@npm:^2.0.3": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 languageName: node linkType: hard @@ -8549,13 +8215,6 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd - languageName: node - linkType: hard - "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" @@ -8563,13 +8222,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 - languageName: node - linkType: hard - "type-fest@npm:^0.7.1": version: 0.7.1 resolution: "type-fest@npm:0.7.1" @@ -8577,117 +8229,121 @@ __metadata: languageName: node linkType: hard +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d + languageName: node + linkType: hard + "type@npm:^2.7.2": - version: 2.7.2 - resolution: "type@npm:2.7.2" - checksum: 10c0/84c2382788fe24e0bc3d64c0c181820048f672b0f06316aa9c7bdb373f8a09f8b5404f4e856bc4539fb931f2f08f2adc4c53f6c08c9c0314505d70c29a1289e1 + version: 2.7.3 + resolution: "type@npm:2.7.3" + checksum: 10c0/dec6902c2c42fcb86e3adf8cdabdf80e5ef9de280872b5fd547351e9cca2fe58dd2aa6d2547626ddff174145db272f62d95c7aa7038e27c11315657d781a688d languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da + is-typed-array: "npm:^1.1.14" + checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/fcebeffb2436c9f355e91bd19e2368273b88c11d1acc0948a2a306792f1ab672bce4cfe524ab9f51a0505c9d7cd1c98eff4235c4f6bfef6a198f6cfc4ff3d4f3 + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 languageName: node linkType: hard -"typed-array-length@npm:^1.0.6": - version: 1.0.6 - resolution: "typed-array-length@npm:1.0.6" +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" dependencies: call-bind: "npm:^1.0.7" for-each: "npm:^0.3.3" gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" is-typed-array: "npm:^1.1.13" possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/74253d7dc488eb28b6b2711cf31f5a9dcefc9c41b0681fd1c178ed0a1681b4468581a3626d39cd4df7aee3d3927ab62be06aa9ca74e5baf81827f61641445b77 + reflect.getprototypeof: "npm:^1.0.6" + checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 languageName: node linkType: hard -"typescript@npm:^5.4.3": - version: 5.4.3 - resolution: "typescript@npm:5.4.3" +"typescript@npm:5.8.3": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/22443a8760c3668e256c0b34b6b45c359ef6cecc10c42558806177a7d500ab1a7d7aac1f976d712e26989ddf6731d2fbdd3212b7c73290a45127c1c43ba2005a + checksum: 10c0/5f8bb01196e542e64d44db3d16ee0e4063ce4f3e3966df6005f2588e86d91c03e1fb131c2581baf0fb65ee79669eea6e161cd448178986587e9f6844446dbb48 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.4.3#optional!builtin": - version: 5.4.3 - resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin::version=5.4.3&hash=5adc0c" +"typescript@patch:typescript@npm%3A5.8.3#optional!builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/6e51f8b7e6ec55b897b9e56b67e864fe8f44e30f4a14357aad5dc0f7432db2f01efc0522df0b6c36d361c51f2dc3dcac5c832efd96a404cfabf884e915d38828 + checksum: 10c0/39117e346ff8ebd87ae1510b3a77d5d92dae5a89bde588c747d25da5c146603a99c8ee588c7ef80faaf123d89ed46f6dbd918d534d641083177d5fac38b8a1cb languageName: node linkType: hard "uglify-js@npm:^3.1.4": - version: 3.17.4 - resolution: "uglify-js@npm:3.17.4" + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" bin: uglifyjs: bin/uglifyjs - checksum: 10c0/8b7fcdca69deb284fed7d2025b73eb747ce37f9aca6af53422844f46427152d5440601b6e2a033e77856a2f0591e4167153d5a21b68674ad11f662034ec13ced + checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.2" + call-bound: "npm:^1.0.3" has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.0.3" - which-boxed-primitive: "npm:^1.0.2" - checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 - languageName: node - linkType: hard - -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 languageName: node linkType: hard -"unfetch@npm:^5.0.0": - version: 5.0.0 - resolution: "unfetch@npm:5.0.0" - checksum: 10c0/ccbbf648a384d57aeaf3bd4972761327a6cf60c84a3edb8e2f9d18aed0df6214576fc8fcd444ea87672e8e32f4a74590bc5c07756f053f57f492c6d8363045c9 +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 languageName: node linkType: hard @@ -8700,12 +8356,12 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc languageName: node linkType: hard @@ -8718,33 +8374,19 @@ __metadata: languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" dependencies: imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 - languageName: node - linkType: hard - -"universalify@npm:^0.2.0": - version: 0.2.0 - resolution: "universalify@npm:0.2.0" - checksum: 10c0/cedbe4d4ca3967edf24c0800cfc161c5a15e240dac28e3ce575c689abc11f2c81ccc6532c8752af3b40f9120fb5e454abecd359e164f4f6aa44c29cd37e194fe + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" - dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/e52b8b521c78ce1e0c775f356cd16a9c22c70d25f3e01180839c407a5dc787fb05a13f67560cbaf316770d26fa99f78f1acd711b1b54a4f35d4820d4ea7136e6 +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c languageName: node linkType: hard @@ -8775,48 +8417,33 @@ __metadata: languageName: node linkType: hard -"url-loader@npm:^4.1.1": - version: 4.1.1 - resolution: "url-loader@npm:4.1.1" - dependencies: - loader-utils: "npm:^2.0.0" - mime-types: "npm:^2.1.27" - schema-utils: "npm:^3.0.0" - peerDependencies: - file-loader: "*" - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true - checksum: 10c0/71b6300e02ce26c70625eae1a2297c0737635038c62691bb3007ac33e85c0130efc74bfb444baf5c6b3bad5953491159d31d66498967d1417865d0c7e7cd1a64 +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 languageName: node linkType: hard -"url-parse@npm:^1.5.3": - version: 1.5.10 - resolution: "url-parse@npm:1.5.10" - dependencies: - querystringify: "npm:^2.1.1" - requires-port: "npm:^1.0.0" - checksum: 10c0/bd5aa9389f896974beb851c112f63b466505a04b4807cea2e5a3b7092f6fbb75316f0491ea84e44f66fed55f1b440df5195d7e3a8203f64fcefa19d182f5be87 +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 languageName: node linkType: hard -"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 languageName: node linkType: hard -"v8-to-istanbul@npm:^9.0.1": - version: 9.2.0 - resolution: "v8-to-istanbul@npm:9.2.0" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.12" - "@types/istanbul-lib-coverage": "npm:^2.0.1" - convert-source-map: "npm:^2.0.0" - checksum: 10c0/e691ba4dd0dea4a884e52c37dbda30cce6f9eeafe9b26721e449429c6bb0f4b6d1e33fabe7711d0f67f7a34c3bfd56c873f7375bba0b1534e6a2843ce99550e5 +"varint@npm:^6.0.0": + version: 6.0.0 + resolution: "varint@npm:6.0.0" + checksum: 10c0/737fc37088a62ed3bd21466e318d21ca7ac4991d0f25546f518f017703be4ed0f9df1c5559f1dd533dddba4435a1b758fd9230e4772c1a930ef72b42f5c750fd languageName: node linkType: hard @@ -8832,21 +8459,139 @@ __metadata: languageName: node linkType: hard -"w3c-xmlserializer@npm:^4.0.0": - version: 4.0.0 - resolution: "w3c-xmlserializer@npm:4.0.0" +"vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f + languageName: node + linkType: hard + +"vite-node@npm:3.1.1": + version: 3.1.1 + resolution: "vite-node@npm:3.1.1" dependencies: - xml-name-validator: "npm:^4.0.0" - checksum: 10c0/02cc66d6efc590bd630086cd88252444120f5feec5c4043932b0d0f74f8b060512f79dc77eb093a7ad04b4f02f39da79ce4af47ceb600f2bf9eacdc83204b1a8 + cac: "npm:^6.7.14" + debug: "npm:^4.4.0" + es-module-lexer: "npm:^1.6.0" + pathe: "npm:^2.0.3" + vite: "npm:^5.0.0 || ^6.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10c0/15ee73c472ae00f042a7cee09a31355d2c0efbb2dab160377545be9ba4b980a5f4cb2841b98319d87bedf630bbbb075e6b40796b39f65610920cf3fde66fdf8d languageName: node linkType: hard -"walker@npm:^1.0.8": - version: 1.0.8 - resolution: "walker@npm:1.0.8" +"vite@npm:^5.0.0 || ^6.0.0": + version: 6.2.6 + resolution: "vite@npm:6.2.6" + dependencies: + esbuild: "npm:^0.25.0" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.5.3" + rollup: "npm:^4.30.1" + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/68a2ed3e61bdd654c59b817b4f3203065241c66d1739faa707499130f3007bc3a666c7a8320a4198e275e62b5e4d34d9b78a6533f69e321d366e76f5093b2071 + languageName: node + linkType: hard + +"vitest@npm:^3.1.1": + version: 3.1.1 + resolution: "vitest@npm:3.1.1" + dependencies: + "@vitest/expect": "npm:3.1.1" + "@vitest/mocker": "npm:3.1.1" + "@vitest/pretty-format": "npm:^3.1.1" + "@vitest/runner": "npm:3.1.1" + "@vitest/snapshot": "npm:3.1.1" + "@vitest/spy": "npm:3.1.1" + "@vitest/utils": "npm:3.1.1" + chai: "npm:^5.2.0" + debug: "npm:^4.4.0" + expect-type: "npm:^1.2.0" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + std-env: "npm:^3.8.1" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.2" + tinypool: "npm:^1.0.2" + tinyrainbow: "npm:^2.0.0" + vite: "npm:^5.0.0 || ^6.0.0" + vite-node: "npm:3.1.1" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.1.1 + "@vitest/ui": 3.1.1 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/680f31d2a7ca59509f837acdbacd9dff405e1b00c606d7cd29717127c6b543f186055854562c2604f74c5cd668b70174968d28feb4ed948a7e013c9477a68d50 + languageName: node + linkType: hard + +"w3c-xmlserializer@npm:^5.0.0": + version: 5.0.0 + resolution: "w3c-xmlserializer@npm:5.0.0" dependencies: - makeerror: "npm:1.0.12" - checksum: 10c0/a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e + xml-name-validator: "npm:^5.0.0" + checksum: 10c0/8712774c1aeb62dec22928bf1cdfd11426c2c9383a1a63f2bcae18db87ca574165a0fbe96b312b73652149167ac6c7f4cf5409f2eb101d9c805efe0e4bae798b languageName: node linkType: hard @@ -8859,13 +8604,12 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.1": - version: 2.4.1 - resolution: "watchpack@npm:2.4.1" +"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": + version: 1.7.3 + resolution: "wbuf@npm:1.7.3" dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 10c0/c694de0a61004e587a8a0fdc9cfec20ee692c52032d9ab2c2e99969a37fdab9e6e1bd3164ed506f9a13f7c83e65563d563e0d6b87358470cdb7309b83db78683 + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/56edcc5ef2b3d30913ba8f1f5cccc364d180670b24d5f3f8849c1e6fb514e5c7e3a87548ae61227a82859eba6269c11393ae24ce12a2ea1ecb9b465718ddced7 languageName: node linkType: hard @@ -8876,9 +8620,9 @@ __metadata: languageName: node linkType: hard -"webpack-bundle-analyzer@npm:^4.10.1": - version: 4.10.1 - resolution: "webpack-bundle-analyzer@npm:4.10.1" +"webpack-bundle-analyzer@npm:4.10.2": + version: 4.10.2 + resolution: "webpack-bundle-analyzer@npm:4.10.2" dependencies: "@discoveryjs/json-ext": "npm:0.5.7" acorn: "npm:^8.0.4" @@ -8888,184 +8632,158 @@ __metadata: escape-string-regexp: "npm:^4.0.0" gzip-size: "npm:^6.0.0" html-escaper: "npm:^2.0.2" - is-plain-object: "npm:^5.0.0" opener: "npm:^1.5.2" picocolors: "npm:^1.0.0" sirv: "npm:^2.0.3" ws: "npm:^7.3.1" bin: webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 10c0/6a94c8f6aa03296fb2eb00d6ad3b27bd5c551590fd253772bc61debf3177414d42701014079d4f85c74ba1ca685ae9f0cb4063812b58c21f294d108e9908e5cd + checksum: 10c0/00603040e244ead15b2d92981f0559fa14216381349412a30070a7358eb3994cd61a8221d34a3b3fb8202dc3d1c5ee1fbbe94c5c52da536e5b410aa1cf279a48 languageName: node linkType: hard -"webpack-cli@npm:^5.1.4": - version: 5.1.4 - resolution: "webpack-cli@npm:5.1.4" +"webpack-dev-middleware@npm:^7.4.2": + version: 7.4.2 + resolution: "webpack-dev-middleware@npm:7.4.2" dependencies: - "@discoveryjs/json-ext": "npm:^0.5.0" - "@webpack-cli/configtest": "npm:^2.1.1" - "@webpack-cli/info": "npm:^2.0.2" - "@webpack-cli/serve": "npm:^2.0.5" - colorette: "npm:^2.0.14" - commander: "npm:^10.0.1" - cross-spawn: "npm:^7.0.3" - envinfo: "npm:^7.7.3" - fastest-levenshtein: "npm:^1.0.12" - import-local: "npm:^3.0.2" - interpret: "npm:^3.1.1" - rechoir: "npm:^0.8.0" - webpack-merge: "npm:^5.7.3" + colorette: "npm:^2.0.10" + memfs: "npm:^4.6.0" + mime-types: "npm:^2.1.31" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" peerDependencies: - webpack: 5.x.x + webpack: ^5.0.0 peerDependenciesMeta: - "@webpack-cli/generators": - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: + webpack: optional: true - bin: - webpack-cli: bin/cli.js - checksum: 10c0/4266909ae5e2e662c8790ac286e965b2c7fd5a4a2f07f48e28576234c9a5f631847ccddc18e1b3281c7b4be04a7ff4717d2636033a322dde13ac995fd0d9de10 - languageName: node - linkType: hard - -"webpack-merge@npm:^5.7.3": - version: 5.10.0 - resolution: "webpack-merge@npm:5.10.0" - dependencies: - clone-deep: "npm:^4.0.1" - flat: "npm:^5.0.2" - wildcard: "npm:^2.0.0" - checksum: 10c0/b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b - languageName: node - linkType: hard - -"webpack-sources@npm:^1.4.3": - version: 1.4.3 - resolution: "webpack-sources@npm:1.4.3" - dependencies: - source-list-map: "npm:^2.0.0" - source-map: "npm:~0.6.1" - checksum: 10c0/78dafb3e1e297d3f4eb6204311e8c64d28cd028f82887ba33aaf03fffc82482d8e1fdf6de25a60f4dde621d3565f4c3b1bfb350f09add8f4e54e00279ff3db5e - languageName: node - linkType: hard - -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e + checksum: 10c0/2aa873ef57a7095d7fba09400737b6066adc3ded229fd6eba89a666f463c2614c68e01ae58f662c9cdd74f0c8da088523d972329bf4a054e470bc94feb8bcad0 languageName: node linkType: hard -"webpack@npm:^5.91.0": - version: 5.91.0 - resolution: "webpack@npm:5.91.0" - dependencies: - "@types/eslint-scope": "npm:^3.7.3" - "@types/estree": "npm:^1.0.5" - "@webassemblyjs/ast": "npm:^1.12.1" - "@webassemblyjs/wasm-edit": "npm:^1.12.1" - "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.7.1" - acorn-import-assertions: "npm:^1.9.0" - browserslist: "npm:^4.21.10" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.16.0" - es-module-lexer: "npm:^1.2.1" - eslint-scope: "npm:5.1.1" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.11" - json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" +"webpack-dev-server@npm:5.2.0": + version: 5.2.0 + resolution: "webpack-dev-server@npm:5.2.0" + dependencies: + "@types/bonjour": "npm:^3.5.13" + "@types/connect-history-api-fallback": "npm:^1.5.4" + "@types/express": "npm:^4.17.21" + "@types/serve-index": "npm:^1.9.4" + "@types/serve-static": "npm:^1.15.5" + "@types/sockjs": "npm:^0.3.36" + "@types/ws": "npm:^8.5.10" + ansi-html-community: "npm:^0.0.8" + bonjour-service: "npm:^1.2.1" + chokidar: "npm:^3.6.0" + colorette: "npm:^2.0.10" + compression: "npm:^1.7.4" + connect-history-api-fallback: "npm:^2.0.0" + express: "npm:^4.21.2" + graceful-fs: "npm:^4.2.6" + http-proxy-middleware: "npm:^2.0.7" + ipaddr.js: "npm:^2.1.0" + launch-editor: "npm:^2.6.1" + open: "npm:^10.0.3" + p-retry: "npm:^6.2.0" + schema-utils: "npm:^4.2.0" + selfsigned: "npm:^2.4.1" + serve-index: "npm:^1.9.1" + sockjs: "npm:^0.3.24" + spdy: "npm:^4.0.2" + webpack-dev-middleware: "npm:^7.4.2" + ws: "npm:^8.18.0" + peerDependencies: + webpack: ^5.0.0 peerDependenciesMeta: + webpack: + optional: true webpack-cli: optional: true bin: - webpack: bin/webpack.js - checksum: 10c0/74a3e0ea1c9a492accf035317f31769ffeaaab415811524b9f17bc7bf7012c5b6e1a9860df5ca6903f3ae2618727b801eb47d9351a2595dfffb25941d368b88c + webpack-dev-server: bin/webpack-dev-server.js + checksum: 10c0/afb2e51945ac54ef3039e11e377241e1cb97a8d3f526f39f13c3fa924c530fb6063200c2c3ae4e33e6bcc110d4abed777c09ce18e2d261012853d81f3c5820ab languageName: node linkType: hard -"whatwg-encoding@npm:^2.0.0": - version: 2.0.0 - resolution: "whatwg-encoding@npm:2.0.0" +"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": + version: 0.7.4 + resolution: "websocket-driver@npm:0.7.4" dependencies: - iconv-lite: "npm:0.6.3" - checksum: 10c0/91b90a49f312dc751496fd23a7e68981e62f33afe938b97281ad766235c4872fc4e66319f925c5e9001502b3040dd25a33b02a9c693b73a4cbbfdc4ad10c3e3e + http-parser-js: "npm:>=0.5.1" + safe-buffer: "npm:>=5.1.0" + websocket-extensions: "npm:>=0.1.1" + checksum: 10c0/5f09547912b27bdc57bac17b7b6527d8993aa4ac8a2d10588bb74aebaf785fdcf64fea034aae0c359b7adff2044dd66f3d03866e4685571f81b13e548f9021f1 languageName: node linkType: hard -"whatwg-mimetype@npm:^3.0.0": - version: 3.0.0 - resolution: "whatwg-mimetype@npm:3.0.0" - checksum: 10c0/323895a1cda29a5fb0b9ca82831d2c316309fede0365047c4c323073e3239067a304a09a1f4b123b9532641ab604203f33a1403b5ca6a62ef405bcd7a204080f +"websocket-extensions@npm:>=0.1.1": + version: 0.1.4 + resolution: "websocket-extensions@npm:0.1.4" + checksum: 10c0/bbc8c233388a0eb8a40786ee2e30d35935cacbfe26ab188b3e020987e85d519c2009fe07cfc37b7f718b85afdba7e54654c9153e6697301f72561bfe429177e0 languageName: node linkType: hard -"whatwg-url@npm:^11.0.0": - version: 11.0.0 - resolution: "whatwg-url@npm:11.0.0" +"whatwg-encoding@npm:^3.1.1": + version: 3.1.1 + resolution: "whatwg-encoding@npm:3.1.1" dependencies: - tr46: "npm:^3.0.0" - webidl-conversions: "npm:^7.0.0" - checksum: 10c0/f7ec264976d7c725e0696fcaf9ebe056e14422eacbf92fdbb4462034609cba7d0c85ffa1aab05e9309d42969bcf04632ba5ed3f3882c516d7b093053315bf4c1 + iconv-lite: "npm:0.6.3" + checksum: 10c0/273b5f441c2f7fda3368a496c3009edbaa5e43b71b09728f90425e7f487e5cef9eb2b846a31bd760dd8077739c26faf6b5ca43a5f24033172b003b72cf61a93e + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^4.0.0": + version: 4.0.0 + resolution: "whatwg-mimetype@npm:4.0.0" + checksum: 10c0/a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df languageName: node linkType: hard -"whatwg-url@npm:^12.0.0, whatwg-url@npm:^12.0.1": - version: 12.0.1 - resolution: "whatwg-url@npm:12.0.1" +"whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.0": + version: 14.2.0 + resolution: "whatwg-url@npm:14.2.0" dependencies: - tr46: "npm:^4.1.1" + tr46: "npm:^5.1.0" webidl-conversions: "npm:^7.0.0" - checksum: 10c0/99f506b2c996704fa0fc5c70d8e5e27dce15492db2921c99cf319a8d56cb61641f5c06089f63e1ab1983de9fd6a63c3c112a90cdb5fe352d7a846979b10df566 + checksum: 10c0/f746fc2f4c906607d09537de1227b13f9494c171141e5427ed7d2c0dd0b6a48b43d8e71abaae57d368d0c06b673fd8ec63550b32ad5ed64990c7b0266c2b4272 languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" dependencies: - is-bigint: "npm:^1.0.1" - is-boolean-object: "npm:^1.1.0" - is-number-object: "npm:^1.0.4" - is-string: "npm:^1.0.5" - is-symbol: "npm:^1.0.3" - checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe languageName: node linkType: hard -"which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" dependencies: - function.prototype.name: "npm:^1.1.5" - has-tostringtag: "npm:^1.0.0" + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" is-async-function: "npm:^2.0.0" - is-date-object: "npm:^1.0.5" - is-finalizationregistry: "npm:^1.0.2" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" is-generator-function: "npm:^1.0.10" - is-regex: "npm:^1.1.4" + is-regex: "npm:^1.2.1" is-weakref: "npm:^1.0.2" isarray: "npm:^2.0.5" - which-boxed-primitive: "npm:^1.0.2" - which-collection: "npm:^1.0.1" - which-typed-array: "npm:^1.1.9" - checksum: 10c0/2b7b234df3443b52f4fbd2b65b731804de8d30bcc4210ec84107ef377a81923cea7f2763b7fb78b394175cea59118bf3c41b9ffd2d643cb1d748ef93b33b6bd4 + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 languageName: node linkType: hard -"which-collection@npm:^1.0.1": +"which-collection@npm:^1.0.2": version: 1.0.2 resolution: "which-collection@npm:1.0.2" dependencies: @@ -9077,16 +8795,18 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.9": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" dependencies: available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" has-tostringtag: "npm:^1.0.2" - checksum: 10c0/4465d5348c044032032251be54d8988270e69c6b7154f8fcb2a47ff706fe36f7624b3a24246b8d9089435a8f4ec48c1c1025c5d6b499456b9e5eff4f48212983 + checksum: 10c0/702b5dc878addafe6c6300c3d0af5983b175c75fcb4f2a72dfc3dd38d93cf9e89581e4b29c854b16ea37e50a7d7fca5ae42ece5c273d8060dcd603b2404bbb3f languageName: node linkType: hard @@ -9101,14 +8821,26 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" dependencies: isexe: "npm:^3.1.1" bin: node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + languageName: node + linkType: hard + +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 languageName: node linkType: hard @@ -9121,10 +8853,10 @@ __metadata: languageName: node linkType: hard -"wildcard@npm:^2.0.0": - version: 2.0.1 - resolution: "wildcard@npm:2.0.1" - checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 languageName: node linkType: hard @@ -9164,19 +8896,9 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^4.0.2": - version: 4.0.2 - resolution: "write-file-atomic@npm:4.0.2" - dependencies: - imurmurhash: "npm:^0.1.4" - signal-exit: "npm:^3.0.7" - checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 - languageName: node - linkType: hard - "ws@npm:^7.3.1": - version: 7.5.9 - resolution: "ws@npm:7.5.9" + version: 7.5.10 + resolution: "ws@npm:7.5.10" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -9185,13 +8907,13 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/aec4ef4eb65821a7dde7b44790f8699cfafb7978c9b080f6d7a98a7f8fc0ce674c027073a78574c94786ba7112cc90fa2cc94fc224ceba4d4b1030cff9662494 + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d languageName: node linkType: hard -"ws@npm:^8.11.0, ws@npm:^8.13.0, ws@npm:^8.16.0": - version: 8.16.0 - resolution: "ws@npm:8.16.0" +"ws@npm:^8.18.0, ws@npm:^8.18.1": + version: 8.18.1 + resolution: "ws@npm:8.18.1" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -9200,14 +8922,14 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/a7783bb421c648b1e622b423409cb2a58ac5839521d2f689e84bc9dc41d59379c692dd405b15a997ea1d4c0c2e5314ad707332d0c558f15232d2bc07c0b4618a + checksum: 10c0/e498965d6938c63058c4310ffb6967f07d4fa06789d3364829028af380d299fe05762961742971c764973dce3d1f6a2633fe8b2d9410c9b52e534b4b882a99fa languageName: node linkType: hard -"xml-name-validator@npm:^4.0.0": - version: 4.0.0 - resolution: "xml-name-validator@npm:4.0.0" - checksum: 10c0/c1bfa219d64e56fee265b2bd31b2fcecefc063ee802da1e73bad1f21d7afd89b943c9e2c97af2942f60b1ad46f915a4c81e00039c7d398b53cf410e29d3c30bd +"xml-name-validator@npm:^5.0.0": + version: 5.0.0 + resolution: "xml-name-validator@npm:5.0.0" + checksum: 10c0/3fcf44e7b73fb18be917fdd4ccffff3639373c7cb83f8fc35df6001fecba7942f1dbead29d91ebb8315e2f2ff786b508f0c9dc0215b6353f9983c6b7d62cb1f5 languageName: node linkType: hard @@ -9225,13 +8947,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 - languageName: node - linkType: hard - "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" @@ -9239,6 +8954,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + "yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -9246,7 +8968,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.3.1": +"yargs@npm:17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: diff --git a/tools/build/build.js b/tools/build/build.js index 0df8bb67c9b0..9cd26bba9632 100644 --- a/tools/build/build.js +++ b/tools/build/build.js @@ -204,7 +204,7 @@ export const TguiTarget = new Juke.Target({ dependsOn: [YarnTarget], inputs: [ "tgui/.yarn/install-target", - "tgui/webpack.config.js", + "tgui/rspack.config.cjs", "tgui/**/package.json", "tgui/packages/**/*.+(js|jsx|cjs|ts|tsx|scss)", ], @@ -266,6 +266,20 @@ export const TguiBenchTarget = new Juke.Target({ executes: () => yarn("tgui:bench"), }); +export const TguiPrettierFix = new Juke.Target({ + dependsOn: [YarnTarget], + executes: () => yarn('tgui:prettier-fix'), +}); + +export const TguiEslintFix = new Juke.Target({ + dependsOn: [YarnTarget], + executes: () => yarn('tgui:eslint-fix'), +}); + +export const TguiFix = new Juke.Target({ + dependsOn: [TguiPrettierFix, TguiEslintFix], +}); + export const TestTarget = new Juke.Target({ dependsOn: [DmTestTarget, TguiTestTarget], }); @@ -301,7 +315,7 @@ export const TguiCleanTarget = new Juke.Target({ Juke.rm("tgui/public/*.map"); Juke.rm("tgui/public/*.{chunk,bundle,hot-update}.*"); Juke.rm("tgui/packages/tgfont/dist", { recursive: true }); - Juke.rm("tgui/.yarn/{cache,unplugged,webpack}", { recursive: true }); + Juke.rm("tgui/.yarn/{cache,unplugged,rspack}", { recursive: true }); Juke.rm("tgui/.yarn/build-state.yml"); Juke.rm("tgui/.yarn/install-state.gz"); Juke.rm("tgui/.yarn/install-target"); diff --git a/tools/ci/build.ps1 b/tools/ci/build.ps1 index 4694cc3be58d..ca2848af159d 100755 --- a/tools/ci/build.ps1 +++ b/tools/ci/build.ps1 @@ -4,7 +4,6 @@ if(!(Test-Path -Path "C:/byond")){ Remove-Item C:/byond.zip } -bash tools/ci/install_node.sh bash tools/build/build -Werror exit $LASTEXITCODE diff --git a/tools/ci/download_byond.sh b/tools/ci/download_byond.sh index 19b7f2017078..44bfcaaf8bb6 100755 --- a/tools/ci/download_byond.sh +++ b/tools/ci/download_byond.sh @@ -1,5 +1,14 @@ #!/bin/bash set -e source dependencies.sh -echo "Downloading BYOND version $BYOND_MAJOR.$BYOND_MINOR" -curl "http://www.byond.com/download/build/$BYOND_MAJOR/$BYOND_MAJOR.${BYOND_MINOR}_byond.zip" -o C:/byond.zip +echo "Downloading BYOND version ${BYOND_MAJOR}.${BYOND_MINOR} (windows)..." +curl "http://www.byond.com/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond.zip" -o C:/byond.zip -A "CMSS13/1.0 Continuous Integration" +if [ $? -ne 0 ] || !(unzip -qt C:/byond.zip); then + echo "Attempting fallback mirror..." + rm C:/byond.zip + curl "https://cmss13-devs.github.io/byond-build-mirror/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond.zip" -o C:/byond.zip -A "CMSS13/1.0 Continuous Integration" + if [ $? -ne 0 ] || !(unzip -qt C:/byond.zip); then + echo "Failure!" + exit 1 + fi +fi diff --git a/tools/ci/install_byond.sh b/tools/ci/install_byond.sh index 9108bde5ebec..ca6ccec083b3 100644 --- a/tools/ci/install_byond.sh +++ b/tools/ci/install_byond.sh @@ -10,11 +10,20 @@ if [ -d "$HOME/BYOND/byond/bin" ] && grep -Fxq "${BYOND_MAJOR}.${BYOND_MINOR}" $ then echo "Using cached directory." else - echo "Setting up BYOND." + echo "Setting up BYOND version ${BYOND_MAJOR}.${BYOND_MINOR} (linux)..." rm -rf "$HOME/BYOND" mkdir -p "$HOME/BYOND" cd "$HOME/BYOND" - curl "http://www.byond.com/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond_linux.zip" -o byond.zip + curl "http://www.byond.com/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond_linux.zip" -o byond.zip -A "CMSS13/1.0 Continuous Integration" + if [ $? -ne 0 ] || !(unzip -qt byond.zip); then + echo "Attempting fallback mirror..." + rm byond.zip + curl "https://cmss13-devs.github.io/byond-build-mirror/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond_linux.zip" -o byond.zip -A "CMSS13/1.0 Continuous Integration" + if [ $? -ne 0 ] || !(unzip -qt byond.zip); then + echo "Failure!" + exit 1 + fi + fi unzip byond.zip rm byond.zip cd byond diff --git a/tools/ci/install_node.sh b/tools/ci/install_node.sh deleted file mode 100644 index c21b8f0110b0..000000000000 --- a/tools/ci/install_node.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -euo pipefail - -source dependencies.sh - -if [[ -e ~/.nvm/nvm.sh ]]; then - source ~/.nvm/nvm.sh - nvm install $NODE_VERSION - nvm use $NODE_VERSION -fi diff --git a/tools/dmi/merge_driver.py b/tools/dmi/merge_driver.py index 75c3daacb071..c029b8d5a050 100644 --- a/tools/dmi/merge_driver.py +++ b/tools/dmi/merge_driver.py @@ -39,6 +39,25 @@ def key_of(state): return (state.name, state.movement) +def index_of(state, list): + index = 0 + for item in list: + if item.name == state.name: + return index + index += 1 + return -1 + + +def determine_insert_index(state, old_sheet, new_sheet): + old_index = old_sheet.states.index(state) + for i in range(old_index - 1, -1, -1): + # figure out the new index it ought to be by trying to find a common earlier state in the new list + new_index = index_of(old_sheet.states[i], new_sheet) + if new_index > -1: + return new_index + 1 + return 0 + + def dictify(sheet): result = {} for state in sheet.states: @@ -133,18 +152,21 @@ def three_way_merge(base, left, right): # add states which both left and right added the same for key, state in new_both.items(): + insert_index = determine_insert_index(state, left, final_states) + final_states.insert(insert_index, state) print(f" {state.name!r}: added same in both") - final_states.append(state) # add states that are brand-new in the left for key, state in new_left.items(): + insert_index = determine_insert_index(state, left, final_states) + final_states.insert(insert_index, state) print(f" {state.name!r}: added in left") - final_states.append(state) # add states that are brand-new in the right for key, state in new_right.items(): + insert_index = determine_insert_index(state, right, final_states) + final_states.insert(insert_index, state) print(f" {state.name!r}: added in right") - final_states.append(state) final_states.extend(conflicts) merged = dmi.Dmi(base.width, base.height)