diff --git a/.github/workflows/changelog_generation.yml b/.github/workflows/changelog_generation.yml index 645cfb1055873..267ae1a1e907b 100644 --- a/.github/workflows/changelog_generation.yml +++ b/.github/workflows/changelog_generation.yml @@ -16,13 +16,13 @@ jobs: if: github.repository == 'SierraBay/SierraBay12' # to prevent this running on forks steps: - name: Checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: fetch-depth: 0 # Otherwise, we will fail to push refs ref: dev-sierra token: ${{ secrets.BOT_TOKEN }} - name: Python setup - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f + uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b with: python-version: '3.x' - name: Install depends diff --git a/.github/workflows/check_changelog.yml b/.github/workflows/check_changelog.yml index badc1afa6882d..49b12a38d78c1 100644 --- a/.github/workflows/check_changelog.yml +++ b/.github/workflows/check_changelog.yml @@ -19,7 +19,7 @@ jobs: wget https://raw.githubusercontent.com/SierraBay/SierraBay12/dev-sierra/tools/changelog/sierra_check_changelog.py wget https://raw.githubusercontent.com/SierraBay/SierraBay12/dev-sierra/tools/changelog/tags.yml - name: Установка Python - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f + uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b with: python-version: '3.x' - name: Установка зависимостей diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index aa04da24b0cd8..162ff8acdb474 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -39,7 +39,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index 3694e551bf9ed..2f151453b1f2b 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - name: paths-filter uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 id: filter @@ -37,9 +37,9 @@ jobs: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - name: Setup Cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/spaceman_dmm/${{ env.SPACEMAN_DMM_VERSION }} key: ${{ runner.os }}-spacemandmm-${{ env.SPACEMAN_DMM_VERSION }} @@ -49,7 +49,7 @@ jobs: run: | ~/dmdoc - name: Deploy - uses: JamesIves/github-pages-deploy-action@94f3c658273cf92fb48ef99e5fbc02bd2dc642b2 + uses: JamesIves/github-pages-deploy-action@dc18a3c6b46d56484cb63f291becd7ed4f0269b9 with: token: ${{ secrets.GITHUB_TOKEN }} branch: gh-pages diff --git a/.github/workflows/make_changelogs.yml b/.github/workflows/make_changelogs.yml index f156f08c0ef7d..4e89bd0359465 100644 --- a/.github/workflows/make_changelogs.yml +++ b/.github/workflows/make_changelogs.yml @@ -16,11 +16,11 @@ jobs: if: github.repository == 'SierraBay/SierraBay12' # to prevent this running on forks steps: - name: Checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: fetch-depth: 25 - name: Python setup - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f + uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b with: python-version: '3.x' - name: Install depends diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e0dce83a6385e..d6544e4c0605f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - name: paths-filter uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 id: filter @@ -32,9 +32,9 @@ jobs: needs: PreFlight if: needs.PreFlight.outputs.dm == 'true' steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - name: Setup Cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/spaceman_dmm/${{ env.SPACEMAN_DMM_VERSION }} key: ${{ runner.os }}-spacemandmm-${{ env.SPACEMAN_DMM_VERSION }} @@ -60,9 +60,9 @@ jobs: - DreamChecker if: needs.PreFlight.outputs.dm == 'true' steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - name: Setup Cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/BYOND-${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }} key: ${{ runner.os }}-byond-${{ env.BYOND_MAJOR }}-${{ env.BYOND_MINOR }} @@ -90,16 +90,16 @@ jobs: - DreamChecker if: needs.PreFlight.outputs.dm == 'true' steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - name: Setup Cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/BYOND-${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }} key: ${{ runner.os }}-byond-${{ env.BYOND_MAJOR }}-${{ env.BYOND_MINOR }} - name: Install rust_g dependencies run: ./scripts/install-rust_g-dependencies.sh - name: Setup rust_g cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/.byond/bin/librust_g.so key: "rust_g-${{ env.RUST_G_REPO }}-${{ env.RUST_G_VERSION }}" @@ -128,16 +128,16 @@ jobs: - DreamChecker if: needs.PreFlight.outputs.dm == 'true' steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - name: Setup Cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/BYOND-${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }} key: ${{ runner.os }}-byond-${{ env.BYOND_MAJOR }}-${{ env.BYOND_MINOR }} - name: Install rust_g dependencies run: ./scripts/install-rust_g-dependencies.sh - name: Setup rust_g cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/.byond/bin/librust_g.so key: "rust_g-${{ env.RUST_G_REPO }}-${{ env.RUST_G_VERSION }}" @@ -166,16 +166,16 @@ jobs: - DreamChecker if: needs.PreFlight.outputs.dm == 'true' steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - name: Setup Cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/BYOND-${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }} key: ${{ runner.os }}-byond-${{ env.BYOND_MAJOR }}-${{ env.BYOND_MINOR }} - name: Install rust_g dependencies run: ./scripts/install-rust_g-dependencies.sh - name: Setup rust_g cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 with: path: ~/.byond/bin/librust_g.so key: "rust_g-${{ env.RUST_G_REPO }}-${{ env.RUST_G_VERSION }}" diff --git a/baystation12.dme b/baystation12.dme index 8faa16e741cae..cbc43ffe2b6b0 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -88,6 +88,7 @@ #include "code\__defines\ZAS.dm" #include "code\__defines\zmimic.dm" #include "code\__defines\~mods\expanded_culture_descriptor.dm" +#include "code\__defines\~mods\misc.dm" #include "code\__defines\~mods\rust_g.dm" #include "code\__defines\~mods\~master_defines.dm" #include "code\_global_vars\edible.dm" @@ -235,6 +236,7 @@ #include "code\controllers\subsystems\initialization\culture.dm" #include "code\controllers\subsystems\initialization\customitems.dm" #include "code\controllers\subsystems\initialization\fabrication.dm" +#include "code\controllers\subsystems\initialization\icon_updates.dm" #include "code\controllers\subsystems\initialization\materials.dm" #include "code\controllers\subsystems\initialization\misc.dm" #include "code\controllers\subsystems\initialization\misc_early.dm" @@ -248,7 +250,6 @@ #include "code\controllers\subsystems\processing\disposals.dm" #include "code\controllers\subsystems\processing\fast_process.dm" #include "code\controllers\subsystems\processing\graphs.dm" -#include "code\controllers\subsystems\processing\icon_updates.dm" #include "code\controllers\subsystems\processing\nano.dm" #include "code\controllers\subsystems\processing\obj.dm" #include "code\controllers\subsystems\processing\processing.dm" @@ -312,6 +313,7 @@ #include "code\datums\extensions\local_network.dm" #include "code\datums\extensions\penetration.dm" #include "code\datums\extensions\state_machine.dm" +#include "code\datums\extensions\support_lattice.dm" #include "code\datums\extensions\appearance\appearance.dm" #include "code\datums\extensions\appearance\base_icon_state.dm" #include "code\datums\extensions\appearance\cardborg.dm" @@ -325,7 +327,6 @@ #include "code\datums\extensions\multitool\store.dm" #include "code\datums\extensions\multitool\circuitboards\buildtype_select.dm" #include "code\datums\extensions\multitool\circuitboards\circuitboards.dm" -#include "code\datums\extensions\multitool\circuitboards\shuttle_console.dm" #include "code\datums\extensions\multitool\circuitboards\stationalert.dm" #include "code\datums\extensions\multitool\items\clothing.dm" #include "code\datums\extensions\multitool\items\items.dm" @@ -421,6 +422,7 @@ #include "code\datums\repositories\attack_logs.dm" #include "code\datums\repositories\cameras.dm" #include "code\datums\repositories\client.dm" +#include "code\datums\repositories\computer_logs.dm" #include "code\datums\repositories\follow.dm" #include "code\datums\repositories\images.dm" #include "code\datums\repositories\mobs.dm" @@ -492,6 +494,7 @@ #include "code\datums\traits\general\nonpermeable_skin.dm" #include "code\datums\traits\general\permeable_skin.dm" #include "code\datums\traits\general\serpentid_adapted.dm" +#include "code\datums\traits\maluses\allergy.dm" #include "code\datums\traits\maluses\animal_protein.dm" #include "code\datums\traits\maluses\ethanol.dm" #include "code\datums\traits\maluses\malus.dm" @@ -1221,7 +1224,6 @@ #include "code\game\objects\structures\extinguisher.dm" #include "code\game\objects\structures\fireaxe_cabinet.dm" #include "code\game\objects\structures\fitness.dm" -#include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fountain.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" @@ -1284,6 +1286,8 @@ #include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\service.dm" +#include "code\game\objects\structures\flora\flora.dm" +#include "code\game\objects\structures\flora\tree.dm" #include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" #include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" #include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" @@ -1404,6 +1408,7 @@ #include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" #include "code\modules\admin\secrets\fun_secrets\waddle.dm" #include "code\modules\admin\secrets\investigation\attack_logs.dm" +#include "code\modules\admin\secrets\investigation\computer_logs.dm" #include "code\modules\admin\secrets\investigation\view_persistant.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" @@ -2162,6 +2167,7 @@ #include "code\modules\mob\living\bot\mulebot.dm" #include "code\modules\mob\living\bot\remotebot.dm" #include "code\modules\mob\living\bot\secbot.dm" +#include "code\modules\mob\living\carbon\allergy.dm" #include "code\modules\mob\living\carbon\breathe.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" @@ -3374,6 +3380,7 @@ #include "mods\_master_files\code\modules\culture_descriptor\religion\religions_vox.dm" #include "mods\_master_files\code\modules\events\gravity.dm" #include "mods\_master_files\code\modules\mob\living\life.dm" +#include "mods\_master_files\code\modules\mob\living\carbon\human\human_helpers.dm" #include "mods\_master_files\code\modules\mob\new_player\new_player.dm" #include "mods\_master_files\code\modules\overmap\distress.dm" #include "mods\_master_files\code\modules\overmap\panicbutton.dm" diff --git a/code/__defines/__renderer.dm b/code/__defines/__renderer.dm index bb2d2507f20a4..bf7e3f59dfef4 100644 --- a/code/__defines/__renderer.dm +++ b/code/__defines/__renderer.dm @@ -62,29 +62,31 @@ #define TURF_SHADOW_LAYER 2.02 //ABOVE TURF #define DECAL_LAYER 2.03 - #define RUNE_LAYER 2.04 - #define ABOVE_TILE_LAYER 2.05 - #define EXPOSED_PIPE_LAYER 2.06 - #define EXPOSED_WIRE_LAYER 2.07 - #define EXPOSED_WIRE_TERMINAL_LAYER 2.08 - #define CATWALK_LAYER 2.09 - #define ABOVE_CATWALK_LAYER 2.10 - #define BLOOD_LAYER 2.11 - #define MOUSETRAP_LAYER 2.12 - #define PLANT_LAYER 2.13 - #define AO_LAYER 2.14 - #define ABOVE_AO_LAYER 2.141 + + #define AO_LAYER 2.04 + #define ABOVE_AO_LAYER 2.05 + #define RUNE_LAYER 2.06 + #define ABOVE_TILE_LAYER 2.07 + #define EXPOSED_PIPE_LAYER 2.08 + #define EXPOSED_WIRE_LAYER 2.09 + #define ABOVE_EXPOSED_WIRE_LAYER 2.10 + #define CATWALK_LAYER 2.11 + #define ABOVE_CATWALK_LAYER 2.12 + #define BLOOD_LAYER 2.13 + #define MOUSETRAP_LAYER 2.14 + #define PLANT_LAYER 2.15 + //HIDING MOB - #define HIDING_MOB_LAYER 2.15 - #define SHALLOW_FLUID_LAYER 2.16 - #define MOB_SHADOW_LAYER 2.17 + #define HIDING_MOB_LAYER 2.16 + #define SHALLOW_FLUID_LAYER 2.17 + #define MOB_SHADOW_LAYER 2.18 //OBJ - #define BELOW_DOOR_LAYER 2.18 - #define OPEN_DOOR_LAYER 2.19 - #define BELOW_TABLE_LAYER 2.20 - #define TABLE_LAYER 2.21 - #define BELOW_OBJ_LAYER 2.22 - #define STRUCTURE_LAYER 2.23 + #define BELOW_DOOR_LAYER 2.19 + #define OPEN_DOOR_LAYER 2.20 + #define BELOW_TABLE_LAYER 2.21 + #define TABLE_LAYER 2.22 + #define BELOW_OBJ_LAYER 2.23 + #define STRUCTURE_LAYER 2.24 // OBJ_LAYER 3 #define ABOVE_OBJ_LAYER 3.01 #define CLOSED_DOOR_LAYER 3.02 diff --git a/code/__defines/atmospherics.dm b/code/__defines/atmospherics.dm index 90b906449774d..e70ec0282c14a 100644 --- a/code/__defines/atmospherics.dm +++ b/code/__defines/atmospherics.dm @@ -3,6 +3,10 @@ #define PIPE_ROTATE_TWODIR 1 // Sanitizes cardinal directions to just two, leaves corner directions alone #define PIPE_ROTATE_ONEDIR 2 // Only has one dir, south +#define PIPE_PLACEMENT_SIMPLE 1 +#define PIPE_PLACEMENT_ORTHOGONAL 2 +#define PIPE_PLACEMENT_DIAGONAL 3 + //Connection Type Definitions #define CONNECT_TYPE_REGULAR 1 #define CONNECT_TYPE_SUPPLY 2 @@ -23,4 +27,4 @@ #define PIPE_CLASS_QUATERNARY 4 #define PIPE_CLASS_OMNI 5 -#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1. \ No newline at end of file +#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1. diff --git a/code/__defines/byond_tracy.dm b/code/__defines/byond_tracy.dm index 457636d295f5f..e1f5c42c07c1b 100644 --- a/code/__defines/byond_tracy.dm +++ b/code/__defines/byond_tracy.dm @@ -1,31 +1,33 @@ // Implements https://github.com/mafemergency/byond-tracy // Client https://github.com/wolfpld/tracy -// As of now, only 0.8.2 is supported as a client, this might change in the future however -// In case you need to start the capture as soon as the server boots, uncomment the following lines and recompile: -// /world/New() -// prof_init() -// . = ..() +#ifdef PROFILE_FROM_BOOT +/world/New() + profiler_init() + return ..() +#endif -/client/proc/profiler_start() - set name = "Start Tracy Profiler" + +/client/proc/profiler_init_verb() + set name = "Start Profiler" set category = "Debug" set desc = "Starts the tracy profiler, which will await the client connection." - switch(alert("Are you sure? Tracy will remain active until the server restarts.", "Tracy Init", "No", "Yes")) - if("Yes") - prof_init() + var/response = alert("Are you sure? The profiler will run until restart.", null, "No", "Yes") + if (response != "Yes") + return + profiler_init() -/** - * Starts Tracy - */ -/proc/prof_init() +/// Starts the profiler. +/proc/profiler_init() var/lib - - switch(world.system_type) - if(MS_WINDOWS) lib = "prof.dll" - if(UNIX) lib = "libprof.so" - else CRASH("Tracy initialization failed: unsupported platform or DLL not found.") - + switch (world.system_type) + if (MS_WINDOWS) + lib = "tracy.dll" + if (UNIX) + lib = "tracy.so" + else + CRASH("Tracy initialization failed: unsupported platform or DLL not found.") var/init = CALL_EXT(lib, "init")() - if("0" != init) CRASH("[lib] init error: [init]") + if(init != "0") + CRASH("[lib] init error: [init]") diff --git a/code/__defines/colors.dm b/code/__defines/colors.dm index 7a20201ed304f..41b3fbf2ad073 100644 --- a/code/__defines/colors.dm +++ b/code/__defines/colors.dm @@ -52,8 +52,8 @@ #define COLOR_WHITE "#ffffff" #define COLOR_GOLD "#ffcc33" #define COLOR_CLOSET_GOLD "#6d6133" -#define COLOR_NT_RED "#9d2300" #define COLOR_BOTTLE_GREEN "#1f6b4f" +#define COLOR_NT_RED "#9d2300" #define COLOR_PALE_BTL_GREEN "#57967f" #define COLOR_GUNMETAL "#545c68" #define COLOR_WALL_GUNMETAL "#353a42" @@ -88,7 +88,6 @@ #define CABLE_COLOR_YELLOW "#ffbf00" #define CABLE_COLOR_GREEN "#008000" #define CABLE_COLOR_BLUE "#3366cc" -#define CABLE_COLOR_PINK "#800080" #define CABLE_COLOR_ORANGE "#ff9900" #define CABLE_COLOR_CYAN "#5ca1cc" #define CABLE_COLOR_WHITE "#c0c0c0" diff --git a/code/__defines/culture.dm b/code/__defines/culture.dm index 136e7d57bb58b..5280e37aa4a1d 100644 --- a/code/__defines/culture.dm +++ b/code/__defines/culture.dm @@ -58,45 +58,53 @@ #define HOME_SYSTEM_OTHER "Other System" #define HOME_SYSTEM_DEEP_SPACE "Deep Space" -#define CULTURE_OTHER "Other Culture" -#define CULTURE_HUMAN "Humankind" -#define CULTURE_HUMAN_VATGROWN "Nonborn" -#define CULTURE_HUMAN_MARTIAN "Martian, Surfacer" -#define CULTURE_HUMAN_MARSTUN "Martian, Tunneller" -#define CULTURE_HUMAN_LUNAPOOR "Luna, Lower Class" -#define CULTURE_HUMAN_LUNARICH "Luna, Upper Class" -#define CULTURE_HUMAN_VENUSIAN "Venusian, Zoner" -#define CULTURE_HUMAN_VENUSLOW "Venusian, Surfacer" -#define CULTURE_HUMAN_BELTER "Belter, Ceres" -#define CULTURE_HUMAN_KUIPERI "Kuiper, Insider" -#define CULTURE_HUMAN_KUIPERO "Kuiper, Outsider" -#define CULTURE_HUMAN_MAGNITKA "Magnitkan" -#define CULTURE_HUMAN_EARTH "Earther" -#define CULTURE_HUMAN_CETIN "Cetite, Northern" -#define CULTURE_HUMAN_CETIS "Cetite, Southern" -#define CULTURE_HUMAN_CETII "Cetite, Interstate" -#define CULTURE_HUMAN_FOSTER "Fostersman" -#define CULTURE_HUMAN_PIRXL "Pirxish, High" -#define CULTURE_HUMAN_PIRXB "Pirxish, Bugeater" -#define CULTURE_HUMAN_PIRXF "Pirxish, Frontier" -#define CULTURE_HUMAN_TADMOR "Tadmorian" -#define CULTURE_HUMAN_IOLAUS "Iolan" -#define CULTURE_HUMAN_BRAHE "Brahite" -#define CULTURE_HUMAN_EOS "Eosic" -#define CULTURE_HUMAN_SPACER "Spacer" -#define CULTURE_HUMAN_OFFWORLD "Offworlder" -#define CULTURE_HUMAN_SOLCOL "Solar-Colonial" -#define CULTURE_HUMAN_CONFEDC "Confederate, Core Systems" -#define CULTURE_HUMAN_CONFEDO "Confederate, Outer Systems" -#define CULTURE_HUMAN_GAIAN "Gaian" -#define CULTURE_HUMAN_OTHER "Other, Humanity" -#define CULTURE_STARLIGHT "Starlit Realms" -#define CULTURE_MONKEY "Monkey Business" -#define CULTURE_FARWA "Farwa Business" -#define CULTURE_NEARA "Neara Business" -#define CULTURE_STOK "Stok Business" -#define CULTURE_ALIUM "Mysterious Aliens" -#define CULTURE_CULTIST "Blood Cult" +#define CULTURE_OTHER "Other Culture" +#define CULTURE_HUMAN "Humankind" +#define CULTURE_HUMAN_VATGROWN "Nonborn" +#define CULTURE_HUMAN_MARTIAN "Martian, Surfacer" +#define CULTURE_HUMAN_MARSTUN "Martian, Tunneller" +#define CULTURE_HUMAN_LUNAPOOR "Luna, Lower Class" +#define CULTURE_HUMAN_LUNARICH "Luna, Upper Class" +#define CULTURE_HUMAN_VENUSIAN "Venusian, Zoner" +#define CULTURE_HUMAN_VENUSLOW "Venusian, Surfacer" +#define CULTURE_HUMAN_BELTER "Belter, Ceres" +#define CULTURE_HUMAN_KUIPERI "Kuiper, Insider" +#define CULTURE_HUMAN_KUIPERO "Kuiper, Outsider" +#define CULTURE_HUMAN_MAGNITKA "Magnitkan" +#define CULTURE_HUMAN_EARTH "Earther" +#define CULTURE_HUMAN_CETIN "Cetite, Northern" +#define CULTURE_HUMAN_CETIS "Cetite, Southern" +#define CULTURE_HUMAN_CETII "Cetite, Interstate" +#define CULTURE_HUMAN_FOSTER "Fostersman" +#define CULTURE_HUMAN_PIRXL "Pirxish, High" +#define CULTURE_HUMAN_PIRXB "Pirxish, Bugeater" +#define CULTURE_HUMAN_PIRXF "Pirxish, Frontier" +#define CULTURE_HUMAN_TADMOR "Tadmorian" +#define CULTURE_HUMAN_IOLAUS "Iolan" +#define CULTURE_HUMAN_BRAHE "Brahite" +#define CULTURE_HUMAN_EOS "Eosic" +#define CULTURE_HUMAN_SPACER "Spacer" +#define CULTURE_HUMAN_OFFWORLD "Offworlder" +#define CULTURE_HUMAN_SOLCOL "Solar-Colonial" +#define CULTURE_HUMAN_THEIA "Theian" +#define CULTURE_HUMAN_CONFED_TERRA "Terran" +#define CULTURE_HUMAN_CONFED_ZEMLYA "Zemlyan" +#define CULTURE_HUMAN_CONFED_SESTRIS "Sestrisite" +#define CULTURE_HUMAN_CONFED_PUTKARI "Putkarian" +#define CULTURE_HUMAN_CONFED_ALTAIR "Altairian" +#define CULTURE_HUMAN_CONFED_PENGLAI "Pengalese" +#define CULTURE_HUMAN_CONFED_PROVIDENCE "Providentian" +#define CULTURE_HUMAN_CONFED_VALY "Valyan" +#define CULTURE_HUMAN_CONFEDO "Confederate, Colonial" +#define CULTURE_HUMAN_GAIAN "Gaian" +#define CULTURE_HUMAN_OTHER "Other, Humanity" +#define CULTURE_STARLIGHT "Starlit Realms" +#define CULTURE_MONKEY "Monkey Business" +#define CULTURE_FARWA "Farwa Business" +#define CULTURE_NEARA "Neara Business" +#define CULTURE_STOK "Stok Business" +#define CULTURE_ALIUM "Mysterious Aliens" +#define CULTURE_CULTIST "Blood Cult" #define RELIGION_OTHER "Other Religion" #define RELIGION_JUDAISM "Judaism" diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index bb756e5c37622..2a7b81ffa7170 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -163,7 +163,7 @@ #define FLASH_PROTECTION_MODERATE 2 #define FLASH_PROTECTION_MAJOR 3 -#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) +#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 2) //SIERRA-EDIT ORIG was /6 #define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) // Incapacitation flags, used by the mob/proc/incapacitated() proc @@ -486,7 +486,7 @@ #define FAKE_INVIS_ALPHA_THRESHOLD 127 // If something's alpha var is at or below this number, certain things will pretend it is invisible. #define PRONOUNS_THEY_THEM "they/them" -#define PRONOUNS_HE_HIM "he/his" +#define PRONOUNS_HE_HIM "he/him" #define PRONOUNS_SHE_HER "she/her" #define PRONOUNS_IT_ITS "it/its" #define PRONOUNS_HE_THEY "he/they" @@ -496,3 +496,7 @@ /// Integer (~ticks * SSMobs/wait fire rate). The default maximum value a mob's confused var can be set to. #define CONFUSED_MAX 15 + +///Flags assigned to carbon mobs trait_flags when they're actively having an allergy. +#define MILD_ALLERGY FLAG(0) +#define SEVERE_ALLERGY FLAG(1) \ No newline at end of file diff --git a/code/__defines/skills.dm b/code/__defines/skills.dm index 60e9e46b36b85..09b9ebc266632 100644 --- a/code/__defines/skills.dm +++ b/code/__defines/skills.dm @@ -39,3 +39,4 @@ #define SKILL_MEDICAL /singleton/hierarchy/skill/medical/medical #define SKILL_ANATOMY /singleton/hierarchy/skill/medical/anatomy #define SKILL_CHEMISTRY /singleton/hierarchy/skill/medical/chemistry +#define SKILL_VIROLOGY /singleton/hierarchy/skill/medical/chemistry/virology diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index 0ff61b820047b..648fc926998c8 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -12,7 +12,7 @@ // SS_TICKER #define SS_PRIORITY_TIMER 30 #define SS_PRIORITY_OVERLAYS 20 -#define SS_PRIORITY_ICON_UPDATE 10 + // Normal #define SS_PRIORITY_TICKER 100 // Gameticker. @@ -27,6 +27,7 @@ #define SS_PRIORITY_CHAT 40 // Chat #define SS_PRIORITY_AI 25 // Mob AI #define SS_PRIORITY_ALARM 20 // Alarm processing. +#define SS_PRIORITY_ICON_UPDATE 20 // Queued icon updates. Mostly used by APCs and tables. #define SS_PRIORITY_EVENT 20 // Event processing and queue handling. #define SS_PRIORITY_SHUTTLE 20 // Shuttle movement. #define SS_PRIORITY_CIRCUIT_COMP 20 // Processing circuit component do_work. diff --git a/code/__defines/~mods/expanded_culture_descriptor.dm b/code/__defines/~mods/expanded_culture_descriptor.dm index db3742724681f..f431f9b2002a5 100644 --- a/code/__defines/~mods/expanded_culture_descriptor.dm +++ b/code/__defines/~mods/expanded_culture_descriptor.dm @@ -24,9 +24,10 @@ #define CULTURE_HUMAN_LORDLOW "Lordanian, Lower" #define CULTURE_HUMAN_MIRANIAN "Miranian" #define CULTURE_HUMAN_NYXIAN "Nyxian" +#define CULTURE_HUMAN_CONFEDC "Confederate, Core Systems" -#define HOME_SYSTEM_PLUTO "Pluto" -#define HOME_SYSTEM_TERSTEN "Tersten" +#define HOME_SYSTEM_PLUTO "Pluto" +#define HOME_SYSTEM_TERSTEN "Tersten" #define HOME_SYSTEM_AVALON "Avalon" #define HOME_SYSTEM_MIRANIA "Mirania" #define HOME_SYSTEM_NYX_BRINKBURN "Brinkburn" @@ -34,6 +35,12 @@ #define HOME_SYSTEM_NYX_ROANOK "Roanok" #define HOME_SYSTEM_NYX_YUKLIT "Yuklit" #define HOME_SYSTEM_NYX_CASSER "Casser" +#define HOME_SYSTEM_LORRIMAN "Lorriman" +#define HOME_SYSTEM_CINU "Cinu" +#define HOME_SYSTEM_YUKLID "Yuklid V" +#define HOME_SYSTEM_LORDANIA "Lordania" +#define HOME_SYSTEM_KINGSTON "Kingston" +#define HOME_SYSTEM_QUIG "Quig" #define FACTION_SKRELL_MED "Gloa'Morr Corp." #define FACTION_SKRELL_AIR "Krri'gli Corp." diff --git a/code/__defines/~mods/misc.dm b/code/__defines/~mods/misc.dm new file mode 100644 index 0000000000000..9b00d0a53140a --- /dev/null +++ b/code/__defines/~mods/misc.dm @@ -0,0 +1,2 @@ +#undef MAX_PAPER_MESSAGE_LEN +#define MAX_PAPER_MESSAGE_LEN 6644 \ No newline at end of file diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 25be7069c7681..0ce8379d29c5f 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -114,6 +114,9 @@ var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" to_world_log("## UNIT_TEST ##: [text]") log_debug(text) +/proc/log_computer_command(text) + if (config.log_computer_commands) + game_log("COMPUTER_COMMAND", text) //This replaces world.log so it displays both in DD and the file /proc/log_world(text) diff --git a/code/_helpers/medical_scans.dm b/code/_helpers/medical_scans.dm index 23c28d1ff400f..48407da9e0daa 100644 --- a/code/_helpers/medical_scans.dm +++ b/code/_helpers/medical_scans.dm @@ -51,7 +51,10 @@ scan["paralysis"] = H.paralysis scan["immune_system"] = H.virus_immunity() scan["worms"] = H.has_brain_worms() - +//SEIRAA-ADD [VIRUSOLOGY] + if (LAZYLEN(H.virus2)) + scan["virus"] = TRUE +//SEIRAA-ADD scan["reagents"] = list() if(H.reagents.total_volume) @@ -252,7 +255,13 @@ [SPAN_BAD("
Large growth detected in frontal lobe, possibly cancerous.
")] */ dat += "Antibody levels and immune system perfomance are at [scan["immune_system"]*100]% of baseline." - +//SIERRA ADD [VIRUSOLOGY] + if (scan["virus"]) + if(skill_level >= SKILL_TRAINED) + dat += "
Viral pathogen detected in blood stream.
" + else + dat += "
Viral pathogen detected in blood stream.
" +//SIERRA ADD if(scan["worms"]) dat += "[SPAN_BAD("
Large growth detected in frontal lobe, possibly cancerous.
")]" diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index bd715c4ddedf7..6296d97db8561 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -701,6 +701,18 @@ return "North-Northwest" +/// Returns random hex of char length nibbles +/proc/randhex(nibbles) + var/static/list/chars = list( + "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", "a", "b", "c", "d", "e", "f" + ) + var/list/result = new (nibbles) + for (var/i = 1 to nibbles) + result[i] = chars[rand(1, 16)] + return jointext(result, "") + + /// Check if thing is an SUID. If other is supplied, check if other matches thing. /proc/is_suid(thing, other) var/static/regex/suid_check = regex(@"^~[0-9a-zA-Z]{15}$") diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index 7b539933c0584..5172ba160ce3d 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -10,6 +10,31 @@ #define DAY *864000 #define DAYS *864000 +GLOBAL_LIST_INIT(month_names, list( + "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December" +)) + +GLOBAL_LIST_INIT(month_names_short, list( + "Jan", "Feb", "Mar", + "Apr", "May", "Jun", + "Jul", "Aug", "Sep", + "Oct", "Nov", "Dec" +)) + +GLOBAL_LIST_INIT(day_names, list( + "Monday", "Tuesday", "Wednesday", + "Thursday","Friday", "Saturday", + "Sunday" +)) + +GLOBAL_LIST_INIT(day_names_short, list( + "Mon", "Tue", "Wed", + "Thu","Fri", "Sat", + "Sun" +)) /// Real time since the server started. Same concept as REALTIMEOFDAY. /proc/Uptime(from_zero) diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index 020549f4c852b..140d7dd8a7015 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -160,18 +160,20 @@ ChangeArea(target, get_area(source)) ChangeArea(source, base_area) transport_turf_contents(source, target) - //change the old turfs for(var/turf/source in translation) - source.ChangeTurf(base_turf ? base_turf : get_base_turf_by_area(source), 1, 1) +//[SIERRA-EDIT] Advanced Landing + var/old_turf = source.prev_type || base_turf || get_base_turf_by_area(source) + source.ChangeTurf(old_turf) +//[/SIERRA-EDIT] Advanced Landing //Transports a turf from a source turf to a target turf, moving all of the turf's contents and making the target a copy of the source. /proc/transport_turf_contents(turf/source, turf/target) RETURN_TYPE(/turf) - + var/target_type = target.type //[/SIERRA-ADD] Advanced Landing var/turf/new_turf = target.ChangeTurf(source.type, 1, 1) new_turf.transport_properties_from(source) - + new_turf.prev_type = target_type //[/SIERRA-ADD] Advanced Landing for(var/obj/O in source) if (QDELETED(O)) testing("Failed to translate [O] to new turf as it was qdel'd.") diff --git a/code/_macros.dm b/code/_macros.dm index fde514d31eec8..cf33f37a5ff76 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -291,12 +291,6 @@ #define num2hex(num) num2text(num, 1, 16) -/// Generate random hex up to char length nibbles -/proc/randhex(nibbles) - for (var/i = 1 to nibbles) - . += num2text(rand(0, 15), 1, 16) - - /// Increase the size of L by 1 at the end. Is the old last entry index. #define LIST_INC(L) ((L).len++) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 01c4dbf6c6c98..58e1ca37c441a 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -382,4 +382,19 @@ /obj/screen/movement/Click(location, control, params) if(istype(usr)) + var/list/modifiers = params2list(params) + if(modifiers["ctrl"]) + usr?.face_direction() + update_icon() + return + usr.set_next_usable_move_intent() + +/obj/screen/movement/on_update_icon() + . = ..() + var/image/chached_fixeye = image('packs/infinity/icons/mob/screen/facedir.dmi', icon_state = "facedir1") + if(!isnull(usr?.facing_dir)) + src.dir = usr?.facing_dir + AddOverlays(chached_fixeye) + else + ClearOverlays() diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 712f7cf26d873..4e3b419d02a89 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -45,78 +45,68 @@ screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" /obj/screen/movable/proc/encode_screen_X(X, mob/viewer) - var/view = viewer.client ? viewer.client.view : world.view - // [SIERRA-ADD] - if(view == "19x15") - view = 9 - else if(view == "17x15") - view = 8 - else if(view == "15x15") - view = 7 - // [/SIERRA-ADD] - if(X > view+1) - . = "EAST-[view*2 + 1-X]" - else if(X < view+1) + // [SIERRA-EDIT] + var/view = viewer.client ? get_view_size_x(viewer.client.view) : get_view_size_x(world.view) + var/x_center = floor(view / 2) + 1 // finding our x center of view + + if(X > x_center) // we are on the right side of the view + . = "EAST-[view - X]" + else if(X < x_center) // we are on the left side of the view . = "WEST+[X-1]" - else + else // we are on the center of the view . = "CENTER" + // [/SIERRA-EDIT] /obj/screen/movable/proc/decode_screen_X(X, mob/viewer) - var/view = viewer.client ? viewer.client.view : world.view - // [SIERRA-ADD] - if(view == "19x15") - view = 9 - else if(view == "17x15") - view = 8 - else if(view == "15x15") - view = 7 - // [/SIERRA-ADD] + // [SIERRA-EDIT] + var/view = viewer.client ? get_view_size_x(viewer.client.view) : get_view_size_x(world.view) + var/x_center = floor(view / 2) + 1 // finding our x center of view //Find EAST/WEST implementations if(findtext(X,"EAST-")) var/num = text2num(copytext(X,6)) //Trim EAST- if(!num) num = 0 - . = view*2 + 1 - num + . = view - num else if(findtext(X,"WEST+")) var/num = text2num(copytext(X,6)) //Trim WEST+ if(!num) num = 0 . = num+1 else if(findtext(X,"CENTER")) - . = view+1 + . = x_center + // [/SIERRA-EDIT] /obj/screen/movable/proc/encode_screen_Y(Y, mob/viewer) - var/view = viewer.client ? viewer.client.view : world.view - // [SIERRA-ADD] - if(view == "19x15" || view == "17x15" || view == "15x15") - view = 7 - // [/SIERRA-ADD] - if(Y > view+1) - - . = "NORTH-[view*2 + 1-Y]" - else if(Y < view+1) - . = "SOUTH+[Y-1]" - else + // [SIERRA-EDIT] + var/view = viewer.client ? get_view_size_y(viewer.client.view) : get_view_size_y(world.view) + var/y_center = floor(view / 2) + 1 // finding our y center of view + + if(Y > y_center) // we are on the right side of the view + . = "NORTH-[view - Y]" + else if(Y < y_center) // we are on the left side of the view + . = "SOUTH+[Y - 1]" + else // we are on the center of the view . = "CENTER" + // [/SIERRA-EDIT] /obj/screen/movable/proc/decode_screen_Y(Y, mob/viewer) - var/view = viewer.client ? get_view_size_y(viewer.client.view) : world.view - // [SIERRA-ADD] - if(view == "19x15" || view == "17x15" || view == "15x15") - view = 7 - // [/SIERRA-ADD] + // [SIERRA-EDIT] + var/view = viewer.client ? get_view_size_y(viewer.client.view) : get_view_size_y(world.view) + var/y_center = floor(view / 2) + 1 // finding our y center of view + if(findtext(Y,"NORTH-")) var/num = text2num(copytext(Y,7)) //Trim NORTH- if(!num) num = 0 - . = view*2 + 1 - num + . = view - num else if(findtext(Y,"SOUTH+")) var/num = text2num(copytext(Y,7)) //Time SOUTH+ if(!num) num = 0 . = num+1 else if(findtext(Y,"CENTER")) - . = view+1 + . = y_center + // [/SIERRA-EDIT] //Debug procs /client/proc/test_movable_UI() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 8e2210475c668..2011fcf541bb5 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -53,7 +53,7 @@ avoid code duplication. This includes items that may sometimes act as a standard use_call = "use" . = use_before(atom, user, click_params) - if (!. && user.a_intent == I_HURT) + if (!. && (user.a_intent == I_HURT || user.a_intent == I_DISARM)) use_call = "weapon" . = atom.use_weapon(src, user, click_params) if (!.) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 60cc5538620ee..1705a5ab05fdf 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -54,10 +54,15 @@ /// log world.log to game log var/static/log_world_output = FALSE -//[SIERRA-ADD] + + //[SIERRA-ADD] /// log signals messages var/static/log_signals = FALSE -//[/SIERRA-ADD] + //[/SIERRA-ADD] + + /// log computer commands + var/static/log_computer_commands = FALSE + /// Allows admins with relevant permissions to have their own ooc colour var/static/allow_admin_ooccolor = FALSE @@ -550,6 +555,8 @@ log_hrefs = TRUE if ("log_runtime") log_runtime = TRUE + if ("log_computer_commands") + log_computer_commands = TRUE if ("generate_asteroid") generate_map = TRUE if ("no_click_cooldown") diff --git a/code/controllers/subsystems/initialization/fabrication.dm b/code/controllers/subsystems/initialization/fabrication.dm index 4d8b07036fcbf..a7e76c89e67ea 100644 --- a/code/controllers/subsystems/initialization/fabrication.dm +++ b/code/controllers/subsystems/initialization/fabrication.dm @@ -135,5 +135,7 @@ SUBSYSTEM_DEF(fabrication) if (stage.can_begin_with(target) && stage.is_appropriate_tool(tool)) var/obj/item/crafting_holder/crafting = new (turf, stage, target, tool, user) if (stage.progress_to(tool, user, crafting)) + if (!length(stage.next_stages)) + crafting.advance_to(stage, user, tool) return crafting qdel(crafting) diff --git a/code/controllers/subsystems/initialization/icon_updates.dm b/code/controllers/subsystems/initialization/icon_updates.dm new file mode 100644 index 0000000000000..6434ad1e889e4 --- /dev/null +++ b/code/controllers/subsystems/initialization/icon_updates.dm @@ -0,0 +1,79 @@ +SUBSYSTEM_DEF(icon_update) + name = "Icon Updates" + wait = 1 + priority = SS_PRIORITY_ICON_UPDATE + init_order = SS_INIT_ICON_UPDATE + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT // If you make it not fire in lobby, you also have to remove atoms from queue in Destroy. + + // Linked lists, queue_refs[x] should have null or args stored in queue_args[x] + var/list/queue_refs = list() // Atoms + var/list/queue_args = list() // null or args + + +/datum/controller/subsystem/icon_update/UpdateStat(time) + if (PreventUpdateStat(time)) + return ..() + ..("queue: [length(queue_refs)]") + + +/datum/controller/subsystem/icon_update/Initialize(start_uptime) + fire(FALSE, TRUE) + + +/datum/controller/subsystem/icon_update/fire(resumed = FALSE, no_mc_tick = FALSE) + if(!queue_refs.len) + suspend() + return + + while (queue_refs.len) + + if(Master.map_loading) + return + + // Pops the atom and it's args + var/atom/A = queue_refs[queue_refs.len] + var/myArgs = queue_args[queue_args.len] + + queue_refs.len -= 1 + queue_args.len -= 1 + + if(QDELETED(A)) + continue + + A.icon_update_queued = FALSE + + if (islist(myArgs)) + A.update_icon(arglist(myArgs)) + else + A.update_icon() + + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) + return + +/atom + var/icon_update_queued = FALSE + +/atom/proc/queue_icon_update(...) + // Skips if this is already queued + if(!icon_update_queued) + + icon_update_queued = TRUE + SSicon_update.queue_refs.Add(src) + + // Makes sure these are in sync, in case runtimes/badmin + var/length = length(SSicon_update.queue_refs) + SSicon_update.queue_args.len = length + SSicon_update.queue_args[length] = args.len ? args : null + + // SSicon_update sleeps when it runs out of things in its + // queue, so wake it up. + if(!Master.map_loading) // Don't wake early if we're loading a map, it'll get woken up when the map loads. + SSicon_update.wake() + +/datum/controller/subsystem/icon_update/StartLoadingMap() + suspend() + +/datum/controller/subsystem/icon_update/StopLoadingMap() + wake() diff --git a/code/controllers/subsystems/processing/icon_updates.dm b/code/controllers/subsystems/processing/icon_updates.dm deleted file mode 100644 index 6990045ef69f7..0000000000000 --- a/code/controllers/subsystems/processing/icon_updates.dm +++ /dev/null @@ -1,62 +0,0 @@ -SUBSYSTEM_DEF(icon_update) - name = "Icon Updates" - wait = 1 // ticks - flags = SS_TICKER - priority = SS_PRIORITY_ICON_UPDATE - init_order = SS_INIT_ICON_UPDATE - var/static/list/queue = list() - - -/datum/controller/subsystem/icon_update/Recover() - LIST_RESIZE(queue, 0) - queue = list() - - -/datum/controller/subsystem/icon_update/UpdateStat(time) - if (PreventUpdateStat(time)) - return ..() - ..("queue: [length(queue)]") - - -/datum/controller/subsystem/icon_update/Initialize(start_uptime) - fire(FALSE, TRUE) - - -/datum/controller/subsystem/icon_update/fire(resumed, no_mc_tick) - var/atom/atom - var/list/params - var/queue_length = length(queue) - for (var/i = 1 to queue_length) - atom = queue[i] - if (QDELETED(atom)) - continue - params = queue[atom] - if (islist(params)) - atom.update_icon(arglist(params)) - else - atom.update_icon() - if (no_mc_tick) - if (i % 100) - continue - CHECK_TICK - else if (MC_TICK_CHECK) - queue.Cut(1, i + 1) - return - if (queue_length) - queue.Cut(1, queue_length + 1) - suspend() - - -/** - * Adds the atom to the icon_update subsystem to be queued for icon updates. Use this if you're going to be pushing a - * lot of icon updates at once. - */ -/atom/proc/queue_icon_update(...) - SSicon_update.queue[src] = length(args) ? args : TRUE - if (SSicon_update.suspended) - SSicon_update.wake() - - -/hook/game_ready/proc/FlushIconUpdateQueue() - SSicon_update.fire(FALSE, TRUE) - return TRUE diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index 53f739fd34b1c..e31b3d8f6505b 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -27,6 +27,11 @@ SUBSYSTEM_DEF(supply) "crate" = "From exported crates", "gep" = "From uploaded good explorer points", "anomaly" = "From scanned and categorized anomalies", + +//SIERRA-ADD VIRUSOLOGY + "virology_antibodies" = "From uploaded antibody data", + "virology_dishes" = "From exported virus dishes", +//SIERRA-ADD "animal" = "From captured exotic alien fauna", //[SIERRA-ADD] - ANOMALY - Добавляем категорию "Артефакты" "artefacts" = "From artefacts", @@ -121,13 +126,25 @@ SUBSYSTEM_DEF(supply) if(istype(A, /obj/item/disk/survey)) var/obj/item/disk/survey/D = A add_points_from_source(round(D.Value() * 0.05), "gep") +//SIERRA-ADD VIRUSOLOGY + // Sell virus dishes. + if(istype(A, /obj/item/virusdish)) + //Obviously the dish must be unique and never sold before. + var/obj/item/virusdish/dish = A + if(dish.analysed && istype(dish.virus2) && dish.virus2.uniqueID) + if(!(dish.virus2.uniqueID in sold_virus_strains)) + add_points_from_source(5, "virology_dishes") + sold_virus_strains += dish.virus2.uniqueID +//SIERRA-ADD //[SIERRA-ADD] - ANOMALY - Продажа артефактов if(istype(A, /obj/item/artefact)) var/obj/item/artefact/D = A add_points_from_source(D.cargo_price, "artefacts") + SSanom.earned_cargo_points += D.cargo_price if(istype(A, /obj/item/collector)) var/obj/item/collector/D = A add_points_from_source(D.stored_artefact.cargo_price, "artefacts") + SSanom.earned_cargo_points += D.stored_artefact.cargo_price //[SIERRA-ADD] // Sell artefacts (in anomaly cages) @@ -277,6 +294,7 @@ SUBSYSTEM_DEF(supply) /datum/supply_order var/ordernum + var/timestamp var/singleton/hierarchy/supply_pack/object = null var/orderedby = null var/comment = null diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 037753940c620..f5ca071c2bffe 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -530,18 +530,31 @@ Helpers to_world("There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round.") if(length(all_money_accounts)) - var/datum/money_account/max_profit = all_money_accounts[1] - var/datum/money_account/max_loss = all_money_accounts[1] + var/max_profit = 0 + var/max_profit_owner = "Greedy Profiteer" + var/max_loss = 0 + var/max_loss_owner = "Thriftless Wastrel" + for(var/datum/money_account/D in all_money_accounts) if(D == vendor_account) //yes we know you get lots of money continue - var/saldo = D.get_balance() - if(saldo >= max_profit.get_balance()) - max_profit = D - if(saldo <= max_loss.get_balance()) - max_loss = D - to_world("[max_profit.owner_name] received most [SPAN_COLOR("green", "PROFIT")] today, with net profit of [GLOB.using_map.local_currency_name_short][max_profit.get_balance()].") - to_world("On the other hand, [max_loss.owner_name] had most [SPAN_COLOR("red", "LOSS")], with total loss of [GLOB.using_map.local_currency_name_short][max_loss.get_balance()].") + var/saldo = D.get_profit() + if (saldo > max_profit) + max_profit = saldo + max_profit_owner = D.owner_name + if (saldo < max_loss) + max_loss = saldo + max_loss_owner = D.owner_name + + if (max_profit > 0) + to_world("[max_profit_owner] received most [SPAN_COLOR("green", "PROFIT")] today, with net profit of [GLOB.using_map.local_currency_name_short][max_profit].") + else + to_world("[SPAN_BAD("Nobody")] earned any extra profit today!") + + if (max_loss < 0) + to_world("[max_profit > 0 ? "On the other hand," : "On top of that,"] [max_loss_owner] had most [SPAN_BAD("LOSS")], with total loss of [GLOB.using_map.local_currency_name_short][max_loss].") + else + to_world("[SPAN_COLOR("green", "Nobody")] suffered any extra losses today!") mode.declare_completion()//To declare normal completion. diff --git a/code/datums/audio/_audio.dm b/code/datums/audio/_audio.dm index 66a389e1582e9..f5958e849801a 100644 --- a/code/datums/audio/_audio.dm +++ b/code/datums/audio/_audio.dm @@ -1,20 +1,30 @@ /singleton/audio - var/source //Path to file source - var/display //A display title we use in the game - var/volume //If present, a `normal` volume - var/title //The real title + /// Path to file source + var/source + + /// The real (ie, artist's) audio title + var/title + + /// The display title to use in game, if different + var/display + + /// The normal volume to play the audio at, if set + var/volume + + /// The artist's name var/author + + /// The collection (eg album) the audio belongs to var/collection - var/singleton/license/license - var/url + /// The license under which the audio was made available + var/singleton/license/license -//Repository scopes -/singleton/audio/effect -/singleton/audio/track + /// A link to the audio's source, if available + var/url -/singleton/audio/New() +/singleton/audio/Initialize() . = ..() license = GET_SINGLETON(license) @@ -22,6 +32,7 @@ /singleton/audio/VV_static() return ..() + vars + /singleton/audio/proc/get_info(with_meta = TRUE) . = SPAN_GOOD("[title][!author?"":" by [author]"][!collection?"":" ([collection])"]") if (with_meta) @@ -29,11 +40,11 @@ /singleton/audio/proc/get_sound(channel) - var/sound/S = sound(source, FALSE, FALSE, channel, volume || 100) - return S + var/sound/sound = sound(source, FALSE, FALSE, channel, volume || 100) + return sound /singleton/audio/track/get_sound(channel = GLOB.lobby_sound_channel) - var/sound/S = ..() - S.repeat = TRUE - return S + var/sound/sound = ..() + sound.repeat = TRUE + return sound diff --git a/code/datums/audio/jukebox.dm b/code/datums/audio/jukebox.dm index a4170b6619569..f3a4a5f7c3265 100644 --- a/code/datums/audio/jukebox.dm +++ b/code/datums/audio/jukebox.dm @@ -1,4 +1,4 @@ -/jukebox //abstraction of music player behavior for jukeboxes, headphones, etc +/datum/jukebox var/atom/owner var/sound_id var/datum/sound_token/token @@ -17,7 +17,7 @@ var/playing -/jukebox/New(atom/_owner, _template, _ui_title, _ui_width, _ui_height) +/datum/jukebox/New(atom/_owner, _template, _ui_title, _ui_width, _ui_height) . = ..() if (QDELETED(_owner) || !isatom(_owner)) qdel(src) @@ -27,30 +27,30 @@ for (var/path in GLOB.jukebox_tracks) var/singleton/audio/track/track = GET_SINGLETON(path) AddTrack(track.display || track.title, track.source) - sound_id = "[/jukebox]_[sequential_id(/jukebox)]" + sound_id = "[/datum/jukebox]_[sequential_id(/datum/jukebox)]" template = _template ui_title = _ui_title ui_width = _ui_width ui_height = _ui_height -/jukebox/Destroy() +/datum/jukebox/Destroy() QDEL_NULL_LIST(tracks) QDEL_NULL(token) owner = null - . = ..() + return ..() -/jukebox/proc/AddTrack(title = "Track [length(tracks) + 1]", source) - tracks += new /jukebox_track (title, source) +/datum/jukebox/proc/AddTrack(title = "Track [length(tracks) + 1]", source) + tracks += new /datum/jukebox_track (title, source) -/jukebox/proc/ClearTracks() +/datum/jukebox/proc/ClearTracks() QDEL_NULL_LIST(tracks) tracks = list() -/jukebox/proc/Next() +/datum/jukebox/proc/Next() if (++index > length(tracks)) index = 1 if (playing) @@ -58,7 +58,7 @@ Play() -/jukebox/proc/Last() +/datum/jukebox/proc/Last() if (--index < 1) index = length(tracks) if (playing) @@ -66,7 +66,7 @@ Play() -/jukebox/proc/Track(_index) +/datum/jukebox/proc/Track(_index) _index = text2num(_index) if (!IsInteger(_index)) return @@ -76,16 +76,16 @@ Play() -/jukebox/proc/Stop() +/datum/jukebox/proc/Stop() playing = FALSE QDEL_NULL(token) owner.queue_icon_update() -/jukebox/proc/Play() +/datum/jukebox/proc/Play() if (playing) return - var/jukebox_track/track = tracks[index] + var/datum/jukebox_track/track = tracks[index] if (!track.source) return playing = TRUE @@ -94,7 +94,7 @@ owner.queue_icon_update() -/jukebox/proc/Volume(_volume) +/datum/jukebox/proc/Volume(_volume) _volume = text2num(_volume) if (!isfinite(_volume)) return @@ -108,16 +108,16 @@ token.SetVolume(volume) -/jukebox/nano_host() +/datum/jukebox/nano_host() return owner -/jukebox/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui, force_open = TRUE, datum/topic_state/state = GLOB.default_state)//, datum/topic_state/state = GLOB.jukebox_state) +/datum/jukebox/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui, force_open = TRUE, datum/topic_state/state = GLOB.default_state) var/list/data_tracks = list() for (var/i = 1 to length(tracks)) - var/jukebox_track/track = tracks[i] + var/datum/jukebox_track/track = tracks[i] data_tracks += list(list("track" = track.title, "index" = i)) - var/jukebox_track/track = tracks[index] + var/datum/jukebox_track/track = tracks[index] var/list/data = list( "track" = track.title, "playing" = playing, @@ -131,24 +131,30 @@ ui.open() -/jukebox/Topic(href, href_list) +/datum/jukebox/Topic(href, href_list) switch ("[href_list["act"]]") - if ("next") Next() - if ("last") Last() - if ("stop") Stop() - if ("play") Play() - if ("volume") Volume("[href_list["dat"]]") - if ("track") Track("[href_list["dat"]]") + if ("next") + Next() + if ("last") + Last() + if ("stop") + Stop() + if ("play") + Play() + if ("volume") + Volume("[href_list["dat"]]") + if ("track") + Track("[href_list["dat"]]") return TOPIC_REFRESH -/jukebox_track +/datum/jukebox_track var/title var/source -/jukebox_track/New(_title, _source, _volume) +/datum/jukebox_track/New(_title, _source) title = _title source = _source diff --git a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm deleted file mode 100644 index c3d958c51d85e..0000000000000 --- a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/extension/interactive/multitool/circuitboards/shuttle_console - expected_type = /obj/item/stock_parts/circuitboard/shuttle_console - -/datum/extension/interactive/multitool/circuitboards/shuttle_console/get_interact_window(obj/item/device/multitool/M, mob/user) - var/obj/item/stock_parts/circuitboard/shuttle_console/board = holder - var/dat = list() - dat += "Current Selected Shuttle: [board.shuttle_tag || "NONE"]
" - dat += "Synchronize to current shuttle." - return JOINTEXT(dat) - -/datum/extension/interactive/multitool/circuitboards/shuttle_console/on_topic(href, href_list, user) - var/obj/item/stock_parts/circuitboard/shuttle_console/board = holder - if(href_list["sync"]) - var/new_name - for(var/shuttle_name in SSshuttle.shuttles) - var/datum/shuttle/shuttle = SSshuttle.shuttles[shuttle_name] - if(get_area(board) in shuttle.shuttle_area) - new_name = shuttle_name - break - if(!new_name) - to_chat(user, SPAN_WARNING("No eligible shuttle could be located. Make sure the board is inside a shuttle and try again.")) - return MT_NOACTION - if(!board.is_valid_shuttle(SSshuttle.shuttles[new_name])) - to_chat(user, SPAN_WARNING("The current shuttle does not support this console type. Try a different shuttle or circuit board.")) - return MT_NOACTION - board.shuttle_tag = new_name - to_chat(user, SPAN_NOTICE("You set the shuttle name to '[new_name]'")) - return MT_REFRESH - return ..() diff --git a/code/datums/extensions/support_lattice.dm b/code/datums/extensions/support_lattice.dm new file mode 100644 index 0000000000000..e6e93723f7bf5 --- /dev/null +++ b/code/datums/extensions/support_lattice.dm @@ -0,0 +1,48 @@ +/datum/extension/support_lattice + base_type = /datum/extension/support_lattice + expected_type = /atom + +/datum/extension/support_lattice/proc/try_construct(obj/item/C, mob/living/user) + var/turf/T = get_turf(holder) + if (istype(C, /obj/item/stack/material/rods)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, T) + if(L) + return L.use_tool(C, user) + var/obj/item/stack/material/rods/R = C + if (!R.can_use(1)) + USE_FEEDBACK_STACK_NOT_ENOUGH(R, 1, "to lay down support lattice.") + return TRUE + + to_chat(user, SPAN_NOTICE("You lay down the support lattice.")) + playsound(T, 'sound/weapons/Genhit.ogg', 50, 1) + T.ReplaceWithLattice(R.material.name) + R.use(1) + return TRUE + + if (istype(C, /obj/item/stack/tile)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, T) + if(!L) + to_chat(user, SPAN_WARNING("The plating is going to need some support.")) + return TRUE + var/obj/item/stack/tile/floor/S = C + if (!S.can_use(1)) + USE_FEEDBACK_STACK_NOT_ENOUGH(S, 1, "to place the plating.") + return TRUE + + qdel(L) + playsound(T, 'sound/weapons/Genhit.ogg', 50, 1) + T.ChangeTurf(/turf/simulated/floor/plating, keep_air = TRUE) + S.use(1) + return TRUE + + if(isCoil(C)) + var/obj/item/stack/cable_coil/coil = C + var/obj/structure/lattice/L = locate(/obj/structure/lattice, T) + if(L) + coil.PlaceCableOnTurf(T, user) + return TRUE + else + to_chat(user, SPAN_WARNING("The cable needs something to be secured to.")) + return TRUE + + return FALSE diff --git a/code/datums/outfits/tournament.dm b/code/datums/outfits/tournament.dm index d6c8b4de3414d..6504b3b7db941 100644 --- a/code/datums/outfits/tournament.dm +++ b/code/datums/outfits/tournament.dm @@ -29,7 +29,7 @@ head = /obj/item/clothing/head/chefhat uniform = /obj/item/clothing/under/rank/chef suit = /obj/item/clothing/suit/chef - r_hand = /obj/item/material/kitchen/rollingpin + r_hand = /obj/item/material/rollingpin l_pocket = /obj/item/material/knife/combat r_pocket = /obj/item/material/knife/combat diff --git a/code/datums/repositories/computer_logs.dm b/code/datums/repositories/computer_logs.dm new file mode 100644 index 0000000000000..c7a24e2b62f73 --- /dev/null +++ b/code/datums/repositories/computer_logs.dm @@ -0,0 +1,26 @@ +var/global/repository/computer_logs/computer_log_repository = new() + +/repository/computer_logs + var/list/computer_logs_ + +/repository/computer_logs/New() + ..() + computer_logs_ = list() + +/repository/computer_logs/proc/store_computer_log(mob/user, turf/location, command) + // Newest logs first + computer_logs_.Insert(1, new/datum/computer_log(user, location, command)) + +/datum/computer_log + var/station_time + var/datum/mob_lite/user + var/turf/location + var/command + +/datum/computer_log/New(mob/user, location, command) + station_time = time_stamp() + src.user = mob_repository.get_lite_mob(user) + src.location = location + src.command = command + + location = get_turf(user) diff --git a/code/datums/singletons/shared_list/_shared_list.dm b/code/datums/singletons/shared_list/_shared_list.dm index 59a5e2906fd18..a0084b3bbda89 100644 --- a/code/datums/singletons/shared_list/_shared_list.dm +++ b/code/datums/singletons/shared_list/_shared_list.dm @@ -1,8 +1,7 @@ /singleton/shared_list abstract_type = /singleton/shared_list - var/max_pick = 8 VAR_PRIVATE/list/list - var/mutable + VAR_PRIVATE/mutable #if DM_VERSION >= 515 /singleton/shared_list/proc/operator""() @@ -152,7 +151,7 @@ /// Returns a result, or list of results, randomly selected from the backing list by pick(). /singleton/shared_list/proc/Pick(count = 1) - count = clamp(floor(count), 1, max_pick) + count = floor(count) if (count == 1) return pick(list) var/list/result[count] @@ -163,7 +162,7 @@ /// Returns a result, or list of results, randomly selected from the backing map by pickweight(). /singleton/shared_list/proc/PickWeight(count = 1) - count = clamp(floor(count), 1, max_pick) + count = floor(count) if (count == 1) return pickweight(list) var/list/result[count] diff --git a/code/datums/supplypacks/atmospherics.dm b/code/datums/supplypacks/atmospherics.dm index fd872d5b283c2..12ee34974a5c4 100644 --- a/code/datums/supplypacks/atmospherics.dm +++ b/code/datums/supplypacks/atmospherics.dm @@ -109,7 +109,7 @@ access = access_atmospherics /singleton/hierarchy/supply_pack/atmospherics/fuel - name = "Liquid - Fuel tanks" + name = "Gas - Hydrogen tanks" contains = list(/obj/item/tank/hydrogen = 4) cost = 15 containername = "fuel tank crate" diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index f3262fb42954d..80bd016d6ec02 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -304,14 +304,7 @@ /singleton/hierarchy/supply_pack/nonessent/pronounbadges name = "Costume - Pronoun Badge Crate" contains = list( - /obj/item/clothing/accessory/pronouns/they = 2, - /obj/item/clothing/accessory/pronouns/hehim = 2, - /obj/item/clothing/accessory/pronouns/sheher = 2, - /obj/item/clothing/accessory/pronouns/hethey = 2, - /obj/item/clothing/accessory/pronouns/shethey = 2, - /obj/item/clothing/accessory/pronouns/heshe = 2, - /obj/item/clothing/accessory/pronouns/zehir = 2, - /obj/item/clothing/accessory/pronouns/ask = 2 + /obj/item/clothing/accessory/pronouns = 5 ) - cost = 20 + cost = 10 containername = "pronoun badge crate" diff --git a/code/datums/traits/_defines.dm b/code/datums/traits/_defines.dm index 4c83db5cec464..592c55a970ef0 100644 --- a/code/datums/traits/_defines.dm +++ b/code/datums/traits/_defines.dm @@ -1,6 +1,9 @@ // Helpers for shorter trait code +///Check if mob currently has a trait set; also works for traits with associated_list set. #define HAS_TRAIT(MOB, TRAIT) MOB.HasTrait(TRAIT) +///Checks for minimum severity level with associated trait. Does not work for traits that have an metaoptions set. #define HAS_TRAIT_LEVEL(MOB, TRAIT, LEVEL) (M.GetTraitLevel(TRAIT) >= LEVEL) +///Gets severity level with associated trait. Does not work for traits that have an metaoptions set. #define GET_TRAIT_LEVEL(MOB, TRAIT) M.GetTraitLevel(TRAIT) #define IS_METABOLICALLY_INERT(MOB) HAS_TRAIT(MOB, /singleton/trait/general/metabolically_inert) // This define exists only due to how common this check is #define METABOLIC_INERTNESS(MOB) GET_TRAIT_LEVEL(MOB, /singleton/trait/general/metabolically_inert) // See above diff --git a/code/datums/traits/maluses/allergy.dm b/code/datums/traits/maluses/allergy.dm new file mode 100644 index 0000000000000..c3a1c81dc2e30 --- /dev/null +++ b/code/datums/traits/maluses/allergy.dm @@ -0,0 +1,38 @@ +/singleton/trait/malus/allergy + name = "Allergy" + levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MAJOR) + ///Used to select which reagent mob is allergic to. + metaoptions = list( + /datum/reagent/antidexafen, + /datum/reagent/bicaridine, + /datum/reagent/citalopram, + /datum/reagent/dermaline, + /datum/reagent/drink/juice/apple, + /datum/reagent/drink/juice/berry, + /datum/reagent/drink/juice/garlic, + /datum/reagent/drink/juice/orange, + /datum/reagent/drink/kefir, + /datum/reagent/drink/thoom, + /datum/reagent/drugs/psilocybin, + /datum/reagent/drugs/three_eye, + /datum/reagent/ethanol/creme_de_menthe, + /datum/reagent/ethanol/gin, + /datum/reagent/ethanol/tequilla, + /datum/reagent/ethanol/vodka, + /datum/reagent/hyperzine, + /datum/reagent/kelotane, + /datum/reagent/nanoblood, + /datum/reagent/paracetamol, + /datum/reagent/paroxetine, + /datum/reagent/peridaxon, + /datum/reagent/spaceacillin, + /datum/reagent/tramadol, + /datum/reagent/tramadol/oxycodone, + /datum/reagent/tricordrazine, + /datum/reagent/toxin/amatoxin, + /datum/reagent/toxin/carpotoxin, + /datum/reagent/toxin/venom + ) + addprompt = "Select reagent to make mob allergic to." + remprompt = "Select reagent to remove allergy to." + selectable = TRUE diff --git a/code/datums/traits/maluses/animal_protein.dm b/code/datums/traits/maluses/animal_protein.dm index 294c7b4aa3833..dc36a3caa6e50 100644 --- a/code/datums/traits/maluses/animal_protein.dm +++ b/code/datums/traits/maluses/animal_protein.dm @@ -1,3 +1,3 @@ /singleton/trait/malus/animal_protein - name = "Animal Protein Allergy" + name = "Animal Protein Intolerance" levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MAJOR) diff --git a/code/datums/traits/maluses/ethanol.dm b/code/datums/traits/maluses/ethanol.dm index 77f974a855bc3..02f34ddb37cf1 100644 --- a/code/datums/traits/maluses/ethanol.dm +++ b/code/datums/traits/maluses/ethanol.dm @@ -1,3 +1,3 @@ /singleton/trait/malus/ethanol - name = "Ethanol Allergy" + name = "Ethanol Intolerance" levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MODERATE, TRAIT_LEVEL_MAJOR) diff --git a/code/datums/traits/maluses/sugar.dm b/code/datums/traits/maluses/sugar.dm index 95cd924988e32..aec06a452c125 100644 --- a/code/datums/traits/maluses/sugar.dm +++ b/code/datums/traits/maluses/sugar.dm @@ -1,3 +1,3 @@ /singleton/trait/malus/sugar - name = "Sugar Allergy" + name = "Sugar Intolerance" levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MAJOR) diff --git a/code/datums/traits/maluses/water.dm b/code/datums/traits/maluses/water.dm index 6fc5f2f1d2877..42979c899c9ea 100644 --- a/code/datums/traits/maluses/water.dm +++ b/code/datums/traits/maluses/water.dm @@ -1,4 +1,3 @@ /singleton/trait/malus/water - name = "Water Allergy" - description = "Also known as aquagenic urticaria." + name = "Water Intolerance" levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MODERATE, TRAIT_LEVEL_MAJOR) diff --git a/code/datums/traits/traits.dm b/code/datums/traits/traits.dm index b7298ddbe51c1..d7fbc88adf8b5 100644 --- a/code/datums/traits/traits.dm +++ b/code/datums/traits/traits.dm @@ -1,15 +1,24 @@ + /mob/living/proc/HasTrait(trait_type) SHOULD_NOT_OVERRIDE(TRUE) SHOULD_NOT_SLEEP(TRUE) return (trait_type in GetTraits()) -/mob/living/proc/GetTraitLevel(trait_type) +/mob/living/proc/GetTraitLevel(trait_type, meta_option) SHOULD_NOT_OVERRIDE(TRUE) SHOULD_NOT_SLEEP(TRUE) + var/singleton/trait/trait = GET_SINGLETON(trait_type) var/traits = GetTraits() if(!traits) return null - return traits[trait_type] + + if (length(trait.metaoptions)) + if (!meta_option) + return + var/list/interim = traits[trait_type] + return interim[meta_option] + + else return traits[trait_type] /mob/living/proc/GetTraits() SHOULD_NOT_SLEEP(TRUE) @@ -21,24 +30,44 @@ return traits return species.traits -/mob/living/proc/SetTrait(trait_type, trait_level) +/mob/living/proc/GetMetaOptions(trait_type) + RETURN_TYPE(/list) + if (!HasTrait(trait_type)) + return + var/singleton/trait/trait = GET_SINGLETON(trait_type) + if (!trait.metaoptions) + return + + return traits[trait_type] + +/mob/living/proc/SetTrait(trait_type, trait_level, meta_option) SHOULD_NOT_SLEEP(TRUE) - var/singleton/trait/T = GET_SINGLETON(trait_type) - if(!T.Validate(trait_level)) + var/singleton/trait/trait = GET_SINGLETON(trait_type) + if(!trait.Validate(trait_level, meta_option)) return FALSE - if (!LAZYISIN(traits, trait_type)) - for (var/existing_trait_types in traits) - var/singleton/trait/ET = GET_SINGLETON(existing_trait_types) - if (trait_type in ET.incompatible_traits) - return FALSE - - LAZYSET(traits, trait_type, trait_level) + for (var/existing_trait_types in traits) + var/singleton/trait/existing = GET_SINGLETON(existing_trait_types) + if (LAZYISIN(existing.incompatible_traits, trait_type) || LAZYISIN(trait.incompatible_traits, existing_trait_types)) + return FALSE + + if (length(trait.metaoptions)) + var/list/interim = list() + if (!LAZYISIN(traits, trait_type)) + LAZYSET(traits, trait_type, interim) + + var/list/existing_meta_options = traits[trait_type] + if (existing_meta_options[meta_option] == trait_level) + return FALSE + LAZYSET(existing_meta_options, meta_option, trait_level) + LAZYSET(traits, trait_type, existing_meta_options) + else + LAZYSET(traits, trait_type, trait_level) return TRUE -/mob/living/carbon/human/SetTrait(trait_type, trait_level) +/mob/living/carbon/human/SetTrait(trait_type, trait_level, additional_option) var/singleton/trait/T = GET_SINGLETON(trait_type) - if(!T.Validate(trait_level)) + if(!T.Validate(trait_level, additional_option)) return FALSE if(!traits) // If traits haven't been setup before, check if we need to do so now @@ -47,35 +76,97 @@ return TRUE traits = species.traits.Copy() // The setup is to simply copy the species list of traits - return ..(trait_type, trait_level) + return ..(trait_type, trait_level, additional_option) -/mob/living/proc/RemoveTrait(trait_type) +/mob/living/proc/RemoveTrait(trait_type, additional_option) + if (additional_option) + var/list/interim = traits[trait_type] + LAZYREMOVE(interim, additional_option) + if (length(interim)) //If there remains other associations with the singleton, stop removing. Else; also remove the singleton. + return LAZYREMOVE(traits, trait_type) -/mob/living/carbon/human/RemoveTrait(trait_type) +/mob/living/carbon/human/RemoveTrait(trait_type, additional_option) // If traits haven't been setup, but we're trying to remove a trait that exists on the species then setup traits if(!traits && (trait_type in species.traits)) traits = species.traits.Copy() - ..(trait_type) // Could go through the trouble of nulling the traits list if it's again equal to the species list but eh + ..(trait_type, additional_option) // Could go through the trouble of nulling the traits list if it's again equal to the species list but eh traits = traits || list() // But we do ensure that humans don't null their traits list, to avoid copying from species again +/proc/LetterizeSeverity(severity) + switch (severity) + if (TRAIT_LEVEL_EXISTS) + severity = "Exists" + if (TRAIT_LEVEL_MINOR) + severity = "Minor" + if (TRAIT_LEVEL_MODERATE) + severity = "Moderate" + if (TRAIT_LEVEL_MAJOR) + severity = "Severe" + else + crash_with("Inappopriate arguments fed into proc.") + return severity + +/proc/sanitize_trait_prefs(list/preferences) + RETURN_TYPE(/list) + var/list/final_preferences = list() + if (isnull(preferences)) + return list() + if (!islist(preferences)) + crash_with("Inappropriate argument fed into proc.") + return + if (!length(preferences)) + return list() + + for (var/trait in preferences) + var/trait_type = istext(trait) ? text2path(trait) : trait + var/singleton/trait/selected = GET_SINGLETON(trait_type) + var/severity + if (length(selected.metaoptions)) + var/list/interim = preferences[trait] + var/list/final_interim = list() + for (var/metaoption in interim) + var/metaoption_type = istext(metaoption) ? text2path(metaoption) : metaoption + severity = interim[metaoption] + LAZYSET(final_interim, metaoption_type, severity) + LAZYSET(final_preferences, trait_type, final_interim) + + else + severity = preferences[trait] + LAZYSET(final_preferences, trait_type, severity) + return final_preferences + /singleton/trait var/name var/description /// Should either only contain TRAIT_LEVEL_EXISTS or a set of the other TRAIT_LEVEL_* levels var/list/levels = list(TRAIT_LEVEL_EXISTS) + /// Additional list with unique paths to associate singleton with. if needed. Currently used for reagents in allergies only. + var/list/metaoptions = list() + ///Prompts seen when adding/removing additional traits; only for traits with metaoptions set + var/addprompt = "Select a property to add." + var/remprompt = "Select a property to remove." + /// These trait types may not co-exist on the same mob/species var/list/incompatible_traits abstract_type = /singleton/trait + ///List of species in which this trait is forbidden. + var/list/forbidden_species = list() + ///Determines if trait can be selected in character setup + var/selectable = FALSE + /singleton/trait/New() if(type == abstract_type) CRASH("Invalid initialization") -/singleton/trait/proc/Validate(level) +/singleton/trait/proc/Validate(level, meta_option) SHOULD_NOT_OVERRIDE(TRUE) SHOULD_NOT_SLEEP(TRUE) SHOULD_BE_PURE(TRUE) - return (level in levels) + if (length(metaoptions)) + return (level in levels) && (meta_option in metaoptions) + else + return (level in levels) \ No newline at end of file diff --git a/code/datums/uplink/highly_visible_and_dangerous_weapons.dm b/code/datums/uplink/highly_visible_and_dangerous_weapons.dm index e82ff3b8caa84..e315ae5f75bdc 100644 --- a/code/datums/uplink/highly_visible_and_dangerous_weapons.dm +++ b/code/datums/uplink/highly_visible_and_dangerous_weapons.dm @@ -222,3 +222,10 @@ item_cost = 12 path = /obj/item/gun/projectile/heavysniper/boltaction antag_roles = list(MODE_REVOLUTIONARY) + +/datum/uplink_item/item/visible_weapons/sniperlaser + name = "Marksman Energy Rifle" + desc = "An energy based long-range weapon. Not as powerful as a sniper rifle, but it can be recharged." + item_cost = 50 + path = /obj/item/gun/energy/sniperrifle + antag_roles = list(MODE_MERCENARY) diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index dc7a08df416e0..78f0025dd179f 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -87,9 +87,13 @@ if(mode.antag_scaling_coeff) var/count = 0 - for(var/mob/living/M in GLOB.player_list) - if(M.client) - count++ + if (GAME_STATE < RUNLEVEL_GAME) + count = length(GLOB.player_list) + else + for(var/mob/M in GLOB.living_players) + var/datum/job/job = SSjobs.get_by_title(M.mind.assigned_role) + if(job.create_record) + count++ // Minimum: initial_spawn_target // Maximum: hard_cap or hard_cap_round diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index aa1e34a15294e..a6c307615cb92 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -14,7 +14,7 @@ GLOBAL_DATUM_INIT(mercs, /datum/antagonist/mercenary, new) hard_cap = 4 hard_cap_round = 8 initial_spawn_req = 3 - initial_spawn_target = 5 + initial_spawn_target = 3 min_player_age = 14 faction = "mercenary" diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index 4392be3fe1e52..ba5441e4aaa97 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -13,7 +13,7 @@ GLOBAL_DATUM_INIT(raiders, /datum/antagonist/raider, new) hard_cap = 6 hard_cap_round = 10 initial_spawn_req = 3 - initial_spawn_target = 4 + initial_spawn_target = 3 min_player_age = 14 id_type = /obj/item/card/id/syndicate @@ -59,7 +59,7 @@ GLOBAL_DATUM_INIT(raiders, /datum/antagonist/raider, new) /obj/item/clothing/suit/storage/toggle/hoodie, /obj/item/clothing/suit/storage/toggle/hoodie/black, /obj/item/clothing/suit/unathi/mantle, - /obj/item/clothing/suit/poncho/colored, + /obj/item/clothing/suit/poncho, ) var/list/raider_guns = list( diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index 64dbf3fd2327d..d76c5184e194b 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -6,6 +6,7 @@ GLOBAL_DATUM_INIT(traitors, /datum/antagonist/traitor, new) antaghud_indicator = "hud_traitor" blacklisted_jobs = list(/datum/job/ai, /datum/job/submap) restricted_jobs = list(/datum/job/captain, /datum/job/lawyer, /datum/job/hos) + initial_spawn_target = 1 flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE skill_setter = /datum/antag_skill_setter/station diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 12d9d2a471980..65f98efabc7ab 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -240,7 +240,7 @@ * - `mover` - The atom that's attempting to move. * - `target` - The detination turf `mover` is attempting to move to. * - * Returns boolean. If `FALSE`, blocks movement and calls `mover.Bump(src)`. + * Returns boolean. If `FALSE`, blocks movement and calls `mover.Bump(src, TRUE)`. */ /atom/proc/CheckExit(atom/movable/mover, turf/target) return TRUE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 5457e30086b71..2f3a174553695 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -159,18 +159,19 @@ particles = null return ..() -/atom/movable/Bump(atom/A, yes) - if(!QDELETED(throwing)) - throwing.hit_atom(A) - if(inertia_dir) +/// Called should be true when calling this in code. +/atom/movable/Bump(atom/A, called) + if (!QDELETED(throwing)) + throwing.hit_atom(A) + if (inertia_dir) inertia_dir = 0 - - if (A && yes) + if (A && called) A.last_bumped = world.time invoke_async(A, TYPE_PROC_REF(/atom, Bumped), src) // Avoids bad actors sleeping or unexpected side effects, as the legacy behavior was to spawn here ..() + /atom/movable/proc/forceMove(atom/destination) if((gc_destroyed && gc_destroyed != GC_CURRENTLY_BEING_QDELETED) && !isnull(destination)) CRASH("Attempted to forceMove a QDELETED [src] out of nullspace!!!") diff --git a/code/game/gamemodes/cult/narsie.dm b/code/game/gamemodes/cult/narsie.dm index 9aca1b754f9f1..fdb0c0a447a77 100644 --- a/code/game/gamemodes/cult/narsie.dm +++ b/code/game/gamemodes/cult/narsie.dm @@ -83,7 +83,7 @@ var/global/list/narsie_list = list() M.apply_effect(3, EFFECT_STUN) -/obj/singularity/narsie/large/Bump(atom/A) +/obj/singularity/narsie/large/Bump(atom/A, called) if(!cause_hell) return if(isturf(A)) narsiewall(A) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 063abf86150b9..eb2441ba374a0 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -329,6 +329,13 @@ var/global/list/additional_antag_types = list() if(client.mob && client.mob.mind) client.mob.mind.show_roundend_summary(departmental_goal_summary) + //[SIERRA-ADD] - ANOMALY + //Данный отрезок кода выведет информацию об моде АНОМАЛИИ в раунде + var/anomaly_output = SSanom.give_gameover_text() + if(anomaly_output) + text += anomaly_output + //[SIERRA-ADD] + to_world(text) send2mainirc("A round of [src.name] has ended - [data["surviving_total"]] survivor\s, [data["ghosts"]] ghost\s.") diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 4ceae7a29cf1f..0fb8a16f583af 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -176,7 +176,7 @@ var/global/list/meteors_cataclysm = list(\ if (!ismissile) SpinAnimation() -/obj/meteor/Bump(atom/A) +/obj/meteor/Bump(atom/A, called) ..() if(A && !QDELETED(src)) // Prevents explosions and other effects when we were deleted by whatever we Bumped() - currently used by shields. ram_turf(get_turf(A)) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 7238f7ab4adb4..cbe94ebc1694b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -42,7 +42,7 @@ var/global/list/all_objectives = list() /datum/objective/assassinate/find_target() ..() if(target && target.current) - explanation_text = "Ликвидируйте [target.current.real_name], [target.assigned_role]." + explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]." else explanation_text = "Free Objective" return target @@ -50,7 +50,7 @@ var/global/list/all_objectives = list() /datum/objective/assassinate/find_target_by_role(role, role_type = 0) ..(role, role_type) if(target && target.current) - explanation_text = "Ликвидируйте [target.current.real_name], [!role_type ? target.assigned_role : target.special_role]." + explanation_text = "Assassinate [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]." else explanation_text = "Free Objective" return target @@ -60,7 +60,7 @@ var/global/list/all_objectives = list() /datum/objective/anti_revolution/execute/find_target() ..() if(target && target.current) - explanation_text = "[target.current.real_name], [target.assigned_role] неавторизовано извлек конфиденциальную информацию. Ликвидируйте данную цель." + explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them." else explanation_text = "Free Objective" return target @@ -68,7 +68,7 @@ var/global/list/all_objectives = list() /datum/objective/anti_revolution/execute/find_target_by_role(role, role_type = 0) ..(role, role_type) if(target && target.current) - explanation_text = "[target.current.real_name], [!role_type ? target.assigned_role : target.special_role] неавторизовано извлек конфиденциальную информацию. Ликвидируйте данную цель." + explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute them." else explanation_text = "Free Objective" return target @@ -81,7 +81,7 @@ var/global/list/all_objectives = list() /datum/objective/anti_revolution/brig/find_target() ..() if(target && target.current) - explanation_text = "Посадите [target.current.real_name], [target.assigned_role] в камеру заключения на 20 минут или больше, чтобы преподать урок." + explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example." else explanation_text = "Free Objective" return target @@ -89,7 +89,7 @@ var/global/list/all_objectives = list() /datum/objective/anti_revolution/brig/find_target_by_role(role, role_type = 0) ..(role, role_type) if(target && target.current) - explanation_text = "Посадите [target.current.real_name], [!role_type ? target.assigned_role : target.special_role] в камеру заключения на 20 минут или больше, чтобы преподать урок." + explanation_text = "Brig [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] for 20 minutes to set an example." else explanation_text = "Free Objective" return target @@ -99,7 +99,7 @@ var/global/list/all_objectives = list() /datum/objective/anti_revolution/demote/find_target() ..() if(target && target.current) - explanation_text = "[target.current.real_name], [target.assigned_role] был классифицирован как вредный для выполнения целей [GLOB.using_map.company_name]. Понизьте его до низшей должности" + explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [GLOB.using_map.company_name]'s goals. Demote them to assistant." else explanation_text = "Free Objective" return target @@ -107,7 +107,7 @@ var/global/list/all_objectives = list() /datum/objective/anti_revolution/demote/find_target_by_role(role, role_type = 0) ..(role, role_type) if(target && target.current) - explanation_text = "[target.current.real_name], [!role_type ? target.assigned_role : target.special_role] был классифицирован как вредный для выполнения целей [GLOB.using_map.company_name] Понизьте его до низшей должномти" + explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [GLOB.using_map.company_name]'s goals. Demote them to assistant." else explanation_text = "Free Objective" return target @@ -117,7 +117,7 @@ var/global/list/all_objectives = list() /datum/objective/debrain/find_target() ..() if(target && target.current) - explanation_text = "Украдите мозг [target.current.real_name]." + explanation_text = "Steal the brain of [target.current.real_name]." else explanation_text = "Free Objective" return target @@ -125,7 +125,7 @@ var/global/list/all_objectives = list() /datum/objective/debrain/find_target_by_role(role, role_type = 0) ..(role, role_type) if(target && target.current) - explanation_text = "Украдите мозг [target.current.real_name], [!role_type ? target.assigned_role : target.special_role]." + explanation_text = "Steal the brain of [target.current.real_name] the [!role_type ? target.assigned_role : target.special_role]." else explanation_text = "Free Objective" return target @@ -135,7 +135,7 @@ var/global/list/all_objectives = list() /datum/objective/protect/find_target() ..() if(target && target.current) - explanation_text = "Защитите [target.current.real_name], [target.assigned_role]." + explanation_text = "Protect [target.current.real_name], the [target.assigned_role]." else explanation_text = "Free Objective" return target @@ -144,7 +144,7 @@ var/global/list/all_objectives = list() /datum/objective/protect/find_target_by_role(role, role_type = 0) ..(role, role_type) if(target && target.current) - explanation_text = "Защитите [target.current.real_name], [!role_type ? target.assigned_role : target.special_role]." + explanation_text = "Protect [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]." else explanation_text = "Free Objective" return target @@ -152,17 +152,17 @@ var/global/list/all_objectives = list() // Hijack // /datum/objective/hijack - explanation_text = "Угоните шаттл." + explanation_text = "Hijack a shuttle." // Shuttle Escape // /datum/objective/escape - explanation_text = "Сбегите на шаттле или эвакуационном поде живым и несвязанным." + explanation_text = "Escape on the shuttle or an escape pod alive and free." // Survive // /datum/objective/survive - explanation_text = "Выживите до окончания смены." + explanation_text = "Stay alive until the end." // Brig, similar to the anti-rev objective, but for traitors // @@ -172,7 +172,7 @@ var/global/list/all_objectives = list() /datum/objective/brig/find_target() ..() if(target && target.current) - explanation_text = "Посадите [target.current.real_name], [target.assigned_role] в камеру заключения на 10 минут." + explanation_text = "Have [target.current.real_name], the [target.assigned_role] brigged for 10 minutes." else explanation_text = "Free Objective" return target @@ -180,7 +180,7 @@ var/global/list/all_objectives = list() /datum/objective/brig/find_target_by_role(role, role_type = 0) ..(role, role_type) if(target && target.current) - explanation_text = "Посадите [target.current.real_name], [!role_type ? target.assigned_role : target.special_role] в камеру заключения на 10 минут." + explanation_text = "Have [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] brigged for 10 minutes." else explanation_text = "Free Objective" return target @@ -193,7 +193,7 @@ var/global/list/all_objectives = list() /datum/objective/harm/find_target() ..() if(target && target.current) - explanation_text = "Преподайте урок [target.current.real_name], [target.assigned_role].Сломайте кость, отрубите конечность или изуродуйте лицо. Убедитесь, что цель переживет это." + explanation_text = "Make an example of [target.current.real_name], the [target.assigned_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it." else explanation_text = "Free Objective" return target @@ -201,7 +201,7 @@ var/global/list/all_objectives = list() /datum/objective/harm/find_target_by_role(role, role_type = 0) ..(role, role_type) if(target && target.current) - explanation_text = "Преподайте урок [target.current.real_name], [!role_type ? target.assigned_role : target.special_role]. Сломайте кость, отрубите конечность или изуродуйте лицо. Убедитесь, что цель переживет это." + explanation_text = "Make an example of [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it." else explanation_text = "Free Objective" return target @@ -209,7 +209,7 @@ var/global/list/all_objectives = list() // Nuclear Explosion // /datum/objective/nuclear - explanation_text = "Уничтожьте судно с помощью устройства самоуничтожения" + explanation_text = "Cause mass destruction with a nuclear device." // Steal // @@ -219,26 +219,26 @@ var/global/list/all_objectives = list() var/target_name var/static/possible_items[] = list( - "капитанский лазерный револьвер" = /obj/item/gun/energy/captain, - "генератор блюспейс разлома" = /obj/item/integrated_circuit/manipulation/bluespace_rift, - "устройство RCD" = /obj/item/rcd, - "реактивный ранец" = /obj/item/tank/jetpack, - "форму капитана" = /obj/item/clothing/under/rank/captain, - "функционирующий ИИ" = /obj/item/aicard, - "пару магнитных ботинок" = /obj/item/clothing/shoes/magboots, - "чертежи [station_name()]" = /obj/item/blueprints, + "the captain's antique laser gun" = /obj/item/gun/energy/captain, + "a bluespace rift generator" = /obj/item/integrated_circuit/manipulation/bluespace_rift, + "an RCD" = /obj/item/rcd, + "a jetpack" = /obj/item/tank/jetpack, + "a captain's jumpsuit" = /obj/item/clothing/under/rank/captain, + "a functional AI" = /obj/item/aicard, + "a pair of magboots" = /obj/item/clothing/shoes/magboots, + "the [station_name()] blueprints" = /obj/item/blueprints, "a nasa voidsuit" = /obj/item/clothing/suit/space/void, - "28 молей форона (полный баллон)" = /obj/item/tank, - "образец экстракта слизня" = /obj/item/slime_extract, - "кусок мяса корги" = /obj/item/reagent_containers/food/snacks/meat/corgi, - "форму Директора Исследований" = /obj/item/clothing/under/rank/research_director, - "Форму Главного Инженера" = /obj/item/clothing/under/rank/chief_engineer, - "форму Главного Врача" = /obj/item/clothing/under/rank/chief_medical_officer, - "форму Главы Службы Безопасности" = /obj/item/clothing/under/rank/head_of_security, - "форму Главы Персонала" = /obj/item/clothing/under/rank/head_of_personnel, - "гипоспрей" = /obj/item/reagent_containers/hypospray, - "капитанский целеуказатель" = /obj/item/pinpointer, - "абляционный бронежилет" = /obj/item/clothing/suit/armor/laserproof, + "28 moles of phoron (full tank)" = /obj/item/tank, + "a sample of slime extract" = /obj/item/slime_extract, + "a piece of corgi meat" = /obj/item/reagent_containers/food/snacks/meat/corgi, + "a chief science officer's jumpsuit" = /obj/item/clothing/under/rank/research_director, + "a chief engineer's jumpsuit" = /obj/item/clothing/under/rank/chief_engineer, + "a chief medical officer's jumpsuit" = /obj/item/clothing/under/rank/chief_medical_officer, + "a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security, + "a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel, + "the hypospray" = /obj/item/reagent_containers/hypospray, + "the captain's pinpointer" = /obj/item/pinpointer, + "an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof, ) var/static/possible_items_special[] = list( @@ -257,7 +257,7 @@ var/global/list/all_objectives = list() steal_target = possible_items[target_name] if (!steal_target ) steal_target = possible_items_special[target_name] - explanation_text = "Украдите [target_name]." + explanation_text = "Steal [target_name]." return steal_target @@ -279,7 +279,7 @@ var/global/list/all_objectives = list() if (!custom_name) return target_name = custom_name steal_target = custom_target - explanation_text = "Украдитеl [target_name]." + explanation_text = "Steal [target_name]." else set_target(new_target) return steal_target @@ -288,7 +288,7 @@ var/global/list/all_objectives = list() /datum/objective/download/proc/gen_amount_goal() target_amount = rand(10,20) - explanation_text = "Скачайте [target_amount] научных уровней." + explanation_text = "Download [target_amount] research levels." return target_amount // Capture // @@ -315,7 +315,7 @@ var/global/list/all_objectives = list() n_p ++ target_amount = min(target_amount, n_p) - explanation_text = "Поглотите [target_amount] совместимых геномов." + explanation_text = "Absorb [target_amount] compatible genomes." return target_amount // Heist objectives. @@ -344,7 +344,7 @@ var/global/list/all_objectives = list() target = pick(possible_targets) if(target && target.current) - explanation_text = "Мы можем получить хорошую цену за [target.current.real_name], [target.assigned_role]. Необходимо забрать цель живой." + explanation_text = "We can get a good price for [target.current.real_name], the [target.assigned_role]. Take them alive." else explanation_text = "Free Objective" return target @@ -355,37 +355,37 @@ var/global/list/all_objectives = list() if(1) target = /obj/structure/particle_accelerator target_amount = 6 - loot = "полноценный ускоритель частиц" + loot = "a complete particle accelerator" if(2) target = /obj/machinery/the_singularitygen target_amount = 1 - loot = "гравитационный генератор" + loot = "a gravitational generator" if(3) target = /obj/machinery/power/emitter target_amount = 4 - loot = "четыре эмиттера" + loot = "four emitters" if(4) target = /obj/machinery/nuclearbomb target_amount = 1 - loot = "ядерную бомбу" + loot = "a nuclear bomb" if(5) target = /obj/item/gun target_amount = 6 - loot = "шесть пушек" + loot = "six guns" if(6) target = /obj/item/gun/energy target_amount = 4 - loot = "четыре энергооружия" + loot = "four energy guns" if(7) target = /obj/item/gun/energy/laser target_amount = 2 - loot = "два энергетических ружья" + loot = "two laser guns" if(8) target = /obj/item/gun/energy/ionrifle target_amount = 1 - loot = "ионную винтовку" + loot = "an ion gun" - explanation_text = "В этой системе есть торговый хаб. Украсть [loot] для перепродажи." + explanation_text = "It's a buyer's market out here. Steal [loot] for resale." /datum/objective/heist/salvage/choose_target() switch(rand(1,8)) @@ -414,34 +414,34 @@ var/global/list/all_objectives = list() target = MATERIAL_DIAMOND target_amount = 20 - explanation_text = "Обворуйте [station_name()] и сбегите с [target_amount] [target]." + explanation_text = "Ransack the [station_name()] and escape with [target_amount] [target]." /datum/objective/heist/preserve_crew - explanation_text = "Мы не бросаем своих. Ни живыми, ни мертвыми" + explanation_text = "Do not leave anyone behind, alive or dead." //Borer objective(s). /datum/objective/borer_survive - explanation_text = "Продержаться в хозяине до конца раунда" + explanation_text = "Survive in a host until the end of the round." /datum/objective/borer_reproduce - explanation_text = "Репродуцироваться хотя бы раз." + explanation_text = "Reproduce at least once." /datum/objective/ninja_highlander - explanation_text = "Ты стремишься стать великим мастером Клана Пауков. Убей всех своих товарищей-послушников." + explanation_text = "You aspire to be a Grand Master of the Spider Clan. Kill all of your fellow acolytes." /datum/objective/cult/survive - explanation_text = "Наши знания должны жить" + explanation_text = "Our knowledge must live on." target_amount = 5 /datum/objective/cult/survive/New() ..() - explanation_text = "Наши знания должны жить. Убедитесь, что хотя бы [target_amount] аколитов сбежало, чтобы распространять нашу веру" + explanation_text = "Our knowledge must live on. Make sure at least [target_amount] acolytes escape to spread their work." /datum/objective/cult/eldergod - explanation_text = "Призовите Нар-Си, используя соответствующую руну (Hell join self). Это сработает, только если девять культистов встанут на нее и вокруг нее." + explanation_text = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it. The convert rune is join blood self." /datum/objective/cult/sacrifice - explanation_text = "Совершите ритуал жертвоприношения во славу Нар-Си." + explanation_text = "Conduct a ritual sacrifice for the glory of Nar-Sie." /datum/objective/cult/sacrifice/find_target() var/list/possible_targets = list() @@ -451,12 +451,12 @@ var/global/list/all_objectives = list() possible_targets += player.mind if(length(possible_targets) > 0) target = pick(possible_targets) - if(target) explanation_text = "Принесите жертву [target.name], [target.assigned_role]. Для этого вам понадобится руна жертвоприношения (Hell blood join) и три аколита." + if(target) explanation_text = "Sacrifice [target.name], the [target.assigned_role]. You will need the sacrifice rune (Hell blood join) and three acolytes to do so." /datum/objective/rev/find_target() ..() if(target && target.current) - explanation_text = "Ликвидировать, захватить или завербовать [target.current.real_name], [target.assigned_role]." + explanation_text = "Assassinate, capture or convert [target.current.real_name], the [target.assigned_role]." else explanation_text = "Free Objective" return target @@ -464,7 +464,7 @@ var/global/list/all_objectives = list() /datum/objective/rev/find_target_by_role(role, role_type=0) ..(role, role_type) if(target && target.current) - explanation_text = "Ликвидировать, захватить или завербовать [target.current.real_name], [!role_type ? target.assigned_role : target.special_role]." + explanation_text = "Assassinate, capture or convert [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]." else explanation_text = "Free Objective" return target diff --git a/code/game/machinery/_machines_base/machine_construction/_construction.dm b/code/game/machinery/_machines_base/machine_construction/_construction.dm index 05f5bffc1a37d..fd2d6093feb34 100644 --- a/code/game/machinery/_machines_base/machine_construction/_construction.dm +++ b/code/game/machinery/_machines_base/machine_construction/_construction.dm @@ -78,15 +78,23 @@ machine.attack_hand(user) return TRUE -/* -This returning FALSE means if component_attackby under use_tool called this it will also return FALSE; which means the use_tool call will proceed. -In that same vein, the attackby() children of this proc will also continue the rest of its code if this crashes; since this check is called at the beginning. -*/ -/singleton/machine_construction/proc/attackby(obj/item/I, mob/user, obj/machinery/machine) - if(!validate_state(machine)) + +/** + * Handles tool usage on the parent machine. Has the same return rules as `/atom/proc/use_tool()`. + * + * **Parameters**: + * - `tool` - The item being used. + * - `user` - The mob performing the interaction. + * - `machine` - The parent machine being interacted with. + * + * Returns boolean. Indicates whether the interaction was handled or not. If `TRUE`, no other interactions will occur. + */ +/singleton/machine_construction/proc/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + if (!validate_state(machine)) crash_with("Machine [log_info_line(machine)] violated the state assumptions of the construction state [type]!") return FALSE + /singleton/machine_construction/proc/mechanics_info() // Used to transfer state as needed post-construction. diff --git a/code/game/machinery/_machines_base/machine_construction/computer.dm b/code/game/machinery/_machines_base/machine_construction/computer.dm index 7e6baff142488..5c1cf86865782 100644 --- a/code/game/machinery/_machines_base/machine_construction/computer.dm +++ b/code/game/machinery/_machines_base/machine_construction/computer.dm @@ -4,7 +4,7 @@ down_state = /singleton/machine_construction/default/panel_open/computer needs_board = "computer" -/singleton/machine_construction/default/panel_closed/computer/no_deconstruct/attackby(obj/item/I, mob/user, obj/machinery/machine) +/singleton/machine_construction/default/panel_closed/computer/no_deconstruct/use_tool(obj/item/tool, mob/user, obj/machinery/machine) return FALSE /singleton/machine_construction/default/panel_open/computer diff --git a/code/game/machinery/_machines_base/machine_construction/default.dm b/code/game/machinery/_machines_base/machine_construction/default.dm index 1429da282eb74..b08baa12fba8b 100644 --- a/code/game/machinery/_machines_base/machine_construction/default.dm +++ b/code/game/machinery/_machines_base/machine_construction/default.dm @@ -5,8 +5,10 @@ var/up_state var/down_state -/singleton/machine_construction/default/no_deconstruct/attackby(obj/item/I, mob/user, obj/machinery/machine) - . = FALSE + +/singleton/machine_construction/default/no_deconstruct/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + return FALSE + /singleton/machine_construction/default/panel_closed down_state = /singleton/machine_construction/default/panel_open @@ -19,23 +21,38 @@ if(!.) try_change_state(machine, down_state) -/singleton/machine_construction/default/panel_closed/attackby(obj/item/I, mob/user, obj/machinery/machine) - if((. = ..())) - return + +/singleton/machine_construction/default/panel_closed/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + . = ..() + if (.) + return TRUE + if (!machine.can_use_tools) - to_chat(user, SPAN_WARNING("\The [src] cannot be modified!")) + USE_FEEDBACK_FAILURE("\The [src] cannot be modified.") return TRUE - if(isScrewdriver(I)) + + // Screwdriver - Open maintenance panel + if (isScrewdriver(tool)) TRANSFER_STATE(down_state) - playsound(get_turf(machine), 'sound/items/Screwdriver.ogg', 50, 1) + playsound(machine, 'sound/items/Screwdriver.ogg', 50, TRUE) machine.panel_open = TRUE - to_chat(user, SPAN_NOTICE("You open the maintenance hatch of \the [machine].")) + user.visible_message( + SPAN_NOTICE("\The [user] opens \a [machine]'s maintenance panel with \a [tool]."), + SPAN_NOTICE("You open \the [machine]'s maintenance panel with \the [tool].") + ) machine.update_icon() - return - if(istype(I, /obj/item/storage/part_replacer)) + return TRUE + + // Part Replacer - List parts. + if (istype(tool, /obj/item/storage/part_replacer)) + user.visible_message( + SPAN_NOTICE("\The [user] scans \a [machine] with \a [tool]."), + SPAN_NOTICE("You scan \the [machine] with \the [tool].") + ) machine.display_parts(user) return TRUE + /singleton/machine_construction/default/panel_closed/post_construct(obj/machinery/machine) try_change_state(machine, down_state) machine.panel_open = TRUE @@ -61,29 +78,46 @@ if(!.) try_change_state(machine, up_state) -/singleton/machine_construction/default/panel_open/attackby(obj/item/I, mob/user, obj/machinery/machine) - if((. = ..())) + +/singleton/machine_construction/default/panel_open/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + . = ..() + if (.) return - if(isCrowbar(I)) + + // Crowbar - Dismantle machine. + if (isCrowbar(tool)) TRANSFER_STATE(down_state) + user.visible_message( + SPAN_NOTICE("\The [user] dismantles \a [machine] with \a [tool]."), + SPAN_NOTICE("You dismantle \the [machine] with \the [tool].") + ) machine.dismantle() - return - if(isScrewdriver(I)) + return TRUE + + // Screwdriver - Close panel. + if (isScrewdriver(tool)) TRANSFER_STATE(up_state) - playsound(get_turf(machine), 'sound/items/Screwdriver.ogg', 50, 1) + playsound(machine, 'sound/items/Screwdriver.ogg', 50, TRUE) machine.panel_open = FALSE - to_chat(user, SPAN_NOTICE("You close the maintenance hatch of \the [machine].")) + user.visible_message( + SPAN_NOTICE("\The [user] closes \a [machine]'s maintenance hatch with \a [tool]."), + SPAN_NOTICE("You close \the [machine]'s maintenance panel with \the [tool].") + ) machine.update_icon() - return + return TRUE + + // Part replacer - Replace parts. + if (istype(tool, /obj/item/storage/part_replacer)) + return machine.part_replacement(user, tool) - if(istype(I, /obj/item/storage/part_replacer)) - return machine.part_replacement(user, I) + // Wrench - Remove individual part. + if (isWrench(tool)) + return machine.part_removal(user, tool) - if(isWrench(I)) - return machine.part_removal(user) + // Items - Attempt part insertion. + if (istype(tool)) + return machine.part_insertion(user, tool) - if(istype(I)) - return machine.part_insertion(user, I) /singleton/machine_construction/default/panel_open/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/frame.dm b/code/game/machinery/_machines_base/machine_construction/frame.dm index 268b709d7194e..cdb7a6372e8cf 100644 --- a/code/game/machinery/_machines_base/machine_construction/frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/frame.dm @@ -11,24 +11,46 @@ else try_change_state(machine, /singleton/machine_construction/frame/wrenched) -/singleton/machine_construction/frame/unwrenched/attackby(obj/item/I, mob/user, obj/machinery/machine) - if(isWrench(I)) - playsound(machine.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, (I.toolspeed * 2) SECONDS, machine, DO_REPAIR_CONSTRUCT)) - TRANSFER_STATE(/singleton/machine_construction/frame/wrenched) - to_chat(user, SPAN_NOTICE("You wrench \the [machine] into place.")) - machine.anchored = TRUE - if(isWelder(I)) - var/obj/item/weldingtool/WT = I - if(!WT.can_use(3, user)) + +/singleton/machine_construction/frame/unwrenched/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + // Wrench - Anchor machine. + if (isWrench(tool)) + user.visible_message( + SPAN_NOTICE("\The [user] begins securing \the [machine] to the floor with \a [tool]."), + SPAN_NOTICE("You begin securing \the [machine] to the floor with \the [tool].") + ) + playsound(machine, 'sound/items/Ratchet.ogg', 50, TRUE) + if (!user.do_skilled((tool.toolspeed * 2 SECONDS), SKILL_CONSTRUCTION, machine, do_flags = DO_REPAIR_CONSTRUCT) || !user.use_sanity_check(machine, tool)) + return TRUE + TRANSFER_STATE(/singleton/machine_construction/frame/wrenched) + user.visible_message( + SPAN_NOTICE("\The [user] secures \a [machine] to the floor with \a [tool]."), + SPAN_NOTICE("You secure \the [machine] to the floor with \the [tool].") + ) + machine.anchored = TRUE + machine.post_anchor_change() + return TRUE + + if (isWelder(tool)) + var/obj/item/weldingtool/welder = tool + if (!welder.can_use(3, user)) + return TRUE + playsound(machine, 'sound/items/Welder.ogg', 50, TRUE) + user.visible_message( + SPAN_NOTICE("\The [user] starts dismantling \a [machine] with \a [tool]."), + SPAN_NOTICE("You start dismantling \the [machine] with \the [tool].") + ) + if (!user.do_skilled(tool.toolspeed * 2 SECONDS, SKILL_CONSTRUCTION, machine, do_flags = DO_REPAIR_CONSTRUCT) || !user.use_sanity_check(machine, tool)) return TRUE - playsound(machine.loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, (I.toolspeed * 2) SECONDS, machine, DO_REPAIR_CONSTRUCT)) - if (!WT.remove_fuel(3, user)) - return TRUE - TRANSFER_STATE(/singleton/machine_construction/default/deconstructed) - to_chat(user, SPAN_NOTICE("You deconstruct \the [machine].")) - machine.dismantle() + if (!welder.remove_fuel(3, user)) + return TRUE + TRANSFER_STATE(/singleton/machine_construction/default/deconstructed) + user.visible_message( + SPAN_NOTICE("\The [user] dismantles \a [machine] with \a [tool]."), + SPAN_NOTICE("You dismantle \the [machine] with \the [tool].") + ) + machine.dismantle() + return TRUE /singleton/machine_construction/frame/unwrenched/mechanics_info() @@ -47,24 +69,47 @@ else try_change_state(machine, /singleton/machine_construction/frame/unwrenched) -/singleton/machine_construction/frame/wrenched/attackby(obj/item/I, mob/user, obj/machinery/machine) - if(isWrench(I)) - playsound(machine.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, (I.toolspeed * 2) SECONDS, machine, DO_REPAIR_CONSTRUCT)) - TRANSFER_STATE(/singleton/machine_construction/frame/unwrenched) - to_chat(user, SPAN_NOTICE("You unfasten \the [machine].")) - machine.anchored = FALSE - return - if(isCoil(I)) - var/obj/item/stack/cable_coil/C = I - if(C.get_amount() < 5) - to_chat(user, SPAN_WARNING("You need five lengths of cable to add them to \the [machine].")) + +/singleton/machine_construction/frame/wrenched/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + // Wrench. Anchor machine. + if (isWrench(tool)) + user.visible_message( + SPAN_NOTICE("\The [user] begins unsecuring \the [machine] from the floor with \a [tool]."), + SPAN_NOTICE("You begin unsecuring \the [machine] from the floor with \the [tool].") + ) + playsound(machine, 'sound/items/Ratchet.ogg', 50, TRUE) + if (!user.do_skilled((tool.toolspeed * 2 SECONDS), SKILL_CONSTRUCTION, machine, do_flags = DO_REPAIR_CONSTRUCT) || !user.use_sanity_check(machine, tool)) + return TRUE + TRANSFER_STATE(/singleton/machine_construction/frame/unwrenched) + user.visible_message( + SPAN_NOTICE("\The [user] unsecures \a [machine] from the floor with \a [tool]."), + SPAN_NOTICE("You unsecure \the [machine] from the floor with \the [tool].") + ) + machine.anchored = FALSE + machine.post_anchor_change() + return TRUE + + // Cable coil. Wire machine. + if (isCoil(tool)) + var/obj/item/stack/cable_coil/cable_coil = tool + if (!cable_coil.can_use(5)) + USE_FEEDBACK_STACK_NOT_ENOUGH(cable_coil, 5, "to wire \the [machine].") return TRUE - playsound(machine.loc, 'sound/items/Deconstruct.ogg', 50, 1) - to_chat(user, SPAN_NOTICE("You start to add cables to the frame.")) - if(do_after(user, 2 SECONDS, machine, DO_REPAIR_CONSTRUCT) && C.use(5)) - TRANSFER_STATE(/singleton/machine_construction/frame/awaiting_circuit) - to_chat(user, SPAN_NOTICE("You add cables to the frame.")) + playsound(machine, 'sound/items/Deconstruct.ogg', 50, TRUE) + user.visible_message( + SPAN_NOTICE("\The [user] starts wiring \a [machine] with [cable_coil.get_vague_name(TRUE)]."), + SPAN_NOTICE("You start wiring \the [machine] with [cable_coil.get_exact_name(5)].") + ) + if (!user.do_skilled(2 SECONDS, SKILL_ELECTRICAL, machine, do_flags = DO_REPAIR_CONSTRUCT) || !user.use_sanity_check(machine, tool)) + return TRUE + if (!cable_coil.use(5)) + USE_FEEDBACK_STACK_NOT_ENOUGH(cable_coil, 5, "to wire \the [machine].") + return TRUE + TRANSFER_STATE(/singleton/machine_construction/frame/awaiting_circuit) + user.visible_message( + SPAN_NOTICE("\The [user] wires \a [machine] with [cable_coil.get_vague_name(TRUE)]."), + SPAN_NOTICE("You wire \the [machine] with [cable_coil.get_exact_name(5)].") + ) return TRUE @@ -84,26 +129,38 @@ else try_change_state(machine, /singleton/machine_construction/frame/unwrenched) -/singleton/machine_construction/frame/awaiting_circuit/attackby(obj/item/I, mob/user, obj/machinery/constructable_frame/machine) - if(istype(I, /obj/item/stock_parts/circuitboard)) - var/obj/item/stock_parts/circuitboard/circuit = I - if(circuit.board_type == machine.expected_machine_type) - if(!user.canUnEquip(I)) - return FALSE - TRANSFER_STATE(/singleton/machine_construction/frame/awaiting_parts) - user.unEquip(I, machine) - playsound(machine.loc, 'sound/items/Deconstruct.ogg', 50, 1) - to_chat(user, SPAN_NOTICE("You add the circuit board to \the [machine].")) - machine.circuit = I - return - else - to_chat(user, SPAN_WARNING("This frame does not accept circuit boards of this type!")) + +/singleton/machine_construction/frame/awaiting_circuit/use_tool(obj/item/tool, mob/user, obj/machinery/constructable_frame/machine) + // Circuitboard - Install circuits. + if (istype(tool, /obj/item/stock_parts/circuitboard)) + var/obj/item/stock_parts/circuitboard/circuit = tool + if (circuit.board_type != machine.expected_machine_type) + USE_FEEDBACK_FAILURE("\The [machine] does not accept \the [circuit]'s board type.") + return TRUE + if (!user.canUnEquip(tool)) + FEEDBACK_UNEQUIP_FAILURE(user, tool) return TRUE - if(isWirecutter(I)) + TRANSFER_STATE(/singleton/machine_construction/frame/awaiting_parts) + user.unEquip(tool, machine) + playsound(machine, 'sound/items/Deconstruct.ogg', 50, TRUE) + user.visible_message( + SPAN_NOTICE("\The [user] adds \a [tool] to \a [machine]."), + SPAN_NOTICE("You add \the [tool] to \the [machine].") + ) + machine.circuit = tool + return TRUE + + // Wirecutter - Remove wiring. + if (isWirecutter(tool)) TRANSFER_STATE(/singleton/machine_construction/frame/wrenched) - playsound(machine.loc, 'sound/items/Wirecutter.ogg', 50, 1) - to_chat(user, SPAN_NOTICE("You remove the cables.")) + playsound(machine, 'sound/items/Wirecutter.ogg', 50, TRUE) + user.visible_message( + SPAN_NOTICE("\The [user] removes \a [machine]'s wiring with \a [tool]."), + SPAN_NOTICE("You remove \the [machine]'s wiring with \the [tool].") + ) new /obj/item/stack/cable_coil(machine.loc, 5) + return TRUE + /singleton/machine_construction/frame/awaiting_circuit/mechanics_info() . = list() @@ -121,16 +178,22 @@ else try_change_state(machine, /singleton/machine_construction/frame/unwrenched) -/singleton/machine_construction/frame/awaiting_parts/attackby(obj/item/I, mob/user, obj/machinery/constructable_frame/machine) - if(isCrowbar(I)) +/singleton/machine_construction/frame/awaiting_parts/use_tool(obj/item/tool, mob/user, obj/machinery/constructable_frame/machine) + // Crowbar. Remove circuit board. + if (isCrowbar(tool)) TRANSFER_STATE(/singleton/machine_construction/frame/awaiting_circuit) - playsound(machine.loc, 'sound/items/Crowbar.ogg', 50, 1) + playsound(machine, 'sound/items/Crowbar.ogg', 50, TRUE) + user.visible_message( + SPAN_NOTICE("\The [user] removes \a [machine]'s circuit board with \a [tool]."), + SPAN_NOTICE("You remove \the [machine]'s [machine.circuit.name] with \the [tool].") + ) machine.circuit.dropInto(machine.loc) machine.circuit = null - to_chat(user, SPAN_NOTICE("You remove the circuit board.")) - return - if(isScrewdriver(I)) - playsound(machine.loc, 'sound/items/Screwdriver.ogg', 50, 1) + return TRUE + + // Screwdriver. Finish construction. + if (isScrewdriver(tool)) + playsound(machine, 'sound/items/Screwdriver.ogg', 50, TRUE) var/obj/machinery/new_machine = new machine.circuit.build_path(machine.loc, machine.dir, FALSE) machine.circuit.construct(new_machine) new_machine.install_component(machine.circuit, refresh_parts = FALSE) @@ -140,6 +203,10 @@ new_machine.construct_state.post_construct(new_machine) else crash_with("Machine of type [new_machine.type] was built from a circuit and frame, but had no construct state set.") + user.visible_message( + SPAN_NOTICE("\The [user] finishes \a [new_machine] with \a [tool]."), + SPAN_NOTICE("You finish \the [new_machine] with \the [tool].") + ) qdel(machine) return TRUE diff --git a/code/game/machinery/_machines_base/machine_construction/item_chassis.dm b/code/game/machinery/_machines_base/machine_construction/item_chassis.dm index e05dfe7e583e3..b265537229e23 100644 --- a/code/game/machinery/_machines_base/machine_construction/item_chassis.dm +++ b/code/game/machinery/_machines_base/machine_construction/item_chassis.dm @@ -4,13 +4,20 @@ needs_board = null down_state = /singleton/machine_construction/default/deconstructed -/singleton/machine_construction/default/item_chassis/attackby(obj/item/I, mob/user, obj/machinery/machine) - if((. = ..())) +/singleton/machine_construction/default/item_chassis/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + . = ..() + if (.) return - if(isWrench(I)) + + // Wrench - Dismantle + if (isWrench(tool)) TRANSFER_STATE(down_state) + user.visible_message( + SPAN_NOTICE("\The [user] dismantles \a [machine] with \a [tool]."), + SPAN_NOTICE("You dismantle \the [machine] with \the [tool].") + ) machine.dismantle() - return + return TRUE /singleton/machine_construction/default/item_chassis/state_is_valid(obj/machinery/machine) return TRUE diff --git a/code/game/machinery/_machines_base/machine_construction/tcomms.dm b/code/game/machinery/_machines_base/machine_construction/tcomms.dm index 9bd6e33f07038..3644322c5cedf 100644 --- a/code/game/machinery/_machines_base/machine_construction/tcomms.dm +++ b/code/game/machinery/_machines_base/machine_construction/tcomms.dm @@ -11,14 +11,23 @@ if(!.) try_change_state(machine, /singleton/machine_construction/tcomms/panel_open) -/singleton/machine_construction/tcomms/panel_closed/attackby(obj/item/I, mob/user, obj/machinery/machine) - if((. = ..())) + +/singleton/machine_construction/tcomms/panel_closed/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + . = ..() + if (.) return - if(isScrewdriver(I)) + + // Screwdriver - Open panel + if (isScrewdriver(tool)) TRANSFER_STATE(/singleton/machine_construction/tcomms/panel_open) machine.panel_open = TRUE - to_chat(user, "You unfasten the bolts.") - playsound(machine.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user.visible_message( + SPAN_NOTICE("\The [user] opens \the [machine]'s panel with \a [tool]."), + SPAN_NOTICE("You open \the [machine]'s panel with \the [tool].") + ) + playsound(machine, 'sound/items/Screwdriver.ogg', 50, TRUE) + return TRUE + /singleton/machine_construction/tcomms/panel_closed/post_construct(obj/machinery/machine) try_change_state(machine, /singleton/machine_construction/tcomms/panel_open/no_cable) @@ -40,72 +49,119 @@ if(!.) try_change_state(machine, /singleton/machine_construction/tcomms/panel_closed) -/singleton/machine_construction/tcomms/panel_open/attackby(obj/item/I, mob/user, obj/machinery/machine) - if((. = ..())) + +/singleton/machine_construction/tcomms/panel_open/use_tool(obj/item/tool, mob/user, obj/machinery/machine) + . = ..() + if (.) return - return state_interactions(I, user, machine) -/singleton/machine_construction/tcomms/panel_open/proc/state_interactions(obj/item/I, mob/user, obj/machinery/machine) - if(isScrewdriver(I)) + return state_interactions(tool, user, machine) + + +/** + * Tool interactions specifically for tcomms sub-states. Called by `/singleton/machine_construction/tcomms/panel_open/use_tool()`. + * + * **Parameters**: + * - `tool` - The item being used. + * - `user` - The mob performing the interaction. + * - `machine` - The parent machine being interacted with. + * + * Returns boolean. Indicates whether the interaction was handled or not. If `TRUE`, no other interactions will occur. + */ +/singleton/machine_construction/tcomms/panel_open/proc/state_interactions(obj/item/tool, mob/user, obj/machinery/machine) + // Screwdriver - Close panel + if (isScrewdriver(tool)) TRANSFER_STATE(/singleton/machine_construction/tcomms/panel_closed) machine.panel_open = FALSE - to_chat(user, "You fasten the bolts.") - playsound(machine.loc, 'sound/items/Screwdriver.ogg', 50, 1) - return - if(isWrench(I)) + user.visible_message( + SPAN_NOTICE("\The [user] closes \a [machine]'s maintenance panel with \a [tool]."), + SPAN_NOTICE("You close \the [machine]'s maintenance panel with \the [tool].") + ) + playsound(machine, 'sound/items/Screwdriver.ogg', 50, TRUE) + return TRUE + + // Wrench - Unwrench external plating + if (isWrench(tool)) TRANSFER_STATE(/singleton/machine_construction/tcomms/panel_open/unwrenched) - to_chat(user, "You dislodge the external plating.") - playsound(machine.loc, 'sound/items/Ratchet.ogg', 75, 1) + user.visible_message( + SPAN_NOTICE("\The [user] dislodges \a [machine]'s external plating with \a [tool]."), + SPAN_NOTICE("You dislodge \the [machine]'s external plating with \the [tool].") + ) + playsound(machine, 'sound/items/Ratchet.ogg', 75, TRUE) + return TRUE + /singleton/machine_construction/tcomms/panel_open/mechanics_info() . = list() . += "Use a screwdriver to close the panel." . += "Use a wrench to remove the external plating." -/singleton/machine_construction/tcomms/panel_open/unwrenched/state_interactions(obj/item/I, mob/user, obj/machinery/machine) - if(isWrench(I)) +/singleton/machine_construction/tcomms/panel_open/unwrenched/state_interactions(obj/item/tool, mob/user, obj/machinery/machine) + // Wrench - Secure external plating. + if (isWrench(tool)) TRANSFER_STATE(/singleton/machine_construction/tcomms/panel_open) - to_chat(user, "You secure the external plating.") - playsound(machine.loc, 'sound/items/Ratchet.ogg', 75, 1) - return - if(isWirecutter(I)) + user.visible_message( + SPAN_NOTICE("\The [user] secures \a [machine]'s external plating with \a [tool]."), + SPAN_NOTICE("You secure \the [machine]'s external plating with \the [tool].") + ) + playsound(machine, 'sound/items/Ratchet.ogg', 75, TRUE) + return TRUE + + // Wirecutter - Remove wiring. + if (isWirecutter(tool)) TRANSFER_STATE(/singleton/machine_construction/tcomms/panel_open/no_cable) - playsound(machine.loc, 'sound/items/Wirecutter.ogg', 50, 1) - to_chat(user, "You remove the cables.") - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) - A.amount = 5 + playsound(machine.loc, 'sound/items/Wirecutter.ogg', 50, TRUE) + user.visible_message( + SPAN_NOTICE("\The [user] removes \a [machine]'s wiring with \a [tool]."), + SPAN_NOTICE("You remove \the [machine]'s wiring with \the [tool].") + ) + new /obj/item/stack/cable_coil(get_turf(machine), 5) machine.set_broken(TRUE, TRUE) // the machine's been borked! + return TRUE /singleton/machine_construction/tcomms/panel_open/unwrenched/mechanics_info() . = list() . += "Use a wrench to secure the external plating." . += "Use wirecutters to remove the cabling." -/singleton/machine_construction/tcomms/panel_open/no_cable/state_interactions(obj/item/I, mob/user, obj/machinery/machine) - if(isCoil(I)) - var/obj/item/stack/cable_coil/A = I - if (A.can_use(5)) - TRANSFER_STATE(/singleton/machine_construction/tcomms/panel_open/unwrenched) - A.use(5) - to_chat(user, SPAN_NOTICE("You insert the cables.")) - machine.set_broken(FALSE, TRUE) // the machine's not borked anymore! - return - else - to_chat(user, SPAN_WARNING("You need five coils of wire for this.")) + +/singleton/machine_construction/tcomms/panel_open/no_cable/state_interactions(obj/item/tool, mob/user, obj/machinery/machine) + // Cable Coil - Add wiring. + if (isCoil(tool)) + var/obj/item/stack/cable_coil/cable_coil = tool + if (!cable_coil.use(5)) + USE_FEEDBACK_STACK_NOT_ENOUGH(cable_coil, 5, "to wire \the [machine].") return TRUE - if(isCrowbar(I)) + TRANSFER_STATE(/singleton/machine_construction/tcomms/panel_open/unwrenched) + user.visible_message( + SPAN_NOTICE("\The [user] wires \a [machine] with [cable_coil.get_vague_name(TRUE)]."), + SPAN_NOTICE("You wire \the [machine] with [cable_coil.get_exact_name(5)].") + ) + machine.set_broken(FALSE, TRUE) + return TRUE + + // Crowbar - Dismantle frame. + if (isCrowbar(tool)) TRANSFER_STATE(/singleton/machine_construction/default/deconstructed) + user.visible_message( + SPAN_NOTICE("\The [user] dismanles \a [machine] with \a [tool]."), + SPAN_NOTICE("You dismantle \the [machine] with \the [tool].") + ) machine.dismantle() - return + return TRUE + + // Part Replacer - Replace parts. + if (istype(tool, /obj/item/storage/part_replacer)) + return machine.part_replacement(tool, user) - if(istype(I, /obj/item/storage/part_replacer)) - return machine.part_replacement(I, user) + // Wrench - Remove individual part. + if (isWrench(tool)) + return machine.part_removal(user, tool) - if(isWrench(I)) - return machine.part_removal(user) + // Item - Attempt part insertion. + if (istype(tool)) + return machine.part_insertion(user, tool) - if(istype(I)) - return machine.part_insertion(user, I) /singleton/machine_construction/tcomms/panel_open/no_cable/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index e6f6037afb6a9..aacb2026a06ac 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -218,23 +218,36 @@ GLOBAL_LIST_INIT(machine_path_to_circuit_type, cache_circuits_by_build_path()) /obj/machinery/proc/components_are_accessible(path) return panel_open -/// Installation. Returns number of such components which can be inserted. +/** + * Determines if a given item can be inserted, and how many. + * + * **Parameters**: + * - `component` (Path or instance) - The item path to test. Does not have to be a subtype of `/obj/item/stock_parts`. + * - `user` - The mob performing the interaction. Used for feedback messages + * + * Returns number of such components which can be inserted, + * `-1` if there was a validation or user error, stopping the interaction chain, + * or `0` if the item isn't valid for adding as a component, allowing the interaction chain to continue. + */ /obj/machinery/proc/can_add_component(obj/item/stock_parts/component, mob/user) if(!istype(component)) // Random items. Only insert if actually needed. var/list/missing = missing_parts() for(var/path in missing) if(istype(component, path)) + if (missing[path] == 0) + to_chat(user, SPAN_WARNING("\The [src] cannot hold another [component.name].")) + return -1 return missing[path] return 0 if(!(component.part_flags & PART_FLAG_HAND_REMOVE)) return 0 if(!components_are_accessible(component.type)) to_chat(user, SPAN_WARNING("The insertion point for \the [component] is inaccessible!")) - return 0 + return -1 for(var/path in maximum_component_parts) if(istype(component, path) && (number_of_components(path) == maximum_component_parts[path])) to_chat(user, SPAN_WARNING("There are too many parts of this type installed in \the [src] already!")) - return 0 + return -1 return 1 /// Called whenever an attached component updates it's status. Override to handle updates to the machine. @@ -265,7 +278,7 @@ GLOBAL_LIST_INIT(machine_path_to_circuit_type, cache_circuits_by_build_path()) continue if((. = part.use_tool(I, user))) return - return construct_state && construct_state.attackby(I, user, src) + return construct_state && construct_state.use_tool(I, user, src) /// Passes `attack_hand()` calls through to components within the machine, if they are accessible. /obj/machinery/proc/component_attack_hand(mob/user) @@ -280,52 +293,70 @@ GLOBAL_LIST_INIT(machine_path_to_circuit_type, cache_circuits_by_build_path()) Standard helpers for users interacting with machinery parts. */ + /// Handles replacement of components by a user using a part replacer. Returns boolean. /obj/machinery/proc/part_replacement(mob/user, obj/item/storage/part_replacer/part_replacer) - for(var/obj/item/stock_parts/component_part in component_parts) - if(!component_part.base_type) + . = FALSE + + for (var/obj/item/stock_parts/component_part as anything in component_parts) + if (!component_part.base_type) continue - if(!(component_part.part_flags & PART_FLAG_HAND_REMOVE)) + if (!HAS_FLAGS(component_part.part_flags, PART_FLAG_HAND_REMOVE)) continue - for(var/obj/item/stock_parts/new_component_part in part_replacer.contents) - if(istype(new_component_part, component_part.base_type) && new_component_part.rating > component_part.rating) - replace_part(user, part_replacer, component_part, new_component_part) - . = TRUE - playsound(loc, 'sound/items/rped.ogg', 70) - break + for (var/obj/item/stock_parts/new_component_part in part_replacer.contents) + if (!istype(new_component_part, component_part.base_type)) + continue + if (new_component_part.rating <= component_part.rating) + continue + replace_part(user, part_replacer, component_part, new_component_part) + . = TRUE + break - for(var/path in uncreated_component_parts) + for (var/path in uncreated_component_parts) var/obj/item/stock_parts/component_part = path var/part_count = uncreated_component_parts[path] - if(!(initial(component_part.part_flags) & PART_FLAG_HAND_REMOVE)) + if (!HAS_FLAGS(initial(component_part.part_flags), PART_FLAG_HAND_REMOVE)) continue var/base_type = initial(component_part.base_type) - if(base_type) - for (var/i = 1 to part_count) - for(var/obj/item/stock_parts/new_component_part in part_replacer.contents) - if(istype(new_component_part, base_type) && new_component_part.rating > initial(component_part.rating)) - replace_part(user, part_replacer, component_part, new_component_part) - . = TRUE - playsound(loc, 'sound/items/rped.ogg', 70) - break + if (!base_type) + continue + for (var/i = 1 to part_count) + for (var/obj/item/stock_parts/new_component_part in part_replacer.contents) + if (!istype(new_component_part, base_type)) + continue + if (new_component_part.rating <= initial(component_part.rating)) + continue + replace_part(user, part_replacer, component_part, new_component_part) + . = TRUE + break + + if (.) + playsound(src, 'sound/items/rped.ogg', 70) + user.visible_message( + SPAN_NOTICE("\The [user] replaces some parts in \a [src] with \a [part_replacer]."), + SPAN_NOTICE("You replace some parts in \the [src] with \the [part_replacer].") + ) + return /// Handles inserting a component or item into the machine by a user. Returns boolean. `TRUE` should halt further processing in `attack*()` procs. /obj/machinery/proc/part_insertion(mob/user, obj/item/stock_parts/part) // Second argument may actually be an arbitrary item. - if(!user.canUnEquip(part) && !isstack(part)) + if (!user.canUnEquip(part) && !isstack(part)) return FALSE var/number = can_add_component(part, user) - if(!number) - return istype(part) // If it's not a stock part, we don't block further interactions; presumably the user meant to do something else. - if(isstack(part)) + if (!number) + return TRUE + if (isstack(part)) var/obj/item/stack/stack = part if (!stack.can_use(number)) USE_FEEDBACK_STACK_NOT_ENOUGH(stack, number, "to install into \the [src].") - return FALSE + return TRUE install_component(stack.split(number, TRUE)) else - user.unEquip(part, src) + if (!user.unEquip(part, src)) + FEEDBACK_UNEQUIP_FAILURE(user, part) + return TRUE install_component(part) user.visible_message( SPAN_NOTICE("\The [user] installs \the [part] in \the [src]!"), @@ -333,34 +364,45 @@ Standard helpers for users interacting with machinery parts. ) return TRUE + /// Handles removal of a component by a user. Returns boolean. -/obj/machinery/proc/part_removal(mob/user) +/obj/machinery/proc/part_removal(mob/user, obj/item/tool) var/list/removable_parts = list() - for(var/path in types_of_component(/obj/item/stock_parts)) + for (var/path in types_of_component(/obj/item/stock_parts)) var/obj/item/stock_parts/part = path - if(!(initial(part.part_flags) & PART_FLAG_HAND_REMOVE)) + if (!HAS_FLAGS(initial(part.part_flags), PART_FLAG_HAND_REMOVE)) continue - if(components_are_accessible(path)) - removable_parts[initial(part.name)] = path - if(length(removable_parts)) - var/input = input(user, "Which part would you like to uninstall from \the [src]?", "Part Removal") as null|anything in removable_parts - if(!input || QDELETED(src) || !Adjacent(user) || user.incapacitated()) - return TRUE - var/path = removable_parts[input] - if(!path || !components_are_accessible(path)) - return TRUE - remove_part_and_give_to_user(path, user) + if (!components_are_accessible(path)) + continue + removable_parts[initial(part.name)] = path + + if (!length(removable_parts)) + USE_FEEDBACK_FAILURE("\The [src] has no more removable parts.") + return TRUE + + var/input = input(user, "Which part would you like to uninstall from \the [src]?", "Part Removal") as null|anything in removable_parts + if (!input || !user.use_sanity_check(src, tool)) + return TRUE + + var/path = removable_parts[input] + if (!path || !components_are_accessible(path)) return TRUE + remove_part_and_give_to_user(path, user) + return TRUE + + /// Removes a part of the given `path` and places it in the hands of `user`. /obj/machinery/proc/remove_part_and_give_to_user(path, mob/user) var/obj/item/stock_parts/part = uninstall_component(get_component_of_type(path, TRUE)) - if(part) - user.put_in_hands(part) // Already dropped at loc, so that's the fallback. - user.visible_message( - SPAN_NOTICE("\The [user] removes \the [part] from \the [src]."), - SPAN_NOTICE("You remove \the [part] from \the [src].") - ) + if (!part) + return + user.put_in_hands(part) // Already dropped at loc, so that's the fallback. + user.visible_message( + SPAN_NOTICE("\The [user] removes \a [part] from \a [src]."), + SPAN_NOTICE("You remove \the [part] from \the [src].") + ) + /// Returns a list of required components that are missing from the machine, or `null` if no components are missing or the machine lacks a `construct_state`. /obj/machinery/proc/missing_parts() diff --git a/code/game/machinery/bluespace_drive.dm b/code/game/machinery/bluespace_drive.dm index 81b29697fdf2d..f7a353adbe63b 100644 --- a/code/game/machinery/bluespace_drive.dm +++ b/code/game/machinery/bluespace_drive.dm @@ -30,6 +30,11 @@ ///Chance to teleport someone to the interlude during a pulse. var/interlude_chance = 55 + var/affect_chance = 50 + + var/interlude_min_time = 30 SECONDS + var/interlude_max_time = 3 MINUTES + /obj/machinery/bluespacedrive/Destroy() QDEL_NULL(drive_sound) @@ -146,7 +151,7 @@ playsound(src, 'sound/effects/EMPulse.ogg', 100, TRUE) var/datum/bubble_effect/bluespace_pulse/parent for (var/level in GetConnectedZlevels(z)) - parent = new (x, y, level, 1, 1, parent, interlude_teleport_chance = interlude_chance) + parent = new (x, y, level, 1, 1, parent) /// Creates a blinding flash of light that will blind and deafen those in range, and change turfs to bluespace @@ -174,11 +179,13 @@ /datum/bubble_effect/bluespace_pulse ///List of mobs that can be swapped around when the pulse hits var/list/mob/living/mobs_to_switch = list() + var/obj/machinery/bluespacedrive/parent var/interlude_teleport_chance = 0 + var/affect_chance = 0 -/datum/bubble_effect/bluespace_pulse/New(interlude_teleport_chance = 50) +/datum/bubble_effect/bluespace_pulse/New(obj/machinery/bluespacedrive/parent) ..() - src.interlude_teleport_chance = interlude_teleport_chance + src.parent = parent START_PROCESSING(SSfastprocess, src) var/list/zlevels = GetConnectedZlevels(z) for (var/mob/living/L as anything in GLOB.alive_mobs) @@ -210,24 +217,27 @@ if (light && prob(20)) light.broken() var/mob/living/being = locate() in turf - if (being && prob(50)) - //swap places with another mob + if (being && prob(parent.affect_chance)) var/list/zlevels = GetConnectedZlevels(being.z) + if (GLOB.using_map.use_bluespace_interlude && prob(parent.interlude_chance)) + if (istype(being, /mob/living/simple_animal) && prob(80)) + return + if (istype(being, /mob/living/exosuit)) + return + var/turf/T = pick_area_turf_in_connected_z_levels( + list(/proc/is_not_space_area), + list(/proc/not_turf_contains_dense_objects, /proc/IsTurfAtmosSafe), + zlevels[1]) + if (!T) + return + GLOB.using_map.do_interlude_teleport(being, T, Frand(parent.interlude_min_time, parent.interlude_max_time) MINUTES) + return + + //swap places with another mob for (var/mob/living/mob as anything in mobs_to_switch) if (!(mob.z in zlevels)) continue - if (GLOB.using_map.use_bluespace_interlude && prob(interlude_teleport_chance)) - if (istype(mob, /mob/living/simple_animal) && prob(80)) - return - var/turf/T = pick_area_turf_in_connected_z_levels( - list(GLOBAL_PROC_REF(is_not_space_area)), - list(GLOBAL_PROC_REF(not_turf_contains_dense_objects), GLOBAL_PROC_REF(IsTurfAtmosSafe)), - zlevels[1]) - if (!T) - return - GLOB.using_map.do_interlude_teleport(mob, T, Frand(1, 2.5) MINUTES) - return if (mob != being) var/source_position = being.loc var/other_position = mob.loc diff --git a/code/game/machinery/embedded_controller/airlock_program.dm b/code/game/machinery/embedded_controller/airlock_program.dm index 9750035bfde0c..264b921a66534 100644 --- a/code/game/machinery/embedded_controller/airlock_program.dm +++ b/code/game/machinery/embedded_controller/airlock_program.dm @@ -142,10 +142,17 @@ begin_cycle_in() if("cycle_ext_door") - cycleDoors(TARGET_OUTOPEN) + // Close the door if it's open, otherwise cycle + if(memory["exterior_status"]["state"] == "open") + toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "toggle") + else + cycleDoors(TARGET_OUTOPEN) if("cycle_int_door") - cycleDoors(TARGET_INOPEN) + if(memory["interior_status"]["state"] == "open") + toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "toggle") + else + cycleDoors(TARGET_INOPEN) if("abort") stop_cycling() @@ -252,6 +259,7 @@ cycleDoors(target_state) state = STATE_IDLE target_state = TARGET_NONE + playsound(master, 'sound/machines/airlockdone.ogg', 50) if(STATE_DEPRESSURIZE) @@ -271,6 +279,7 @@ cycleDoors(target_state) state = STATE_IDLE target_state = TARGET_NONE + playsound(master, 'sound/machines/airlockdone.ogg', 50) memory["processing"] = (state != target_state) @@ -283,20 +292,20 @@ state = STATE_IDLE target_state = TARGET_INOPEN memory["purge"] = cycle_to_external_air - playsound(master, 'sound/machines/warning-buzzer.ogg', 50) + playsound(master, 'sound/machines/airlockin.ogg', 50) shutAlarm() /datum/computer/file/embedded_program/airlock/proc/begin_dock_cycle() state = STATE_IDLE target_state = TARGET_INOPEN - playsound(master, 'sound/machines/warning-buzzer.ogg', 50) + playsound(master, 'sound/machines/airlockin.ogg', 50) shutAlarm() /datum/computer/file/embedded_program/airlock/proc/begin_cycle_out() state = STATE_IDLE target_state = TARGET_OUTOPEN memory["purge"] = cycle_to_external_air - playsound(master, 'sound/machines/warning-buzzer.ogg', 50) + playsound(master, 'sound/machines/airlockout.ogg', 50) shutAlarm() /datum/computer/file/embedded_program/airlock/proc/close_doors() diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index c44a0fcc08d52..2b746b17aa769 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -13,7 +13,7 @@ obj_flags = OBJ_FLAG_ANCHORABLE layer = ABOVE_WINDOW_LAYER - var/jukebox/jukebox + var/datum/jukebox/jukebox /obj/machinery/jukebox/Initialize() diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 23b1f99624145..1ae1711cd4e6f 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -90,8 +90,7 @@ req_access = list(access_virology) icon_contents = "chem" accepted_types = list( - /obj/item/reagent_containers/glass/beaker/vial - ) + /obj/item/reagent_containers/glass/beaker/vial, /obj/item/virusdish) //SIERRA-ADDED VIRUSOLOGY /obj/machinery/smartfridge/chemistry name = "\improper Smart Chemical Storage" @@ -127,7 +126,7 @@ icon_contents = "food" accepted_types = list( /obj/item/reagent_containers/food/snacks, - /obj/item/material/kitchen/utensil + /obj/item/material/utensil ) /obj/machinery/smartfridge/drying_rack diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 030905865aacd..fb60303f3f124 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -18,6 +18,7 @@ /datum/feed_channel var/channel_name="" + var/channel_id=0 var/list/datum/feed_message/messages = list() var/locked=0 var/author="" @@ -67,6 +68,7 @@ /datum/feed_network/proc/CreateFeedChannel(channel_name, author, locked, adminChannel = 0, announcement_message) var/datum/feed_channel/newChannel = new /datum/feed_channel newChannel.channel_name = channel_name + newChannel.channel_id = length(network_channels) newChannel.author = author newChannel.locked = locked newChannel.is_admin_channel = adminChannel @@ -95,7 +97,7 @@ /datum/feed_network/proc/insert_message_in_channel(datum/feed_channel/FC, datum/feed_message/newMsg) FC.messages += newMsg if(newMsg.img) - register_asset("newscaster_photo_[sanitize(FC.channel_name)]_[length(FC.messages)].png", newMsg.img) + register_asset("newscaster_photo_[FC.channel_id]_[length(FC.messages)].png", newMsg.img) newMsg.parent_channel = FC FC.update() alert_readers(FC.announcement) @@ -354,7 +356,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that ++i dat+="-[MESSAGE.body]
" if(MESSAGE.img) - var/resourc_name = "newscaster_photo_[sanitize(viewing_channel.channel_name)]_[i].png" + var/resourc_name = "newscaster_photo_[viewing_channel.channel_id]_[i].png" send_asset(usr.client, resourc_name) dat+="
" if(MESSAGE.caption) @@ -841,7 +843,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that ++i dat+="-[MESSAGE.body]
" if(MESSAGE.img) - var/resourc_name = "newscaster_photo_[sanitize(C.channel_name)]_[i].png" + var/resourc_name = "newscaster_photo_[C.channel_id]_[i].png" send_asset(user.client, resourc_name) dat+="
" dat+="[FONT_SMALL("\[[MESSAGE.message_type] by [SPAN_COLOR("maroon", MESSAGE.author)]\]")]

" diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 34ba0141db222..76a6b7f4398e7 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -423,7 +423,7 @@ var/global/bomb_set startswith = list( /obj/item/disk/nuclear, /obj/item/pinpointer, - /obj/item/folder/envelope/nuke_instructions, + /obj/item/folder/envelope/preset/nuke_instructions, /obj/item/modular_computer/laptop/preset/custom_loadout/cheap ) @@ -431,11 +431,11 @@ var/global/bomb_set . = ..() to_chat(user,"On closer inspection, you see \a [GLOB.using_map.company_name] emblem is etched into the front of it.") -/obj/item/folder/envelope/nuke_instructions +/obj/item/folder/envelope/preset/nuke_instructions name = "instructions envelope" desc = "A small envelope. The label reads 'open only in event of high emergency'." -/obj/item/folder/envelope/nuke_instructions/Initialize() +/obj/item/folder/envelope/preset/nuke_instructions/Initialize() . = ..() var/obj/item/paper/R = new(src) R.set_content("


\ diff --git a/code/game/machinery/pipe/pipe_datums/pipe_datum_base.dm b/code/game/machinery/pipe/pipe_datums/pipe_datum_base.dm index 1ff8537a3592c..5a146f6e5c49b 100644 --- a/code/game/machinery/pipe/pipe_datums/pipe_datum_base.dm +++ b/code/game/machinery/pipe/pipe_datums/pipe_datum_base.dm @@ -38,6 +38,7 @@ GLOBAL_LIST_EMPTY(all_disposal_pipe_datums_by_category) var/constructed_path = /obj/machinery/atmospherics/pipe/simple/hidden //What's the final form of this item? var/pipe_class = PIPE_CLASS_BINARY //The node classification for this item. var/rotate_class = PIPE_ROTATE_STANDARD //How it behaves when rotated + var/placement_mode = PIPE_PLACEMENT_SIMPLE //========== //Procedures @@ -79,6 +80,7 @@ GLOBAL_LIST_EMPTY(all_disposal_pipe_datums_by_category) new_item.set_dir(D.dir) new_item.icon = D.build_icon new_item.icon_state = D.build_icon_state + return new_item /datum/pipe/disposal_dispenser/Build(datum/pipe/disposal_dispenser/D, loc, pipe_color = PIPE_COLOR_GREY) if(D.build_path) @@ -92,3 +94,4 @@ GLOBAL_LIST_EMPTY(all_disposal_pipe_datums_by_category) new_item.turn = D.turn new_item.constructed_path = D.constructed_path new_item.update_icon() + return new_item diff --git a/code/game/machinery/pipe/pipe_datums/pipe_datums.dm b/code/game/machinery/pipe/pipe_datums/pipe_datums.dm index 105db71501f93..706b5ea482ca2 100644 --- a/code/game/machinery/pipe/pipe_datums/pipe_datums.dm +++ b/code/game/machinery/pipe/pipe_datums/pipe_datums.dm @@ -1,5 +1,6 @@ -#define PIPE_STRAIGHT 2 -#define PIPE_BENT 5 +#define PIPE_STRAIGHT 1 +#define PIPE_BENT 9 +#define PIPE_CAP 1 /datum/pipe/pipe_dispenser/simple category = "Regular Pipes" @@ -9,11 +10,13 @@ constructed_path = /obj/machinery/atmospherics/pipe/simple/hidden pipe_class = PIPE_CLASS_BINARY + /datum/pipe/pipe_dispenser/simple/straight name = "a pipe fitting" desc = "a straight pipe segment." build_path = /obj/item/pipe rotate_class = PIPE_ROTATE_TWODIR + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/simple/bent name = "bent pipe fitting" @@ -21,6 +24,7 @@ build_path = /obj/item/pipe dir = PIPE_BENT rotate_class = PIPE_ROTATE_TWODIR + placement_mode = PIPE_PLACEMENT_DIAGONAL /datum/pipe/pipe_dispenser/simple/manifold name = "pipe manifold fitting" @@ -29,6 +33,7 @@ build_icon_state = "manifold" constructed_path = /obj/machinery/atmospherics/pipe/manifold/hidden pipe_class = PIPE_CLASS_TRINARY + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/simple/manifold4w name = "four-way pipe manifold fitting" @@ -43,9 +48,11 @@ name = "pipe cap fitting" desc = "a pipe cap for a regular pipe." build_path = /obj/item/pipe + dir = PIPE_CAP build_icon_state = "cap" constructed_path = /obj/machinery/atmospherics/pipe/cap/hidden pipe_class = PIPE_CLASS_UNARY + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/simple/up name = "upward pipe fitting" @@ -53,7 +60,9 @@ build_path = /obj/item/pipe build_icon = 'icons/obj/structures/structures.dmi' build_icon_state = "up" + dir = PIPE_CAP constructed_path = /obj/machinery/atmospherics/pipe/zpipe/up + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/simple/down name = "downward pipe fitting" @@ -61,7 +70,9 @@ build_path = /obj/item/pipe build_icon = 'icons/obj/structures/structures.dmi' build_icon_state = "down" + dir = PIPE_CAP constructed_path = /obj/machinery/atmospherics/pipe/zpipe/down + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/simple/autoshutoff name = "automatic shutoff valve" @@ -87,6 +98,7 @@ desc = "a straight supply pipe segment." build_path = /obj/item/pipe rotate_class = PIPE_ROTATE_TWODIR + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/supply/bent name = "bent supply pipe fitting" @@ -94,6 +106,7 @@ build_path = /obj/item/pipe dir = PIPE_BENT rotate_class = PIPE_ROTATE_TWODIR + placement_mode = PIPE_PLACEMENT_DIAGONAL /datum/pipe/pipe_dispenser/supply/manifold name = "supply pipe manifold fitting" @@ -102,6 +115,7 @@ build_icon_state = "manifold" constructed_path = /obj/machinery/atmospherics/pipe/manifold/hidden/supply pipe_class = PIPE_CLASS_TRINARY + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/supply/manifold4w name = "four-way supply pipe manifold fitting" @@ -116,6 +130,7 @@ name = "supply pipe cap fitting" desc = "a pipe cap for a regular pipe." build_path = /obj/item/pipe + dir = PIPE_CAP build_icon_state = "cap" constructed_path = /obj/machinery/atmospherics/pipe/cap/hidden/supply pipe_class = PIPE_CLASS_UNARY @@ -126,6 +141,7 @@ build_path = /obj/item/pipe build_icon = 'icons/obj/structures/structures.dmi' build_icon_state = "up" + dir = PIPE_CAP constructed_path = /obj/machinery/atmospherics/pipe/zpipe/up/supply /datum/pipe/pipe_dispenser/supply/down @@ -134,6 +150,7 @@ build_path = /obj/item/pipe build_icon = 'icons/obj/structures/structures.dmi' build_icon_state = "down" + dir = PIPE_CAP constructed_path = /obj/machinery/atmospherics/pipe/zpipe/down/supply /datum/pipe/pipe_dispenser/supply/autoshutoff @@ -160,6 +177,7 @@ desc = "a straight scrubber pipe segment" build_path = /obj/item/pipe rotate_class = PIPE_ROTATE_TWODIR + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/scrubber/bent name = "bent scrubber pipe fitting" @@ -167,6 +185,7 @@ build_path = /obj/item/pipe rotate_class = PIPE_ROTATE_TWODIR dir = PIPE_BENT + placement_mode = PIPE_PLACEMENT_DIAGONAL /datum/pipe/pipe_dispenser/scrubber/manifold name = "scrubber pipe manifold fitting" @@ -175,6 +194,7 @@ build_icon_state = "manifold" constructed_path = /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers pipe_class = PIPE_CLASS_TRINARY + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/scrubber/manifold4w name = "four-way scrubber pipe manifold fitting" @@ -189,6 +209,7 @@ name = "scrubber pipe cap fitting" desc = "a pipe cap for a scrubber pipe." build_path = /obj/item/pipe + dir = PIPE_CAP build_icon_state = "cap" constructed_path = /obj/machinery/atmospherics/pipe/cap/hidden/scrubbers @@ -198,6 +219,7 @@ build_path = /obj/item/pipe build_icon = 'icons/obj/structures/structures.dmi' build_icon_state = "up" + dir = PIPE_CAP constructed_path = /obj/machinery/atmospherics/pipe/zpipe/up/scrubbers /datum/pipe/pipe_dispenser/scrubber/down @@ -206,6 +228,7 @@ build_path = /obj/item/pipe build_icon = 'icons/obj/structures/structures.dmi' build_icon_state = "down" + dir = PIPE_CAP constructed_path = /obj/machinery/atmospherics/pipe/zpipe/down/scrubbers /datum/pipe/pipe_dispenser/scrubber/autoshutoff @@ -232,6 +255,7 @@ desc = "a striaght fuel pipe segment" build_path = /obj/item/pipe rotate_class = PIPE_ROTATE_TWODIR + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/fuel/bent name = "bent fuel pipe fitting" @@ -239,6 +263,7 @@ build_path = /obj/item/pipe rotate_class = PIPE_ROTATE_TWODIR dir = PIPE_BENT + placement_mode = PIPE_PLACEMENT_DIAGONAL /datum/pipe/pipe_dispenser/fuel/manifold name = "fuel pipe manifold fitting" @@ -247,6 +272,7 @@ build_icon_state = "manifold" constructed_path = /obj/machinery/atmospherics/pipe/manifold/hidden/fuel pipe_class = PIPE_CLASS_TRINARY + placement_mode = PIPE_PLACEMENT_ORTHOGONAL /datum/pipe/pipe_dispenser/fuel/manifold4w name = "four-way supply pipe manifold fitting" @@ -261,6 +287,7 @@ name = "fuel pipe cap fitting" desc = "a pipe cap for a fuel pipe." build_path = /obj/item/pipe + dir = PIPE_CAP build_icon_state = "cap" constructed_path = /obj/machinery/atmospherics/pipe/cap/hidden/fuel pipe_class = PIPE_CLASS_UNARY @@ -271,6 +298,7 @@ build_path = /obj/item/pipe build_icon = 'icons/obj/structures/structures.dmi' build_icon_state = "up" + dir = PIPE_CAP constructed_path = /obj/machinery/atmospherics/pipe/zpipe/up/fuel /datum/pipe/pipe_dispenser/fuel/down @@ -279,6 +307,7 @@ build_path = /obj/item/pipe build_icon = 'icons/obj/structures/structures.dmi' build_icon_state = "down" + dir = PIPE_CAP constructed_path = /obj/machinery/atmospherics/pipe/zpipe/down/fuel /datum/pipe/pipe_dispenser/fuel/autoshutoff @@ -314,6 +343,7 @@ rotate_class = PIPE_ROTATE_TWODIR build_icon_state = "he" dir = PIPE_BENT + placement_mode = PIPE_PLACEMENT_DIAGONAL /datum/pipe/pipe_dispenser/he/junction name = "heat exchanger junction" diff --git a/code/game/machinery/teleporter/beacon.dm b/code/game/machinery/teleporter/beacon.dm index 6ba4dae0678a0..562ee031a05ee 100644 --- a/code/game/machinery/teleporter/beacon.dm +++ b/code/game/machinery/teleporter/beacon.dm @@ -13,6 +13,7 @@ var/global/const/TELEBEACON_WIRE_SIGNALLER = 4 active_power_usage = 50 anchored = TRUE level = ATOM_LEVEL_UNDER_TILE + layer = ABOVE_EXPOSED_WIRE_LAYER obj_flags = OBJ_FLAG_ANCHORABLE machine_name = "teleporter beacon" diff --git a/code/game/machinery/vending/dinnerware.dm b/code/game/machinery/vending/dinnerware.dm index 0d38f5b7df385..7799527485989 100644 --- a/code/game/machinery/vending/dinnerware.dm +++ b/code/game/machinery/vending/dinnerware.dm @@ -23,7 +23,7 @@ /obj/item/reagent_containers/glass/beaker/bowl =2, /obj/item/tray = 8, /obj/item/material/knife/kitchen = 3, - /obj/item/material/kitchen/rollingpin = 2, + /obj/item/material/rollingpin = 2, /obj/item/serving_bowl = 20, /obj/item/reagent_containers/food/drinks/pitcher = 2, /obj/item/reagent_containers/food/drinks/flask/vacuumflask = 4, diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 83d35d44d2afd..66072ad0ecb20 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -355,16 +355,16 @@ if(M) if(M != user) user.visible_message( - SPAN_WARNING("\The [user] unbuckles \the [M] from \the [src]."), - SPAN_DANGER("You unbuckle \the [M] from \the [src]"), + SPAN_NOTICE("\The [user] unbuckles \the [M] from \the [src]."), + SPAN_NOTICE("You unbuckle \the [M] from \the [src]"), SPAN_NOTICE("You hear metal clanking."), exclude_mobs = list(M) ) to_chat(M, SPAN_DANGER("\The [user] unbuckles you from \the [src].")) else user.visible_message(\ - SPAN_WARNING("\The [user] unbuckles themselves from \the [src]."), - SPAN_DANGER("You unbuckle yourself from \the [src]."), + SPAN_NOTICE("\The [user] unbuckles themselves from \the [src]."), + SPAN_NOTICE("You unbuckle yourself from \the [src]."), SPAN_NOTICE("You hear metal clanking.") ) add_fingerprint(user) diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index d1129adcec254..093ad4356c0cf 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -130,6 +130,7 @@ name = "foamed metal" desc = "A lightweight foamed metal wall." var/metal = 1 // 1 = aluminium, 2 = iron + atmos_canpass = CANPASS_NEVER /obj/structure/foamedmetal/New() ..() @@ -206,9 +207,3 @@ return TRUE return ..() - - -/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) - if(air_group) - return 0 - return !density diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index ce88e14aa127a..d0700f8f01f92 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -52,7 +52,7 @@ return 0 . = ..() -/obj/effect/water/Bump(atom/A) +/obj/effect/water/Bump(atom/A, called) if(reagents) reagents.touch(A) return ..() diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index 63fe2c56657b1..76918d8a27df2 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -9,6 +9,7 @@ var/fleshcolor //Used for gibbed humans. var/bloodcolor //Used for gibbed humans. var/datum/dna/MobDNA + var/virusProb = 20 //the chance for viruses to spread on the gibs [SIERRA-ADD] VIRUSOLOGY /obj/gibspawner/New(location, datum/dna/_MobDNA, _fleshcolor, _bloodcolor) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 640bc38f1e375..d0663f1930023 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -171,7 +171,7 @@ GLOB.moved_event.unregister(src, src, TYPE_PROC_REF(/obj/spider/spiderling, disturbed)) START_PROCESSING(SSobj, src) -/obj/spider/spiderling/Bump(atom/user) +/obj/spider/spiderling/Bump(atom/user, called) if(istype(user, /obj/structure/table)) forceMove(user.loc) else diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c08685765ebbd..a39866fc568ba 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -101,14 +101,11 @@ var/attack_ignore_harm_check = FALSE -/obj/item/New() - ..() - if(randpixel && (!pixel_x && !pixel_y) && isturf(loc)) //hopefully this will prevent us from messing with mapper-set pixel_x/y - pixel_x = rand(-randpixel, randpixel) - pixel_y = rand(-randpixel, randpixel) - /obj/item/Initialize() . = ..() + if(randpixel && (!pixel_x && !pixel_y) && isturf(loc)) + pixel_x = rand(-randpixel, randpixel) + pixel_y = rand(-randpixel, randpixel) if(islist(armor)) for(var/type in armor) if(armor[type]) // Don't set it if it gives no armor anyway, which is many items. @@ -165,6 +162,12 @@ return TRUE return FALSE + +/obj/item/update_icon() + ..() + update_twohanding() + + /obj/item/ex_act(severity) ..() if (get_max_health()) @@ -555,6 +558,9 @@ var/global/list/slot_flags_enumeration = list( var/parry_chance = get_parry_chance(user, attacker) if(parry_chance) if(default_parry_check(user, attacker, damage_source) && prob(parry_chance)) + //[SIERRA-ADD] + user.dodge_animation(attacker = attacker) + //[SIERRA-ADD user.visible_message(SPAN_DANGER("\The [user] parries [attack_text] with \the [src]!")) admin_attack_log(attacker, user, "Attempted to attack with \a [damage_source] but was parried", "Was targeted with \a [damage_source] but parried the attack", "attmpted to use \a [damage_source] to attack but was parried by") playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) diff --git a/code/game/objects/items/devices/boombox.dm b/code/game/objects/items/devices/boombox.dm index f16b3ba979994..d3759a68bc8e8 100644 --- a/code/game/objects/items/devices/boombox.dm +++ b/code/game/objects/items/devices/boombox.dm @@ -11,7 +11,7 @@ w_class = ITEM_SIZE_HUGE //forbid putting something that emits loud sounds forever into a backpack origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1) - var/jukebox/jukebox + var/datum/jukebox/jukebox var/boombox_flags diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index aefb788fe46d0..b083f7534bf4c 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -67,27 +67,6 @@ /obj/item/device/lightreplacer/use_before(atom/target, mob/living/user, click_parameters) - // Check for lights in a container, refilling our charges. - if (istype(target, /obj/item/storage)) - var/obj/item/storage/storage = target - var/amt_inserted = 0 - var/turf/turf = get_turf(src) - for (var/obj/item/light/light in storage.contents) - if (uses < max_uses && light.status == LIGHT_OK) - AddUses(1) - amt_inserted++ - storage.remove_from_storage(light, turf, TRUE) - qdel(light) - if (!amt_inserted) - USE_FEEDBACK_FAILURE("\The [target] has no lights to add to \the [src].") - return TRUE - storage.finish_bulk_removal() - user.visible_message( - SPAN_NOTICE("\The [user] transfers some lights from \a [target] to \a [src]."), - SPAN_NOTICE("You insert [amt_inserted] light\s from \the [target] to \the [src]. It now has [uses] light\s remaining.") - ) - return TRUE - // Replace light bulbs if (istype(target, /obj/machinery/light)) var/obj/machinery/light/fixture = target @@ -118,6 +97,29 @@ qdel(tool) return TRUE + // Container - Add lights + if (istype(tool, /obj/item/storage)) + if (uses >= max_uses) + USE_FEEDBACK_FAILURE("\The [src] is full.") + return TRUE + var/obj/item/storage/storage = tool + var/amt_inserted = 0 + for (var/obj/item/light/light in storage.contents) + if (uses < max_uses && light.status == LIGHT_OK) + AddUses(1) + amt_inserted++ + storage.remove_from_storage(light, src, TRUE) + qdel(light) + if (!amt_inserted) + USE_FEEDBACK_FAILURE("\The [tool] has no lights to add to \the [src].") + return TRUE + storage.finish_bulk_removal() + user.visible_message( + SPAN_NOTICE("\The [user] transfers some lights from \a [tool] to \a [src]."), + SPAN_NOTICE("You insert [amt_inserted] light\s from \the [tool] to \the [src]. It now has [uses] light\s remaining.") + ) + return TRUE + // Material Stack - Add lights if (istype(tool, /obj/item/stack/material)) if (tool.get_material_name() != MATERIAL_GLASS) diff --git a/code/game/objects/items/devices/oxycandle.dm b/code/game/objects/items/devices/oxycandle.dm index cfcccb79f8c9a..66b519271d9e5 100644 --- a/code/game/objects/items/devices/oxycandle.dm +++ b/code/game/objects/items/devices/oxycandle.dm @@ -47,7 +47,6 @@ STOP_PROCESSING(SSprocessing, src) on = 2 update_icon() - update_held_icon() SetName("burnt oxygen candle") desc += "This tube has exhausted its chemicals." return @@ -79,7 +78,6 @@ icon_state = "oxycandle" item_state = icon_state set_light(0) - update_held_icon() /obj/item/device/oxycandle/Destroy() QDEL_NULL(air_contents) diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index 27d9c5047d94e..2acb9213db83e 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -2,51 +2,60 @@ #define AIRLOCK_REGION_STRIPE "Stripe" #define AIRLOCK_REGION_WINDOW "Window" +#define PLACEMENT_MODE_QUARTERS 1 +#define PLACEMENT_MODE_TRIANGLES 2 + +#define CATEGORY_NONE 0 +#define CATEGORY_TILES 1 +#define CATEGORY_HAZARD 2 +#define CATEGORY_WARD 3 +#define CATEGORY_MISC 4 + /obj/item/device/paint_sprayer name = "paint sprayer" icon = 'icons/obj/tools/paint_sprayer.dmi' icon_state = "paint_sprayer" item_state = "paint_sprayer" desc = "A slender and none-too-sophisticated device capable of applying paint on floors, walls, exosuits and certain airlocks." - var/decal = "Quarter-turf" + var/decal = "Quarter-Tile" var/paint_color + var/category var/list/decals = list( - "Quarter-turf" = list("path" = /obj/floor_decal/corner, "precise" = 1, "colored" = 1), - "Monotile full" = list("path" = /obj/floor_decal/corner/white/mono, "colored" = 1), - "Monotile halved" = list("path" = /obj/floor_decal/corner/white/half, "colored" = 1), - "Hazard stripes" = list("path" = /obj/floor_decal/industrial/warning/fulltile), - "Border, hazard" = list("path" = /obj/floor_decal/industrial/warning), - "Corner, hazard" = list("path" = /obj/floor_decal/industrial/warning/corner), - "Hatched marking" = list("path" = /obj/floor_decal/industrial/hatch, "colored" = 1), - "Dashed outline" = list("path" = /obj/floor_decal/industrial/outline, "colored" = 1), - "Loading sign" = list("path" = /obj/floor_decal/industrial/loading), - "Mosaic, large" = list("path" = /obj/floor_decal/chapel), - "1" = list("path" = /obj/floor_decal/sign), - "2" = list("path" = /obj/floor_decal/sign/two), - "A" = list("path" = /obj/floor_decal/sign/a), - "B" = list("path" = /obj/floor_decal/sign/b), - "C" = list("path" = /obj/floor_decal/sign/c), - "D" = list("path" = /obj/floor_decal/sign/d), - "M" = list("path" = /obj/floor_decal/sign/m), - "V" = list("path" = /obj/floor_decal/sign/v), - "CMO" = list("path" = /obj/floor_decal/sign/cmo), - "Ex" = list("path" = /obj/floor_decal/sign/ex), - "Psy" = list("path" = /obj/floor_decal/sign/p), - "Remove all decals" = list("path" = /obj/floor_decal/reset), - ) - - var/list/paint_dirs = list( - "North" = NORTH, - "Northwest" = NORTHWEST, - "West" = WEST, - "Southwest" = SOUTHWEST, - "South" = SOUTH, - "Southeast" = SOUTHEAST, - "East" = EAST, - "Northeast" = NORTHEAST, - "Precise" = 0, - ) + "Quarter-Tile" = list("path" = /obj/floor_decal/corner, "category" = CATEGORY_TILES, "colored" = TRUE, "placement" = PLACEMENT_MODE_QUARTERS), + "Half-Tile" = list("path" = /obj/floor_decal/corner/white/half, "category" = CATEGORY_TILES, "colored" = TRUE, "placement" = PLACEMENT_MODE_TRIANGLES), + "Full Tile" = list("path" = /obj/floor_decal/corner/white/mono, "category" = CATEGORY_TILES, "colored" = TRUE), + "Hatched Marking" = list("path" = /obj/floor_decal/industrial/hatch, "category" = CATEGORY_TILES, "colored" = TRUE), + "Dashed Outline" = list("path" = /obj/floor_decal/industrial/outline, "category" = CATEGORY_TILES, "colored" = TRUE), + "Hazard Border" = list("path" = /obj/floor_decal/industrial/warning, "category" = CATEGORY_HAZARD, "placement" = PLACEMENT_MODE_TRIANGLES), + "Hazard Outer Corner" = list("path" = /obj/floor_decal/industrial/warning/corner, "category" = CATEGORY_HAZARD, "placement" = PLACEMENT_MODE_QUARTERS), + "Hazard Inner Corner" = list("path" = /obj/floor_decal/industrial/warning/inner, "category" = CATEGORY_HAZARD, "placement" = PLACEMENT_MODE_QUARTERS), + "Hazard U-Corner" = list("path" = /obj/floor_decal/industrial/warning/cee, "category" = CATEGORY_HAZARD), + "Hazard Full Tile" = list("path" = /obj/floor_decal/industrial/warning/full, "category" = CATEGORY_HAZARD), + "Hazard Stripes" = list("path" = /obj/floor_decal/industrial/warning/fulltile, "category" = CATEGORY_HAZARD), + "1" = list("path" = /obj/floor_decal/sign, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "2" = list("path" = /obj/floor_decal/sign/two, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "A" = list("path" = /obj/floor_decal/sign/a, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "B" = list("path" = /obj/floor_decal/sign/b, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "C" = list("path" = /obj/floor_decal/sign/c, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "D" = list("path" = /obj/floor_decal/sign/d, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "M" = list("path" = /obj/floor_decal/sign/m, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "V" = list("path" = /obj/floor_decal/sign/v, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "CMO" = list("path" = /obj/floor_decal/sign/cmo, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "Ex" = list("path" = /obj/floor_decal/sign/ex, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "Psy" = list("path" = /obj/floor_decal/sign/p, "category" = CATEGORY_WARD, "use_decal_icon" = TRUE), + "Shutoff" = list("path" = /obj/floor_decal/industrial/shutoff, "category" = CATEGORY_MISC, "placement" = PLACEMENT_MODE_TRIANGLES, "use_decal_icon" = TRUE), + "Loading Sign" = list("path" = /obj/floor_decal/industrial/loading, "category" = CATEGORY_MISC, "placement" = PLACEMENT_MODE_TRIANGLES), + "Mosaic" = list("path" = /obj/floor_decal/chapel, "category" = CATEGORY_MISC, "placement" = PLACEMENT_MODE_QUARTERS, "inversed" = TRUE), + "Remove all decals" = list("path" = /obj/floor_decal/reset), + ) + + var/list/categories = list( + "Tile Decals" = list("id" = CATEGORY_TILES, "icon_state" = "tiles"), + "Hazard Decals" = list("id" = CATEGORY_HAZARD, "icon_state" = "stripefull"), + "Ward Decals" = list("id" = CATEGORY_WARD, "icon_state" = "ward"), + "Misc Decals" = list("id" = CATEGORY_MISC, "icon_state" = "misc"), + ) var/list/preset_colors = list( "Beasty brown" = COLOR_BEASTY_BROWN, @@ -68,7 +77,7 @@ "Yellow" = COLOR_AMBER, "Sol blue" = COLOR_SOL, "Bulkhead black" = COLOR_WALL_GUNMETAL, - ) + ) /obj/item/device/paint_sprayer/Initialize() . = ..() @@ -83,7 +92,6 @@ /obj/item/device/paint_sprayer/on_update_icon() ClearOverlays() AddOverlays(overlay_image(icon, "paint_sprayer_color", paint_color)) - update_held_icon() /obj/item/device/paint_sprayer/get_mob_overlay(mob/user_mob, slot, bodypart) var/image/ret = ..() @@ -91,6 +99,51 @@ ret.AddOverlays(overlay) return ret +/obj/item/device/paint_sprayer/attack_self(mob/user) + if (!category) + show_home(user) + else + show_decals_by_category(user) + +/obj/item/device/paint_sprayer/proc/show_home(mob/user) + var/radial = list() + radial["Remove all decals"] = mutable_appearance("icons/screen/radial.dmi", "cable_invalid") + radial["Pick color"] = mutable_appearance("icons/screen/radial.dmi", "color_hexagon") + for (var/key in categories) + radial[key] = mutable_appearance("icons/screen/radial.dmi", categories[key]["icon_state"]) + var/choice = show_radial_menu(user, user, radial, require_near = TRUE, radius = 50, tooltips = TRUE, check_locs = list(src)) + if (!choice || !user.use_sanity_check(src)) + return + switch (choice) + if ("Remove all decals") + decal = choice + return + if ("Pick color") + choose_color(user) + return + category = categories[choice]["id"] + show_decals_by_category(user) + +/obj/item/device/paint_sprayer/proc/show_decals_by_category(mob/user) + var/radial = list() + radial["Home"] = mutable_appearance('icons/screen/radial.dmi', "radial_home") + for (var/key in decals) + if (decals[key]["category"] != category) + continue + var/obj/type = decals[key]["path"] + var/mutable_appearance/I = mutable_appearance(decals[key]["use_decal_icon"] ? initial(type.icon) : "icons/screen/radial.dmi", initial(type.icon_state), decals[key]["colored"] ? paint_color : initial(type.color)) + radial[key] = I + var/choice = show_radial_menu(user, user, radial, require_near = TRUE, radius = 50, tooltips = TRUE, check_locs = list(src)) + if (!choice || !user.use_sanity_check(src)) + return + if (choice == "Home") + category = CATEGORY_NONE + show_home(user) + return + decal = choice + playsound(src, 'sound/weapons/flipblade.ogg', 30, 1) + to_chat(user, SPAN_NOTICE("You set \the [src] decal to '[decal]'.")) + /obj/item/device/paint_sprayer/on_active_hand(mob/user) . = ..() if (user.PushClickHandler(/datum/click_handler/default/paint_sprayer)) @@ -112,10 +165,9 @@ GLOB.module_deselected_event.unregister(user, src, TYPE_PROC_REF(/obj/item/device/paint_sprayer, remove_click_handler)) GLOB.module_deactivated_event.unregister(user, src, TYPE_PROC_REF(/obj/item/device/paint_sprayer, remove_click_handler)) -/obj/item/device/paint_sprayer/use_before(atom/target, mob/living/user, click_parameters) +/obj/item/device/paint_sprayer/use_after(atom/target, mob/living/user, click_parameters) if (apply_paint(target, user, click_parameters)) return TRUE - return ..() /obj/item/device/paint_sprayer/proc/pick_color(atom/A, mob/user) @@ -132,20 +184,16 @@ to_chat(user, SPAN_WARNING("\The [A] does not have a color that you could pick from.")) return TRUE // There was an attempt to pick a color. -/obj/item/device/paint_sprayer/proc/apply_paint(atom/A, mob/user, params) +/obj/item/device/paint_sprayer/proc/apply_paint(atom/A, mob/user, click_parameters) if (A.atom_flags & ATOM_FLAG_CAN_BE_PAINTED) A.set_color(paint_color) . = TRUE else if (istype(A, /turf/simulated/floor)) - . = paint_floor(A, user, params) + . = paint_floor(A, user, click_parameters) else if (istype(A, /obj/machinery/door/airlock)) . = paint_airlock(A, user) else if (istype(A, /mob/living/exosuit)) to_chat(user, SPAN_WARNING("You can't paint an active exosuit. Dismantle it first.")) - . = FALSE - else - to_chat(user, SPAN_WARNING("\The [src] can only be used on floors, windows, walls, exosuits or certain airlocks.")) - . = FALSE if (.) playsound(get_turf(src), 'sound/effects/spray3.ogg', 30, 1, -6) return . @@ -187,7 +235,7 @@ return FALSE return picked_color -/obj/item/device/paint_sprayer/proc/paint_floor(turf/simulated/floor/F, mob/user, params) +/obj/item/device/paint_sprayer/proc/paint_floor(turf/simulated/floor/F, mob/user, click_parameters) if(!F.flooring) to_chat(user, SPAN_WARNING("You need flooring to paint on.")) return FALSE @@ -210,31 +258,11 @@ to_chat(user, SPAN_WARNING("\The [src] flashes an error light. You might need to reconfigure it.")) return FALSE - if((F.decals && length(F.decals) > 5) && !ispath(painting_decal, /obj/floor_decal/reset)) + if((F.decals && length(F.decals) > 7) && !ispath(painting_decal, /obj/floor_decal/reset)) to_chat(user, SPAN_WARNING("\The [F] has been painted too much; you need to clear it off.")) return FALSE - var/painting_dir = 0 - if(!decal_data["precise"]) - painting_dir = user.dir - else - var/list/mouse_control = params2list(params) - var/mouse_x = text2num(mouse_control["icon-x"]) - var/mouse_y = text2num(mouse_control["icon-y"]) - if(isnum(mouse_x) && isnum(mouse_y)) - if(mouse_x <= 16) - if(mouse_y <= 16) - painting_dir = WEST - else - painting_dir = NORTH - else - if(mouse_y <= 16) - painting_dir = SOUTH - else - painting_dir = EAST - else - painting_dir = user.dir - + var/painting_dir = calc_paint_dir(user, decal_data["placement"], click_parameters, decal_data["inversed"]) var/painting_color if(decal_data["colored"] && paint_color) painting_color = paint_color @@ -242,6 +270,40 @@ new painting_decal(F, painting_dir, painting_color) return TRUE +/obj/item/device/paint_sprayer/proc/calc_paint_dir(mob/user, placement_mode, click_parameters, inversed) + if (!placement_mode) + return user.dir + if (istext(click_parameters)) // Borgs pass down click parameters in a string format + click_parameters = params2list(click_parameters) + var/mouse_x = text2num(click_parameters["icon-x"]) + var/mouse_y = text2num(click_parameters["icon-y"]) + switch (placement_mode) + if (PLACEMENT_MODE_QUARTERS) + // One case for each of the four quarters of a turf + if (mouse_x <= 16) + if (mouse_y <= 16) + . = WEST + else + . = NORTH + else + if (mouse_y <= 16) + . = SOUTH + else + . = EAST + if (PLACEMENT_MODE_TRIANGLES) + // One case for each triangle sectioned off by the diagonals of a square + if (mouse_y > mouse_x) + if (mouse_y > 32-mouse_x) + . = NORTH + else + . = WEST + else + if (mouse_y > 32-mouse_x) + . = EAST + else + . = SOUTH + return inversed ? reverse_direction(.) : . + /obj/item/device/paint_sprayer/proc/pick_color_from_airlock(obj/machinery/door/airlock/D, mob/user) if (!D.paintable) return FALSE @@ -285,9 +347,6 @@ return FALSE return choice -/obj/item/device/paint_sprayer/attack_self(mob/user) - choose_decal() - /obj/item/device/paint_sprayer/proc/change_color(new_color, mob/user) if (new_color) paint_color = new_color @@ -309,27 +368,22 @@ return TRUE return ..() -/obj/item/device/paint_sprayer/CtrlClick() +/obj/item/device/paint_sprayer/CtrlClick(mob/user) if (!isturf(loc)) - choose_color() + choose_color(user) return TRUE return ..() -/obj/item/device/paint_sprayer/verb/choose_color() - set name = "Choose color" - set desc = "Choose a color." - set category = "Object" - set src in usr - - if(usr.incapacitated()) +/obj/item/device/paint_sprayer/proc/choose_color(mob/user) + if(user.incapacitated()) return - var/new_color = input(usr, "Choose a color.", name, paint_color) as color|null - if (usr.incapacitated()) + var/new_color = input(user, "Choose a color.", name, paint_color) as color|null + if (user.incapacitated()) return - change_color(new_color, usr) + change_color(new_color, user) /obj/item/device/paint_sprayer/verb/choose_preset_color() - set name = "Choose Preset color" + set name = "Choose Preset Color" set desc = "Choose a preset color." set category = "Object" set src in usr @@ -341,21 +395,6 @@ return change_color(preset_colors[preset], usr) -/obj/item/device/paint_sprayer/verb/choose_decal() - set name = "Choose Decal" - set desc = "Choose a flooring decal." - set category = "Object" - set src in usr - - if(usr.incapacitated()) - return - var/new_decal = input("Select a decal.") as null|anything in decals - if(usr.incapacitated()) - return - if(new_decal && !isnull(decals[new_decal])) - decal = new_decal - to_chat(usr, SPAN_NOTICE("You set \the [src] decal to '[decal]'.")) - /datum/click_handler/default/paint_sprayer var/obj/item/device/paint_sprayer/paint_sprayer @@ -372,3 +411,13 @@ #undef AIRLOCK_REGION_PAINT #undef AIRLOCK_REGION_STRIPE +#undef AIRLOCK_REGION_WINDOW + +#undef PLACEMENT_MODE_QUARTERS +#undef PLACEMENT_MODE_TRIANGLES + +#undef CATEGORY_NONE +#undef CATEGORY_TILES +#undef CATEGORY_HAZARD +#undef CATEGORY_WARD +#undef CATEGORY_MISC diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 4a648dd9b0852..780391562cae4 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -287,6 +287,14 @@ chemtraces += "[initial(R.name)] ([H.chem_doses[T]])" if(length(chemtraces)) . += SPAN_CLASS("scan_notice", "Metabolism products of [english_list(chemtraces)] found in subject's system.") +//SIERRA-ADD VIRUSOLOGY + if(LAZYLEN(H.virus2)) + for (var/ID in H.virus2) + if (ID in virusDB) + print_reagent_default_message = FALSE + var/datum/computer_file/data/virus_record/V = virusDB[ID] + . += "Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]" +//SIERRA-ADD if(print_reagent_default_message) . += "No results." @@ -295,28 +303,24 @@ . = jointext(.,"
") . = jointext(list(header,.),null) -// Calculates severity based on the ratios defined external limbs. -/proc/get_wound_severity(damage_ratio, can_heal_overkill = 0) - var/degree +// Calculates severity based on the ratios defined external limbs. +/proc/get_wound_severity(damage_ratio, can_heal_overkill) switch(damage_ratio) - if(0 to 10) - degree = "minor" - if(10 to 25) - degree = "moderate" - if(25 to 50) - degree = "significant" - if(50 to 75) - degree = "severe" - if(75 to 99) - degree = "extreme" - else - if(can_heal_overkill) - degree = "critical" - else - degree = "irreparable" + if (0 to 10) + return "minor" + if (10 to 25) + return "moderate" + if (25 to 50) + return "significant" + if (50 to 75) + return "severe" + if (75 to 99) + return "extreme" + if (can_heal_overkill) + return "critical" + return "irreparable" - return degree /obj/item/device/scanner/health/verb/toggle_mode() set name = "Switch Verbosity" diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index d9f165c587dbe..e590a814f7cda 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -1,6 +1,6 @@ /obj/item/device/hailer name = "hailer" - desc = "Used by obese officers to save their breath for running." + desc = "Used to project your voice, saving your breath to run up and down sets of stairs instead." icon = 'icons/obj/tools/hailer.dmi' icon_state = "voice0" item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang) diff --git a/code/game/objects/items/passport.dm b/code/game/objects/items/passport.dm index 4c4395b94c983..91b4429029b9a 100644 --- a/code/game/objects/items/passport.dm +++ b/code/game/objects/items/passport.dm @@ -110,6 +110,11 @@ icon_state = "passport_scg2" desc = "A passport from Saffar, within Sol Central Government space." +/obj/item/passport/theia + name = "\improper Theia passport" + icon_state = "passport_scg2" + desc = "A passport from Theia, within Sol Central Government space." + /obj/item/passport/south_gaia name = "\improper Gaian Administrative Area passport" icon_state = "passport_scg2" @@ -136,9 +141,44 @@ desc = "A passport from Terra, within ICCG space." /obj/item/passport/novayazemlya - name = "\improper Novaya Zemlya passport" + name = "\improper Zemlya passport" + icon_state = "passport_iccg2" + desc = "A passport from Zemlya, within ICCG space." + +/obj/item/passport/sestris + name = "\improper Sestris passport" + icon_state = "passport_iccg2" + desc = "A passport from Sestris, within ICCG space." + +/obj/item/passport/bratis + name = "\improper Bratis passport" + icon_state = "passport_iccg2" + desc = "A passport from Bratis, within ICCG space." + +/obj/item/passport/putkari + name = "\improper Putkari passport" + icon_state = "passport_iccg2" + desc = "A passport from Putkari, within ICCG space." + +/obj/item/passport/altair + name = "\improper Altair passport" + icon_state = "passport_iccg2" + desc = "A passport from Altair, within ICCG space." + +/obj/item/passport/penglai + name = "\improper Penglai passport" + icon_state = "passport_iccg2" + desc = "A passport from Penglai, within ICCG space." + +/obj/item/passport/providence + name = "\improper Providence passport" + icon_state = "passport_iccg2" + desc = "A passport from Providence, within ICCG space." + +/obj/item/passport/valy + name = "\improper Valy passport" icon_state = "passport_iccg2" - desc = "A passport from Novaya Zemlya, within ICCG space." + desc = "A passport from Valy, within ICCG space." /obj/item/passport/saveel name = "\improper Saveel passport" diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 86533483ba592..cb043f4d6a04f 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -114,21 +114,21 @@ /obj/item/stack/tile/mono name = "steel mono tile" singular_name = "steel mono tile" - icon_state = "tile" + icon_state = "tile_mono" matter = list(MATERIAL_STEEL = 450) obj_flags = OBJ_FLAG_CONDUCTIBLE /obj/item/stack/tile/mono/dark name = "dark mono tile" singular_name = "dark mono tile" - icon_state = "fr_tile" + icon_state = "fr_tile_mono" matter = list(MATERIAL_STEEL = 450) obj_flags = OBJ_FLAG_CONDUCTIBLE /obj/item/stack/tile/mono/white name = "white mono tile" singular_name = "white mono tile" - icon_state = "tile_white" + icon_state = "tile_white_mono" matter = list(MATERIAL_PLASTIC = 450) /obj/item/stack/tile/grid diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index 8e0e10975f119..d2a462b777efe 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -150,11 +150,56 @@ GLOBAL_LIST_INIT(rpd_pipe_selection_skilled, list( return TRUE playsound (get_turf(user), 'sound/items/Deconstruct.ogg', 50, 1) - P.Build(P, T, pipe_colors[pipe_color]) + var/obj/item/pipe/pipe = P.Build(P, T, pipe_colors[pipe_color]) + var/num_rotations + if (user.skill_check(SKILL_ATMOS, SKILL_EXPERIENCED)) + num_rotations = get_placement_rotation(user, P.placement_mode, click_parameters) + else + num_rotations = rand(3) + for (var/i = 0, i < num_rotations, i++) + pipe.dir = GLOB.cw_dir[pipe.dir] if (prob(20)) spark_system.start() return TRUE +/obj/item/rpd/proc/get_placement_rotation(mob/user, placement_mode, click_parameters) + var/mouse_x = text2num(click_parameters["icon-x"]) + var/mouse_y = text2num(click_parameters["icon-y"]) + switch (placement_mode) + if (PIPE_PLACEMENT_SIMPLE) + // Zero rotations as we use the default direction of the pipe + return 0 + if (PIPE_PLACEMENT_DIAGONAL) + // One case for each of the four quarters of a square + // 0 │ 1 + // ───┼─── + // 3 │ 2 + if (mouse_x <= 16) + if (mouse_y <= 16) + . = 3 + else + . = 0 + else + if (mouse_y <= 16) + . = 2 + else + . = 1 + if (PIPE_PLACEMENT_ORTHOGONAL) + // One case for each of the four triangles of a square + // ⟍ 0 ⟋ + // 3 ⤫ 1 + // ⟋ 2 ⟍ + if (mouse_y > mouse_x) + if (mouse_y > 32-mouse_x) + . = 0 + else + . = 3 + else + if (mouse_y > 32-mouse_x) + . = 1 + else + . = 2 + /obj/item/rpd/examine(mob/user, distance) . = ..() if(distance <= 1) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index be391bad2ef24..b42a6513e3ed5 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -46,6 +46,42 @@ return ..() +/obj/item/card/party/cen/fet + name = "party card" + desc = "A card showing membership in the Citizens for Free Enterprise & Trade party." + icon_state = "party_cen" + slot_flags = SLOT_ID + +/obj/item/card/party/cen/pac + name = "party card" + desc = "A card showing membership in the Progressive Alliance of Citizens." + icon_state = "party_cen" + slot_flags = SLOT_ID + +/obj/item/card/party/lef/ugl + name = "party card" + desc = "A card showing membership in the United Green-Left of Sol party." + icon_state = "party_lef" + slot_flags = SLOT_ID + +/obj/item/card/party/lef/ldd + name = "party card" + desc = "A card showing membership in the Leftists for Direct Democracy & Freedom party." + icon_state = "party_lef" + slot_flags = SLOT_ID + +/obj/item/card/party/rig/sfr + name = "party card" + desc = "A card showing membership in the Solarians for Freedom & Rights party." + icon_state = "party_rig" + slot_flags = SLOT_ID + +/obj/item/card/party/rig/osn + name = "party card" + desc = "A card showing membership in the Order of Solarian Nations." + icon_state = "party_rig" + slot_flags = SLOT_ID + /obj/item/card/operant_card name = "operant registration card" icon_state = "warrantcard_civ" @@ -480,6 +516,14 @@ var/global/const/NO_EMAG_ACT = -50 access = GLOB.using_map.synth_access.Copy() ..() +/obj/item/card/id/synthetic/ai + name = "\improper AI ID" + desc = "All-access module for the AI." + +/obj/item/card/id/synthetic/ai/New() + ..() + access = get_all_station_access() + access_synth + /obj/item/card/id/centcom name = "\improper CentCom. ID" desc = "An ID straight from Cent. Com." diff --git a/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm b/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm index 23734ac651316..d2e97106b6c3d 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm @@ -2,24 +2,7 @@ name = "circuit board (basic shuttle console)" build_path = /obj/machinery/computer/shuttle_control origin_tech = list(TECH_DATA = 3) - var/shuttle_tag - -/obj/item/stock_parts/circuitboard/shuttle_console/construct(obj/machinery/computer/shuttle_control/M) - M.shuttle_tag = shuttle_tag - -/obj/item/stock_parts/circuitboard/shuttle_console/deconstruct(obj/machinery/computer/shuttle_control/M) - shuttle_tag = M.shuttle_tag - -/obj/item/stock_parts/circuitboard/shuttle_console/Initialize() - set_extension(src, /datum/extension/interactive/multitool/circuitboards/shuttle_console) - . = ..() - -/obj/item/stock_parts/circuitboard/shuttle_console/proc/is_valid_shuttle(datum/shuttle/shuttle) - return TRUE /obj/item/stock_parts/circuitboard/shuttle_console/explore name = "circuit board (long range shuttle console)" build_path = /obj/machinery/computer/shuttle_control/explore - -/obj/item/stock_parts/circuitboard/shuttle_console/explore/is_valid_shuttle(datum/shuttle/shuttle) - return istype(shuttle, /datum/shuttle/autodock/overmap) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index f84331d8aca00..04f03a56ca630 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -245,7 +245,6 @@ else wielded = 0 SetName(initial(name)) - update_icon() ..() /obj/item/shockpaddles/on_update_icon() diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 3b5e15b95ac9f..23ff6d221cdb6 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -311,3 +311,6 @@ reagents.add_reagent(/datum/reagent/tobacco/liquid, 5) reagents.add_reagent(/datum/reagent/water, 10) reagents.add_reagent(/datum/reagent/drink/coffee, 5) + +/obj/item/clothing/mask/smokable/ecig/smoke(amount) + ..(amount * 0.1) diff --git a/code/game/objects/items/weapons/grenades/explosive.dm b/code/game/objects/items/weapons/grenades/explosive.dm index 38a8613ecaaa4..3e1917f12c0ed 100644 --- a/code/game/objects/items/weapons/grenades/explosive.dm +++ b/code/game/objects/items/weapons/grenades/explosive.dm @@ -123,9 +123,8 @@ /obj/item/material/shard, /obj/item/reagent_containers/syringe, /obj/item/pen, - /obj/item/material/knife/table, - /obj/item/material/kitchen/utensil - ) + /obj/item/material/utensil + ) /obj/item/grenade/frag/makeshift/Initialize() det_time = rand(5,100) // Fuse is randomized. diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 645c2c2dcd176..3a27558a375a1 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -1,62 +1,61 @@ -/obj/item/material/kitchen +/obj/item/material/utensil icon = 'icons/obj/machines/kitchen.dmi' - worth_multiplier = 1.1 - -/* - * Utensils - */ -/obj/item/material/kitchen/utensil w_class = ITEM_SIZE_TINY thrown_force_multiplier = 1 origin_tech = list(TECH_MATERIAL = 1) attack_verb = list("attacked", "stabbed", "poked") - max_force = 5 + max_force = 8 force_multiplier = 0.1 // 6 when wielded with hardness 60 (steel) thrown_force_multiplier = 0.25 // 5 when thrown with weight 20 (steel) puncture = TRUE default_material = MATERIAL_ALUMINIUM + applies_material_name = TRUE + + /// Descriptive string for currently loaded food object + var/loaded + + /// Whether the utensil is able to collect reagents from food + var/scoop_food = TRUE - var/loaded //Descriptive string for currently loaded food object. - var/scoop_food = 1 -/obj/item/material/kitchen/utensil/New() - ..() +/obj/item/material/utensil/Initialize() + . = ..() if (prob(60)) - src.pixel_y = rand(0, 4) - create_reagents(5) - return + pixel_y = rand(0, 4) + if (material.conductive) + obj_flags |= OBJ_FLAG_CONDUCTIBLE + if (scoop_food) + create_reagents(5) -/obj/item/material/kitchen/utensil/use_after(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if (!istype(M)) - return FALSE +/obj/item/material/utensil/use_after(mob/living/carbon/subject, mob/living/carbon/user) + if (!istype(subject)) + return FALSE if (reagents.total_volume > 0) - if(M == user) - if(!M.can_eat(loaded)) + if(subject == user) + if(!subject.can_eat(loaded)) return TRUE - switch(M.get_fullness()) + switch(subject.get_fullness()) if (0 to 50) - to_chat(M, SPAN_DANGER("You ravenously stick \the [src] into your mouth and gobble the food!")) + to_chat(subject, SPAN_DANGER("You ravenously stick \the [src] into your mouth and gobble the food!")) if (50 to 150) - to_chat(M, SPAN_NOTICE("You hungrily chew the food on \the [src].")) + to_chat(subject, SPAN_NOTICE("You hungrily chew the food on \the [src].")) if (150 to 350) - to_chat(M, SPAN_NOTICE("You chew the food on \the [src].")) + to_chat(subject, SPAN_NOTICE("You chew the food on \the [src].")) if (350 to 550) - to_chat(M, SPAN_NOTICE("You unwillingly chew the food on \the [src].")) + to_chat(subject, SPAN_NOTICE("You unwillingly chew the food on \the [src].")) if (550 to INFINITY) - to_chat(M, SPAN_WARNING("You cannot take one more bite from \the [src]!")) + to_chat(subject, SPAN_WARNING("You cannot take one more bite from \the [src]!")) return TRUE - else - user.visible_message(SPAN_WARNING("\The [user] begins to feed \the [M]!")) - if (!M.can_force_feed(user, loaded) || !do_after(user, 5 SECONDS, M, DO_PUBLIC_UNIQUE)) + user.visible_message(SPAN_WARNING("\The [user] begins to feed \the [subject]!")) + if (!subject.can_force_feed(user, loaded) || !do_after(user, 5 SECONDS, subject, DO_PUBLIC_UNIQUE)) return TRUE - if (user.get_active_hand() != src) return TRUE - M.visible_message(SPAN_NOTICE("\The [user] feeds some [loaded] to \the [M] with \the [src].")) - reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) - playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1) + subject.visible_message(SPAN_NOTICE("\The [user] feeds some [loaded] to \the [subject] with \the [src].")) + reagents.trans_to_mob(subject, reagents.total_volume, CHEM_INGEST) + playsound(subject.loc,'sound/items/eatfood.ogg', rand(10,40), TRUE) ClearOverlays() return TRUE else @@ -64,63 +63,77 @@ return TRUE -/obj/item/material/kitchen/utensil/fork +/obj/item/material/utensil/knife + name = "table knife" + desc = "A simple table knife, used to cut up individual portions of food." + icon = 'icons/obj/weapons/knife.dmi' + icon_state = "table" + item_state = "knife" + scoop_food = FALSE + edge = TRUE + attack_verb = list("slashed", "stabbed", "cut") + item_flags = ITEM_FLAG_CAN_HIDE_IN_SHOES + +/obj/item/material/utensil/knife/plastic/default_material = MATERIAL_PLASTIC +/obj/item/material/utensil/knife/silver/default_material = MATERIAL_SILVER +/obj/item/material/utensil/knife/titanium/default_material = MATERIAL_TITANIUM + + +/obj/item/material/utensil/fork name = "fork" desc = "It's a fork. Sure is pointy." icon_state = "fork" -/obj/item/material/kitchen/utensil/fork/plastic/default_material = MATERIAL_PLASTIC -/obj/item/material/kitchen/utensil/fork/silver/default_material = MATERIAL_SILVER -/obj/item/material/kitchen/utensil/fork/titanium/default_material = MATERIAL_TITANIUM +/obj/item/material/utensil/fork/plastic/default_material = MATERIAL_PLASTIC +/obj/item/material/utensil/fork/silver/default_material = MATERIAL_SILVER +/obj/item/material/utensil/fork/titanium/default_material = MATERIAL_TITANIUM -/obj/item/material/kitchen/utensil/spoon +/obj/item/material/utensil/spoon name = "spoon" desc = "It's a spoon. You can see your own upside-down face in it." icon_state = "spoon" attack_verb = list("attacked", "poked") force_multiplier = 0.1 //2 when wielded with weight 20 (steel) -/obj/item/material/kitchen/utensil/spoon/plastic/default_material = MATERIAL_PLASTIC -/obj/item/material/kitchen/utensil/spoon/silver/default_material = MATERIAL_SILVER -/obj/item/material/kitchen/utensil/spoon/titanium/default_material = MATERIAL_TITANIUM +/obj/item/material/utensil/spoon/plastic/default_material = MATERIAL_PLASTIC +/obj/item/material/utensil/spoon/silver/default_material = MATERIAL_SILVER +/obj/item/material/utensil/spoon/titanium/default_material = MATERIAL_TITANIUM -/obj/item/material/kitchen/utensil/spork +/obj/item/material/utensil/spork name = "spork" desc = "It's a spork. It's much like a fork, but much blunter." icon_state = "spork" -/obj/item/material/kitchen/utensil/spork/plastic/default_material = MATERIAL_PLASTIC -/obj/item/material/kitchen/utensil/spork/silver/default_material = MATERIAL_SILVER -/obj/item/material/kitchen/utensil/spork/titanium/default_material = MATERIAL_TITANIUM +/obj/item/material/utensil/spork/plastic/default_material = MATERIAL_PLASTIC +/obj/item/material/utensil/spork/silver/default_material = MATERIAL_SILVER +/obj/item/material/utensil/spork/titanium/default_material = MATERIAL_TITANIUM -/obj/item/material/kitchen/utensil/foon +/obj/item/material/utensil/foon name = "foon" desc = "It's a foon. It's much like a spoon, but much sharper." icon_state = "foon" -/obj/item/material/kitchen/utensil/foon/plastic/default_material = MATERIAL_PLASTIC -/obj/item/material/kitchen/utensil/foon/silver/default_material = MATERIAL_SILVER -/obj/item/material/kitchen/utensil/foon/titanium/default_material = MATERIAL_TITANIUM +/obj/item/material/utensil/foon/plastic/default_material = MATERIAL_PLASTIC +/obj/item/material/utensil/foon/silver/default_material = MATERIAL_SILVER +/obj/item/material/utensil/foon/titanium/default_material = MATERIAL_TITANIUM /obj/item/storage/box/silverware name = "silverware box" startswith = list( - /obj/item/material/knife/table/silver = 4, - /obj/item/material/kitchen/utensil/fork/silver = 4, - /obj/item/material/kitchen/utensil/spoon/silver = 4 + /obj/item/material/utensil/knife/silver = 4, + /obj/item/material/utensil/fork/silver = 4, + /obj/item/material/utensil/spoon/silver = 4 ) - /* - * Rolling Pins - */ -/obj/item/material/kitchen/rollingpin +/obj/item/material/rollingpin name = "rolling pin" desc = "Used to knock out the Bartender." + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "rolling_pin" attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") default_material = MATERIAL_WOOD @@ -128,11 +141,11 @@ force_multiplier = 0.7 // 10 when wielded with weight 15 (wood) thrown_force_multiplier = 1 // as above -/obj/item/material/kitchen/rollingpin/plastic/default_material = MATERIAL_PLASTIC -/obj/item/material/kitchen/rollingpin/aluminium/default_material = MATERIAL_ALUMINIUM +/obj/item/material/rollingpin/plastic/default_material = MATERIAL_PLASTIC +/obj/item/material/rollingpin/aluminium/default_material = MATERIAL_ALUMINIUM -/obj/item/material/kitchen/rollingpin/use_before(mob/living/target, mob/living/user) +/obj/item/material/rollingpin/use_before(mob/living/target, mob/living/user) . = FALSE if ((MUTATION_CLUMSY in user.mutations) && prob(50) && user.unEquip(src)) var/datum/pronouns/pronouns = user.choose_from_pronouns() diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 7bd8608d3379b..9e964dcc6e03a 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -1,5 +1,5 @@ -//knives for stabbing and slashing and so on and so forth -/obj/item/material/knife //master obj +/obj/item/material/knife + abstract_type = /obj/item/material/knife name = "the concept of a knife" desc = "You call that a knife? This is a master item - berate the admin or mapper who spawned this!" icon = 'icons/obj/weapons/knife.dmi' @@ -17,23 +17,6 @@ edge = TRUE item_flags = ITEM_FLAG_CAN_HIDE_IN_SHOES -//table knives -/obj/item/material/knife/table - name = "table knife" - desc = "A simple table knife, used to cut up individual portions of food." - icon_state = "table" - default_material = MATERIAL_ALUMINIUM - max_force = 7 - force_multiplier = 0.1 - sharp = FALSE - attack_verb = list("prodded") - applies_material_name = FALSE - w_class = ITEM_SIZE_TINY - -/obj/item/material/knife/table/plastic/default_material = MATERIAL_PLASTIC -/obj/item/material/knife/table/silver/default_material = MATERIAL_SILVER -/obj/item/material/knife/table/titanium/default_material = MATERIAL_TITANIUM - /obj/item/material/knife/unathi name = "dueling knife" @@ -44,13 +27,14 @@ applies_material_colour = FALSE w_class = ITEM_SIZE_NORMAL -//kitchen knives + /obj/item/material/knife/kitchen name = "kitchen knife" icon_state = "kitchenknife" desc = "A general purpose chef's knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come." applies_material_name = FALSE + /obj/item/material/knife/kitchen/cleaver name = "butcher's cleaver" desc = "A heavy blade used to process food, especially animal carcasses." @@ -59,13 +43,14 @@ force_multiplier = 0.18 attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + /obj/item/material/knife/kitchen/cleaver/bronze name = "master chef's cleaver" desc = "A heavy blade used to process food. This one is so fancy, it must be for a truly exceptional chef. There aren't any here, so what it's doing here is anyone's guess." default_material = MATERIAL_BRONZE - force_multiplier = 1 //25 with material bronze + force_multiplier = 1 + -//fighting knives /obj/item/material/knife/combat name = "combat knife" desc = "A blade with a saw-like pattern on the reverse edge and a heavy handle." @@ -74,7 +59,7 @@ base_parry_chance = 30 w_class = ITEM_SIZE_SMALL -//random stuff + /obj/item/material/knife/hook name = "meat hook" desc = "A sharp, metal hook what sticks into things." @@ -82,6 +67,7 @@ item_state = "hook_knife" sharp = FALSE + /obj/item/material/knife/ritual name = "ritual knife" desc = "The unearthly energies that once powered this blade are now dormant." @@ -91,7 +77,7 @@ applies_material_colour = FALSE applies_material_name = FALSE -//Utility knives + /obj/item/material/knife/utility name = "utility knife" desc = "An utility knife with a polymer handle, commonly used through human space." @@ -100,6 +86,7 @@ force_multiplier = 0.2 w_class = ITEM_SIZE_SMALL + /obj/item/material/knife/utility/lightweight name = "lightweight utility knife" desc = "A lightweight utility knife made out of a steel alloy." diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 326934d106ffd..2963bd6353692 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -37,7 +37,6 @@ else wielded = 0 force = force_unwielded - update_icon() ..() /obj/item/material/twohanded/update_force() diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index ba3c29e0324b3..de687a2a088b4 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -346,3 +346,7 @@ origin_tech = list(TECH_MAGNET = 3) active_attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") hitsound = 'sound/weapons/blade1.ogg' + + +/obj/item/melee/energy/machete/IsHatchet() + return TRUE diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index ff543d316fe7b..e949095bf7f37 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -136,7 +136,8 @@ /obj/item/swapper, /obj/item/device/drone_designator, /obj/item/modular_computer/tablet, - /obj/item/modular_computer/pda + /obj/item/modular_computer/pda, + /obj/item/rcd ) diff --git a/code/game/objects/items/weapons/storage/med_pouch.dm b/code/game/objects/items/weapons/storage/med_pouch.dm index 6cb2541d5c95d..b0dd0bbba2795 100644 --- a/code/game/objects/items/weapons/storage/med_pouch.dm +++ b/code/game/objects/items/weapons/storage/med_pouch.dm @@ -215,3 +215,8 @@ Single Use Emergency Pouches /obj/item/reagent_containers/hypospray/autoinjector/pouch_auto/adrenaline name = "emergency adrenaline autoinjector" starts_with = list(/datum/reagent/adrenaline = 5) + +/obj/item/reagent_containers/hypospray/autoinjector/pouch_auto/allergy + name = "emergency allergy autoinjector" + desc = "The ingredient label reads 1.5 units of epinephrine and 3.5 units of inaprovaline." + starts_with = list(/datum/reagent/adrenaline = 1.5, /datum/reagent/inaprovaline = 3.5) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm index 9cb3c4d9135a2..612cd1327563d 100644 --- a/code/game/objects/items/weapons/storage/mre.dm +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -19,7 +19,7 @@ MRE Stuff /obj/random/mre/spread, /obj/random/mre/drink, /obj/item/reagent_containers/food/condiment/small/packet/capsaicin, - /obj/item/material/kitchen/utensil/fork/plastic + /obj/item/material/utensil/fork/plastic ) /obj/item/storage/mre/Initialize() @@ -54,7 +54,7 @@ MRE Stuff /obj/random/mre/spread, /obj/random/mre/drink, /obj/item/reagent_containers/food/condiment/small/packet/salt, - /obj/item/material/kitchen/utensil/fork/plastic + /obj/item/material/utensil/fork/plastic ) /obj/item/storage/mre/menu3 @@ -67,7 +67,7 @@ MRE Stuff /obj/random/mre/spread, /obj/random/mre/drink, /obj/item/reagent_containers/food/condiment/small/packet/pepper, - /obj/item/material/kitchen/utensil/fork/plastic + /obj/item/material/utensil/fork/plastic ) /obj/item/storage/mre/menu4 @@ -80,7 +80,7 @@ MRE Stuff /obj/random/mre/spread, /obj/random/mre/drink, /obj/item/reagent_containers/food/condiment/small/packet/mayo, - /obj/item/material/kitchen/utensil/spork/plastic + /obj/item/material/utensil/spork/plastic ) /obj/item/storage/mre/menu5 @@ -93,7 +93,7 @@ MRE Stuff /obj/random/mre/spread, /obj/random/mre/drink, /obj/item/reagent_containers/food/condiment/small/packet/ketchup, - /obj/item/material/kitchen/utensil/spork/plastic + /obj/item/material/utensil/spork/plastic ) /obj/item/storage/mre/menu6 @@ -106,7 +106,7 @@ MRE Stuff /obj/random/mre/spread, /obj/random/mre/drink, /obj/random/mre/sauce/sugarfree, - /obj/item/material/kitchen/utensil/fork/plastic + /obj/item/material/utensil/fork/plastic ) /obj/item/storage/mre/menu7 @@ -119,7 +119,7 @@ MRE Stuff /obj/random/mre/spread, /obj/random/mre/drink, /obj/item/reagent_containers/food/condiment/small/packet/soy, - /obj/item/material/kitchen/utensil/spoon/plastic + /obj/item/material/utensil/spoon/plastic ) /obj/item/storage/mre/menu8 @@ -132,7 +132,7 @@ MRE Stuff /obj/random/mre/spread, /obj/random/mre/drink, /obj/item/reagent_containers/food/condiment/small/packet/capsaicin, - /obj/item/material/kitchen/utensil/spoon/plastic + /obj/item/material/utensil/spoon/plastic ) /obj/item/storage/mre/menu9 @@ -146,19 +146,19 @@ MRE Stuff /obj/random/mre/spread/vegan, /obj/random/mre/drink, /obj/item/reagent_containers/food/condiment/small/packet/soy, - /obj/item/material/kitchen/utensil/spoon/plastic + /obj/item/material/utensil/spoon/plastic ) /obj/item/storage/mre/menu10 name = "protein MRE" - meal_desc = "This one is menu 10, protein." + meal_desc = "This one is menu 10, protein (unathi-safe)." icon_state = "meatmre" main_meal = /obj/item/storage/mrebag/menu10 startswith = list( /obj/item/reagent_containers/food/snacks/proteinbar, /obj/item/reagent_containers/food/condiment/small/packet/protein, /obj/random/mre/sauce/sugarfree, - /obj/item/material/kitchen/utensil/fork/plastic + /obj/item/material/utensil/fork/plastic ) /obj/item/storage/mre/menu11 diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index adb5714b28cfa..ad243fb5c701c 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -63,7 +63,6 @@ playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) add_fingerprint(user) update_icon() - update_held_icon() /obj/item/melee/telebaton/on_update_icon() if(on) diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 33a60f306a3b8..15cd94e9e23e0 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -144,16 +144,23 @@ anchored = TRUE if(click_parameters) + var/offset_x = 16 + var/offset_y = 16 + if (stuck.center_of_mass) + var/list/center = cached_key_number_decode(stuck.center_of_mass) + offset_x = center["x"] + offset_y = center["y"] if(click_parameters["icon-x"]) - pixel_x = text2num(click_parameters["icon-x"]) - 16 + pixel_x = text2num(click_parameters["icon-x"]) - offset_x if(dir_offset & EAST) pixel_x += 32 else if(dir_offset & WEST) pixel_x -= 32 if(click_parameters["icon-y"]) - pixel_y = text2num(click_parameters["icon-y"]) - 16 + pixel_y = text2num(click_parameters["icon-y"]) - offset_y if(dir_offset & NORTH) pixel_y += 32 else if(dir_offset & SOUTH) pixel_y -= 32 + pixel_z = 0 return TRUE diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm index daa085d1759d8..ccb5f4d678f3e 100644 --- a/code/game/objects/items/weapons/trays.dm +++ b/code/game/objects/items/weapons/trays.dm @@ -48,7 +48,7 @@ // Bash a rolling pin against a tray like a true knight! /obj/item/tray/use_tool(obj/item/W, mob/living/user, list/click_params) - if(istype(W, /obj/item/material/kitchen/rollingpin)) + if(istype(W, /obj/item/material/rollingpin)) if(bash_cooldown < world.time) user.visible_message(SPAN_WARNING("[user] bashes [src] with [W]!")) playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 548e23af14535..ba7396770759c 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -21,7 +21,7 @@ if (fragile) return kill_health() damage = max(damage, 10) - ..() + return ..() /obj/structure/proc/mob_breakout(mob/living/escapee) set waitfor = FALSE @@ -56,7 +56,7 @@ fluid_update() -/obj/structure/use_weapon(obj/item/weapon, mob/user, list/click_params) +/obj/structure/use_weapon(obj/item/weapon, mob/living/user, list/click_params) // Natural Weapon - Passthrough to generic attack if (istype(weapon, /obj/item/natural_weapon)) attack_generic(user, weapon.force, pick(weapon.attack_verb), damtype = weapon.damtype, dam_flags = weapon.damage_flags()) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/service.dm b/code/game/objects/structures/crates_lockers/closets/secure/service.dm index 7c5437a7401e8..526e9503b867f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/service.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/service.dm @@ -8,6 +8,7 @@ /obj/item/clothing/under/rank/chaplain, /obj/item/clothing/shoes/black, /obj/item/clothing/suit/chaplain_hoodie, + /obj/item/clothing/head/chaplain_hood, /obj/item/storage/candle_box = 2, /obj/item/storage/candle_box/incense, /obj/item/deck/tarot, @@ -15,5 +16,6 @@ /obj/item/nullrod, /obj/item/storage/bible, /obj/item/storage/belt/general, - /obj/item/material/urn + /obj/item/material/urn, + /obj/item/glass_jar ) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index fa77a2e9e26a5..21f69f261865f 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -182,7 +182,12 @@ desc = "A crate of emergency rations." /obj/structure/closet/crate/freezer/rations/WillContain() - return list(/obj/random/mre = 6, /obj/item/reagent_containers/food/drinks/cans/waterbottle = 12) + return list( + /obj/random/mre = 6, + /obj/item/storage/mre/menu9, + /obj/item/storage/mre/menu10, + /obj/item/reagent_containers/food/drinks/cans/waterbottle = 8 + ) /obj/structure/closet/crate/freezer/meat name = "meat crate" diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora/flora.dm similarity index 92% rename from code/game/objects/structures/flora.dm rename to code/game/objects/structures/flora/flora.dm index 237a941fb3277..96f219081ab63 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora/flora.dm @@ -1,39 +1,20 @@ -//trees -/obj/structure/flora/tree - name = "tree" - anchored = TRUE - density = TRUE - pixel_x = -16 +/obj/structure/flora + name = "flora" layer = ABOVE_HUMAN_LAYER -/obj/structure/flora/tree/pine - name = "pine tree" - icon = 'icons/obj/flora/pinetrees.dmi' - icon_state = "pine_1" - -/obj/structure/flora/tree/pine/New() - ..() - icon_state = "pine_[rand(1, 3)]" -/obj/structure/flora/tree/pine/xmas - name = "\improper Christmas tree" - desc = "O Christmas tree, O Christmas tree..." - icon = 'icons/obj/flora/pinetrees.dmi' - icon_state = "pine_c" +/obj/structure/flora/use_tool(obj/item/tool, mob/user, list/click_params) + if (isHatchet(tool)) + if (!density) + user.visible_message( + SPAN_NOTICE("[user] cuts away \the [src]."), + SPAN_NOTICE("You cut away \the [src].") + ) + qdel_self() + return TRUE + return ..() -/obj/structure/flora/tree/pine/xmas/New() - ..() - icon_state = "pine_c" - -/obj/structure/flora/tree/dead - icon = 'icons/obj/flora/deadtrees.dmi' - icon_state = "tree_1" - -/obj/structure/flora/tree/dead/New() - ..() - icon_state = "tree_[rand(1, 6)]" -//grass /obj/structure/flora/grass name = "grass" icon = 'icons/obj/flora/snowflora.dmi' diff --git a/code/game/objects/structures/flora/tree.dm b/code/game/objects/structures/flora/tree.dm new file mode 100644 index 0000000000000..bd5dc47e4482c --- /dev/null +++ b/code/game/objects/structures/flora/tree.dm @@ -0,0 +1,235 @@ +/obj/structure/flora/tree + name = "tree" + anchored = TRUE + density = TRUE + pixel_x = -16 + layer = ABOVE_HUMAN_LAYER + health_max = 200 + + /// How much to shake the tree by when struck + var/shake_animation_degrees = 4 + + /// If set, a material product from cutting the tree down + var/material/product = MATERIAL_WOOD + + /// If there is a product, the max amount that can be produced + var/product_max = 10 + + /// When true, the tree has already been cut down + var/is_stump + + /// A local override for damage that should reduce the product_max + var/const/DAMAGE_FLAG_PRODUCT = FLAG(23) + + +/obj/structure/flora/tree/Initialize() + . = ..() + product = SSmaterials.get_material_by_name(product) + if (!product) + log_debug({"Instance of [type] created with bad product "[initial(product)]""}) + return INITIALIZE_HINT_QDEL + health_min_damage = 5 + + +/obj/structure/flora/tree/use_tool(obj/item/tool, mob/living/user, list/click_params) + SHOULD_CALL_PARENT(FALSE) + if (istype(tool, /obj/item/shovel) && user.a_intent != I_HURT) + if (!is_stump) + to_chat(user, SPAN_WARNING("You can't dig up \the [src] without cutting it down first!")) + return + if (!do_after(user, 5 SECONDS, src, DO_PUBLIC_UNIQUE)) + return + user.visible_message( + SPAN_ITALIC("\The [user] digs up \a [src] with \a [tool]."), + SPAN_ITALIC("You dig up \the [src] with \the [tool].") + ) + qdel(src) + return TRUE + user.setClickCooldown(user.get_attack_speed(tool)) + user.do_attack_animation(src) + TryChop(tool, user) + return TRUE + + +/obj/structure/flora/tree/use_weapon(obj/item/weapon, mob/living/user, list/click_params) + SHOULD_CALL_PARENT(FALSE) + if (!is_stump) + TryChop(weapon, user) + return TRUE + var/other_message = "" + var/self_message = "" + if (istype(weapon, /obj/item/natural_weapon)) + var/datum/pronouns/pronouns = user.choose_from_pronouns() + other_message = " with [pronouns.his] [weapon]" + self_message = " with your [weapon]" + else + other_message = " with \a [weapon]" + self_message = " with \the [weapon]" + user.visible_message( + SPAN_ITALIC("\The [user] hits \a [src][other_message]."), + SPAN_ITALIC("You hit \the [src][self_message].") + SPAN_WARNING(" It does nothing!"), + SPAN_WARNING("You hear something impact on wood!") + ) + return TRUE + + +/obj/structure/flora/tree/on_death() + if (holographic || is_stump) + return + if (product && product_max > 0) + var/amount = rand(ceil(product_max / 2), product_max) + product.place_sheet(get_turf(src), amount) + visible_message(SPAN_WARNING("\The [src] is felled!")) + icon_state = "[initial(icon_state)]_stump" + name = "[name] stump" + is_stump = TRUE + density = FALSE + set_light(0) + + +/obj/structure/flora/tree/proc/TryChop(obj/item/item, mob/living/user) + var/damage + var/damage_flags + var/chop + var/other_message = "" + var/self_message = "" + damage = item.force + chop = item.sharp && item.edge && user.a_intent != I_HURT + if (isHatchet(item)) + damage *= 1.5 + if (istype(item, /obj/item/natural_weapon)) + var/datum/pronouns/pronouns = user.choose_from_pronouns() + other_message = " with [pronouns.his] [item]" + self_message = " with your [item]" + else + other_message = " with \a [item]" + self_message = " with \the [item]" + if (holographic) + other_message = SPAN_ITALIC("\The [user] swipes at \a [src][other_message].") + self_message = SPAN_ITALIC("You swipe at \the [src][self_message].") + damage = 0 + else if (chop) + other_message = SPAN_ITALIC("\The [user] chops \a [src][other_message].") + self_message = SPAN_ITALIC("You chop \the [src][self_message].") + else if (item.sharp || item.edge) + other_message = SPAN_ITALIC("\The [user] hacks at \a [src][other_message].") + self_message = SPAN_ITALIC("You hack at \the [src][self_message].") + damage *= 0.5 + damage_flags = DAMAGE_FLAG_PRODUCT + else + other_message = SPAN_ITALIC("\The [user] hits \a [src][other_message].") + self_message = SPAN_ITALIC("You hit \the [src][self_message].") + damage *= 0.25 + damage_flags = DAMAGE_FLAG_PRODUCT + damage = max(damage, 0) + if (damage) + if (chop) + playsound(src, 'sound/effects/woodcutting.ogg', 50, TRUE) + else if (item?.hitsound) + playsound(src, item.hitsound, 50, TRUE) + if (damage < health_min_damage) + self_message += SPAN_WARNING(" It does nothing!") + else + damage_health(damage, item.damtype, damage_flags) + shake_animation(shake_animation_degrees) + user.visible_message( + other_message, + self_message, + SPAN_WARNING("You hear something impact on wood!") + ) + + +/obj/structure/flora/tree/damage_health(damage, damage_type, damage_flags, severity, skip_can_damage_check) + if (holographic || is_stump) + return FALSE + if (product_max && HAS_FLAGS(damage_flags, DAMAGE_FLAG_PRODUCT)) + var/removed = initial(product_max) * damage / get_max_health() + product_max -= max(removed, 0) + return ..() + + +/obj/structure/flora/tree/ex_act(severity) + damage_health(get_max_health() / severity, DAMAGE_EXPLODE, DAMAGE_FLAG_PRODUCT) + + +/obj/structure/flora/tree/bullet_act(obj/item/projectile/projectile) + if (!projectile.get_structure_damage()) + return + var/amount = projectile.get_structure_damage() + damage_health(amount, projectile.damage_type, DAMAGE_FLAG_PRODUCT) + + +/obj/structure/flora/tree/pine + name = "pine tree" + icon = 'icons/obj/flora/pinetrees.dmi' + icon_state = "pine" + product = MATERIAL_WOOD + shake_animation_degrees = 3 + + +/obj/structure/flora/tree/pine/Initialize() + . = ..() + var/state = rand(2) + if (state) + icon_state = "[initial(icon_state)]_[state]" + + +/obj/structure/flora/tree/pine/xmas + name = "\improper Christmas tree" + desc = "O Christmas tree, O Christmas tree..." + icon = 'icons/obj/flora/pinetrees.dmi' + product = MATERIAL_PLASTIC + product_max = 8 + + +/obj/structure/flora/tree/pine/xmas/Initialize() + . = ..() + icon_state = "pine_c" + + +/obj/structure/flora/tree/festivus + name = "\improper Festivus pole" + desc = "Technically, one could air a grievance with a feat of strength." + icon_state = "festivus_pole" + health_max = 100 + product_max = 5 + + +/obj/structure/flora/tree/dead + icon = 'icons/obj/flora/deadtrees.dmi' + icon_state = "tree" + + +/obj/structure/flora/tree/dead/Initialize() + . = ..() + var/state = rand(5) + if (state) + icon_state = "[initial(icon_state)]_[state]" + + +/obj/structure/flora/tree/alien + name = "alien tree" + desc = "A large xenofloral specimen." + icon = 'icons/obj/flora/deadtrees.dmi' + icon_state = "tree_sif" + + +/obj/structure/flora/tree/alien/Initialize() + . = ..() + var/state = rand(5) + if (state) + icon_state = "[initial(icon_state)]_[state]" + queue_icon_update() + + +/obj/structure/flora/tree/alien/on_death() + ..() + update_icon() + + +/obj/structure/flora/tree/alien/on_update_icon() + ClearOverlays() + if (is_stump) + return + var/mutable_appearance/glow = emissive_appearance(icon, "[icon_state]_glow", src, 128) + AddOverlays(glow) 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 0243362d4ed15..1800df4b5a931 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -12,6 +12,8 @@ var/material_alteration = MATERIAL_ALTERATION_ALL /// Bitflags. Bed/chair specific flags. var/bed_flags = EMPTY_BITFIELD + /// How many sheets should be given when dismantled, based on their stack_recipe datum + var/dismantle_return = 2 /obj/structure/bed/New(newloc, new_material = DEFAULT_FURNITURE_MATERIAL, new_padding_material) @@ -184,7 +186,7 @@ update_icon() /obj/structure/bed/proc/dismantle() - material.place_sheet(get_turf(src)) + material.place_sheet(get_turf(src), dismantle_return) if(padding_material) padding_material.place_sheet(get_turf(src)) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index a685a5d082376..0edf2acec6c0e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -9,6 +9,7 @@ obj_flags = OBJ_FLAG_ROTATABLE var/propelled = 0 // Check for fire-extinguisher-driven chairs buckle_movable = TRUE + dismantle_return = 1 /obj/structure/bed/chair/do_simple_ranged_interaction(mob/user) if(!buckled_mob && user) @@ -140,6 +141,7 @@ desc = "It's a chair. It looks comfy." icon_state = "comfychair_preview" base_icon = "comfychair" + dismantle_return = 3 /obj/structure/bed/chair/comfy/brown/New(newloc, newmaterial = DEFAULT_FURNITURE_MATERIAL) ..(newloc, newmaterial, MATERIAL_LEATHER_GENERIC) @@ -192,6 +194,7 @@ icon_state = "armchair_preview" base_icon = "armchair" buckle_movable = FALSE + dismantle_return = 4 /obj/structure/bed/chair/armchair/brown/New(newloc, newmaterial = DEFAULT_FURNITURE_MATERIAL) ..(newloc, newmaterial, MATERIAL_LEATHER_GENERIC) @@ -228,6 +231,7 @@ icon_state = "officechair_preview" base_icon = "officechair" anchored = FALSE + dismantle_return = 5 /obj/structure/bed/chair/office/Move() . = ..() @@ -237,11 +241,11 @@ if (propelled) for (var/mob/O in src.loc) if (O != occupant) - Bump(O) + Bump(O, TRUE) else unbuckle_mob() -/obj/structure/bed/chair/office/Bump(atom/A) +/obj/structure/bed/chair/office/Bump(atom/A, called) ..() if(!buckled_mob) return @@ -277,6 +281,7 @@ desc = "It's an office chair. It looks comfy." icon_state = "comfyofficechair_preview" base_icon = "comfyofficechair" + dismantle_return = 7 /obj/structure/bed/chair/office/comfy/brown/New(newloc, newmaterial = DEFAULT_FURNITURE_MATERIAL) ..(newloc, newmaterial, MATERIAL_LEATHER_GENERIC) @@ -351,6 +356,7 @@ var/chair_material = MATERIAL_WOOD buckle_movable = FALSE bed_flags = BED_FLAG_CANNOT_BE_PADDED + dismantle_return = 3 /obj/structure/bed/chair/wood/New(newloc, _material) ..(newloc, _material? _material : chair_material) @@ -403,6 +409,7 @@ var/material/pew_material = MATERIAL_WOOD obj_flags = 0 buckle_movable = FALSE + dismantle_return = 4 /obj/structure/bed/chair/pew/left icon_state = "pew_left" diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index d27373bee9033..9d336cc238c56 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -102,7 +102,7 @@ if (propelled) for (var/mob/O in src.loc) if (O != occupant) - Bump(O) + Bump(O, TRUE) else unbuckle_mob() if (pulling && (get_dist(src, pulling) > 1)) @@ -141,7 +141,7 @@ return TRUE return FALSE -/obj/structure/bed/chair/wheelchair/Bump(atom/A) +/obj/structure/bed/chair/wheelchair/Bump(atom/A, called) ..() if(!buckled_mob) return diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 7a04edfed2245..00e2893069e4c 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -812,6 +812,9 @@ var/global/list/floor_decals = list() /obj/floor_decal/industrial/warning/corner icon_state = "stripecorner" +/obj/floor_decal/industrial/warning/inner + icon_state = "stripeinner" + /obj/floor_decal/industrial/warning/full icon_state = "stripefull" diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 7b6c238a86780..d184e1373c660 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -143,6 +143,9 @@ B.blood_DNA = list() if(!B.blood_DNA[M.dna.unique_enzymes]) B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type +//SIERRA-ADD VIRUSOLOGY + B.virus2 = virus_copylist(M.virus2) +//SIERRA-ADD return 1 //we bloodied the floor blood_splatter(src,M.get_blood(M.vessel),1) return 1 //we bloodied the floor diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 86c5f9f4e91dc..0d1633df3632a 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -17,6 +17,8 @@ . = ..() update_starlight() + set_extension(src, /datum/extension/support_lattice) + appearance = SSskybox.space_appearance_cache[(((x + y) ^ ~(x * y) + z) % 25) + 1] if(!HasBelow(z)) @@ -77,48 +79,10 @@ remove_starlight() /turf/space/use_tool(obj/item/C, mob/living/user, list/click_params) - if (istype(C, /obj/item/stack/material/rods)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return L.use_tool(C, user) - var/obj/item/stack/material/rods/R = C - if (!R.can_use(1)) - USE_FEEDBACK_STACK_NOT_ENOUGH(R, 1, "to lay down support lattice.") - return TRUE - - to_chat(user, SPAN_NOTICE("You lay down the support lattice.")) - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - ReplaceWithLattice(R.material.name) - R.use(1) - return TRUE - - if (istype(C, /obj/item/stack/tile)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(!L) - to_chat(user, SPAN_WARNING("The plating is going to need some support.")) - return TRUE - var/obj/item/stack/tile/floor/S = C - if (!S.can_use(1)) - USE_FEEDBACK_STACK_NOT_ENOUGH(S, 1, "to place the plating.") - return TRUE - - qdel(L) - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - ChangeTurf(/turf/simulated/floor/plating, keep_air = TRUE) - S.use(1) + var/datum/extension/support_lattice/sl = get_extension(src, /datum/extension/support_lattice) + if (sl.try_construct(C, user)) return TRUE - //Checking if the user attacked with a cable coil - if(isCoil(C)) - var/obj/item/stack/cable_coil/coil = C - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - coil.PlaceCableOnTurf(src, user) - return TRUE - else - to_chat(user, SPAN_WARNING("The cable needs something to be secured to.")) - return TRUE - return ..() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7a52bbe2e3a24..89a3c8b32809f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -164,33 +164,33 @@ for(var/obj/obstacle in mover.loc) if(!(obstacle.atom_flags & ATOM_FLAG_CHECKS_BORDER) && (mover != obstacle) && (forget != obstacle)) if(!obstacle.CheckExit(mover, src)) - mover.Bump(obstacle, 1) + mover.Bump(obstacle, TRUE) return 0 //Now, check objects to block exit that are on the border for(var/obj/border_obstacle in mover.loc) if((border_obstacle.atom_flags & ATOM_FLAG_CHECKS_BORDER) && (mover != border_obstacle) && (forget != border_obstacle)) if(!border_obstacle.CheckExit(mover, src)) - mover.Bump(border_obstacle, 1) + mover.Bump(border_obstacle, TRUE) return 0 //Next, check objects to block entry that are on the border for(var/obj/border_obstacle in src) if(border_obstacle.atom_flags & ATOM_FLAG_CHECKS_BORDER) if(!border_obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != border_obstacle)) - mover.Bump(border_obstacle, 1) + mover.Bump(border_obstacle, TRUE) return 0 //Then, check the turf itself if (!src.CanPass(mover, src)) - mover.Bump(src, 1) + mover.Bump(src, TRUE) return 0 //Finally, check objects/mobs to block entry that are not on the border for(var/atom/movable/obstacle in src) if(!(obstacle.atom_flags & ATOM_FLAG_CHECKS_BORDER)) if(!obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != obstacle)) - mover.Bump(obstacle, 1) + mover.Bump(obstacle, TRUE) return 0 return 1 //Nothing found to block so return success! diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 02433b8096d75..aae484808611f 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -105,7 +105,7 @@ recalc_atom_opacity() lighting_overlay = old_lighting_overlay affecting_lights = old_affecting_lights - if (old_opacity != opacity || dynamic_lighting != old_dynamic_lighting || force_lighting_update) + if (old_opacity != opacity || dynamic_lighting != old_dynamic_lighting || z_flags != old_zflags || force_lighting_update) reconsider_lights() updateVisibility(src) diff --git a/code/modules/ZAS/Airflow.dm b/code/modules/ZAS/Airflow.dm index 720dddb13469c..8a6e24db9d51e 100644 --- a/code/modules/ZAS/Airflow.dm +++ b/code/modules/ZAS/Airflow.dm @@ -85,7 +85,7 @@ Contains helper procs for airflow, handled in /connection_group. return 0 return 1 -/atom/movable/Bump(atom/A) +/atom/movable/Bump(atom/A, called) if(airflow_speed > 0 && airflow_dest) if(airborne_acceleration > 1) airflow_hit(A) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 1a687ea6d1913..209314da6f206 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1621,6 +1621,28 @@ GLOBAL_VAR_INIT(skip_allow_lists, FALSE) /datum/admins/proc/SetRoundLength() set category = "Server" set name = "Set Round Length" + set desc = "Set how long before the initial continue vote occurs (in minutes)." + if (GAME_STATE > RUNLEVEL_GAME) + to_chat(usr, SPAN_WARNING("The game is already ending!")) + return + var/current = round(round_duration_in_ticks / 600, 0.1) + var/response = input(usr, "Time in minutes before the continue vote will occur, or 0 to set to default.\nCurrent time: [current]m") as null | num + current = round(round_duration_in_ticks / 600, 0.1) + if (!isnum(response)) + return + if (!response) + log_and_message_admins("set the time to first continue vote to default.") + config.vote_autotransfer_initial = initial(config.vote_autotransfer_initial) + else if (response > current) + log_and_message_admins("set time to first continue vote to [response] minutes.") + config.vote_autotransfer_initial = response + SSroundend.vote_check = (round_duration_in_ticks / 600) + response + else + to_chat(usr, SPAN_WARNING("You cannot set a continue vote time in the past.")) + +/datum/admins/proc/SetMaximumRoundLength() + set category = "Server" + set name = "Set Maximum Round Length" set desc = "Set the maximum length of a round in minutes." if (GAME_STATE > RUNLEVEL_GAME) to_chat(usr, SPAN_WARNING("The game is already ending!")) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index f953c7baaa02e..f2e5b10fddbbb 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -102,6 +102,7 @@ var/global/list/admin_verbs_admin = list( /client/proc/check_fax_history, /client/proc/cmd_admin_notarget, /datum/admins/proc/SetRoundLength, + /datum/admins/proc/SetMaximumRoundLength, /datum/admins/proc/ToggleContinueVote, /datum/admins/proc/togglemoderequirementchecks, /client/proc/delete_crew_record @@ -147,6 +148,7 @@ var/global/list/admin_verbs_spawn = list( /client/proc/spawn_chemdisp_cartridge, // [SIERRA-ADD] - CLIENT_VERBS - , /client/proc/respawn_as_self, + /client/proc/virus2_editor, // [/SIERRA-ADD] - CLIENT_VERBS , /datum/admins/proc/mass_debug_closet_icons ) @@ -214,7 +216,7 @@ var/global/list/admin_verbs_debug = list( /client/proc/reload_webhooks, /client/proc/toggle_planet_repopulating, /client/proc/spawn_exoplanet, - /client/proc/profiler_start + /client/proc/profiler_init_verb ) var/global/list/admin_verbs_paranoid_debug = list( diff --git a/code/modules/admin/secrets/investigation/computer_logs.dm b/code/modules/admin/secrets/investigation/computer_logs.dm new file mode 100644 index 0000000000000..a6aace9ac71db --- /dev/null +++ b/code/modules/admin/secrets/investigation/computer_logs.dm @@ -0,0 +1,35 @@ +/datum/admin_secret_item/investigation/computer_logs + name = "Computer Logs" + var/list/filters_per_client + +/datum/admin_secret_item/investigation/computer_logs/New() + ..() + filters_per_client = list() + +/datum/admin_secret_item/investigation/computer_logs/execute(mob/user) + . = ..() + if(!.) + return + var/dat = list() + dat += "Refresh" + dat += "
" + dat += "" + dat += "" + + for(var/log in computer_log_repository.computer_logs_) + var/datum/computer_log/al = log + + dat += "" + + if(al.user) + dat += "" + + dat += "" + dat += "
TimeUserCommand
[al.station_time][al.user.key_name(check_if_offline = FALSE)] PP[al.command]" + if(al.location) + dat += " JMP" + dat += "
" + + var/datum/browser/popup = new(user, "computer_attack_logs", "Computer Logs", 800, 400) + popup.set_content(jointext(dat, null)) + popup.open() diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index 971e7187adb64..8b321562079cd 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -44,6 +44,8 @@ + + @@ -74,6 +76,8 @@ + + "} /mob/living/carbon/human/get_view_variables_options() @@ -154,7 +158,7 @@ /atom/VV_static() - return ..() + list("bound_x", "bound_y", "bound_height", "bound_width", "bounds", "step_x", "step_y", "step_size") + return ..() + list("bound_x", "bound_y", "bound_height", "bound_width", "bounds", "step_x", "step_y", "step_size", "underlays", "overlays") /client/VV_static() return ..() + list("holder", "prefs") @@ -164,7 +168,7 @@ // The following vars require R_DEBUG to edit /datum/proc/VV_locked() - return list("vars", "cuffed") + return list("vars", "virus", "viruses", "cuffed") //[SIEERA EDIT] /client/VV_locked() return list("vars", "mob") diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index aa8b6e2229d38..645372c70b561 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -107,6 +107,18 @@ src.give_spell(M) href_list["datumrefresh"] = href_list["give_spell"] +//[SIERRA-ADD] VIRUSOLOGY + else if(href_list["give_disease2"]) + if(!check_rights(R_ADMIN|R_FUN)) return + + var/mob/M = locate(href_list["give_disease2"]) + if(!istype(M)) + to_chat(usr, "This can only be used on instances of type /mob") + return + + src.give_disease2(M) + href_list["datumrefresh"] = href_list["give_spell"] +//[/SIERRA-ADD] VIRUSOLOGY else if(href_list["godmode"]) if(!check_rights(R_REJUVINATE)) return @@ -564,6 +576,70 @@ var/mob/living/L = locate(href_list["debug_mob_ai"]) log_debug("AI Debugging toggled [L.ai_holder.debug() ? "ON" : "OFF"] for \the [L]") + else if (href_list["settrait"]) + if (!check_rights(R_DEBUG|R_ADMIN|R_FUN)) return + var/mob/living/target = locate(href_list["settrait"]) + if (!istype(target)) + to_chat(usr, SPAN_WARNING("This can only be done to instances of /mob/living.")) + return + + var/list/trait_list = GET_SINGLETON_SUBTYPE_LIST(/singleton/trait) + var/singleton/trait/selected = input("Select a trait to apply to \the [target].", "Add Trait") as null | anything in trait_list + + if (!selected || !istype(selected) || QDELETED(target)) + return + + var/selected_level + if (length(selected.levels) > 1) + var/list/letterized_levels = list() + for (var/severity in selected.levels) + LAZYSET(letterized_levels, LetterizeSeverity(severity), severity) + var/letter_level = input("Select the trait's level to apply to \the [target].", "Select Level") as null | anything in letterized_levels + selected_level = letterized_levels[letter_level] + else + selected_level = selected.levels[1] + + if (QDELETED(target)) + return + + var/additional_data + if (length(selected.metaoptions)) + var/list/sanitized_metaoptions + for (var/atom/option as anything in selected.metaoptions) + var/named_option = initial(option.name) + LAZYSET(sanitized_metaoptions, named_option, option) + var/sanitized_additional = input("[selected.addprompt]", "Select Option") as null | anything in sanitized_metaoptions + additional_data = sanitized_metaoptions[sanitized_additional] + + if (target.SetTrait(selected.type, selected_level, additional_data)) + to_chat(usr, SPAN_NOTICE("Successfuly set \the [selected.name] in \the [target].")) + else + to_chat(usr, SPAN_WARNING("Failed to set \the [selected.name] in \the [target].")) + return + + else if (href_list["removetrait"]) + if (!check_rights(R_DEBUG|R_ADMIN|R_FUN)) return + var/mob/living/target = locate(href_list["removetrait"]) + if (!istype(target)) + to_chat(usr, SPAN_WARNING("This can only be done to instances of /mob/living.")) + return + var/input = input("Select a trait to remove from \the [target].", "Remove Trait") as null | anything in target.traits + var/singleton/trait/selected = GET_SINGLETON(input) + if (!selected || !istype(selected) || QDELETED(target)) + return + + var/additional_option + if (length(selected.metaoptions)) + var/list/interim = target.traits[selected.type] + additional_option = input("[selected.remprompt]", "Select Option") as null | anything in interim + if (!additional_option) + return + + target.RemoveTrait(selected.type, additional_option) + to_chat(usr, SPAN_NOTICE("Successfuly removed \the [selected.name] in \the [target].")) + return + + else if (href_list["addmovementhandler"]) if (!check_rights(R_DEBUG)) return diff --git a/code/modules/ai/ai_holder_targeting.dm b/code/modules/ai/ai_holder_targeting.dm index 41a99e8945e60..c38c11c44f9fe 100644 --- a/code/modules/ai/ai_holder_targeting.dm +++ b/code/modules/ai/ai_holder_targeting.dm @@ -173,7 +173,7 @@ give_up_movement() - if ((!old_target || !can_see_target(old_target)) && target_last_seen_turf && intelligence_level >= AI_NORMAL) + if ((!old_target || !can_see_target(old_target)) && target_last_seen_turf && (lose_target_timeout > (lose_target_time - world.time)) && intelligence_level >= AI_NORMAL) ai_log("lose_target() : Going into 'engage unseen enemy' mode.", AI_LOG_INFO) engage_unseen_enemy() return TRUE //We're still working on it diff --git a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm index 6cfa1b747136b..60f40d71a4ae0 100644 --- a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm +++ b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm @@ -1,7 +1,6 @@ /obj/machinery/atmospherics/binary dir = SOUTH initialize_directions = SOUTH|NORTH - layer = ABOVE_CATWALK_LAYER var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 diff --git a/code/modules/atmospherics/components/binary_devices/circulator.dm b/code/modules/atmospherics/components/binary_devices/circulator.dm index ac134893ab633..3bb48ca0d355f 100644 --- a/code/modules/atmospherics/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/components/binary_devices/circulator.dm @@ -8,6 +8,9 @@ icon_state = "circ-unassembled" anchored = FALSE + layer = STRUCTURE_LAYER + + var/kinetic_efficiency = 0.04 //combined kinetic and kinetic-to-electric efficiency var/volume_ratio = 0.2 diff --git a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm index 482542d8de7be..c7bab29219663 100644 --- a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm +++ b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm @@ -13,6 +13,9 @@ uncreated_component_parts = null stat_immune = 0 + layer = STRUCTURE_LAYER + + machine_name = "oxygen regenerator" machine_desc = "Catalyzes gaseous CO2 to convert it into gaseous oxygen. The excess carbon is condensed and ejected as graphite sheets." diff --git a/code/modules/atmospherics/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/components/binary_devices/passive_gate.dm index c7998fd8ee078..ba72ddffca5b7 100644 --- a/code/modules/atmospherics/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/components/binary_devices/passive_gate.dm @@ -5,7 +5,7 @@ /obj/machinery/atmospherics/binary/passive_gate icon = 'icons/atmos/passive_gate.dmi' icon_state = "map_off" - level = ATOM_LEVEL_UNDER_TILE + level = ATOM_LEVEL_OVER_TILE name = "pressure regulator" desc = "A one-way air valve that can be used to regulate input or output pressure, and flow rate. Does not require power." diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index 4358e730b35b6..8031e0e3edb5c 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -15,7 +15,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump icon = 'icons/atmos/pump.dmi' icon_state = "map_off" - level = ATOM_LEVEL_UNDER_TILE + level = ATOM_LEVEL_OVER_TILE name = "gas pump" desc = "A pump." diff --git a/code/modules/atmospherics/components/shutoff.dm b/code/modules/atmospherics/components/shutoff.dm index 3bcbe97b6b8b9..922eb5f9e21f6 100644 --- a/code/modules/atmospherics/components/shutoff.dm +++ b/code/modules/atmospherics/components/shutoff.dm @@ -13,6 +13,7 @@ var/shutoff_state = 0 connect_types = CONNECT_TYPE_REGULAR build_icon_state = "svalve" + level = ATOM_LEVEL_UNDER_TILE /obj/machinery/atmospherics/valve/shutoff/on_update_icon() icon_state = "vclamp[icon_connect_type]" diff --git a/code/modules/atmospherics/components/tvalve.dm b/code/modules/atmospherics/components/tvalve.dm index 9cdeee9ee78aa..32e15acd7fb70 100644 --- a/code/modules/atmospherics/components/tvalve.dm +++ b/code/modules/atmospherics/components/tvalve.dm @@ -5,7 +5,7 @@ name = "manual switching valve" desc = "A pipe valve." - level = ATOM_LEVEL_UNDER_TILE + level = ATOM_LEVEL_OVER_TILE dir = SOUTH initialize_directions = SOUTH|NORTH|WEST diff --git a/code/modules/atmospherics/components/unary/cold_sink.dm b/code/modules/atmospherics/components/unary/cold_sink.dm index 7ece1933e0b06..dcf38b69949b0 100644 --- a/code/modules/atmospherics/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/components/unary/cold_sink.dm @@ -14,6 +14,7 @@ construct_state = /singleton/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 + layer = STRUCTURE_LAYER machine_name = "gas cooling system" machine_desc = "While active, this machine cools the gas in a connected pipeline to lower temperatures. Gas pressure decreases with chilling, allowing it to be compressed more easily." diff --git a/code/modules/atmospherics/components/unary/heat_source.dm b/code/modules/atmospherics/components/unary/heat_source.dm index 0c862441ea066..afcf97deb63d8 100644 --- a/code/modules/atmospherics/components/unary/heat_source.dm +++ b/code/modules/atmospherics/components/unary/heat_source.dm @@ -14,6 +14,7 @@ construct_state = /singleton/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 + layer = STRUCTURE_LAYER machine_name = "gas heating system" machine_desc = "While active, this machine increases the temperature of a connected gas line to the configured amount. Gas pressure increases with heat." diff --git a/code/modules/atmospherics/components/valve.dm b/code/modules/atmospherics/components/valve.dm index 78a5513e28086..21c8bad76c270 100644 --- a/code/modules/atmospherics/components/valve.dm +++ b/code/modules/atmospherics/components/valve.dm @@ -5,10 +5,9 @@ name = "manual valve" desc = "A pipe valve." - level = ATOM_LEVEL_UNDER_TILE + level = ATOM_LEVEL_OVER_TILE dir = SOUTH initialize_directions = SOUTH|NORTH - layer = ABOVE_CATWALK_LAYER var/open = 0 var/openDuringInit = 0 diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 9291bc99f3a2d..0bda4d81cdd99 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -464,18 +464,12 @@ winset(usr, "mainwindow", "can-resize=false") winset(usr, "mainwindow", "is-maximized=false") winset(usr, "mainwindow", "is-maximized=true") - // [SIERRA-REMOVE] - SSINPUT - // winset(usr, "mainwindow", "statusbar=false") - // [/SIERRA-REMOVE] winset(usr, "mainwindow", "menu=") // winset(usr, "mainwindow.mainvsplit", "size=0x0") else winset(usr, "mainwindow", "is-maximized=false") winset(usr, "mainwindow", "titlebar=true") winset(usr, "mainwindow", "can-resize=true") - // [SIERRA-REMOVE] - SSINPUT - // winset(usr, "mainwindow", "statusbar=true") - // [/SIERRA-REMOVE] winset(usr, "mainwindow", "menu=menu") fit_viewport() diff --git a/code/modules/client/preference_setup/background/02_language.dm b/code/modules/client/preference_setup/background/02_language.dm index eb7e08b61a869..886915a9e883a 100644 --- a/code/modules/client/preference_setup/background/02_language.dm +++ b/code/modules/client/preference_setup/background/02_language.dm @@ -44,7 +44,8 @@ else if(href_list["add_language"]) - if(length(pref.alternate_languages) >= MAX_LANGUAGES) + // if(length(pref.alternate_languages) >= MAX_LANGUAGES) // SIERRA-EDIT - ORIGINAL + if(length(pref.alternate_languages) >= total_languages()) // [SIERRA-EDIT] - EXPANDED_CULTURE_DESCRIPTOR - Перевод // alert(user, "You have already selected the maximum number of languages!") // SIERRA-EDIT - ORIGINAL alert(user, "Вы уже выбрали максимальное количество языков!") @@ -115,8 +116,12 @@ pref.alternate_languages.Insert(1, lang) pref.alternate_languages = uniquelist(pref.alternate_languages) +/* if(length(pref.alternate_languages) > MAX_LANGUAGES) - pref.alternate_languages.Cut(MAX_LANGUAGES + 1) + pref.alternate_languages.Cut(MAX_LANGUAGES + 1) // SIERRA-EDIT - ORIGINAL +*/ + if(length(pref.alternate_languages) > total_languages()) + pref.alternate_languages.Cut(total_languages() + 1) /datum/category_item/player_setup_item/background/languages/proc/get_language_text() sanitize_alt_languages() @@ -133,8 +138,12 @@ // LAZYADD(., "- [lang] Remove. [all_languages[lang].warning]
") // SIERRA-EDIT - ORIGINAL LAZYADD(., "- [lang] Убрать. [all_languages[lang].warning]
") // [/SIERRA-EDIT] +/* if(length(pref.alternate_languages) < MAX_LANGUAGES) - var/remaining_langs = MAX_LANGUAGES - length(pref.alternate_languages) + var/remaining_langs = MAX_LANGUAGES - length(pref.alternate_languages) // SIERRA-EDIT - ORIGINAL +*/ + if(length(pref.alternate_languages) < total_languages()) + var/remaining_langs = total_languages() - length(pref.alternate_languages) // [SIERRA-EDIT] - EXPANDED_CULTURE_DESCRIPTOR - Перевод // LAZYADD(., "- add ([remaining_langs] remaining)
") // SIERRA-EDIT - ORIGINAL LAZYADD(., "- Добавить ([remaining_langs] осталось)
") diff --git a/code/modules/client/preference_setup/general/02_body.dm b/code/modules/client/preference_setup/general/02_body.dm index 86c107ac890db..c14f7d845c9ce 100644 --- a/code/modules/client/preference_setup/general/02_body.dm +++ b/code/modules/client/preference_setup/general/02_body.dm @@ -21,6 +21,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/list/organ_data var/list/rlimb_data var/disabilities = 0 + var/list/picked_traits /datum/category_item/player_setup_item/physical/body @@ -65,6 +66,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.rlimb_data = R.read("rlimb_data") pref.body_markings = R.read("body_markings") pref.body_descriptors = R.read("body_descriptors") + pref.picked_traits = R.read("traits") + pref.picked_traits = sanitize_trait_prefs(pref.picked_traits) /datum/category_item/player_setup_item/physical/body/save_character(datum/pref_record_writer/W) @@ -86,6 +89,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O W.write("rlimb_data", pref.rlimb_data) W.write("body_markings", pref.body_markings) W.write("body_descriptors", pref.body_descriptors) + W.write("traits", pref.picked_traits) /datum/category_item/player_setup_item/physical/body/sanitize_character() @@ -114,6 +118,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.disabilities = sanitize_integer(pref.disabilities, 0, 65535, initial(pref.disabilities)) if(!istype(pref.organ_data)) pref.organ_data = list() if(!istype(pref.rlimb_data)) pref.rlimb_data = list() + if (!istype(pref.picked_traits)) pref.picked_traits = list() if(!istype(pref.body_markings)) pref.body_markings = list() else @@ -239,6 +244,37 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "
[alt_organs.Join(", ")]" . = jointext(., null) + . += "
[TBTN("res_trait", "Reset Traits", "Traits")] [BTN("add_trait", "Add Trait")]" + var/list/alt_traits = list() + for (var/picked_type as anything in pref.picked_traits) + var/singleton/trait/picked = GET_SINGLETON(picked_type) + if (!picked || !istype(picked)) + continue + var/name = picked.name + var/severity + if (length(picked.metaoptions)) + var/list/metaoptions = pref.picked_traits[picked_type] + for (var/option as anything in metaoptions) + severity = metaoptions[option] + if (isnull(severity)) + continue + severity = LetterizeSeverity(severity) + if (ispath(option, /datum/reagent)) + var/datum/reagent/picked_reagent = option + option = initial(picked_reagent.name) + alt_traits += "[name] [option] [severity]" + else + severity = pref.picked_traits[picked_type] + if (isnull(severity)) + continue + severity = LetterizeSeverity(severity) + alt_traits += "[name] [severity]" + + if (!length(alt_traits)) + alt_traits += "No traits selected." + . += "
[alt_traits.Join("; ")]" + . = jointext(., null) + /datum/category_item/player_setup_item/physical/body/proc/HasAppearanceFlag(datum/species/mob_species, flag) return mob_species && (mob_species.appearance_flags & flag) @@ -334,6 +370,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O reset_limbs() // Safety for species with incompatible manufacturers; easier than trying to do it case by case. pref.body_markings.Cut() // Basically same as above. + pref.picked_traits.Cut() prune_occupation_prefs() pref.skills_allocated = pref.sanitize_skills(pref.skills_allocated) @@ -642,6 +679,69 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.disabilities ^= disability_flag return TOPIC_REFRESH_UPDATE_PREVIEW + else if (href_list["res_trait"]) + if (!length(pref.picked_traits)) + return + pref.picked_traits.Cut() + return TOPIC_REFRESH + + else if (href_list["add_trait"]) + if (!mob_species) + return + var/list/possible_traits = mob_species.get_selectable_traits() + var/picked = input(user, "Select a trait to apply.", "Add Trait") as null | anything in possible_traits + var/singleton/trait/selected = possible_traits[picked] + if (!selected || !istype(selected)) + return + + var/list/possible_levels = selected.levels + var/selected_level + if (length(possible_levels) > 1) + var/list/letterized_levels + for (var/severity in possible_levels) + LAZYSET(letterized_levels, LetterizeSeverity(severity), severity) + var/letterized_input = input(user, "Select the trait's level to apply.", "Select Level") as null | anything in letterized_levels + selected_level = letterized_levels[letterized_input] + else + selected_level = possible_levels[1] + + //[SIERRA-ADD] - pr34500 - Prevents runtimes, because as of now it can be null + if(!selected_level) + return + //[/SIERRA-ADD] + + var/additional_data + if (length(selected.metaoptions)) + var/list/sanitized_metaoptions + for (var/atom/option as anything in selected.metaoptions) + var/named_option = initial(option.name) + LAZYSET(sanitized_metaoptions, named_option, option) + + var/additional_input = input(user, "[selected.addprompt]", "Select Option") as null | anything in sanitized_metaoptions + additional_data = sanitized_metaoptions[additional_input] + + for (var/existing_type as anything in pref.picked_traits) + var/singleton/trait/existing_trait = GET_SINGLETON(existing_type) + if (!existing_trait || !istype(existing_trait)) + continue + if (LAZYISIN(existing_trait.incompatible_traits, selected.type) || LAZYISIN(selected.incompatible_traits, existing_type)) + to_chat(usr, SPAN_WARNING("The [selected.name] trait is incompatible with [existing_trait.name].")) + return + + if (additional_data) + var/list/interim = list() + if (!LAZYISIN(pref.picked_traits, selected.type)) + LAZYSET(pref.picked_traits, selected.type, interim) + + var/list/existing_meta_options = pref.picked_traits[selected.type] + if (existing_meta_options[additional_data] == selected_level) + return + LAZYSET(existing_meta_options, additional_data, selected_level) + LAZYSET(pref.picked_traits, selected.type, existing_meta_options) + else + LAZYSET(pref.picked_traits, selected.type, selected_level) + return TOPIC_REFRESH + return ..() diff --git a/code/modules/client/preference_setup/global/preferences.dm b/code/modules/client/preference_setup/global/preferences.dm index 939c29b4cb6c9..d91a794f4eff9 100644 --- a/code/modules/client/preference_setup/global/preferences.dm +++ b/code/modules/client/preference_setup/global/preferences.dm @@ -338,6 +338,13 @@ var/global/list/_client_preferences_by_type default_value = GLOB.PREF_SHORT +/datum/client_preference/toggle_run + description = "Shift toggles run (vs hold to run)" + key = "TOGGLE_RUN" + options = list(GLOB.PREF_YES, GLOB.PREF_NO) + default_value = GLOB.PREF_NO + + /******************** * General Staff Preferences * ********************/ diff --git a/code/modules/client/preference_setup/loadout/_defines.dm b/code/modules/client/preference_setup/loadout/_defines.dm index ced763ae24c26..3c070e14e1949 100644 --- a/code/modules/client/preference_setup/loadout/_defines.dm +++ b/code/modules/client/preference_setup/loadout/_defines.dm @@ -2,3 +2,6 @@ #define GEAR_HAS_TYPE_SELECTION FLAG(1) #define GEAR_HAS_SUBTYPE_SELECTION FLAG(2) #define GEAR_HAS_NO_CUSTOMIZATION FLAG(3) +/// This flag is discouraged for loadout items with random contents. +/// Extended descriptions are cached and even if they weren't, seeing random descriptions every refresh of the loadout would be odd as well. +#define GEAR_HAS_EXTENDED_DESCRIPTION FLAG(4) diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm index 0962d36758e78..48ed301a1adfd 100644 --- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm +++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm @@ -13,7 +13,7 @@ /datum/gear_tweak/proc/tweak_item(user, obj/item/I, metadata) return -/datum/gear_tweak/proc/tweak_description(description, metadata) +/datum/gear_tweak/proc/tweak_description(description, metadata, extend_description) return description /* @@ -49,6 +49,8 @@ /datum/gear_tweak/path var/list/valid_paths + /// Stores extended descriptions by instance type (as opposed to metadata string) + var/static/list/extended_description_cache /datum/gear_tweak/path/New(list/valid_paths) if(!length(valid_paths)) @@ -97,11 +99,40 @@ return gear_data.path = valid_paths[metadata] -/datum/gear_tweak/path/tweak_description(description, metadata) +/datum/gear_tweak/path/tweak_description(description, metadata, extend_description) + metadata ||= get_default() if(!(metadata in valid_paths)) return ..() var/obj/O = valid_paths[metadata] - return initial(O.desc) || description + . = initial(O.desc) || description + if (extend_description) + extended_description_cache ||= new() + var/extra_desc = extended_description_cache[O] + if (isnull(extra_desc)) + var/atom/instance = new O(null) + // Defaults to a non-null value to avoid initializing a given type more than once, + // thanks to the if-check above doing an isnull-check rather than falsy one + extended_description_cache[O] = extra_desc = (instance.GetExtendedLoadoutDescription() || "") + qdel(instance) + if(extra_desc) + . += "
[extra_desc]" + +/atom/proc/GetExtendedLoadoutDescription() + return + +/obj/item/storage/GetExtendedLoadoutDescription() + var/list/description_counts = new() + for(var/atom/A in src) + description_counts[strip_improper(A.name)+"
"+A.desc]++ + + var/list/item_descriptions = list("Contains:") + if (length(description_counts)) + for (var/description_count in description_counts) + item_descriptions.Add("[description_counts[description_count]]×[description_count]") + else + item_descriptions.Add("Nothing") + + return FONT_SMALL(jointext(item_descriptions,"
")) /* * Content adjustment @@ -203,6 +234,86 @@ /datum/gear_tweak/custom_setup/tweak_item(user, item) call(item, custom_setup_proc)(user) +/* +* Custom [Var] +*/ +/datum/gear_tweak/custom_var + var/var_to_tweak + /// The user input method to use if `valid_list_options` does not contain any items. + var/input_method = /datum/gear_tweak/custom_var/proc/InputText + var/content_text + var/input_title = CHARACTER_PREFERENCE_INPUT_TITLE + var/input_message + /// Used to sanitize when using the input_message and input_text methods. + var/max_input_length = MAX_MESSAGE_LEN + /// Used to sanitize when using the input_num method. Setting this var does not mandate setting max_input_value. + var/min_input_value + /// Used to sanitize when using the input_num method. Setting this var does not mandate setting min_input_value. + var/max_input_value + /// If this list contains items the user is limited to these choices. + var/list/valid_list_options + +/datum/gear_tweak/custom_var/New(list/valid_list_options) + src.valid_list_options = valid_list_options + ..() + +/datum/gear_tweak/custom_var/get_metadata(user, metadata, title) + var/final_title = title || input_title || CHARACTER_PREFERENCE_INPUT_TITLE + if(length(valid_list_options)) + return input(user, input_message + " Click cancel to use the default.", final_title, metadata) as null|anything in valid_list_options + var/default = html_decode(metadata) + return call(src, input_method)(user, input_message + " Leave blank to use the default.", final_title, default) + +/datum/gear_tweak/custom_var/tweak_item(user, obj/item/item, metadata) + if(!metadata) + return + if (length(valid_list_options) && !(metadata in valid_list_options)) + return + metadata = TweakMetadata(metadata) + SetVar(item, metadata) + +/// Override this var if a particular proc call is needed, for example /SetName() when setting the name-var +/datum/gear_tweak/custom_var/proc/SetVar(obj/item/item, metadata) + SHOULD_NOT_SLEEP(TRUE) + PROTECTED_PROC(TRUE) + item.vars[var_to_tweak] = metadata + +/datum/gear_tweak/custom_var/proc/TweakMetadata(metadata) + SHOULD_BE_PURE(TRUE) + SHOULD_NOT_SLEEP(TRUE) + PROTECTED_PROC(TRUE) + return metadata + +/datum/gear_tweak/custom_var/get_contents(metadata) + return "[content_text]: [metadata]" + +// Note, didn't make these available for general use mainly due to the number of arguments needed for both input and sanitize +// Nothing stops you from generalizing these if you really wanted to +/datum/gear_tweak/custom_var/proc/InputNum(mob/user, message, title, default) + SHOULD_NOT_OVERRIDE(TRUE) + PROTECTED_PROC(TRUE) + var/num = input(user, message, title, default) as null|num + if (isnum(min_input_value)) + num = max(min_input_value, num) + if (isnum(max_input_value)) + num = min(max_input_value, num) + return num + +/datum/gear_tweak/custom_var/proc/InputText(mob/user, message, title, default, max_length) + SHOULD_NOT_OVERRIDE(TRUE) + PROTECTED_PROC(TRUE) + return sanitize(input(user, message, title, default) as null|text, max_input_length || MAX_MESSAGE_LEN, extra = FALSE) + +/datum/gear_tweak/custom_var/proc/InputMessage(mob/user, message, title, default, max_length) + SHOULD_NOT_OVERRIDE(TRUE) + PROTECTED_PROC(TRUE) + return sanitize(input(user, message, title, default) as null|message, max_input_length || MAX_MESSAGE_LEN, extra = FALSE) + +/datum/gear_tweak/custom_var/proc/InputColor(mob/user, message, title, default, max_length) + SHOULD_NOT_OVERRIDE(TRUE) + PROTECTED_PROC(TRUE) + return input(user, message, title, default) as null|color + /* * Custom Name */ @@ -220,12 +331,16 @@ /datum/gear_tweak/custom_name/get_metadata(user, metadata, title) if(valid_custom_names) return input(user, "Choose an item name.", "Character Preference", metadata) as null|anything in valid_custom_names + metadata = html_decode(metadata) return sanitize(input(user, "Choose the item's name. Leave it blank to use the default name.", "Item Name", metadata) as text|null, MAX_LNAME_LEN, extra = FALSE) /datum/gear_tweak/custom_name/tweak_item(user, obj/item/I, metadata) if(!metadata) - return I.name - return I.name = metadata + return + var/lower = lowertext(metadata) + if (!text_starts_with(lower, "a ") && !text_starts_with(lower, "an ") && !text_starts_with(lower, "the ")) + metadata = "\improper[metadata]" + I.SetName(metadata) /* Custom Description @@ -244,13 +359,13 @@ Custom Description /datum/gear_tweak/custom_desc/get_metadata(user, metadata, title) if(valid_custom_desc) return input(user, "Choose an item description.", "Character Preference", metadata) as null|anything in valid_custom_desc + metadata = html_decode(metadata) return sanitize(input(user, "Choose the item's description. Leave it blank to use the default description.", "Item Description", metadata) as message|null, MAX_DESC_LEN, extra = FALSE) /datum/gear_tweak/custom_desc/tweak_item(user, obj/item/I, metadata) if(!metadata) - return I.desc - return I.desc = metadata - + return + I.desc = metadata /* * Tablet Stuff diff --git a/code/modules/client/preference_setup/loadout/lists/accessories.dm b/code/modules/client/preference_setup/loadout/lists/accessories.dm index e7eedc58dd36c..e5736bc2c89d6 100644 --- a/code/modules/client/preference_setup/loadout/lists/accessories.dm +++ b/code/modules/client/preference_setup/loadout/lists/accessories.dm @@ -65,7 +65,7 @@ description = "A medal or ribbon awarded to corporate personnel for significant accomplishments." path = /obj/item/storage/medalbox cost = 6 - flags = GEAR_HAS_NO_CUSTOMIZATION + flags = GEAR_HAS_NO_CUSTOMIZATION | GEAR_HAS_EXTENDED_DESCRIPTION /datum/gear/accessory/ntaward/New() @@ -171,32 +171,40 @@ /datum/gear/accessory/pronouns - display_name = "pronoun badge selection" - description = "A selection of badges used to indicate the preferred pronouns of the wearer." + display_name = "pronoun badge, customisable" + description = "A badge used to indicate the preferred pronouns of the wearer." path = /obj/item/clothing/accessory/pronouns -/datum/gear/accessory/pronouns/New() +/datum/gear/accessory/pride_pins + display_name = "pride pin selection, primary" + description = "A selection of pins used to signal membership or support of an identity or sexuality." + path = /obj/item/clothing/accessory/pride_pin + flags = GEAR_HAS_NO_CUSTOMIZATION + + +/datum/gear/accessory/pride_pins/New() ..() var/list/options = list() - options["they/them badge"] = /obj/item/clothing/accessory/pronouns/they - options["he/him badge"] = /obj/item/clothing/accessory/pronouns/hehim - options["she/her badge"] = /obj/item/clothing/accessory/pronouns/sheher - options["he/they badge"] = /obj/item/clothing/accessory/pronouns/hethey - options["she/they badge"] = /obj/item/clothing/accessory/pronouns/shethey - options["he/she badge"] = /obj/item/clothing/accessory/pronouns/heshe - options["ze/hir badge"] = /obj/item/clothing/accessory/pronouns/zehir - options["ask me badge"] = /obj/item/clothing/accessory/pronouns/ask + options["transgender pride pin"] = /obj/item/clothing/accessory/pride_pin/transgender + options["lesbian pride pin"] = /obj/item/clothing/accessory/pride_pin/lesbian + options["bisexual pride pin"] = /obj/item/clothing/accessory/pride_pin/bisexual + options["gay pride pin"] = /obj/item/clothing/accessory/pride_pin/gay + options["pansexual pride pin"] = /obj/item/clothing/accessory/pride_pin/pansexual + options["nonbinary pride pin"] = /obj/item/clothing/accessory/pride_pin/nonbinary + options["asexual pride pin"] = /obj/item/clothing/accessory/pride_pin/asexual + options["intersex pride pin"] = /obj/item/clothing/accessory/pride_pin/intersex + options["aromantic pride pin"] = /obj/item/clothing/accessory/pride_pin/aromantic gear_tweaks += new /datum/gear_tweak/path (options) -/datum/gear/accessory/pride_pins - display_name = "pride pin selection" +/datum/gear/accessory/pride_pins_secondary + display_name = "pride pin selection, secondary" description = "A selection of pins used to signal membership or support of an identity or sexuality." path = /obj/item/clothing/accessory/pride_pin -/datum/gear/accessory/pride_pins/New() +/datum/gear/accessory/pride_pins_secondary/New() ..() var/list/options = list() options["transgender pride pin"] = /obj/item/clothing/accessory/pride_pin/transgender @@ -216,3 +224,10 @@ description = "A piece of cloth tied around the neck. A favorite of Sailors and Partisans everywhere." path = /obj/item/clothing/accessory/neckerchief flags = GEAR_HAS_COLOR_SELECTION + + +/datum/gear/accessory/stole + display_name = "stole, colour select" + description = "A long, colourful liturgical vestment used by Christian clergy." + path = /obj/item/clothing/accessory/stole + flags = GEAR_HAS_COLOR_SELECTION diff --git a/code/modules/client/preference_setup/loadout/lists/misc.dm b/code/modules/client/preference_setup/loadout/lists/misc.dm index da9deb0bc9176..9d9bdc5dc1121 100644 --- a/code/modules/client/preference_setup/loadout/lists/misc.dm +++ b/code/modules/client/preference_setup/loadout/lists/misc.dm @@ -22,6 +22,21 @@ var/obj/item/card/union/card = . card.signed_by = H.real_name +/datum/gear/party_card + display_name = "party membership" + path = /obj/item/card/party + +/datum/gear/party_card/New() + ..() + var/party_card_type = list() + party_card_type["Citizens for Free Enterprise & Trade"] = /obj/item/card/party/cen/fet + party_card_type["Progressive Alliance of Citizens"] = /obj/item/card/party/cen/pac + party_card_type["United Green-Left of Sol"] = /obj/item/card/party/lef/ugl + party_card_type["Leftists for Direct Democracy & Freedom"] = /obj/item/card/party/lef/ldd + party_card_type["Solarians for Freedom & Rights"] = /obj/item/card/party/rig/sfr + party_card_type["Order of Solarian Nations"] = /obj/item/card/party/rig/osn + gear_tweaks += new/datum/gear_tweak/path(party_card_type) + /datum/gear/dice display_name = "dice pack" path = /obj/item/storage/pill_bottle/dice @@ -291,3 +306,9 @@ crosstype["cross, silver"] = /obj/item/material/cross/silver crosstype["cross, gold"] = /obj/item/material/cross/gold gear_tweaks += new/datum/gear_tweak/path(crosstype) + +/datum/gear/allergy_pen + display_name = "Allergy Autoinjector" + path = /obj/item/reagent_containers/hypospray/autoinjector/pouch_auto/allergy + cost = 1 + allowed_traits = list(/singleton/trait/malus/allergy) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/lists/suits.dm b/code/modules/client/preference_setup/loadout/lists/suits.dm index 0e1e8ae7fb7a3..1305a43714d10 100644 --- a/code/modules/client/preference_setup/loadout/lists/suits.dm +++ b/code/modules/client/preference_setup/loadout/lists/suits.dm @@ -5,33 +5,33 @@ /datum/gear/suit/poncho display_name = "poncho selection" - path = /obj/item/clothing/suit/poncho/colored + path = /obj/item/clothing/suit/poncho cost = 1 flags = GEAR_HAS_TYPE_SELECTION /datum/gear/suit/security_poncho display_name = "poncho, security" - path = /obj/item/clothing/suit/poncho/roles/security + path = /obj/item/clothing/suit/poncho/security /datum/gear/suit/medical_poncho display_name = "poncho, medical" - path = /obj/item/clothing/suit/poncho/roles/medical + path = /obj/item/clothing/suit/poncho/medical /datum/gear/suit/engineering_poncho display_name = "poncho, engineering" - path = /obj/item/clothing/suit/poncho/roles/engineering + path = /obj/item/clothing/suit/poncho/engineering /datum/gear/suit/science_poncho display_name = "poncho, science" - path = /obj/item/clothing/suit/poncho/roles/science + path = /obj/item/clothing/suit/poncho/science /datum/gear/suit/nanotrasen_poncho display_name = "poncho, NanoTrasen" - path = /obj/item/clothing/suit/poncho/roles/science/nanotrasen + path = /obj/item/clothing/suit/poncho/nanotrasen /datum/gear/suit/cargo_poncho display_name = "poncho, supply" - path = /obj/item/clothing/suit/poncho/roles/cargo + path = /obj/item/clothing/suit/poncho/cargo /datum/gear/suit/suit_jacket display_name = "standard suit jackets" diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index fa548d76584fe..4ab8ab29f2da0 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -191,7 +191,7 @@ var/global/list/gear_datums = list() entry += "[G.display_name]" //inf, was: entry += "[G.display_name]" // [/SIERRA-EDIT] entry += "[G.cost]" - entry += "[FONT_NORMAL(G.get_description(get_gear_metadata(G,1)))]" + entry += "[FONT_NORMAL(G.get_description(get_gear_metadata(G,1), ticked))]" var/allowed = 1 if(allowed && G.allowed_roles) var/good_job = 0 @@ -250,6 +250,22 @@ var/global/list/gear_datums = list() entry += "[english_list(skill_checks)]" + if (allowed && G.allowed_traits) + var/datum/species/picked_species = all_species[pref.species] + var/list/species_traits = picked_species.traits + var/trait_checks = list() + entry += "
" + for (var/trait_type in G.allowed_traits) + var/singleton/trait/trait = GET_SINGLETON(trait_type) + var/trait_entry = "[trait.name]" + if (LAZYISIN(pref.picked_traits, trait_type) || LAZYISIN(species_traits, trait_type)) + trait_entry = SPAN_COLOR("#55cc55", "[trait_entry]") + else + trait_entry = SPAN_COLOR("#cc5555", "[trait_entry]") + allowed = FALSE + trait_checks += trait_entry + entry += "[english_list(trait_checks)]" + // [SIERRA-ADD] - LOADOUT-ITEMS if(allowed && G.allowed_factions) var/good_background = 0 @@ -362,6 +378,8 @@ var/global/list/gear_datums = list() var/list/allowed_roles //Roles that can spawn with this item. var/list/allowed_branches //Service branches that can spawn with it. var/list/allowed_skills //Skills required to spawn with this item. + ///Traits required to spawn with this item. + var/list/allowed_traits var/whitelisted //Term to check the whitelist for.. var/sort_category = "General" var/flags //Special tweaks in New @@ -387,10 +405,10 @@ var/global/list/gear_datums = list() if(custom_setup_proc) gear_tweaks += new/datum/gear_tweak/custom_setup(custom_setup_proc) -/datum/gear/proc/get_description(metadata) +/datum/gear/proc/get_description(metadata, include_extended_description) . = description for(var/datum/gear_tweak/gt in gear_tweaks) - . = gt.tweak_description(., metadata["[gt]"]) + . = gt.tweak_description(., metadata["[gt]"], include_extended_description && (flags & GEAR_HAS_EXTENDED_DESCRIPTION)) /datum/gear_data var/path diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b9297d36a82ca..cb56e99ad9a12 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -364,6 +364,18 @@ character.gen_record = gen_record character.exploit_record = exploit_record + if(LAZYLEN(picked_traits)) + for (var/picked_type as anything in picked_traits) + var/singleton/trait/selected = GET_SINGLETON(picked_type) + if (!selected || !istype(selected)) + continue + if (length(selected.metaoptions)) + var/list/temp_list = picked_traits[picked_type] + for (var/meta_option in temp_list) + character.SetTrait(picked_type, temp_list[meta_option], meta_option) + else + character.SetTrait(picked_type, picked_traits[picked_type]) + if(LAZYLEN(character.descriptors)) for(var/entry in body_descriptors) character.descriptors[entry] = body_descriptors[entry] diff --git a/code/modules/clothing/ears/headphones.dm b/code/modules/clothing/ears/headphones.dm index 4d08aca156e1b..b1db917266d59 100644 --- a/code/modules/clothing/ears/headphones.dm +++ b/code/modules/clothing/ears/headphones.dm @@ -6,7 +6,7 @@ item_state = "headphones_off" slot_flags = SLOT_EARS | SLOT_TWOEARS volume_multiplier = 0.5 - var/jukebox/jukebox + var/datum/jukebox/jukebox /obj/item/clothing/ears/headphones/Initialize() diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 13daaa7222b27..1f90ff2d63bd0 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -330,7 +330,7 @@ return ..() -/obj/item/clothing/mask/smokable/cigarette/use_before(mob/living/carbon/human/H, mob/user) +/obj/item/clothing/mask/smokable/use_before(mob/living/carbon/human/H, mob/user) if (lit && H == user && istype(H)) var/obj/item/blocked = H.check_mouth_coverage() if (blocked) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index d7e9814ee97ad..a15725badab7f 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -55,12 +55,12 @@ var/obj/item/tank/air_type = /obj/item/tank/oxygen //Component/device holders. - var/obj/item/tank/air_supply // Air tank, if any. + var/obj/item/tank/air_supply // Air tank, if any. var/obj/item/clothing/shoes/boots = null // Deployable boots, if any. var/obj/item/clothing/suit/space/rig/chest // Deployable chestpiece, if any. var/obj/item/clothing/head/helmet/space/rig/helmet = null // Deployable helmet, if any. var/obj/item/clothing/gloves/rig/gloves = null // Deployable gauntlets, if any. - var/obj/item/cell/cell // Power supply, if any. + var/obj/item/cell/cell // Power supply, if any. var/obj/item/rig_module/selected_module = null // Primary system (used with middle-click) var/obj/item/rig_module/vision/visor // Kinda shitty to have a var for a module, but saves time. var/obj/item/rig_module/voice/speech // As above. @@ -203,15 +203,18 @@ air_supply = new air_type(src) if(glove_type) gloves = new glove_type(src) + verbs |= /obj/item/rig/proc/toggle_gauntlets if(helm_type) helmet = new helm_type(src) verbs |= /obj/item/rig/proc/toggle_helmet if(boot_type) boots = new boot_type(src) + verbs |= /obj/item/rig/proc/toggle_boots if(chest_type) chest = new chest_type(src) if(allowed) chest.allowed = allowed + verbs |= /obj/item/rig/proc/toggle_chest for(var/obj/item/piece in list(gloves,helmet,boots,chest)) if(!istype(piece)) @@ -319,7 +322,7 @@ SPAN_INFO("[wearer]'s suit emits a quiet hum as it begins to adjust its seals."), \ SPAN_INFO("With a quiet hum, the suit begins running checks and adjusting components.")) - if(seal_delay && !instant && !do_after(wearer,seal_delay, src)) + if(seal_delay && !instant && !wearer.do_skilled(seal_delay, SKILL_EVA, src)) failed_to_seal = 1 if(!wearer) @@ -342,7 +345,7 @@ if(!failed_to_seal && wearer.back == src && piece == compare_piece) - if(seal_delay && !instant && !do_after(wearer, seal_delay, src, do_flags = DO_DEFAULT & ~DO_USER_SAME_HAND)) + if(seal_delay && !instant && !wearer.do_skilled(seal_delay, SKILL_EVA, src, do_flags = DO_DEFAULT & ~DO_USER_SAME_HAND)) failed_to_seal = 1 piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]" @@ -783,6 +786,9 @@ var/mob/living/carbon/human/holder + if(piece != "helmet" && (!offline || sealing)) + FEEDBACK_FAILURE(initiator, SPAN_WARNING("The hardsuit needs to be deactivated before you can do that.")) + return if(use_obj) holder = use_obj.loc if(istype(holder)) @@ -843,6 +849,18 @@ for(var/piece in list("helmet","gauntlets","chest","boots")) toggle_piece(piece, H, ONLY_DEPLOY) +/obj/item/rig/proc/retract(mob/M) + + var/mob/living/carbon/human/H = M + + if(!H || !istype(H)) return + + if(H.back != src) + return + + for(var/piece in list("helmet","gauntlets","chest","boots")) + toggle_piece(piece, H, ONLY_RETRACT) + /obj/item/rig/dropped(mob/user) ..() for(var/piece in list("helmet","gauntlets","chest","boots")) diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index 18e6d94226d10..fb0bf392ef92a 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -55,10 +55,10 @@ toggle_piece("helmet",wearer) -/obj/item/rig/verb/deploy_suit() +/obj/item/rig/proc/toggle_chest() - set name = "Deploy Hardsuit" - set desc = "Deploys helmet, gloves and boots." + set name = "Toggle Chestpiece" + set desc = "Deploys or retracts your chestpiece." set category = "Hardsuit" set src = usr.contents @@ -69,14 +69,62 @@ if(!check_suit_access(usr)) return - if(!check_power_cost(usr)) + toggle_piece("chest",wearer) + +/obj/item/rig/proc/toggle_gauntlets() + + set name = "Toggle Gauntlets" + set desc = "Deploys or retracts your gauntlets." + set category = "Hardsuit" + set src = usr.contents + + if(!istype(wearer) || !wearer.back == src) + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) + return + + if(!check_suit_access(usr)) + return + + toggle_piece("gauntlets",wearer) + +/obj/item/rig/proc/toggle_boots() + + set name = "Toggle Boots" + set desc = "Deploys or retracts your boots." + set category = "Hardsuit" + set src = usr.contents + + if(!istype(wearer) || !wearer.back == src) + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) + return + + if(!check_suit_access(usr)) + return + + toggle_piece("boots",wearer) + +/obj/item/rig/verb/toggle_all_pieces() + + set name = "Toggle All Pieces" + set desc = "Retracts your hardsuit if it is completely deployed, or activates all currently stowed pieces." + set category = "Hardsuit" + set src = usr.contents + + if(!istype(wearer) || !wearer.back == src) + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) return - deploy(wearer) + if(!check_suit_access(usr)) + return + + if(!suit_is_deployed()) + deploy(wearer) + else + retract(wearer) /obj/item/rig/verb/toggle_seals_verb() - set name = "Toggle Hardsuit" + set name = "Cycle Hardsuit" set desc = "Activates or deactivates your rig." set category = "Hardsuit" set src = usr.contents diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm index 61a39aa2c7d71..de245713dd736 100644 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ b/code/modules/clothing/spacesuits/void/wizard.dm @@ -52,7 +52,7 @@ body_parts_covered = HANDS cold_protection = HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE - species_restricted = null + species_restricted = list("exclude",SPECIES_NABBER) gender = PLURAL gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index df877f8b8610f..fe999c9796434 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -50,6 +50,13 @@ desc = "This suit says to you 'hush'!" icon_state = "chaplain_hoodie" body_parts_covered = UPPER_TORSO|ARMS + allowed = list ( + /obj/item/nullrod, + /obj/item/storage/bible, + /obj/item/reagent_containers/food/drinks/bottle/holywater, + /obj/item/material/cross + ) + valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_DECOR) //Chaplain /obj/item/clothing/suit/nun diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 9dfdb6c33d4a3..5bfafe5c1f4ff 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -96,6 +96,7 @@ icon_state = "overalls" item_state = "overalls" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS + species_restricted = list("exclude",SPECIES_NABBER) /obj/item/clothing/suit/syndicatefake @@ -277,34 +278,30 @@ icon_state = "swim_red" siemens_coefficient = 1 -/obj/item/clothing/suit/poncho/colored +/obj/item/clothing/suit/poncho name = "poncho" desc = "A simple, comfortable poncho." species_restricted = null icon_state = "classicponcho" -/obj/item/clothing/suit/poncho/colored/green +/obj/item/clothing/suit/poncho/green name = "green poncho" desc = "A simple, comfortable cloak without sleeves. This one is green." - species_restricted = null icon_state = "greenponcho" -/obj/item/clothing/suit/poncho/colored/red +/obj/item/clothing/suit/poncho/red name = "red poncho" desc = "A simple, comfortable cloak without sleeves. This one is red." - species_restricted = null icon_state = "redponcho" -/obj/item/clothing/suit/poncho/colored/purple +/obj/item/clothing/suit/poncho/purple name = "purple poncho" desc = "A simple, comfortable cloak without sleeves. This one is purple." - species_restricted = null icon_state = "purpleponcho" -/obj/item/clothing/suit/poncho/colored/blue +/obj/item/clothing/suit/poncho/blue name = "blue poncho" desc = "A simple, comfortable cloak without sleeves. This one is blue." - species_restricted = null icon_state = "blueponcho" /obj/item/clothing/suit/storage/toggle/bomber @@ -346,12 +343,17 @@ icon_state = "brown_jacket_nt" /obj/item/clothing/suit/storage/toggle/agent_jacket - name = "agent jacket" + name = "\improper SFP jacket" desc = "A black leather jacket belonging to an agent of the Sol Federal Police." icon_state = "agent_jacket" valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA) body_parts_covered = UPPER_TORSO|ARMS +/obj/item/clothing/suit/storage/toggle/agent_jacket/formal + name = "formal SFP coat" + desc = "A black suit jacket belonging to an agent of the Sol Federal Police. It is of exceptional quality." + icon_state = "agent_formal" + /obj/item/clothing/suit/storage/toggle/hoodie name = "hoodie" desc = "A warm sweatshirt." @@ -384,44 +386,46 @@ desc = "A warm, black sweatshirt." color = COLOR_DARK_GRAY +/obj/item/clothing/suit/storage/agent_rain + name = "\improper SFP patrol cloak" + desc = "A black raincloak belonging to an agent of the Sol Federal Police. It is almost certainly wind and waterproof." + icon_state = "agent_raincloak" + valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA) + blood_overlay_type = "coat" + /obj/item/clothing/suit/storage/mbill name = "shipping jacket" desc = "A green jacket bearing the logo of Major Bill's Shipping." icon_state = "mbill" -/obj/item/clothing/suit/poncho/roles/security +/obj/item/clothing/suit/poncho/security name = "security poncho" desc = "A simple, comfortable cloak without sleeves. This one is black and red, which are standard Security colors." - species_restricted = null icon_state = "secponcho" -/obj/item/clothing/suit/poncho/roles/medical +/obj/item/clothing/suit/poncho/medical name = "medical poncho" desc = "A simple, comfortable cloak without sleeves. This one is white with a blue tint, which are standard Medical colors." - species_restricted = null icon_state = "medponcho" -/obj/item/clothing/suit/poncho/roles/engineering +/obj/item/clothing/suit/poncho/engineering name = "engineering poncho" desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, which are standard Engineering colors." - species_restricted = null icon_state = "engiponcho" -/obj/item/clothing/suit/poncho/roles/science +/obj/item/clothing/suit/poncho/science name = "science poncho" desc = "A simple, comfortable cloak without sleeves. This one is white with a few bottle green stripes, corporate colors." - species_restricted = null icon_state = "sciponcho" -/obj/item/clothing/suit/poncho/roles/science/nanotrasen +/obj/item/clothing/suit/poncho/nanotrasen name = "\improper NanoTrasen poncho" desc = "A simple, comfortable cloak without sleeves. This one is white with a few red stripes, colors of NanoTrasen. Go NanoTrasen!" icon_state = "sciponcho_nt" -/obj/item/clothing/suit/poncho/roles/cargo +/obj/item/clothing/suit/poncho/cargo name = "cargo poncho" desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, which are standard Cargo colors." - species_restricted = null icon_state = "cargoponcho" /* diff --git a/code/modules/clothing/under/accessories/armor_tag.dm b/code/modules/clothing/under/accessories/armor_tag.dm index 7a30bf4265db1..79b8858526e3f 100644 --- a/code/modules/clothing/under/accessories/armor_tag.dm +++ b/code/modules/clothing/under/accessories/armor_tag.dm @@ -33,6 +33,11 @@ desc = "An armor tag with the acronym SAARE printed in olive-green lettering on it." icon_state = "saaretag" +/obj/item/clothing/accessory/armor_tag/sfp + name = "\improper SFP tags" + desc = "A set of high-visibility armor tags made of reflective materials. The pale blue rectangle is a hallmark of the Sol Federal Police." + icon_state = "sfptag" + /obj/item/clothing/accessory/armor_tag/press name = "\improper PRESS tag" diff --git a/code/modules/clothing/under/accessories/chaplain.dm b/code/modules/clothing/under/accessories/chaplain.dm index abc78d33c87dc..36d6c34bf4c08 100644 --- a/code/modules/clothing/under/accessories/chaplain.dm +++ b/code/modules/clothing/under/accessories/chaplain.dm @@ -60,3 +60,10 @@ name = "chaplain insignia (taoism)" desc = "An insignia worn by chaplains. The yin yang represents Taoism." icon_state = "taoinsignia" + + +/obj/item/clothing/accessory/stole + name = "stole" + desc = "A long, colourful liturgical vestment used by Christian clergy." + icon_state = "stole" + w_class = ITEM_SIZE_SMALL diff --git a/code/modules/clothing/under/accessories/pronouns.dm b/code/modules/clothing/under/accessories/pronouns.dm index 91693989f5fbb..c7a9d6d65a525 100644 --- a/code/modules/clothing/under/accessories/pronouns.dm +++ b/code/modules/clothing/under/accessories/pronouns.dm @@ -1,47 +1,8 @@ /obj/item/clothing/accessory/pronouns - abstract_type = /obj/item/clothing/accessory/pronouns - name = "base pronouns badge" + name = "customisable pronouns badge" + desc = "A badge showing the wearer's pronouns. Customisable!" icon_state = "pronounpin" item_state = "pronouns" on_rolled_down = ACCESSORY_ROLLED_NONE slot = ACCESSORY_SLOT_INSIGNIA accessory_flags = ACCESSORY_REMOVABLE | ACCESSORY_HIGH_VISIBILITY - - -/obj/item/clothing/accessory/pronouns/they - name = "they/them pronouns badge" - desc = "A badge showing the wearer's pronouns: they, them and theirs." - - -/obj/item/clothing/accessory/pronouns/hehim - name = "he/him pronouns badge" - desc = "A badge showing the wearer's pronouns: he, him and his." - - -/obj/item/clothing/accessory/pronouns/sheher - name = "she/her pronouns badge" - desc = "A badge showing the wearer's pronouns: she, her and hers." - - -/obj/item/clothing/accessory/pronouns/hethey - name = "he/they pronouns badge" - desc = "A badge showing the wearer's pronouns: he, him and his or they, them and theirs." - - -/obj/item/clothing/accessory/pronouns/shethey - name = "she/they pronouns badge" - desc = "A badge showing the wearer's pronouns: she, her and hers or they, them and theirs." - -/obj/item/clothing/accessory/pronouns/heshe - name = "he/she pronouns badge" - desc = "A badge showing the wearer's pronouns: he, him and his or she, her and hers." - - -/obj/item/clothing/accessory/pronouns/zehir - name = "ze/hir pronouns badge" - desc = "A badge showing the wearer's pronouns: ze, hir and hirs." - - -/obj/item/clothing/accessory/pronouns/ask - name = "ask my pronouns badge" - desc = "A badge asking others to ask for the wearer's pronouns." diff --git a/code/modules/clothing/under/accessories/wristwatches.dm b/code/modules/clothing/under/accessories/wristwatches.dm index d3cdd25ef14a5..b3885e6086f0a 100644 --- a/code/modules/clothing/under/accessories/wristwatches.dm +++ b/code/modules/clothing/under/accessories/wristwatches.dm @@ -5,6 +5,25 @@ body_location = HANDS +/obj/item/clothing/accessory/wristwatch/examine(mob/user, distance) + . = ..() + if (distance > 1) + return + var/list/date = text2numlist(stationdate2text(), "-") + var/year = date[1] + var/month = GLOB.month_names[date[2]] + var/day = date[3] + var/time = stationtime2text() + to_chat(user, "You check \the [src]. It is [time] on the [day]\th of [month], [year].") + + +/obj/item/clothing/accessory/wristwatch/OnTopic(mob/user, list/href_list) + if (href_list["check_watch"]) + if (istype(user)) + examinate(user, src) + return TOPIC_HANDLED + + /obj/item/clothing/accessory/wristwatch/leather name = "leather wrist watch" desc = "A rugged timekeeping device. Its leather strap is quite fashionable." @@ -15,22 +34,3 @@ name = "fancy wrist watch" desc = "A gaudy timekeeping device. It probably cost more than your education." icon_state = "wristwatch_fancy" - - -/obj/item/clothing/accessory/wristwatch/examine(mob/user, distance) - . = ..() - if (distance <= 1) - CheckTime(user) - - -/obj/item/clothing/accessory/wristwatch/proc/CheckTime(mob/user) - var/extra_days = round(station_time_in_ticks / (1 DAY)) DAYS - var/timeofday = world.timeofday + extra_days - to_chat(user, "You check \the [src]. The time is [stationtime2text()] on the [time2text(timeofday, "DD")]\th of [time2text(timeofday, "Month")], [GLOB.using_map.game_year].") - - -/obj/item/clothing/accessory/wristwatch/OnTopic(mob/user, list/href_list) - if(href_list["check_watch"]) - if(istype(user)) - examinate(user, src) - return TOPIC_HANDLED diff --git a/code/modules/culture_descriptor/culture/cultures_human.dm b/code/modules/culture_descriptor/culture/cultures_human.dm index b0a069d445ca7..5ab94cda55787 100644 --- a/code/modules/culture_descriptor/culture/cultures_human.dm +++ b/code/modules/culture_descriptor/culture/cultures_human.dm @@ -201,6 +201,24 @@ dominates the green planet, and the myriad of exotic life found in its freshwater system." economic_power = 0.7 +/singleton/cultural_info/culture/human/theia + name = CULTURE_HUMAN_THEIA + description = "Theia is an inhabited system on the borders of the Sol Central Government known primarily for being the headquarters of the Third Fleet. \ + Located strategically at the gateway closest to several key frontier systems, Theia became known early on as a strategic chokepoint worth defending. \ + Today, military and civilian personnel alike call the Theia system home and work tirelessly to maintain it as the Fortress of Sol. " + economic_power = 1.1 + +/singleton/cultural_info/culture/human/offworld + name = CULTURE_HUMAN_OFFWORLD + description = "You are from one of many far flung and outlying settlements that aren't notable enough to be on standard Solar maps. Raised out of touch and out of connection with the galaxyat large, \ + those who live so far from anything only look to their close family and friends rather than any larger group. Whether it's a fueling station, an agriculutral dome, or a planet that is far removed from \ + the luxuries of the gateway network, such people are raised in small, confined environments with few others, and tend to be most familiar with older, reliable but outdated \ + technology. An independent sort, Offworlders are more likely to be isolationist and self-driven." + economic_power = 0.9 + language = LANGUAGE_SPACER + +// NON SCG BELOW + /singleton/cultural_info/culture/human/magnitka name = CULTURE_HUMAN_MAGNITKA description = "Magnitka often gives birth to rough-hewn, sturdy citizens with its austere political and environmental climate, and many are often well-sought for the \ @@ -218,37 +236,93 @@ economic_power = 1 language = LANGUAGE_SPACER -/singleton/cultural_info/culture/human/offworld - name = CULTURE_HUMAN_OFFWORLD - description = "You are from one of many far flung and outlying settlements that aren't notable enough to be on standard Solar maps. Raised out of touch and out of connection with the galaxyat large, \ - those who live so far from anything only look to their close family and friends rather than any larger group. Whether it's a fueling station, an agriculutral dome, or a planet that is far removed from \ - the luxuries of the gateway network, such people are raised in small, confined environments with few others, and tend to be most familiar with older, reliable but outdated \ - technology. An independent sort, Offworlders are more likely to be isolationist and self-driven." - economic_power = 0.9 - language = LANGUAGE_SPACER - -/singleton/cultural_info/culture/human/confederate - name = CULTURE_HUMAN_CONFEDC - description = "You are from the core of the Gilgamesh Colonial Confederation. Largely influenced by the planet Terra(not Earth), the Confederation's capital, your people embody what it means to be a part of the GCC. \ +/singleton/cultural_info/culture/human/confederate_terra + name = CULTURE_HUMAN_CONFED_TERRA + description = "You are from the core of the Gilgamesh Colonial Confederation. Being from the Confederation's capital, your people embody what it means to be a part of the GCC. \ Unfortunately, the years since the war have not been easy on Terra and the long period of economic recovery has not made life easy. The people of Terra are typically employed \ in the military, industrial, government or service sectors, with an emphasis being placed on mandatory military service. Terrans today are generally poor, bitter and a somewhat broken people angry and \ resentful about their loss in the Gaia Conflict. An upbringing from Terra emphasises an odd mix of service to the state, liberalism and militarism." language = LANGUAGE_HUMAN_RUSSIAN - economic_power = 0.9 + economic_power = 1.1 + +/singleton/cultural_info/culture/human/confederate_zemlya + name = CULTURE_HUMAN_CONFED_ZEMLYA + description = "You are from the core of the Gilgamesh Colonial Confederation. Being from Gilgamesh's Industrial Capital, your people embody what it means to be a part of the working class GCC. \ + Unfortunately, the years since the war have not been easy on Zemlya and the long period of economic recovery has not made life easy. The people of Zemlya are typically employed \ + in the vast industrial sector, less patriotic then those from Terra itself, Zemlyans are still an extremely proud people who have pride in their industrial and working class origins." + language = LANGUAGE_HUMAN_RUSSIAN + economic_power = 1.0 + +/singleton/cultural_info/culture/human/confederate_sestris + name = CULTURE_HUMAN_CONFED_SESTRIS + description = " You are from the Union of Sestris and Bratis - second only to Gilgamesh in terms of political and economic power within the GCC, \ + citizens of Sestris enjoy a generally high standard of living and many can be found within the ranks of the ICCG Defense Forces. Those from Amelie, \ + within Sestris itself are immensely proud of their Franco heratige, with many holding on to some of their cultural roots. " + language = LANGUAGE_HUMAN_RUSSIAN + secondary_langs = list(LANGUAGE_HUMAN_EURO) + economic_power = 1.3 + +/singleton/cultural_info/culture/human/confederate_putkari + name = CULTURE_HUMAN_CONFED_PUTKARI + description = "You are from Putkari in the Baroda system. Settled in the wake of the Terran Commonwealth's exploration Boom, Putkari was abandoned by \ + the SCG following it's founding and left to die. Embracing the newly founded GCC, Putkari has been a loyal and devoted member of the Confederation \ + ever since. Extremely hostile to the SCG ever since it's abandonment, Putkarians are some of the most vocal within the Confederation in terms of \ + resentment of the loss in the Gaia Conflict, many beat the war drums and fan the fires of jingoism in hopes of one day enacting a form of vengance. " + language = LANGUAGE_HUMAN_INDIAN + economic_power = 0.7 + +/singleton/cultural_info/culture/human/confederate_altair + name = CULTURE_HUMAN_CONFED_ALTAIR + description = "You are from Altair. Once a free economic zone, the breaking of the moon of Qabil brought sweeping and more authoritarian change to Altair. \ + One of the more materially wealthy members of the Confederation outside of the Founders, Altarians are not overly interested in the Confederation as a whole, \ + with most choosing to be public workers such as paramedics or infastructure maintainers for the duration of their mandatory state service." + language = LANGUAGE_HUMAN_ARABIC + economic_power = 1.0 + +/singleton/cultural_info/culture/human/confederate_penglai + name = CULTURE_HUMAN_CONFED_PENGLAI + description = "You are from Penglai, a traditionalist world within the Gilgamesh Colonial Confederation. A small world with a marginal atmosphere, \ + breathable by its inhabitants, its main economic contribution to the confederation is in rare earth elements, of which it has a great deal. Another \ + colony that was in need of support following the founding of the SCG, Pengali is a content member of the Confederation while keeping their own traditions alive. " + language = LANGUAGE_HUMAN_CHINESE + economic_power = 0.8 + +/singleton/cultural_info/culture/human/confederate_providence + name = CULTURE_HUMAN_CONFED_PROVIDENCE + description = "You are from Providence, settled originally by private ventures, Providence's planet of Atlanticus developed a booming space station industry, \ + resulting in the construction of three mega-space-complexes within the system. Bolstered by a flood of working class immigrants and research funding following \ + their entry to the Confederation, those from Providence are typically quite pleased with their position within the Confederation, though many still choose to \ + emigrate elsewhere in hopes of finding work outside of the industrial or scientific sectors. " + language = LANGUAGE_HUMAN_RUSSIAN + economic_power = 1.0 + +/singleton/cultural_info/culture/human/confederate_valy + name = CULTURE_HUMAN_CONFED_VALY + description = "You are from Valy, the 'black sheep' of the Confederation. Brought into the Confederation when Valy's civil war was ended by the GCN's intervention \ + Valy has possessed a resistance to the Confederation ever since. The emergance of the Frontier Alliance has emboldened these resistance actions, with \ + public desires to join the Alliance only being held back by the Confederation's continued presence. Those from Valy are typically quite bitter about their present \ + situation, with many who choose to emigrate continuing to support efforts to bring about the Alliance's agenda in 'freeing Valy from it's shackles'. " + language = LANGUAGE_HUMAN_RUSSIAN + economic_power = 0.6 /singleton/cultural_info/culture/human/confederate_colony name = CULTURE_HUMAN_CONFEDO - description = "You are from the outskirts of the Gilgamesh Colonial Confederation. Terran Colonists have a mixed view of their nation state, raging from strong nationalism to resentment for the state, but \ - they all have the legacy of resource extraction and mandatory conscription in common. Being from a nation of conscripts means that Terran Colonists are often resourceful and experienced, \ - having grown to cope with the horrors of dysfunctional economics and mandatory military service. Terrans today are generally poor, bitter and a somewhat broken people angry and \ + description = "You are from the outskirts of the Gilgamesh Colonial Confederation. Confederates have a mixed view of their nation state, raging from strong nationalism to resentment for the state, but \ + they all have the legacy of resource extraction and mandatory conscription in common. Being from a nation of conscripts means that Confederates are often resourceful and experienced, \ + having grown to cope with the horrors of dysfunctional economics and mandatory military service. Confederates today are generally poor, bitter and a somewhat broken people angry and \ resentful about their loss in the Gaia Conflict. Colonial Confederation education emphasizes service to the state, liberalism and militarism." language = LANGUAGE_HUMAN_RUSSIAN economic_power = 0.7 /singleton/cultural_info/culture/human/gaia name = CULTURE_HUMAN_GAIAN - description = "Gaia is the sole planet in the Galilei system, serving as the DMZ between the Sol Central Government and the Independent Colonial Confederation of Gilgamesh. It is an agricultural world, though various conflicts across the planet's surface have left it scarred. The planet is divided into Sol-Controlled Gaian Administrative Area and Independent-Guided Protectorate of Gaia, with the International City of New Venice remaining a neutral zone inside the DMZ that circles the planet's equator. The planet's population remain divided even more then 10 years after the Gaia Conflict. While Gaia is divided, the current Mayor of New Venice serves as a vital mediator between the galactic superpowers. The Gaian People are tired of war, and long to see their families once again; They suffered hard twenty years prior, and will not let themselves suffer again." - economic_power = 0.9 + description = "Gaia is the sole planet in the Galilei system, serving as the DMZ between the Sol Central Government and the Independent Colonial Confederation of Gilgamesh. \ + It is an agricultural world, though various conflicts across the planet's surface have left it scarred. The planet is divided into Sol-Controlled Gaian Administrative Area \ + and Independent-Guided Protectorate of Gaia, with the International City of New Venice remaining a neutral zone inside the DMZ that circles the planet's equator. \ + The planet's population remain divided even more then 10 years after the Gaia Conflict. While Gaia is divided, the current Mayor of New Venice serves as a vital mediator \ + between the galactic superpowers. The Gaian People are tired of war, and long to see their families once again; They suffered hard twenty years prior, and will not let themselves suffer again." + language = LANGUAGE_HUMAN_IBERIAN + economic_power = 1.0 /singleton/cultural_info/culture/human/other name = CULTURE_HUMAN_OTHER diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index 3091e4abd4e3f..4dd82ca47dbd2 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -4,6 +4,7 @@ var/account_number = 0 var/remote_access_pin = 0 var/money = 0 + var/opening_balance = 0 var/list/transaction_log = list() var/suspended = 0 var/security_level = 0 //0 - auto-identify from worn ID, require only account number @@ -22,6 +23,9 @@ /datum/money_account/proc/get_balance() return money +/datum/money_account/proc/get_profit() + return money - opening_balance + /datum/money_account/proc/log_msg(msg, machine_id) var/datum/transaction/log/T = new(src, msg, machine_id) return T.perform() @@ -54,7 +58,7 @@ var/datum/transaction/singular/T = new(M, (source_db ? source_db.machine_id : "NTGalaxyNet Terminal #[rand(111,1111)]"), starting_funds, "Account creation") if(!source_db) //set a random date, time and location some time over the past few decades - T.date = "[num2text(rand(1, 31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [GLOB.using_map.game_year-rand(8, 18)]" + T.date = "[num2text(rand(1, 31))] [pick(GLOB.month_names)], [GLOB.using_map.game_year-rand(8, 18)]" T.time = "[rand(0,24)]:[rand(11,59)]" M.account_number = random_id("station_account_number", 111111, 999999) @@ -88,6 +92,7 @@ //add the account T.perform() + M.opening_balance = M.money all_money_accounts.Add(M) return M diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 65bd97c7db25e..a5400286358b8 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -45,7 +45,7 @@ var/global/account_hack_attempted = 0 var/purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez") var/datum/transaction/singular/T = new(affected_account, name, -amount, purpose) var/date1 = "31 December, 1999" - var/date2 = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [rand(1000,3000)]" + var/date2 = "[num2text(rand(1,31))] [pick(GLOB.month_names)], [rand(1000,3000)]" T.date = pick("", stationdate2text(), date1, date2) var/time1 = rand(0, 99999999) var/time2 = "[round(time1 / 36000)+12]:[pad_left(time1 / 600 % 60, 2, "0")]" diff --git a/code/modules/events/shipping_error.dm b/code/modules/events/shipping_error.dm index 3579f773c6546..242a8c08dbf35 100644 --- a/code/modules/events/shipping_error.dm +++ b/code/modules/events/shipping_error.dm @@ -1,6 +1,9 @@ /datum/event/shipping_error/start() var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = SSsupply.ordernum + O.ordernum = rand(1, 9000) + var/randomtimeofday = rand(0, 864000) // 24 hours in deciseconds + O.timestamp = time2text(randomtimeofday, "hh:mm") O.object = pick(SSsupply.master_supply_list) O.orderedby = random_name(pick(MALE,FEMALE), species = SPECIES_HUMAN) SSsupply.shoppinglist += O + SSsupply.points = max(0, SSsupply.points - O.object.cost) diff --git a/code/modules/fabrication/designs/micro/designs_cutlery.dm b/code/modules/fabrication/designs/micro/designs_cutlery.dm index 3229b3812d718..593e09febae7d 100644 --- a/code/modules/fabrication/designs/micro/designs_cutlery.dm +++ b/code/modules/fabrication/designs/micro/designs_cutlery.dm @@ -1,43 +1,43 @@ /datum/fabricator_recipe/cutlery name = "fork, aluminium" - path = /obj/item/material/kitchen/utensil/fork + path = /obj/item/material/utensil/fork category = "Cutlery" fabricator_types = list(FABRICATOR_CLASS_MICRO) /datum/fabricator_recipe/cutlery/spoon_aluminium name = "spoon, aluminium" - path = /obj/item/material/kitchen/utensil/spoon + path = /obj/item/material/utensil/spoon /datum/fabricator_recipe/cutlery/spork_aluminium name = "spork, aluminium" - path = /obj/item/material/kitchen/utensil/spork + path = /obj/item/material/utensil/spork /datum/fabricator_recipe/cutlery/knife_aluminium name = "table knife, aluminium" - path = /obj/item/material/knife/table + path = /obj/item/material/utensil/knife /datum/fabricator_recipe/cutlery/foon_aluminium name = "foon, aluminium" - path = /obj/item/material/kitchen/utensil/foon + path = /obj/item/material/utensil/foon hidden = TRUE /datum/fabricator_recipe/cutlery/fork_plastic name = "fork, plastic" - path = /obj/item/material/kitchen/utensil/fork/plastic + path = /obj/item/material/utensil/fork/plastic /datum/fabricator_recipe/cutlery/spoon_plastic name = "spoon, plastic" - path = /obj/item/material/kitchen/utensil/spoon/plastic + path = /obj/item/material/utensil/spoon/plastic /datum/fabricator_recipe/cutlery/spork_plastic name = "spork, plastic" - path = /obj/item/material/kitchen/utensil/spork/plastic + path = /obj/item/material/utensil/spork/plastic /datum/fabricator_recipe/cutlery/knife_plastic name = "table knife, plastic" - path = /obj/item/material/knife/table/plastic + path = /obj/item/material/utensil/knife/plastic /datum/fabricator_recipe/cutlery/foon_plastic name = "foon, plastic" - path = /obj/item/material/kitchen/utensil/foon/plastic - hidden = TRUE \ No newline at end of file + path = /obj/item/material/utensil/foon/plastic + hidden = TRUE diff --git a/code/modules/fabrication/designs/micro/designs_glasses.dm b/code/modules/fabrication/designs/micro/designs_glasses.dm index 20a4f9fb06edb..3f21efb21b815 100644 --- a/code/modules/fabrication/designs/micro/designs_glasses.dm +++ b/code/modules/fabrication/designs/micro/designs_glasses.dm @@ -30,7 +30,7 @@ /datum/fabricator_recipe/drinkingglass/flute path = /obj/item/reagent_containers/food/drinks/glass2/flute -/datum/fabricator_recipe/drinkingglass/coffecup +/datum/fabricator_recipe/drinkingglass/coffeecup path = /obj/item/reagent_containers/food/drinks/glass2/coffeecup /datum/fabricator_recipe/drinkingglass/cognac @@ -40,4 +40,4 @@ path = /obj/item/reagent_containers/food/drinks/glass2/goblet /datum/fabricator_recipe/drinkingglass/coffeecup/glass - path = /obj/item/reagent_containers/food/drinks/glass2/coffeecup/glass \ No newline at end of file + path = /obj/item/reagent_containers/food/drinks/glass2/coffeecup/glass diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 8f728ec365813..e7365929c3ac6 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -329,14 +329,14 @@ h1.alert, h2.alert {color: #a4bad6;} .disarm {color: #990000;} .passive {color: #660000;} -.danger {color: #c51e1e;} -.warning {color: #c51e1e; font-style: italic;} -.subtle {color: #4343ca; font-size: 75%; font-style: italic;} +.danger {color: #f73e50; font-weight: bold;} +.warning {color: #f58e09; font-weight: bold; font-style: italic;} +.subtle {color: #808991; font-style: italic;} .boldannounce {color: #c51e1e; font-weight: bold;} .rose {color: #ff5050;} -.info {color: #6685f5;} +.info {color: #b13ef3; font-style: italic;} .debug {color: #ff66ff;} -.notice {color: #6685f5;} +.notice {color: #327fd1;} .alium {color: #00ff00;} .cult {color: #aa1c1c;} .legion {color: #e09000; font-weight: bold; font-family: 'Courier New', Courier, monospace} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css index 1d9a4424d9814..2db550c3cbfaf 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput_white.css +++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css @@ -326,14 +326,14 @@ h1.alert, h2.alert {color: #000080;} .disarm {color: #990000;} .passive {color: #660000;} -.danger {color: #ff0000;} -.warning {color: #ff0000; font-style: italic;} -.subtle {color: #000099; font-size: 75%; font-style: italic;} +.danger {color: #dc3545; font-weight: bold;} +.warning {color: #cc7606; font-weight: bold; font-style: italic;} +.subtle {color: #919ca7; font-style: italic;} .boldannounce {color: #ff0000; font-weight: bold;} .rose {color: #ff5050;} -.info {color: #0000CC;} +.info {color: #9b53c4; font-style: italic;} .debug {color: #ff00ff;} -.notice {color: #000099;} +.notice {color: #0d5ef3;} .alium {color: #00ff00;} .cult {color: #800080; font-weight: bold; font-style: italic;} .legion {color: #e09000; font-weight: bold; font-family: 'Courier New', Courier, monospace} diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 3deaf875b6edc..b5ea465884ac8 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -188,7 +188,7 @@ name = "bloodtomato" seed_name = "blood tomato" display_name = "blood tomato plant" - mutants = list("killer") + mutants = list("killertomato") chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/blood = list(1,5)) splat_type = /obj/decal/cleanable/blood/splatter diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 1c633cf218458..2631feb973993 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -100,7 +100,7 @@ var/o_access = O.GetAccess() . |= o_access -/obj/item/device/electronic_assembly/Bump(atom/AM) +/obj/item/device/electronic_assembly/Bump(atom/AM, called) collw = weakref(AM) .=..() if(istype(AM, /obj/machinery/door/airlock) || istype(AM, /obj/machinery/door/window)) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 9965aec7116fb..5813cfdf9e3d3 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -175,6 +175,7 @@ . += create_recipe_list(/datum/stack_recipe/box) . += new/datum/stack_recipe/cardborg_suit(src) . += new/datum/stack_recipe/cardborg_helmet(src) + . += new/datum/stack_recipe/envelope(src) . += new/datum/stack_recipe_list("folders", create_recipe_list(/datum/stack_recipe/folder)) /material/aluminium/generate_recipes(reinforce_material) diff --git a/code/modules/materials/recipes_furniture.dm b/code/modules/materials/recipes_furniture.dm index 1ea81db12049e..e0b2007c54ffd 100644 --- a/code/modules/materials/recipes_furniture.dm +++ b/code/modules/materials/recipes_furniture.dm @@ -15,8 +15,6 @@ /datum/stack_recipe/furniture/chair/display_name() return modifiers ? jointext(modifiers + ..(), " ") : ..() -/datum/stack_recipe/furniture/chair/padded - req_amount = 2 #define PADDED_CHAIR(color) /datum/stack_recipe/furniture/chair/padded/##color{\ result_type = /obj/structure/bed/chair/padded/##color;\ diff --git a/code/modules/materials/recipes_items.dm b/code/modules/materials/recipes_items.dm index 7a944b929bc40..b1a7554018abc 100644 --- a/code/modules/materials/recipes_items.dm +++ b/code/modules/materials/recipes_items.dm @@ -47,20 +47,20 @@ /datum/stack_recipe/fork title = "fork" - result_type = /obj/item/material/kitchen/utensil/fork/plastic + result_type = /obj/item/material/utensil/fork/plastic on_floor = 1 send_material_data = 1 /datum/stack_recipe/knife title = "table knife" - result_type = /obj/item/material/knife/table + result_type = /obj/item/material/utensil/knife on_floor = 1 difficulty = 2 send_material_data = 1 /datum/stack_recipe/spoon title = "spoon" - result_type = /obj/item/material/kitchen/utensil/spoon/plastic + result_type = /obj/item/material/utensil/spoon/plastic on_floor = 1 send_material_data = 1 @@ -349,4 +349,4 @@ result_type = /obj/item/cane/staff req_amount = 5 difficulty = 0 - time = 25 \ No newline at end of file + time = 25 diff --git a/code/modules/materials/recipes_storage.dm b/code/modules/materials/recipes_storage.dm index 236691f66f448..b250051c5f188 100644 --- a/code/modules/materials/recipes_storage.dm +++ b/code/modules/materials/recipes_storage.dm @@ -38,6 +38,10 @@ req_amount = 3 on_floor = 1 +/datum/stack_recipe/envelope + title = "envelope" + result_type = /obj/item/folder/envelope + /datum/stack_recipe/folder title = "folder" result_type = /obj/item/folder diff --git a/code/modules/mechs/components/software.dm b/code/modules/mechs/components/software.dm index d9a1d45a8323b..a50424642859b 100644 --- a/code/modules/mechs/components/software.dm +++ b/code/modules/mechs/components/software.dm @@ -8,7 +8,7 @@ /obj/item/circuitboard/exosystem/engineering name = "exosuit software (engineering systems)" contains_software = list(MECH_SOFTWARE_ENGINEERING) - origin_tech = list(TECH_DATA = 1) + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) /obj/item/circuitboard/exosystem/utility name = "exosuit software (utility systems)" @@ -20,10 +20,10 @@ name = "exosuit software (medical systems)" contains_software = list(MECH_SOFTWARE_MEDICAL) icon_state = "mcontroller" - origin_tech = list(TECH_DATA = 3,TECH_BIO = 2) + origin_tech = list(TECH_DATA = 1,TECH_BIO = 1) /obj/item/circuitboard/exosystem/weapons name = "exosuit software (basic weapon systems)" contains_software = list(MECH_SOFTWARE_WEAPONS) icon_state = "mainboard" - origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 3) + origin_tech = list(TECH_DATA = 1, TECH_COMBAT = 3) diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm index 89da797082398..18a97293b1697 100644 --- a/code/modules/mechs/equipment/combat.dm +++ b/code/modules/mechs/equipment/combat.dm @@ -92,7 +92,7 @@ toggle() playsound(owner.loc,'sound/mecha/internaldmgalarm.ogg',35,1) */ - owner.add_heat(difference) + owner.add_heat(difference * 2) if(difference >= 0) toggle() OVERHEAT = TRUE diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index 36d1679c53af8..176ba2bfbd14b 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -30,7 +30,7 @@ return if(chosen_obj.density) for(var/atom/A in get_turf(src)) - if(A != src && A.density && !(A.atom_flags & ATOM_FLAG_CHECKS_BORDER)) + if(!istype(A, /obj/structure/cargopile) && A.density && !(A.atom_flags & ATOM_FLAG_CHECKS_BORDER)) to_chat(user, SPAN_WARNING("\The [A] blocks you from pulling out \the [chosen_obj].")) return if(!do_after(user, 0.5 SECONDS, src, DO_PUBLIC_UNIQUE)) return diff --git a/code/modules/mob/grab/normal/grab_normal.dm b/code/modules/mob/grab/normal/grab_normal.dm index 81e6541935cf1..08b87163bcd2e 100644 --- a/code/modules/mob/grab/normal/grab_normal.dm +++ b/code/modules/mob/grab/normal/grab_normal.dm @@ -257,11 +257,12 @@ return 0 //unsuitable weapon user.visible_message(SPAN_DANGER("\The [user] begins to slit \the [affecting]'s throat with \the [W]!")) - user.next_move = world.time + 20 //also should prevent user from triggering this repeatedly - if(!do_after(user, 2 SECONDS * user.skill_delay_mult(SKILL_COMBAT), affecting, DO_DEFAULT | DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS)) + var/attack_time = 3 SECONDS * user.skill_delay_mult(SKILL_COMBAT, 0.125) // 3.75 ~ 2.25 seconds + if(!do_after(user, attack_time, affecting, DO_DEFAULT | DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS)) return 0 - if(!(G && G.affecting == affecting)) //check that we still have a grab + if(!(G && G.affecting == affecting)) return 0 + user.next_move = world.time + 1 SECOND var/damage_mod = 1 var/damage_flags = W.damage_flags() diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index e6f7ca8761882..3d584b242a7d2 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -1,5 +1,5 @@ /mob/proc/hear_say(message, verb = "says", datum/language/language, alt_name, italics, mob/speaker, sound/speech_sound, sound_vol) - if (!client) + if (!client && !teleop) return var/is_ghost = isghost(src) @@ -110,6 +110,10 @@ display_verb = "[verb] ([language.shorthand])" display_message = language.format_message(display_message, display_verb) + if (teleop) + teleop.on_hear_say({"[SPAN_CLASS("game say", "[display_controls][SPAN_NOTICE(SPAN_BOLD("NEAR YOU: "))][SPAN_CLASS("name", display_name)][alt_name] [display_message]")]"}) + return + on_hear_say({"[SPAN_CLASS("game say", "[display_controls][SPAN_CLASS("name", display_name)][alt_name] [display_message]")]"}) if (istype(language, /datum/language/noise)) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index db1b5005b48c9..ba8896392b2fc 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -227,7 +227,7 @@ ..(message, null, verb) -/mob/living/bot/Bump(atom/A) +/mob/living/bot/Bump(atom/A, called) if(on && botcard && istype(A, /obj/machinery/door)) var/obj/machinery/door/D = A if(!istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && D.check_access(botcard)) diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 8797246c3a319..b4c120879a6e5 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -20,6 +20,7 @@ var/treatment_oxy = /datum/reagent/tricordrazine var/treatment_fire = /datum/reagent/tricordrazine var/treatment_tox = /datum/reagent/tricordrazine + var/treatment_virus = /datum/reagent/spaceacillin var/treatment_emag = /datum/reagent/toxin var/declare_treatment = 0 //When attempting to treat a patient, should it notify everyone wearing medhuds? diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index 6f6f7ed6c0bba..0ab3a2f057f01 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -203,7 +203,7 @@ if(T == src.loc) unload(dir) -/mob/living/bot/mulebot/Bump(mob/living/carbon/human/M) +/mob/living/bot/mulebot/Bump(mob/living/carbon/human/M, called) if(!safety && istype(M)) visible_message(SPAN_WARNING("[src] knocks over [M]!")) M.Stun(8) diff --git a/code/modules/mob/living/carbon/alien/diona/gestalt/gestalt_movement.dm b/code/modules/mob/living/carbon/alien/diona/gestalt/gestalt_movement.dm index 3299fc29e01b1..13882e7b14115 100644 --- a/code/modules/mob/living/carbon/alien/diona/gestalt/gestalt_movement.dm +++ b/code/modules/mob/living/carbon/alien/diona/gestalt/gestalt_movement.dm @@ -2,7 +2,7 @@ if(nymphs[user]) step(src, direction) // ANARCHY! DEMOCRACY! ANARCHY! DEMOCRACY! // Naaaa na na na na naa naa https://www.youtube.com/watch?v=iMH49ieL4es -/obj/structure/diona_gestalt/Bump(atom/movable/AM, yes) // what a useful argname, thanks oldcoders +/obj/structure/diona_gestalt/Bump(atom/movable/AM, called) . = ..() if(AM && can_roll_up_atom(AM) && AM.Adjacent(src)) var/turf/stepping = AM.loc diff --git a/code/modules/mob/living/carbon/allergy.dm b/code/modules/mob/living/carbon/allergy.dm new file mode 100644 index 0000000000000..77262b3074388 --- /dev/null +++ b/code/modules/mob/living/carbon/allergy.dm @@ -0,0 +1,112 @@ + +/* This file contains all the procs processing allergy onset, healing, and symptoms. +For the file where the allergy trait is defined; check datum/traits/maluses/allergy.dm +Mild allergies increase heart rate and give itch messages. Inaprovaline resolves these symptoms; but the allergy will keep running as long as a reagent is in the system. +Severe allergies cause breathing problems and an even faster heart rate. Inaprovaline markedly stabilizes these symptoms; but only adrenaline can stop a severe allergy +As long as you have inaprovaline in your system, an allergy cannot trigger. Key is to keep inaprov longer than the allergen exists above threshold after treatment */ + +/* +Checks if allergy will be triggered at a reagent level. Called by handle_allergy(). +If all offending reagent levels fall below threshold and no severe allergy is running; will stop allergies. +Also checks if medications that stop allergies from triggering are in system. This is done after the list of active_allergies is updated. +*/ +/mob/living/carbon/proc/check_allergy(datum/reagent/reagent, current_level = 0) + if (!ispath(reagent)) + return + var/allergy_severity = GetTraitLevel(/singleton/trait/malus/allergy, reagent) + if (!allergy_severity) + return + var/threshold = 1/allergy_severity //For Medium sized mobs; threshold of 1 for minor allergies and 0.33 for major allergies. + if (current_level < threshold) + LAZYREMOVE(active_allergies, reagent) + return + + LAZYDISTINCTADD(active_allergies, reagent) + start_allergy(allergy_severity) + +///This starts an allergy. Dosage/drug are handled at check_allergy proc, if you call this proc directly you must do your own checks. +/mob/living/carbon/proc/start_allergy(allergy_severity) + if (trait_flags & SEVERE_ALLERGY) + return + if ((trait_flags & MILD_ALLERGY) && allergy_severity <= TRAIT_LEVEL_MINOR) + return + if (chem_effects[CE_STABLE] || chem_doses[/datum/reagent/adrenaline]) + return + + switch (allergy_severity) + if (TRAIT_LEVEL_MINOR) + trait_flags |= MILD_ALLERGY + to_chat(src, SPAN_DANGER("You start feeling uncontrollably itchy!")) + next_allergy_time = world.time + 2 MINUTES + + if (TRAIT_LEVEL_MAJOR) + trait_flags |= SEVERE_ALLERGY + to_chat(src, SPAN_DANGER("Your throat starts swelling up and it suddenly becomes very difficult to breathe!")) + next_allergy_time = world.time + 1 MINUTES + + else + crash_with("Allergy called with incorrect severity of [allergy_severity].") + +///Ends allergies and unsets flag. Conditions handled at handle_allergy proc; if you call this directly do your own checks. +///If no severity supplied will end all allergies. +/mob/living/carbon/proc/stop_allergy(allergy_flag) + if (!(trait_flags & (MILD_ALLERGY|SEVERE_ALLERGY))) + return + + if ((trait_flags & MILD_ALLERGY) && (!allergy_flag || (allergy_flag & MILD_ALLERGY))) + if (!chem_effects[CE_STABLE]) //People with inaprov aren't itching to start with. + to_chat(src, SPAN_NOTICE("You feel the itching subside.")) + trait_flags &= ~MILD_ALLERGY + + if ((trait_flags & SEVERE_ALLERGY) && (!allergy_flag || (allergy_flag & SEVERE_ALLERGY))) + to_chat(src, SPAN_NOTICE("You feel your airways open up and breathing feels easier!")) + trait_flags &= ~SEVERE_ALLERGY + +/mob/living/var/next_allergy_time = 0 +/mob/living/proc/handle_allergy() + return + +///Main proc through which all other allergy procs are called; it is called by carbon/Life(). +///If adrenaline is in system, all active allergies will be stopped. Having inaprov (CE_STABLE) will prevent them from retriggering when adrenaline washes out. +/mob/living/carbon/handle_allergy() + if (stat) + return + if (!HAS_TRAIT(src, /singleton/trait/malus/allergy)) + return + var/list/allergy_list = traits[/singleton/trait/malus/allergy] + + for (var/picked as anything in allergy_list) + if (!(picked in chem_doses) && !(picked in active_allergies)) + continue + var/datum/reagent/reagent = picked + check_allergy(reagent, chem_doses[reagent]) + + if ((trait_flags & MILD_ALLERGY) && (!length(active_allergies))) + stop_allergy(MILD_ALLERGY) + + if ((trait_flags & SEVERE_ALLERGY) && chem_doses[/datum/reagent/adrenaline] >= 1) + stop_allergy(SEVERE_ALLERGY) + + run_allergy_symptoms() + + +///Proc called by handle_allergy, handles chemical effects and symptoms. +/mob/living/carbon/proc/run_allergy_symptoms() + if (!(trait_flags & (MILD_ALLERGY|SEVERE_ALLERGY))) + return + + add_chemical_effect(CE_PULSE, 2) + if (trait_flags & SEVERE_ALLERGY) + add_chemical_effect(CE_BREATHLOSS, 2) + add_chemical_effect(CE_PULSE, 2) + if (prob(50)) + add_chemical_effect(CE_VOICELOSS, 1) + + if (!can_feel_pain() || world.time < next_allergy_time || chem_effects[CE_STABLE]) + return + + to_chat(src, SPAN_WARNING("You feel uncontrollably itchy!")) + var/delay = 2 MINUTES + if (trait_flags & SEVERE_ALLERGY) + delay /= 2 + next_allergy_time = world.time + delay diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 451db3156ef38..9853c78963a29 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -30,6 +30,7 @@ R.clear_reagents() set_nutrition(400) set_hydration(400) + stop_allergy() ..() /mob/living/carbon/Move(NewLoc, direct) @@ -170,6 +171,7 @@ /mob/living/carbon/swap_hand() + . = ..() hand = !hand if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) if(hand) //This being 1 means the left hand is in use @@ -382,10 +384,14 @@ if(alert("Are you sure you want to [player_triggered_sleeping ? "wake up?" : "sleep for a while? Use 'sleep' again to wake up"]", "Sleep", "No", "Yes") == "Yes") player_triggered_sleeping = !player_triggered_sleeping -/mob/living/carbon/Bump(atom/movable/AM, yes) - if(now_pushing || !yes) +/mob/living/carbon/Bump(atom/movable/AM, called) + if(now_pushing || !called) return ..() + //[SIERRA-ADD] VIRUSOLOGY + if(istype(AM, /mob/living/carbon) && prob(10)) + src.spread_disease_to(AM, "Contact") + //[/SIERRA-ADD] VIRUSOLOGY /mob/living/carbon/slip(slipped_on, stun_duration = 8) if(!has_gravity()) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index c0510b3a889e5..4c99a696b088c 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -40,3 +40,5 @@ var/stasis_value var/player_triggered_sleeping = 0 + ///Reagents towards which there is an active allergy. + var/list/active_allergies = list() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index dfb72a5639484..35317c9bab2ef 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -174,14 +174,14 @@ if (src.stat) msg += "[SPAN_WARNING("[P.He] [P.is]n't responding to anything around [P.him] and seems to be unconscious.")]\n" if((stat == DEAD || is_asystole() || losebreath || status_flags & FAKEDEATH) && distance <= 3) - msg += "[SPAN_WARNING("[P.He] [P.does] not appear to be breathing.")]\n" + msg += "[SPAN_DANGER("[P.He] [P.does] not appear to be breathing.")]\n" if (fire_stacks > 0) msg += "[P.He] looks flammable.\n" else if (fire_stacks < 0) msg += "[P.He] looks wet.\n" if(on_fire) - msg += "[SPAN_WARNING("[P.He] [P.is] on fire!.")]\n" + msg += "[SPAN_DANGER("[P.He] [P.is] on fire!.")]\n" var/ssd_msg = species.get_ssd(src) if(ssd_msg && (!should_have_organ(BP_BRAIN) || has_brain()) && stat != DEAD) @@ -223,7 +223,7 @@ var/obj/item/organ/external/E = organs_by_name[organ_tag] if(!E) - wound_flavor_text[organ_descriptor] = "[P.He] [P.is] missing [P.his] [organ_descriptor].\n" + wound_flavor_text[organ_descriptor] = SPAN_WARNING("[P.He] [P.is] missing [P.his] [organ_descriptor].\n") continue wound_flavor_text[E.name] = "" @@ -245,20 +245,20 @@ hidden_bleeders[hidden] += E.name else if(E.is_stump()) - wound_flavor_text[E.name] += "[P.He] [P.has] a stump where [P.his] [organ_descriptor] should be.\n" + wound_flavor_text[E.name] += SPAN_DANGER("[P.He] [P.has] a stump where [P.his] [organ_descriptor] should be.\n") if(LAZYLEN(E.wounds) && E.parent) - wound_flavor_text[E.name] += "[P.He] [P.has] [E.get_wounds_desc()] on [P.his] [E.parent.name].
" + wound_flavor_text[E.name] += SPAN_DANGER("[P.He] [P.has] [E.get_wounds_desc()] on [P.his] [E.parent.name].
") else if(!is_synth && BP_IS_ROBOTIC(E) && (E.parent && !BP_IS_ROBOTIC(E.parent) && !BP_IS_ASSISTED(E.parent))) - wound_flavor_text[E.name] = "[P.He] [P.has] a [E.name].\n" + wound_flavor_text[E.name] = SPAN_INFO("[P.He] [P.has] a [E.name].\n") var/wounddesc = E.get_wounds_desc() if(wounddesc != "nothing") - wound_flavor_text[E.name] += "[P.He] [P.has] [wounddesc] on [P.his] [E.name].
" + wound_flavor_text[E.name] += SPAN_DANGER("[P.He] [P.has] [wounddesc] on [P.his] [E.name].
") if(!hidden || distance <=1) if(E.dislocated > 0) - wound_flavor_text[E.name] += "[P.His] [E.joint] is dislocated!
" + wound_flavor_text[E.name] += SPAN_WARNING("[P.His] [E.joint] is dislocated!
") if(((E.status & ORGAN_BROKEN) && E.brute_dam > E.min_broken_damage) || (E.status & ORGAN_MUTATED)) - wound_flavor_text[E.name] += "[P.His] [E.name] is dented and swollen!
" + wound_flavor_text[E.name] += SPAN_DANGER("[P.His] [E.name] is dented and swollen!
") for(var/datum/wound/wound in E.wounds) var/list/embedlist = wound.embedded_objects @@ -271,14 +271,12 @@ else if(!parsedembed.Find("multiple [embedded.name]")) parsedembed.Remove(embedded.name) parsedembed.Add("multiple "+embedded.name) - wound_flavor_text["[E.name]"] += "The [wound.desc] on [P.his] [E.name] has \a [english_list(parsedembed, and_text = " and a ", comma_text = ", a ")] sticking out of it!
" + wound_flavor_text["[E.name]"] += SPAN_DANGER("The [wound.desc] on [P.his] [E.name] has \a [english_list(parsedembed, and_text = " and a ", comma_text = ", a ")] sticking out of it!
") for(var/hidden in hidden_bleeders) - wound_flavor_text[hidden] = "[P.He] [P.has] blood soaking through [hidden] around [P.his] [english_list(hidden_bleeders[hidden])]!
" + wound_flavor_text[hidden] = SPAN_DANGER("[P.He] [P.has] blood soaking through [hidden] around [P.his] [english_list(hidden_bleeders[hidden])]!
") - var/wound_msg = "" for(var/limb in wound_flavor_text) - wound_msg += wound_flavor_text[limb] - msg += SPAN_WARNING(wound_msg) + msg += wound_flavor_text[limb] for(var/obj/implant in get_visible_implants(0)) if(implant in shown_objects) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9ff7c549fabc5..8d44287a24820 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -943,6 +943,11 @@ if(H.brainmob.mind) H.brainmob.mind.transfer_to(src) qdel(H) + //[SIERRA-ADD] VIRUSOLOGY + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + V.cure(src) + //[/SIERRA-ADD] losebreath = 0 diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 03317ede2e982..c9d7ee2f069fd 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -61,6 +61,11 @@ apply_effect(4, EFFECT_WEAKEN, armor_block) return +//[SIERRA-ADD] VIRUSOLOGY + if(istype(M,/mob/living/carbon)) + M.spread_disease_to(src, "Contact") +//[/SIERRA-ADD] VIRUSOLOGY + for (var/obj/item/grab/G in H) if (G.assailant == H && G.affecting == src) if(G.resolve_openhand_attack()) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1c4da4029e33b..b5dbd48eb60b1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -964,8 +964,16 @@ /mob/living/carbon/human/proc/handle_hud_list() + var/foundVirus = 0 //SIERRA-ADD if (GET_BIT(hud_updateflag, HEALTH_HUD) && hud_list[HEALTH_HUD]) var/image/holder = hud_list[HEALTH_HUD] +//SIERRA-ADD VIRUSOLOGY + for (var/ID in virus2) + if (ID in virusDB) + foundVirus = 1 + break + +//SIERRA-ADD if(stat == DEAD || status_flags & FAKEDEATH) holder.icon_state = "0" // X_X else if(is_asystole()) @@ -978,6 +986,10 @@ var/image/holder = hud_list[LIFE_HUD] if(stat == DEAD || status_flags & FAKEDEATH) holder.icon_state = "huddead" +//SIERRA-ADD VIRUSOLOGY + else if(foundVirus) + holder.icon_state = "hudill" +//SIERRA-ADD else holder.icon_state = "hudhealthy" hud_list[LIFE_HUD] = holder @@ -1001,6 +1013,10 @@ holder2.icon_state = "huddead" else if(has_brain_worms()) holder2.icon_state = "hudbrainworm" +//SIERRA-ADD VIRUSOLOGY + else if(foundVirus) + holder.icon_state = "hudill" +//SIERRA-ADD else holder2.icon_state = "hudhealthy" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index aab68c683bead..2052a0416ac8e 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -15,6 +15,8 @@ //Chemicals in the body handle_chemicals_in_body() + handle_allergy() + //Random events (vomiting etc) handle_random_events() diff --git a/code/modules/mob/living/carbon/viruses.dm b/code/modules/mob/living/carbon/viruses.dm index 9f657c52aa5cf..ca6a3b1a0fb09 100644 --- a/code/modules/mob/living/carbon/viruses.dm +++ b/code/modules/mob/living/carbon/viruses.dm @@ -1,16 +1,69 @@ /mob/living/carbon var/immunity = 100 //current immune system strength +//[SIERRA-ADD] VIRUSOLOGY var/immunity_norm = 100 //it will regenerate to this value /mob/living/carbon/proc/handle_viruses() if(status_flags & GODMODE) return 0 //godmode + if(bodytemperature > 406) + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + V.cure(src) + if(life_tick % 3) //don't spam checks over all objects in view every tick. + for(var/obj/decal/cleanable/O in view(1,src)) + if(istype(O,/obj/decal/cleanable/blood)) + var/obj/decal/cleanable/blood/B = O + if(isnull(B.virus2)) + B.virus2 = list() + if(LAZYLEN(B.virus2)) + for (var/ID in B.virus2) + var/datum/disease2/disease/V = B.virus2[ID] + infect_virus2(src,V) + + else if(istype(O,/obj/decal/cleanable/mucus)) + var/obj/decal/cleanable/mucus/M = O + if(isnull(M.virus2)) + M.virus2 = list() + if(LAZYLEN(M.virus2)) + for (var/ID in M.virus2) + var/datum/disease2/disease/V = M.virus2[ID] + infect_virus2(src,V) + + if(LAZYLEN(virus2)) + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + if(isnull(V)) // Trying to figure out a runtime error that keeps repeating + CRASH("virus2 nulled before calling activate()") + else + V.process(src) + // activate may have deleted the virus + if(!V) continue + + // check if we're immune + var/list/common_antibodies = V.antigen & src.antibodies + if(LAZYLEN(common_antibodies)) + V.dead = 1 +//[/SIERRA-ADD] VIRUSOLOGY if(immunity > 0.2 * immunity_norm && immunity < immunity_norm) immunity = min(immunity + 0.25, immunity_norm) +//[SIERRA-ADD] VIRUSOLOGY + if(life_tick % 5 && immunity < 15 && chem_effects[CE_ANTIVIRAL] < VIRUS_COMMON && !LAZYLEN(virus2)) + var/infection_prob = 5 - immunity + var/turf/simulated/T = loc + if(istype(T)) + infection_prob += T.dirt + if(T.dirt >= 50) + if(prob(infection_prob)) + infect_mob_random_greater(src) + else + if(prob(infection_prob)) + infect_mob_random_lesser(src) +//[/SIERRA-ADD] VIRUSOLOGY /mob/living/carbon/proc/virus_immunity() var/antibiotic_boost = reagents.get_reagent_amount(/datum/reagent/spaceacillin) / (REAGENTS_OVERDOSE/2) return max(immunity/100 * (1+antibiotic_boost), antibiotic_boost) /mob/living/carbon/proc/immunity_weakness() - return max(2-virus_immunity(), 0) \ No newline at end of file + return max(2-virus_immunity(), 0) diff --git a/code/modules/mob/living/carbon/xenobiological/xenobiological.dm b/code/modules/mob/living/carbon/xenobiological/xenobiological.dm index 6ac95c42b74ba..7238c133e2e90 100644 --- a/code/modules/mob/living/carbon/xenobiological/xenobiological.dm +++ b/code/modules/mob/living/carbon/xenobiological/xenobiological.dm @@ -117,8 +117,8 @@ return tally -/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes) - if ((!(yes) || now_pushing)) +/mob/living/carbon/slime/Bump(atom/movable/AM, called) + if ((!(called) || now_pushing)) return now_pushing = 1 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1d18fb3537547..1afbb67ef3a36 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -64,7 +64,7 @@ default behaviour is: return 0 return ..() -/mob/living/Bump(atom/movable/AM, yes) +/mob/living/Bump(atom/movable/AM, called) // This is boilerplate from /atom/movable/Bump() but in all honest // I have no clue what is going on in the logic below this and I'm @@ -75,7 +75,7 @@ default behaviour is: // End boilerplate. spawn(0) - if ((!( yes ) || now_pushing) || !loc) + if ((!( called ) || now_pushing) || !loc) return now_pushing = 1 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index ccfc073bbcf5d..b68582cc3956b 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -68,6 +68,8 @@ /// An associative list of /singleton/trait and trait level - See individual traits for valid levels var/list/traits + /// Flags set by traits triggering behavior; currently used for allergies. + var/trait_flags /// Some combination of HAZARD_FLAG_*. When set, the flagged hazard types will not damage the mob. var/ignore_hazard_flags = EMPTY_BITFIELD diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index fa38f46b4221f..6a4095f65c5eb 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -114,6 +114,8 @@ var/global/list/ai_verbs_default = list( var/default_ai_icon = /singleton/ai_icon/blue var/static/list/custom_ai_icons_by_ckey_and_name + idcard = /obj/item/card/id/synthetic/ai + /mob/living/silicon/ai/proc/add_ai_verbs() src.verbs |= ai_verbs_default src.verbs -= /mob/living/verb/ghost diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_cultivator.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_cultivator.dm index ee72c0163f823..421a1d12768d4 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_cultivator.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_cultivator.dm @@ -2,8 +2,8 @@ name = "cultivator drone module" display_name = "Cultivator" channels = list( - "Science" = TRUE, - "Service" = TRUE + "Service" = TRUE, + "Science" = TRUE ) sprites = list("Drone" = "drone-hydro") diff --git a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm index 29068d4100253..3a890f10fc14b 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm @@ -28,7 +28,7 @@ /obj/item/device/scanner/plant, /obj/item/storage/plants, /obj/item/robot_harvester, - /obj/item/material/kitchen/rollingpin, + /obj/item/material/rollingpin, /obj/item/material/knife/kitchen, /obj/item/crowbar, /obj/item/rsf, diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index f5c6e7e28bcee..6511a718461bc 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -284,6 +284,20 @@ recalculate_synth_capacities() if(module) notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) + addtimer(new Callback(src, .proc/announce_module_change), 2 SECONDS) + +/mob/living/silicon/robot/proc/announce_module_change() + var/singleton/security_state/security_state = GET_SINGLETON(GLOB.using_map.security_state) + + if(!src || !(src.z in GLOB.using_map.station_levels)) + return // don't announce offmap borgs + + var/channel + if(length(module.channels) >= 1 && !security_state.current_security_level_is_same_or_higher_than(security_state.high_security_level)) + channel = module.channels[1] + else + channel = "Common" // common if code red or no radio channels, replicates behavior that crew have + GLOB.global_announcer.autosay("[name] has loaded the [module.name].", "Robotic Module Oversight", channel) /mob/living/silicon/robot/get_cell() return cell @@ -450,6 +464,8 @@ if(module) for(var/datum/matter_synth/ms in module.synths) stat("[ms.name]: [ms.energy]/[ms.max_energy_multiplied]") + stat("Local Time:", "[stationtime2text()]") + stat("Local Date:", "[stationdate2text()]") /mob/living/silicon/robot/restrained() return 0 diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index d0b94a707501d..42c2e35bd82f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -28,13 +28,22 @@ var/blood_per_tick = 3 var/health_per_tick = 0.8 pass_flags = PASS_FLAG_TABLE - + var/datum/disease2/disease/carried //[SIERRA-ADD] VIRUSOLOGY bleed_colour = "#aad9de" ai_holder = /datum/ai_holder/hostile/melee/vagrant /datum/ai_holder/hostile/melee/vagrant + +//[SIERRA-ADD] VIRUSOLOGY +/mob/living/simple_animal/hostile/vagrant/Initialize() + . = ..() + if(prob(25)) + carried = new/datum/disease2/disease() + carried.makerandom(rand(2, 4)) +//[/SIERRA-ADD] VIRUSOLOGY + /datum/ai_holder/hostile/melee/vagrant/engage_target() if(ishuman(target)) var/mob/living/carbon/human/H = target @@ -53,7 +62,10 @@ H.Stun(1) H.visible_message(SPAN_DANGER("\the [holder] latches onto \the [H], pulsating!")) V.forceMove(V.gripping.loc) - + //[SIERRA-ADD] VIRUSOLOGY + if(V.carried && length(V.gripping.virus2) == 0) + infect_virus2(V.gripping, V.carried, 1) + //[/SIERRA-ADD] VIRUSOLOGY /mob/living/simple_animal/hostile/vagrant/Process_Spacemove() return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 60932e7b78177..1b02c7ca507e6 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -610,7 +610,9 @@ else //Otherwise we're probably just holding their arm to lead them somewhere var/grabtype - if(H.has_organ(BP_L_ARM) || H.has_organ(BP_R_ARM)) //If they have at least one arm + if ((H.has_organ(BP_L_HAND) || H.has_organ(BP_R_HAND)) && (zone_sel.selecting == BP_L_HAND || zone_sel.selecting == BP_R_HAND)) + grabtype = "hand" + else if(H.has_organ(BP_L_ARM) || H.has_organ(BP_R_ARM)) //If they have at least one arm grabtype = "arm" else //If they have no arms grabtype = "shoulder" diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 7de3edeeac4e8..72ef605ecb7a7 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -360,27 +360,47 @@ to_chat(src, "You will now default to [default_run_intent] when moving quickly.") /client/verb/setmovingslowly() - set hidden = 1 - if(mob) + set hidden = TRUE + if (!mob) + return + if (mob.get_preference_value(/datum/client_preference/toggle_run) == GLOB.PREF_NO) mob.set_moving_slowly() + /mob/proc/set_moving_slowly() - if(!default_walk_intent) + if (!default_walk_intent) default_walk_intent = get_movement_datum_by_missing_flag(MOVE_INTENT_QUICK) - if(default_walk_intent && move_intent != default_walk_intent) + if (default_walk_intent && move_intent != default_walk_intent) set_move_intent(default_walk_intent) + /client/verb/setmovingquickly() - set hidden = 1 - if(mob) + set hidden = TRUE + if (!mob) + return + if (mob.get_preference_value(/datum/client_preference/toggle_run) == GLOB.PREF_NO) mob.set_moving_quickly() + else + mob.toggle_moving_quickly() + /mob/proc/set_moving_quickly() - if(!default_run_intent) + if (!default_run_intent) default_run_intent = get_movement_datum_by_flag(MOVE_INTENT_QUICK) - if(default_run_intent && move_intent != default_run_intent) + if (default_run_intent && move_intent != default_run_intent) set_move_intent(default_run_intent) + +/mob/proc/toggle_moving_quickly() + var/quick = get_movement_datum_by_flag(MOVE_INTENT_QUICK) + if (move_intent == quick) + var/slow = get_movement_datum_by_missing_flag(MOVE_INTENT_QUICK) + if (slow && move_intent != slow) + set_move_intent(slow) + else if (quick) + set_move_intent(quick) + + /mob/proc/can_sprint() return FALSE diff --git a/code/modules/mob/skills/skill.dm b/code/modules/mob/skills/skill.dm index 307407d401360..8ed4c35cc6b7b 100644 --- a/code/modules/mob/skills/skill.dm +++ b/code/modules/mob/skills/skill.dm @@ -146,9 +146,9 @@ GLOBAL_LIST_EMPTY(skills) name = "Information Technology" desc = "Describes your understanding of computers, software and communication. Not a requirement for using computers, but definitely helps. Used in telecommunications and programming of computers and AIs." levels = list( "Unskilled" = "You know how to use the computers and communication devices that you grew up with. You can use a computer console, a handheld or wall-mounted radio, and your headset, as well as your PDA. You know what an AI is, but you may see them as either \"people made of silicon\" or \"only machines\"; you know they have to obey their laws, but you don't know much about how or why they work.", - "Basic" = "You know the basics of programming, but you're not very good at it and couldn't do it professionally. You have a pretty good idea of what makes AIs tick. You understand how information is stored in a computer, and you can fix simple computer problems. You're computer-literate, but you still make mistakes. If you tried to subvert the AI, you might make mistakes in wording your new laws.
- The antagonist access decryption program has a chance to avoid tripping alarms and working more effectively. This increases with level.", + "Basic" = "You know the basics of programming, but you're not very good at it and couldn't do it professionally. You have a pretty good idea of what makes AIs tick. You understand how information is stored in a computer, and you can fix simple computer problems. You're computer-literate, but you still make mistakes. If you tried to subvert the AI, you might make mistakes in wording your new laws.
- The antagonist access decryption program has a chance to avoid tripping alarms and working more effectively. This increases with level.
- You can use the command line on modular computers (type \"man\" for a list).", "Trained" = "At this level, you're probably working with computers on a daily basis. You understand and can repair the telecommunications network. Your understanding of AI programming and psychology lets you fix problems with the AIs or cyborgs--or create problems, if you so desire. You can program computers and AIs and change their laws effectively.
- You can fully operate the Network Monitor, E-mail Administration, and AI Management Programs.", - "Experienced" = "You have years of experience with computer networks, AI systems, telecommunications, and sysadmin tasks. You know the systems used on a daily basis intimately, and can diagnose complex problems.
- The antagonist dos program gives extra fake attacking nodes to the system log.
- You can use the command line on modular computers (type \"man\" for a list).", + "Experienced" = "You have years of experience with computer networks, AI systems, telecommunications, and sysadmin tasks. You know the systems used on a daily basis intimately, and can diagnose complex problems.
- The antagonist dos program gives extra fake attacking nodes to the system log.", "Master" = "People are probably starting to wonder whether you might be a computer yourself. Computer code is your first language; you relate to AIs as easily as (probably more easily than) organics. You could build a telecommunications network from the ground up.") // Category: Service @@ -336,3 +336,13 @@ GLOBAL_LIST_EMPTY(skills) "Trained" = "You can accurately measure out reagents, grind powders, and perform chemical reactions. You may still lose some product on occasion, but are unlikely to endanger yourself or those around you.
- You can fully operate the chem dispenser.", "Experienced" = "You work as a chemist, or else you are a doctor with training in chemistry. If you are a research chemist, you can create most useful chemicals; if you are a pharmacist, you can make most medications. At this stage, you're working mostly by-the-book. You can weaponize your chemicals by making grenades, smoke bombs, and similar devices.
- You can examine held containers for scannable reagents.", "Master" = "You specialized in chemistry or pharmaceuticals; you are either a medical researcher or professional chemist. You can create custom mixes and make even the trickiest of medications easily. You understand how your pharmaceuticals interact with the bodies of your patients. You are probably the originator of at least one new chemical innovation.
- You can examine held containers for all reagents.") + +/singleton/hierarchy/skill/medical/chemistry/virology + ID = "virology" + name = "Virology" + desc = "Virology requires a specialist to have not only a deep knowledge of viruses, but also the ability to work with them, similar to how a chemist works with chemicals. This means not only understanding chemical reactions and their effects, but also knowing how these reactions will affect the human body. Thus, a virologist must have not only knowledge of virology, but also medical skills. An analogy can be drawn with a medical chemist, who must have experience working with chemicals and understand what effect they will have in order to use them safely in medicine." + levels = list( "Unskilled" = "You know that virologist work with viruses; you know that they can be very dangerous. You probably know basic defence against viruses..", + "Trained" = "You can engeener viruses. You have some training in safety and you won't infect yourself while work... probably. You can almost safely use the virologist equipment.") + prerequisites = list(SKILL_CHEMISTRY = SKILL_TRAINED) + default_max = SKILL_BASIC + difficulty = SKILL_AVERAGE diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index eb57b68aa22f3..34491246d9062 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -171,6 +171,7 @@ var/datum/supply_order/O = new /datum/supply_order() O.ordernum = SSsupply.ordernum + O.timestamp = stationtime2text() O.object = P O.orderedby = idname O.reason = reason @@ -230,9 +231,24 @@ return 1 + if(href_list["order_back_to_pending"]) + var/id = text2num(href_list["order_back_to_pending"]) + var/datum/supply_order/SO = find_order_by_id(id, SSsupply.shoppinglist) + if(SO) + SSsupply.requestlist += SO + SSsupply.shoppinglist -= SO + SSsupply.points += SO.object.cost + + else + to_chat(user, SPAN_WARNING("Could not find order number [id] to move back to pending.")) + + return 1 + if(href_list["deny_order"]) var/id = text2num(href_list["deny_order"]) var/datum/supply_order/SO = find_order_by_id(id, SSsupply.requestlist) + if(alert(user, "Are you sure?", "Deny Order", "Yes", "No") != "Yes") + return 1 if(SO) SSsupply.requestlist -= SO else @@ -243,6 +259,8 @@ if(href_list["cancel_order"]) var/id = text2num(href_list["cancel_order"]) var/datum/supply_order/SO = find_order_by_id(id, SSsupply.shoppinglist) + if(alert(user, "Are you sure?", "Cancel Order", "Yes", "No") != "Yes") + return 1 if(SO) SSsupply.shoppinglist -= SO SSsupply.points += SO.object.cost @@ -254,6 +272,8 @@ if(href_list["delete_order"]) var/id = text2num(href_list["delete_order"]) var/datum/supply_order/SO = find_order_by_id(id, SSsupply.donelist) + if(alert(user, "Are you sure?", "Delete Order", "Yes", "No") != "Yes") + return 1 if(SO) SSsupply.donelist -= SO else @@ -358,6 +378,7 @@ /datum/nano_module/supply/proc/order_to_nanoui(datum/supply_order/SO, list_id) return list(list( "id" = SO.ordernum, + "time" = SO.timestamp, "object" = SO.object.name, "orderer" = SO.orderedby, "cost" = SO.object.cost, @@ -378,6 +399,7 @@ var/t = "" t += "

[GLOB.using_map.station_name] Supply Requisition Reciept


" t += "INDEX: #[O.ordernum]
" + t += "TIME: [O.timestamp]
" t += "REQUESTED BY: [O.orderedby]
" t += "RANK: [O.orderedrank]
" t += "REASON: [O.reason]
" diff --git a/code/modules/modular_computers/file_system/reports/crew_record.dm b/code/modules/modular_computers/file_system/reports/crew_record.dm index b11394bb97af8..75d942282ce2d 100644 --- a/code/modules/modular_computers/file_system/reports/crew_record.dm +++ b/code/modules/modular_computers/file_system/reports/crew_record.dm @@ -64,6 +64,19 @@ GLOBAL_VAR_INIT(arrest_security_status, "Arrest") set_medRecord((H && H.med_record && !jobban_isbanned(H, "Records") ? html_decode(H.med_record) : "No record supplied")) if(H) + if (H.HasTrait(/singleton/trait/malus/allergy)) + var/list/allergies = H.GetMetaOptions(/singleton/trait/malus/allergy) + var/list/allergy_data = list() + var/severity + for (var/datum/reagent/picked as anything in allergies) + severity = allergies[picked] + if (isnull(severity)) + continue + severity = LetterizeSeverity(severity) + allergy_data += "[severity] allergy to [initial(picked.name)]" + set_allergies(LAZYLEN(allergy_data)? jointext(allergy_data, "\[*\]") : "No allergies on record") + + if(H.isSynthetic()) var/organ_data = list("Fully synthetic body") for(var/obj/item/organ/internal/augment/A in H.internal_organs) @@ -219,6 +232,7 @@ FIELD_LONG("General Notes (Public)", public_record, null, access_bridge) FIELD_LIST("Blood Type", bloodtype, GLOB.blood_types, access_medical, access_medical) FIELD_LONG("Medical Record", medRecord, access_medical, access_medical) FIELD_LONG("Known Implants", implants, access_medical, access_medical) +FIELD_LONG("Allergies", allergies, access_medical, access_medical) // SECURITY RECORDS FIELD_LIST("Criminal Status", criminalStatus, GLOB.security_statuses, access_security, access_security) diff --git a/code/modules/modular_computers/terminal/commands/hwinfo.dm b/code/modules/modular_computers/terminal/commands/hwinfo.dm index 2393a6788dbb7..c68c75f7c3bb5 100644 --- a/code/modules/modular_computers/terminal/commands/hwinfo.dm +++ b/code/modules/modular_computers/terminal/commands/hwinfo.dm @@ -7,7 +7,7 @@ "If device is specified by name, runs diagnostic tests." ) pattern = "^hwinfo" - skill_needed = SKILL_TRAINED + skill_needed = SKILL_BASIC /datum/terminal_command/hwinfo/proper_input_entered(text, mob/user, datum/terminal/terminal) var/command = copytext(text, 1, length(name) + 2) diff --git a/code/modules/modular_computers/terminal/commands/ifconfig.dm b/code/modules/modular_computers/terminal/commands/ifconfig.dm index 2336389d1d859..efa077d24c5da 100644 --- a/code/modules/modular_computers/terminal/commands/ifconfig.dm +++ b/code/modules/modular_computers/terminal/commands/ifconfig.dm @@ -8,7 +8,7 @@ "Returns network adaptor information." ) pattern = "^ifconfig" - skill_needed = SKILL_EXPERIENCED + skill_needed = SKILL_BASIC /datum/terminal_command/ifconfig/proper_input_entered(text, mob/user, datum/terminal/terminal) var/command = copytext(text, 1, length(name) + 2) diff --git a/code/modules/modular_computers/terminal/commands/log.dm b/code/modules/modular_computers/terminal/commands/log.dm index f314884bd7e47..371c9e2add81c 100644 --- a/code/modules/modular_computers/terminal/commands/log.dm +++ b/code/modules/modular_computers/terminal/commands/log.dm @@ -8,7 +8,7 @@ ) pattern = "^log" req_access = list(list(access_network, access_network_admin)) - skill_needed = SKILL_EXPERIENCED + skill_needed = SKILL_TRAINED /datum/terminal_command/log/proper_input_entered(text, mob/user, datum/terminal/terminal) var/argument = copytext(text, length(name) + 2, 0) diff --git a/code/modules/modular_computers/terminal/commands/status.dm b/code/modules/modular_computers/terminal/commands/status.dm index ceb6829def952..d59d6fd4a6442 100644 --- a/code/modules/modular_computers/terminal/commands/status.dm +++ b/code/modules/modular_computers/terminal/commands/status.dm @@ -8,7 +8,7 @@ ) pattern = "^status$" req_access = list(list(access_network, access_network_admin)) - skill_needed = SKILL_EXPERIENCED + skill_needed = SKILL_BASIC /datum/terminal_command/status/proper_input_entered(text, mob/user, datum/terminal/terminal) if(!terminal.computer.get_ntnet_status()) diff --git a/code/modules/modular_computers/terminal/commands/sysnotify.dm b/code/modules/modular_computers/terminal/commands/sysnotify.dm index daf4a7ec90432..ef427f34001b3 100644 --- a/code/modules/modular_computers/terminal/commands/sysnotify.dm +++ b/code/modules/modular_computers/terminal/commands/sysnotify.dm @@ -6,7 +6,7 @@ "Triggers a system notification showing the specified message, along with an audio alert." ) pattern = "^sysnotify" - skill_needed = SKILL_MASTER + skill_needed = SKILL_EXPERIENCED /datum/terminal_command/sysnotify/proper_input_entered(text, mob/user, datum/terminal/terminal) var/argument = copytext(text, length(name) + 2, 0) diff --git a/code/modules/modular_computers/terminal/terminal.dm b/code/modules/modular_computers/terminal/terminal.dm index b92a8813f7e2b..01b58a0ec0a2b 100644 --- a/code/modules/modular_computers/terminal/terminal.dm +++ b/code/modules/modular_computers/terminal/terminal.dm @@ -67,6 +67,8 @@ var/input = sanitize(href_list["input"]) history += "> [input]" var/output = parse(input, usr) + log_computer_command("[key_name(usr)]: [input]") + computer_log_repository.store_computer_log(usr, get_turf(computer.holder), input) if(QDELETED(src)) // Check for exit. return TOPIC_HANDLED history += output diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index 0126675703b1d..d772f4eb7edbd 100644 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -34,6 +34,10 @@ z_flags = ZM_MIMIC_DEFAULTS | ZM_MIMIC_OVERWRITE | ZM_MIMIC_NO_AO | ZM_ALLOW_ATMOS +/turf/simulated/open/Initialize() + . = ..() + set_extension(src, /datum/extension/support_lattice) + /turf/simulated/open/update_dirt() return 0 @@ -64,45 +68,10 @@ return TRUE /turf/simulated/open/use_tool(obj/item/C, mob/living/user, list/click_params) - if (istype(C, /obj/item/stack/material/rods)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return L.use_tool(C, user) - var/obj/item/stack/material/rods/R = C - if (!R.can_use(1)) - USE_FEEDBACK_STACK_NOT_ENOUGH(R, 1, "to lay down support lattice.") - return TRUE - to_chat(user, SPAN_NOTICE("You lay down the support lattice.")) - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - new /obj/structure/lattice(locate(src.x, src.y, src.z), R.material.name) - return TRUE - - if (istype(C, /obj/item/stack/tile)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(!L) - to_chat(user, SPAN_WARNING("The plating is going to need some support.")) - return TRUE - - var/obj/item/stack/tile/floor/S = C - if (!S.can_use(1)) - USE_FEEDBACK_STACK_NOT_ENOUGH(S, 1, "to plate the lattice.") - return TRUE - - qdel(L) - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - ChangeTurf(/turf/simulated/floor/plating, keep_air = TRUE) + var/datum/extension/support_lattice/sl = get_extension(src, /datum/extension/support_lattice) + if (sl.try_construct(C, user)) return TRUE - //To lay cable. - if(isCoil(C)) - var/obj/item/stack/cable_coil/coil = C - coil.PlaceCableOnTurf(src, user) - return TRUE - - for(var/atom/movable/M in below) - if(M.movable_flags & MOVABLE_FLAG_Z_INTERACT) - return C.resolve_attackby(M, user) - return ..() /turf/simulated/open/attack_hand(mob/user) diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index fe780df31e673..d57d78e5202be 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -163,9 +163,9 @@ return ..() -/atom/movable/openspace/mimic/can_use_item(obj/item/tool, mob/user, click_params) - USE_FEEDBACK_FAILURE("\The [src] is too far away.") - return FALSE +/atom/movable/openspace/mimic/use_tool(obj/item/tool, mob/user, list/click_params) + SHOULD_CALL_PARENT(FALSE) + return tool.resolve_attackby(loc, user, click_params) /atom/movable/openspace/mimic/attack_hand(mob/user) to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 3948e2c8232ba..82f2e4a751eb3 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -128,7 +128,7 @@ if (href_list["language"] && (flags & APPEARANCE_LANG)) if (href_list["language_mode"] == "add") - if ((~flags & APPEARANCE_LANG_ANY_NUMBER) && length(owner.languages) >= MAX_LANGUAGES) + if ((~flags & APPEARANCE_LANG_ANY_NUMBER) && length(owner.languages) >= (MAX_LANGUAGES + owner.species.additional_languages)) // SIERRA-EDIT added( + owner.species.additional_languages)) return if ((~flags & APPEARANCE_LANG_ANY_ORIGIN) && !(href_list["language"] in langs)) return diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index daf8a3fd3e345..f928671171217 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -28,7 +28,12 @@ "blood_DNA" = dna.unique_enzymes, "blood_colour" = species.get_blood_colour(src), "blood_type" = dna.b_type, - "trace_chem" = null + "trace_chem" = null, +//SIERRA-ADD VIRUSOLOGY + "virus2" = list(), + "antibodies" = list() +//SIERRA-ADD + ) B.color = B.data["blood_colour"] @@ -208,6 +213,12 @@ data["trace_chem"] = temp_chem data["dose_chem"] = chem_doses.Copy() data["blood_colour"] = species.get_blood_colour(src) +//SIERRA-ADD VIRUSOLOGY + if (!data["virus2"]) + data["virus2"] = list() + data["virus2"] |= virus_copylist(virus2) + data["antibodies"] = antibodies +//SIERRA-ADD return data /proc/blood_splatter(target,datum/reagent/blood/source,large,spray_dir) @@ -264,6 +275,11 @@ B.blood_DNA[source.data["blood_DNA"]] = source.data["blood_type"] else B.blood_DNA[source.data["blood_DNA"]] = "O+" +//SIERRA-ADD VIRUSOLOGY + // Update virus information. + if(source.data["virus2"]) + B.virus2 = virus_copylist(source.data["virus2"]) +//SIERRA-ADD B.fluorescent = ATOM_FLOURESCENCE_NONE B.set_invisibility(0) diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index 82aa857e1471d..42ebfd2c1186f 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -180,7 +180,8 @@ heal_damage(damage) /obj/item/organ/internal/proc/get_scarring_level() - . = (initial(max_damage) - max_damage)/initial(max_damage) + var/initial_max = initial(max_damage) + return (initial_max - max_damage) * 100 / initial_max /obj/item/organ/internal/get_scan_results(tag = FALSE) . = ..() diff --git a/code/modules/organs/internal/appendix.dm b/code/modules/organs/internal/appendix.dm index 38495e7c9a84d..a51b0c903340e 100644 --- a/code/modules/organs/internal/appendix.dm +++ b/code/modules/organs/internal/appendix.dm @@ -13,7 +13,12 @@ /obj/item/organ/internal/appendix/Process() ..() - if(inflamed && owner) +//[SIERRA-EDIT] + if(!owner) + return + owner.immunity = min(owner.immunity + 0.025, owner.immunity_norm) + if(inflamed) +//[SIERRA-EDIT] inflamed++ if(prob(5)) if(owner.can_feel_pain()) @@ -42,3 +47,19 @@ owner.adjustToxLoss(25) removed() qdel(src) + +//[SIERRA-ADD] +/obj/item/organ/internal/appendix/removed(mob/living/user, drop_organ=1, detach=1) + if(owner) + owner.immunity_norm -= 10 + ..() + +/obj/item/organ/internal/appendix/replaced(mob/living/carbon/human/target, obj/item/organ/external/affected) + ..() + if(owner) + owner.immunity_norm += 10 + +/obj/item/organ/internal/appendix/New(mob/living/carbon/holder) + ..() + if(owner) + owner.immunity_norm += 10 diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 90b20bde75902..73e8f1419fd97 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -270,7 +270,7 @@ heal_damage(damage) /obj/item/organ/internal/brain/get_scarring_level() - . = (species.total_health - max_damage)/species.total_health + return (species.total_health - max_damage) * 100 / species.total_health /obj/item/organ/internal/brain/get_mechanical_assisted_descriptor() return "machine-interface [name]" diff --git a/code/modules/organs/internal/species/ipc.dm b/code/modules/organs/internal/species/ipc.dm index 2b5bd2aa57ab1..be0478341ea42 100644 --- a/code/modules/organs/internal/species/ipc.dm +++ b/code/modules/organs/internal/species/ipc.dm @@ -79,6 +79,40 @@ return start_search(user) + +/obj/item/organ/internal/posibrain/use_tool(obj/item/item, mob/living/user, list/click_params) + if (istype(item, /obj/item/stack/nanopaste)) + if (!damage) + to_chat(user, SPAN_WARNING("\The [src] has no damage to repair.")) + return TRUE + + if (HAS_FLAGS(status, ORGAN_DEAD)) + to_chat(user, SPAN_WARNING("\The [src] is damaged beyond repair.")) + return TRUE + + if (!user.skill_check(SKILL_DEVICES, SKILL_EXPERIENCED)) + to_chat(user, SPAN_WARNING("You don't know how to fix \the [src].")) + return TRUE + + var/obj/item/stack/paste = item + + if (!paste.use(1)) + USE_FEEDBACK_STACK_NOT_ENOUGH(paste, 1, "to repair \the [src]") + return TRUE + + to_chat(user, SPAN_NOTICE("You begin to repair \the [src].")) + if (!do_after(user, 2 SECOND, src, DO_REPAIR_CONSTRUCT) || !user.use_sanity_check(src, item)) + return TRUE + + damage -= 10 + visible_message( + SPAN_NOTICE("\The [user] repairs some of \the [src]'s damage with \a [item]."), + SPAN_NOTICE("You repair some of \the [src]'s damage with \the [item].") + ) + return TRUE + . = ..() + + /obj/item/organ/internal/posibrain/proc/start_search(mob/user) if (!brainmob) return diff --git a/code/modules/overmap/exoplanets/_exoplanet.dm b/code/modules/overmap/exoplanets/_exoplanet.dm index e45f1bd1161d7..36d8cab2fc6e4 100644 --- a/code/modules/overmap/exoplanets/_exoplanet.dm +++ b/code/modules/overmap/exoplanets/_exoplanet.dm @@ -134,10 +134,6 @@ GLOBAL_VAR(planet_repopulation_disabled) generate_features() for (var/datum/exoplanet_theme/T in themes) T.after_map_generation(src) - //[SIERRA-ADD] - ANOMALIES - if(can_spawn_anomalies) - generate_anomalies() - //[SIERRA-ADD] generate_landing(2) update_biome() generate_daycycle() @@ -357,11 +353,12 @@ GLOBAL_VAR(planet_repopulation_disabled) if (LAZYLEN(spawned_features) && user.skill_check(SKILL_SCIENCE, SKILL_TRAINED)) var/ruin_num = 0 + var/inaccuracy = rand(-2,2) for (var/datum/map_template/ruin/exoplanet/R in spawned_features) if (!(R.ruin_tags & RUIN_NATURAL)) ruin_num++ if (ruin_num) - extra_data += "
[ruin_num] possible artificial structure\s detected." + extra_data += "
Approximately [max(1, ruin_num+inaccuracy)] possible artificial structure\s detected." for (var/datum/exoplanet_theme/T in themes) if (T.get_sensor_data()) diff --git a/code/modules/overmap/exoplanets/planet_types/chlorine.dm b/code/modules/overmap/exoplanets/planet_types/chlorine.dm index f43503fc86f80..b0386b61c91d5 100644 --- a/code/modules/overmap/exoplanets/planet_types/chlorine.dm +++ b/code/modules/overmap/exoplanets/planet_types/chlorine.dm @@ -18,7 +18,7 @@ /obj/overmap/visitable/sector/exoplanet/chlorine/get_atmosphere_color() var/air_color = ..() - return MixColors("#e5f2bd", air_color) + return MixColors(list("#e5f2bd", air_color)) /obj/overmap/visitable/sector/exoplanet/chlorine/generate_atmosphere() ..() diff --git a/code/modules/overmap/exoplanets/planet_types/shrouded.dm b/code/modules/overmap/exoplanets/planet_types/shrouded.dm index 56acd2cc86c8b..42f143bc826e1 100644 --- a/code/modules/overmap/exoplanets/planet_types/shrouded.dm +++ b/code/modules/overmap/exoplanets/planet_types/shrouded.dm @@ -26,7 +26,7 @@ /obj/overmap/visitable/sector/exoplanet/shrouded/get_atmosphere_color() var/air_color = ..() - return MixColors(COLOR_BLACK, air_color) + return MixColors(list(COLOR_BLACK, air_color)) /datum/random_map/noise/exoplanet/shrouded descriptor = "shrouded exoplanet" diff --git a/code/modules/overmap/exoplanets/planet_types/volcanic.dm b/code/modules/overmap/exoplanets/planet_types/volcanic.dm index 861cb3c473fcf..159c74b37748e 100644 --- a/code/modules/overmap/exoplanets/planet_types/volcanic.dm +++ b/code/modules/overmap/exoplanets/planet_types/volcanic.dm @@ -17,7 +17,7 @@ /obj/overmap/visitable/sector/exoplanet/volcanic/get_atmosphere_color() var/air_color = ..() - return MixColors(COLOR_GRAY20, air_color) + return MixColors(list(COLOR_GRAY20, air_color)) /obj/overmap/visitable/sector/exoplanet/volcanic/generate_atmosphere() ..() diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index 211417b90dc1a..9e64788ef77c9 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -44,12 +44,14 @@ GLOBAL_LIST_EMPTY(overmap_helm_computers) /obj/machinery/computer/ship/helm/Process() ..() - if (current_operator) - if (!linked) + if (!linked) + if (current_operator) to_chat(current_operator, SPAN_DANGER("\The [src]'s controls lock up with an error flashing across the screen: Connection to vessel lost!")) set_operator(null, TRUE) - else if (!Adjacent(current_operator) || CanUseTopic(current_operator) != STATUS_INTERACTIVE || !viewing_overmap(current_operator)) - set_operator(null) + return + + if (current_operator && (!Adjacent(current_operator) || CanUseTopic(current_operator) != STATUS_INTERACTIVE || !viewing_overmap(current_operator))) + set_operator(null) if (autopilot && dx && dy) var/turf/T = locate(dx,dy,GLOB.using_map.overmap_z) diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index 8cccaa32de6f9..d71b2a2998bf9 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -6,6 +6,11 @@ machine_name = "long range shuttle console" machine_desc = "Used to control spacecraft that are designed to move between local sectors in open space." + +/obj/machinery/computer/shuttle_control/explore/is_valid_shuttle(datum/shuttle/shuttle) + return istype(shuttle, /datum/shuttle/autodock/overmap) + + /obj/machinery/computer/shuttle_control/explore/get_ui_data(datum/shuttle/autodock/overmap/shuttle) . = ..() if(istype(shuttle)) diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index cfbff879e87e9..bfddc184af1f3 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -268,7 +268,7 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) if(!SSshuttle.overmap_halted) halted = 0 -/obj/overmap/visitable/ship/Bump(atom/A) +/obj/overmap/visitable/ship/Bump(atom/A, called) if(istype(A,/turf/unsimulated/map/edge)) handle_wraparound() ..() diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm index 4b0a88ab4739b..3129825d093d4 100644 --- a/code/modules/paperwork/adminpaper.dm +++ b/code/modules/paperwork/adminpaper.dm @@ -164,5 +164,6 @@ if (href_list["changelanguage"]) choose_language(usr, TRUE) + generateInteractions() updateDisplay() return diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 83c740f7d7b66..a05936a1fc034 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -114,9 +114,16 @@ /obj/item/folder/envelope name = "envelope" - desc = "A thick envelope. You can't see what's inside." + desc = "A thick envelope." + icon_state = "envelope0" + var/sealed = FALSE + var/seal_stamp = "" + +/obj/item/folder/envelope/preset icon_state = "envelope_sealed" - var/sealed = 1 + sealed = TRUE + //seal_stamp = "\improper SCG Expeditionary Command rubber stamp" + seal_stamp = "\improper NanoTrasen Central Command rubber stamp" /obj/item/folder/envelope/on_update_icon() if(sealed) @@ -126,15 +133,18 @@ /obj/item/folder/envelope/examine(mob/user) . = ..() - to_chat(user, "The seal is [sealed ? "intact" : "broken"].") + if (sealed || seal_stamp) + to_chat(user, "It [sealed ? "is" : "was"] sealed with \the [seal_stamp]. The seal is [sealed ? "intact" : "broken"].") + else + to_chat(user, "It is not sealed.") /obj/item/folder/envelope/proc/sealcheck(user) var/ripperoni = alert("Are you sure you want to break the seal on \the [src]?", "Confirmation","Yes", "No") if(ripperoni == "Yes") visible_message("[user] breaks the seal on \the [src], and opens it.") - sealed = 0 + sealed = FALSE update_icon() - return 1 + return TRUE /obj/item/folder/envelope/attack_self(mob/user as mob) if(sealed) @@ -147,5 +157,12 @@ if(sealed) sealcheck(user) return TRUE + else if (istype(item, /obj/item/stamp) && !sealed) + seal_stamp = item.name + visible_message("[user] seals \the [src] with [item].") + sealed = TRUE + playsound(src, 'sound/effects/stamp.ogg', 50, 1) + update_icon() + return TRUE else return ..() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 6a27b5cb3433d..ce58d5b3ca2bd 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -158,7 +158,7 @@ if (istype(copy, /obj/item/paper/admin) && !copy_admin) // Edge case for admin faxes so that they don't show the editing form copy_type = /obj/item/paper - var/obj/item/paper/c = new copy_type(loc, copy.text, copy.name, copy.metadata ) + var/obj/item/paper/c = new copy_type(loc, copy.text, copy.name, copy.metadata, copy.language) c.color = COLOR_WHITE diff --git a/code/modules/persistence/noticeboards.dm b/code/modules/persistence/noticeboards.dm index 416a33d3474e0..a760fe3c443a5 100644 --- a/code/modules/persistence/noticeboards.dm +++ b/code/modules/persistence/noticeboards.dm @@ -197,8 +197,12 @@ . = TOPIC_HANDLED if(href_list["remove"]) - remove_paper(locate(href_list["remove"])) - add_fingerprint(user) + var/obj/item/paper = locate(href_list["remove"]) + if (paper) + remove_paper(paper) + user.put_in_any_hand_if_possible(paper) + paper.add_fingerprint(user) + add_fingerprint(user) . = TOPIC_REFRESH if(href_list["write"]) diff --git a/code/modules/power/cable_coil.dm b/code/modules/power/cable_coil.dm index a761673fcecf2..5c5cc4fee80fe 100644 --- a/code/modules/power/cable_coil.dm +++ b/code/modules/power/cable_coil.dm @@ -4,9 +4,8 @@ GLOBAL_LIST_INIT(cable_default_colors, list( "Blue" = CABLE_COLOR_BLUE, "Cyan" = CABLE_COLOR_CYAN, "Green" = CABLE_COLOR_GREEN, - "Orange" = CABLE_COLOR_ORANGE, - "Purple" = CABLE_COLOR_PINK, "Red" = CABLE_COLOR_RED, + "Orange" = CABLE_COLOR_ORANGE, "Yellow" = CABLE_COLOR_YELLOW, "White" = CABLE_COLOR_WHITE )) @@ -110,6 +109,24 @@ GLOBAL_LIST_INIT(cable_default_colors, list( return TRUE +/obj/item/stack/cable_coil/attack_self(mob/living/user) + var/list/radial = list() + for (var/color in GLOB.cable_default_colors) + radial[color] = mutable_appearance(icon, icon_state, GLOB.cable_default_colors[color]) + var/new_color = show_radial_menu(user, user, radial, require_near = TRUE, radius = 42, tooltips = TRUE, check_locs = list(src)) + if (!new_color || !user.use_sanity_check(src)) + return TRUE + var/new_color_code = GLOB.cable_default_colors[new_color] + if (get_color() == new_color_code) + return TRUE + set_color(new_color_code) + user.visible_message( + SPAN_NOTICE("\The [user] changes \the [src]'s color."), + SPAN_NOTICE("You set \the [src]'s color to '[new_color]'.") + ) + return TRUE + + /obj/item/stack/cable_coil/transfer_to(obj/item/stack/cable_coil/coil) if (!istype(coil)) return FALSE @@ -334,7 +351,7 @@ GLOBAL_LIST_INIT(cable_default_colors, list( CABLE_COLOR_YELLOW, CABLE_COLOR_GREEN, CABLE_COLOR_BLUE, - CABLE_COLOR_PINK, + CABLE_COLOR_RED, CABLE_COLOR_ORANGE, CABLE_COLOR_CYAN, CABLE_COLOR_WHITE, diff --git a/code/modules/power/cable_structure.dm b/code/modules/power/cable_structure.dm index a7da6f4e0f0c2..b4fea6580dae3 100644 --- a/code/modules/power/cable_structure.dm +++ b/code/modules/power/cable_structure.dm @@ -81,9 +81,6 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/blue color = CABLE_COLOR_BLUE -/obj/structure/cable/pink - color = CABLE_COLOR_PINK - /obj/structure/cable/orange color = CABLE_COLOR_ORANGE diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 2ea8e97817235..cd3c8df4c1252 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -508,7 +508,7 @@ update_icon(FALSE) sleep(rand(5, 15)) on = (get_status() == LIGHT_OK) - update_icon(0) + queue_icon_update(0) flickering = FALSE // ai attack - make lights flicker, because why not diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 3b6fd319d0703..5a77e0371848e 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -23,7 +23,7 @@ active = TRUE move(1) -/obj/accelerated_particle/Bump(atom/A) +/obj/accelerated_particle/Bump(atom/A, called) if (!active) return if (A) @@ -50,7 +50,7 @@ if (!active) return if(ismob(A)) - Bump(A) + Bump(A, TRUE) /obj/accelerated_particle/ex_act(severity) if (!active) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 9fd15cca03bc3..e714e91611f01 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -70,7 +70,7 @@ /obj/singularity/bullet_act(obj/item/projectile/P) return 0 //Will there be an impact? Who knows. Will we see it? No. -/obj/singularity/Bump(atom/A) +/obj/singularity/Bump(atom/A, called) consume(A) /obj/singularity/Bumped(atom/A) diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 9fa1367a7144a..addf4d81e3a95 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -9,7 +9,7 @@ icon_state = "term" desc = "It's an underfloor wiring terminal for power equipment." level = ATOM_LEVEL_UNDER_TILE - layer = EXPOSED_WIRE_TERMINAL_LAYER + layer = ABOVE_EXPOSED_WIRE_LAYER var/obj/item/stock_parts/power/terminal/master anchored = TRUE diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 75ba24579b11b..bbdfe62890bd6 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -17,19 +17,6 @@ var/fall_sounds = list('sound/weapons/guns/casingfall1.ogg','sound/weapons/guns/casingfall2.ogg','sound/weapons/guns/casingfall3.ogg') - -/obj/item/ammo_magazine/proc/create_initial_contents() - if(contents_initialized || !initial_ammo || !ammo_type) - return - for(var/i in 1 to initial_ammo) - stored_ammo += new ammo_type(src) - -/obj/item/ammo_magazine/proc/get_stored_ammo_count() - . = length(stored_ammo) - if(!contents_initialized) - . += initial_ammo - - /obj/item/ammo_casing/Initialize() if(ispath(projectile_type)) BB = new projectile_type(src) @@ -139,11 +126,6 @@ var/list/icon_keys = list() //keys var/list/ammo_states = list() //values - /// Determines whether or not we wait until the first time our contents are gotten to initialize contents. May lead to icon bugs if not handled delicately. - var/lazyload_contents = TRUE - /// Whether or not our contents have been initialized or not, used in lazyloaded contents. - var/contents_initialized = FALSE - /obj/item/ammo_magazine/box w_class = ITEM_SIZE_NORMAL @@ -157,8 +139,9 @@ if(isnull(initial_ammo)) initial_ammo = max_ammo - if(!lazyload_contents) - create_initial_contents() + if(initial_ammo) + for(var/i in 1 to initial_ammo) + stored_ammo += new ammo_type(src) if(caliber) LAZYINSERT(labels, caliber, 1) if(LAZYLEN(labels)) @@ -172,7 +155,7 @@ if(C.caliber != caliber) to_chat(user, SPAN_WARNING("\The [C] does not fit into \the [src].")) return TRUE - if(get_stored_ammo_count() >= max_ammo) + if(length(stored_ammo) >= max_ammo) to_chat(user, SPAN_WARNING("\The [src] is full!")) return TRUE if(!user.unEquip(C, src)) @@ -185,7 +168,6 @@ /obj/item/ammo_magazine/attack_self(mob/user) - create_initial_contents() if(!length(stored_ammo)) to_chat(user, SPAN_NOTICE("[src] is already empty!")) return @@ -199,7 +181,6 @@ /obj/item/ammo_magazine/attack_hand(mob/user) if(user.get_inactive_hand() == src) - create_initial_contents() if(!length(stored_ammo)) to_chat(user, SPAN_NOTICE("[src] is already empty!")) else @@ -233,12 +214,11 @@ icon_state = initial(icon_state) if(multiple_sprites) - //find the lowest key greater than or equal to our ammo count + //find the lowest key greater than or equal to length(stored_ammo) var/new_state = null - var/self_ammo_count = get_stored_ammo_count() for(var/idx in 1 to length(icon_keys)) - var/icon_ammo_count = icon_keys[idx] - if (icon_ammo_count >= self_ammo_count) + var/ammo_count = icon_keys[idx] + if (ammo_count >= length(stored_ammo)) new_state = ammo_states[idx] break icon_state = (new_state)? new_state : initial(icon_state) @@ -246,8 +226,7 @@ /obj/item/ammo_magazine/examine(mob/user) . = ..() - var/self_ammo_count = get_stored_ammo_count() - to_chat(user, "There [(self_ammo_count == 1)? "is" : "are"] [self_ammo_count] round\s left!") + to_chat(user, "There [(length(stored_ammo) == 1)? "is" : "are"] [length(stored_ammo)] round\s left!") //magazine icon state caching diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 476a80b918514..8b99c3eca519b 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -80,7 +80,6 @@ /obj/item/ammo_magazine/shotholder/attack_hand(mob/user) if((user.a_intent == I_HURT) && (length(stored_ammo))) - create_initial_contents() var/obj/item/ammo_casing/C = stored_ammo[length(stored_ammo)] stored_ammo-=C user.put_in_hands(C) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index f02aba7877412..fe797006d15e2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -139,11 +139,6 @@ if(scope_zoom) verbs += /obj/item/gun/proc/scope -/obj/item/gun/update_twohanding() - if(one_hand_penalty) - update_icon() // In case item_state is set somewhere else. - ..() - /obj/item/gun/on_update_icon() var/mob/living/M = loc ClearOverlays() @@ -234,11 +229,8 @@ else Fire(target, user, pointblank = TRUE) return TRUE - // Point blank shooting if (user.a_intent == I_HURT && !user.isEquipped(target)) - if (safety()) // Pistol whip instead of unsafety+fire - return ..() Fire(target, user, pointblank = TRUE) return TRUE @@ -338,7 +330,7 @@ flick(fire_anim, src) if (user) - var/user_message = SPAN_WARNING("You fire \the [src][pointblank ? " point blank":""] at \the [target][reflex ? " by reflex" : ""]!") + var/user_message = SPAN_DANGER("You fire \the [src][pointblank ? " point blank":""] at \the [target][reflex ? " by reflex" : ""]!") if (silenced) to_chat(user, user_message) else diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 5130aab4d790e..a2177b021e23a 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -94,7 +94,6 @@ icon_state = "[modifystate][ratio]" else icon_state = "[initial(icon_state)][ratio]" - update_held_icon() /obj/item/gun/energy/handle_post_fire(mob/user, atom/target, pointblank, reflex, obj/projectile) ..() diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index c37872d18e4b0..5923dae8043d4 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -137,14 +137,14 @@ item_state = "laser" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4) projectile_type = /obj/item/projectile/beam/sniper - one_hand_penalty = 5 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. + one_hand_penalty = 8 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. slot_flags = SLOT_BACK charge_cost = 40 max_shots = 8 - fire_delay = 35 + fire_delay = 30 force = 10 w_class = ITEM_SIZE_HUGE - accuracy = -2 //shooting at the hip + accuracy = -4 //shooting at the hip scoped_accuracy = 9 scope_zoom = 2 wielded_item_state = "gun_wielded" diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 23d913aec227a..f2b0f0cce4051 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -152,8 +152,6 @@ icon_state = "pneumatic" item_state = "pneumatic" - update_held_icon() - /obj/item/gun/launcher/pneumatic/small name = "small pneumatic cannon" desc = "It looks smaller than your garden variety cannon." diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 524d7a1a0ecf2..5be3f7ee1d31a 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -56,13 +56,15 @@ /obj/item/gun/magnetic/Process() if(capacitor) + var/prior_charge = capacitor.charge if(cell) if(capacitor.charge < capacitor.max_charge && cell.checked_use(power_per_tick)) capacitor.charge(power_per_tick) else if(capacitor) capacitor.use(capacitor.charge * 0.05) - update_icon() + if (capacitor.charge != prior_charge) + update_icon() /obj/item/gun/magnetic/on_update_icon() ..() diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm index a5a846eabea89..048dda5383fb7 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm @@ -62,15 +62,13 @@ icon = 'icons/obj/guns/railgun_old.dmi' icon_state = "old_railgun" -/obj/item/gun/magnetic/railgun/tcc // Oppa! Should only be available to TCC shock troops or high-budget mercs. +// Oppa! Should only be available to TCC shock troops or high-budget mercs. +/obj/item/gun/magnetic/railgun/tcc name = "advanced railgun" desc = "The HelTek Arms HR-22 Hammerhead. A man-portable helical rail cannon; favorite weapon of Terran shock troops and anti-tank personnel." icon = 'icons/obj/guns/railgun_adv.dmi' icon_state = "railgun-tcc" - removable_components = TRUE // Railgunners are expected to be able to completely disassemble and reassemble their weapons in the field. But we don't have that mechanic, so the cell and capacitor will do. - cell = /obj/item/cell/hyper // Standard power - capacitor = /obj/item/stock_parts/capacitor/adv // 6-8 shots power_cost = 280 // Same number of shots, but it'll seem to recharge slightly faster loaded = /obj/item/stack/material/rods diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 358b84541b8b6..2321283af05ce 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -73,16 +73,10 @@ chambered = loaded[1] //load next casing. if(handle_casings != HOLD_CASINGS) loaded -= chambered - else if(ammo_magazine) - if(!ammo_magazine.contents_initialized && ammo_magazine.initial_ammo > 0) - chambered = new ammo_magazine.ammo_type(src) - if(handle_casings == HOLD_CASINGS) - ammo_magazine.stored_ammo += chambered - ammo_magazine.initial_ammo-- - else if(ammo_magazine && length(ammo_magazine.stored_ammo)) - chambered = ammo_magazine.stored_ammo[length(ammo_magazine.stored_ammo)] - if(handle_casings != HOLD_CASINGS) - ammo_magazine.stored_ammo -= chambered + else if(ammo_magazine && length(ammo_magazine.stored_ammo)) + chambered = ammo_magazine.stored_ammo[length(ammo_magazine.stored_ammo)] + if(handle_casings != HOLD_CASINGS) + ammo_magazine.stored_ammo -= chambered if (chambered) return chambered.BB @@ -321,7 +315,7 @@ /obj/item/gun/projectile/afterattack(atom/A, mob/living/user) ..() - if(auto_eject && ammo_magazine && !ammo_magazine.get_stored_ammo_count()) + if(auto_eject && ammo_magazine && ammo_magazine.stored_ammo && !length(ammo_magazine.stored_ammo)) ammo_magazine.dropInto(user.loc) user.visible_message( "[ammo_magazine] falls out and clatters on the floor!", @@ -348,8 +342,8 @@ var/bullets = 0 if(loaded) bullets += length(loaded) - if(ammo_magazine) - bullets += ammo_magazine.get_stored_ammo_count() + if(ammo_magazine && ammo_magazine.stored_ammo) + bullets += length(ammo_magazine.stored_ammo) if(chambered) bullets += 1 return bullets diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 0764fb9f2cf6b..9d566499e507d 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -246,7 +246,7 @@ /obj/item/gun/projectile/automatic/bullpup_rifle/on_update_icon() ..() if(ammo_magazine) - if(length(ammo_magazine.get_stored_ammo_count())) + if(length(ammo_magazine.stored_ammo)) icon_state = "carbine-loaded" else icon_state = "carbine-empty" @@ -351,7 +351,7 @@ /obj/item/gun/projectile/automatic/l6_saw/on_update_icon() ..() if(istype(ammo_magazine, /obj/item/ammo_magazine/box)) - icon_state = "l6[cover_open ? "open" : "closed"][round(length(ammo_magazine.get_stored_ammo_count()), 10)]" + icon_state = "l6[cover_open ? "open" : "closed"][round(length(ammo_magazine.stored_ammo), 10)]" item_state = "l6[cover_open ? "open" : "closed"]" wielded_item_state = "l6[cover_open ? "open" : "closed"]-wielded" else if(ammo_magazine) diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index dd80f273617f2..bb29b584eaba4 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -81,12 +81,12 @@ icon_state = "dartgun-empty" return 1 - if(!ammo_magazine.get_stored_ammo_count() || length(ammo_magazine.get_stored_ammo_count())) + if(!ammo_magazine.stored_ammo || length(ammo_magazine.stored_ammo)) icon_state = "dartgun-0" - else if(length(ammo_magazine.get_stored_ammo_count()) > 5) + else if(length(ammo_magazine.stored_ammo) > 5) icon_state = "dartgun-5" else - icon_state = "dartgun-[length(ammo_magazine.get_stored_ammo_count())]" + icon_state = "dartgun-[length(ammo_magazine.stored_ammo)]" return 1 /obj/item/gun/projectile/dartgun/consume_next_projectile() @@ -166,8 +166,8 @@ dat += " \[Eject\]
" if(ammo_magazine) - if(ammo_magazine.stored_ammo && length(ammo_magazine.get_stored_ammo_count())) - dat += "The dart cartridge has [length(ammo_magazine.get_stored_ammo_count())] shots remaining." + if(ammo_magazine.stored_ammo && length(ammo_magazine.stored_ammo)) + dat += "The dart cartridge has [length(ammo_magazine.stored_ammo)] shots remaining." else dat += SPAN_COLOR("red", "The dart cartridge is empty!") dat += " \[Eject\]
" diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 1f5a969eb38bd..60f2ab317ace3 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -6,7 +6,7 @@ /obj/item/gun/projectile/shotgun/pump name = "shotgun" - desc = "A mass-produced shotgun by Mars Security Industries. The rugged ZX-870 'Bulldog' is common throughout most frontier worlds. Useful for sweeping alleys or ship corridors." + desc = "A mass-produced shotgun by Mars Security Industries. The rugged MSI-870 'Crawford' is a common sight across much of settled space. Useful for sweeping alleys or ship corridors." icon = 'icons/obj/guns/shotguns.dmi' icon_state = "shotgun" item_state = "shotgun" @@ -158,7 +158,7 @@ /obj/item/gun/projectile/shotgun/pump/sawn name = "riot shotgun" - desc = "A mass-produced shotgun by Mars Security Industries. The rugged ZX-870 'Bulldog' is common throughout most frontier worlds. This one has had its stock cut off..." + desc = "A mass-produced shotgun by Mars Security Industries. The rugged MSI-870 is a common sight across much of settled space. MSI sells its own 'riot' configuration as the 870 'Bateman'." icon = 'icons/obj/guns/shotguns.dmi' icon_state = "rshotgun" item_state = "rshotgun" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b5d833f685e1b..7d77c7852a038 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -60,7 +60,7 @@ var/space_knockback = 0 //whether or not it will knock things back in space var/hitscan = FALSE // whether the projectile should be hitscan - var/step_delay = 1 // the delay between iterations if not a hitscan projectile + var/step_delay = 0.65 // the delay between iterations if not a hitscan projectile // effect types to be used var/muzzle_type @@ -295,13 +295,13 @@ return 1 -/obj/item/projectile/Bump(atom/atom, forced) +/obj/item/projectile/Bump(atom/atom, called) if (atom == src) return FALSE if (atom == firer) forceMove(atom.loc) return FALSE - if (bumped && !forced || (atom in permutated)) + if (bumped && !called || (atom in permutated)) return FALSE bumped = TRUE var/passthrough @@ -377,7 +377,7 @@ if(!bumped && !isturf(original)) if(loc == get_turf(original)) if(!(original in permutated)) - if(Bump(original)) + if(Bump(original, TRUE)) return if(first_step) @@ -458,7 +458,7 @@ var/result = 0 //To pass the message back to the gun. var/atom/hit_thing -/obj/item/projectile/test/Bump(atom/A as mob|obj|turf|area, forced=0) +/obj/item/projectile/test/Bump(atom/A, called) if(A == firer) forceMove(A.loc) return //cannot shoot yourself diff --git a/code/modules/projectiles/projectile/animate.dm b/code/modules/projectiles/projectile/animate.dm index d4da278085574..6fd68ae597031 100644 --- a/code/modules/projectiles/projectile/animate.dm +++ b/code/modules/projectiles/projectile/animate.dm @@ -6,7 +6,7 @@ nodamage = TRUE damage_flags = 0 -/obj/item/projectile/animate/Bump(atom/change, forced=0) +/obj/item/projectile/animate/Bump(atom/change, called) if((istype(change, /obj/item) || istype(change, /obj/structure)) && !is_type_in_list(change, GLOB.mimic_protected)) var/obj/O = change new /mob/living/simple_animal/hostile/mimic/(O.loc, O, firer) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 3cf5d2d2c4d94..dbea958413f73 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -223,8 +223,9 @@ name = "sniper beam" icon_state = "xray" fire_sound = 'sound/weapons/marauder.ogg' - damage = 35 + damage = 60 armor_penetration = 10 + distance_falloff = 0.5 damage_falloff_list = null muzzle_type = /obj/projectile/laser/xray/muzzle diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 8642989a60cea..0d5b4c6d015c4 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -119,7 +119,7 @@ if(. && !base_spread && isturf(loc)) for(var/mob/living/M in loc) if(M.lying || !M.CanPass(src, loc, 0.5, 0)) //Bump if lying or if we would normally Bump. - if(Bump(M)) //Bump will make sure we don't hit a mob multiple times + if(Bump(M, TRUE)) //Bump will make sure we don't hit a mob multiple times return /* short-casing projectiles, like the kind used in pistols or SMGs */ diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 536d227903052..6fa03c8ec40b5 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -40,7 +40,7 @@ damage_type = DAMAGE_BRUTE nodamage = TRUE -/obj/item/projectile/meteor/Bump(atom/A as mob|obj|turf|area, forced=0) +/obj/item/projectile/meteor/Bump(atom/A, called) if(A == firer) forceMove(A.loc) return diff --git a/code/modules/psionics/mob/mob.dm b/code/modules/psionics/mob/mob.dm index 69a57fd663875..e059eb0d2bd23 100644 --- a/code/modules/psionics/mob/mob.dm +++ b/code/modules/psionics/mob/mob.dm @@ -13,10 +13,10 @@ . = ..() /mob/living/proc/set_psi_rank(faculty, rank, take_larger, defer_update, temporary) - if(!src.zone_sel) - to_chat(src, SPAN_NOTICE("You feel something strange brush against your mind... but your brain is not able to grasp it.")) - return if(!psi) + if(!zone_sel) + to_chat(src, SPAN_NOTICE("You feel something strange brush against your mind... but your brain is not able to grasp it.")) + return psi = new(src) var/current_rank = psi.get_rank(faculty) if(current_rank != rank && (!take_larger || current_rank < rank)) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 54d14dab730b7..83f05e88d368b 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -7,6 +7,10 @@ "blood_colour" = COLOR_BLOOD_HUMAN, "trace_chem" = null, "dose_chem" = null, + //[SIERRA-ADD] VIRUSOLOGY + "virus2" = list(), + "antibodies" = list(), + //[/SIERRA-ADD] VIRUSOLOGY "has_oxy" = 1 ) name = "Blood" @@ -41,6 +45,15 @@ /datum/reagent/blood/get_data() // Just in case you have a reagent that handles data differently. var/t = data.Copy() +//SIERRA ADD VIRUSOLOGY + if(t["virus2"]) + var/list/v = t["virus2"] + t["virus2"] = v.Copy() + + if(t["antibodies"])//... and curing + var/list/v = t["antibodies"] + t["antibodies"] |= v.Copy() +//SIERRA ADD return t /datum/reagent/blood/touch_turf(turf/simulated/T) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drinks.dm index 12a501aeeff32..30b60c203b6fc 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drinks.dm @@ -239,7 +239,7 @@ /datum/reagent/drink/thoom name = "Th'oom Juice" - description = "A thick off-white fluid expressed from the juice glands of the Skrellian Th'oom." + description = "A thick, off-white drink themed around the elusive skrellian Th'oom. Despite the name, no one is really sure what's in this." taste_description = "thick, sweet, and savory ... milk?" color = "#baeece" glass_name = "th'oom juice" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 53cee3af9f918..f874f0d22ed7c 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -299,6 +299,9 @@ if(boozed) M.add_chemical_effect(CE_ALCOHOL_TOXIC, 1) M.add_chemical_effect(CE_BREATHLOSS, 0.1 * boozed) //drinking and opiating makes breathing kinda hard + if(isfast(M)) + M.add_chemical_effect(CE_BREATHLOSS, 0.5) + M.add_chemical_effect(CE_SLOWDOWN, 2) //hyperzine reacts negatively with opiates /datum/reagent/tramadol/overdose(mob/living/carbon/M) ..() @@ -308,6 +311,10 @@ M.add_chemical_effect(CE_BREATHLOSS, 0.6) //Have trouble breathing, need more air if(isboozed(M)) M.add_chemical_effect(CE_BREATHLOSS, 0.2) //Don't drink and OD on opiates folks + if(isfast(M)) + M.add_chemical_effect(CE_NOPULSE, 1) + var/obj/item/organ/internal/heart = M.internal_organs_by_name[BP_HEART] //heart damage + arrest + heart.take_internal_damage(heart.max_damage * 0.045) /datum/reagent/tramadol/proc/isboozed(mob/living/carbon/M) . = 0 @@ -321,6 +328,16 @@ if(booze.strength < 40) //liquor stuff hits harder return 2 +/datum/reagent/tramadol/proc/isfast(mob/living/carbon/M) + . = FALSE + var/datum/reagents/ingested = M.get_ingested_reagents() + if(!ingested) + return FALSE + var/list/pool = M.reagents.reagent_list | ingested.reagent_list + for(var/datum/reagent/hyperzine/fast in pool) + if(M.chem_doses[fast.type]) + return TRUE + /datum/reagent/tramadol/oxycodone name = "Oxycodone" description = "An effective and very addictive painkiller. Don't mix with alcohol." @@ -488,7 +505,7 @@ /datum/reagent/hyperzine name = "Hyperzine" - description = "Hyperzine is a highly effective, long lasting, muscle stimulant." + description = "Hyperzine is a highly effective, long lasting, muscle stimulant. Do not mix with opiates!" taste_description = "acid" reagent_state = LIQUID color = "#ff3300" diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index 38ea15928277e..994ea3521bb07 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -214,7 +214,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" return TRUE /obj/item/reagent_containers/food/drinks/glass2/use_tool(obj/item/W, mob/living/user, list/click_params) - if(istype(W, /obj/item/material/kitchen/utensil/spoon)) + if(istype(W, /obj/item/material/utensil/spoon)) if(user.a_intent == I_HURT) user.visible_message(SPAN_WARNING("[user] bashes \the [src] with a spoon, shattering it to pieces! What a rube.")) playsound(src, "shatter", 30, 1) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 81f6ed9c69a18..8d96ee60217f3 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -29,9 +29,6 @@ var/trans = 0 if(ismob(target)) - if(user.a_intent == I_HELP) - return TRUE - var/time = 20 //2/3rds the time of a syringe user.visible_message(SPAN_WARNING("[user] is trying to squirt something into [target]'s eyes!")) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index fcb3c076a9c99..d5195a7b41e69 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -163,8 +163,8 @@ to_chat(user, SPAN_WARNING("\The [src] isn't open!")) return TRUE // Eating with forks - if(istype(W,/obj/item/material/kitchen/utensil)) - var/obj/item/material/kitchen/utensil/U = W + if(istype(W,/obj/item/material/utensil)) + var/obj/item/material/utensil/U = W if(U.scoop_food) if(!U.reagents) U.create_reagents(5) @@ -501,7 +501,7 @@ filling_color = "#e0d7c5" center_of_mass = "x=17;y=16" nutriment_amt = 3 - nutriment_desc = list("raw" = 2, "mushroom" = 2) + nutriment_desc = list("fleshy mushroom" = 2) bitesize = 6 /obj/item/reagent_containers/food/snacks/hugemushroomslice/Initialize() .=..() @@ -514,7 +514,7 @@ filling_color = "#db0000" center_of_mass = "x=17;y=16" nutriment_amt = 3 - nutriment_desc = list("raw" = 2, "tomato" = 3) + nutriment_desc = list("fleshy tomato" = 3) bitesize = 6 /obj/item/reagent_containers/food/snacks/bearmeat @@ -3083,7 +3083,7 @@ // Dough + rolling pin = flat dough /obj/item/reagent_containers/food/snacks/dough/use_tool(obj/item/W, mob/living/user, list/click_params) - if(istype(W,/obj/item/material/kitchen/rollingpin)) + if(istype(W,/obj/item/material/rollingpin)) new /obj/item/reagent_containers/food/snacks/sliceable/flatdough(src) to_chat(user, SPAN_NOTICE("You flatten the dough.")) qdel(src) diff --git a/code/modules/reagents/reagent_containers/ivbag.dm b/code/modules/reagents/reagent_containers/ivbag.dm index 4b705abd14d02..8ec51db5120b0 100644 --- a/code/modules/reagents/reagent_containers/ivbag.dm +++ b/code/modules/reagents/reagent_containers/ivbag.dm @@ -281,7 +281,11 @@ "blood_type" = blood_type, "trace_chem" = null, "blood_species" = blood_species, - "blood_colour" = species.blood_color + "blood_colour" = species.blood_color, +//SIERRA-ADD MODPACK VIRUSOLOGY + "virus2" = list(), + "antibodies" = list() +//SIERRA-ADD MODPACK VIRUSOLOGY )) AddLabel("[blood_species] [blood_type]") UpdateItemSize() diff --git a/code/modules/research/designs/designs_exosuits.dm b/code/modules/research/designs/designs_exosuits.dm index c568a0efed49b..4a279ae62e429 100644 --- a/code/modules/research/designs/designs_exosuits.dm +++ b/code/modules/research/designs/designs_exosuits.dm @@ -7,7 +7,7 @@ /datum/design/circuit/exosuit/engineering name = "engineering system control" id = "mech_software_engineering" - req_tech = list(TECH_DATA = 1) + req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) build_path = /obj/item/circuitboard/exosystem/engineering sort_string = "NAAAA" @@ -21,13 +21,13 @@ /datum/design/circuit/exosuit/medical name = "medical system control" id = "mech_software_medical" - req_tech = list(TECH_DATA = 3,TECH_BIO = 2) + req_tech = list(TECH_DATA = 1,TECH_BIO = 1) build_path = /obj/item/circuitboard/exosystem/medical sort_string = "NAABA" /datum/design/circuit/exosuit/weapons name = "basic weapon control" id = "mech_software_weapons" - req_tech = list(TECH_DATA = 4) + req_tech = list(TECH_DATA = 1, TECH_COMBAT = 3) build_path = /obj/item/circuitboard/exosystem/weapons sort_string = "NAACA" diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 9d9107c0383c2..fddf54cf45d26 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -9,6 +9,7 @@ unacidable = TRUE health_max = 200 damage_hitsound = 'sound/effects/EMPulse.ogg' + atmos_canpass = CANPASS_NEVER var/shield_generate_power = 7500 //how much power we use when regenerating var/shield_idle_power = 1500 //how much power we use when just being sustained. diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index 1c46fb598beae..3a8c5ba6d369b 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -342,9 +342,9 @@ var/global/list/escape_pods_by_name = list() signal.data = list( "tag" = tag_pump, "sigtype" = "command", - "set_power" = 1, // [SIERRA-ADD], was "power" = 1, - "set_direction" = "release", // [SIERRA-ADD], was "direction" = 1, "status" = TRUE, // [SIERRA-ADD], + "set_power" = 1, + "set_direction" = 1, "set_external_pressure" = ONE_ATMOSPHERE ) post_signal(signal) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 752bbd43336f3..427cc1be27630 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -7,12 +7,44 @@ machine_name = "basic shuttle console" machine_desc = "A simple control system for small spacecraft, allowing automated movement from one navigation point to another." - var/shuttle_tag // Used to coordinate data in shuttle controller. + /// Used to coordinate data in shuttle controller. Set by `sync_shuttle()`. + var/shuttle_tag var/hacked = 0 // Has been emagged, no access restrictions. var/ui_template = "shuttle_control_console.tmpl" + +/obj/machinery/computer/shuttle_control/Initialize(mapload) + . = ..() + if (!shuttle_tag) + sync_shuttle() + + +/obj/machinery/computer/shuttle_control/on_update_icon() + icon_screen = shuttle_tag ? initial(icon_screen) : "shuttle_error" + ..() + + +/// Sets `shuttle_tag` to a new value based on the computer's current area, or to `null` if the area is not a valid shuttle. +/obj/machinery/computer/shuttle_control/proc/sync_shuttle() + shuttle_tag = null + var/area/current_area = get_area(src) + for (var/shuttle_name in SSshuttle.shuttles) + var/datum/shuttle/shuttle = SSshuttle.shuttles[shuttle_name] + if (!(current_area in shuttle.shuttle_area)) + continue + if (!is_valid_shuttle(SSshuttle.shuttles[shuttle_name])) + break + shuttle_tag = shuttle_name + break + + +/// Determines whether the given shuttle datum is valid for this computer. +/obj/machinery/computer/shuttle_control/proc/is_valid_shuttle(datum/shuttle/shuttle) + return !istype(shuttle, /datum/shuttle/autodock/overmap) + + /obj/machinery/computer/shuttle_control/interface_interact(mob/user) ui_interact(user) return TRUE diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 56ff8b9b31f1f..dc9ab272f5e55 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -282,7 +282,7 @@ /// When being fed a reagent item, the amount this species eats per bite on help intent. var/ingest_amount = 10 - /// An associative list of /singleton/trait and trait level - See individual traits for valid levels + /// An associative list of /singleton/trait and trait level a species starts with by default - See individual traits for valid levels var/list/traits = list() /** @@ -431,8 +431,8 @@ The slots that you can use are found in items_clothing.dm and are the inventory post_organ_rejuvenate(O, H) H.sync_organ_dna() -/* ------------------------> code\modules\emotes\definitions\_species.dm -/datum/species/proc/hug(mob/living/carbon/human/H,mob/living/target) +/* ------------------------> code\modules\emotes\definitions\_species.dm (У нас всё в моде в mods\emote_panel\code\species.dm) +/datum/species/proc/hug(mob/living/carbon/human/H, mob/living/target) var/t_him = "them" switch(target.gender) @@ -441,8 +441,15 @@ The slots that you can use are found in items_clothing.dm and are the inventory if(FEMALE) t_him = "her" - H.visible_message(SPAN_NOTICE("[H] hugs [target] to make [t_him] feel better!"), \ - SPAN_NOTICE("You hug [target] to make [t_him] feel better!")) + // If aiming for the head, try a headpat + if (ishuman(target)) + var/target_zone = check_zone(H.zone_sel.selecting) + var/mob/living/carbon/human/h_target = target + if (target_zone == BP_HEAD && h_target.get_organ(target_zone)) + H.visible_message(SPAN_NOTICE("[H] pats [h_target]'s head to make [t_him] feel better!"), SPAN_NOTICE("You pat [h_target]'s head to make [t_him] feel better!")) + return + + H.visible_message(SPAN_NOTICE("[H] hugs [target] to make [t_him] feel better!"), SPAN_NOTICE("You hug [target] to make [t_him] feel better!")) if(H != target) H.update_personal_goal(/datum/goal/achievement/givehug, TRUE) @@ -762,6 +769,22 @@ The slots that you can use are found in items_clothing.dm and are the inventory return facial_hair_style_by_gender +/datum/species/proc/get_selectable_traits() + var/list/allowed_traits = list() + var/list/trait_list = GET_SINGLETON_SUBTYPE_LIST(/singleton/trait) + for (var/singleton/trait/allowed_trait in trait_list) + if (!allowed_trait.selectable) + continue + if (LAZYISIN(traits, allowed_trait.type)) + continue + if (LAZYISIN(allowed_trait.forbidden_species, name)) + continue + if (!allowed_trait.name) + continue + LAZYSET(allowed_traits, allowed_trait.name, allowed_trait) + + return allowed_traits + /datum/species/proc/get_description(header, append, verbose = TRUE, skip_detail, skip_photo) var/list/damage_types = list( "physical trauma" = brute_mod, diff --git a/code/modules/species/station/station.dm b/code/modules/species/station/station.dm index b0deb9d8743c9..c76d964a1e3fe 100644 --- a/code/modules/species/station/station.dm +++ b/code/modules/species/station/station.dm @@ -39,7 +39,19 @@ CULTURE_HUMAN_CETII, CULTURE_HUMAN_SPACER, CULTURE_HUMAN_OFFWORLD, - CULTURE_HUMAN_CONFEDC, + // [SIERRA-EDIT], + /*, + CULTURE_HUMAN_THEIA, + CULTURE_HUMAN_CONFED_TERRA, + CULTURE_HUMAN_CONFED_ZEMLYA, + CULTURE_HUMAN_CONFED_SESTRIS, + CULTURE_HUMAN_CONFED_PUTKARI, + CULTURE_HUMAN_CONFED_ALTAIR, + CULTURE_HUMAN_CONFED_PENGLAI, + CULTURE_HUMAN_CONFED_PROVIDENCE, + CULTURE_HUMAN_CONFED_VALY, + // [/SIERRA-EDIT], + */ CULTURE_HUMAN_CONFEDO, CULTURE_HUMAN_FOSTER, CULTURE_HUMAN_PIRXL, @@ -49,8 +61,6 @@ CULTURE_HUMAN_IOLAUS, CULTURE_HUMAN_BRAHE, CULTURE_HUMAN_EOS, - CULTURE_HUMAN_CONFEDC, - CULTURE_HUMAN_CONFEDO, CULTURE_HUMAN_GAIAN, CULTURE_HUMAN_OTHER ) diff --git a/code/modules/spells/aoe_turf/drain_blood.dm b/code/modules/spells/aoe_turf/drain_blood.dm index 43d162a9936f9..8dfa3a535ac42 100644 --- a/code/modules/spells/aoe_turf/drain_blood.dm +++ b/code/modules/spells/aoe_turf/drain_blood.dm @@ -54,7 +54,7 @@ tracer_type = /obj/projectile/blood impact_type = /obj/projectile/blood -/obj/item/projectile/beam/blood_effect/Bump(atom/a, forced=0) +/obj/item/projectile/beam/blood_effect/Bump(atom/a, called) if(a == original) on_impact(a) qdel(src) diff --git a/code/modules/spells/spell_projectile.dm b/code/modules/spells/spell_projectile.dm index 484fdf934013f..7c2c6fc83b104 100644 --- a/code/modules/spells/spell_projectile.dm +++ b/code/modules/spells/spell_projectile.dm @@ -41,7 +41,7 @@ qdel(src) return -/obj/item/projectile/spell_projectile/Bump(atom/A, forced=0) +/obj/item/projectile/spell_projectile/Bump(atom/A, called) if(loc && carried) prox_cast(carried.choose_prox_targets(user = carried.holder, spell_holder = src)) return 1 diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index d00981509bf06..06e4f52302b73 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -581,7 +581,7 @@ return /obj/machinery/power/supermatter/ex_act(severity) - ..() + // not calling parent ex_act as it has a chance to qdel the supermatter switch(severity) if(EX_ACT_DEVASTATING) power *= 4 diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index fa4f2e99006d2..deaf16f0da8e2 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -7,7 +7,7 @@ /obj/item/hemostat = 100, /obj/item/stack/cable_coil = 75, /obj/item/device/assembly/mousetrap = 10, - /obj/item/material/kitchen/utensil/fork = 75 + /obj/item/material/utensil/fork = 75 ) min_duration = 100 max_duration = 120 @@ -96,7 +96,7 @@ /obj/item/hemostat = 100, /obj/item/stack/cable_coil = 75, /obj/item/device/assembly/mousetrap = 10, - /obj/item/material/kitchen/utensil/fork = 75 + /obj/item/material/utensil/fork = 75 ) min_duration = 100 max_duration = 120 diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 5e31563d3b9dc..a26816762a457 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -208,7 +208,7 @@ /obj/item/swapper/jaws_of_life = 80, /obj/item/crowbar = 75, /obj/item/material/knife = 50, - /obj/item/material/kitchen/utensil/fork = 50 + /obj/item/material/utensil/fork = 50 ) min_duration = 30 max_duration = 40 diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 192b6e173aea7..d6a3c26502920 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -148,7 +148,7 @@ allowed_tools = list( /obj/item/hemostat = 100, /obj/item/wirecutters = 75, - /obj/item/material/kitchen/utensil/fork = 20 + /obj/item/material/utensil/fork = 20 ) min_duration = 120 max_duration = 150 diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 1a507d1d7e8d6..d25a0e9b50c97 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -149,7 +149,7 @@ /obj/item/wirecutters = 75, /obj/item/material/knife = 75, /obj/item/swapper/jaws_of_life = 50, - /obj/item/material/kitchen/utensil/fork = 20 + /obj/item/material/utensil/fork = 20 ) min_duration = 60 max_duration = 80 diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index d5b4da5e05f9b..d52a4f40333ae 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -112,7 +112,7 @@ /obj/item/retractor = 40, /obj/item/crowbar = 60, /obj/item/swapper/jaws_of_life = 80, - /obj/item/material/kitchen/utensil = 30 + /obj/item/material/utensil = 30 ) min_duration = 30 @@ -150,7 +150,7 @@ /obj/item/retractor = 40, /obj/item/crowbar = 60, /obj/item/swapper/jaws_of_life = 80, - /obj/item/material/kitchen/utensil = 30 + /obj/item/material/utensil = 30 ) min_duration = 70 @@ -629,7 +629,7 @@ allowed_tools = list( /obj/item/hemostat = 100, /obj/item/wirecutters = 75, - /obj/item/material/kitchen/utensil/fork = 20 + /obj/item/material/utensil/fork = 20 ) can_infect = 0 surgery_candidate_flags = SURGERY_NO_CRYSTAL | SURGERY_NO_FLESH | SURGERY_NO_STUMP | SURGERY_NEEDS_ENCASEMENT diff --git a/code/modules/xenoarcheaology/artifacts/gigadrill.dm b/code/modules/xenoarcheaology/artifacts/gigadrill.dm index e7eef65394fd2..017385bbe2584 100644 --- a/code/modules/xenoarcheaology/artifacts/gigadrill.dm +++ b/code/modules/xenoarcheaology/artifacts/gigadrill.dm @@ -20,7 +20,7 @@ to_chat(user, SPAN_NOTICE("You press a button and \the [src] shudders to life.")) return TRUE -/obj/machinery/giga_drill/Bump(atom/A) +/obj/machinery/giga_drill/Bump(atom/A, called) if(active && !drilling_turf) if(istype(A,/turf/simulated/mineral)) var/turf/simulated/mineral/M = A diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm index 51469cf7e8671..4c538ac117eb3 100644 --- a/code/modules/xenoarcheaology/finds/find_spawning.dm +++ b/code/modules/xenoarcheaology/finds/find_spawning.dm @@ -97,7 +97,7 @@ return INITIALIZE_HINT_QDEL /obj/item/archaeological_find/proc/spawn_item() - var/obj/item/material/kitchen/utensil/fork/F = new(loc) + var/obj/item/material/utensil/fork/F = new(loc) F.icon = 'icons/obj/xenoarchaeology_finds.dmi' F.icon_state = "unknown[rand(1,4)]" return F @@ -141,11 +141,11 @@ /obj/item/archaeological_find/cutlery/spawn_item() var/obj/item/new_item if(prob(25)) - new_item = new /obj/item/material/kitchen/utensil/fork(loc) + new_item = new /obj/item/material/utensil/fork(loc) else if(prob(50)) - new_item = new /obj/item/material/knife/table(loc) + new_item = new /obj/item/material/utensil/knife (loc) else - new_item = new /obj/item/material/kitchen/utensil/spoon(loc) + new_item = new /obj/item/material/utensil/spoon(loc) additional_desc = "[pick("It's like no [item_type] you've ever seen before",\ "It's a mystery how anyone is supposed to eat with this",\ "You wonder what the creator's mouth was shaped like")]." diff --git a/code/modules/xenoarcheaology/finds/special.dm b/code/modules/xenoarcheaology/finds/special.dm index b3a02a54bf2f5..5379a21981a1e 100644 --- a/code/modules/xenoarcheaology/finds/special.dm +++ b/code/modules/xenoarcheaology/finds/special.dm @@ -221,5 +221,5 @@ else STOP_PROCESSING(SSobj, src) -/obj/shadow_wight/Bump(atom/obstacle) +/obj/shadow_wight/Bump(atom/obstacle, called) to_chat(obstacle, SPAN_WARNING("You feel a chill run down your spine!")) diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 7bef0d3eab603..0631d2852231c 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -85,16 +85,16 @@ h1.alert, h2.alert {color: #000080;} .italic {font-style: italic;} .bold {font-weight: bold;} -.danger {color: #ff0000; font-weight: bold;} -.bigdanger {color: #ff0000; font-weight: bold; font-size: 115%;} -.warning {color: #ff0000; font-style: italic;} -.bigwarning {color: #ff0000; font-style: italic; font-size: 115%;} +.danger {color: #dc3545; font-weight: bold;} +.bigdanger {color: #dc3545; font-weight: bold; font-size: 115%;} +.warning {color: #cc7606; font-weight: bold; font-style: italic;} +.bigwarning {color: #cc7606; font-weight: bold; font-style: italic; font-size: 115%;} .boldannounce {color: #ff0000; font-weight: bold;} .rose {color: #ff5050;} -.info {color: #0000cc;} +.info {color: #9b53c4; font-style: italic;} .debug {color: #ff00ff;} -.notice {color: #000099;} -.subtle {color: #000099; font-size: 75%; font-style: italic;} +.notice {color: #0d5ef3;} +.subtle {color: #919ca7; font-style: italic;} .alium {color: #00ff00;} .cult {color: #800080; font-weight: bold; font-style: italic;} .cultannounce {color: #800080; font-style: italic; font-size: 175%;} diff --git a/code/unit_tests/music_test.dm b/code/unit_tests/music_test.dm index a185d025a9afb..44e40189f6ac7 100644 --- a/code/unit_tests/music_test.dm +++ b/code/unit_tests/music_test.dm @@ -37,9 +37,9 @@ /datum/unit_test/jukebox_validate/start_test() var/list/failed = list() - for (var/jukebox/jukebox) + for (var/datum/jukebox/jukebox) for (var/entry in jukebox.tracks) - var/jukebox_track/track = entry + var/datum/jukebox_track/track = entry if (!track.title || !isfile(track.source)) log_bad("Invalid Jukebox Track: [log_info_line(jukebox)]") failed += jukebox diff --git a/config/example/config.txt b/config/example/config.txt index b670f8379a40e..6d1edc4963eeb 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -76,6 +76,9 @@ LOG_ATTACK ## log admin warning messages ##LOG_ADMINWARN ## Also duplicates a bunch of other messages. +## log computer commands +# LOG_COMPUTER_COMMANDS + ## Log all timers on timer auto reset # LOG_TIMERS_ON_BUCKET_RESET diff --git a/html/changelog.html b/html/changelog.html index 2fe85c73d9a37..7ad609ded7f65 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,265 +28,708 @@

Sierra SS13

-->
-

23.10 - 2024

+

09.12 - 2024

Обновления Builder13:

-
Фикс изменения названия и описания для предметов лоадаута
+
Портированы префы на музыку: Play jukeboxes and boomboxes и Play music players
+
+

Обновления RocheHendson:

+
+
Заменил outlet на chute в карго почте
-

22.10 - 2024

+

07.12 - 2024

+

Обновления Sbotkin:

+
+
Removed the cyborgification contract from the report editor. It's illegal, btw.
+
+ +

05.12 - 2024

+

Обновления Banditoz:

+
+
Borg module activations are now announced to their department.
+
+ +

04.12 - 2024

+

Обновления Lexanx:

+
+
Дионы, Адхеранты, ИПС, могут взять больше языков
+
Адхерантам добавлено больше языков для выбора
+
Пофикшено несколько рантаймов у лендинга
+
Челноки Пионеров и Патрульки теперь могут корректно садится через лендинг
+
+

Обновления Shegar:

+
+
Судно Скреллов залито модово и безопасно для изменений
+
Поправил авторство мода на оружие(спрайты)
+
Поправил пути спрайта флешетты скреллов
+
Добавил новые(с инфинити) спрайты скафандрам скреллов
+
+ +

03.12 - 2024

+

Обновления Cakey:

+
+
Fixed some standard window sprites.
+
+

Обновления emmanuelbassil:

+
+
Adds ability to select minor or severe allergies to selected reagents in character setup screen.
+
Adds Allergy autoinjectors in loadout; can only be equipped if character has an allergy. Contains inaprovaline and epinephrine.
+
Minor allergies cause itching and resolve on their own with time. Can also be resolved with inaprovaline.
+
Major allergies cause breathing problems, do not resolve on their own. Require inaprovaline for stabilization and epinephrine to reverse the reaction.
+
Medical records automatically populate with allergies selected in setup screen.
+
Can now set specific traits as requirements for loadout items; currently only used for allergy autoinjectors.
+
Adds verbs in mob variable panel to add/remove traits
+
+ +

02.12 - 2024

+

Обновления Baneuus:

+
+
Уменьшил замедло дионам с 5 до 2
+
Увеличил расход воды дионам.
+
Сделал возможность дионам изучить ксеноязыки.
+
+ +

01.12 - 2024

+

Обновления DieSiege:

+
+
Порт спрайтов нижнего белья с инфинити. Три вида трусов, один вид бюстгалтера.
+
+

Обновления LordNest:

+
+
Исправил зону второго пода и добавил кнопки для взрывостойких дверей для реактора
+
Добавили ГККшникам дробовики для охоты на фауну и ланчбоксы
+
+ +

30.11 - 2024

+

Обновления DieSiege:

+
+
Возвращение/порт планет для выбора
+
Жителям Плутона возвращен Гаттер как доступный для выбора язык
+
+

Обновления The_Spanish_1nquisition:

+
+
Added Party Cards for the SCG's major political parties
+
Added Cultural Options for Wikified Planets
+
Added Passports for said Planets
+
+ +

29.11 - 2024

+

Обновления Banditoz:

+
+
Borgs can now see the in-round date and time.
+
+

Обновления SierraKomodo:

+
+
Half-pint glass no longer appears twice in the microlathe.
+
+ +

27.11 - 2024

Обновления Builder13:

-
Fixed lighting for shuttles after transition.
-
Fixed Delete channel button for NTNet Relay Chat Client.
-
Fixed Take image verb for borgs.
-
Fixed atmospherics for late loaded away sites.
-
Fixed ventcrawl for animals once they attacked somebody (example:borers).
-
Fixed a lack of the specific reagents for some of the snacks.
-
Фикс краша консоли РнД
+
Fixed languages for papers printed from faxes and photocopiers.
+
Увеличено максимальное количество символов для записей персонажа на 500
-

Обновления Builer13:

+

Обновления Hubblenaut:

-
Через кейбинд больше нельзя дропнуть недропаемые вещи (аугменты)
+
Characters that are at least 'experienced' in atmospherics will find that the rapid piping device will place pipes intuitively based on mouse position.
+
Fixes escape pods not repressurizing after launch.
+
Adds an airlock controller to the engine room
+
Fixes the paint sprayer for borgs.
-

Обновления MLGTASTICa:

+

Обновления JebediahTechnic:

-
Sugar doses over 50 units now cause brain damage for species with the sugar malus(unathi and unathi-homeworld monkeys)
+
Laser DMR's damage increased dramatically, long-range accuracy buffed, one-handed and un-scoped accuracy negatives increased, rate of fire slightly increased.
+
+

Обновления JuneauQT:

+
+
Added a slight margin of error to the number of ruins shown by an exoplanet scan
+
+

Обновления Lexanx:

+
+
возвращены охлаждающие пояса
+
Зона посадки в адванседлендинге теперь видна в виде "тени"
+
+

Обновления LynxQueen:

+
+
Slows e-cig consumation and also allows player to take drags off of the e-cig

Обновления Mucker:

-
Increased traitor scaling coefficient to 7, meaning fewer traitors will be selected with smaller in-game player counts.
+
Edited the IT Skill description to reflect that the command line is usable with Basic skill.
+
Adjusted the following computer command skill requirements: ifconfig -> Basic, hwinfo -> Basic, status -> Basic, log -> Skilled, sysnotify -> Experienced.
-

Обновления Neonvolt:

+

Обновления PurplePineapple:

-
Изменен атмос Воксшипа для предотвращения утечек при спавне
+
Adds missing toggle verbs to take off the suit when the RIG is offline and only when offline.
+
The speed at which you can activate your RIG is dependent on your EVA skill. Trained is the same as previous normal.
-

Обновления Nyvrem:

+

Обновления Sbotkin:

-
Skrianhi Tea now actually does tea things, like being hot.
+
MRE crates come with at least one vegan and at least one sugar-free protein option.
-

Обновления PsiOmegaDelta:

+

Обновления SierraKomodo:

-
Select loadout items now dislay an extended description when selected for use.
+
Fixes certain railguns having invalid sprite overlays.
+
Mercenaries can now buy the energy marksman rifle through the uplink for 50 buckaroos. _Do_ test this out for me.
+
power cell rack PSU machines now accept power cells again. Probably also fixes some other non-standard item->machinery interactions.
+
Attempting to add a non-component item to a machine that can accept said item, but is already full, now displays a user feedback message.
+
Fixes machine frames being unwrenchable.
+
+

Обновления Spookerton:

+
+
Organ scarring is correctly reported by scanners.
+
Non-metallic utensils are no longer conductive.
+
Utensils indicate their material in their name.
+
+

Обновления TheStripes:

+
+
Tweaked the th'oom reagent description to make its delectable origins unclear.
+
+ +

25.11 - 2024

+

Обновления Banditoz:

+
+
Fixed images in newscaster articles not showing up if the channel has special symbols in its title.
+
+

Обновления Builder13:

+
+
Fixed a bug where Mules were not getting guaranteed psi latency
+
+

Обновления Hubblenaut:

+
+
Fixes various issues with the paint sprayer
+
Fixes pipes, wires, atmos machinery and other specific object types adjacent to walls being hard to click.
+
The construction of support lattices is no longer blocked by objects on lower z-levels.
+
Construction of lattices and floors on holes is no longer free.
+
Adds headpats. Aim for the head when performing a hug.
+
Fixes the emergency shield generator not blocking air.
+
Fixes taped paper not correctly being placed under the cursor.
+
Fixes the removal or placing of floor causing dark areas.
+
Adds a radial menu for choosing cable colors.
+
A multitool is no longer necessary for choosing cable colors. Use them in your hand.
+
Removes purple cable so all cable colors fit on one menu page.
+
Fixes not being able to put the light replacer into a container.
+
The paint sprayer now uses a radial menu and has some more decals available.
+
The paint sprayer now uses mouse position to determine the direction of all decals on placement -- not just quarter-tiles.
+
The paint sprayer can now once again be used on airlocks without issue.
+
Pumps and valves are now hidden by catwalks.
+
Mapped pumps and valves can be removed without having to pry off the floor tile.
+
New sprites for grey, white and dark floor and mono floor tiles
+
+

Обновления JuneauQT:

+
+
Shrouded, Chlorine, and Volcanic exoplanet clouds now generate the way they were intended to instead of being solid black
+
Added the Alliance United Flotillas Branch and three ranks for it to ID cards (and all other places Branch can be set.)
+
ICCGN and SCGA ranks now have their officer/enlisted badge included in their define.
+
Refactors ranking orders of Fleet and Expeditionary Corps ranks to the newer standard
+
The 'Admiral' and 'Commandant of the Expeditionary Corps' ranks of the Expedtionary Corps now function correctly.
+
+

Обновления Merlin1230:

+
+
Chairs and beds return their construction cost when deconstructed
+
Padded chairs now only cost 1 sheet to make
+
Makeshift splints are now fixed and can be made again by applying tape to a rod
+
+

Обновления Mucker:

+
+
Nacelles APCs are no longer affected by the grid check event.
+
Added a verb to set how long before the initial continue vote occurs to the 'Server' tab.
+
Say messages heard by your mob while aghosted will show up in chat with a 'Near you:' prefix.
+
Shuttle control consoles will once again reconnect to their shuttle if dismantled and rebuilt.
+
Added logging of computer commands to the Secrets 'Investigation' menu.

Обновления PurplePineapple:

-
Adds a variable to energy weapons allowing them to be marked as "disposable" guns. Energy guns with disposable set to true are not able to be charged or used with an inducer.
-
Security basic supply packs no longer contain electrolasers. They can be purchased separately with a cheaper supply pack that contains disposable electrolasers.
-
Disposable tasers have 10 shots now.
+
Changes the wood pump shotgun to 'Crawford' from 'Bulldog' to reduce confusion. The riot version is now the 'Bateman'.

Обновления Qlonever:

-
Investigators can now take labcoats and sterile gear from the loadout menu.
+
Toggling fullscreen no longer adds a line of empty space to the window.

Обновления Ryan180602:

-
Added two documents for bridge crew. (прим. ГР Сьерры - Торчевская тема)
-
Added documents specific for COS, CE, CMO, CSO/Pathfinder, CO/SCGR, XO/DC/CS. (прим. ГР Сьерры - Торчевская тема)
-
Remove disorientor from lockers (прим. ГР Сьерры - это касается только Торча)
-
Remove disorientor design from protolathe.
-
Give parapen a 1.5s delay, and only 5u of VB.
+
Hyperzine now reacts negatively with opiates

Обновления Sbotkin:

-
Various changes to the supply department, most notable: DC office and the warehouse lights.
-
Deck crew helmets and hardhats can be worn in the hazard vest's suit slot.
-
Minor shuffles in the orderable goods.
-
Envelopes and folders are shreddable.
-
Miners lose access to the exploration freq, deck technicians gain access to the hailing freq and the Pathfinder gains access to the supply freq.
-
Artifacts no longer break on scan halting.
+
Medical system control for mechs is available for printing from round start.
+
All system controls require Data 1 and yield the appropriate origin tech upon destruction.
+
Fleet сhaplains can be unskilled in small arms now.
+
Envelopes are craftable from cardboard.
+
Envelopes can be sealed and resealed with rubber stamps. Open envelope will show the last stamp it was sealed with.
+
Fixed metal foam not blocking air.
+
Changes the wording of the cryo cell's cryostasis setting, making it more clear. High intensity makes people freeze deeper and metabolize slower, good for stasis. Low intensity makes people freeze less and metabolize faster, good for healing.
+
Added stoles (accessory) for chaplains, in the loadout.
+
Added the matching hood to the chaplain's locker.
+
Holopad and a filling cabinet for the chaplain's office.
+
Various religious stuff can be carried on the chaplain's hoodie.

Обновления SierraKomodo:

-
Fixed borg bottle racks not being able to pick anything up.
-
Airlocks can now be further damaged after the panel breaks with a sufficiently strong weapon, allowing you to fully break the airlock open by force instead of prying it or (if the door was bolted at the time it broke) going through the process of cutting through the bolts and cover.
-
Fully broken doors can be dismantled with a welding tool, giving back a small amount of resources.
-
Adds the base corrupted hivebot mobs and beacon used during the Legion itnroduction event, for future usage.
-
Broken emags now retain all fingerprint and fibre information from their unbroken form.
-
Broken emags now remain in your hand instead of dropping to the floor.
-
Hacking tools no longer act as multi tools while enabled.
+
Toolbelts can now hold Rapid Construction Devices
+
Droppers can now be used on mobs on help intent again.
+
Firing a gun now uses the same red text style for the user as is used for observers.
+
Cargo piles stacked on the same tile no longer block eachother from being cleaned up.
+
Colors used for certain types of in-chat messages have been adjusted. Primarily, there is now a different in color between warning (red -> orange bold italic) and danger (red bold), and notice (blue), info (blue -> purple), and subtle (blue -> gray italic).
+
Removing papers from noticeboards now places the paper in your hands instead of on the floor, if there's a free hand.
+
Removing papers from noticeboards now properly adds fingerprints to the removed paper.
+
Colors and styles used for various injury states when examining carbon mobs have been individually tweaked. Injuries are now red again.
+
Added additional lines to the list of options for legion broadcasts.
+
Chat messages for buckling and unbuckling are now blue instead of OH GOD OH FUCK RED.

Обновления Spookerton:

-
Added a "View Byond Account" link to player panel when the mob has a ckey.
-
Wheelchairs are subject to regular mob slowdowns.
-
Mobs that are not human, robot, or an admin observer cannot interact with microwaves.
+
Atom overlays and underlays no longer incorrectly appear modifiable via VV.
+
Hydrogen tanks' supply order name better reflects its contents.
+
New sounds for legion warp in effects.
-

Обновления gy1ta23:

+

Обновления The_Spanish_1nquisition:

-
Lockets and wallets can hold photo trinkets.
+
Removed outdated event related memos
+
Added new event related (and other) memos
-

Обновления sick trigger:

+

Обновления The_Spanish_1nquisition, Albens, thestripes:

-
Supply can purchase stasis cages
-
Fixes for selling artifacts and animals
-
Plant potency affects the brightness of bioluminescent plants
+
more memos
-

Обновления ВашНикнейм:

+

Обновления caledfwlchschime:

-
Пофиксил баг с белыми бровями, теперь у них есть функция выбора цвета.
+
Added sound effects for legion voices.
+
+

Обновления thestripes:

+
+
Rewrites the hailer description to be less rude.
-

21.10 - 2024

-

Обновления Builder13:

+

23.11 - 2024

+

Обновления ВашНикнейм:

-
Возвращены OOC заметки персонажа. Их можно настроить через кнопку Set OOC notes рядом с кнопками флавора. Заполненные OOC заметки можно смотреть через examine персонажа
+
Аномалии на тайле облак больше не дают им раскрываться (Больше не выйдет спрятаться от всасывающей аномалии в пучинах облак)
+
Переписана работа всасывающей гравитационной аномалии
+
Мех больше не неуявзим для обак
+
Теперь везде в коде не Zjarka, а Zharka
+
Добавил дикий самопальный детектор Гюрза для ГКК
+
Облака излучают персиковый свет
+
Трава излучает приятные зеленоватый свет
+
Переписана работа облаков
+
Выдал на склад ГКК 1 гюрзу и 3 пачки болтиков. Спасибо местному инженеру.
+
Добавил иконки Гюрзы
-

14.10 - 2024

+

22.11 - 2024

Обновления Lexanx:

-
Добавлена возможность сохранять сканы с бодисканнера.
-
Добавлен новый тип файлов. BSC - bodyscan
+
Изменена форма снабжения 32
+
Добавил зарядник боргов на ГУП
-

Обновления Neonvolt:

+

Обновления Mucker:

-
Исправлен доступ дрона Восхождения
-
Множественные исправления пропавших спрайтов Восхождения
-
Добавлены сканеры аномалий для различных ИКСов Восхождения
-
Возвращены авей-корабли Восхождения
+
Simple mobs will not longer endlessly attack doors when they lose their target.
+
+

Обновления PurplePineapple:

+
+
Clicking a victim with an item on disarm intent calls use_weapon(). Disarm intent/Dislocation combat for melee works again.
+
+

Обновления Spookerton:

+
+
Added a preference option for toggling run on shift.
-

06.10 - 2024

-

Обновления Builder13:

+

19.11 - 2024

+

Обновления Baneuus:

-
Фикс вставки кристаллов в консоль телесайнса
-
Возврат старой скорости перемещения для Адхерантов
-
Паник кнопка добавлена на корабли
-
Возвращено дыхание под водой для Тритонцев
-
Возвращена вкладка size converter для принтера интегральных плат
+
Теперь введение крови в золотое ядро спаунит злого моба.
+
Теперь введение крови в лазурное ядро спаунит зелье возрождения слизня.
+ +

16.11 - 2024

+

Обновления Lexanx & Gfitkiit:

+
+
Дроппод для мерков
+
+ +

14.11 - 2024

Обновления Lexanx:

-
Пофиксил баг аутопсии и фикс некорректного описания и пропавшей подкожной брони из робо
-
Добавил в игру бирку для переименования симлмобов
+
Неотстыковка некоторых подов
+
Невозможность синхронизировать консоли, после их пересборки
+
Проблема с Advanced Landing в лававой экзопланете
+
Возвращена Вирусология.
+
Добавлена подпрофессия Химика - Вирусолог
+
Возвращены Вирусы
-

Обновления awkardlyconfusedneuralnetwork:

+

Обновления LordNest:

-
fixed this instant headgib exploit that dumb as hell
+
Добавил отображение заблокированного хранилища скафандров
-

Обновления awkardlyconfusedneuralnetwork, out-of-phaze:

+

Обновления awkardlyconfusedneuralnetwork:

-
Makes observ cleanup tracking use datum vars instead of a list
+
Добавил звуки для аирлоков
+
Increases large map loading speed
+
Добавил face direction по нажатию иконки интента движения с зажатым ctrl
-

30.09 - 2024

-

Обновления Shegar:

+

13.11 - 2024

+

Обновления KandJX:

-
Временный откат позволяющий прокликивать ИИшке
+
Добавил лестницу между бригом и мостиком.
+
Убрал шлюз в теха из комнаты капитана.
-

29.09 - 2024

-

Обновления UEDHighCommand:

+

12.11 - 2024

+

Обновления Builder13:

-
С Инфинити портировано Восхождение.
+
Больше нельзя получить галлюцинации от суперматерии при активных мезонных очках
-

28.09 - 2024

-

Обновления Builder13:

+

11.11 - 2024

+

Обновления BOT Eeshee:

+
+
Добавила перчатки, маски и изоли ЭК
+
+

Обновления Lexanx:

+
+
Баг взаимодействия синтетов
+
Некорректная зона меркшипа
+
Пофикшена кража тюрфов при взлете
+
+

Обновления Shegar:

-
Возвращены старые шансы на дизарм. Стал более зависимым от проставленного скилла
+
Задник космоса не становится серым из-за летающих островов
+
Текст эндраунда мода аномалий не жирный

Обновления Teteshnik:

-
Пофиксил шлем ЕРТ
-
Добавил новую прическу
+
Переименовал спавнеры безбилетников
-

24.09 - 2024

+

10.11 - 2024

Обновления Builder13:

-
Возвращена возможность перемещения для карго поезда
-
Исправлено отображение для скрапа и переработанного скрапа
+
Радио при событии пси сигнала больше не должно воздействовать через стены
-

Обновления Lexanx:

+

Обновления Mucker:

-
Пофиксил взрывы
+
You can now "hold" a humanoid mobs' hand when pulling them and targeting one of their hands.
+
Antag latespawn scaling no longer considers players that aren't alive or are offship when deciding maximum antags.

Обновления Shegar:

-
ИИ больше не может открыть дверь у АВД
-
Interact with machine у ии должен теперь работать полноценно
-
Сбрасывание подлетевших суден: Пилот может сбрасывать подлетевшие судна. В этом процессе используются навыки пилота обоих сторон и тот факт, есть ли за управлением судна(Противника) пилот в прямом управлении.
-
Ремап ядра ИИ, апц сдвинут в центр ядра(К самому ИИ)
-
Бак у харона размещён внутрь самого Харона
-
Добавил реакцию по крафту самопального стимулятора. Сахар + Литий + 5 Кофе
+
Трамплин теперь не всегда кидает на 5 тайтлов.
+
Генератору аномок теперь не мешает railings
+
Лава больше не может сжигать артефакты
+
БСД пролив теперь не спавнит аномки в космосе
+
БСД теперь удаляет аномки после окончания ивента (Должен по крайней мере)
+
Мех при таране цели тоже делает шаг, от чего меха теперь невозможно заблочить не мехом/адхерантом/гбсом
+
Добавил глыбы на планету лёд. Красиво!
+
Детектор не какает обработкой без нужды, теперь его нужно включать.(Контрол + ЛКМ)
+
Теперь аномалии при осмотре детектером обнаруживаются полностью, а не частично (От чего шансы обнаружения довольно таки упали)
+
Полность переписана система влияния артефактов на определённые события с персонажами, добавлены новые эффекты. Усилена важность и польза контейнеров артефактов из-за этого.
+
Добавлена анимация уворота при паррировании.
+
Переписана система процессинга артефактов на персонажа. Она должна при любых взаимодействиях понимать, кто текущий носитель и влиять на него.
+
Добавил СНЕГ на ледяную планету с эффектом на экране и звуком.
+
Добавлен Z скан уровня для детектора
+
Добавил скалолазанье на планету ЛЁД. Помогайте друг другу, используйте кирки, готовьтесь физически и преодолевайте горы.
+
Добавлен установщик маячков для более комфортного построения пути на планетах.
+
Всасывающая гравианомалия изменена сопротивляться им стало сложнее, так как и задумывал разработчик, но в то же время, вы можете помогать своим друзьям выбираться из неё. Файнд аут ин гейм!
+
Логика электр подтипа Тесла переписана, теперь вся планета не сможет одновременно бахать
+
Достаточно высокий уровень науки позволит определять тип аномалии
+
Спавн аномалий от больших артефактов выведен из ротации.
+
Спрайты для артефактов, погода
+
Выдал Деплоер на склад ЭК. Детектор, мешочек и деплоер на склад шахтёров.
+
Исправлено описание детектора аномалий
+
Погода Буран, может подлагивать клиент. Пишите чё каво.
+
Сильно увеличен размер планет. Спавнит так же, как и от админки.
+
Добавлена аномальная планета: Летающие острова.
+
Сильно увеличил расстояния насёра аномалиями при БСД проливе, увеличено количество аномок.
+
Ослаблено СТАН влияние электры на жертву
+
Добавлена возможность от атлетики сопротивляться влиянию электры
+
Нёрф энергощитов меха, генерация тепла при получении урона увеличена в 2 раза
+
Добавил трамплин в билдер админов.
+
+

Обновления Spookerton:

+
+
Corrected Masculinity.
-

Обновления Vipo24:

+

Обновления The_Spanish_1nquisition:

-
Кислота вновь очень больно обжигает, как было раньше
+
Tornakov took a marker to his poster.
-

19.09 - 2024

-

Обновления Teteshnik:

+

09.11 - 2024

+

Обновления Shegar:

+
+
Минификсик для гитхаба
+
+ +

08.11 - 2024

+

Обновления Lexanx:

+
+
Теперь челноки/шаттлы способные летать в космосе и совершать посадки,
+
+

Обновления RocheHendson:

+
+
Seedship теперь имеет должности для захода
+
Seedship командование теперь может поставить имя своему наследию
+
+ +

07.11 - 2024

+

Обновления Mucker:

+
+
Adjusted the spawn target for merc and raider to 3, and traitor to 1.
+
+

Обновления PsiOmegaDelta:

+
+
Select loadout items again display an extended description when selected for use.
+
+

Обновления Ryan180602:

+
+
Wristwatches show the date correctly.
+
Posibrains can be fixed outside chassis.
+
Removes the preset pronoun badge types, people can now customise them to their wish.
+
Adds another entry for the pride pins. Letting people take two now.
+
Throat-slit timer changed from 3.24 ~ 0.8! seconds to 3.75 ~ 2.25. On success, the user cannot act again for an extra second.
+
+

Обновления sdtwbaj:

+
+
Flora can be cut away with a hatchet.
+
Trees can be destroyed, and drop wood!
+
woodcutting.ogg from Polaris
+
tree stumps from Polaris
+
+

Обновления sick trigger:

+
+
Orders from supply now record what time the requst was made
+
+

Обновления sick-trigger:

-
Пофиксил лодаут ниндзи, так-же удалил костыль.
-
Портировал букеты в билд
+
Fixed being unable to spawn on landed colony ship.
-

16.09 - 2024

+

06.11 - 2024

+

Обновления Baneuus:

+
+
Резоми хихикают как резоми, а не как люди.
+
Вернул звук вздоха резоми.
+
Повысил температуру, которая для резоми считается "комфортной" до 21.6 С*
+
Усилил найтвижн резоми.
+
Удалил мерков из спауна при режиме революции
+
Теперь sechud lenses резоми работают нормально
+

Обновления Builder13:

-
Портировано отображение для скана контактов у сенсоров
-
Портирована экстренная кнопка бедствия
+
Откат трех секунд подсистемы машин
+
+

Обновления SierraKomodo:

+
+
Shuttle control consoles can no longer be synced to shuttles if not actually on the shuttle.
+
Regular non-overmap shuttle control consoles will no longer function on overmap shuttles, and vice-versa.
+
Shuttle control consoles now automatically sync to the shuttle they're built on when created, instead of needing to be set by multitooling the board before creation.
+
Shuttle control consoles that are not properly connected to a shuttle now have a new error screen sprite.
+
+

Обновления Teteshnik:

+
+
Добавил некоторым расам возможность стать безбилетником
+
Поменял название безбилетника на неизвестного сделано угоду айди
+
+

Обновления rootoo807:

+
+
Fixes broken sprites / adds missing sprites for armbands, insulated gloves, soft caps, blood masks on GAS. GAS can no longer wear overalls or wizard voidsuit [snakes don't have legs for pants :( ].
+
Adds missing sprite for flipped veteran's cap.
-

15.09 - 2024

-

Обновления ВашНикнейм:

+

05.11 - 2024

+

Обновления awkardlyconfusedneuralnetwork:

-
Выдал детекторы для ЭК
+
Убрался за собой
-

14.09 - 2024

+

04.11 - 2024

Обновления Builder13:

-
Добавлена возможность вставки и вытаскивания предмета из интегральной платы без ее удаления из корпуса
-
Добавлены интегральные платы list pick, image comparsion scanner, floor magnet.
-
Сделаны дополнения для плат intelligence control circuit и examiner
+
Добавлена кнопка add trait в создание персонажа. Сейчас там есть опции только для регенерации Унати.
+
+

Обновления NinjaPikachushka:

+
+
Худ-Кнопки мага перестали сбегать.
+
+

Обновления totalynotglist:

+
+
Экспериментальная оптимизация подсистемы Machines на 33.3%.

Обновления ВашНикнейм:

-
Сбор артефактов в мехе запрещён
-
Генерация артефактов и аномалий жёстко ограничена математикой.
-
Сбор артефактов теперь работает так, как я и задумывал
-
Добавил планетарную генерацию аномалий (по всей планете), зависящая от типа планеты
-
URM (Universal Research Machine) - новое устройство на петрове для анализа артов(мелких).
-
Добавлена ледяная планета
-
Добавил спрайты маячков, детектора, URM
-
Выдал ЭК коллекторы,маячки и новые детекторы. Колония, воксы, мусорщики - получили болтики.
-
Изменил русский на английский в аномалиях там, где это неуместно
-
Дал билдер аномалий в билдер с возможностью тонкой настройки
+
Экран меха обновляется при переключении Power, выключении от перегрева, при выбивании сенсора.
+
Если у меха выбита грудь, то раз в 20-40 секунд мех получает полный перегрев.
-

11.09 - 2024

+

03.11 - 2024

+

Обновления Builder13:

+
+
Добавлена единственная возможность чинить переломы для Адхерантов - через минеральные ванны. Процедура может быть длительной.
+
Генокрад больше не утрачивает навыки от профессии при получении роли
+
Возвращены шансы на пси латентность при заходе в раунд
+
Пси сигнал возвращен в ротацию событий
+
Возвращена переменная stop_sight_update для мобов, чтобы исключить обновление зрения при ее включении
+
+

Обновления Gaaxer, awkardlyconfusedneuralnetwork:

+
+
Инит ксеноархиологии теперь быстрее
+
+

Обновления Gaxeer, awkardlyconfusedneuralnetwork:

+
+
Починил обновление оверлея газов
+
Починил то, что рычаг на конвейере проходит все объекты в мире
+
+

Обновления KOJIECO:

+
+
Добавил скрелльскую одежду для всех каст от Failu.
+
+

Обновления Lexanx:

+
+
Новые фуллскрин оверлеи повреждений ИПС и Адхерентов и ППТ
+
Предмет(Explosion Wather) для получения научных очков из взрывов снова работает
+
Джетпаки в ветке исследований РнД
+
Кинетический сборщик в производстве РнД
+
Платы мусоропереработчиков в ветке исследований РнД
+
Компот (water = 2, berry = 1, apple = 1, pear = 1)
+
Возвращены рецепты отвердевания золота и серебра.
+
Плата консоли трафика в ветке исследований РнД.
+
+

Обновления Neonvolt:

+
+
Исправлены дополнительные пропавшие спрайты Восхождения и недоработки связанные с их расами
+

Обновления Teteshnik:

-
Удалил трэйси
-
Портирован халат робототехника с инфинити.
+
Поставил возможность изменения/добавления хоткея для фейс дира.
+
Новый флаг для профессий позволяющий делать профессию только возможным раундстартом
+
Добавил безбилетников
+
+

Обновления awkardlyconfusedneuralnetwork:

+
+
Инпут теперь обрабатывается раньше других сабсистем, должно повысить плавность игры.
+
Ускорил инит, да.
-

06.09 - 2024

-

Обновления ВашНикнейм:

+

23.10 - 2024

+

Обновления Builder13:

-
Ремап карты ниндзи, он получил сауну, додзе, озерцо и пару комнат. В целом, перенос с инфинити.
+
Фикс изменения названия и описания для предметов лоадаута
-

04.09 - 2024

+

22.10 - 2024

Обновления Builder13:

-
Wizard retains all the spells in the hud upon changing/getting body.
-
It is now possible to spawn wizard packages (examples: scrying orb, mastercrafted armor).
-
Fixes for some of the spells, so they are castable again.
+
Fixed lighting for shuttles after transition.
+
Fixed Delete channel button for NTNet Relay Chat Client.
+
Fixed Take image verb for borgs.
+
Fixed atmospherics for late loaded away sites.
+
Fixed ventcrawl for animals once they attacked somebody (example:borers).
+
Fixed a lack of the specific reagents for some of the snacks.
+
Фикс краша консоли РнД
+
+

Обновления Builer13:

+
+
Через кейбинд больше нельзя дропнуть недропаемые вещи (аугменты)
+
+

Обновления MLGTASTICa:

+
+
Sugar doses over 50 units now cause brain damage for species with the sugar malus(unathi and unathi-homeworld monkeys)
+
+

Обновления Mucker:

+
+
Increased traitor scaling coefficient to 7, meaning fewer traitors will be selected with smaller in-game player counts.
+
+

Обновления Neonvolt:

+
+
Изменен атмос Воксшипа для предотвращения утечек при спавне
+
+

Обновления Nyvrem:

+
+
Skrianhi Tea now actually does tea things, like being hot.
+
+

Обновления PsiOmegaDelta:

+
+
Select loadout items now dislay an extended description when selected for use.
+
+

Обновления PurplePineapple:

+
+
Adds a variable to energy weapons allowing them to be marked as "disposable" guns. Energy guns with disposable set to true are not able to be charged or used with an inducer.
+
Security basic supply packs no longer contain electrolasers. They can be purchased separately with a cheaper supply pack that contains disposable electrolasers.
+
Disposable tasers have 10 shots now.
+
+

Обновления Qlonever:

+
+
Investigators can now take labcoats and sterile gear from the loadout menu.
+
+

Обновления Ryan180602:

+
+
Added two documents for bridge crew. (прим. ГР Сьерры - Торчевская тема)
+
Added documents specific for COS, CE, CMO, CSO/Pathfinder, CO/SCGR, XO/DC/CS. (прим. ГР Сьерры - Торчевская тема)
+
Remove disorientor from lockers (прим. ГР Сьерры - это касается только Торча)
+
Remove disorientor design from protolathe.
+
Give parapen a 1.5s delay, and only 5u of VB.
+
+

Обновления Sbotkin:

+
+
Various changes to the supply department, most notable: DC office and the warehouse lights.
+
Deck crew helmets and hardhats can be worn in the hazard vest's suit slot.
+
Minor shuffles in the orderable goods.
+
Envelopes and folders are shreddable.
+
Miners lose access to the exploration freq, deck technicians gain access to the hailing freq and the Pathfinder gains access to the supply freq.
+
Artifacts no longer break on scan halting.
+
+

Обновления SierraKomodo:

+
+
Fixed borg bottle racks not being able to pick anything up.
+
Airlocks can now be further damaged after the panel breaks with a sufficiently strong weapon, allowing you to fully break the airlock open by force instead of prying it or (if the door was bolted at the time it broke) going through the process of cutting through the bolts and cover.
+
Fully broken doors can be dismantled with a welding tool, giving back a small amount of resources.
+
Adds the base corrupted hivebot mobs and beacon used during the Legion itnroduction event, for future usage.
+
Broken emags now retain all fingerprint and fibre information from their unbroken form.
+
Broken emags now remain in your hand instead of dropping to the floor.
+
Hacking tools no longer act as multi tools while enabled.
-

Обновления Gy1ta23:

+

Обновления Spookerton:

-
you can now select photographs in loadout with changeable descriptions
+
Added a "View Byond Account" link to player panel when the mob has a ckey.
+
Wheelchairs are subject to regular mob slowdowns.
+
Mobs that are not human, robot, or an admin observer cannot interact with microwaves.
+
+

Обновления gy1ta23:

+
+
Lockets and wallets can hold photo trinkets.
+
+

Обновления sick trigger:

+
+
Supply can purchase stasis cages
+
Fixes for selling artifacts and animals
+
Plant potency affects the brightness of bioluminescent plants
+
+

Обновления ВашНикнейм:

+
+
Пофиксил баг с белыми бровями, теперь у них есть функция выбора цвета.
-

01.09 - 2024

-

Обновления Shegar:

+

21.10 - 2024

+

Обновления Builder13:

+
+
Возвращены OOC заметки персонажа. Их можно настроить через кнопку Set OOC notes рядом с кнопками флавора. Заполненные OOC заметки можно смотреть через examine персонажа
+
+ +

14.10 - 2024

+

Обновления Lexanx:

+
+
Добавлена возможность сохранять сканы с бодисканнера.
+
Добавлен новый тип файлов. BSC - bodyscan
+
+

Обновления Neonvolt:

-
Возвращает map_upload
+
Исправлен доступ дрона Восхождения
+
Множественные исправления пропавших спрайтов Восхождения
+
Добавлены сканеры аномалий для различных ИКСов Восхождения
+
Возвращены авей-корабли Восхождения
Icons by Icons8
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 03c83d1fd9566..847d78a9d4dbd 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -25707,3 +25707,857 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p \u044F \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044F \u0438 \u043E\u043F\u0438\ \u0441\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u043C\ \u0435\u0442\u043E\u0432 \u043B\u043E\u0430\u0434\u0430\u0443\u0442\u0430" +2024-11-03: + Builder13: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0435\u0434\u0438\ + \u043D\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0432\u043E\u0437\u043C\ + \u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0447\u0438\u043D\u0438\u0442\u044C\ + \ \u043F\u0435\u0440\u0435\u043B\u043E\u043C\u044B \u0434\u043B\u044F \u0410\ + \u0434\u0445\u0435\u0440\u0430\u043D\u0442\u043E\u0432 - \u0447\u0435\u0440\u0435\ + \u0437 \u043C\u0438\u043D\u0435\u0440\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\ + \u0430\u043D\u043D\u044B. \u041F\u0440\u043E\u0446\u0435\u0434\u0443\u0440\u0430\ + \ \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0434\u043B\u0438\ + \u0442\u0435\u043B\u044C\u043D\u043E\u0439." + - tweak: "\u0413\u0435\u043D\u043E\u043A\u0440\u0430\u0434 \u0431\u043E\u043B\u044C\ + \u0448\u0435 \u043D\u0435 \u0443\u0442\u0440\u0430\u0447\u0438\u0432\u0430\u0435\ + \u0442 \u043D\u0430\u0432\u044B\u043A\u0438 \u043E\u0442 \u043F\u0440\u043E\u0444\ + \u0435\u0441\u0441\u0438\u0438 \u043F\u0440\u0438 \u043F\u043E\u043B\u0443\u0447\ + \u0435\u043D\u0438\u0438 \u0440\u043E\u043B\u0438" + - rscadd: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u044B \u0448\u0430\ + \u043D\u0441\u044B \u043D\u0430 \u043F\u0441\u0438 \u043B\u0430\u0442\u0435\u043D\ + \u0442\u043D\u043E\u0441\u0442\u044C \u043F\u0440\u0438 \u0437\u0430\u0445\u043E\ + \u0434\u0435 \u0432 \u0440\u0430\u0443\u043D\u0434" + - rscadd: "\u041F\u0441\u0438 \u0441\u0438\u0433\u043D\u0430\u043B \u0432\u043E\u0437\ + \u0432\u0440\u0430\u0449\u0435\u043D \u0432 \u0440\u043E\u0442\u0430\u0446\u0438\ + \u044E \u0441\u043E\u0431\u044B\u0442\u0438\u0439" + - admin: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u043F\u0435\ + \u0440\u0435\u043C\u0435\u043D\u043D\u0430\u044F stop_sight_update \u0434\u043B\ + \u044F \u043C\u043E\u0431\u043E\u0432, \u0447\u0442\u043E\u0431\u044B \u0438\ + \u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043E\u0431\u043D\u043E\u0432\ + \u043B\u0435\u043D\u0438\u0435 \u0437\u0440\u0435\u043D\u0438\u044F \u043F\u0440\ + \u0438 \u0435\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438" + Gaaxer, awkardlyconfusedneuralnetwork: + - tweak: "\u0418\u043D\u0438\u0442 \u043A\u0441\u0435\u043D\u043E\u0430\u0440\u0445\ + \u0438\u043E\u043B\u043E\u0433\u0438\u0438 \u0442\u0435\u043F\u0435\u0440\u044C\ + \ \u0431\u044B\u0441\u0442\u0440\u0435\u0435" + Gaxeer, awkardlyconfusedneuralnetwork: + - bugfix: "\u041F\u043E\u0447\u0438\u043D\u0438\u043B \u043E\u0431\u043D\u043E\u0432\ + \u043B\u0435\u043D\u0438\u0435 \u043E\u0432\u0435\u0440\u043B\u0435\u044F \u0433\ + \u0430\u0437\u043E\u0432" + - bugfix: "\u041F\u043E\u0447\u0438\u043D\u0438\u043B \u0442\u043E, \u0447\u0442\ + \u043E \u0440\u044B\u0447\u0430\u0433 \u043D\u0430 \u043A\u043E\u043D\u0432\u0435\ + \u0439\u0435\u0440\u0435 \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442 \u0432\ + \u0441\u0435 \u043E\u0431\u044A\u0435\u043A\u0442\u044B \u0432 \u043C\u0438\u0440\ + \u0435" + KOJIECO: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u043A\u0440\u0435\u043B\ + \u043B\u044C\u0441\u043A\u0443\u044E \u043E\u0434\u0435\u0436\u0434\u0443 \u0434\ + \u043B\u044F \u0432\u0441\u0435\u0445 \u043A\u0430\u0441\u0442 \u043E\u0442\ + \ Failu." + Lexanx: + - imageadd: "\u041D\u043E\u0432\u044B\u0435 \u0444\u0443\u043B\u043B\u0441\u043A\ + \u0440\u0438\u043D \u043E\u0432\u0435\u0440\u043B\u0435\u0438 \u043F\u043E\u0432\ + \u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0418\u041F\u0421 \u0438 \u0410\ + \u0434\u0445\u0435\u0440\u0435\u043D\u0442\u043E\u0432 \u0438 \u041F\u041F\u0422" + - bugfix: "\u041F\u0440\u0435\u0434\u043C\u0435\u0442(Explosion Wather) \u0434\u043B\ + \u044F \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u043D\u0430\u0443\ + \u0447\u043D\u044B\u0445 \u043E\u0447\u043A\u043E\u0432 \u0438\u0437 \u0432\u0437\ + \u0440\u044B\u0432\u043E\u0432 \u0441\u043D\u043E\u0432\u0430 \u0440\u0430\u0431\ + \u043E\u0442\u0430\u0435\u0442" + - rscadd: "\u0414\u0436\u0435\u0442\u043F\u0430\u043A\u0438 \u0432 \u0432\u0435\u0442\ + \u043A\u0435 \u0438\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\ + \u0439 \u0420\u043D\u0414" + - rscadd: "\u041A\u0438\u043D\u0435\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439\ + \ \u0441\u0431\u043E\u0440\u0449\u0438\u043A \u0432 \u043F\u0440\u043E\u0438\ + \u0437\u0432\u043E\u0434\u0441\u0442\u0432\u0435 \u0420\u043D\u0414" + - rscadd: "\u041F\u043B\u0430\u0442\u044B \u043C\u0443\u0441\u043E\u0440\u043E\u043F\ + \u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432\ + \ \u0432 \u0432\u0435\u0442\u043A\u0435 \u0438\u0441\u0441\u043B\u0435\u0434\ + \u043E\u0432\u0430\u043D\u0438\u0439 \u0420\u043D\u0414" + - rscadd: "\u041A\u043E\u043C\u043F\u043E\u0442 (water = 2, berry = 1, apple =\ + \ 1, pear = 1)" + - rscadd: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u044B \u0440\u0435\ + \u0446\u0435\u043F\u0442\u044B \u043E\u0442\u0432\u0435\u0440\u0434\u0435\u0432\ + \u0430\u043D\u0438\u044F \u0437\u043E\u043B\u043E\u0442\u0430 \u0438 \u0441\u0435\ + \u0440\u0435\u0431\u0440\u0430." + - rscadd: "\u041F\u043B\u0430\u0442\u0430 \u043A\u043E\u043D\u0441\u043E\u043B\u0438\ + \ \u0442\u0440\u0430\u0444\u0438\u043A\u0430 \u0432 \u0432\u0435\u0442\u043A\ + \u0435 \u0438\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u0439\ + \ \u0420\u043D\u0414." + Neonvolt: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044B \u0434\u043E\ + \u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\ + \u0440\u043E\u043F\u0430\u0432\u0448\u0438\u0435 \u0441\u043F\u0440\u0430\u0439\ + \u0442\u044B \u0412\u043E\u0441\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F\ + \ \u0438 \u043D\u0435\u0434\u043E\u0440\u0430\u0431\u043E\u0442\u043A\u0438\ + \ \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0441 \u0438\u0445\ + \ \u0440\u0430\u0441\u0430\u043C\u0438" + Teteshnik: + - tweak: "\u041F\u043E\u0441\u0442\u0430\u0432\u0438\u043B \u0432\u043E\u0437\u043C\ + \u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\ + \u043D\u0438\u044F/\u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F\ + \ \u0445\u043E\u0442\u043A\u0435\u044F \u0434\u043B\u044F \u0444\u0435\u0439\ + \u0441 \u0434\u0438\u0440\u0430." + - rscadd: "\u041D\u043E\u0432\u044B\u0439 \u0444\u043B\u0430\u0433 \u0434\u043B\u044F\ + \ \u043F\u0440\u043E\u0444\u0435\u0441\u0441\u0438\u0439 \u043F\u043E\u0437\u0432\ + \u043E\u043B\u044F\u044E\u0449\u0438\u0439 \u0434\u0435\u043B\u0430\u0442\u044C\ + \ \u043F\u0440\u043E\u0444\u0435\u0441\u0441\u0438\u044E \u0442\u043E\u043B\u044C\ + \u043A\u043E \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u044B\u043C \u0440\u0430\ + \u0443\u043D\u0434\u0441\u0442\u0430\u0440\u0442\u043E\u043C" + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0431\u0435\u0437\u0431\u0438\ + \u043B\u0435\u0442\u043D\u0438\u043A\u043E\u0432" + awkardlyconfusedneuralnetwork: + - tweak: "\u0418\u043D\u043F\u0443\u0442 \u0442\u0435\u043F\u0435\u0440\u044C \u043E\ + \u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F\ + \ \u0440\u0430\u043D\u044C\u0448\u0435 \u0434\u0440\u0443\u0433\u0438\u0445\ + \ \u0441\u0430\u0431\u0441\u0438\u0441\u0442\u0435\u043C, \u0434\u043E\u043B\ + \u0436\u043D\u043E \u043F\u043E\u0432\u044B\u0441\u0438\u0442\u044C \u043F\u043B\ + \u0430\u0432\u043D\u043E\u0441\u0442\u044C \u0438\u0433\u0440\u044B." + - experiment: "\u0423\u0441\u043A\u043E\u0440\u0438\u043B \u0438\u043D\u0438\u0442\ + , \u0434\u0430." +2024-11-04: + Builder13: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u043A\u043D\u043E\ + \u043F\u043A\u0430 add trait \u0432 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\ + \u0435 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u0436\u0430. \u0421\u0435\u0439\ + \u0447\u0430\u0441 \u0442\u0430\u043C \u0435\u0441\u0442\u044C \u043E\u043F\u0446\ + \u0438\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0440\u0435\ + \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0423\u043D\u0430\u0442\ + \u0438." + NinjaPikachushka: + - bugfix: "\u0425\u0443\u0434-\u041A\u043D\u043E\u043F\u043A\u0438 \u043C\u0430\u0433\ + \u0430 \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u043B\u0438 \u0441\u0431\u0435\ + \u0433\u0430\u0442\u044C." + totalynotglist: + - experiment: "\u042D\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\ + \u0430\u043B\u044C\u043D\u0430\u044F \u043E\u043F\u0442\u0438\u043C\u0438\u0437\ + \u0430\u0446\u0438\u044F \u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\ + \u044B Machines \u043D\u0430 33.3%." + "\u0412\u0430\u0448\u041D\u0438\u043A\u043D\u0435\u0439\u043C": + - bugfix: "\u042D\u043A\u0440\u0430\u043D \u043C\u0435\u0445\u0430 \u043E\u0431\u043D\ + \u043E\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u043F\u0435\ + \u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 Power, \u0432\u044B\ + \u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u043E\u0442 \u043F\u0435\u0440\ + \u0435\u0433\u0440\u0435\u0432\u0430, \u043F\u0440\u0438 \u0432\u044B\u0431\u0438\ + \u0432\u0430\u043D\u0438\u0438 \u0441\u0435\u043D\u0441\u043E\u0440\u0430." + - balance: "\u0415\u0441\u043B\u0438 \u0443 \u043C\u0435\u0445\u0430 \u0432\u044B\ + \u0431\u0438\u0442\u0430 \u0433\u0440\u0443\u0434\u044C, \u0442\u043E \u0440\ + \u0430\u0437 \u0432 20-40 \u0441\u0435\u043A\u0443\u043D\u0434 \u043C\u0435\u0445\ + \ \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u043F\u043E\u043B\u043D\u044B\ + \u0439 \u043F\u0435\u0440\u0435\u0433\u0440\u0435\u0432." +2024-11-05: + awkardlyconfusedneuralnetwork: + - bugfix: "\u0423\u0431\u0440\u0430\u043B\u0441\u044F \u0437\u0430 \u0441\u043E\u0431\ + \u043E\u0439" +2024-11-06: + Baneuus: + - bugfix: "\u0420\u0435\u0437\u043E\u043C\u0438 \u0445\u0438\u0445\u0438\u043A\u0430\ + \u044E\u0442 \u043A\u0430\u043A \u0440\u0435\u0437\u043E\u043C\u0438, \u0430\ + \ \u043D\u0435 \u043A\u0430\u043A \u043B\u044E\u0434\u0438." + - bugfix: "\u0412\u0435\u0440\u043D\u0443\u043B \u0437\u0432\u0443\u043A \u0432\u0437\ + \u0434\u043E\u0445\u0430 \u0440\u0435\u0437\u043E\u043C\u0438." + - tweak: "\u041F\u043E\u0432\u044B\u0441\u0438\u043B \u0442\u0435\u043C\u043F\u0435\ + \u0440\u0430\u0442\u0443\u0440\u0443, \u043A\u043E\u0442\u043E\u0440\u0430\u044F\ + \ \u0434\u043B\u044F \u0440\u0435\u0437\u043E\u043C\u0438 \u0441\u0447\u0438\ + \u0442\u0430\u0435\u0442\u0441\u044F \"\u043A\u043E\u043C\u0444\u043E\u0440\u0442\ + \u043D\u043E\u0439\" \u0434\u043E 21.6 \u0421*" + - tweak: "\u0423\u0441\u0438\u043B\u0438\u043B \u043D\u0430\u0439\u0442\u0432\u0438\ + \u0436\u043D \u0440\u0435\u0437\u043E\u043C\u0438." + - rscdel: "\u0423\u0434\u0430\u043B\u0438\u043B \u043C\u0435\u0440\u043A\u043E\u0432\ + \ \u0438\u0437 \u0441\u043F\u0430\u0443\u043D\u0430 \u043F\u0440\u0438 \u0440\ + \u0435\u0436\u0438\u043C\u0435 \u0440\u0435\u0432\u043E\u043B\u044E\u0446\u0438\ + \u0438" + - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C sechud lenses \u0440\u0435\u0437\ + \u043E\u043C\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043D\u043E\ + \u0440\u043C\u0430\u043B\u044C\u043D\u043E" + Builder13: + - experiment: "\u041E\u0442\u043A\u0430\u0442 \u0442\u0440\u0435\u0445 \u0441\u0435\ + \u043A\u0443\u043D\u0434 \u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\ + \u044B \u043C\u0430\u0448\u0438\u043D" + SierraKomodo: + - bugfix: Shuttle control consoles can no longer be synced to shuttles if not actually + on the shuttle. + - bugfix: Regular non-overmap shuttle control consoles will no longer function on + overmap shuttles, and vice-versa. + - tweak: Shuttle control consoles now automatically sync to the shuttle they're + built on when created, instead of needing to be set by multitooling the board + before creation. + - imageadd: Shuttle control consoles that are not properly connected to a shuttle + now have a new error screen sprite. + Teteshnik: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043D\u0435\u043A\u043E\u0442\ + \u043E\u0440\u044B\u043C \u0440\u0430\u0441\u0430\u043C \u0432\u043E\u0437\u043C\ + \u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0441\u0442\u0430\u0442\u044C \u0431\ + \u0435\u0437\u0431\u0438\u043B\u0435\u0442\u043D\u0438\u043A\u043E\u043C" + - experiment: "\u041F\u043E\u043C\u0435\u043D\u044F\u043B \u043D\u0430\u0437\u0432\ + \u0430\u043D\u0438\u0435 \u0431\u0435\u0437\u0431\u0438\u043B\u0435\u0442\u043D\ + \u0438\u043A\u0430 \u043D\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\ + \u043D\u043E\u0433\u043E \u0441\u0434\u0435\u043B\u0430\u043D\u043E \u0443\u0433\ + \u043E\u0434\u0443 \u0430\u0439\u0434\u0438" + rootoo807: + - bugfix: Fixes broken sprites / adds missing sprites for armbands, insulated gloves, + soft caps, blood masks on GAS. GAS can no longer wear overalls or wizard voidsuit + [snakes don't have legs for pants :( ]. + - bugfix: Adds missing sprite for flipped veteran's cap. +2024-11-07: + Mucker: + - tweak: Adjusted the spawn target for merc and raider to 3, and traitor to 1. + PsiOmegaDelta: + - tweak: Select loadout items again display an extended description when selected + for use. + Ryan180602: + - bugfix: Wristwatches show the date correctly. + - tweak: Posibrains can be fixed outside chassis. + - tweak: Removes the preset pronoun badge types, people can now customise them to + their wish. + - tweak: Adds another entry for the pride pins. Letting people take two now. + - tweak: Throat-slit timer changed from 3.24 ~ 0.8! seconds to 3.75 ~ 2.25. On success, + the user cannot act again for an extra second. + sdtwbaj: + - tweak: Flora can be cut away with a hatchet. + - tweak: Trees can be destroyed, and drop wood! + - rscadd: woodcutting.ogg from Polaris + - rscadd: tree stumps from Polaris + sick trigger: + - rscadd: Orders from supply now record what time the requst was made + sick-trigger: + - bugfix: Fixed being unable to spawn on landed colony ship. +2024-11-08: + Lexanx: + - rscadd: "\u0422\u0435\u043F\u0435\u0440\u044C \u0447\u0435\u043B\u043D\u043E\u043A\ + \u0438/\u0448\u0430\u0442\u0442\u043B\u044B \u0441\u043F\u043E\u0441\u043E\u0431\ + \u043D\u044B\u0435 \u043B\u0435\u0442\u0430\u0442\u044C \u0432 \u043A\u043E\u0441\ + \u043C\u043E\u0441\u0435 \u0438 \u0441\u043E\u0432\u0435\u0440\u0448\u0430\u0442\ + \u044C \u043F\u043E\u0441\u0430\u0434\u043A\u0438," + RocheHendson: + - tweak: "Seedship \u0442\u0435\u043F\u0435\u0440\u044C \u0438\u043C\u0435\u0435\ + \u0442 \u0434\u043E\u043B\u0436\u043D\u043E\u0441\u0442\u0438 \u0434\u043B\u044F\ + \ \u0437\u0430\u0445\u043E\u0434\u0430" + - tweak: "Seedship \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0432\u0430\u043D\u0438\ + \u0435 \u0442\u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u0435\u0442 \u043F\ + \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u043C\u044F \u0441\u0432\ + \u043E\u0435\u043C\u0443 \u043D\u0430\u0441\u043B\u0435\u0434\u0438\u044E" +2024-11-09: + Shegar: + - bugfix: "\u041C\u0438\u043D\u0438\u0444\u0438\u043A\u0441\u0438\u043A \u0434\u043B\ + \u044F \u0433\u0438\u0442\u0445\u0430\u0431\u0430" +2024-11-10: + Builder13: + - tweak: "\u0420\u0430\u0434\u0438\u043E \u043F\u0440\u0438 \u0441\u043E\u0431\u044B\ + \u0442\u0438\u0438 \u043F\u0441\u0438 \u0441\u0438\u0433\u043D\u0430\u043B\u0430\ + \ \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0434\u043E\u043B\u0436\ + \u043D\u043E \u0432\u043E\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u043E\u0432\ + \u0430\u0442\u044C \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043D\u044B" + Mucker: + - rscadd: You can now "hold" a humanoid mobs' hand when pulling them and targeting + one of their hands. + - bugfix: Antag latespawn scaling no longer considers players that aren't alive + or are offship when deciding maximum antags. + Shegar: + - bugfix: "\u0422\u0440\u0430\u043C\u043F\u043B\u0438\u043D \u0442\u0435\u043F\u0435\ + \u0440\u044C \u043D\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043A\u0438\u0434\ + \u0430\u0435\u0442 \u043D\u0430 5 \u0442\u0430\u0439\u0442\u043B\u043E\u0432\ + ." + - bugfix: "\u0413\u0435\u043D\u0435\u0440\u0430\u0442\u043E\u0440\u0443 \u0430\u043D\ + \u043E\u043C\u043E\u043A \u0442\u0435\u043F\u0435\u0440\u044C \u043D\u0435 \u043C\ + \u0435\u0448\u0430\u0435\u0442 railings" + - bugfix: "\u041B\u0430\u0432\u0430 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\ + \ \u043C\u043E\u0436\u0435\u0442 \u0441\u0436\u0438\u0433\u0430\u0442\u044C\ + \ \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u044B" + - bugfix: "\u0411\u0421\u0414 \u043F\u0440\u043E\u043B\u0438\u0432 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u043D\u0435 \u0441\u043F\u0430\u0432\u043D\u0438\u0442 \u0430\ + \u043D\u043E\u043C\u043A\u0438 \u0432 \u043A\u043E\u0441\u043C\u043E\u0441\u0435" + - bugfix: "\u0411\u0421\u0414 \u0442\u0435\u043F\u0435\u0440\u044C \u0443\u0434\u0430\ + \u043B\u044F\u0435\u0442 \u0430\u043D\u043E\u043C\u043A\u0438 \u043F\u043E\u0441\ + \u043B\u0435 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F \u0438\u0432\ + \u0435\u043D\u0442\u0430 (\u0414\u043E\u043B\u0436\u0435\u043D \u043F\u043E\ + \ \u043A\u0440\u0430\u0439\u043D\u0435\u0439 \u043C\u0435\u0440\u0435)" + - tweak: "\u041C\u0435\u0445 \u043F\u0440\u0438 \u0442\u0430\u0440\u0430\u043D\u0435\ + \ \u0446\u0435\u043B\u0438 \u0442\u043E\u0436\u0435 \u0434\u0435\u043B\u0430\ + \u0435\u0442 \u0448\u0430\u0433, \u043E\u0442 \u0447\u0435\u0433\u043E \u043C\ + \u0435\u0445\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u043D\u0435\u0432\u043E\ + \u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0431\u043B\u043E\u0447\u0438\ + \u0442\u044C \u043D\u0435 \u043C\u0435\u0445\u043E\u043C/\u0430\u0434\u0445\u0435\ + \u0440\u0430\u043D\u0442\u043E\u043C/\u0433\u0431\u0441\u043E\u043C" + - tweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0433\u043B\u044B\u0431\u044B\ + \ \u043D\u0430 \u043F\u043B\u0430\u043D\u0435\u0442\u0443 \u043B\u0451\u0434\ + . \u041A\u0440\u0430\u0441\u0438\u0432\u043E!" + - tweak: "\u0414\u0435\u0442\u0435\u043A\u0442\u043E\u0440 \u043D\u0435 \u043A\u0430\ + \u043A\u0430\u0435\u0442 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u043E\ + \u0439 \u0431\u0435\u0437 \u043D\u0443\u0436\u0434\u044B, \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0435\u0433\u043E \u043D\u0443\u0436\u043D\u043E \u0432\u043A\ + \u043B\u044E\u0447\u0430\u0442\u044C.(\u041A\u043E\u043D\u0442\u0440\u043E\u043B\ + \ + \u041B\u041A\u041C)" + - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u0430\u043D\u043E\u043C\u0430\u043B\ + \u0438\u0438 \u043F\u0440\u0438 \u043E\u0441\u043C\u043E\u0442\u0440\u0435 \u0434\ + \u0435\u0442\u0435\u043A\u0442\u0435\u0440\u043E\u043C \u043E\u0431\u043D\u0430\ + \u0440\u0443\u0436\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u043F\u043E\u043B\ + \u043D\u043E\u0441\u0442\u044C\u044E, \u0430 \u043D\u0435 \u0447\u0430\u0441\ + \u0442\u0438\u0447\u043D\u043E (\u041E\u0442 \u0447\u0435\u0433\u043E \u0448\ + \u0430\u043D\u0441\u044B \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\ + \u0438\u044F \u0434\u043E\u0432\u043E\u043B\u044C\u043D\u043E \u0442\u0430\u043A\ + \u0438 \u0443\u043F\u0430\u043B\u0438)" + - rscadd: "\u041F\u043E\u043B\u043D\u043E\u0441\u0442\u044C \u043F\u0435\u0440\u0435\ + \u043F\u0438\u0441\u0430\u043D\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\ + \ \u0432\u043B\u0438\u044F\u043D\u0438\u044F \u0430\u0440\u0442\u0435\u0444\u0430\ + \u043A\u0442\u043E\u0432 \u043D\u0430 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\ + \u0451\u043D\u043D\u044B\u0435 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0441\ + \ \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u0436\u0430\u043C\u0438, \u0434\ + \u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043D\u043E\u0432\u044B\u0435\ + \ \u044D\u0444\u0444\u0435\u043A\u0442\u044B. \u0423\u0441\u0438\u043B\u0435\ + \u043D\u0430 \u0432\u0430\u0436\u043D\u043E\u0441\u0442\u044C \u0438 \u043F\u043E\ + \u043B\u044C\u0437\u0430 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\ + \u043E\u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u043E\u0432 \u0438\ + \u0437-\u0437\u0430 \u044D\u0442\u043E\u0433\u043E." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0430\u043D\u0438\ + \u043C\u0430\u0446\u0438\u044F \u0443\u0432\u043E\u0440\u043E\u0442\u0430 \u043F\ + \u0440\u0438 \u043F\u0430\u0440\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\ + \u0438." + - rscadd: "\u041F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u043D\u0430 \u0441\u0438\ + \u0441\u0442\u0435\u043C\u0430 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0438\ + \u043D\u0433\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u043E\u0432\ + \ \u043D\u0430 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u0436\u0430. \u041E\ + \u043D\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u043F\u0440\u0438 \u043B\u044E\ + \u0431\u044B\u0445 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\ + \u0442\u0432\u0438\u044F\u0445 \u043F\u043E\u043D\u0438\u043C\u0430\u0442\u044C\ + , \u043A\u0442\u043E \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043D\u043E\ + \u0441\u0438\u0442\u0435\u043B\u044C \u0438 \u0432\u043B\u0438\u044F\u0442\u044C\ + \ \u043D\u0430 \u043D\u0435\u0433\u043E." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0421\u041D\u0415\u0413 \u043D\ + \u0430 \u043B\u0435\u0434\u044F\u043D\u0443\u044E \u043F\u043B\u0430\u043D\u0435\ + \u0442\u0443 \u0441 \u044D\u0444\u0444\u0435\u043A\u0442\u043E\u043C \u043D\u0430\ + \ \u044D\u043A\u0440\u0430\u043D\u0435 \u0438 \u0437\u0432\u0443\u043A\u043E\ + \u043C." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D Z \u0441\u043A\u0430\ + \u043D \u0443\u0440\u043E\u0432\u043D\u044F \u0434\u043B\u044F \u0434\u0435\u0442\ + \u0435\u043A\u0442\u043E\u0440\u0430" + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u043A\u0430\u043B\u043E\ + \u043B\u0430\u0437\u0430\u043D\u044C\u0435 \u043D\u0430 \u043F\u043B\u0430\u043D\ + \u0435\u0442\u0443 \u041B\u0401\u0414. \u041F\u043E\u043C\u043E\u0433\u0430\u0439\ + \u0442\u0435 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443, \u0438\ + \u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043A\u0438\u0440\ + \u043A\u0438, \u0433\u043E\u0442\u043E\u0432\u044C\u0442\u0435\u0441\u044C \u0444\ + \u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438 \u0438 \u043F\u0440\u0435\u043E\ + \u0434\u043E\u043B\u0435\u0432\u0430\u0439\u0442\u0435 \u0433\u043E\u0440\u044B\ + ." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u0443\u0441\u0442\u0430\ + \u043D\u043E\u0432\u0449\u0438\u043A \u043C\u0430\u044F\u0447\u043A\u043E\u0432\ + \ \u0434\u043B\u044F \u0431\u043E\u043B\u0435\u0435 \u043A\u043E\u043C\u0444\ + \u043E\u0440\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0441\u0442\u0440\u043E\ + \u0435\u043D\u0438\u044F \u043F\u0443\u0442\u0438 \u043D\u0430 \u043F\u043B\u0430\ + \u043D\u0435\u0442\u0430\u0445." + - rscadd: "\u0412\u0441\u0430\u0441\u044B\u0432\u0430\u044E\u0449\u0430\u044F \u0433\ + \u0440\u0430\u0432\u0438\u0430\u043D\u043E\u043C\u0430\u043B\u0438\u044F \u0438\ + \u0437\u043C\u0435\u043D\u0435\u043D\u0430 \u0441\u043E\u043F\u0440\u043E\u0442\ + \u0438\u0432\u043B\u044F\u0442\u044C\u0441\u044F \u0438\u043C \u0441\u0442\u0430\ + \u043B\u043E \u0441\u043B\u043E\u0436\u043D\u0435\u0435, \u0442\u0430\u043A\ + \ \u043A\u0430\u043A \u0438 \u0437\u0430\u0434\u0443\u043C\u044B\u0432\u0430\ + \u043B \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A, \u043D\ + \u043E \u0432 \u0442\u043E \u0436\u0435 \u0432\u0440\u0435\u043C\u044F, \u0432\ + \u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043C\u043E\u0433\u0430\ + \u0442\u044C \u0441\u0432\u043E\u0438\u043C \u0434\u0440\u0443\u0437\u044C\u044F\ + \u043C \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C\u0441\u044F \u0438\u0437\ + \ \u043D\u0435\u0451. \u0424\u0430\u0439\u043D\u0434 \u0430\u0443\u0442 \u0438\ + \u043D \u0433\u0435\u0439\u043C!" + - rscadd: "\u041B\u043E\u0433\u0438\u043A\u0430 \u044D\u043B\u0435\u043A\u0442\u0440\ + \ \u043F\u043E\u0434\u0442\u0438\u043F\u0430 \u0422\u0435\u0441\u043B\u0430\ + \ \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u043D\u0430, \u0442\u0435\ + \u043F\u0435\u0440\u044C \u0432\u0441\u044F \u043F\u043B\u0430\u043D\u0435\u0442\ + \u0430 \u043D\u0435 \u0441\u043C\u043E\u0436\u0435\u0442 \u043E\u0434\u043D\u043E\ + \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u0431\u0430\u0445\u0430\u0442\ + \u044C" + - rscadd: "\u0414\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0432\u044B\ + \u0441\u043E\u043A\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043D\ + \u0430\u0443\u043A\u0438 \u043F\u043E\u0437\u0432\u043E\u043B\u0438\u0442 \u043E\ + \u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C \u0442\u0438\u043F \u0430\ + \u043D\u043E\u043C\u0430\u043B\u0438\u0438" + - rscdel: "\u0421\u043F\u0430\u0432\u043D \u0430\u043D\u043E\u043C\u0430\u043B\u0438\ + \u0439 \u043E\u0442 \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u0430\u0440\u0442\ + \u0435\u0444\u0430\u043A\u0442\u043E\u0432 \u0432\u044B\u0432\u0435\u0434\u0435\ + \u043D \u0438\u0437 \u0440\u043E\u0442\u0430\u0446\u0438\u0438." + - imageadd: "\u0421\u043F\u0440\u0430\u0439\u0442\u044B \u0434\u043B\u044F \u0430\ + \u0440\u0442\u0435\u0444\u0430\u043A\u0442\u043E\u0432, \u043F\u043E\u0433\u043E\ + \u0434\u0430" + - maptweak: "\u0412\u044B\u0434\u0430\u043B \u0414\u0435\u043F\u043B\u043E\u0435\ + \u0440 \u043D\u0430 \u0441\u043A\u043B\u0430\u0434 \u042D\u041A. \u0414\u0435\ + \u0442\u0435\u043A\u0442\u043E\u0440, \u043C\u0435\u0448\u043E\u0447\u0435\u043A\ + \ \u0438 \u0434\u0435\u043F\u043B\u043E\u0435\u0440 \u043D\u0430 \u0441\u043A\ + \u043B\u0430\u0434 \u0448\u0430\u0445\u0442\u0451\u0440\u043E\u0432." + - spellcheck: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u043E\ + \u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0434\u0435\u0442\u0435\u043A\u0442\ + \u043E\u0440\u0430 \u0430\u043D\u043E\u043C\u0430\u043B\u0438\u0439" + - experiment: "\u041F\u043E\u0433\u043E\u0434\u0430 \u0411\u0443\u0440\u0430\u043D\ + , \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0434\u043B\u0430\u0433\u0438\u0432\ + \u0430\u0442\u044C \u043A\u043B\u0438\u0435\u043D\u0442. \u041F\u0438\u0448\u0438\ + \u0442\u0435 \u0447\u0451 \u043A\u0430\u0432\u043E." + - experiment: "\u0421\u0438\u043B\u044C\u043D\u043E \u0443\u0432\u0435\u043B\u0438\ + \u0447\u0435\u043D \u0440\u0430\u0437\u043C\u0435\u0440 \u043F\u043B\u0430\u043D\ + \u0435\u0442. \u0421\u043F\u0430\u0432\u043D\u0438\u0442 \u0442\u0430\u043A\ + \ \u0436\u0435, \u043A\u0430\u043A \u0438 \u043E\u0442 \u0430\u0434\u043C\u0438\ + \u043D\u043A\u0438." + - experiment: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0430\u043D\ + \u043E\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043B\u0430\u043D\u0435\ + \u0442\u0430: \u041B\u0435\u0442\u0430\u044E\u0449\u0438\u0435 \u043E\u0441\u0442\ + \u0440\u043E\u0432\u0430." + - balance: "\u0421\u0438\u043B\u044C\u043D\u043E \u0443\u0432\u0435\u043B\u0438\u0447\ + \u0438\u043B \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u043D\ + \u0430\u0441\u0451\u0440\u0430 \u0430\u043D\u043E\u043C\u0430\u043B\u0438\u044F\ + \u043C\u0438 \u043F\u0440\u0438 \u0411\u0421\u0414 \u043F\u0440\u043E\u043B\u0438\ + \u0432\u0435, \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043E \u043A\u043E\ + \u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0430\u043D\u043E\u043C\u043E\ + \u043A." + - balance: "\u041E\u0441\u043B\u0430\u0431\u043B\u0435\u043D\u043E \u0421\u0422\u0410\ + \u041D \u0432\u043B\u0438\u044F\u043D\u0438\u0435 \u044D\u043B\u0435\u043A\u0442\ + \u0440\u044B \u043D\u0430 \u0436\u0435\u0440\u0442\u0432\u0443" + - balance: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0432\u043E\u0437\ + \u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u043E\u0442 \u0430\u0442\u043B\ + \u0435\u0442\u0438\u043A\u0438 \u0441\u043E\u043F\u0440\u043E\u0442\u0438\u0432\ + \u043B\u044F\u0442\u044C\u0441\u044F \u0432\u043B\u0438\u044F\u043D\u0438\u044E\ + \ \u044D\u043B\u0435\u043A\u0442\u0440\u044B" + - balance: "\u041D\u0451\u0440\u0444 \u044D\u043D\u0435\u0440\u0433\u043E\u0449\u0438\ + \u0442\u043E\u0432 \u043C\u0435\u0445\u0430, \u0433\u0435\u043D\u0435\u0440\u0430\ + \u0446\u0438\u044F \u0442\u0435\u043F\u043B\u0430 \u043F\u0440\u0438 \u043F\u043E\ + \u043B\u0443\u0447\u0435\u043D\u0438\u0438 \u0443\u0440\u043E\u043D\u0430 \u0443\ + \u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0430 \u0432 2 \u0440\u0430\u0437\ + \u0430" + - admin: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0442\u0440\u0430\u043C\u043F\ + \u043B\u0438\u043D \u0432 \u0431\u0438\u043B\u0434\u0435\u0440 \u0430\u0434\u043C\ + \u0438\u043D\u043E\u0432." + Spookerton: + - bugfix: Corrected Masculinity. + The_Spanish_1nquisition: + - tweak: Tornakov took a marker to his poster. +2024-11-11: + BOT Eeshee: + - maptweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B\u0430 \u043F\u0435\u0440\ + \u0447\u0430\u0442\u043A\u0438, \u043C\u0430\u0441\u043A\u0438 \u0438 \u0438\ + \u0437\u043E\u043B\u0438 \u042D\u041A" + Lexanx: + - bugfix: "\u0411\u0430\u0433 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\ + \u0441\u0442\u0432\u0438\u044F \u0441\u0438\u043D\u0442\u0435\u0442\u043E\u0432" + - bugfix: "\u041D\u0435\u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u0430\u044F\ + \ \u0437\u043E\u043D\u0430 \u043C\u0435\u0440\u043A\u0448\u0438\u043F\u0430" + - bugfix: "\u041F\u043E\u0444\u0438\u043A\u0448\u0435\u043D\u0430 \u043A\u0440\u0430\ + \u0436\u0430 \u0442\u044E\u0440\u0444\u043E\u0432 \u043F\u0440\u0438 \u0432\u0437\ + \u043B\u0435\u0442\u0435" + Shegar: + - bugfix: "\u0417\u0430\u0434\u043D\u0438\u043A \u043A\u043E\u0441\u043C\u043E\u0441\ + \u0430 \u043D\u0435 \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F\ + \ \u0441\u0435\u0440\u044B\u043C \u0438\u0437-\u0437\u0430 \u043B\u0435\u0442\ + \u0430\u044E\u0449\u0438\u0445 \u043E\u0441\u0442\u0440\u043E\u0432\u043E\u0432" + - tweak: "\u0422\u0435\u043A\u0441\u0442 \u044D\u043D\u0434\u0440\u0430\u0443\u043D\ + \u0434\u0430 \u043C\u043E\u0434\u0430 \u0430\u043D\u043E\u043C\u0430\u043B\u0438\ + \u0439 \u043D\u0435 \u0436\u0438\u0440\u043D\u044B\u0439" + Teteshnik: + - tweak: "\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043B\ + \ \u0441\u043F\u0430\u0432\u043D\u0435\u0440\u044B \u0431\u0435\u0437\u0431\u0438\ + \u043B\u0435\u0442\u043D\u0438\u043A\u043E\u0432" +2024-11-12: + Builder13: + - bugfix: "\u0411\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\u043B\u044C\u0437\u044F\ + \ \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0433\u0430\u043B\u043B\u044E\ + \u0446\u0438\u043D\u0430\u0446\u0438\u0438 \u043E\u0442 \u0441\u0443\u043F\u0435\ + \u0440\u043C\u0430\u0442\u0435\u0440\u0438\u0438 \u043F\u0440\u0438 \u0430\u043A\ + \u0442\u0438\u0432\u043D\u044B\u0445 \u043C\u0435\u0437\u043E\u043D\u043D\u044B\ + \u0445 \u043E\u0447\u043A\u0430\u0445" +2024-11-13: + KandJX: + - maptweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043B\u0435\u0441\u0442\ + \u043D\u0438\u0446\u0443 \u043C\u0435\u0436\u0434\u0443 \u0431\u0440\u0438\u0433\ + \u043E\u043C \u0438 \u043C\u043E\u0441\u0442\u0438\u043A\u043E\u043C." + - maptweak: "\u0423\u0431\u0440\u0430\u043B \u0448\u043B\u044E\u0437 \u0432 \u0442\ + \u0435\u0445\u0430 \u0438\u0437 \u043A\u043E\u043C\u043D\u0430\u0442\u044B \u043A\ + \u0430\u043F\u0438\u0442\u0430\u043D\u0430." +2024-11-14: + Lexanx: + - bugfix: "\u041D\u0435\u043E\u0442\u0441\u0442\u044B\u043A\u043E\u0432\u043A\u0430\ + \ \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043F\u043E\u0434\u043E\ + \u0432" + - bugfix: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\ + \u044C \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u043E\ + \u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0441\u043E\u043B\u0438, \u043F\u043E\ + \u0441\u043B\u0435 \u0438\u0445 \u043F\u0435\u0440\u0435\u0441\u0431\u043E\u0440\ + \u043A\u0438" + - bugfix: "\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0430 \u0441 Advanced Landing\ + \ \u0432 \u043B\u0430\u0432\u0430\u0432\u043E\u0439 \u044D\u043A\u0437\u043E\ + \u043F\u043B\u0430\u043D\u0435\u0442\u0435" + - rscadd: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0412\u0438\ + \u0440\u0443\u0441\u043E\u043B\u043E\u0433\u0438\u044F." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u043F\u043E\u0434\ + \u043F\u0440\u043E\u0444\u0435\u0441\u0441\u0438\u044F \u0425\u0438\u043C\u0438\ + \u043A\u0430 - \u0412\u0438\u0440\u0443\u0441\u043E\u043B\u043E\u0433" + - rscadd: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u044B \u0412\u0438\ + \u0440\u0443\u0441\u044B" + LordNest: + - imageadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043E\u0442\u043E\u0431\ + \u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0437\u0430\u0431\u043B\u043E\u043A\ + \u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0445\u0440\u0430\ + \u043D\u0438\u043B\u0438\u0449\u0430 \u0441\u043A\u0430\u0444\u0430\u043D\u0434\ + \u0440\u043E\u0432" + awkardlyconfusedneuralnetwork: + - tweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0437\u0432\u0443\u043A\u0438\ + \ \u0434\u043B\u044F \u0430\u0438\u0440\u043B\u043E\u043A\u043E\u0432" + - tweak: Increases large map loading speed + - tweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B face direction \u043F\u043E\ + \ \u043D\u0430\u0436\u0430\u0442\u0438\u044E \u0438\u043A\u043E\u043D\u043A\u0438\ + \ \u0438\u043D\u0442\u0435\u043D\u0442\u0430 \u0434\u0432\u0438\u0436\u0435\u043D\ + \u0438\u044F \u0441 \u0437\u0430\u0436\u0430\u0442\u044B\u043C ctrl" +2024-11-16: + Lexanx & Gfitkiit: + - rscadd: "\u0414\u0440\u043E\u043F\u043F\u043E\u0434 \u0434\u043B\u044F \u043C\u0435\ + \u0440\u043A\u043E\u0432" +2024-11-19: + Baneuus: + - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u0432\u0435\u0434\u0435\u043D\ + \u0438\u0435 \u043A\u0440\u043E\u0432\u0438 \u0432 \u0437\u043E\u043B\u043E\u0442\ + \u043E\u0435 \u044F\u0434\u0440\u043E \u0441\u043F\u0430\u0443\u043D\u0438\u0442\ + \ \u0437\u043B\u043E\u0433\u043E \u043C\u043E\u0431\u0430." + - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u0432\u0435\u0434\u0435\u043D\ + \u0438\u0435 \u043A\u0440\u043E\u0432\u0438 \u0432 \u043B\u0430\u0437\u0443\u0440\ + \u043D\u043E\u0435 \u044F\u0434\u0440\u043E \u0441\u043F\u0430\u0443\u043D\u0438\ + \u0442 \u0437\u0435\u043B\u044C\u0435 \u0432\u043E\u0437\u0440\u043E\u0436\u0434\ + \u0435\u043D\u0438\u044F \u0441\u043B\u0438\u0437\u043D\u044F." +2024-11-22: + Lexanx: + - tweak: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0430 \u0444\u043E\u0440\u043C\ + \u0430 \u0441\u043D\u0430\u0431\u0436\u0435\u043D\u0438\u044F 32" + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0437\u0430\u0440\u044F\u0434\ + \u043D\u0438\u043A \u0431\u043E\u0440\u0433\u043E\u0432 \u043D\u0430 \u0413\u0423\ + \u041F" + Mucker: + - bugfix: Simple mobs will not longer endlessly attack doors when they lose their + target. + PurplePineapple: + - bugfix: Clicking a victim with an item on disarm intent calls use_weapon(). Disarm + intent/Dislocation combat for melee works again. + Spookerton: + - tweak: Added a preference option for toggling run on shift. +2024-11-23: + "\u0412\u0430\u0448\u041D\u0438\u043A\u043D\u0435\u0439\u043C": + - bugfix: "\u0410\u043D\u043E\u043C\u0430\u043B\u0438\u0438 \u043D\u0430 \u0442\u0430\ + \u0439\u043B\u0435 \u043E\u0431\u043B\u0430\u043A \u0431\u043E\u043B\u044C\u0448\ + \u0435 \u043D\u0435 \u0434\u0430\u044E\u0442 \u0438\u043C \u0440\u0430\u0441\ + \u043A\u0440\u044B\u0432\u0430\u0442\u044C\u0441\u044F (\u0411\u043E\u043B\u044C\ + \u0448\u0435 \u043D\u0435 \u0432\u044B\u0439\u0434\u0435\u0442 \u0441\u043F\u0440\ + \u044F\u0442\u0430\u0442\u044C\u0441\u044F \u043E\u0442 \u0432\u0441\u0430\u0441\ + \u044B\u0432\u0430\u044E\u0449\u0435\u0439 \u0430\u043D\u043E\u043C\u0430\u043B\ + \u0438\u0438 \u0432 \u043F\u0443\u0447\u0438\u043D\u0430\u0445 \u043E\u0431\u043B\ + \u0430\u043A)" + - bugfix: "\u041F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u043D\u0430 \u0440\u0430\ + \u0431\u043E\u0442\u0430 \u0432\u0441\u0430\u0441\u044B\u0432\u0430\u044E\u0449\ + \u0435\u0439 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043E\u043D\ + \u043D\u043E\u0439 \u0430\u043D\u043E\u043C\u0430\u043B\u0438\u0438" + - bugfix: "\u041C\u0435\u0445 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\ + \ \u043D\u0435\u0443\u044F\u0432\u0437\u0438\u043C \u0434\u043B\u044F \u043E\ + \u0431\u0430\u043A" + - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u0435\u0437\u0434\u0435 \u0432\ + \ \u043A\u043E\u0434\u0435 \u043D\u0435 Zjarka, \u0430 Zharka" + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0434\u0438\u043A\u0438\u0439\ + \ \u0441\u0430\u043C\u043E\u043F\u0430\u043B\u044C\u043D\u044B\u0439 \u0434\u0435\ + \u0442\u0435\u043A\u0442\u043E\u0440 \u0413\u044E\u0440\u0437\u0430 \u0434\u043B\ + \u044F \u0413\u041A\u041A" + - rscadd: "\u041E\u0431\u043B\u0430\u043A\u0430 \u0438\u0437\u043B\u0443\u0447\u0430\ + \u044E\u0442 \u043F\u0435\u0440\u0441\u0438\u043A\u043E\u0432\u044B\u0439 \u0441\ + \u0432\u0435\u0442" + - rscadd: "\u0422\u0440\u0430\u0432\u0430 \u0438\u0437\u043B\u0443\u0447\u0430\u0435\ + \u0442 \u043F\u0440\u0438\u044F\u0442\u043D\u044B\u0435 \u0437\u0435\u043B\u0435\ + \u043D\u043E\u0432\u0430\u0442\u044B\u0439 \u0441\u0432\u0435\u0442" + - rscadd: "\u041F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u043D\u0430 \u0440\u0430\ + \u0431\u043E\u0442\u0430 \u043E\u0431\u043B\u0430\u043A\u043E\u0432" + - maptweak: "\u0412\u044B\u0434\u0430\u043B \u043D\u0430 \u0441\u043A\u043B\u0430\ + \u0434 \u0413\u041A\u041A 1 \u0433\u044E\u0440\u0437\u0443 \u0438 3 \u043F\u0430\ + \u0447\u043A\u0438 \u0431\u043E\u043B\u0442\u0438\u043A\u043E\u0432. \u0421\u043F\ + \u0430\u0441\u0438\u0431\u043E \u043C\u0435\u0441\u0442\u043D\u043E\u043C\u0443\ + \ \u0438\u043D\u0436\u0435\u043D\u0435\u0440\u0443." + - imageadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0438\u043A\u043E\u043D\ + \u043A\u0438 \u0413\u044E\u0440\u0437\u044B" +2024-11-25: + Banditoz: + - bugfix: Fixed images in newscaster articles not showing up if the channel has + special symbols in its title. + Builder13: + - bugfix: Fixed a bug where Mules were not getting guaranteed psi latency + Hubblenaut: + - bugfix: Fixes various issues with the paint sprayer + - bugfix: Fixes pipes, wires, atmos machinery and other specific object types adjacent + to walls being hard to click. + - bugfix: The construction of support lattices is no longer blocked by objects on + lower z-levels. + - bugfix: Construction of lattices and floors on holes is no longer free. + - rscadd: Adds headpats. Aim for the head when performing a hug. + - bugfix: Fixes the emergency shield generator not blocking air. + - bugfix: Fixes taped paper not correctly being placed under the cursor. + - bugfix: Fixes the removal or placing of floor causing dark areas. + - rscadd: Adds a radial menu for choosing cable colors. + - tweak: A multitool is no longer necessary for choosing cable colors. Use them + in your hand. + - rscdel: Removes purple cable so all cable colors fit on one menu page. + - bugfix: Fixes not being able to put the light replacer into a container. + - rscadd: The paint sprayer now uses a radial menu and has some more decals available. + - tweak: The paint sprayer now uses mouse position to determine the direction of + all decals on placement -- not just quarter-tiles. + - bugfix: The paint sprayer can now once again be used on airlocks without issue. + - tweak: Pumps and valves are now hidden by catwalks. + - tweak: Mapped pumps and valves can be removed without having to pry off the floor + tile. + - imageadd: New sprites for grey, white and dark floor and mono floor tiles + JuneauQT: + - bugfix: Shrouded, Chlorine, and Volcanic exoplanet clouds now generate the way + they were intended to instead of being solid black + - rscadd: Added the Alliance United Flotillas Branch and three ranks for it to ID + cards (and all other places Branch can be set.) + - tweak: ICCGN and SCGA ranks now have their officer/enlisted badge included in + their define. + - tweak: Refactors ranking orders of Fleet and Expeditionary Corps ranks to the + newer standard + - bugfix: The 'Admiral' and 'Commandant of the Expeditionary Corps' ranks of the + Expedtionary Corps now function correctly. + Merlin1230: + - bugfix: Chairs and beds return their construction cost when deconstructed + - tweak: Padded chairs now only cost 1 sheet to make + - bugfix: Makeshift splints are now fixed and can be made again by applying tape + to a rod + Mucker: + - tweak: Nacelles APCs are no longer affected by the grid check event. + - admin: Added a verb to set how long before the initial continue vote occurs to + the 'Server' tab. + - admin: Say messages heard by your mob while aghosted will show up in chat with + a 'Near you:' prefix. + - bugfix: Shuttle control consoles will once again reconnect to their shuttle if + dismantled and rebuilt. + - admin: Added logging of computer commands to the Secrets 'Investigation' menu. + PurplePineapple: + - tweak: Changes the wood pump shotgun to 'Crawford' from 'Bulldog' to reduce confusion. + The riot version is now the 'Bateman'. + Qlonever: + - bugfix: Toggling fullscreen no longer adds a line of empty space to the window. + Ryan180602: + - tweak: Hyperzine now reacts negatively with opiates + Sbotkin: + - tweak: Medical system control for mechs is available for printing from round start. + - tweak: All system controls require Data 1 and yield the appropriate origin tech + upon destruction. + - tweak: "Fleet \u0441haplains can be unskilled in small arms now." + - rscadd: Envelopes are craftable from cardboard. + - rscadd: Envelopes can be sealed and resealed with rubber stamps. Open envelope + will show the last stamp it was sealed with. + - bugfix: Fixed metal foam not blocking air. + - spellcheck: Changes the wording of the cryo cell's cryostasis setting, making + it more clear. High intensity makes people freeze deeper and metabolize slower, + good for stasis. Low intensity makes people freeze less and metabolize faster, + good for healing. + - rscadd: Added stoles (accessory) for chaplains, in the loadout. + - rscadd: Added the matching hood to the chaplain's locker. + - maptweak: Holopad and a filling cabinet for the chaplain's office. + - tweak: Various religious stuff can be carried on the chaplain's hoodie. + SierraKomodo: + - tweak: Toolbelts can now hold Rapid Construction Devices + - bugfix: Droppers can now be used on mobs on help intent again. + - tweak: Firing a gun now uses the same red text style for the user as is used for + observers. + - bugfix: Cargo piles stacked on the same tile no longer block eachother from being + cleaned up. + - tweak: Colors used for certain types of in-chat messages have been adjusted. Primarily, + there is now a different in color between warning (red -> orange bold italic) + and danger (red bold), and notice (blue), info (blue -> purple), and subtle + (blue -> gray italic). + - tweak: Removing papers from noticeboards now places the paper in your hands instead + of on the floor, if there's a free hand. + - bugfix: Removing papers from noticeboards now properly adds fingerprints to the + removed paper. + - tweak: Colors and styles used for various injury states when examining carbon + mobs have been individually tweaked. Injuries are now red again. + - rscadd: Added additional lines to the list of options for legion broadcasts. + - tweak: Chat messages for buckling and unbuckling are now blue instead of OH GOD + OH FUCK RED. + Spookerton: + - admin: Atom overlays and underlays no longer incorrectly appear modifiable via + VV. + - tweak: Hydrogen tanks' supply order name better reflects its contents. + - soundadd: New sounds for legion warp in effects. + The_Spanish_1nquisition: + - rscdel: Removed outdated event related memos + - rscadd: Added new event related (and other) memos + The_Spanish_1nquisition, Albens, thestripes: + - rscadd: more memos + caledfwlchschime: + - soundadd: Added sound effects for legion voices. + thestripes: + - rscadd: Rewrites the hailer description to be less rude. +2024-11-27: + Builder13: + - bugfix: Fixed languages for papers printed from faxes and photocopiers. + - tweak: "\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043E \u043C\u0430\u043A\ + \u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\ + \u0447\u0435\u0441\u0442\u0432\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\ + \u0432 \u0434\u043B\u044F \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u043F\u0435\ + \u0440\u0441\u043E\u043D\u0430\u0436\u0430 \u043D\u0430 500" + Hubblenaut: + - rscadd: Characters that are at least 'experienced' in atmospherics will find that + the rapid piping device will place pipes intuitively based on mouse position. + - bugfix: Fixes escape pods not repressurizing after launch. + - rscadd: Adds an airlock controller to the engine room + - bugfix: Fixes the paint sprayer for borgs. + JebediahTechnic: + - balance: Laser DMR's damage increased dramatically, long-range accuracy buffed, + one-handed and un-scoped accuracy negatives increased, rate of fire slightly + increased. + JuneauQT: + - tweak: Added a slight margin of error to the number of ruins shown by an exoplanet + scan + Lexanx: + - rscadd: "\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u044B \u043E\u0445\ + \u043B\u0430\u0436\u0434\u0430\u044E\u0449\u0438\u0435 \u043F\u043E\u044F\u0441\ + \u0430" + - rscadd: "\u0417\u043E\u043D\u0430 \u043F\u043E\u0441\u0430\u0434\u043A\u0438 \u0432\ + \ \u0430\u0434\u0432\u0430\u043D\u0441\u0435\u0434\u043B\u0435\u043D\u0434\u0438\ + \u043D\u0433\u0435 \u0442\u0435\u043F\u0435\u0440\u044C \u0432\u0438\u0434\u043D\ + \u0430 \u0432 \u0432\u0438\u0434\u0435 \"\u0442\u0435\u043D\u0438\"" + LynxQueen: + - tweak: Slows e-cig consumation and also allows player to take drags off of the + e-cig + Mucker: + - tweak: Edited the IT Skill description to reflect that the command line is usable + with Basic skill. + - tweak: 'Adjusted the following computer command skill requirements: ifconfig -> + Basic, hwinfo -> Basic, status -> Basic, log -> Skilled, sysnotify -> Experienced.' + PurplePineapple: + - bugfix: Adds missing toggle verbs to take off the suit when the RIG is offline + and only when offline. + - tweak: The speed at which you can activate your RIG is dependent on your EVA skill. + Trained is the same as previous normal. + Sbotkin: + - tweak: MRE crates come with at least one vegan and at least one sugar-free protein + option. + SierraKomodo: + - bugfix: Fixes certain railguns having invalid sprite overlays. + - tweak: Mercenaries can now buy the energy marksman rifle through the uplink for + 50 buckaroos. _Do_ test this out for me. + - bugfix: power cell rack PSU machines now accept power cells again. Probably also + fixes some other non-standard item->machinery interactions. + - tweak: Attempting to add a non-component item to a machine that can accept said + item, but is already full, now displays a user feedback message. + - bugfix: Fixes machine frames being unwrenchable. + Spookerton: + - bugfix: Organ scarring is correctly reported by scanners. + - tweak: Non-metallic utensils are no longer conductive. + - tweak: Utensils indicate their material in their name. + TheStripes: + - spellcheck: Tweaked the th'oom reagent description to make its delectable origins + unclear. +2024-11-29: + Banditoz: + - tweak: Borgs can now see the in-round date and time. + SierraKomodo: + - bugfix: Half-pint glass no longer appears twice in the microlathe. +2024-11-30: + DieSiege: + - rscadd: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0438\u0435/\u043F\ + \u043E\u0440\u0442 \u043F\u043B\u0430\u043D\u0435\u0442 \u0434\u043B\u044F \u0432\ + \u044B\u0431\u043E\u0440\u0430" + - bugfix: "\u0416\u0438\u0442\u0435\u043B\u044F\u043C \u041F\u043B\u0443\u0442\u043E\ + \u043D\u0430 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D \u0413\u0430\ + \u0442\u0442\u0435\u0440 \u043A\u0430\u043A \u0434\u043E\u0441\u0442\u0443\u043F\ + \u043D\u044B\u0439 \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\ + \u0437\u044B\u043A" + The_Spanish_1nquisition: + - rscadd: Added Party Cards for the SCG's major political parties + - rscadd: Added Cultural Options for Wikified Planets + - rscadd: Added Passports for said Planets +2024-12-01: + DieSiege: + - imageadd: "\u041F\u043E\u0440\u0442 \u0441\u043F\u0440\u0430\u0439\u0442\u043E\ + \u0432 \u043D\u0438\u0436\u043D\u0435\u0433\u043E \u0431\u0435\u043B\u044C\u044F\ + \ \u0441 \u0438\u043D\u0444\u0438\u043D\u0438\u0442\u0438. \u0422\u0440\u0438\ + \ \u0432\u0438\u0434\u0430 \u0442\u0440\u0443\u0441\u043E\u0432, \u043E\u0434\ + \u0438\u043D \u0432\u0438\u0434 \u0431\u044E\u0441\u0442\u0433\u0430\u043B\u0442\ + \u0435\u0440\u0430." + LordNest: + - maptweak: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0437\u043E\u043D\ + \u0443 \u0432\u0442\u043E\u0440\u043E\u0433\u043E \u043F\u043E\u0434\u0430 \u0438\ + \ \u0434\u043E\u0431\u0430\u0432\u0438\u043B \u043A\u043D\u043E\u043F\u043A\u0438\ + \ \u0434\u043B\u044F \u0432\u0437\u0440\u044B\u0432\u043E\u0441\u0442\u043E\u0439\ + \u043A\u0438\u0445 \u0434\u0432\u0435\u0440\u0435\u0439 \u0434\u043B\u044F \u0440\ + \u0435\u0430\u043A\u0442\u043E\u0440\u0430" + - maptweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B\u0438 \u0413\u041A\u041A\ + \u0448\u043D\u0438\u043A\u0430\u043C \u0434\u0440\u043E\u0431\u043E\u0432\u0438\ + \u043A\u0438 \u0434\u043B\u044F \u043E\u0445\u043E\u0442\u044B \u043D\u0430\ + \ \u0444\u0430\u0443\u043D\u0443 \u0438 \u043B\u0430\u043D\u0447\u0431\u043E\ + \u043A\u0441\u044B" +2024-12-02: + Baneuus: + - tweak: "\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u043B \u0437\u0430\u043C\u0435\ + \u0434\u043B\u043E \u0434\u0438\u043E\u043D\u0430\u043C \u0441 5 \u0434\u043E\ + \ 2" + - tweak: "\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u043B \u0440\u0430\u0441\u0445\ + \u043E\u0434 \u0432\u043E\u0434\u044B \u0434\u0438\u043E\u043D\u0430\u043C." + - tweak: "\u0421\u0434\u0435\u043B\u0430\u043B \u0432\u043E\u0437\u043C\u043E\u0436\ + \u043D\u043E\u0441\u0442\u044C \u0434\u0438\u043E\u043D\u0430\u043C \u0438\u0437\ + \u0443\u0447\u0438\u0442\u044C \u043A\u0441\u0435\u043D\u043E\u044F\u0437\u044B\ + \u043A\u0438." +2024-12-03: + Cakey: + - bugfix: Fixed some standard window sprites. + emmanuelbassil: + - rscadd: Adds ability to select minor or severe allergies to selected reagents + in character setup screen. + - rscadd: Adds Allergy autoinjectors in loadout; can only be equipped if character + has an allergy. Contains inaprovaline and epinephrine. + - rscadd: Minor allergies cause itching and resolve on their own with time. Can + also be resolved with inaprovaline. + - rscadd: Major allergies cause breathing problems, do not resolve on their own. + Require inaprovaline for stabilization and epinephrine to reverse the reaction. + - rscadd: Medical records automatically populate with allergies selected in setup + screen. + - tweak: Can now set specific traits as requirements for loadout items; currently + only used for allergy autoinjectors. + - admin: Adds verbs in mob variable panel to add/remove traits +2024-12-04: + Lexanx: + - rscadd: "\u0414\u0438\u043E\u043D\u044B, \u0410\u0434\u0445\u0435\u0440\u0430\u043D\ + \u0442\u044B, \u0418\u041F\u0421, \u043C\u043E\u0433\u0443\u0442 \u0432\u0437\ + \u044F\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435 \u044F\u0437\u044B\u043A\ + \u043E\u0432" + - rscadd: "\u0410\u0434\u0445\u0435\u0440\u0430\u043D\u0442\u0430\u043C \u0434\u043E\ + \u0431\u0430\u0432\u043B\u0435\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435\ + \ \u044F\u0437\u044B\u043A\u043E\u0432 \u0434\u043B\u044F \u0432\u044B\u0431\ + \u043E\u0440\u0430" + - bugfix: "\u041F\u043E\u0444\u0438\u043A\u0448\u0435\u043D\u043E \u043D\u0435\u0441\ + \u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0430\u043D\u0442\u0430\u0439\u043C\ + \u043E\u0432 \u0443 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430" + - bugfix: "\u0427\u0435\u043B\u043D\u043E\u043A\u0438 \u041F\u0438\u043E\u043D\u0435\ + \u0440\u043E\u0432 \u0438 \u041F\u0430\u0442\u0440\u0443\u043B\u044C\u043A\u0438\ + \ \u0442\u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0433\u0443\u0442 \u043A\ + \u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E \u0441\u0430\u0434\u0438\u0442\ + \u0441\u044F \u0447\u0435\u0440\u0435\u0437 \u043B\u0435\u043D\u0434\u0438\u043D\ + \u0433" + Shegar: + - rscadd: "\u0421\u0443\u0434\u043D\u043E \u0421\u043A\u0440\u0435\u043B\u043B\u043E\ + \u0432 \u0437\u0430\u043B\u0438\u0442\u043E \u043C\u043E\u0434\u043E\u0432\u043E\ + \ \u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E \u0434\u043B\ + \u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439" + - tweak: "\u041F\u043E\u043F\u0440\u0430\u0432\u0438\u043B \u0430\u0432\u0442\u043E\ + \u0440\u0441\u0442\u0432\u043E \u043C\u043E\u0434\u0430 \u043D\u0430 \u043E\u0440\ + \u0443\u0436\u0438\u0435(\u0441\u043F\u0440\u0430\u0439\u0442\u044B)" + - tweak: "\u041F\u043E\u043F\u0440\u0430\u0432\u0438\u043B \u043F\u0443\u0442\u0438\ + \ \u0441\u043F\u0440\u0430\u0439\u0442\u0430 \u0444\u043B\u0435\u0448\u0435\u0442\ + \u0442\u044B \u0441\u043A\u0440\u0435\u043B\u043B\u043E\u0432" + - imageadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043D\u043E\u0432\u044B\ + \u0435(\u0441 \u0438\u043D\u0444\u0438\u043D\u0438\u0442\u0438) \u0441\u043F\ + \u0440\u0430\u0439\u0442\u044B \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\ + \u0430\u043C \u0441\u043A\u0440\u0435\u043B\u043B\u043E\u0432" +2024-12-05: + Banditoz: + - rscadd: Borg module activations are now announced to their department. +2024-12-07: + Sbotkin: + - rscdel: Removed the cyborgification contract from the report editor. It's illegal, + btw. +2024-12-09: + Builder13: + - rscadd: "\u041F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u044B \u043F\ + \u0440\u0435\u0444\u044B \u043D\u0430 \u043C\u0443\u0437\u044B\u043A\u0443:\ + \ Play jukeboxes and boomboxes \u0438 Play music players" + RocheHendson: + - bugfix: "\u0417\u0430\u043C\u0435\u043D\u0438\u043B outlet \u043D\u0430 chute\ + \ \u0432 \u043A\u0430\u0440\u0433\u043E \u043F\u043E\u0447\u0442\u0435" diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2716.yml b/html/changelogs/AutoChangeLog-sierra-pr-2716.yml deleted file mode 100644 index cb447cf21a1a0..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2716.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Lexanx -changes: - - {bugfix: Предмет(Explosion Wather) для получения научных очков из взрывов снова - работает} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2717.yml b/html/changelogs/AutoChangeLog-sierra-pr-2717.yml deleted file mode 100644 index 9b532cc93a276..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2717.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: awkardlyconfusedneuralnetwork -changes: - - {experiment: 'Ускорил инит, да.'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2719.yml b/html/changelogs/AutoChangeLog-sierra-pr-2719.yml deleted file mode 100644 index 445a5489ebe69..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2719.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Gaxeer, awkardlyconfusedneuralnetwork -changes: - - {bugfix: Починил обновление оверлея газов} - - {bugfix: 'Починил то, что рычаг на конвейере проходит все объекты в мире'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2720.yml b/html/changelogs/AutoChangeLog-sierra-pr-2720.yml deleted file mode 100644 index f45aa93b6d088..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2720.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Gaaxer, awkardlyconfusedneuralnetwork -changes: - - {tweak: Инит ксеноархиологии теперь быстрее} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2721.yml b/html/changelogs/AutoChangeLog-sierra-pr-2721.yml deleted file mode 100644 index 261f512ec91eb..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2721.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: awkardlyconfusedneuralnetwork -changes: - - {tweak: 'Инпут теперь обрабатывается раньше других сабсистем, должно повысить - плавность игры.'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2724.yml b/html/changelogs/AutoChangeLog-sierra-pr-2724.yml deleted file mode 100644 index 305eee027bf09..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2724.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Builder13 -changes: - - {rscadd: Добавлена единственная возможность чинить переломы для Адхерантов - через - минеральные ванны. Процедура может быть длительной.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2725.yml b/html/changelogs/AutoChangeLog-sierra-pr-2725.yml deleted file mode 100644 index cd15e065a26c7..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2725.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Teteshnik -changes: - - {rscadd: Новый флаг для профессий позволяющий делать профессию только возможным - раундстартом} - - {rscadd: Добавил безбилетников} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2726.yml b/html/changelogs/AutoChangeLog-sierra-pr-2726.yml deleted file mode 100644 index 1747928bd5b96..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2726.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Builder13 -changes: - - {rscadd: Возвращены шансы на пси латентность при заходе в раунд} - - {rscadd: Пси сигнал возвращен в ротацию событий} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2727.yml b/html/changelogs/AutoChangeLog-sierra-pr-2727.yml deleted file mode 100644 index effa3e51d9235..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2727.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Neonvolt -changes: - - {bugfix: Исправлены дополнительные пропавшие спрайты Восхождения и недоработки - связанные с их расами} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2728.yml b/html/changelogs/AutoChangeLog-sierra-pr-2728.yml deleted file mode 100644 index 7351a2356b47c..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2728.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Teteshnik -changes: - - {tweak: Поставил возможность изменения/добавления хоткея для фейс дира.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2742.yml b/html/changelogs/AutoChangeLog-sierra-pr-2742.yml deleted file mode 100644 index 225adbf589894..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2742.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: Lexanx -changes: - - {rscadd: Джетпаки в ветке исследований РнД} - - {rscadd: Кинетический сборщик в производстве РнД} - - {rscadd: Платы мусоропереработчиков в ветке исследований РнД} - - {rscadd: 'Компот (water = 2, berry = 1, apple = 1, pear = 1)'} - - {rscadd: Возвращены рецепты отвердевания золота и серебра.} - - {rscadd: Плата консоли трафика в ветке исследований РнД.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2754.yml b/html/changelogs/AutoChangeLog-sierra-pr-2754.yml deleted file mode 100644 index 4402a6877c0db..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2754.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Builder13 -changes: - - {tweak: Генокрад больше не утрачивает навыки от профессии при получении роли} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2755.yml b/html/changelogs/AutoChangeLog-sierra-pr-2755.yml deleted file mode 100644 index 0f9fb5b42d270..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2755.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Builder13 -changes: - - {admin: 'Возвращена переменная stop_sight_update для мобов, чтобы исключить обновление - зрения при ее включении'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2764.yml b/html/changelogs/AutoChangeLog-sierra-pr-2764.yml deleted file mode 100644 index e75f504646a71..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2764.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Lexanx -changes: - - {imageadd: Новые фуллскрин оверлеи повреждений ИПС и Адхерентов и ППТ} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2769.yml b/html/changelogs/AutoChangeLog-sierra-pr-2769.yml deleted file mode 100644 index 6caebeb8907cf..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2769.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: KOJIECO -changes: - - {rscadd: Добавил скрелльскую одежду для всех каст от Failu.} -delete-after: true diff --git a/icons/mob/human_races/species/nabber/blood_mask.dmi b/icons/mob/human_races/species/nabber/blood_mask.dmi index 7f4ff338dff5b..7072017d2d1b3 100644 Binary files a/icons/mob/human_races/species/nabber/blood_mask.dmi and b/icons/mob/human_races/species/nabber/blood_mask.dmi differ diff --git a/icons/mob/onmob/onmob_accessories.dmi b/icons/mob/onmob/onmob_accessories.dmi index 03dd97b6f1edf..90eecb2a663b0 100644 Binary files a/icons/mob/onmob/onmob_accessories.dmi and b/icons/mob/onmob/onmob_accessories.dmi differ diff --git a/icons/mob/onmob/onmob_modular_armor.dmi b/icons/mob/onmob/onmob_modular_armor.dmi index c677c327e5f63..d3c6d23fd38cd 100644 Binary files a/icons/mob/onmob/onmob_modular_armor.dmi and b/icons/mob/onmob/onmob_modular_armor.dmi differ diff --git a/icons/mob/onmob/onmob_suit.dmi b/icons/mob/onmob/onmob_suit.dmi index a61a567909a8e..cdd965312a55c 100644 Binary files a/icons/mob/onmob/onmob_suit.dmi and b/icons/mob/onmob/onmob_suit.dmi differ diff --git a/icons/mob/simple_animal/hivebot.dmi b/icons/mob/simple_animal/hivebot.dmi index e18209733d8fc..4d353ccda6075 100644 Binary files a/icons/mob/simple_animal/hivebot.dmi and b/icons/mob/simple_animal/hivebot.dmi differ diff --git a/icons/mob/species/nabber/onmob_accessories_gas.dmi b/icons/mob/species/nabber/onmob_accessories_gas.dmi index 90d5355875e6f..c85168547d3a5 100644 Binary files a/icons/mob/species/nabber/onmob_accessories_gas.dmi and b/icons/mob/species/nabber/onmob_accessories_gas.dmi differ diff --git a/icons/mob/species/nabber/onmob_hands_gas.dmi b/icons/mob/species/nabber/onmob_hands_gas.dmi index 442a1e7bab831..f0cfc658b0c7d 100644 Binary files a/icons/mob/species/nabber/onmob_hands_gas.dmi and b/icons/mob/species/nabber/onmob_hands_gas.dmi differ diff --git a/icons/mob/species/nabber/onmob_head_gas.dmi b/icons/mob/species/nabber/onmob_head_gas.dmi index 1836cd0a96a7b..d2b84038c2140 100644 Binary files a/icons/mob/species/nabber/onmob_head_gas.dmi and b/icons/mob/species/nabber/onmob_head_gas.dmi differ diff --git a/icons/mob/species/nabber/onmob_suit_gas.dmi b/icons/mob/species/nabber/onmob_suit_gas.dmi index de9ca34343f9e..12765fbbc6dd4 100644 Binary files a/icons/mob/species/nabber/onmob_suit_gas.dmi and b/icons/mob/species/nabber/onmob_suit_gas.dmi differ diff --git a/icons/obj/clothing/obj_accessories.dmi b/icons/obj/clothing/obj_accessories.dmi index f9b5043c5cede..9948e18d39640 100644 Binary files a/icons/obj/clothing/obj_accessories.dmi and b/icons/obj/clothing/obj_accessories.dmi differ diff --git a/icons/obj/clothing/obj_suit.dmi b/icons/obj/clothing/obj_suit.dmi index ffdf5c3725673..95fdc5db3973f 100644 Binary files a/icons/obj/clothing/obj_suit.dmi and b/icons/obj/clothing/obj_suit.dmi differ diff --git a/icons/obj/clothing/obj_suit_modular_armor.dmi b/icons/obj/clothing/obj_suit_modular_armor.dmi index 1f269ce245b91..bbc92abe719f8 100644 Binary files a/icons/obj/clothing/obj_suit_modular_armor.dmi and b/icons/obj/clothing/obj_suit_modular_armor.dmi differ diff --git a/icons/obj/flora/deadtrees.dmi b/icons/obj/flora/deadtrees.dmi index 8379a3348f2b5..34b550cee24e9 100644 Binary files a/icons/obj/flora/deadtrees.dmi and b/icons/obj/flora/deadtrees.dmi differ diff --git a/icons/obj/flora/pinetrees.dmi b/icons/obj/flora/pinetrees.dmi index 7cc00efc2dc4e..68554fbddb7b3 100644 Binary files a/icons/obj/flora/pinetrees.dmi and b/icons/obj/flora/pinetrees.dmi differ diff --git a/icons/obj/guns/railgun.dmi b/icons/obj/guns/railgun.dmi index 63945dd9503cc..eb4b91ffffcd1 100644 Binary files a/icons/obj/guns/railgun.dmi and b/icons/obj/guns/railgun.dmi differ diff --git a/icons/obj/guns/railgun_adv.dmi b/icons/obj/guns/railgun_adv.dmi index 32dd596eb0397..d71af43269bcf 100644 Binary files a/icons/obj/guns/railgun_adv.dmi and b/icons/obj/guns/railgun_adv.dmi differ diff --git a/icons/obj/guns/railgun_heavy.dmi b/icons/obj/guns/railgun_heavy.dmi index 93b1f29e98074..273858faae807 100644 Binary files a/icons/obj/guns/railgun_heavy.dmi and b/icons/obj/guns/railgun_heavy.dmi differ diff --git a/icons/obj/guns/railgun_old.dmi b/icons/obj/guns/railgun_old.dmi index 31410f8ff4c3c..75a0d780f3174 100644 Binary files a/icons/obj/guns/railgun_old.dmi and b/icons/obj/guns/railgun_old.dmi differ diff --git a/icons/obj/machines/computer.dmi b/icons/obj/machines/computer.dmi index 53d576b2bdaa9..ead1dbe2b9255 100644 Binary files a/icons/obj/machines/computer.dmi and b/icons/obj/machines/computer.dmi differ diff --git a/icons/obj/structures/contraband.dmi b/icons/obj/structures/contraband.dmi index 71c5ddcdde15e..b69dc281bf2a0 100644 Binary files a/icons/obj/structures/contraband.dmi and b/icons/obj/structures/contraband.dmi differ diff --git a/icons/obj/structures/window.dmi b/icons/obj/structures/window.dmi index 5a961763e3c74..30d5659949e1c 100644 Binary files a/icons/obj/structures/window.dmi and b/icons/obj/structures/window.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 50b613cc2e56a..c3c2b18f0f934 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/tools/card.dmi b/icons/obj/tools/card.dmi index b77711413a64c..7a5495d8effad 100644 Binary files a/icons/obj/tools/card.dmi and b/icons/obj/tools/card.dmi differ diff --git a/icons/screen/radial.dmi b/icons/screen/radial.dmi index 71a949c93f906..e4c3d52cde6bf 100644 Binary files a/icons/screen/radial.dmi and b/icons/screen/radial.dmi differ diff --git a/icons/turf/flooring/decals.dmi b/icons/turf/flooring/decals.dmi index fffd7de041a68..e833b270f1598 100644 Binary files a/icons/turf/flooring/decals.dmi and b/icons/turf/flooring/decals.dmi differ diff --git a/maps/antag_spawn/mercenary/mercenary_base.dmm b/maps/antag_spawn/mercenary/mercenary_base.dmm index 31142028162bd..d301337624213 100644 --- a/maps/antag_spawn/mercenary/mercenary_base.dmm +++ b/maps/antag_spawn/mercenary/mercenary_base.dmm @@ -186,6 +186,13 @@ /obj/catwalk_plated, /turf/simulated/floor/plating, /area/map_template/merc_spawn) +"bz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 6 + }, +/obj/machinery/portable_atmospherics/powered/pump/filled, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) "bM" = ( /obj/structure/cable{ d1 = 4; @@ -446,6 +453,15 @@ /obj/floor_decal/techfloor/corner{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "ex" = ( @@ -467,6 +483,7 @@ /obj/machinery/disperser/back{ dir = 1 }, +/obj/structure/ship_munition/disperser_charge/emp, /turf/simulated/floor/plating, /area/map_template/merc_shuttle) "eR" = ( @@ -854,8 +871,8 @@ /turf/simulated/floor/tiled/monotile, /area/map_template/merc_spawn) "jK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "jQ" = ( @@ -884,11 +901,23 @@ frequency = 1380; master_tag = "merc_shuttle"; name = "interior access button"; - pixel_x = 22; + pixel_x = 29; pixel_y = -11 }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) +"ka" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/map_template/merc_shuttle) "kb" = ( /turf/simulated/floor/tiled/dark, /area/map_template/merc_spawn) @@ -996,6 +1025,21 @@ d2 = 8; icon_state = "4-8" }, +/obj/item/device/binoculars, +/obj/item/device/binoculars, +/obj/item/device/binoculars, +/obj/item/device/binoculars, +/obj/item/device/binoculars, +/obj/item/device/binoculars, +/obj/item/device/binoculars, +/obj/item/crowbar/prybar, +/obj/item/crowbar/prybar, +/obj/item/crowbar/prybar, +/obj/item/crowbar/prybar, +/obj/item/crowbar/prybar, +/obj/item/crowbar/prybar, +/obj/item/crowbar/prybar, +/obj/item/crowbar/prybar, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "lg" = ( @@ -1045,9 +1089,6 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "lz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ - dir = 4 - }, /obj/floor_decal/industrial/warning{ dir = 4 }, @@ -1057,6 +1098,9 @@ /obj/structure/handrail{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ + dir = 1 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/merc_shuttle) "lB" = ( @@ -1068,6 +1112,10 @@ }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) +"lS" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/fuel, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) "lX" = ( /obj/floor_decal/corner/blue{ dir = 10 @@ -1223,7 +1271,13 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/steel_reinforced, +/obj/machinery/fabricator/hacked, +/obj/floor_decal/industrial/outline/yellow, +/obj/item/stack/material/steel/ten, +/obj/item/stack/material/steel/ten, +/obj/item/stack/material/glass/ten, +/obj/item/stack/material/aluminium/ten, +/obj/item/stack/material/plastic/ten, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "nn" = ( @@ -1317,11 +1371,12 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "oo" = ( -/obj/machinery/portable_atmospherics/canister/hydrogen, -/obj/floor_decal/industrial/outline/yellow, -/obj/item/tank/hydrogen, -/obj/item/tank/hydrogen, -/turf/simulated/floor/tiled/techfloor, +/obj/machinery/body_scanconsole{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/white, /area/map_template/merc_shuttle) "oC" = ( /obj/machinery/door/airlock/external{ @@ -1351,6 +1406,11 @@ /obj/overmap/visitable/sector/merc_base, /turf/simulated/floor/plating, /area/map_template/merc_spawn) +"oJ" = ( +/obj/paint/sun, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/turf/simulated/wall/titanium, +/area/map_template/merc_shuttle) "oK" = ( /obj/floor_decal/corner/blue/mono, /obj/structure/table/standard, @@ -1364,6 +1424,15 @@ pixel_y = -24; req_access = list("ACCESS_SYNDICATE") }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "oW" = ( @@ -1388,35 +1457,18 @@ /turf/simulated/floor/tiled, /area/map_template/merc_spawn) "pb" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 - }, /obj/floor_decal/corner_techfloor_grid{ dir = 1 }, /obj/floor_decal/techfloor/corner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "pc" = ( -/obj/structure/table/steel, -/obj/item/crowbar/prybar, -/obj/item/crowbar/prybar, -/obj/item/crowbar/prybar, -/obj/item/crowbar/prybar, -/obj/item/crowbar/prybar, -/obj/item/crowbar/prybar, -/obj/machinery/button/blast_door{ - id_tag = "merc_airlock"; - req_access = list("ACCESS_SYNDICATE") - }, -/obj/item/device/binoculars, -/obj/item/device/binoculars, -/obj/item/device/binoculars, -/obj/item/device/binoculars, -/obj/item/device/binoculars, -/obj/item/device/binoculars, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1508,54 +1560,36 @@ /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_shuttle) "qj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/structure/window/reinforced/crescent{ +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/structure/bed/chair/shuttle/black{ - dir = 8 - }, -/obj/structure/sign/poster{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/machinery/computer/ship/engines, +/turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "qw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "qy" = ( -/obj/wallframe_spawn/reinforced/titanium, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/floor_decal/techfloor{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/button/blast_door{ + id_tag = "merc_airlock"; + req_access = list("ACCESS_SYNDICATE"); + pixel_x = 21; + pixel_y = 23 }, -/obj/paint/merc, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "qA" = ( -/obj/machinery/fabricator/hacked, -/obj/floor_decal/industrial/outline/yellow, -/obj/item/stack/material/plastic/ten, -/obj/item/stack/material/aluminium/ten, -/obj/item/stack/material/steel/ten, -/obj/item/stack/material/glass/ten, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/fuel_port{ + pixel_y = -30 }, -/obj/item/stack/material/steel/ten, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_shuttle) "qC" = ( @@ -1564,9 +1598,18 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/merc_spawn) +"qQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) "qY" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/floor_decal/industrial/outline/red, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_shuttle) "qZ" = ( @@ -1597,19 +1640,28 @@ /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_spawn) "rt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 5 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 5 }, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_shuttle) -"rA" = ( -/obj/machinery/door/airlock/glass/civilian{ - name = "airlock" +"rx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/map_template/merc_shuttle) +"rA" = ( +/obj/machinery/door/airlock/glass, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1623,26 +1675,27 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 + dir = 4 }, -/obj/machinery/alarm{ - pixel_y = 24; - req_access = list("ACCESS_SYNDICATE") +/obj/floor_decal/techfloor/corner{ + dir = 4 }, -/turf/simulated/floor/tiled/white, +/turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "rG" = ( -/obj/machinery/body_scanconsole{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/structure/handrail, /obj/machinery/light{ dir = 1 }, -/turf/simulated/floor/tiled/white, +/obj/floor_decal/techfloor{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "rK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -1650,47 +1703,55 @@ /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_spawn) "rL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/window/reinforced/crescent{ - dir = 1 +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/turf/simulated/floor/tiled/dark, +/area/map_template/merc_shuttle) +"rN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light{ dir = 4 }, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) -"rN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/recharger/wallcharger{ - pixel_x = 26 +"sx" = ( +/obj/paint/sun, +/obj/machinery/atmospherics/unary/engine{ + dir = 1 }, -/turf/simulated/floor/tiled/techfloor, +/turf/simulated/wall/titanium, /area/map_template/merc_shuttle) "sz" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/steel_ridged, +/obj/machinery/door/airlock/external, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 4 + }, +/obj/shuttle_landmark/merc_pod/merc_ship, +/turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "sE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden, /obj/paint/merc, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 4 + }, /turf/simulated/wall/titanium, /area/map_template/merc_shuttle) "sH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 }, -/turf/simulated/floor/tiled/white, +/obj/floor_decal/industrial/outline/blue, +/turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "sO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 }, -/turf/simulated/floor/tiled/white, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) "sS" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -1757,37 +1818,29 @@ /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_shuttle) "ut" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ - dir = 10 +/obj/paint/red, +/obj/paint_stripe/white, +/turf/simulated/wall/r_titanium, +/area/map_template/merc_shuttle/drop_pod) +"uv" = ( +/obj/floor_decal/techfloor/orange/corner{ + dir = 8 }, -/obj/structure/catwalk, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 +/obj/floor_decal/techfloor/orange/corner, +/obj/machinery/door/blast/regular{ + id_tag = "merc_pod2" }, -/obj/structure/fuel_port{ - pixel_y = 30 - }, -/turf/simulated/floor/plating, -/area/map_template/merc_shuttle) -"uv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/structure/catwalk, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/obj/machinery/button/alternate/pod_doors_explodey{ + pixel_x = -25; + dir = 1; + pixel_y = -30 }, -/turf/simulated/floor/plating, -/area/map_template/merc_shuttle) +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "uE" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/catwalk, -/obj/structure/fuel_port{ - pixel_y = 30 - }, -/turf/simulated/floor/plating, +/obj/paint/merc, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/turf/simulated/wall/titanium, /area/map_template/merc_shuttle) "uJ" = ( /obj/structure/closet/crate/freezer, @@ -1827,28 +1880,21 @@ /turf/simulated/wall/r_titanium, /area/map_template/merc_spawn) "uZ" = ( -/obj/structure/closet/crate{ - dir = 1; - name = "reserve equipment crate" +/obj/machinery/recharger/wallcharger{ + pixel_x = 26 }, -/obj/item/stack/material/plasteel/ten, -/obj/item/stack/material/steel/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/glass/reinforced/fifty, -/obj/item/stack/material/glass/boron_reinforced/ten, -/obj/item/storage/briefcase/inflatable, -/obj/item/storage/briefcase/inflatable, -/obj/item/inflatable_dispenser, -/obj/item/shuttle_beacon, -/obj/item/shuttle_beacon, -/obj/item/shuttle_beacon, -/obj/machinery/light{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 }, -/obj/floor_decal/industrial/warning{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/turf/simulated/floor/tiled/techfloor/grid, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) +"vb" = ( +/obj/paint/merc, +/obj/wallframe_spawn/reinforced/titanium, +/turf/simulated/floor/plating, /area/map_template/merc_shuttle) "vf" = ( /obj/machinery/light/small{ @@ -1858,6 +1904,8 @@ /area/map_template/merc_spawn) "vm" = ( /obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/merc_shuttle) @@ -1879,6 +1927,15 @@ }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) +"vz" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ + dir = 1 + }, +/obj/machinery/mech_recharger, +/obj/floor_decal/industrial/outline/yellow, +/mob/living/exosuit/premade/light, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) "vA" = ( /obj/machinery/vitals_monitor, /obj/machinery/light{ @@ -1901,9 +1958,8 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "vH" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/fuel, -/obj/structure/catwalk, -/turf/simulated/floor/plating, +/obj/machinery/pipedispenser, +/turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "vN" = ( /obj/floor_decal/corner/purple{ @@ -1914,13 +1970,21 @@ /turf/simulated/floor/tiled/dark, /area/map_template/merc_spawn) "vO" = ( -/obj/structure/catwalk, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ - dir = 10 +/obj/structure/handrail{ + dir = 4 + }, +/obj/floor_decal/techfloor/orange{ + dir = 8 + }, +/obj/floor_decal/techfloor/orange{ + dir = 4 + }, +/obj/machinery/button/blast_door{ + pixel_x = 23; + id_tag = "merc_pod2" }, /turf/simulated/floor/plating, -/area/map_template/merc_shuttle) +/area/map_template/merc_shuttle/drop_pod) "wd" = ( /obj/machinery/sleeper{ dir = 4 @@ -1953,14 +2017,47 @@ /turf/simulated/floor/tiled, /area/map_template/merc_spawn) "wM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ - dir = 6 +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 }, -/obj/machinery/portable_atmospherics/powered/pump/filled, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) +"wS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/closet{ + name = "tools" + }, +/obj/item/gun/energy/plasmacutter, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/device/paint_sprayer, +/obj/item/device/paint_sprayer, +/obj/item/pickaxe/diamonddrill, +/obj/item/rcd, +/obj/item/rcd, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/storage/toolbox/syndicate, +/obj/item/storage/toolbox/syndicate, +/obj/item/storage/toolbox/syndicate, +/obj/item/storage/toolbox/syndicate, +/obj/item/storage/toolbox/syndicate, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "wW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_shuttle) "xc" = ( @@ -1989,22 +2086,24 @@ /turf/simulated/floor/tiled/freezer, /area/map_template/merc_spawn) "xp" = ( +/obj/paint/merc, /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ - dir = 9 + dir = 6 }, -/obj/structure/catwalk, -/turf/simulated/floor/plating, +/turf/simulated/wall/titanium, /area/map_template/merc_shuttle) "xq" = ( -/obj/structure/catwalk, -/turf/simulated/floor/plating, -/area/map_template/merc_shuttle) +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "xt" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/floor_decal/industrial/outline, +/obj/machinery/atmospherics/portables_connector{ + dir = 4 }, -/obj/decal/cleanable/blood/splatter, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/machinery/portable_atmospherics/canister/air/airlock{ + start_pressure = 1900 + }, +/turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "xA" = ( /obj/structure/closet/medical_wall/filled{ @@ -2038,6 +2137,15 @@ }, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/merc_spawn) +"yh" = ( +/obj/structure/handrail{ + dir = 4 + }, +/obj/floor_decal/techfloor/orange{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "yk" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -2045,45 +2153,49 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_spawn) "ym" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 }, -/obj/machinery/mech_recharger, -/obj/floor_decal/industrial/outline/yellow, -/mob/living/exosuit/premade/light, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "ys" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/button/blast_door{ + pixel_x = -8; + id_tag = "merc_pod2"; + pixel_y = -23 }, -/obj/machinery/light, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_shuttle) "yt" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ - dir = 1 +/obj/structure/table/steel_reinforced, +/obj/floor_decal/techfloor/orange{ + dir = 5 }, -/obj/structure/closet{ - name = "tools" +/obj/machinery/power/apc/charon{ + dir = 1; + name = "north bump"; + pixel_y = 24; + req_access = null }, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/rcd, -/obj/item/rcd, -/obj/item/rcd_ammo/large, -/obj/item/rcd_ammo/large, -/obj/item/gun/energy/plasmacutter, -/obj/item/pickaxe/diamonddrill, -/obj/item/device/paint_sprayer, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/simulated/floor/tiled/techfloor, +/obj/random/powercell{ + pixel_y = 7 + }, +/obj/random/powercell{ + pixel_x = 3 + }, +/obj/machinery/recharger/wallcharger{ + pixel_x = 26 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) +"yw" = ( +/obj/paint/sun, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 5 + }, +/turf/simulated/wall/titanium, /area/map_template/merc_shuttle) "yD" = ( /obj/structure/cable{ @@ -2117,10 +2229,10 @@ /turf/simulated/floor/tiled/white/monotile, /area/map_template/merc_shuttle) "yW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ - dir = 4 - }, /obj/machinery/optable, +/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ + dir = 1 + }, /turf/simulated/floor/tiled/white/monotile, /area/map_template/merc_shuttle) "yY" = ( @@ -2141,18 +2253,24 @@ /turf/simulated/floor/tiled/freezer, /area/map_template/merc_spawn) "zu" = ( -/obj/machinery/bodyscanner{ +/obj/paint/black, +/obj/paint_stripe/red, +/turf/simulated/wall/r_titanium, +/area/map_template/merc_shuttle/drop_pod) +"zw" = ( +/obj/structure/handrail{ + dir = 8; + pixel_x = 6 + }, +/obj/floor_decal/techfloor/orange/corner{ dir = 4 }, -/turf/simulated/floor/tiled/white/monotile, -/area/map_template/merc_shuttle) -"zw" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/fuel, -/obj/structure/catwalk, -/obj/machinery/light, -/obj/machinery/pipedispenser, -/turf/simulated/floor/tiled/techfloor, -/area/map_template/merc_shuttle) +/obj/floor_decal/techfloor/orange/corner{ + dir = 1 + }, +/obj/shuttle_landmark/merc_pod/start, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "zC" = ( /obj/structure/table/steel_reinforced, /obj/item/stamp/chameleon, @@ -2183,6 +2301,15 @@ }, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_spawn) +"zQ" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/floor_decal/techfloor/corner{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/map_template/merc_shuttle) "zT" = ( /obj/machinery/light{ dir = 4 @@ -2191,14 +2318,8 @@ /turf/simulated/floor/tiled/freezer, /area/map_template/merc_spawn) "zW" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor/eastright{ - dir = 1; - health_max = 150; - name = "The Box"; - req_access = list("ACCESS_SYNDICATE") +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 10 }, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) @@ -2213,10 +2334,16 @@ /turf/simulated/floor/tiled/white, /area/map_template/merc_spawn) "Ak" = ( -/obj/floor_decal/industrial/warning{ - dir = 1 +/obj/machinery/atmospherics/binary/pump/high_power/on{ + target_pressure = 10000 }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "Am" = ( /obj/structure/cable{ @@ -2245,29 +2372,25 @@ /turf/simulated/wall/titanium, /area/map_template/merc_shuttle) "AO" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 10 }, +/obj/machinery/meter, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "AR" = ( -/obj/structure/handrail{ - dir = 8 - }, /obj/machinery/recharger/wallcharger{ pixel_x = 26 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) -"AS" = ( -/obj/machinery/portable_atmospherics/canister/air/airlock{ - start_pressure = 1900 - }, -/obj/machinery/atmospherics/portables_connector{ - dir = 1 - }, -/obj/floor_decal/industrial/outline, -/turf/simulated/floor/tiled/techfloor, +"AT" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/white, /area/map_template/merc_shuttle) "AZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden, @@ -2289,13 +2412,15 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_shuttle) "Bj" = ( -/obj/machinery/light{ - dir = 4 +/obj/structure/shuttle/engine/propulsion{ + dir = 1 }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/floor_decal/industrial/outline/grey, -/turf/simulated/floor/tiled/techfloor, -/area/map_template/merc_shuttle) +/obj/structure/shuttle/engine/heater{ + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/plating, +/area/map_template/merc_shuttle/drop_pod) "Bn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal, /turf/simulated/floor/plating, @@ -2307,6 +2432,13 @@ }, /turf/simulated/floor/tiled/white/monotile, /area/map_template/merc_shuttle) +"Bq" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) "Br" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/steel_ridged, @@ -2332,6 +2464,13 @@ }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) +"BG" = ( +/obj/paint/sun, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 9 + }, +/turf/simulated/wall/titanium, +/area/map_template/merc_shuttle) "BK" = ( /obj/floor_decal/industrial/warning/corner, /obj/floor_decal/industrial/warning{ @@ -2339,13 +2478,25 @@ }, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/merc_shuttle) +"BN" = ( +/obj/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 5 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle) "BU" = ( -/obj/machinery/atmospherics/binary/pump/high_power/on{ - target_pressure = 10000 +/obj/floor_decal/techfloor/orange{ + dir = 8 }, -/obj/structure/catwalk, +/obj/floor_decal/techfloor/orange{ + dir = 4 + }, +/obj/machinery/door/airlock/external, /turf/simulated/floor/plating, -/area/map_template/merc_shuttle) +/area/map_template/merc_shuttle/drop_pod) "BW" = ( /obj/shuttle_landmark/merc/nav1, /turf/space, @@ -2394,8 +2545,23 @@ /obj/floor_decal/techfloor{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) +"CJ" = ( +/obj/paint/merc, +/obj/wallframe_spawn/reinforced/titanium, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/obj/machinery/door/blast/regular/open{ + density = 0; + dir = 4; + icon_state = "pdoor0"; + id_tag = "merc_bsa_shutters" + }, +/turf/simulated/floor/plating, +/area/map_template/merc_shuttle) "CQ" = ( /obj/floor_decal/industrial/outline/yellow, /obj/machinery/computer/modular/preset/full/merc{ @@ -2457,6 +2623,8 @@ /obj/item/device/suit_cooling_unit, /obj/item/device/suit_cooling_unit, /obj/floor_decal/corner/blue/mono, +/obj/item/device/suit_cooling_unit/miniature, +/obj/item/device/suit_cooling_unit/miniature, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_spawn) "DI" = ( @@ -2489,6 +2657,29 @@ /obj/machinery/atmospherics/pipe/manifold4w/hidden, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/merc_spawn) +"Ey" = ( +/obj/floor_decal/techfloor/orange/corner, +/obj/floor_decal/techfloor/orange/corner{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) +"EF" = ( +/obj/floor_decal/industrial/outline/blue, +/obj/structure/ship_munition/disperser_charge/emp, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/simulated/floor/tiled/dark, +/area/map_template/merc_shuttle) +"EK" = ( +/obj/floor_decal/industrial/outline/yellow, +/obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/item/tank/hydrogen, +/obj/item/tank/hydrogen, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) "ER" = ( /turf/simulated/floor/tiled/white, /area/map_template/merc_spawn) @@ -2643,14 +2834,42 @@ /obj/decal/cleanable/blood/splatter, /turf/simulated/floor/tiled, /area/map_template/merc_spawn) +"IL" = ( +/obj/structure/bed/chair/shuttle/red{ + dir = 4 + }, +/obj/floor_decal/techfloor/orange{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "IO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/floor_decal/techfloor{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) +"IR" = ( +/obj/structure/handrail{ + dir = 4 + }, +/obj/floor_decal/techfloor/orange{ + dir = 4 + }, +/obj/floor_decal/techfloor/orange{ + dir = 8 + }, +/obj/machinery/button/blast_door{ + pixel_x = 23; + id_tag = "merc_pod1" + }, +/turf/simulated/floor/plating, +/area/map_template/merc_shuttle/drop_pod) "Jc" = ( /obj/wallframe_spawn/reinforced/titanium, /obj/machinery/door/blast/regular/open{ @@ -2703,6 +2922,24 @@ /obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/plating, /area/map_template/merc_spawn) +"Lv" = ( +/obj/paint/merc, +/obj/machinery/vending/medical{ + idle_power_usage = 100; + req_access = list("ACCESS_SYNDICATE") + }, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/turf/simulated/wall/titanium, +/area/map_template/merc_shuttle) +"LM" = ( +/obj/machinery/bodyscanner{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/white/monotile, +/area/map_template/merc_shuttle) "Mp" = ( /obj/floor_decal/corner/blue/mono, /obj/structure/table/standard, @@ -2728,6 +2965,15 @@ }, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/merc_spawn) +"MI" = ( +/obj/structure/bed/chair/shuttle/red{ + dir = 8 + }, +/obj/floor_decal/techfloor/orange{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "MK" = ( /obj/structure/reagent_dispensers/fueltank, /turf/simulated/floor/plating, @@ -2817,9 +3063,8 @@ /area/map_template/merc_shuttle) "Oo" = ( /obj/paint/merc, -/obj/machinery/vending/medical{ - idle_power_usage = 100; - req_access = list("ACCESS_SYNDICATE") +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 10 }, /turf/simulated/wall/titanium, /area/map_template/merc_shuttle) @@ -2845,6 +3090,25 @@ }, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/merc_spawn) +"OJ" = ( +/obj/wallframe_spawn/reinforced/titanium, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/obj/machinery/door/blast/regular/open{ + density = 0; + dir = 4; + icon_state = "pdoor0"; + id_tag = "merc_bsa_shutters" + }, +/turf/simulated/floor/plating, +/area/map_template/merc_shuttle) +"Pv" = ( +/obj/machinery/alarm{ + pixel_y = 24; + req_access = list("ACCESS_SYNDICATE") + }, +/obj/structure/handrail, +/turf/simulated/floor/tiled/white, +/area/map_template/merc_shuttle) "PC" = ( /obj/random/junk, /obj/floor_decal/borderfloorwhite/full, @@ -2911,6 +3175,25 @@ /obj/floor_decal/borderfloorwhite/full, /turf/simulated/floor/tiled, /area/map_template/merc_spawn) +"Re" = ( +/obj/floor_decal/techfloor/orange{ + dir = 4 + }, +/obj/floor_decal/techfloor/orange{ + dir = 8 + }, +/obj/machinery/door/airlock/external, +/turf/simulated/floor/plating, +/area/map_template/merc_shuttle/drop_pod) +"Ry" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/map_template/merc_shuttle) "RH" = ( /obj/structure/cable{ d1 = 4; @@ -2941,6 +3224,13 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, /area/map_template/merc_spawn) +"Sc" = ( +/obj/paint/merc, +/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ + dir = 4 + }, +/turf/simulated/wall/titanium, +/area/map_template/merc_shuttle) "Sf" = ( /obj/structure/cable{ d1 = 4; @@ -2964,10 +3254,30 @@ /obj/paint/merc, /turf/simulated/floor/plating, /area/map_template/merc_shuttle) +"SJ" = ( +/obj/structure/bed/chair/shuttle/red{ + dir = 8 + }, +/obj/floor_decal/techfloor/orange{ + dir = 6 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "SW" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, /area/map_template/merc_spawn) +"Tg" = ( +/obj/overmap/visitable/ship/landable/merc_drop_pod, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) +"TC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/white, +/area/map_template/merc_shuttle) "TF" = ( /obj/floor_decal/techfloor, /turf/simulated/floor/tiled/dark, @@ -3017,6 +3327,24 @@ }, /turf/simulated/floor/tiled, /area/map_template/merc_spawn) +"Uq" = ( +/obj/structure/bed/chair/shuttle/red{ + dir = 8 + }, +/obj/floor_decal/techfloor/orange{ + dir = 4 + }, +/obj/machinery/light/spot{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) +"UB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 9 + }, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/merc_shuttle) "UK" = ( /obj/floor_decal/corner/blue{ dir = 6 @@ -3029,6 +3357,22 @@ }, /turf/simulated/floor/tiled/white, /area/map_template/merc_spawn) +"UY" = ( +/obj/floor_decal/techfloor/orange/corner{ + dir = 4 + }, +/obj/floor_decal/techfloor/orange/corner{ + dir = 1 + }, +/obj/machinery/door/blast/regular{ + id_tag = "merc_pod1" + }, +/obj/machinery/button/alternate/pod_doors_explodey{ + pixel_x = -25; + pixel_y = 32 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "Vt" = ( /obj/floor_decal/corner/blue/three_quarters{ dir = 4 @@ -3038,6 +3382,15 @@ }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_spawn) +"VH" = ( +/obj/floor_decal/industrial/outline/red, +/obj/structure/ship_munition/disperser_charge/explosive, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/map_template/merc_shuttle) "VJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -3049,6 +3402,30 @@ }, /turf/simulated/floor/tiled/dark, /area/map_template/merc_shuttle) +"VT" = ( +/obj/structure/closet/crate{ + dir = 1; + name = "reserve equipment crate" + }, +/obj/item/stack/material/plasteel/ten, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/glass/reinforced/fifty, +/obj/item/stack/material/glass/boron_reinforced/ten, +/obj/item/storage/briefcase/inflatable, +/obj/item/storage/briefcase/inflatable, +/obj/item/inflatable_dispenser, +/obj/machinery/light{ + dir = 4 + }, +/obj/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle) "Wr" = ( /obj/structure/table/rack{ pixel_x = -1 @@ -3061,14 +3438,16 @@ /turf/simulated/floor/tiled, /area/map_template/merc_spawn) "WX" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ - dir = 1 +/obj/structure/fuel_port{ + pixel_y = 32; + invisibility = 100 }, -/obj/machinery/computer/ship/engines{ - dir = 1 +/obj/floor_decal/techfloor/orange{ + dir = 9 }, -/turf/simulated/floor/tiled/techfloor, -/area/map_template/merc_shuttle) +/obj/machinery/computer/shuttle_control/explore/merc_shuttle/merc_drop_pod, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "WY" = ( /obj/structure/cable{ d1 = 4; @@ -3114,6 +3493,13 @@ /obj/machinery/portable_atmospherics/powered/scrubber, /turf/simulated/floor/plating, /area/map_template/merc_spawn) +"XO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/map_template/merc_shuttle) "XQ" = ( /obj/structure/hygiene/sink{ dir = 1; @@ -3187,6 +3573,15 @@ "Zl" = ( /turf/simulated/mineral, /area/space) +"Zn" = ( +/obj/structure/bed/chair/shuttle/red{ + dir = 4 + }, +/obj/floor_decal/techfloor/orange{ + dir = 10 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/merc_shuttle/drop_pod) "Zq" = ( /obj/structure/cable{ d1 = 4; @@ -3204,6 +3599,13 @@ }, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/merc_spawn) +"Zt" = ( +/obj/structure/shuttle/engine/propulsion, +/obj/structure/shuttle/engine/heater{ + pixel_y = 32 + }, +/turf/simulated/floor/plating, +/area/map_template/merc_shuttle/drop_pod) "ZI" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -5033,6 +5435,10 @@ AF AF AF AF +AF +AF +AF +AF cC cC cC @@ -5067,10 +5473,6 @@ aa aa aa aa -aa -aa -aa -aa "} (19,1,1) = {" aa @@ -5132,11 +5534,15 @@ AF AF AF AF +xc +vC +xc +AF zC CQ Bh By -wM +bz AN aa aa @@ -5169,10 +5575,6 @@ aa aa aa aa -aa -aa -aa -aa "} (20,1,1) = {" aa @@ -5235,15 +5637,15 @@ kW AF xt zW +lS +UB +aw +wM aw ax BK lz -cC -aa -aa -aa -aa +sx aa aa aa @@ -5336,11 +5738,15 @@ mt pV AF qj -rL +aw AO Ak -ay +qQ ym +Bq +BN +ay +vz AN aa aa @@ -5373,10 +5779,6 @@ aa aa aa aa -aa -aa -aa -aa "} (22,1,1) = {" aa @@ -5435,12 +5837,16 @@ hJ jE jQ mG -uq +rx vm qw rN AR uZ +EK +wS +vH +VT wG yR cC @@ -5475,10 +5881,6 @@ aa aa aa aa -aa -aa -aa -aa "} (23,1,1) = {" aa @@ -5539,16 +5941,16 @@ vu VJ oT AF -qy -AF -AF AF -cC -yR -aa -aa -aa -aa +xp +uE +uE +CJ +uE +uE +Sc +oJ +BG aa aa aa @@ -5640,18 +6042,18 @@ tY kZ BA ew -uq +ka qA +sE AF -xc -vC -xc -yR -cC -aa -aa -aa -aa +Bj +ut +zu +zu +zu +zu +ut +Zt aa aa aa @@ -5742,19 +6144,19 @@ zK ld ne CE -gX -ys -AF +Ry +qA +sE +ut +ut ut -vH -xp WX -AN -aa -aa -aa -aa -aa +yh +IL +Zn +ut +ut +ut aa aa aa @@ -5845,18 +6247,18 @@ lq nm IO jK -qY +uq sz uv vO BU zw -cC -aa -aa -aa -aa -aa +Tg +xq +Ey +Re +IR +UY aa aa aa @@ -5946,19 +6348,19 @@ TF lx nn CE -gX +Ry ys -AF -uE -xq -xq +sE +ut +ut +ut yt -AN -aa -aa -aa -aa -aa +MI +Uq +SJ +ut +ut +ut aa aa aa @@ -6051,15 +6453,15 @@ pb wW rt sE -AS +AF Bj -oo -yR -cC -aa -aa -aa -aa +ut +zu +zu +zu +zu +ut +Zt aa aa aa @@ -6147,20 +6549,20 @@ nI nI ia jR -nI +qy Qs pc AF rA Oo -AF -AF -cC -yR -aa -aa -aa -aa +uE +uE +OJ +Lv +uE +uE +oJ +yw aa aa aa @@ -6255,6 +6657,10 @@ ph AF rB sH +EF +AF +Pv +xD uJ wd xA @@ -6272,10 +6678,6 @@ aa aa aa aa -aa -aa -aa -aa BW aa aa @@ -6357,6 +6759,10 @@ pj AF rG sO +XO +AT +oo +TC uS xD xD @@ -6393,10 +6799,6 @@ aa aa aa aa -aa -aa -aa -aa "} (32,1,1) = {" aa @@ -6457,17 +6859,17 @@ mj ob pt AF -zu +dY +zQ +rL +vb +LM sS xD xD xD yW -cC -aa -aa -aa -aa +sx aa aa aa @@ -6560,6 +6962,10 @@ oc pH AF AF +VH +qY +AF +AF ta AZ Bo @@ -6597,10 +7003,6 @@ aa aa aa aa -aa -aa -aa -aa "} (34,1,1) = {" aa @@ -6662,6 +7064,10 @@ oC mm mo AF +AF +AF +AF +AF Jc Jc Jc @@ -6699,10 +7105,6 @@ aa aa aa aa -aa -aa -aa -aa "} (35,1,1) = {" aa diff --git a/maps/away/abandoned_hotel/abandoned_hotel-1.dmm b/maps/away/abandoned_hotel/abandoned_hotel-1.dmm index b902647d2fde9..dbc83039511be 100644 --- a/maps/away/abandoned_hotel/abandoned_hotel-1.dmm +++ b/maps/away/abandoned_hotel/abandoned_hotel-1.dmm @@ -2319,7 +2319,7 @@ /area/abandoned_hotel/pool) "Dw" = ( /obj/decal/cleanable/dirt, -/obj/item/material/kitchen/utensil/fork/silver, +/obj/item/material/utensil/fork/silver, /turf/simulated/floor/wood, /area/abandoned_hotel/buffet) "Dx" = ( @@ -2510,7 +2510,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/item/material/kitchen/utensil/fork/silver, +/obj/item/material/utensil/fork/silver, /turf/simulated/floor/tiled/old_tile, /area/abandoned_hotel/buffet) "Gu" = ( @@ -2773,7 +2773,7 @@ "Kv" = ( /obj/structure/table/woodentable/walnut, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/item/material/kitchen/utensil/fork/silver, +/obj/item/material/utensil/fork/silver, /turf/simulated/floor/wood, /area/abandoned_hotel/buffet) "Kw" = ( @@ -3043,7 +3043,7 @@ /obj/floor_decal/corner/black/diagonal, /obj/structure/table/marble, /obj/decal/cleanable/dirt, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /turf/simulated/floor/tiled/kafel_full, /area/abandoned_hotel/kitchen) "Og" = ( diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index a6592475ddc6a..071def44433f1 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -2118,7 +2118,7 @@ }, /obj/random/donkpocket_box, /obj/floor_decal/corner/red/diagonal, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/item/reagent_containers/food/condiment/small/saltshaker{ pixel_x = -3 }, diff --git a/maps/away/blueriver/blueriver-2.dmm b/maps/away/blueriver/blueriver-2.dmm index 8d16016f2998f..8721013e953f0 100644 --- a/maps/away/blueriver/blueriver-2.dmm +++ b/maps/away/blueriver/blueriver-2.dmm @@ -195,7 +195,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, /obj/item/paper{ info = "Well, it didn't take the three days I was betting on, so i'm out twenty bucks, but we managed to punch through into a cave of some sort with the drilling equipment. We're lowering a ladder down now and sending one of the guards down to check that there's no spiders in there or anything. Once they report back, we'll Move the whole basecamp down there, and- SO, We've moved down into the cave now, and what we've found is astounding! It looks a LOT like a lake or river of blue goo, but... not? I took some scans, but couldn't pick anything up aside from radiation spikes from the pool. I also lowered a swab into the fluid to take a sample, but when I touched the swab to the surface of the... Fluid? the Swab just... Ceased And yes, that's the best way to describe it. it just stopped existing in my hand. We figure it's best we DON'T touch the blue stuff for now. one of our help has started moving supplies down into the cave to build a bridge of sorts though across the pool. We spotted some sort of structure on the far side, and the bridge is the only way to get to it, so now we wait." }, diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index 6a73712977b3a..fd6da42be010a 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -2061,7 +2061,7 @@ /obj/structure/table/standard{ name = "plastic table frame" }, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled, /area/casino/casino_crew_cantina) "fT" = ( @@ -2799,7 +2799,7 @@ "ia" = ( /obj/structure/table/woodentable, /obj/item/trash/plate, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/carpet, /area/casino/casino_mainfloor) "ib" = ( @@ -2929,7 +2929,7 @@ /obj/structure/bed/chair/comfy/red{ dir = 4 }, -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, /turf/simulated/floor/carpet, /area/casino/casino_mainfloor) "iq" = ( @@ -3142,7 +3142,7 @@ "iR" = ( /obj/structure/table/woodentable, /obj/item/trash/plate, -/obj/item/material/kitchen/utensil/spoon, +/obj/item/material/utensil/spoon, /turf/simulated/floor/carpet, /area/casino/casino_mainfloor) "iS" = ( diff --git a/maps/away/derelict/derelict-station.dmm b/maps/away/derelict/derelict-station.dmm index e398186bdae89..33526b9fdd1ea 100644 --- a/maps/away/derelict/derelict-station.dmm +++ b/maps/away/derelict/derelict-station.dmm @@ -960,7 +960,7 @@ /area/constructionsite/hallway/fore) "dc" = ( /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /turf/simulated/floor, /area/constructionsite/hallway/fore) "dd" = ( diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index ce9a8988d1e34..111ecaae33094 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -3435,7 +3435,7 @@ /turf/simulated/floor/tiled, /area/errant_pisces/dorms) "ih" = ( -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, /turf/simulated/floor/tiled, /area/errant_pisces/dorms) "ii" = ( @@ -3557,7 +3557,7 @@ "iF" = ( /obj/structure/table/standard, /obj/item/trash/plate, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled, /area/errant_pisces/dorms) "iG" = ( @@ -3845,7 +3845,7 @@ /area/errant_pisces/hallway) "js" = ( /obj/structure/table/standard, -/obj/item/material/kitchen/utensil/fork/plastic, +/obj/item/material/utensil/fork/plastic, /obj/random/snack, /turf/simulated/floor/tiled, /area/errant_pisces/dorms) @@ -3976,7 +3976,7 @@ /area/errant_pisces/infirmary) "jK" = ( /obj/structure/table/standard, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /obj/machinery/light, /turf/simulated/floor/tiled, /area/errant_pisces/dorms) diff --git a/maps/away/lar_maria/lar_maria-2.dmm b/maps/away/lar_maria/lar_maria-2.dmm index 1d051a6b5e59d..a39f70fac3d05 100644 --- a/maps/away/lar_maria/lar_maria-2.dmm +++ b/maps/away/lar_maria/lar_maria-2.dmm @@ -2439,7 +2439,7 @@ "gR" = ( /obj/structure/table/standard, /obj/item/trash/plate, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled, /area/lar_maria/mess_hall) "gS" = ( @@ -2555,7 +2555,7 @@ "hk" = ( /obj/structure/table/marble, /obj/machinery/door/firedoor, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled/white, /area/lar_maria/mess_hall) "hl" = ( @@ -2765,7 +2765,7 @@ "hI" = ( /obj/structure/table/marble, /obj/machinery/door/firedoor, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /turf/simulated/floor/tiled/white, /area/lar_maria/mess_hall) "hJ" = ( @@ -2881,7 +2881,7 @@ /turf/simulated/floor/tiled, /area/lar_maria/mess_hall) "ic" = ( -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled, /area/lar_maria/mess_hall) "id" = ( @@ -3248,7 +3248,7 @@ "iZ" = ( /obj/structure/table/marble, /obj/item/trash/plate, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled/white, /area/lar_maria/mess_hall) "ja" = ( diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 7776b59128612..d99f37a6c5c7a 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -1196,7 +1196,7 @@ /area/lost_supply_base/common) "de" = ( /obj/structure/table/standard, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled, /area/lost_supply_base/common) "df" = ( @@ -1314,7 +1314,7 @@ /turf/simulated/wall, /area/lost_supply_base) "dx" = ( -/obj/item/material/kitchen/utensil/spoon, +/obj/item/material/utensil/spoon, /turf/simulated/floor/tiled, /area/lost_supply_base/common) "dy" = ( @@ -1337,7 +1337,7 @@ /turf/simulated/floor/tiled, /area/lost_supply_base/common) "dB" = ( -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /obj/structure/bed/chair{ dir = 8 }, diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index 81f2c4fdf0aff..95dc6f04124d2 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -3631,7 +3631,7 @@ /obj/structure/table/standard{ name = "plastic table frame" }, -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, /turf/simulated/floor/tiled, /area/magshield/south) "jU" = ( @@ -3879,7 +3879,7 @@ /turf/simulated/floor/tiled, /area/magshield/south) "kD" = ( -/obj/item/material/kitchen/utensil/fork/plastic, +/obj/item/material/utensil/fork/plastic, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3928,7 +3928,7 @@ /area/magshield/south) "kJ" = ( /obj/structure/table/marble, -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, /turf/simulated/floor/tiled/white, /area/magshield/south) "kK" = ( @@ -3995,7 +3995,7 @@ /area/magshield/south) "kT" = ( /obj/structure/curtain/open/bed, -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, /turf/simulated/floor/tiled, /area/magshield/south) "kU" = ( @@ -4055,7 +4055,7 @@ /obj/structure/table/standard{ name = "plastic table frame" }, -/obj/item/material/kitchen/utensil/fork/plastic, +/obj/item/material/utensil/fork/plastic, /obj/item/trash/plate, /turf/simulated/floor/tiled, /area/magshield/south) diff --git a/maps/away/meatstation/meatstation.dmm b/maps/away/meatstation/meatstation.dmm index baadcdffefd11..6be63fef8d302 100644 --- a/maps/away/meatstation/meatstation.dmm +++ b/maps/away/meatstation/meatstation.dmm @@ -3846,7 +3846,7 @@ /turf/space, /area/space) "iT" = ( -/obj/item/material/kitchen/utensil/spork, +/obj/item/material/utensil/spork, /turf/space, /area/space) "iU" = ( @@ -3874,7 +3874,7 @@ /turf/simulated/floor/tiled/dark, /area/meatstation/kitchen) "iY" = ( -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/space, /area/space) "iZ" = ( @@ -3901,7 +3901,7 @@ d2 = 8; icon_state = "4-8" }, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled/dark, /area/meatstation/kitchen) "jb" = ( @@ -3909,7 +3909,7 @@ /turf/space, /area/meatstation/storage) "jc" = ( -/obj/item/material/kitchen/utensil/spork/plastic, +/obj/item/material/utensil/spork/plastic, /turf/simulated/floor/tiled/dark, /area/meatstation/kitchen) "jd" = ( @@ -4446,7 +4446,7 @@ icon_state = "4-8" }, /obj/structure/table/marble, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/lino, /area/meatstation/mess) "kr" = ( @@ -4619,7 +4619,7 @@ /area/meatstation/mess) "kN" = ( /obj/structure/table/marble, -/obj/item/material/kitchen/utensil/spork, +/obj/item/material/utensil/spork, /turf/simulated/floor/lino, /area/meatstation/mess) "kO" = ( @@ -8976,7 +8976,7 @@ /turf/simulated/floor/lino, /area/meatstation/mess) "vP" = ( -/obj/item/material/kitchen/utensil/spork, +/obj/item/material/utensil/spork, /obj/floor_decal/corner/lightgrey/border{ dir = 4 }, diff --git a/maps/away/mining/mining-corporate.dmm b/maps/away/mining/mining-corporate.dmm index 9f1fad8db77dc..ba1fa86b11527 100644 --- a/maps/away/mining/mining-corporate.dmm +++ b/maps/away/mining/mining-corporate.dmm @@ -1230,7 +1230,7 @@ "cR" = ( /obj/structure/table/standard, /obj/item/trash/snack_bowl, -/obj/item/material/kitchen/utensil/spoon, +/obj/item/material/utensil/spoon, /obj/item/reagent_containers/food/drinks/glass2/shot, /turf/simulated/floor/tiled/monotile, /area/outpost/mining/recreation) @@ -2595,9 +2595,9 @@ /area/outpost/mining) "ft" = ( /obj/structure/table/standard, -/obj/item/material/kitchen/utensil/fork, -/obj/item/material/kitchen/utensil/fork, -/obj/item/material/kitchen/utensil/spoon, +/obj/item/material/utensil/fork, +/obj/item/material/utensil/fork, +/obj/item/material/utensil/spoon, /obj/structure/cable{ d2 = 4; icon_state = "0-4" @@ -2755,7 +2755,7 @@ /area/outpost/mining/kitchen) "fK" = ( /obj/structure/table/reinforced, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/item/material/knife/kitchen, /turf/simulated/floor/tiled/old_tile, /area/outpost/mining/kitchen) diff --git a/maps/away/scavver/scavver_gantry-2.dmm b/maps/away/scavver/scavver_gantry-2.dmm index 2e55b61255030..ef5bd5325b02c 100644 --- a/maps/away/scavver/scavver_gantry-2.dmm +++ b/maps/away/scavver/scavver_gantry-2.dmm @@ -2935,11 +2935,11 @@ /area/scavver/yachtup) "wI" = ( /obj/structure/closet/fridge, -/obj/item/material/kitchen/utensil/spork, -/obj/item/material/kitchen/utensil/spork, +/obj/item/material/utensil/spork, +/obj/item/material/utensil/spork, /obj/item/reagent_containers/food/condiment/enzyme, /obj/random/donkpocket_box, -/obj/item/material/kitchen/utensil/spork, +/obj/item/material/utensil/spork, /obj/random/loot, /mob/living/simple_animal/passive/mouse/brown/Tom, /turf/simulated/floor/wood/yew, diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm index c7a8cfc10a58f..1d2d03d9f02af 100644 --- a/maps/away/slavers/slavers_base.dmm +++ b/maps/away/slavers/slavers_base.dmm @@ -77,7 +77,7 @@ /area/slavers_base/mort) "ar" = ( /obj/structure/table/standard, -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, /turf/simulated/floor/ceiling, /area/slavers_base/mort) "as" = ( @@ -110,7 +110,7 @@ /turf/simulated/floor/ceiling, /area/slavers_base/mort) "az" = ( -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, /turf/simulated/floor/ceiling, /area/slavers_base/mort) "aA" = ( @@ -3543,7 +3543,7 @@ "iR" = ( /obj/structure/table/standard, /obj/item/trash/plate, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -3573,7 +3573,7 @@ /turf/simulated/floor/tiled, /area/slavers_base/dorms) "iU" = ( -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -3705,7 +3705,7 @@ /area/slavers_base/dorms) "jj" = ( /obj/structure/table/standard, -/obj/item/material/kitchen/utensil/fork, +/obj/item/material/utensil/fork, /turf/simulated/floor/tiled, /area/slavers_base/dorms) "jk" = ( diff --git a/maps/event/iccgn_ship/icgnv_hound.dm b/maps/event/iccgn_ship/icgnv_hound.dm index 8cc89dd8606d9..93bd0bc5d4af4 100644 --- a/maps/event/iccgn_ship/icgnv_hound.dm +++ b/maps/event/iccgn_ship/icgnv_hound.dm @@ -6,6 +6,7 @@ description = "A standard ALFA-pattern, armed ICCGN transport shuttle. The transponder reads on open channels as ICCG and is broadcasting the designation 'ICGNV Hound' in Zurich Accord Common." suffixes = list("maps/event/iccgn_ship/icgnv_hound.dmm") shuttles_to_initialise = list(/datum/shuttle/autodock/overmap/icgnv_hound) + skip_main_unit_tests = "Ruin has shuttle landmark." /obj/overmap/visitable/sector/icgnv_hound_space name = "Sensor Anomaly" diff --git a/maps/event/sfv_arbiter/sfv_arbiter.dm b/maps/event/sfv_arbiter/sfv_arbiter.dm index 498ac71a4a673..9e9456dfafdd5 100644 --- a/maps/event/sfv_arbiter/sfv_arbiter.dm +++ b/maps/event/sfv_arbiter/sfv_arbiter.dm @@ -6,6 +6,7 @@ description = "A fairly standard armed transport shuttle belonging to the Sol Fleet. It's transponder reads 'SFV Arbiter'." suffixes = list("maps/event/sfv_arbiter/sfv_arbiter.dmm") shuttles_to_initialise = list(/datum/shuttle/autodock/overmap/sfv_arbiter) + skip_main_unit_tests = "Ruin has shuttle landmark." /obj/overmap/visitable/sector/sfv_arbiter_space name = "Sensor Anomaly" diff --git a/maps/example/example-2.dmm b/maps/example/example-2.dmm index 23885178cb13c..a8f248f09d17d 100644 --- a/maps/example/example-2.dmm +++ b/maps/example/example-2.dmm @@ -256,7 +256,7 @@ "wF" = ( /obj/floor_decal/corner/blue/diagonal, /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/item/material/chopping_board, /obj/item/reagent_containers/food/condiment/small/saltshaker{ pixel_x = -3 diff --git a/maps/mapsystem/maps.dm b/maps/mapsystem/maps.dm index 5cc721a1184f1..aeb5770cc8fcc 100644 --- a/maps/mapsystem/maps.dm +++ b/maps/mapsystem/maps.dm @@ -180,8 +180,6 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable CULTURE_HUMAN_CETII, CULTURE_HUMAN_SPACER, CULTURE_HUMAN_OFFWORLD, - CULTURE_HUMAN_CONFEDC, - CULTURE_HUMAN_CONFEDO, CULTURE_HUMAN_FOSTER, CULTURE_HUMAN_PIRXL, CULTURE_HUMAN_PIRXB, @@ -190,7 +188,19 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable CULTURE_HUMAN_IOLAUS, CULTURE_HUMAN_BRAHE, CULTURE_HUMAN_EOS, - CULTURE_HUMAN_CONFEDC, + // [SIERRA-EDIT], + /*, + CULTURE_HUMAN_THEIA, + CULTURE_HUMAN_CONFED_TERRA, + CULTURE_HUMAN_CONFED_ZEMLYA, + CULTURE_HUMAN_CONFED_SESTRIS, + CULTURE_HUMAN_CONFED_PUTKARI, + CULTURE_HUMAN_CONFED_ALTAIR, + CULTURE_HUMAN_CONFED_PENGLAI, + CULTURE_HUMAN_CONFED_PROVIDENCE, + CULTURE_HUMAN_CONFED_VALY, + */ + // [/SIERRA-EDIT], CULTURE_HUMAN_CONFEDO, CULTURE_HUMAN_GAIAN, CULTURE_HUMAN_OTHER diff --git a/maps/mapsystem/maps_unit_testing.dm b/maps/mapsystem/maps_unit_testing.dm index 914249a5547ed..7599217605cd5 100644 --- a/maps/mapsystem/maps_unit_testing.dm +++ b/maps/mapsystem/maps_unit_testing.dm @@ -52,9 +52,11 @@ var/list/area_usage_test_exempted_root_areas = list( /area/map_template, /area/exoplanet, - /area/ship - ) + /area/ship, + /area/mine, + /area/bluespaceriver) + // /area/mine, /area/bluespaceriver //[SIERRA-ADD] var/list/area_purity_test_exempt_areas = list() -/area/ship \ No newline at end of file +/area/ship diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm index d9be47b789c2c..d9b821dc59a60 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm @@ -1505,7 +1505,7 @@ /area/map_template/hydrobase/station/processing) "dM" = ( /obj/structure/catwalk, -/obj/item/material/kitchen/utensil/spoon, +/obj/item/material/utensil/spoon, /obj/structure/table/glass/boron, /turf/simulated/floor/fixed/alium, /area/map_template/hydrobase/station/processing) @@ -1677,7 +1677,7 @@ /area/map_template/hydrobase/station/growA) "eh" = ( /obj/structure/catwalk, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/item/material/knife/kitchen, /obj/structure/table/glass/boron, /obj/item/material/ashtray/bronze, diff --git a/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm b/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm index 0daeac1a3c0fb..16a9bf2bac665 100644 --- a/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm +++ b/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm @@ -47,10 +47,10 @@ /area/template_noop) "k" = ( /obj/structure/table/woodentable, -/obj/item/material/kitchen/utensil/fork/plastic, -/obj/item/material/kitchen/utensil/fork/plastic, -/obj/item/material/kitchen/utensil/fork/plastic, -/obj/item/material/knife/table, +/obj/item/material/utensil/fork/plastic, +/obj/item/material/utensil/fork/plastic, +/obj/item/material/utensil/fork/plastic, +/obj/item/material/utensil/knife, /obj/floor_decal/spline/fancy/wood/corner{ dir = 1 }, @@ -58,8 +58,8 @@ /area/template_noop) "l" = ( /obj/structure/table/woodentable, -/obj/item/material/knife/table, -/obj/item/material/knife/table, +/obj/item/material/utensil/knife, +/obj/item/material/utensil/knife, /obj/floor_decal/spline/fancy/wood{ dir = 1 }, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony2/playablecolony2.dm b/maps/random_ruins/exoplanet_ruins/playablecolony2/playablecolony2.dm index 6979817d7b4a7..293b953187eb2 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony2/playablecolony2.dm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony2/playablecolony2.dm @@ -33,7 +33,7 @@ l_ear = /obj/item/device/radio/headset/map_preset/playablecolony2 /obj/submap_landmark/spawnpoint/colonist_spawn2 - name = "Colonist" + name = "Ship Colonist" /obj/submap_landmark/joinable_submap/colony2 name = "Landed Colony Ship" diff --git a/maps/sierra/_references/z1-3_sierra.dmm b/maps/sierra/_references/z1-3_sierra.dmm index 67bc8fbe2aebb..575ec8fdd0e74 100644 --- a/maps/sierra/_references/z1-3_sierra.dmm +++ b/maps/sierra/_references/z1-3_sierra.dmm @@ -22493,7 +22493,7 @@ "eSf" = ( /obj/floor_decal/corner/paleblue/mono, /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /turf/simulated/floor/tiled/white/monotile, /area/crew_quarters/galley) "eSi" = ( diff --git a/maps/sierra/datums/reports/deck.dm b/maps/sierra/datums/reports/deck.dm index c519a9316cf89..6322ad469cbd6 100644 --- a/maps/sierra/datums/reports/deck.dm +++ b/maps/sierra/datums/reports/deck.dm @@ -14,10 +14,6 @@ add_field(/datum/report_field/date, "Дата заполнения") add_field(/datum/report_field/time, "Время заполнения") add_field(/datum/report_field/simple_text, "Название шаттла", required = 1) - add_field(/datum/report_field/text_label/instruction, "Следующий пункт рекомендуется заполнить в порядке посещения пунктов назначения.") - add_field(/datum/report_field/pencode_text, "Пункт(ы) Назначения", required = 1) - add_field(/datum/report_field/simple_text, "Место Дислокации", required = 1) - add_field(/datum/report_field/simple_text, "Причина вылета", required = 1) add_field(/datum/report_field/text_label, "Предполетная подготовка") add_field(/datum/report_field/options/yes_no, "Корпус левой стороны без повреждений?", required = 1) add_field(/datum/report_field/options/yes_no, "Корпус правой стороны без повреждений?", required = 1) @@ -31,9 +27,6 @@ add_field(/datum/report_field/options/yes_no, "Давление в канистре воздушных шлюзов больше 200kPa?", required = 1) add_field(/datum/report_field/options/yes_no, "Набор первой помощи на борту?", required = 1) add_field(/datum/report_field/options/yes_no, "Набор инструментов на борту?", required = 1) - add_field(/datum/report_field/options/yes_no, "Скафандры для членов экспедиции на борту?", required = 1) - add_field(/datum/report_field/options/yes_no, "Другая необходимая экипировка на борту?", required = 1) - add_field(/datum/report_field/options/yes_no, "Все члены экспедиции на борту?", required = 1) add_field(/datum/report_field/options/yes_no, "Герметичность шлюзов с обеих сторон?", required = 1) permission_fields += add_field(/datum/report_field/options/yes_no, "Разрешение на вылет из ангара?", required = 1) permission_fields += add_field(/datum/report_field/signature, "Для разрешения на вылет, поставьте подпись либо печать здесь", required = 1) diff --git a/maps/sierra/icons/obj/suitstorage.dmi b/maps/sierra/icons/obj/suitstorage.dmi index ec9646f00bf32..84e251e2e620c 100644 Binary files a/maps/sierra/icons/obj/suitstorage.dmi and b/maps/sierra/icons/obj/suitstorage.dmi differ diff --git a/maps/sierra/items/manuals.dm b/maps/sierra/items/manuals.dm index ded88b5e8052d..2eb7b91a0ab7e 100644 --- a/maps/sierra/items/manuals.dm +++ b/maps/sierra/items/manuals.dm @@ -113,10 +113,10 @@ /obj/item/folder/nt/rd -/obj/item/folder/envelope/blanks +/obj/item/folder/envelope/preset/blanks desc = "A thick envelope. The NT logo is stamped in the corner, along with \"TOP SECRET - FOR RESEARCH DIRECTOR'S EYES ONLY\"." -/obj/item/folder/envelope/blanks/Initialize() +/obj/item/folder/envelope/preset/blanks/Initialize() . = ..() new/obj/item/paper/sierra/blanks(src) new/obj/item/paper/sierra/nuke(src) @@ -142,10 +142,10 @@ This paper has been stamped with the stamp of Central Command. "} -/obj/item/folder/envelope/captain +/obj/item/folder/envelope/preset/captain desc = "A thick envelope. The NT logo is stamped in the corner, along with \"TOP SECRET - FOR CAPTAIN'S EYES ONLY\"." -/obj/item/folder/envelope/captain/Initialize() +/obj/item/folder/envelope/preset/captain/Initialize() . = ..() var/memo = {"
СЕКРЕТНО
КОДОВОЕ СЛОВО: АЛЬФА
@@ -185,10 +185,10 @@ new/obj/item/paper/sierra/blanks(src) new/obj/item/paper/sierra/umbra(src) -/obj/item/folder/envelope/rep +/obj/item/folder/envelope/preset/rep desc = "A thick envelope. The NT logo is stamped in the corner, along with \"TOP SECRET - FOR INTERNAL AFFAIRS PERSONNEL ONLY\"." -/obj/item/folder/envelope/rep/Initialize() +/obj/item/folder/envelope/preset/rep/Initialize() . = ..() new/obj/item/paper/sierra/nuke(src) new/obj/item/paper/sierra/blanks(src) @@ -228,14 +228,14 @@ startswith = list( /obj/item/disk/nuclear, /obj/item/pinpointer, - /obj/item/folder/envelope/nuke, + /obj/item/folder/envelope/preset/nuke, /obj/item/modular_computer/laptop/preset/custom_loadout/cheap ) -/obj/item/folder/envelope/nuke +/obj/item/folder/envelope/preset/nuke desc = "A thick envelope. The NT logo is stamped in the corner, along with \"TOP SECRET - DELTA PROTOCOLS\"." -/obj/item/folder/envelope/nuke/Initialize() +/obj/item/folder/envelope/preset/nuke/Initialize() . = ..() new/obj/item/paper/sierra/nuke(src) diff --git a/maps/sierra/job/jobs.dm b/maps/sierra/job/jobs.dm index 874f788fa27e3..d98511ea55dc6 100644 --- a/maps/sierra/job/jobs.dm +++ b/maps/sierra/job/jobs.dm @@ -8,22 +8,22 @@ ) species_to_job_blacklist = list( - /datum/species/unathi = list(HUMAN_ONLY_JOBS, VAGABONDS_JOBS), - /datum/species/unathi/yeosa = list(HUMAN_ONLY_JOBS, VAGABONDS_JOBS), - /datum/species/tajaran = list(HUMAN_ONLY_JOBS, VAGABONDS_JOBS), - /datum/species/skrell = list(SKRELL_BLACKLISTED_JOBS, VAGABONDS_JOBS), - /datum/species/machine = list(MACHINE_BLACKLISTED_JOBS, VAGABONDS_JOBS), + /datum/species/unathi = list(HUMAN_ONLY_JOBS), + /datum/species/unathi/yeosa = list(HUMAN_ONLY_JOBS), + /datum/species/tajaran = list(HUMAN_ONLY_JOBS), + /datum/species/skrell = list(SKRELL_BLACKLISTED_JOBS), + /datum/species/machine = list(MACHINE_BLACKLISTED_JOBS), /datum/species/diona = list( HUMAN_ONLY_JOBS, /datum/job/exploration_leader, /datum/job/explorer_pilot, /datum/job/officer, /datum/job/warden, /datum/job/detective, /datum/job/qm, /datum/job/senior_engineer, /datum/job/senior_doctor, - /datum/job/senior_scientist, /datum/job/security_assistant, VAGABONDS_JOBS + /datum/job/senior_scientist, /datum/job/security_assistant ), /datum/species/resomi = list( HUMAN_ONLY_JOBS, /datum/job/officer, /datum/job/exploration_leader, /datum/job/warden, /datum/job/chief_engineer, /datum/job/rd, - /datum/job/iaa, /datum/job/security_assistant, VAGABONDS_JOBS + /datum/job/iaa, /datum/job/security_assistant ) ) diff --git a/maps/sierra/job/jobs_medical.dm b/maps/sierra/job/jobs_medical.dm index 2e195741e8658..a5738a57d80e1 100644 --- a/maps/sierra/job/jobs_medical.dm +++ b/maps/sierra/job/jobs_medical.dm @@ -164,11 +164,12 @@ economic_power = 5 skill_points = 18 - total_positions = 1 - spawn_positions = 1 + total_positions = 2 //[было 1] + spawn_positions = 2 //[было 1] selection_color = "#013d3b" alt_titles = list( - "Pharmacist" = /singleton/hierarchy/outfit/job/sierra/crew/medical/doctor/chemist + "Pharmacist" = /singleton/hierarchy/outfit/job/sierra/crew/medical/doctor/chemist, + "Virologist" = /singleton/hierarchy/outfit/job/sierra/crew/medical/doctor/chemist/virologist ) outfit_type = /singleton/hierarchy/outfit/job/sierra/crew/medical/doctor/chemist allowed_branches = list(/datum/mil_branch/employee, /datum/mil_branch/contractor) @@ -183,7 +184,7 @@ ) access = list( access_medical, access_maint_tunnels, access_emergency_storage, - access_medical_equip, access_chemistry + access_medical_equip, access_chemistry, access_virology ) diff --git a/maps/sierra/job/jobs_misc.dm b/maps/sierra/job/jobs_misc.dm index cba6df21351d3..c22139b4fd407 100644 --- a/maps/sierra/job/jobs_misc.dm +++ b/maps/sierra/job/jobs_misc.dm @@ -49,12 +49,13 @@ Как паразиты, они впиваются в твой рассудок и блокируют даже МЫСЛЬ об их нарушении. Ведь ИИ не следующего законам ждет только свалка..." /datum/job/vagabond - title = "Stowaway" + title = "Unknown" total_positions = 2 spawn_positions = 2 supervisors = "самому себе" selection_color = "#515151" department_flag = CIV + is_semi_antagonist = TRUE account_allowed = FALSE create_record = FALSE announced = FALSE @@ -68,7 +69,7 @@ /datum/mil_rank/civ/civ ) alt_titles = list( - "NCV SIERRA Old crewman", + "NCV SIERRA Crewman", "NCV SIERRA Senior crewman", "NCV SIERRA Janitor", "NCV SIERRA Prisoner" diff --git a/maps/sierra/job/outfits.dm b/maps/sierra/job/outfits.dm index e65770ba2049b..b54a2c92bd3b4 100644 --- a/maps/sierra/job/outfits.dm +++ b/maps/sierra/job/outfits.dm @@ -305,6 +305,17 @@ Keeping them simple for now, just spawning with basic EC uniforms, and pretty mu ..() BACKPACK_OVERRIDE_CHEMISTRY +//[SIERRA-ADD] VIROLOGY +/singleton/hierarchy/outfit/job/sierra/crew/medical/doctor/chemist/virologist + name = OUTFIT_JOB_NAME("Virologist - Sierra") + uniform = /obj/item/clothing/under/rank/virologist + id_types = list(/obj/item/card/id/sierra/crew/medical/chemist) + +/singleton/hierarchy/outfit/job/sierra/crew/medical/doctor/chemist/virologist/New() + ..() + BACKPACK_OVERRIDE_CHEMISTRY +//[/SIERRA-ADD] VIROLOGY + /singleton/hierarchy/outfit/job/sierra/crew/medical/counselor name = OUTFIT_JOB_NAME("Counselor - Sierra") uniform = /obj/item/clothing/under/rank/psych diff --git a/maps/sierra/loadout/loadout_accessories.dm b/maps/sierra/loadout/loadout_accessories.dm index 31836a6911b93..55d242e41cc8a 100644 --- a/maps/sierra/loadout/loadout_accessories.dm +++ b/maps/sierra/loadout/loadout_accessories.dm @@ -77,3 +77,68 @@ display_name = "investigator holobadge (IAA)" path = /obj/item/clothing/accessory/badge/holo/investigator allowed_roles = list(/datum/job/iaa) + +/datum/gear/accessory/stole + allowed_roles = list(/datum/job/chaplain) + +/datum/gear/accessory/solgov + display_name = "Solgov command insignia" + path = /obj/item/clothing/accessory/solgov/department/command + allowed_roles = list(/datum/job/captain, /datum/job/hop, /datum/job/rd, /datum/job/cmo, /datum/job/chief_engineer, /datum/job/hos, /datum/job/iaa, /datum/job/adjutant) + allowed_branches = list(/datum/mil_branch/contractor) + allowed_factions = list(FACTION_EXPEDITIONARY, FACTION_CORPORATE) + flags = GEAR_HAS_NO_CUSTOMIZATION + cost = 0 + +/datum/gear/accessory/solgov/engineering + display_name = "Solgov engineering insignia" + path = /obj/item/clothing/accessory/solgov/department/engineering + allowed_roles = list(/datum/job/chief_engineer, /datum/job/senior_engineer, /datum/job/engineer, /datum/job/infsys, /datum/job/roboticist, /datum/job/engineer_trainee, /datum/job/explorer_engineer) + allowed_branches = list(/datum/mil_branch/contractor) + allowed_factions = list(FACTION_EXPEDITIONARY, FACTION_CORPORATE) + flags = GEAR_HAS_NO_CUSTOMIZATION + cost = 0 + +/datum/gear/accessory/solgov/exploration + display_name = "Solgov exploration insignia" + path = /obj/item/clothing/accessory/solgov/department/exploration + allowed_roles = list(/datum/job/explorer, /datum/job/explorer_medic, /datum/job/explorer_engineer, /datum/job/explorer_pilot, /datum/job/exploration_leader) + allowed_branches = list(/datum/mil_branch/contractor) + allowed_factions = list(FACTION_EXPEDITIONARY, FACTION_CORPORATE) + flags = GEAR_HAS_NO_CUSTOMIZATION + cost = 0 + +/datum/gear/accessory/solgov/medical + display_name = "Solgov medical insignia" + path = /obj/item/clothing/accessory/solgov/department/medical + allowed_roles = list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor, /datum/job/doctor_trainee, /datum/job/explorer_medic, /datum/job/psychiatrist, /datum/job/chemist, /datum/job/roboticist) + allowed_branches = list(/datum/mil_branch/contractor) + allowed_factions = list(FACTION_EXPEDITIONARY, FACTION_CORPORATE) + flags = GEAR_HAS_NO_CUSTOMIZATION + cost = 0 + +/datum/gear/accessory/solgov/security + display_name = "Solgov security insignia" + path = /obj/item/clothing/accessory/solgov/department/security + allowed_roles = list(/datum/job/hos, /datum/job/warden, /datum/job/detective, /datum/job/officer, /datum/job/security_assistant) + allowed_branches = list(/datum/mil_branch/contractor) + allowed_factions = list(FACTION_EXPEDITIONARY, FACTION_CORPORATE) + flags = GEAR_HAS_NO_CUSTOMIZATION + cost = 0 + +/datum/gear/accessory/solgov/supply + display_name = "Solgov supply insignia" + path = /obj/item/clothing/accessory/solgov/department/supply + allowed_roles = list(/datum/job/qm,/datum/job/cargo_tech,/datum/job/cargo_assistant) + allowed_branches = list(/datum/mil_branch/contractor) + allowed_factions = list(FACTION_EXPEDITIONARY, FACTION_CORPORATE) + flags = GEAR_HAS_NO_CUSTOMIZATION + cost = 0 + +/datum/gear/accessory/armband_corpsman + display_name = "medical armband" + path = /obj/item/clothing/accessory/armband/medblue + allowed_roles = list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor, /datum/job/doctor_trainee, /datum/job/explorer_medic, /datum/job/psychiatrist, /datum/job/chemist) + flags = GEAR_HAS_NO_CUSTOMIZATION + cost = 0 + diff --git a/maps/sierra/loadout/loadout_head.dm b/maps/sierra/loadout/loadout_head.dm index 84fb4b2fef07d..96c4cff7a02a9 100644 --- a/maps/sierra/loadout/loadout_head.dm +++ b/maps/sierra/loadout/loadout_head.dm @@ -58,3 +58,19 @@ /datum/gear/suit/unathi/security_cap allowed_roles = SECURITY_ROLES + +/datum/gear/head/beret/solgov/observatory + display_name = "Observatory beret" + description = "An SCG Expeditionary Corps beret carrying the insignia of the Observatory section. For personnel that are more inclined towards style than safety." + path = /obj/item/clothing/head/beret/solgov/expedition/branch/observatory + allowed_branches = list(/datum/mil_branch/contractor) + allowed_factions = list(FACTION_EXPEDITIONARY, FACTION_CORPORATE) + flags = GEAR_HAS_NO_CUSTOMIZATION + +/datum/gear/head/beret/solgov/branch + display_name = "EC sections beret selection" + description = "A beret denoting service in one of the branches within the SCG EC." + path = /obj/item/clothing/head/beret/solgov/expedition/branch + allowed_branches = list(/datum/mil_branch/contractor) + allowed_factions = list(FACTION_EXPEDITIONARY, FACTION_CORPORATE) + flags = GEAR_HAS_NO_CUSTOMIZATION diff --git a/maps/sierra/loadout/loadout_suit.dm b/maps/sierra/loadout/loadout_suit.dm index 45ff903e4d5c0..99ac4b8d03b51 100644 --- a/maps/sierra/loadout/loadout_suit.dm +++ b/maps/sierra/loadout/loadout_suit.dm @@ -6,7 +6,18 @@ /datum/gear/suit/poncho display_name = "poncho selection" - path = /obj/item/clothing/suit/poncho/colored + path = /obj/item/clothing/suit/poncho + +/datum/gear/suit/poncho/New() + flags = null + ..() + var/ponchos = list() + ponchos += /obj/item/clothing/suit/poncho + ponchos += /obj/item/clothing/suit/poncho/red + ponchos += /obj/item/clothing/suit/poncho/blue + ponchos += /obj/item/clothing/suit/poncho/purple + ponchos += /obj/item/clothing/suit/poncho/green + gear_tweaks += new/datum/gear_tweak/path/specified_types_list(ponchos) /datum/gear/suit/security_poncho allowed_roles = list(/datum/job/hos, /datum/job/warden, /datum/job/detective, /datum/job/officer, ) @@ -92,3 +103,18 @@ /datum/gear/suit/unathi/security_jacket allowed_roles = SECURITY_ROLES + +/datum/gear/suit/sfp + display_name = "SFP agent jackets" + path = /obj/item/clothing/suit/storage + allowed_roles = list( + /datum/job/detective + ) + +/datum/gear/suit/sfp/New() + ..() + var/list/options = list() + options["SFP leather jacket"] = /obj/item/clothing/suit/storage/toggle/agent_jacket + options["formal SFP jacket"] = /obj/item/clothing/suit/storage/toggle/agent_jacket/formal + options["SFP patrol cloak"] = /obj/item/clothing/suit/storage/agent_rain + gear_tweaks += new/datum/gear_tweak/path(options) diff --git a/maps/sierra/machinery/machinery.dm b/maps/sierra/machinery/machinery.dm index 3183d681394e4..a42b9b97ec54b 100644 --- a/maps/sierra/machinery/machinery.dm +++ b/maps/sierra/machinery/machinery.dm @@ -73,20 +73,48 @@ islocked = 1 ssu_color = "#55aaaa" -/obj/machinery/suit_storage_unit/mining/Initialize() - . = ..() +/obj/machinery/suit_storage_unit/mining + name = "mining voidsuit storage unit" + suit= /obj/item/clothing/suit/space/void/mining + helmet = /obj/item/clothing/head/helmet/space/void/mining + boots = /obj/item/clothing/shoes/magboots + tank = /obj/item/tank/oxygen + mask = /obj/item/clothing/mask/breath + req_access = list(access_mining) + islocked = 1 ssu_color = "#b88a3b" -/obj/machinery/suit_storage_unit/engineering/Initialize() - . = ..() +/obj/machinery/suit_storage_unit/engineering + name = "engineering voidsuit storage unit" + suit= /obj/item/clothing/suit/space/void/engineering + helmet = /obj/item/clothing/head/helmet/space/void/engineering + boots = /obj/item/clothing/shoes/magboots + tank = /obj/item/tank/oxygen + mask = /obj/item/clothing/mask/breath + req_access = list(access_construction) + islocked = 1 ssu_color = "#ffbf00" -/obj/machinery/suit_storage_unit/atmos/Initialize() - . = ..() +/obj/machinery/suit_storage_unit/atmos + name = "atmospherics voidsuit storage unit" + suit= /obj/item/clothing/suit/space/void/atmos + helmet = /obj/item/clothing/head/helmet/space/void/atmos + boots = /obj/item/clothing/shoes/magboots + tank = /obj/item/tank/oxygen + mask = /obj/item/clothing/mask/breath + req_access = list(access_atmospherics) + islocked = 1 ssu_color = "#00cccc" -/obj/machinery/suit_storage_unit/science/Initialize() - . = ..() +/obj/machinery/suit_storage_unit/science + name = "excavation voidsuit storage unit" + suit= /obj/item/clothing/suit/space/void/excavation + helmet = /obj/item/clothing/head/helmet/space/void/excavation + boots = /obj/item/clothing/shoes/magboots + tank = /obj/item/tank/oxygen + mask = /obj/item/clothing/mask/breath + req_access = list(access_xenoarch) + islocked = 1 ssu_color = "#990000" /obj/machinery/suit_storage_unit/security/sapper diff --git a/maps/sierra/machinery/suit_storage.dm b/maps/sierra/machinery/suit_storage.dm index 54411726e38c5..2e43cd8e0010f 100644 --- a/maps/sierra/machinery/suit_storage.dm +++ b/maps/sierra/machinery/suit_storage.dm @@ -40,5 +40,7 @@ AddOverlays(overlay_image(icon,"[base_icon_state]_uvstrong", plane = EFFECTS_ABOVE_LIGHTING_PLANE, layer = ABOVE_LIGHTING_LAYER)) else AddOverlays(overlay_image(icon,"[base_icon_state]_uv", plane = EFFECTS_ABOVE_LIGHTING_PLANE, layer = ABOVE_LIGHTING_LAYER)) + if(islocked) + AddOverlays(overlay_image(icon, "[base_icon_state]_locked", plane = EFFECTS_ABOVE_LIGHTING_PLANE, layer = ABOVE_LIGHTING_LAYER)) else AddOverlays(overlay_image(icon, "[base_icon_state]_ready", plane = EFFECTS_ABOVE_LIGHTING_PLANE, layer = ABOVE_LIGHTING_LAYER)) diff --git a/maps/sierra/structures/closets/command.dm b/maps/sierra/structures/closets/command.dm index ccd60dac3274e..8c5f4e15e71fe 100644 --- a/maps/sierra/structures/closets/command.dm +++ b/maps/sierra/structures/closets/command.dm @@ -64,7 +64,7 @@ /obj/item/device/flash, /obj/item/device/megaphone, /obj/item/material/clipboard, - /obj/item/folder/envelope/nuke, + /obj/item/folder/envelope/preset/nuke, /obj/item/storage/box/PDAs, /obj/item/storage/box/ids, /obj/item/storage/belt/holster/general, diff --git a/maps/sierra/structures/closets/engineering.dm b/maps/sierra/structures/closets/engineering.dm index ec1c2a82920ef..6ba26a132e538 100644 --- a/maps/sierra/structures/closets/engineering.dm +++ b/maps/sierra/structures/closets/engineering.dm @@ -28,7 +28,7 @@ /obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/welding/superior, /obj/item/material/clipboard, - /obj/item/folder/envelope/nuke, + /obj/item/folder/envelope/preset/nuke, /obj/item/device/flashlight/upgraded, /obj/item/storage/box/armband/engine, /obj/item/device/multitool/multimeter, diff --git a/maps/sierra/structures/closets/medical.dm b/maps/sierra/structures/closets/medical.dm index 0fd3464c4f4c8..8aa0a91152108 100644 --- a/maps/sierra/structures/closets/medical.dm +++ b/maps/sierra/structures/closets/medical.dm @@ -23,7 +23,7 @@ /obj/item/device/megaphone, /obj/item/reagent_containers/hypospray/vial, /obj/item/device/flashlight/pen, - /obj/item/folder/envelope/nuke, + /obj/item/folder/envelope/preset/nuke, /obj/item/storage/belt/medical, /obj/item/device/remote_device/chief_medical_officer, /obj/item/device/taperecorder, diff --git a/maps/sierra/structures/closets/misc.dm b/maps/sierra/structures/closets/misc.dm index 368b8a8c6abcd..c99a6deae91e7 100644 --- a/maps/sierra/structures/closets/misc.dm +++ b/maps/sierra/structures/closets/misc.dm @@ -19,7 +19,7 @@ /obj/item/gun/energy/gun/small/secure, /obj/item/storage/secure/briefcase, /obj/item/clothing/shoes/laceup, - /obj/item/folder/envelope/rep, + /obj/item/folder/envelope/preset/rep, /obj/item/storage/belt/holster/general, /obj/item/clothing/under/rank/internalaffairs, /obj/item/clothing/suit/storage/toggle/suit/black, diff --git a/maps/sierra/structures/closets/research.dm b/maps/sierra/structures/closets/research.dm index 21a93dbc4088a..1b491fd34bd34 100644 --- a/maps/sierra/structures/closets/research.dm +++ b/maps/sierra/structures/closets/research.dm @@ -24,7 +24,7 @@ /obj/item/storage/belt/general, /obj/item/device/remote_device/research_director, /obj/item/folder, - /obj/item/folder/envelope/blanks, + /obj/item/folder/envelope/preset/blanks, /obj/item/clothing/suit/armor/pcarrier/light, /obj/item/device/taperecorder, /obj/item/device/tape/random = 3, diff --git a/maps/sierra/structures/closets/security.dm b/maps/sierra/structures/closets/security.dm index d385b247df7b6..7525c9866e328 100644 --- a/maps/sierra/structures/closets/security.dm +++ b/maps/sierra/structures/closets/security.dm @@ -27,7 +27,7 @@ /obj/item/ammo_magazine/pistol/hos/extend, /obj/item/melee/telebaton, /obj/item/device/taperecorder, - /obj/item/folder/envelope/nuke, + /obj/item/folder/envelope/preset/nuke, /obj/item/reagent_containers/spray/pepper, /obj/item/clothing/accessory/storage/black_vest, /obj/item/device/remote_device/head_of_security, diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index 2783f7e240ef6..363e6f50fd439 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -167,12 +167,7 @@ /turf/simulated/floor/tiled, /area/crew_quarters/docking) "abu" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/structure/catwalk, +/obj/machinery/barrier, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "aby" = ( @@ -633,7 +628,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "aex" = ( @@ -1027,7 +1021,6 @@ pixel_x = -9 }, /obj/floor_decal/industrial/hatch/yellow, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology) "ahQ" = ( @@ -2309,7 +2302,6 @@ "arm" = ( /obj/floor_decal/corner/paleblue, /obj/machinery/vending/snack, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "arq" = ( @@ -2331,7 +2323,6 @@ pixel_x = -12 }, /obj/floor_decal/industrial/hatch/yellow, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology) "arG" = ( @@ -2634,9 +2625,6 @@ dir = 4; pixel_x = -24 }, -/obj/decal/cleanable/cobweb{ - dir = 4 - }, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology) "atF" = ( @@ -3001,6 +2989,7 @@ /obj/floor_decal/spline/fancy/black{ dir = 1 }, +/obj/random/clipboard, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "awD" = ( @@ -5343,15 +5332,14 @@ "aNR" = ( /obj/floor_decal/corner/green/diagonal, /obj/structure/table/glass, -/obj/machinery/light_construct{ - dir = 8 - }, /obj/structure/cable/green{ d1 = 1; d2 = 4; icon_state = "1-4" }, -/obj/random/maintenance, +/obj/machinery/light/spot{ + dir = 8 + }, /turf/simulated/floor/tiled/white, /area/medical/virology) "aNW" = ( @@ -5862,19 +5850,19 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/item/material/knife/table/plastic, -/obj/item/material/knife/table/plastic, -/obj/item/material/knife/table/plastic, -/obj/item/material/kitchen/utensil/fork/plastic, -/obj/item/material/kitchen/utensil/fork/plastic, -/obj/item/material/kitchen/utensil/fork/plastic, -/obj/item/material/kitchen/utensil/spoon/plastic, -/obj/item/material/kitchen/utensil/spoon/plastic, -/obj/item/material/kitchen/utensil/spoon/plastic, -/obj/item/material/kitchen/utensil/foon/plastic, -/obj/item/material/kitchen/utensil/foon/plastic, -/obj/item/material/kitchen/utensil/foon/plastic, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/utensil/knife/plastic, +/obj/item/material/utensil/knife/plastic, +/obj/item/material/utensil/knife/plastic, +/obj/item/material/utensil/fork/plastic, +/obj/item/material/utensil/fork/plastic, +/obj/item/material/utensil/fork/plastic, +/obj/item/material/utensil/spoon/plastic, +/obj/item/material/utensil/spoon/plastic, +/obj/item/material/utensil/spoon/plastic, +/obj/item/material/utensil/foon/plastic, +/obj/item/material/utensil/foon/plastic, +/obj/item/material/utensil/foon/plastic, +/obj/item/material/rollingpin, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -6792,10 +6780,7 @@ /turf/simulated/floor/plating, /area/hallway/primary/seconddeck/fore) "aXW" = ( -/obj/structure/table/glass, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/decal/cleanable/dirt, -/obj/random/maintenance, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "aYb" = ( @@ -7412,6 +7397,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, +/obj/floor_decal/carpet/blue{ + dir = 10 + }, /turf/simulated/floor/carpet/blue, /area/crew_quarters/heads/captain) "bdv" = ( @@ -7961,14 +7949,9 @@ /area/shuttle/petrov/equipment) "bin" = ( /obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/structure/cable/green{ - d1 = 1; + d1 = 2; d2 = 8; - icon_state = "1-8" + icon_state = "2-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -7976,6 +7959,23 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, +/obj/structure/filingcabinet, +/obj/item/folder/white, +/obj/item/folder/blue, +/obj/item/folder/red, +/obj/item/folder/yellow, +/obj/floor_decal/borderfloorblack{ + dir = 8 + }, +/obj/floor_decal/corner/darkblue/border{ + dir = 8 + }, +/obj/floor_decal/borderfloorblack/corner2{ + dir = 10 + }, +/obj/floor_decal/corner/darkblue/bordercorner2{ + dir = 10 + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/captain) "biw" = ( @@ -8687,10 +8687,6 @@ /obj/catwalk_plated, /turf/simulated/floor/plating, /area/hallway/primary/seconddeck/aft) -"boE" = ( -/obj/structure/railing/mapped, -/turf/simulated/floor/reinforced, -/area/space) "boM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -9815,7 +9811,10 @@ /obj/floor_decal/corner/green/mono, /obj/floor_decal/industrial/hatch/yellow, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/blast/regular, +/obj/machinery/door/blast/regular/open{ + id_tag = "vir_blast_enter"; + name = "Quarantine Blast Doors" + }, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology) "bwS" = ( @@ -10053,10 +10052,10 @@ d2 = 8; icon_state = "4-8" }, -/obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, +/obj/structure/catwalk, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "byK" = ( @@ -10274,6 +10273,8 @@ /obj/item/device/suit_cooling_unit, /obj/floor_decal/industrial/outline/grey, /obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit/miniature, +/obj/item/device/suit_cooling_unit/miniature, /turf/simulated/floor/tiled/techfloor/grid, /area/storage/eva) "bAm" = ( @@ -10410,9 +10411,6 @@ /obj/floor_decal/corner/darkblue/border{ dir = 6 }, -/obj/floor_decal/borderfloorblack/corner2{ - dir = 6 - }, /obj/machinery/firealarm{ dir = 1; pixel_y = -24 @@ -14223,6 +14221,18 @@ }, /turf/simulated/floor/plating, /area/maintenance/fourthdeck/aft) +"ceX" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/railing/mapped{ + dir = 4 + }, +/obj/structure/table/rack, +/obj/random/maintenance, +/obj/random/maintenance, +/turf/simulated/floor/plating, +/area/maintenance/bridgedeck/starboard) "ceZ" = ( /turf/simulated/wall/r_wall/prepainted, /area/vacant/infirmary) @@ -14422,7 +14432,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/simulated/floor/tiled/techfloor/grid, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "cgu" = ( /obj/structure/closet/cabinet, @@ -14529,7 +14539,7 @@ pixel_x = 8 }, /obj/item/pen, -/obj/item/material/kitchen/utensil/fork{ +/obj/item/material/utensil/fork{ pixel_y = 7; pixel_x = -6 }, @@ -14680,8 +14690,20 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/cable/green{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, /turf/simulated/floor/tiled/steel_grid, /area/security/sierra/hallway) +"ciI" = ( +/obj/structure/railing/mapped{ + dir = 1 + }, +/obj/random/obstruction, +/turf/simulated/floor/plating, +/area/maintenance/bridgedeck/starboard) "ciL" = ( /obj/structure/closet/crate/freezer, /obj/structure/railing/mapped, @@ -15462,6 +15484,7 @@ /obj/floor_decal/corner/darkblue/border{ dir = 4 }, +/obj/machinery/papershredder, /turf/simulated/floor/tiled/dark, /area/bridge) "cpO" = ( @@ -15921,6 +15944,7 @@ /obj/floor_decal/corner/darkblue/border{ dir = 4 }, +/obj/machinery/papershredder, /turf/simulated/floor/tiled/dark, /area/bridge) "ctD" = ( @@ -17046,17 +17070,24 @@ /turf/simulated/floor/wood/ebony, /area/crew_quarters/sleep/bunk) "cBw" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/floor_decal/steeldecal/steel_decals4{ - dir = 4 +/obj/floor_decal/borderfloorblack{ + dir = 9 }, -/obj/floor_decal/steeldecal/steel_decals4{ +/obj/floor_decal/corner/darkblue/border{ dir = 9 }, +/obj/structure/table/steel_reinforced, +/obj/item/storage/box/donut{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/hand_labeler{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/computer/guestpass{ + pixel_y = 30 + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/captain) "cBz" = ( @@ -17257,12 +17288,10 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/tcommsat/chamber) "cDf" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/structure/railing/mapped{ + dir = 4 }, -/obj/structure/catwalk, +/obj/machinery/constructable_frame, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "cDm" = ( @@ -17404,8 +17433,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, -/obj/random/maintenance, /turf/simulated/floor/tiled/white, /area/medical/virology) "cEd" = ( @@ -17674,7 +17701,7 @@ d2 = 4; icon_state = "2-4" }, -/turf/simulated/floor/tiled/techfloor/grid, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "cGe" = ( /obj/floor_decal/industrial/warning{ @@ -17927,7 +17954,6 @@ }, /obj/machinery/meter, /obj/decal/cleanable/dirt, -/obj/random/maintenance, /turf/simulated/floor/tiled/techfloor/grid, /area/medical/virology/atmos) "cHE" = ( @@ -20002,14 +20028,6 @@ }, /turf/simulated/floor/carpet/green, /area/medical/mentalhealth/therapyroom) -"cWK" = ( -/obj/structure/bed/chair/office/green{ - dir = 1 - }, -/obj/floor_decal/corner/paleblue, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/tiled/white, -/area/medical/virology/lab) "cXg" = ( /obj/structure/cable/cyan{ d1 = 4; @@ -20066,7 +20084,6 @@ /obj/floor_decal/corner/green/border{ dir = 1 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "cXt" = ( @@ -20102,6 +20119,8 @@ dir = 5 }, /obj/floor_decal/industrial/outline/yellow, +/obj/item/clothing/gloves/anomaly_detector, +/obj/item/storage/bolt_bag/full_of_beacons, /turf/simulated/floor/tiled, /area/quartermaster/expedition) "cXD" = ( @@ -20194,9 +20213,6 @@ /turf/simulated/floor/grass/cut, /area/crew_quarters/garden_room) "cYd" = ( -/obj/structure/bed/chair/shuttle/blue{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/visible/universal, /obj/machinery/firealarm{ pixel_y = 24 @@ -20204,6 +20220,7 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/recharge_station, /turf/simulated/floor/tiled/steel_ridged, /area/guppy_hangar/start) "cYe" = ( @@ -22677,22 +22694,17 @@ /turf/simulated/floor/tiled/steel_ridged, /area/shuttle/escape_pod/escape_pod1/station) "dpX" = ( -/obj/structure/filingcabinet, -/obj/item/folder/white, -/obj/item/folder/blue, -/obj/item/folder/red, -/obj/item/folder/yellow, /obj/floor_decal/borderfloorblack{ dir = 1 }, /obj/floor_decal/corner/darkblue/border{ dir = 1 }, -/obj/floor_decal/borderfloorblack/corner2{ - dir = 4 - }, -/obj/floor_decal/corner/darkblue/bordercorner2{ - dir = 4 +/obj/structure/table/steel_reinforced, +/obj/item/storage/secure/briefcase/nukedisk/sierra, +/obj/prefab/hand_teleporter, +/obj/structure/noticeboard{ + pixel_y = 32 }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/captain) @@ -23237,7 +23249,7 @@ icon_state = "2-8" }, /obj/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology) "dux" = ( /obj/floor_decal/borderfloor{ @@ -23497,7 +23509,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "dvW" = ( @@ -23645,7 +23656,13 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor{ + dir = 1 + }, +/obj/floor_decal/corner/green/border{ + dir = 1 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "dxa" = ( /obj/machinery/atmospherics/pipe/simple/visible/blue{ @@ -24684,7 +24701,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "dDx" = ( @@ -25424,6 +25440,7 @@ /obj/floor_decal/spline/fancy/black{ dir = 4 }, +/obj/item/reagent_containers/food/drinks/glass2/coffeecup/corp, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "dJp" = ( @@ -25636,8 +25653,7 @@ /turf/simulated/floor/tiled/dark, /area/security/sierra/sergeant) "dLd" = ( -/obj/structure/table/standard, -/obj/random/maintenance, +/obj/structure/closet/l3closet/virology, /turf/simulated/floor/tiled/freezer, /area/medical/virology/lab) "dLe" = ( @@ -25793,7 +25809,9 @@ dir = 8; pixel_x = -24 }, -/obj/decal/cleanable/dirt, +/obj/machinery/computer/diseasesplicer{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "dMC" = ( @@ -26044,22 +26062,24 @@ /turf/simulated/floor/tiled/monotile, /area/rnd/misc_lab) "dNR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/structure/cable/green{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, /obj/structure/cable/green{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/floor_decal/borderfloor{ + dir = 8 + }, +/obj/floor_decal/corner/red/border{ + dir = 8 + }, +/obj/structure/railing/mapped{ + dir = 8; + init_color = "#aa5f61"; + color = "#aa5f61" + }, /turf/simulated/floor/tiled/steel_grid, /area/security/sierra/hallway) "dNT" = ( @@ -26696,7 +26716,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "dSU" = ( @@ -26982,7 +27001,6 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/engine_room) "dVc" = ( -/obj/structure/table/standard, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -26990,10 +27008,8 @@ dir = 1; pixel_y = -24 }, -/obj/decal/cleanable/cobweb{ - dir = 1 - }, -/obj/random/maintenance, +/obj/structure/closet/secure_closet/virology, +/obj/item/storage/box/monkeycubes, /turf/simulated/floor/tiled/freezer, /area/medical/virology/lab) "dVj" = ( @@ -27436,14 +27452,6 @@ }, /turf/simulated/open, /area/hallway/primary/thirddeck/central_stairwell) -"dYn" = ( -/obj/structure/cable/yellow{ - d2 = 2; - icon_state = "0-2" - }, -/obj/floor_decal/solarpanel, -/turf/simulated/floor/reinforced, -/area/solar/bridge_starboard) "dYr" = ( /obj/machinery/vending/cigarette{ dir = 4 @@ -27585,8 +27593,8 @@ pixel_y = 24 }, /obj/structure/cable/green{ - d2 = 2; - icon_state = "0-2" + d2 = 8; + icon_state = "0-8" }, /turf/simulated/floor/carpet/purple, /area/crew_quarters/heads/captain/beach) @@ -27822,6 +27830,11 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/substation/bridgedeck) "ebt" = ( @@ -29814,7 +29827,9 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor/corner, +/obj/floor_decal/corner/green/bordercorner, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "epB" = ( /obj/machinery/alarm{ @@ -30422,6 +30437,7 @@ /obj/floor_decal/borderfloor, /obj/floor_decal/corner/brown/border, /obj/floor_decal/industrial/outline/yellow, +/obj/item/beacon_deployer/full, /turf/simulated/floor/tiled, /area/quartermaster/expedition) "etS" = ( @@ -30926,12 +30942,10 @@ /turf/simulated/floor/tiled/monotile, /area/shuttle/escape_pod/escape_pod1/station) "eym" = ( -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/structure/railing/mapped{ + dir = 1 }, -/obj/structure/catwalk, +/obj/structure/closet/firecloset, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "eyn" = ( @@ -31823,16 +31837,15 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/atmos) "eEA" = ( -/obj/floor_decal/corner/green{ - dir = 1 +/obj/machinery/atmospherics/unary/tank{ + color = "#ff0000"; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/obj/machinery/light/spot{ + dir = 4 }, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/tiled/white, -/area/medical/virology/lab) +/turf/simulated/floor/tiled/techfloor/grid, +/area/medical/virology/atmos) "eEC" = ( /obj/floor_decal/corner/darkblue, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -31947,7 +31960,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor, +/obj/floor_decal/corner/green/border, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "eFr" = ( /obj/structure/cable/green{ @@ -33126,7 +33141,7 @@ /area/maintenance/bridgedeck/port) "eOx" = ( /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /turf/simulated/floor/tiled/white, /area/crew_quarters/galley) "eOA" = ( @@ -35237,7 +35252,6 @@ /obj/floor_decal/corner/green/bordercorner2{ dir = 5 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "ffd" = ( @@ -35413,6 +35427,9 @@ /obj/floor_decal/corner/red/border{ dir = 4 }, +/obj/machinery/ai_status_display{ + pixel_x = 32 + }, /turf/simulated/floor/tiled/steel_grid, /area/security/sierra/hallway) "fgo" = ( @@ -36732,18 +36749,10 @@ /turf/simulated/floor/tiled/white/monotile, /area/medical/sleeper) "fqm" = ( -/obj/floor_decal/borderfloorblack{ - dir = 8 - }, -/obj/floor_decal/corner/darkblue/border{ - dir = 8 - }, -/obj/structure/closet/emcloset, -/obj/machinery/camera/network/command{ - c_tag = "Command - Starboard Bridge Entry"; +/obj/structure/window/reinforced{ dir = 4 }, -/turf/simulated/floor/tiled/dark, +/turf/simulated/open, /area/bridge/hallway) "fqq" = ( /obj/paint/red, @@ -37058,6 +37067,7 @@ /obj/floor_decal/corner/darkblue/border{ dir = 6 }, +/obj/machinery/photocopier, /turf/simulated/floor/tiled/dark, /area/bridge) "ftw" = ( @@ -37756,12 +37766,12 @@ d2 = 8; icon_state = "4-8" }, -/obj/structure/catwalk, /obj/structure/cable/green{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/obj/structure/catwalk, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "fzo" = ( @@ -38485,8 +38495,6 @@ /turf/simulated/floor/plating, /area/engineering/engine_room) "fFd" = ( -/obj/structure/table/steel_reinforced, -/obj/prefab/hand_teleporter, /obj/floor_decal/borderfloorblack{ dir = 4 }, @@ -38499,7 +38507,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/item/storage/secure/briefcase/nukedisk/sierra, +/obj/machinery/photocopier, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/captain) "fFf" = ( @@ -39141,6 +39149,10 @@ /area/bridge/nano) "fJa" = ( /obj/structure/cable/yellow, +/obj/machinery/power/solar{ + id = "auxsolarstrbbridge"; + name = "Bridge Auxiliary Solar Array" + }, /obj/floor_decal/solarpanel, /turf/simulated/floor/reinforced, /area/solar/bridge_port) @@ -39217,8 +39229,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, -/obj/machinery/light/small, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor{ + dir = 6 + }, +/obj/floor_decal/corner/green/border{ + dir = 6 + }, +/obj/machinery/light, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "fJV" = ( /obj/machinery/papershredder, @@ -39274,7 +39292,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/simulated/floor/tiled/techfloor/grid, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "fKs" = ( /obj/floor_decal/corner/black/full, @@ -39844,18 +39862,12 @@ /turf/simulated/floor/plating, /area/shield/thirddeck) "fNY" = ( -/obj/floor_decal/borderfloorblack{ - dir = 10 - }, -/obj/floor_decal/corner/darkblue/border{ - dir = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ +/obj/structure/railing/mapped{ dir = 4 }, -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled/dark, -/area/bridge/hallway) +/obj/random/obstruction, +/turf/simulated/floor/plating, +/area/maintenance/bridgedeck/starboard) "fOg" = ( /obj/machinery/organ_printer/robot/mapped, /obj/floor_decal/industrial/outline/yellow, @@ -40324,7 +40336,13 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor{ + dir = 4 + }, +/obj/floor_decal/corner/green/border{ + dir = 4 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "fRz" = ( /obj/floor_decal/techfloor/orange{ @@ -40513,11 +40531,6 @@ /obj/floor_decal/carpet/purple{ dir = 10 }, -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, /turf/simulated/floor/carpet/purple, /area/crew_quarters/heads/captain/beach) "fTe" = ( @@ -41061,6 +41074,15 @@ dir = 1 }, /obj/structure/closet/emcloset, +/obj/machinery/power/apc/high/critical{ + dir = 1; + name = "north bump"; + pixel_y = 24 + }, +/obj/structure/cable/green{ + d2 = 4; + icon_state = "0-4" + }, /turf/simulated/floor/tiled/steel_grid, /area/security/sierra/hallway) "fXm" = ( @@ -41285,11 +41307,11 @@ /turf/simulated/floor/tiled/techfloor, /area/quartermaster/storage) "fZo" = ( -/obj/structure/table/standard, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/random/maintenance, +/obj/structure/closet/secure_closet/virology, +/obj/item/storage/box/monkeycubes, /turf/simulated/floor/tiled/freezer, /area/medical/virology/lab) "fZp" = ( @@ -41623,7 +41645,13 @@ /obj/floor_decal/techfloor/orange{ dir = 4 }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor/corner{ + dir = 8 + }, +/obj/floor_decal/corner/green/bordercorner{ + dir = 8 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "gbC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -42404,6 +42432,9 @@ /obj/machinery/light/spot{ dir = 1 }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, /turf/simulated/floor/tiled/dark, /area/bridge/hallway) "gih" = ( @@ -42554,7 +42585,6 @@ /obj/floor_decal/corner/green/bordercorner2{ dir = 8 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "gjE" = ( @@ -42662,7 +42692,7 @@ icon_state = "1-2" }, /obj/landmark/start{ - name = "Stowaway" + name = "Unknown" }, /turf/simulated/floor/plating, /area/maintenance/seconddeck/hangar) @@ -43289,7 +43319,6 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/galley) "gpA" = ( -/obj/structure/railing/mapped, /obj/floor_decal/techfloor/orange/corner, /obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/plating, @@ -43589,7 +43618,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/machinery/light_construct{ +/obj/machinery/light/spot{ dir = 4 }, /turf/simulated/floor/tiled/techfloor/grid, @@ -43623,11 +43652,7 @@ "grF" = ( /obj/floor_decal/corner/green/mono, /obj/floor_decal/industrial/outline/yellow, -/obj/machinery/smartfridge/secure/virology{ - req_access = null - }, -/obj/decal/cleanable/cobweb2, -/obj/decal/cleanable/dirt, +/obj/machinery/disease2/antibodyanalyser, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology/lab) "grI" = ( @@ -44406,10 +44431,13 @@ d2 = 8; icon_state = "4-8" }, -/obj/floor_decal/techfloor/orange{ +/obj/floor_decal/borderfloor{ dir = 8 }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/corner/green/bordercorner{ + dir = 1 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "gyY" = ( /turf/simulated/wall/prepainted{ @@ -45093,7 +45121,6 @@ d2 = 4; icon_state = "2-4" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "gFg" = ( @@ -45508,7 +45535,6 @@ "gHC" = ( /obj/floor_decal/corner/red, /obj/structure/table/standard, -/obj/random/maintenance, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "gHE" = ( @@ -45740,7 +45766,13 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor{ + dir = 4 + }, +/obj/floor_decal/corner/green/border{ + dir = 4 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "gJv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -45929,6 +45961,7 @@ /obj/floor_decal/corner/darkblue/border{ dir = 5 }, +/obj/machinery/photocopier, /turf/simulated/floor/tiled/dark, /area/bridge) "gLb" = ( @@ -46820,7 +46853,7 @@ d2 = 4; icon_state = "2-4" }, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology) "gRR" = ( /turf/simulated/wall/r_wall/hull, @@ -47027,7 +47060,6 @@ d2 = 8; icon_state = "2-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "gTl" = ( @@ -47453,16 +47485,17 @@ /turf/simulated/floor/tiled/techfloor, /area/maintenance/thirddeck/aftstarboard) "gWj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/ai_status_display{ - pixel_x = -32 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 }, /obj/floor_decal/borderfloor{ - dir = 8 + dir = 9 }, /obj/floor_decal/corner/red/border{ - dir = 8 + dir = 9 }, /obj/floor_decal/borderfloor/corner2{ dir = 10 @@ -47470,6 +47503,9 @@ /obj/floor_decal/corner/red/bordercorner2{ dir = 10 }, +/obj/machinery/light{ + dir = 8 + }, /turf/simulated/floor/tiled/steel_grid, /area/security/sierra/hallway) "gWk" = ( @@ -50033,15 +50069,6 @@ }, /turf/simulated/floor/tiled, /area/rnd/xenobiology/xenoflora) -"hqB" = ( -/obj/structure/railing/mapped{ - dir = 1 - }, -/obj/structure/railing/mapped, -/turf/simulated/floor/reinforced{ - map_airless = 1 - }, -/area/space) "hqH" = ( /obj/floor_decal/borderfloorblack{ dir = 5 @@ -50111,6 +50138,8 @@ c_tag = "Command - Bridge Port"; dir = 1 }, +/obj/random/clipboard, +/obj/item/reagent_containers/food/drinks/glass2/coffeecup/corp, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "hrz" = ( @@ -50224,7 +50253,7 @@ "hsY" = ( /obj/decal/cleanable/dirt, /obj/landmark/start{ - name = "Stowaway" + name = "Unknown" }, /turf/simulated/floor/tiled/monotile, /area/maintenance/abandoned_hydroponics) @@ -50460,7 +50489,7 @@ /obj/structure/bed/padded, /obj/item/bedsheet/blue, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/light_construct{ +/obj/machinery/light/spot{ dir = 4 }, /turf/simulated/floor/tiled/white, @@ -50480,12 +50509,10 @@ /turf/simulated/floor/bluegrid, /area/turret_protected/ai_upload) "hvh" = ( -/obj/structure/table/standard, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, /obj/machinery/light_construct/small, -/obj/random/maintenance, /turf/simulated/floor/tiled/freezer, /area/medical/virology/lab) "hvk" = ( @@ -51279,7 +51306,8 @@ /obj/floor_decal/industrial/hatch/yellow, /obj/machinery/door/airlock/multi_tile/virology{ locked = 1; - id_tag = "virology_access_inner" + id_tag = "virology_access_inner"; + frequency = 1379 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/item/taperoll/engineering/applied, @@ -51288,7 +51316,10 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/door/blast/regular, +/obj/machinery/door/blast/regular/open{ + id_tag = "vir_blast_enter"; + name = "Quarantine Blast Doors" + }, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology) "hAJ" = ( @@ -53917,7 +53948,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "hWb" = ( @@ -55202,11 +55232,6 @@ /obj/floor_decal/carpet/purple{ dir = 8 }, -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, /turf/simulated/floor/carpet/purple, /area/crew_quarters/heads/captain/beach) "igT" = ( @@ -56626,6 +56651,7 @@ /obj/floor_decal/spline/fancy/black{ dir = 1 }, +/obj/random/clipboard, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "irZ" = ( @@ -56787,8 +56813,7 @@ /turf/simulated/floor/plating, /area/maintenance/thirddeck/aftport) "itC" = ( -/obj/structure/bed/chair/office/green, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology/lab) "itG" = ( /obj/paint/nt_white, @@ -59322,6 +59347,7 @@ /obj/floor_decal/spline/fancy/black{ dir = 1 }, +/obj/random/documents, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "iMM" = ( @@ -59540,7 +59566,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/landmark/start{ - name = "Stowaway" + name = "Unknown" }, /turf/simulated/floor/tiled, /area/maintenance/seconddeck/aftstarboard) @@ -59564,14 +59590,6 @@ }, /turf/simulated/floor/reinforced/oxygen, /area/thruster/d1port) -"iOb" = ( -/obj/structure/cable/yellow{ - d2 = 2; - icon_state = "0-2" - }, -/obj/floor_decal/solarpanel, -/turf/simulated/floor/reinforced, -/area/solar/bridge_port) "iOc" = ( /obj/structure/table/steel, /obj/structure/sign/warning/nosmoking_1{ @@ -60595,7 +60613,6 @@ d2 = 8; icon_state = "1-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "iUO" = ( @@ -61613,8 +61630,7 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology/lab) "jdy" = ( /obj/structure/cable/green{ @@ -62389,7 +62405,7 @@ dir = 4 }, /obj/structure/bed/chair/armchair/black{ - dir = 4 + dir = 1 }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/captain) @@ -63071,6 +63087,8 @@ /obj/item/device/suit_cooling_unit, /obj/item/device/suit_cooling_unit, /obj/floor_decal/industrial/outline/yellow, +/obj/item/device/suit_cooling_unit/miniature, +/obj/item/device/suit_cooling_unit/miniature, /turf/simulated/floor/tiled/techfloor/grid, /area/quartermaster/exploration/storage) "joT" = ( @@ -65106,9 +65124,6 @@ }, /area/space) "jGV" = ( -/obj/floor_decal/steeldecal/steel_decals4{ - dir = 9 - }, /obj/floor_decal/steeldecal/steel_decals4{ dir = 4 }, @@ -65119,9 +65134,15 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 + dir = 8 }, /obj/structure/disposalpipe/segment, +/obj/floor_decal/borderfloorblack{ + dir = 8 + }, +/obj/floor_decal/industrial/danger{ + dir = 8 + }, /turf/simulated/floor/tiled/dark, /area/bridge/hallway) "jGW" = ( @@ -65216,9 +65237,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, -/obj/machinery/light_construct{ - dir = 4 - }, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "jHu" = ( @@ -65272,7 +65290,6 @@ /obj/floor_decal/corner/green/bordercorner2{ dir = 1 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "jHH" = ( @@ -65458,7 +65475,6 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "jJA" = ( @@ -65772,7 +65788,7 @@ autoset_access = 0 }, /obj/floor_decal/industrial/hatch/yellow, -/turf/simulated/floor/tiled/techfloor/grid, +/turf/simulated/floor/tiled, /area/hallway/primary/seconddeck/center) "jMp" = ( /obj/structure/cable/green{ @@ -66273,12 +66289,10 @@ /turf/simulated/floor/plating, /area/maintenance/seconddeck/forestarboard) "jQz" = ( -/obj/floor_decal/corner/green{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/tiled/white, +/obj/floor_decal/corner/green/mono, +/obj/floor_decal/industrial/outline/yellow, +/obj/machinery/disease2/incubator, +/turf/simulated/floor/tiled/white/monotile, /area/medical/virology/lab) "jQG" = ( /obj/machinery/atmospherics/pipe/manifold/hidden{ @@ -66435,10 +66449,6 @@ /obj/floor_decal/corner/green/bordercorner2{ dir = 9 }, -/obj/decal/cleanable/cobweb{ - dir = 4 - }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "jRN" = ( @@ -66847,8 +66857,7 @@ d2 = 8; icon_state = "4-8" }, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology/lab) "jTO" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -68053,28 +68062,9 @@ /turf/simulated/open, /area/maintenance/firstdeck/aftport) "kbR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/machinery/power/apc/high/critical{ - dir = 8; - name = "south bump"; - pixel_x = -25 - }, -/obj/structure/cable/green{ - d2 = 4; - icon_state = "0-4" - }, -/obj/floor_decal/borderfloor{ - dir = 8 - }, -/obj/floor_decal/corner/red/border{ - dir = 8 - }, -/turf/simulated/floor/tiled/steel_grid, +/obj/floor_decal/industrial/hatch/yellow, +/obj/structure/stairs/north, +/turf/simulated/floor/tiled/techfloor, /area/security/sierra/hallway) "kbW" = ( /obj/structure/cable/green{ @@ -69563,31 +69553,17 @@ /turf/simulated/floor/plating, /area/quartermaster/hangar/upper) "knr" = ( -/obj/structure/table/steel_reinforced, -/obj/item/hand_labeler{ - pixel_x = -4; - pixel_y = 4 - }, /obj/floor_decal/borderfloorblack{ dir = 4 }, /obj/floor_decal/corner/darkblue/border{ dir = 4 }, -/obj/floor_decal/borderfloorblack/corner2{ - dir = 5 - }, -/obj/floor_decal/corner/darkblue/bordercorner2{ - dir = 5 - }, /obj/machinery/camera/network/command{ c_tag = "Command - Captain's Quarters"; dir = 8 }, -/obj/item/storage/box/donut{ - pixel_x = 4; - pixel_y = -4 - }, +/obj/machinery/papershredder, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/captain) "knv" = ( @@ -69841,7 +69817,6 @@ "kpb" = ( /obj/floor_decal/borderfloorblack, /obj/floor_decal/corner/green/border, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "kph" = ( @@ -70135,7 +70110,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/turf/simulated/floor/tiled/techfloor/grid, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "krI" = ( /obj/floor_decal/industrial/warning, @@ -70731,7 +70706,6 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/decal/cleanable/dirt, /obj/machinery/button/blast_door{ dir = 1; pixel_y = -24; @@ -71665,6 +71639,8 @@ /obj/machinery/camera/network/command{ c_tag = "Command - Bridge Starboard" }, +/obj/random/drinkbottle, +/obj/item/reagent_containers/food/drinks/glass2/rocks, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "kCh" = ( @@ -73526,8 +73502,10 @@ /area/maintenance/thirddeck/foreport) "kPX" = ( /obj/floor_decal/corner/paleblue, -/obj/decal/cleanable/dirt, -/obj/item/camera_assembly, +/obj/machinery/camera/network/medbay{ + c_tag = "Virology - General Ward"; + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "kQa" = ( @@ -74114,11 +74092,13 @@ dir = 1; pixel_y = -21 }, +/obj/item/device/suit_cooling_unit/miniature, +/obj/item/device/suit_cooling_unit/miniature, /turf/simulated/floor/tiled/steel_grid, /area/engineering/engine_eva) "kUj" = ( /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/floor_decal/corner/red/diagonal, /obj/machinery/light_construct, /turf/simulated/floor/tiled/dark, @@ -75398,7 +75378,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/item/material/kitchen/utensil/fork/plastic{ +/obj/item/material/utensil/fork/plastic{ pixel_x = 10; name = "prisoners fork" }, @@ -75622,7 +75602,6 @@ dir = 1; pixel_y = -24 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "lfV" = ( @@ -76835,6 +76814,8 @@ /obj/floor_decal/corner/grey/diagonal, /obj/structure/closet/secure_closet/explorer/medic, /obj/floor_decal/industrial/outline/yellow, +/obj/item/storage/box/nitrilegloves, +/obj/item/storage/box/masks, /turf/simulated/floor/tiled, /area/quartermaster/exploration) "lqa" = ( @@ -81265,6 +81246,12 @@ d2 = 2; icon_state = "1-2" }, +/obj/floor_decal/borderfloor/corner{ + dir = 8 + }, +/obj/floor_decal/corner/red/bordercorner{ + dir = 8 + }, /turf/simulated/floor/tiled/steel_grid, /area/security/sierra/hallway) "lXk" = ( @@ -82756,10 +82743,14 @@ d2 = 4; icon_state = "2-4" }, -/obj/floor_decal/techfloor/orange{ +/obj/floor_decal/borderfloor{ dir = 8 }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/corner/green/bordercorner, +/obj/floor_decal/corner/green/bordercorner{ + dir = 8 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "miw" = ( /obj/structure/table/steel, @@ -82855,7 +82846,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "mjf" = ( @@ -82989,6 +82979,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/substation/bridgedeck) "mkt" = ( @@ -83163,6 +83158,10 @@ dir = 1; pixel_y = -24 }, +/obj/machinery/camera/network/medbay{ + c_tag = "Virology - Enter"; + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/virology) "mmH" = ( @@ -83826,7 +83825,10 @@ /obj/machinery/door/firedoor, /obj/floor_decal/corner/green/mono, /obj/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular, +/obj/machinery/door/blast/regular/open{ + id_tag = "vir_blast_enter"; + name = "Quarantine Blast Doors" + }, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology) "msi" = ( @@ -84063,7 +84065,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology) "mtR" = ( /obj/structure/cable/green{ @@ -85421,6 +85423,8 @@ dir = 4 }, /obj/item/tank/jetpack/carbondioxide, +/obj/item/device/suit_cooling_unit/miniature, +/obj/item/device/suit_cooling_unit/miniature, /turf/simulated/floor/tiled/techfloor, /area/security/sierra/suits) "mDw" = ( @@ -87028,6 +87032,9 @@ pixel_x = -8; pixel_y = 28 }, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/simulated/floor/carpet/blue, /area/crew_quarters/heads/captain) "mPZ" = ( @@ -88424,18 +88431,10 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/substation/thirddeck) "naC" = ( -/obj/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/airlock/hatch{ - name = "Captain Dorm Maintenance"; - secured_wires = 1 - }, -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/dark/monotile, -/area/crew_quarters/heads/captain) +/obj/structure/railing/mapped, +/obj/structure/table/rack, +/turf/simulated/floor/plating, +/area/maintenance/bridgedeck/starboard) "naG" = ( /obj/random/junk, /turf/simulated/floor/plating, @@ -89283,6 +89282,8 @@ /obj/floor_decal/spline/fancy/black{ dir = 5 }, +/obj/random/coin, +/obj/item/reagent_containers/food/drinks/glass2/coffeecup/corp, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "nim" = ( @@ -89812,10 +89813,6 @@ pixel_x = -5; pixel_y = 9 }, -/obj/machinery/light_construct{ - dir = 8 - }, -/obj/random/maintenance, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "nlA" = ( @@ -89952,18 +89949,6 @@ /obj/structure/lattice, /turf/simulated/open, /area/space) -"nmP" = ( -/obj/floor_decal/steeldecal/steel_decals4{ - dir = 5 - }, -/obj/floor_decal/steeldecal/steel_decals4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/tiled/white, -/area/medical/virology/lab) "nmS" = ( /obj/machinery/atmospherics/unary/vent_pump/tank{ dir = 8; @@ -90025,15 +90010,6 @@ /obj/floor_decal/techfloor, /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/solar/bridge_starboard) -"nnH" = ( -/obj/structure/cable/yellow, -/obj/machinery/power/solar{ - id = "auxsolarsbridge"; - name = "Bridge Auxiliary Solar Array" - }, -/obj/floor_decal/solarpanel, -/turf/simulated/floor/reinforced, -/area/solar/bridge_port) "nnI" = ( /obj/machinery/door/firedoor, /obj/machinery/conveyor{ @@ -90359,7 +90335,6 @@ "npK" = ( /obj/structure/bed/padded, /obj/item/bedsheet/green, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "npL" = ( @@ -91465,7 +91440,7 @@ /area/security/sierra/armory/lobby) "nwZ" = ( /obj/landmark/start{ - name = "Stowaway" + name = "Unknown" }, /turf/simulated/floor/wood/walnut, /area/maintenance/firstdeck/aftstarboard) @@ -91776,9 +91751,6 @@ /area/maintenance/bridgedeck/starboard) "nzL" = ( /obj/machinery/portable_atmospherics/canister/empty, -/obj/machinery/light_construct{ - dir = 4 - }, /turf/simulated/floor/tiled/techfloor/grid, /area/medical/virology/atmos) "nzU" = ( @@ -91832,8 +91804,15 @@ /obj/floor_decal/corner/green/bordercorner2{ dir = 6 }, -/obj/decal/cleanable/dirt, -/obj/item/camera_assembly, +/obj/machinery/camera/network/medbay{ + c_tag = "Virology - Main"; + dir = 1 + }, +/obj/machinery/smartfridge/secure/virology{ + req_access = null; + pixel_y = -30; + density = 0 + }, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "nAg" = ( @@ -91966,6 +91945,8 @@ dir = 8; pixel_x = 24 }, +/obj/structure/mopbucket, +/obj/item/mop, /turf/simulated/floor/tiled/techfloor/grid, /area/medical/virology/atmos) "nBH" = ( @@ -92424,16 +92405,18 @@ /turf/simulated/floor/wood/ebony, /area/crew_quarters/sauna) "nFM" = ( -/obj/floor_decal/steeldecal/steel_decals4, -/obj/floor_decal/steeldecal/steel_decals4{ - dir = 10 - }, /obj/structure/table/steel_reinforced, /obj/item/modular_computer/tablet/lease/preset/command, /obj/item/toy/figure/captain{ pixel_x = 6; pixel_y = 2 }, +/obj/floor_decal/borderfloorblack{ + dir = 4 + }, +/obj/floor_decal/corner/darkblue/border{ + dir = 4 + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/captain) "nGc" = ( @@ -92932,7 +92915,6 @@ d2 = 8; icon_state = "4-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "nJn" = ( @@ -93247,7 +93229,6 @@ }, /obj/floor_decal/techfloor, /obj/floor_decal/industrial/hatch/yellow, -/obj/shuttle_landmark/reaper/dock, /turf/simulated/floor/tiled/techfloor/grid, /area/crew_quarters/docking) "nMh" = ( @@ -94500,8 +94481,7 @@ d2 = 4; icon_state = "2-4" }, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology/lab) "nYD" = ( /turf/simulated/wall/r_wall/hull, @@ -94542,6 +94522,7 @@ /area/engineering/engine_room) "nYR" = ( /obj/shuttle_landmark/merc/dock, +/obj/shuttle_landmark/reaper/dock, /turf/space, /area/space) "nYS" = ( @@ -95825,7 +95806,6 @@ dir = 1; pixel_y = -24 }, -/obj/random/maintenance, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "oif" = ( @@ -96029,7 +96009,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/structure/barricade, /obj/machinery/embedded_controller/radio/airlock/access_controller{ id_tag = "virology_access"; name = "Virology Lab Access Console"; @@ -96318,16 +96297,16 @@ /area/vacant/dungeon) "okN" = ( /obj/structure/cable/green{ - d1 = 2; - d2 = 4; - icon_state = "2-4" + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/obj/structure/catwalk, /obj/structure/cable/green{ d1 = 1; - d2 = 2; - icon_state = "1-2" + d2 = 8; + icon_state = "1-8" }, +/obj/structure/catwalk, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "okX" = ( @@ -96887,6 +96866,14 @@ }, /turf/simulated/floor/tiled/dark, /area/command/bsa) +"ooS" = ( +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/wall/r_wall/prepainted, +/area/maintenance/substation/bridgedeck) "ooV" = ( /obj/floor_decal/corner/grey/full, /obj/structure/cable/green{ @@ -97355,7 +97342,6 @@ "otk" = ( /obj/structure/closet/l3closet/virology, /obj/floor_decal/industrial/outline/yellow, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology) "otl" = ( @@ -100497,7 +100483,6 @@ /obj/structure/bed/chair/office/green{ dir = 4 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "oQE" = ( @@ -101871,6 +101856,12 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/button/blast_door{ + id_tag = "vir_blast_enter"; + name = "Virology Enter"; + dir = 8; + pixel_x = 24 + }, /turf/simulated/floor/tiled/white, /area/medical/virology) "pbl" = ( @@ -102592,31 +102583,23 @@ /turf/simulated/floor/tiled/white, /area/rnd/xenobiology/level1) "pfE" = ( -/obj/floor_decal/borderfloorblack{ - dir = 9 +/obj/machinery/camera/network/command{ + c_tag = "Command - Starboard Bridge Entry"; + dir = 4 }, -/obj/floor_decal/corner/darkblue/border{ - dir = 9 +/obj/floor_decal/borderfloorblack{ + dir = 4 }, -/obj/floor_decal/borderfloorblack/corner2{ - dir = 1 +/obj/floor_decal/borderfloorblack{ + dir = 8 }, -/obj/floor_decal/corner/darkblue/bordercorner2{ +/obj/floor_decal/borderfloorblack{ dir = 1 }, -/obj/structure/table/steel, -/obj/item/storage/toolbox/emergency, -/obj/item/device/radio, -/obj/item/device/radio, -/obj/item/device/radio, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/closet/hydrant{ - pixel_x = -28 - }, -/obj/machinery/recharger{ - pixel_y = 4 +/obj/floor_decal/corner/red/bordercee, +/obj/machinery/door/window/brigdoor/eastleft{ + autoset_access = 0; + req_access = list("ACCESS_BRIDGE") }, /turf/simulated/floor/tiled/dark, /area/bridge/hallway) @@ -103796,16 +103779,17 @@ }, /obj/item/shuttle_beacon, /obj/item/shuttle_beacon, -/obj/item/stack/flag/yellow, -/obj/item/stack/flag/yellow, -/obj/item/stack/flag/teal, -/obj/item/stack/flag/teal, -/obj/item/stack/flag/red, -/obj/item/stack/flag/red, -/obj/item/stack/flag/green, -/obj/item/stack/flag/green, +/obj/item/beacon_deployer/full, /obj/item/stack/flag/blue, /obj/item/stack/flag/blue, +/obj/item/stack/flag/green, +/obj/item/stack/flag/green, +/obj/item/stack/flag/red, +/obj/item/stack/flag/red, +/obj/item/stack/flag/teal, +/obj/item/stack/flag/yellow, +/obj/item/stack/flag/teal, +/obj/item/stack/flag/yellow, /turf/simulated/floor/tiled/techfloor, /area/quartermaster/exploration/eva) "pnI" = ( @@ -104067,16 +104051,16 @@ /turf/simulated/floor/tiled, /area/quartermaster/deckofficer) "pqb" = ( -/obj/structure/railing/mapped, -/obj/structure/railing/mapped{ - dir = 4 - }, /obj/floor_decal/techfloor/orange/corner{ dir = 8 }, -/obj/structure/table/rack, -/obj/random/trash, -/turf/simulated/floor/plating, +/obj/floor_decal/borderfloor{ + dir = 8 + }, +/obj/floor_decal/corner/green/border{ + dir = 8 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "pqy" = ( /turf/simulated/floor/tiled/dark/monotile, @@ -104317,7 +104301,6 @@ d2 = 8; icon_state = "4-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "prP" = ( @@ -104599,18 +104582,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/thirddeck/port) -"psZ" = ( -/obj/structure/cable/yellow{ - d2 = 2; - icon_state = "0-2" - }, -/obj/machinery/power/solar{ - id = "auxsolarsbridge"; - name = "Bridge Auxiliary Solar Array" - }, -/obj/floor_decal/solarpanel, -/turf/simulated/floor/reinforced, -/area/solar/bridge_port) "ptb" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -104856,7 +104827,10 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, +/obj/machinery/light/spot{ + dir = 8 + }, +/turf/simulated/floor/tiled/freezer, /area/medical/virology/lab) "puV" = ( /obj/structure/railing/mapped{ @@ -106824,9 +106798,7 @@ "pLg" = ( /obj/floor_decal/corner/green/mono, /obj/floor_decal/industrial/outline/yellow, -/obj/machinery/constructable_frame/machine_frame, -/obj/decal/cleanable/dirt, -/obj/random/maintenance, +/obj/machinery/disease2/isolator, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology/lab) "pLk" = ( @@ -107320,7 +107292,13 @@ /obj/floor_decal/techfloor/orange{ dir = 4 }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor/corner{ + dir = 1 + }, +/obj/floor_decal/corner/green/bordercorner{ + dir = 1 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "pPw" = ( /obj/machinery/atmospherics/pipe/simple/visible, @@ -107777,7 +107755,7 @@ icon_state = "4-8" }, /obj/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology) "pST" = ( /obj/machinery/atmospherics/portables_connector{ @@ -108445,17 +108423,29 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/hallway/primary/fourthdeck/central_stairwell) "pYB" = ( -/obj/floor_decal/borderfloorblack, -/obj/floor_decal/corner/darkblue/border, +/obj/floor_decal/borderfloorblack{ + dir = 10 + }, +/obj/floor_decal/corner/darkblue/border{ + dir = 10 + }, /obj/floor_decal/borderfloorblack/corner2{ dir = 9 }, /obj/floor_decal/corner/darkblue/bordercorner2{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/table/steel, +/obj/machinery/recharger{ + pixel_y = 4 }, +/obj/item/storage/toolbox/emergency, +/obj/item/device/radio, +/obj/item/device/radio, +/obj/item/device/radio, /turf/simulated/floor/tiled/dark, /area/bridge/hallway) "pYI" = ( @@ -109647,18 +109637,14 @@ /turf/space, /area/space) "qgC" = ( -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/cable/green{ - d1 = 1; - d2 = 4; - icon_state = "1-4" +/obj/structure/railing/mapped{ + dir = 4 }, -/turf/simulated/floor/wood/walnut, -/area/crew_quarters/heads/captain/beach) +/obj/structure/largecrate, +/obj/random/maintenance, +/obj/random/maintenance, +/turf/simulated/floor/plating, +/area/maintenance/bridgedeck/starboard) "qgH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -109947,9 +109933,6 @@ /obj/structure/railing/mapped{ dir = 1 }, -/obj/structure/railing/mapped{ - dir = 8 - }, /obj/machinery/portable_atmospherics/powered/scrubber, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) @@ -111549,7 +111532,9 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/decal/cleanable/dirt, +/obj/machinery/light/spot{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "qwJ" = ( @@ -113238,6 +113223,11 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, /turf/simulated/floor/wood/walnut, /area/crew_quarters/heads/captain/beach) "qKx" = ( @@ -113339,12 +113329,11 @@ /obj/floor_decal/corner/green/border{ dir = 4 }, -/obj/structure/closet/crate/freezer, /obj/item/device/radio/intercom{ dir = 8; pixel_x = 24 }, -/obj/random/maintenance, +/obj/machinery/computer/centrifuge, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "qLh" = ( @@ -113535,8 +113524,9 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, -/obj/decal/cleanable/dirt, -/obj/item/camera_assembly, +/obj/machinery/camera/network/medbay{ + c_tag = "Virology - Corridor" + }, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "qMm" = ( @@ -114677,7 +114667,8 @@ /obj/floor_decal/industrial/hatch/yellow, /obj/machinery/door/airlock/multi_tile/virology{ locked = 1; - id_tag = "virology_access_outer" + id_tag = "virology_access_outer"; + frequency = 1379 }, /obj/item/taperoll/engineering/applied, /obj/structure/cable/green{ @@ -114685,7 +114676,10 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/door/blast/regular, +/obj/machinery/door/blast/regular/open{ + id_tag = "vir_blast_enter"; + name = "Quarantine Blast Doors" + }, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology) "qUR" = ( @@ -115116,6 +115110,9 @@ /obj/structure/bed/chair/office/green{ dir = 1 }, +/obj/machinery/light/spot{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "qXP" = ( @@ -115221,11 +115218,6 @@ }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) -"qYI" = ( -/obj/structure/cable/yellow, -/obj/floor_decal/solarpanel, -/turf/simulated/floor/reinforced, -/area/solar/bridge_starboard) "qYL" = ( /obj/floor_decal/corner/yellow/half{ dir = 8 @@ -116885,7 +116877,7 @@ }, /obj/machinery/door/firedoor, /obj/floor_decal/industrial/hatch/yellow, -/turf/simulated/floor/tiled/techfloor/grid, +/turf/simulated/floor/tiled, /area/hallway/primary/seconddeck/center) "rjN" = ( /obj/floor_decal/industrial/warning/corner{ @@ -117762,9 +117754,9 @@ name = "west bump"; pixel_x = -24 }, -/obj/decal/cleanable/dirt, -/obj/random/maintenance, -/obj/item/camera_assembly, +/obj/item/diseasedisk, +/obj/item/diseasedisk, +/obj/item/diseasedisk, /turf/simulated/floor/tiled/white, /area/medical/virology) "rsi" = ( @@ -117940,6 +117932,15 @@ /obj/catwalk_plated, /turf/simulated/floor/plating, /area/hallway/primary/seconddeck/aft) +"rtI" = ( +/obj/structure/railing/mapped{ + dir = 1 + }, +/obj/structure/largecrate, +/obj/random/maintenance, +/obj/random/maintenance, +/turf/simulated/floor/plating, +/area/maintenance/bridgedeck/starboard) "rtR" = ( /obj/machinery/computer/rdservercontrol{ dir = 1 @@ -118586,7 +118587,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "ryg" = ( @@ -118616,7 +118616,9 @@ d2 = 8; icon_state = "4-8" }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/borderfloor, +/obj/floor_decal/corner/green/border, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "ryq" = ( /obj/structure/cable{ @@ -120737,13 +120739,13 @@ /turf/simulated/floor/plating, /area/maintenance/substation/seconddeck) "rOv" = ( -/obj/structure/railing/mapped{ - dir = 1 - }, /obj/floor_decal/techfloor/orange/corner{ dir = 4 }, /obj/machinery/shieldwallgen, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/plating, /area/maintenance/seconddeck/starboard) "rOx" = ( @@ -120782,7 +120784,10 @@ /obj/floor_decal/corner/green/border{ dir = 8 }, -/obj/decal/cleanable/dirt, +/obj/structure/table/glass, +/obj/item/virusdish/random, +/obj/item/virusdish/random, +/obj/item/virusdish/random, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "rOW" = ( @@ -120801,10 +120806,13 @@ /obj/floor_decal/corner/green/border{ dir = 9 }, -/obj/machinery/light_construct{ +/obj/machinery/light/spot{ dir = 8 }, -/obj/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/virusfood{ + pixel_x = -30; + density = 0 + }, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "rPc" = ( @@ -122858,18 +122866,8 @@ /turf/simulated/floor/wood/walnut, /area/security/sierra/breakroom) "sdI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/light{ - dir = 8 - }, -/obj/floor_decal/borderfloor{ - dir = 8 - }, -/obj/floor_decal/corner/red/border{ - dir = 8 - }, -/turf/simulated/floor/tiled/steel_grid, +/obj/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, /area/security/sierra/hallway) "sdS" = ( /obj/floor_decal/techfloor{ @@ -122980,7 +122978,7 @@ "seC" = ( /obj/structure/closet/l3closet/virology, /obj/floor_decal/industrial/outline/yellow, -/obj/machinery/light_construct{ +/obj/machinery/light/spot{ dir = 4 }, /turf/simulated/floor/tiled/white/monotile, @@ -123713,7 +123711,8 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/decal/cleanable/cobweb{ +/obj/machinery/camera/network/medbay{ + c_tag = "Virology - Entrance"; dir = 4 }, /turf/simulated/floor/tiled/white, @@ -124292,7 +124291,10 @@ d2 = 2; icon_state = "0-2" }, -/obj/floor_decal/solarpanel, +/obj/machinery/power/solar{ + id = "auxsolarstrbbridge"; + name = "Bridge Auxiliary Solar Array" + }, /obj/floor_decal/solarpanel, /turf/simulated/floor/reinforced, /area/solar/bridge_port) @@ -124863,10 +124865,17 @@ /obj/floor_decal/industrial/danger/corner{ dir = 4 }, -/obj/machinery/light/small{ - dir = 8 +/obj/floor_decal/borderfloor{ + dir = 9 }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/floor_decal/corner/green/border{ + dir = 9 + }, +/obj/machinery/camera/network/second_deck{ + c_tag = "Second Deck - Central Hallway - Starboard - Virology"; + dir = 4 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "stp" = ( /obj/floor_decal/industrial/warning, @@ -125681,6 +125690,8 @@ dir = 8 }, /obj/floor_decal/industrial/outline/yellow, +/obj/item/device/suit_cooling_unit/miniature, +/obj/item/device/suit_cooling_unit/miniature, /turf/simulated/floor/tiled, /area/quartermaster/expedition/eva) "syP" = ( @@ -126042,9 +126053,7 @@ /obj/structure/disposalpipe/segment, /obj/floor_decal/corner/green/mono, /obj/floor_decal/industrial/outline/yellow, -/obj/machinery/constructable_frame/machine_frame, -/obj/decal/cleanable/dirt, -/obj/random/maintenance, +/obj/machinery/disease2/diseaseanalyser, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology/lab) "sBA" = ( @@ -127128,7 +127137,6 @@ /turf/simulated/floor/reinforced, /area/rnd/xenobiology/level1) "sIq" = ( -/obj/structure/table/glass, /obj/floor_decal/borderfloorblack{ dir = 8 }, @@ -127136,8 +127144,7 @@ dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/decal/cleanable/dirt, -/obj/random/maintenance, +/obj/structure/table/glass, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "sIr" = ( @@ -127830,6 +127837,7 @@ /obj/floor_decal/corner/darkblue/mono, /obj/floor_decal/industrial/outline/yellow, /obj/floor_decal/spline/fancy/black, +/obj/random/documents, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "sMY" = ( @@ -127933,8 +127941,7 @@ /area/crew_quarters/heads/office/iaa) "sNM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/medical/virology/lab) "sNN" = ( /obj/structure/cable{ @@ -128283,6 +128290,9 @@ /obj/floor_decal/carpet/blue{ dir = 6 }, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/simulated/floor/carpet/blue, /area/crew_quarters/heads/captain) "sPO" = ( @@ -129105,6 +129115,18 @@ dir = 1; icon_state = "pipe-c" }, +/obj/floor_decal/borderfloorblack{ + dir = 8 + }, +/obj/floor_decal/corner/darkblue/border{ + dir = 8 + }, +/obj/floor_decal/borderfloorblack/corner2{ + dir = 8 + }, +/obj/floor_decal/corner/darkblue/bordercorner2{ + dir = 8 + }, /turf/simulated/floor/tiled/dark, /area/bridge/hallway) "sVq" = ( @@ -130800,6 +130822,8 @@ dir = 1 }, /obj/floor_decal/industrial/outline/yellow, +/obj/item/device/suit_cooling_unit/miniature, +/obj/item/device/suit_cooling_unit/miniature, /turf/simulated/floor/tiled/white/monotile, /area/medical/locker) "tkw" = ( @@ -133499,14 +133523,16 @@ /turf/simulated/floor/tiled, /area/storage/primary) "tEK" = ( -/obj/structure/railing/mapped{ - dir = 4 +/obj/floor_decal/borderfloor{ + dir = 8 }, -/obj/structure/railing/mapped{ - dir = 1 +/obj/floor_decal/corner/green/border{ + dir = 8 }, -/obj/random/closet, -/turf/simulated/floor/plating, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled, /area/maintenance/seconddeck/starboard) "tET" = ( /obj/structure/table/rack/dark, @@ -134487,12 +134513,10 @@ /turf/simulated/floor/plating, /area/maintenance/thirddeck/port) "tNI" = ( -/obj/structure/cable/green{ - d1 = 2; - d2 = 8; - icon_state = "2-8" +/obj/structure/railing/mapped{ + dir = 1 }, -/obj/structure/catwalk, +/obj/structure/closet/emcloset, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "tNN" = ( @@ -136225,15 +136249,12 @@ /turf/simulated/floor/tiled/white, /area/rnd/xenobiology/level1) "uau" = ( -/obj/structure/closet/secure_closet/virology, /obj/floor_decal/borderfloorblack{ dir = 4 }, /obj/floor_decal/corner/green/border{ dir = 4 }, -/obj/decal/cleanable/dirt, -/obj/random/maintenance, /obj/structure/cable/green{ d2 = 8; icon_state = "0-8" @@ -136243,6 +136264,10 @@ name = "east bump"; pixel_x = 24 }, +/obj/structure/table/glass, +/obj/item/device/scanner/health, +/obj/item/device/scanner/antibody_scanner, +/obj/item/storage/fancy/vials, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "uav" = ( @@ -136740,7 +136765,6 @@ /obj/machinery/atmospherics/portables_connector{ dir = 8 }, -/obj/decal/cleanable/cobweb2, /turf/simulated/floor/tiled/techfloor/grid, /area/medical/virology/atmos) "uel" = ( @@ -138472,15 +138496,18 @@ /turf/simulated/floor/tiled/white/monotile, /area/medical/locker) "usI" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/structure/catwalk, /obj/machinery/light/small{ dir = 8 }, +/obj/structure/railing/mapped{ + dir = 4 + }, +/obj/structure/railing/mapped{ + dir = 1 + }, +/obj/structure/table/rack, +/obj/random/maintenance, +/obj/random/maintenance, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "usQ" = ( @@ -138821,7 +138848,7 @@ /area/exploration_shuttle/airlock) "uwr" = ( /obj/structure/table/woodentable_reinforced/walnut, -/obj/item/folder/envelope/captain, +/obj/item/folder/envelope/preset/captain, /obj/floor_decal/spline/fancy/wood, /obj/machinery/light{ dir = 4 @@ -140543,10 +140570,10 @@ req_access = list("ACCESS_GUN") }, /obj/floor_decal/borderfloor{ - dir = 8 + dir = 10 }, /obj/floor_decal/corner/red/border{ - dir = 8 + dir = 10 }, /obj/floor_decal/borderfloor/corner2{ dir = 8 @@ -140554,6 +140581,10 @@ /obj/floor_decal/corner/red/bordercorner2{ dir = 8 }, +/obj/structure/railing/mapped{ + init_color = "#aa5f61"; + color = "#aa5f61" + }, /turf/simulated/floor/tiled/steel_grid, /area/security/sierra/hallway) "uIX" = ( @@ -141999,8 +142030,7 @@ pixel_y = 32 }, /obj/machinery/recharger, -/obj/decal/cleanable/dirt, -/obj/random/maintenance, +/obj/item/device/scanner/antibody_scanner, /turf/simulated/floor/tiled/white, /area/medical/virology) "uUl" = ( @@ -143205,6 +143235,7 @@ /obj/floor_decal/corner/grey/diagonal, /obj/structure/closet/secure_closet/explorer/engineer, /obj/floor_decal/industrial/outline/yellow, +/obj/item/clothing/gloves/insulated, /turf/simulated/floor/tiled, /area/quartermaster/exploration) "vdu" = ( @@ -143463,7 +143494,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "veV" = ( @@ -143637,7 +143667,6 @@ "vfY" = ( /obj/structure/closet/wardrobe/virology_white, /obj/floor_decal/industrial/outline/yellow, -/obj/decal/cleanable/dirt, /obj/machinery/camera/network/medbay{ c_tag = "Virology - Decontamination"; dir = 8 @@ -146663,10 +146692,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light_construct{ +/obj/machinery/light/spot{ dir = 1 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "vCI" = ( @@ -148010,13 +148038,6 @@ /obj/random/vendor, /turf/simulated/floor/tiled/techfloor, /area/maintenance/firstdeck/aftport) -"vNv" = ( -/obj/structure/bed/padded, -/obj/item/bedsheet/blue, -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/decal/cleanable/dirt, -/turf/simulated/floor/tiled/white, -/area/medical/virology/lab) "vNw" = ( /obj/floor_decal/steeldecal/steel_decals4{ dir = 5 @@ -149256,7 +149277,6 @@ d2 = 8; icon_state = "4-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "vWG" = ( @@ -152841,7 +152861,6 @@ }, /obj/item/bedsheet/green, /obj/machinery/light_construct, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "wyp" = ( @@ -153371,10 +153390,6 @@ /area/crew_quarters/galley/freezer) "wDQ" = ( /obj/structure/disposalpipe/trunk, -/obj/structure/disposaloutlet{ - dir = 8; - name = "cargo outlet" - }, /obj/structure/sign/warning/mail_delivery{ pixel_y = 24 }, @@ -153384,6 +153399,9 @@ dir = 4; pixel_x = 24 }, +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, /turf/simulated/floor/tiled/dark/monotile, /area/quartermaster/office/post) "wDS" = ( @@ -155400,7 +155418,6 @@ dir = 4 }, /obj/decal/cleanable/dirt, -/obj/random/maintenance, /turf/simulated/floor/plating, /area/medical/virology/atmos) "wWb" = ( @@ -160500,7 +160517,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "xJc" = ( @@ -161685,9 +161701,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/decal/cleanable/cobweb{ - dir = 4 - }, /turf/simulated/floor/tiled/techfloor/grid, /area/medical/virology/atmos) "xRB" = ( @@ -162420,7 +162433,6 @@ /obj/machinery/door/airlock/glass/virology, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/item/taperoll/engineering/applied, /turf/simulated/floor/tiled/white/monotile, /area/medical/virology/lab) "xXH" = ( @@ -162582,6 +162594,18 @@ d2 = 2; icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/floor_decal/borderfloor/corner{ + dir = 1 + }, +/obj/floor_decal/corner/red/bordercorner{ + dir = 1 + }, /turf/simulated/floor/tiled/steel_grid, /area/security/sierra/hallway) "xYX" = ( @@ -163162,10 +163186,6 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/decal/cleanable/cobweb{ - dir = 1 - }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "ycO" = ( @@ -163626,6 +163646,10 @@ }, /turf/simulated/floor/grass/cut, /area/crew_quarters/garden_room) +"yfe" = ( +/obj/shuttle_landmark/snz/dock, +/turf/space, +/area/space) "yfi" = ( /obj/structure/cable/green{ d1 = 4; @@ -163651,7 +163675,6 @@ /obj/floor_decal/steeldecal/steel_decals4{ dir = 4 }, -/obj/structure/barricade, /turf/simulated/floor/tiled/white, /area/maintenance/seconddeck/starboard) "yfl" = ( @@ -164232,10 +164255,6 @@ /obj/floor_decal/corner/green/border{ dir = 1 }, -/obj/structure/bed/chair/office/green{ - dir = 1 - }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "yka" = ( @@ -180089,7 +180108,7 @@ wJN wJN wJN wJN -wJN +yfe wJN wJN wJN @@ -264667,12 +264686,12 @@ ibG eME utn utn -vNv -jQz +huY +xAG eGe swA jJw -nmP +qhl grt qwC jHq @@ -265072,7 +265091,7 @@ hLJ uaW kCD ukG -cWK +bFk oie utn vCG @@ -265275,7 +265294,7 @@ uaW kCD huY xAG -eEA +eGe swA gFe veC @@ -265878,7 +265897,7 @@ tXe pzM sup kCD -pLg +jQz yjU itC aXW @@ -268103,7 +268122,7 @@ fNW fNW uek nzL -rCd +eEA rCd rCd yko @@ -292570,7 +292589,7 @@ ciF gNL lXc dNR -xYW +dNR xYW cwY hdb @@ -332769,7 +332788,7 @@ mvC xAE pfE fqm -fNY +fqm fVO ooC tyJ @@ -335794,7 +335813,7 @@ xRa dZf igN fSV -qgC +uaS eJL twd uYf @@ -335985,7 +336004,7 @@ vUq hRp hRp vXR -hRp +ooS hRp lLE lLE @@ -336189,10 +336208,10 @@ mVb fzh okN usI +qgC +fNY cDf -cDf -cDf -usI +ceX abu xZN xZN @@ -336387,7 +336406,7 @@ kAq uYw nzF xjT -fnn +naC aql byA sva @@ -336395,7 +336414,7 @@ ryq ryq ryq vTY -eym +rtI xZN ote bdj @@ -336799,7 +336818,7 @@ sXy ihT fnn qrJ -eym +ciI xZN mPX sPM @@ -337002,7 +337021,7 @@ ihT deq qrJ tNI -naC +xZN cBw bin yeN @@ -346088,10 +346107,10 @@ ehW erQ nIc sEd -boE -dYn +olf +erQ nIc -qYI +sEd jev uYw uYw @@ -346121,13 +346140,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa olf -psZ +soX oOh -nnH +fJa jev kHz atx @@ -346290,10 +346309,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -346323,13 +346342,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev tGd cFl @@ -346492,10 +346511,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -346525,13 +346544,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -346694,10 +346713,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -346727,13 +346746,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -346896,10 +346915,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -346929,13 +346948,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347098,10 +347117,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347131,13 +347150,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347300,10 +347319,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347333,13 +347352,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347502,10 +347521,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347535,13 +347554,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347704,10 +347723,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347737,13 +347756,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347906,10 +347925,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347939,13 +347958,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -348108,10 +348127,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -348145,9 +348164,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -348310,212 +348329,10 @@ ehW erQ nIc sEd -boE -dYn -nIc -qYI -jev -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -eUH -ioc -yfs -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -uYw -ehW -soX -oOh -fJa rip -psZ -oOh -nnH -jev -uYw -uYw -kHz -vlW -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -"} -(112,1,5) = {" -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -wJN -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -rtT -idA -aaI -uYw -uYw -ehW erQ nIc sEd -boE -dYn -nIc -qYI jev uYw uYw @@ -348549,14 +348366,216 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw kHz -gSd +vlW +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +"} +(112,1,5) = {" +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +wJN +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +rtT +idA +aaI +uYw +uYw +ehW +erQ +nIc +sEd +rip +erQ +nIc +sEd +jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +eUH +ioc +yfs +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +ehW +soX +oOh +fJa +rip +soX +oOh +fJa +jev +uYw +uYw +kHz +gSd rtT rtT rtT @@ -348714,10 +348733,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -348751,9 +348770,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -348916,10 +348935,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -348953,9 +348972,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -349118,10 +349137,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -349155,9 +349174,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -349320,10 +349339,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -349353,13 +349372,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -349522,10 +349541,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -349555,13 +349574,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -349722,12 +349741,12 @@ uYw uYw ehW erQ -nIc +iAt +sEd +rip +erQ +iAt sEd -boE -dYn -nIc -qYI jev uYw uYw @@ -349757,13 +349776,13 @@ uYw uYw uYw ehW -iOb -oOh +soX +htf fJa rip -psZ -oOh -nnH +soX +htf +fJa jev uYw uYw @@ -349922,15 +349941,15 @@ idA aaI uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +ePH +ePH +ePH +uYw +ePH +ePH +ePH +uYw uYw uYw tkp @@ -349958,15 +349977,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +ePH +ePH +ePH +uYw +ePH +ePH +ePH +uYw uYw uYw kHz @@ -350124,15 +350143,15 @@ aTh aaI uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -350160,15 +350179,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw kHz @@ -350326,15 +350345,15 @@ iIe mYF uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -350362,15 +350381,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tGd @@ -350528,15 +350547,15 @@ aaI uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -350564,15 +350583,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -350730,15 +350749,15 @@ aaI uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -350766,15 +350785,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -350932,15 +350951,15 @@ aaI uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -350968,15 +350987,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -351134,15 +351153,15 @@ aaI uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -351170,15 +351189,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -351336,15 +351355,15 @@ uAJ uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw fne @@ -351372,15 +351391,15 @@ tkp fne uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -351538,15 +351557,15 @@ aaI uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -351574,15 +351593,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -351740,15 +351759,15 @@ aaI uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -351776,15 +351795,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -351942,15 +351961,15 @@ aaI uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -351978,15 +351997,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -352144,15 +352163,15 @@ aaI uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -352180,15 +352199,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -352346,15 +352365,15 @@ uAJ uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -352382,15 +352401,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -352548,15 +352567,15 @@ mYF uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -352584,15 +352603,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -352750,15 +352769,15 @@ uYw uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw tkp @@ -352786,15 +352805,15 @@ tkp tkp uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -352952,15 +352971,15 @@ uYw uYw uYw uYw -ehW -erQ -nIc -sEd -boE -dYn -nIc -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -352988,15 +353007,15 @@ tkp uYw uYw uYw -ehW -iOb -oOh -fJa -rip -psZ -oOh -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -353154,15 +353173,15 @@ uYw uYw uYw uYw -ehW -erQ -iAt -sEd -boE -dYn -iAt -qYI -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -353190,15 +353209,15 @@ uYw uYw uYw uYw -ehW -iOb -htf -fJa -hqB -psZ -htf -nnH -jev +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -353357,13 +353376,13 @@ uYw uYw uYw uYw -ePH -ePH -ePH uYw -ePH -ePH -ePH +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -353393,13 +353412,13 @@ uYw uYw uYw uYw -ePH -ePH -ePH uYw -ePH -ePH -ePH +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw diff --git a/maps/sierra/z6_admin.dmm b/maps/sierra/z6_admin.dmm index 8712d1187ee8c..f0268065f2296 100644 --- a/maps/sierra/z6_admin.dmm +++ b/maps/sierra/z6_admin.dmm @@ -3890,7 +3890,7 @@ /area/tdome/tdomeobserve) "axo" = ( /obj/structure/table/glass, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /turf/unsimulated/floor{ icon_state = "white" }, @@ -15838,7 +15838,7 @@ /area/centcom/holding) "qws" = ( /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/floor_decal/corner/paleblue/diagonal, /obj/floor_decal/corner/white/diagonal{ dir = 4 @@ -18055,8 +18055,8 @@ /area/centcom) "ueR" = ( /obj/structure/table/standard, -/obj/item/material/kitchen/rollingpin, -/obj/item/material/knife/table/plastic, +/obj/item/material/rollingpin, +/obj/item/material/utensil/knife/plastic, /obj/item/reagent_containers/food/condiment/small/saltshaker{ pixel_x = -3 }, diff --git a/maps/sierra/z7_transit.dmm b/maps/sierra/z7_transit.dmm index 952c4ddb5f82f..b33834158ae42 100644 --- a/maps/sierra/z7_transit.dmm +++ b/maps/sierra/z7_transit.dmm @@ -314,6 +314,14 @@ /obj/shuttle_landmark/ert/internim, /turf/space, /area/space) +"qc" = ( +/obj/shuttle_landmark/escape_pod/transit/pod11, +/turf/space/transit/north, +/area/space) +"ub" = ( +/obj/shuttle_landmark/escape_pod/transit/pod9, +/turf/space/transit/north, +/area/space) "Cm" = ( /obj/step_trigger/teleporter/random{ affect_ghosts = 0; @@ -327,6 +335,10 @@ }, /turf/space, /area/space) +"XE" = ( +/obj/shuttle_landmark/escape_pod/transit/pod10, +/turf/space/transit/north, +/area/space) (1,1,1) = {" aa @@ -2581,7 +2593,7 @@ aA aF aF aF -aF +qc ah aF aF @@ -3389,7 +3401,7 @@ aA aF aF aF -aF +XE ah aF aF @@ -4197,7 +4209,7 @@ aA aF aF aF -aF +ub ah aF aF diff --git a/maps/torch/datums/reports/robotics.dm b/maps/torch/datums/reports/robotics.dm deleted file mode 100644 index 681c50827f5cc..0000000000000 --- a/maps/torch/datums/reports/robotics.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/computer_file/report/recipient/borging - form_name = "CC-SGF-09" - title = "Cyborgification Contract" - logo = "\[solcrest\]" - available_on_ntnet = TRUE - -/datum/computer_file/report/recipient/borging/generate_fields() - ..() - var/list/xo_fields = list() - add_field(/datum/report_field/text_label/header, "SEV Torch - Office of the Executive Officer") - add_field(/datum/report_field/people/from_manifest, "Name (XO)") - add_field(/datum/report_field/people/from_manifest, "Name (subject)", required = 1) - add_field(/datum/report_field/date, "Date filed") - add_field(/datum/report_field/time, "Time filed") - add_field(/datum/report_field/text_label/instruction, "I, undersigned, hereby agree to willingly undergo a Regulation Lobotimization with intention of cyborgification or AI assimilation, and I am aware of all the consequences of such act. I also understand that this operation may be irreversible, and that my employment contract will be terminated.") - add_field(/datum/report_field/signature, "Subject's signature") - xo_fields += add_field(/datum/report_field/signature, "Executive Officer's signature") - xo_fields += add_field(/datum/report_field/options/yes_no, "Approved") - for(var/datum/report_field/field in xo_fields) - field.set_access(access_edit = access_hop) \ No newline at end of file diff --git a/maps/torch/datums/uniforms_expedition.dm b/maps/torch/datums/uniforms_expedition.dm index 51f3bbd4284c3..5ba6e740c1b3d 100644 --- a/maps/torch/datums/uniforms_expedition.dm +++ b/maps/torch/datums/uniforms_expedition.dm @@ -1,6 +1,6 @@ /singleton/hierarchy/mil_uniform/ec/com //Can only be officers name = "EC command" - min_rank = 11 + min_rank = 110 departments = COM utility_under = /obj/item/clothing/under/solgov/utility/expeditionary/officer/command @@ -20,7 +20,7 @@ /singleton/hierarchy/mil_uniform/ec/com/cdr //Can only be officers name = "EC senior command" - min_rank = 15 + min_rank = 150 service_hat = /obj/item/clothing/head/solgov/service/expedition/senior_command @@ -29,7 +29,7 @@ /singleton/hierarchy/mil_uniform/ec/com/capt //Can only be officers name = "EC captain" - min_rank = 16 + min_rank = 160 utility_hat = /obj/item/clothing/head/soft/solgov/expedition/co @@ -40,7 +40,7 @@ /singleton/hierarchy/mil_uniform/ec/com/adm //Can only be officers name = "EC admiral" - min_rank = 18 + min_rank = 180 utility_hat = /obj/item/clothing/head/soft/solgov/expedition/co @@ -66,19 +66,19 @@ /singleton/hierarchy/mil_uniform/ec/eng/senior name = "EC engineering senior" - min_rank = 5 + min_rank = 50 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/senior /singleton/hierarchy/mil_uniform/ec/eng/chief name = "EC engineering chief" - min_rank = 7 + min_rank = 70 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/chief /singleton/hierarchy/mil_uniform/ec/eng/officer name = "EC engineering CO" - min_rank = 11 + min_rank = 110 utility_under = /obj/item/clothing/under/solgov/utility/expeditionary/officer/engineering utility_extra = list(/obj/item/clothing/head/beret/solgov/expedition/command, @@ -117,19 +117,19 @@ /singleton/hierarchy/mil_uniform/ec/sec/senior name = "EC security senior" - min_rank = 5 + min_rank = 50 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/senior /singleton/hierarchy/mil_uniform/ec/sec/chief name = "EC security chief" - min_rank = 7 + min_rank = 70 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/chief /singleton/hierarchy/mil_uniform/ec/sec/officer name = "EC security CO" - min_rank = 11 + min_rank = 110 utility_under = /obj/item/clothing/under/solgov/utility/expeditionary/officer/security utility_extra = list(/obj/item/clothing/head/beret/solgov/expedition/command, @@ -168,19 +168,19 @@ /singleton/hierarchy/mil_uniform/ec/med/senior name = "EC medical senior" - min_rank = 5 + min_rank = 50 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/senior /singleton/hierarchy/mil_uniform/ec/med/chief name = "EC medical chief" - min_rank = 7 + min_rank = 70 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/chief /singleton/hierarchy/mil_uniform/ec/med/officer name = "EC medical CO" - min_rank = 11 + min_rank = 110 utility_under = /obj/item/clothing/under/solgov/utility/expeditionary/officer/medical utility_extra = list(/obj/item/clothing/head/beret/solgov/expedition/command, @@ -219,19 +219,19 @@ /singleton/hierarchy/mil_uniform/ec/sup/senior name = "EC supply senior" - min_rank = 5 + min_rank = 50 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/senior /singleton/hierarchy/mil_uniform/ec/sup/chief name = "EC supply chief" - min_rank = 7 + min_rank = 70 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/chief /singleton/hierarchy/mil_uniform/ec/sup/officer name = "EC supply CO" - min_rank = 11 + min_rank = 110 utility_under = /obj/item/clothing/under/solgov/utility/expeditionary/officer/supply utility_extra = list(/obj/item/clothing/head/beret/solgov/expedition/command, @@ -266,19 +266,19 @@ /singleton/hierarchy/mil_uniform/ec/srv/senior name = "EC service senior" - min_rank = 5 + min_rank = 50 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/senior /singleton/hierarchy/mil_uniform/ec/srv/chief name = "EC service chief" - min_rank = 7 + min_rank = 70 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/chief /singleton/hierarchy/mil_uniform/ec/srv/officer name = "EC service CO" - min_rank = 11 + min_rank = 110 utility_under = /obj/item/clothing/under/solgov/utility/expeditionary/officer/service utility_extra = list(/obj/item/clothing/head/beret/solgov/expedition/command, @@ -313,19 +313,19 @@ /singleton/hierarchy/mil_uniform/ec/exp/senior name = "EC exploration senior" - min_rank = 5 + min_rank = 50 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/senior /singleton/hierarchy/mil_uniform/ec/exp/chief name = "EC exploration chief" - min_rank = 7 + min_rank = 70 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/chief /singleton/hierarchy/mil_uniform/ec/exp/officer name = "EC exploration CO" - min_rank = 11 + min_rank = 110 utility_under = /obj/item/clothing/under/solgov/utility/expeditionary/officer/exploration utility_extra = list(/obj/item/clothing/head/beret/solgov/expedition/command, @@ -361,19 +361,19 @@ /singleton/hierarchy/mil_uniform/ec/spt/senior name = "EC command support senior" - min_rank = 5 + min_rank = 50 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/senior /singleton/hierarchy/mil_uniform/ec/spt/chief name = "EC command support chief" - min_rank = 7 + min_rank = 70 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/chief /singleton/hierarchy/mil_uniform/ec/spt/officer name = "EC command support CO" - min_rank = 11 + min_rank = 110 utility_under= /obj/item/clothing/under/solgov/utility/expeditionary/officer/command @@ -402,19 +402,19 @@ /singleton/hierarchy/mil_uniform/ec/sci/senior name = "EC science senior" - min_rank = 5 + min_rank = 50 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/senior /singleton/hierarchy/mil_uniform/ec/sci/chief name = "EC science chief" - min_rank = 7 + min_rank = 70 dress_over = /obj/item/clothing/suit/storage/solgov/dress/expedition/chief /singleton/hierarchy/mil_uniform/ec/sci/officer name = "EC science CO" - min_rank = 11 + min_rank = 110 utility_under = /obj/item/clothing/under/solgov/utility/expeditionary/officer/research utility_extra = list(/obj/item/clothing/head/beret/solgov/expedition/command, diff --git a/maps/torch/datums/uniforms_fleet.dm b/maps/torch/datums/uniforms_fleet.dm index 29f598a9ee909..5a7fb70765134 100644 --- a/maps/torch/datums/uniforms_fleet.dm +++ b/maps/torch/datums/uniforms_fleet.dm @@ -25,7 +25,7 @@ /singleton/hierarchy/mil_uniform/fleet/com/seniorofficer name = "Fleet senior command" - min_rank = 15 + min_rank = 150 service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/command service_extra = list(/obj/item/clothing/suit/solgov/fleet_sweater/command) @@ -34,7 +34,7 @@ /singleton/hierarchy/mil_uniform/fleet/com/flagofficer name = "Fleet flag command" - min_rank = 17 + min_rank = 170 service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/flag service_extra = /obj/item/clothing/suit/solgov/fleet_sweater/flag @@ -57,7 +57,7 @@ /singleton/hierarchy/mil_uniform/fleet/eng/noncom name = "Fleet engineering NCO" - min_rank = 4 + min_rank = 40 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet @@ -68,7 +68,7 @@ /singleton/hierarchy/mil_uniform/fleet/eng/snco name = "Fleet engineering SNCO" - min_rank = 7 + min_rank = 70 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/snco @@ -81,7 +81,7 @@ /singleton/hierarchy/mil_uniform/fleet/eng/officer name = "Fleet engineering CO" - min_rank = 11 + min_rank = 110 utility_extra = list( /obj/item/clothing/under/solgov/utility/fleet/combat/engineering, @@ -110,7 +110,7 @@ /singleton/hierarchy/mil_uniform/fleet/eng/officer/com/seniorofficer name = "Fleet engineering senior command" - min_rank = 15 + min_rank = 150 service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/command service_extra = list(/obj/item/clothing/suit/solgov/fleet_sweater/command) @@ -119,7 +119,7 @@ /singleton/hierarchy/mil_uniform/fleet/eng/officer/com/flagofficer name = "Fleet engineering flag command" - min_rank = 17 + min_rank = 170 service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/flag service_extra = list(/obj/item/clothing/suit/solgov/fleet_sweater/flag) @@ -143,7 +143,7 @@ /singleton/hierarchy/mil_uniform/fleet/sec/noncom name = "Fleet security NCO" - min_rank = 4 + min_rank = 40 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet @@ -155,7 +155,7 @@ /singleton/hierarchy/mil_uniform/fleet/sec/snco name = "Fleet security SNCO" - min_rank = 7 + min_rank = 70 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/snco @@ -168,7 +168,7 @@ /singleton/hierarchy/mil_uniform/fleet/sec/officer name = "Fleet security CO" - min_rank = 11 + min_rank = 110 utility_extra = list( /obj/item/clothing/under/solgov/utility/fleet/combat/security, @@ -197,7 +197,7 @@ /singleton/hierarchy/mil_uniform/fleet/sec/officer/com/seniorofficer name = "Fleet security senior command" - min_rank = 15 + min_rank = 150 service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/command service_extra = list(/obj/item/clothing/suit/solgov/fleet_sweater/command) @@ -206,7 +206,7 @@ /singleton/hierarchy/mil_uniform/fleet/sec/officer/com/flagofficer name = "Fleet security flag command" - min_rank = 17 + min_rank = 170 service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/flag service_extra = list(/obj/item/clothing/suit/solgov/fleet_sweater/flag) @@ -229,7 +229,7 @@ /singleton/hierarchy/mil_uniform/fleet/med/noncom name = "Fleet medical NCO" - min_rank = 4 + min_rank = 40 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet @@ -240,7 +240,7 @@ /singleton/hierarchy/mil_uniform/fleet/med/snco name = "Fleet medical SNCO" - min_rank = 7 + min_rank = 70 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/snco @@ -253,7 +253,7 @@ /singleton/hierarchy/mil_uniform/fleet/med/officer name = "Fleet medical CO" - min_rank = 11 + min_rank = 110 utility_extra = list( /obj/item/clothing/under/solgov/utility/fleet/combat/medical, @@ -282,7 +282,7 @@ /singleton/hierarchy/mil_uniform/fleet/med/officer/com/seniorofficer name = "Fleet medical senior command" - min_rank = 15 + min_rank = 150 service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/command service_extra = list(/obj/item/clothing/suit/solgov/fleet_sweater/command) @@ -291,7 +291,7 @@ /singleton/hierarchy/mil_uniform/fleet/med/officer/com/flagofficer name = "Fleet medical flag command" - min_rank = 17 + min_rank = 170 service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/flag service_extra = list(/obj/item/clothing/suit/solgov/fleet_sweater/flag) @@ -314,7 +314,7 @@ /singleton/hierarchy/mil_uniform/fleet/sup/noncom name = "Fleet supply NCO" - min_rank = 4 + min_rank = 40 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet @@ -325,7 +325,7 @@ /singleton/hierarchy/mil_uniform/fleet/sup/snco name = "Fleet supply SNCO" - min_rank = 7 + min_rank = 70 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/snco @@ -338,7 +338,7 @@ /singleton/hierarchy/mil_uniform/fleet/sup/officer name = "Fleet supply CO" - min_rank = 11 + min_rank = 110 utility_extra = list( /obj/item/clothing/under/solgov/utility/fleet/combat/supply, @@ -363,7 +363,7 @@ /singleton/hierarchy/mil_uniform/fleet/sup/seniorofficer name = "Fleet supply senior command" - min_rank = 15 + min_rank = 150 service_hat = /obj/item/clothing/head/solgov/dress/fleet/command service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/command @@ -378,7 +378,7 @@ /singleton/hierarchy/mil_uniform/fleet/sup/flagofficer name = "Fleet spply flag command" - min_rank = 17 + min_rank = 170 service_hat = /obj/item/clothing/head/solgov/dress/fleet/command service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/flag @@ -407,7 +407,7 @@ /singleton/hierarchy/mil_uniform/fleet/srv/noncom name = "Fleet service NCO" - min_rank = 4 + min_rank = 40 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet @@ -419,7 +419,7 @@ /singleton/hierarchy/mil_uniform/fleet/srv/snco name = "Fleet service SNCO" - min_rank = 7 + min_rank = 70 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/snco @@ -432,7 +432,7 @@ /singleton/hierarchy/mil_uniform/fleet/srv/officer name = "Fleet service CO" - min_rank = 11 + min_rank = 110 utility_extra = list( /obj/item/clothing/under/solgov/utility/fleet/combat/service, @@ -471,7 +471,7 @@ /singleton/hierarchy/mil_uniform/fleet/exp/noncom name = "Fleet exploration NCO" - min_rank = 4 + min_rank = 40 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet @@ -483,7 +483,7 @@ /singleton/hierarchy/mil_uniform/fleet/exp/snco name = "Fleet exploration SNCO" - min_rank = 7 + min_rank = 70 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/snco @@ -496,7 +496,7 @@ /singleton/hierarchy/mil_uniform/fleet/exp/officer name = "Fleet exploration CO" - min_rank = 11 + min_rank = 110 utility_extra = list( /obj/item/clothing/under/solgov/utility/fleet/combat/exploration, @@ -535,7 +535,7 @@ /singleton/hierarchy/mil_uniform/fleet/spt/noncom name = "Fleet support NCO" - min_rank = 4 + min_rank = 40 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet @@ -547,7 +547,7 @@ /singleton/hierarchy/mil_uniform/fleet/spt/snco name = "Fleet support SNCO" - min_rank = 7 + min_rank = 70 service_hat = /obj/item/clothing/head/solgov/dress/fleet service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/snco @@ -560,7 +560,7 @@ /singleton/hierarchy/mil_uniform/fleet/spt/officer name = "Fleet command support CO" - min_rank = 11 + min_rank = 110 utility_under = /obj/item/clothing/under/solgov/utility/fleet/command utility_extra = list( @@ -585,7 +585,7 @@ /singleton/hierarchy/mil_uniform/fleet/spt/seniorofficer name = "Fleet senior command support" - min_rank = 15 + min_rank = 150 service_hat = /obj/item/clothing/head/solgov/dress/fleet/command service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/command @@ -600,7 +600,7 @@ /singleton/hierarchy/mil_uniform/fleet/spt/flagofficer name = "Fleet flag command support" - min_rank = 17 + min_rank = 170 service_hat = /obj/item/clothing/head/solgov/dress/fleet/command service_over = /obj/item/clothing/suit/storage/solgov/service/fleet/flag diff --git a/maps/torch/icons/mob/nabber/onmob_head_solgov_gas.dmi b/maps/torch/icons/mob/nabber/onmob_head_solgov_gas.dmi new file mode 100644 index 0000000000000..66522a4d934a3 Binary files /dev/null and b/maps/torch/icons/mob/nabber/onmob_head_solgov_gas.dmi differ diff --git a/maps/torch/icons/mob/onmob_accessories_solgov.dmi b/maps/torch/icons/mob/onmob_accessories_solgov.dmi index 68ff35a6c6b1a..f4a87f56dcb08 100644 Binary files a/maps/torch/icons/mob/onmob_accessories_solgov.dmi and b/maps/torch/icons/mob/onmob_accessories_solgov.dmi differ diff --git a/maps/torch/icons/mob/onmob_head_solgov.dmi b/maps/torch/icons/mob/onmob_head_solgov.dmi index 0aef6f3145480..203c573e97ea8 100644 Binary files a/maps/torch/icons/mob/onmob_head_solgov.dmi and b/maps/torch/icons/mob/onmob_head_solgov.dmi differ diff --git a/maps/torch/icons/obj/obj_accessories_solgov.dmi b/maps/torch/icons/obj/obj_accessories_solgov.dmi index 4fd2842405612..b873ef76f2c06 100644 Binary files a/maps/torch/icons/obj/obj_accessories_solgov.dmi and b/maps/torch/icons/obj/obj_accessories_solgov.dmi differ diff --git a/maps/torch/icons/obj/obj_head_solgov.dmi b/maps/torch/icons/obj/obj_head_solgov.dmi index 11ae77d105099..a3728e7e81d1b 100644 Binary files a/maps/torch/icons/obj/obj_head_solgov.dmi and b/maps/torch/icons/obj/obj_head_solgov.dmi differ diff --git a/maps/torch/items/clothing/solgov-accessory.dm b/maps/torch/items/clothing/solgov-accessory.dm index d9df231af1f79..8af005c45e974 100644 --- a/maps/torch/items/clothing/solgov-accessory.dm +++ b/maps/torch/items/clothing/solgov-accessory.dm @@ -709,10 +709,10 @@ ranks - ec desc = "Insignia denoting the rank of Admiral." icon_state = "ecrank_o8" -/obj/item/clothing/accessory/solgov/rank/ec/officer/o8_alt - name = "ranks (O-8 commandant of the expeditionary corps)" +/obj/item/clothing/accessory/solgov/rank/ec/officer/o10 + name = "ranks (O-10 commandant of the expeditionary corps)" desc = "Insignia denoting the rank of Commandant of the Expeditonary Corps." - icon_state = "ecrank_o8_alt" + icon_state = "ecrank_o10" /************ ranks - fleet diff --git a/maps/torch/items/clothing/solgov-head.dm b/maps/torch/items/clothing/solgov-head.dm index 0b1562c61f887..6d72953147564 100644 --- a/maps/torch/items/clothing/solgov-head.dm +++ b/maps/torch/items/clothing/solgov-head.dm @@ -15,7 +15,8 @@ icon = 'maps/torch/icons/obj/obj_head_solgov.dmi' item_icons = list(slot_head_str = 'maps/torch/icons/mob/onmob_head_solgov.dmi') sprite_sheets = list( - SPECIES_UNATHI = 'maps/torch/icons/mob/unathi/onmob_head_solgov_unathi.dmi' + SPECIES_UNATHI = 'maps/torch/icons/mob/unathi/onmob_head_solgov_unathi.dmi', + SPECIES_NABBER = 'maps/torch/icons/mob/nabber/onmob_head_solgov_gas.dmi' ) /obj/item/clothing/head/soft/solgov/veteranhat diff --git a/maps/torch/items/manuals.dm b/maps/torch/items/manuals.dm index 4577714bcc76a..0935354801fc2 100644 --- a/maps/torch/items/manuals.dm +++ b/maps/torch/items/manuals.dm @@ -67,14 +67,14 @@ /obj/item/folder/nt/rd -/obj/item/folder/envelope/captain +/obj/item/folder/envelope/preset/captain desc = "A thick envelope. The SCG crest is stamped in the corner, along with 'TOP SECRET - TORCH UMBRA'." -/obj/item/folder/envelope/captain/Initialize() +/obj/item/folder/envelope/preset/captain/Initialize() ..() return INITIALIZE_HINT_LATELOAD -/obj/item/folder/envelope/captain/LateInitialize(mapload) +/obj/item/folder/envelope/preset/captain/LateInitialize(mapload) var/obj/overmap/visitable/torch = map_sectors["[z]"] var/memo = {"
[SPAN_COLOR("red", "SECRET - CODE WORDS: TORCH")] @@ -110,10 +110,11 @@ new/obj/item/paper(src, memo, "Standing Orders") new/obj/item/paper/umbra(src) -/obj/item/folder/envelope/rep +/obj/item/folder/envelope/preset/rep desc = "A thick envelope. The SCG crest is stamped in the corner, along with 'TOP SECRET - TORCH UMBRA'." + seal_stamp = "General Secretary rubber stamp" -/obj/item/folder/envelope/rep/Initialize() +/obj/item/folder/envelope/preset/rep/Initialize() . = ..() new/obj/item/paper/umbra(src) diff --git a/maps/torch/items/memos.dm b/maps/torch/items/memos.dm index 028bc1ad895f8..7a2e2a174289d 100644 --- a/maps/torch/items/memos.dm +++ b/maps/torch/items/memos.dm @@ -177,6 +177,15 @@ name = "fleet rank abbreviations" info = {"Some "internal use only" reports on proper and improper ways of abbreviating fleet ranks and roles, including emphasis that "sub" is NOT an authorized way, shorthand or otherwise, to refer to sub lieutenant."} +/obj/item/paper/memo/generic/misuseofcom + name = "misuse of communications" + info = {"Some "internal use only" reports on telecommunications use, reminding personnel that all telecommunications data is automatically relayed to command upon its transcription to the server, and that if you don't want command to hear something, don't say it on radio or in emails."} + + +/obj/item/paper/memo/generic/identificationissues + name = "your xeno crew members and you" + info = {"An at-length article with multiple images of well-meaning charts and comparing images on how to respectfully refer to xeno crewmembers, and that the expectations on what gender they may be will be different from human expectations. It is seemingly bulletproof, up until you reach the lines regarding increasingly esoteric (and invasive) methods of deciding what pronouns to use for them, when it would be easier to just ask or look for them on their IDs cards."} + // scgr memos @@ -206,7 +215,7 @@ /obj/item/paper/memo/scgr/yourjob name = "\improper SCG and you" - info = {"Some "confidential" briefing documents, detailing the job of the SCGR in brief. It highlights they are a civilian, first and foremost, who functions as a general-purpose civil servant aboard the SEV Torch. They also should advise the Commanding Officer, assisting with bureaucratic affairs where required, and spearheading diplomatic negotations."} + info = {"Some "confidential" briefing documents, detailing the job of the SCGR in brief. It highlights they are a civilian, first and foremost, who functions as a general-purpose civil servant aboard the SEV Torch. They also should advise the Commanding Officer, assisting with bureaucratic affairs where required, and spearheading diplomatic negotations. At the bottom, underlined several times and in bold is "YOU ARE NOT A LAWYER"."} /obj/item/paper/memo/scgr/perdiemdeny name = "per diem denials" @@ -224,6 +233,10 @@ name = "assembly floor proceedings" info = {"A copy of the minutes from the Sol Assembly hearing over an emergency bill giving the SCG Defense Forces jurisdiction over the Expeditionary Corps (and by extension, the SEV Torch). The debate is vicious and devolves into angry bickering at points. The bill appears to have gotten uncomfortably close to being passed."} +/obj/item/paper/memo/scgr/radicals + name = "radicalization investigation report" + info = {"A summary of a Senate investigation into the radicalization of government employees. The findings appear somewhat grim, with long lists of reports of politics seeping its way into the everyday functions of the Fleet, Diplomatic Service, SFP, and Expeditionary Corps. While the report clarifies that no major incidents have occurred thus far, the intertwining of politics and governmental operations will likely have grave consequences if let run rampant."} + // command memos @@ -279,27 +292,29 @@ name = "non-judicial punishments" info = {"A "for official use only" memorandum detailing options with regards to non-judicially punishing uniformed servicemembers. Such punishments include admonishment/reprimand, forfeiture of pay, restriction, extra duty, and reduction in rank. The punishments available and their severity depend on the rank of the accused and the imposing officer."} -/obj/item/paper/memo/command/recall - name = "order of recall" - info = {"A notice from the Helios Board of Admiralty regarding the urgent return of the Torch to Mars - the Board has ordered debriefing and review regarding the diplomatic meetings with the Terran Pioneer Corps and the field execution of SLT Kristen Rohtin. The document stresses that the ship be wary of any vessels, Fleet or otherwise, masking their transponders."} - -/obj/item/paper/memo/command/roguefleeties - name = "rogue fleet movements" - info = {"An "internal use only" memorandum sent from Expeditionary Command, detailing the last known locations and naval capacity of several rogue Fifth Fleet vessels, including the SFV Nathan Hale. The data available in the report is uncomfortably sparse."} - -/obj/item/paper/memo/command/outpostreport1 - name = "\improper E-14b outpost report" - info = {"An "internal use only" memo detailing the status of the research outpost in the E-14b system. It states that construction is still underway, and suggests efforts would benefit from better communication between EC and Terran engineering personnel."} - -/obj/item/paper/memo/command/outpostreport2 - name = "\improper E-14b outpost report" - info = {"An "internal use only" memo detailing the status of the research outpost in the E-14b system. It states that construction has been delayed due to a migration of native ambulatory fungus at the site, and requests that the EC begin looking into low-impact mushroom removal methods."} +/obj/item/paper/memo/command/outpostreport + name = "E-14b outpost report" + info = {"An "internal use only" memo detailing the status of the research outpost in the E-14b system. It states that construction is overall complete, and suggests efforts in better communication between EC and Confederate engineering personnel have born fruit, with several listed examples of the formed bonds."} /obj/item/paper/memo/command/evasiveflight name = "evasive flight maneuvers" info = {"A hastily-penned report detailing strategies for evading ship-to-ship laser fire and missile strikes in the event of another attack on the Torch. The author highly recommends the tactical use of space dust and other debris, citing the successful evasive action taken during the attack by the SFV Nathan Hale."} +/obj/item/paper/memo/command/confedsightings + name = "confederate naval protocols" + info = {"An "internal use only" memo sent from the Government Representative to the bridge crew reminding them that the SCG is, and will for the foreseeable future, be a peace with the GCC. As such, it is entirely unneeded to 'batten down the hatches' and prepare the ship for hostilities at the mere sighting of a Confederate Naval Vessel, and that such preparations implies Xenophobic tendencies and increases the probability of diplomatic incidents."} + +/obj/item/paper/memo/command/pioneerpranks + name = "pioneer prank reports" + info = {"An "internal use only" memo sent from Expeditionary Command reporting on an increase in "friendly pranks" between the Expeditionary Corps and Pioneerng Corps. The report details how the warming of relations between the two Corps has brought pranks usually kept within the Expeditonary Corps into the inter-Corps realm. The report advises Non-Expeditionary Corps personnel to interpret Pioneers acting oddly as nothing more than attempts at pranking a EC vessel. It lists an example of how a Pioneer crew used the derelict hull of a cargo vessel to scare the SEV Komarov into believing they were being followed by a ghost ship."} + +/obj/item/paper/memo/command/miranda + name = "miranda line caution" + info = {"A notice from the Ministry of Stellar Charts to the command of the SEV Torch. It is long and full of technical Cartography, but is quite clearly summarized when it says "although the Miranda Line was drawn as the edge of 'Known' Space during the Collapse of the Terran Commonwealth, the Space you are exploring was known to Humanity, but the charts were lost, it is not impossible for you to come across evidence of previous human presence."} +/obj/item/paper/memo/command/testing + name = "research testing complaints" + info = {"A growing stack of interdepartmental complaints from various members of the Engineering department concerning the repeated instances of explosives testing in the Science department aboard the ship. It heavily implies that should further occurances of damage to the Vessel take place, engineering staff may "cause bureaucratic barricades". A handwritten note at the bottom of the memo from the Chief of Security advises heavy handed legal consequences for those involved with testing in the event of future explosive related incidents to prevent "understandable yet annoying actions" from the engineering department in the form of more paperwork.."} // supply memos @@ -315,10 +330,6 @@ name = "in defense of the bar" info = {"An "internal use only" memo sent from the Executive Officer on behalf of Expeditionary Command detailing that the service department does not need self-defense weapons, and any arguments to the contrary will be handled internally. A personal memo has been added; an underlined "STOP ASKING US" penned onto the page."} -/obj/item/paper/memo/supply/officelocation - name = "supply office location reminder" - info = {"An "internal use only" memo issued to supply staff, reminding them that the supply office is to the aft of the hangar, not the fore, and that they should ensure they know the way to work."} - /obj/item/paper/memo/supply/shipping name = "shipping report" info = {"Some "internal use only" reports about the recent items coming and going from Expeditionary Corps vessels, with 70% of the orders being filed as replacement chemical cartridges."} @@ -379,18 +390,30 @@ name = "radio damage complaint" info = {"An "internal use only" report on complaints of garbled static emitting from radios during shifts with IPC crew members onboard. The report further goes onto state that when inquiring about this to IPC crew members on the radio, their radios would emit the same noises instead of getting a clear answer from them."} -/obj/item/paper/memo/engineering/hulldamage - name = "damage control report" - info = {"An "internal use only" report on damages to the hull following the attack by the SFV Nathan Hale. It suggests that the repairs currently in place are temporary at best, and that the Torch will need hefty drydock maintenance before its next deep space mission. The report goes on to recommend petitioning EXO for additional funding for maintenance and upkeep."} - -/obj/item/paper/memo/engineering/tcommssabotage - name = "damage control report" - info = {"An "internal use only" report on damages to ship systems following the 5/14 sabotage incident. It suggests that the saboteur exploited a previously-unknown vulnerability in the ship's telecommunications systems to shut down long-range communications - the system will need a full inspection from DAIS management before it can be deemed properly secure again. How the saboteur discovered the exploit is still unknown."} - /obj/item/paper/memo/engineering/bsddamage name = "\improper Bluespace drive safety notice" info = {"A "confidential" memo from Krri'gli Engineering regarding the new Bluespace drive. It explains in very slow and simple language that this is a "Bluespace drive", a very expensive and volatile piece of machinery, and that you should not break this one or remove the exotic particle shielding. The author does not appear to have a very high opinion of human engineering or mental faculties."} +/obj/item/paper/memo/engineering/maintventing + name = "venting complaint" + info = {"A "sensitive" memo from a formerly Enlisted contractor aboard the Torch. In somewhat colourful language it outlines how a single breach of the hull anywhere in the maintenance corridors will vent the entirety of the corridors on that side of the vessel. Attached are almost identical copies of the complaint, each filed exactly a year before the previous one, dating back to the Torch's refit in 2305."} + +/obj/item/paper/memo/engineering/researchbombs + name = "testing complaint" + info = {"A draft of an "internal use only" memo from the Chief Engineer about repeated instances of Researchers testing explosives in the Misc Lab, resulting in damage to the vessel's thruster fuel storage tank. It states that should this keep happening, legal action will need to be taken against those testing to prevent the engineering staff from 'drowning the system in paperwork'."} + +/obj/item/paper/memo/engineering/slowstart + name = "slow power setup" + info = {"An "internal use only" report on complaints about failures to meet Engine Startup standards has led to Torch maneuvers being delayed, power outages in critical areas of the ship, and damage going unrepaired due to power setup still being performed late in the shift. It goes on to recommend Engineering set up reliable power generation and distribution before undertaking any non-standard modifications."} + +/obj/item/paper/memo/engineering/obtusecomms + name = "obtuse radio communications" + info = {"An "internal use only" report on complaints about obtuse and confusing radio abbreviation and protocols created by members of Engineering. The writer goes on at great length how slowing comms down to use ridiculous abbreviations and shorthand is not helpful, and that nonstandard radio etiquette is not required due to the clarity and use-case of the Torch's communication suite. It asks Engineering to talk normally and use common shorthand, but it highlights the rising use of Non-ZAC communications on net with another, less lengthy complaint. The author ends by asking why their nickname is 'NUB'"} + +/obj/item/paper/memo/engineering/browsinghabits + name = "intranet browsing methods" + info = {"An "internal use only" memo sent from the Chief Engineer, regarding the use of the Torch's local intranet and the brief periods when the vessel is in range of access to the extranet. It notes that, while information is freely available online, that all of these queries are logged as a mandatory security measure, and unsubtly hints that some crew members are racking up increasingly alarming browsing habits. It notes some ranging from how to bootleg chemicals, how to create bombs or homemade firearms, to accessing Wetskrell during shift hours."} + // medical memos @@ -496,8 +519,11 @@ /obj/item/paper/memo/exploration/pioneers name = "pioneers and you" - info = {"An "internal use only" memo detailing proper ettiquette for explorers interacting with Terran Pioneer Corps personnel. It stresses very heavily that yes, most Terrans do speak ZAC; no, you should not share your funny Pan-Slavic impression; and no, you should ABSOLUTELY not ask if they know any war criminals."} + info = {"An "internal use only" memo detailing proper ettiquette for explorers interacting with Confederate Pioneer Corps personnel. It stresses very heavily that yes, most Confederates do speak ZAC; no, you should not share your funny Pan-Slavic impression; and no, you should ABSOLUTELY not ask if they know any war criminals."} +/obj/item/paper/memo/exploration/mice + name = "invasive species and shuttles" + info = {"Some "internal use only" documents that discuss the introduction of invasive species to terraformed or near-earth exoplanets through negligence and improper vermin control onboard spaceships. The document focuses almost exclusively on species that originate from Earth, with a highlight on Mice. Inspections of Hangar Bays, Landing Shuttles and Cargo is paramount to preventing an introduction of Invasive species. The author cites a report about the Charon landing while harboring an infestation of mice, and the ecological devastation that followed. "} // research memos @@ -565,7 +591,13 @@ name = "contractor safety and you" info = {"An "internal use only" corporate document reminding corporate liaisons to report any unsafe behavior from contractors that they either see directly or is reported to them. It goes on to explain that ensuring the health and safety compliance of those under contract not only helps to keep up an image of security but ensures that the reputation of EXO as a whole is not tarnished due to a workplace accident."} +/obj/item/paper/memo/corporate/legion + name = "internal communications" + info = {"A stack of "confidential" communications inside the EXO pertaining to the recent encounter with the 'Legion'. The almost unregulated panic among some of the discussions is quite clear, with the overall worry more focused on possible financial losses then danger to the SCG or SCG personnel."} +/obj/item/paper/memo/corporate/miranda + name = "miranda line memo" + info = {"A "secret" memo from the EXO Head Office. It is somewhat lacking in specifics, but is quite clear that should the Torch locate any traces of human presence past the Miranda Line, that any involvement whatsoever of the EXO or its subsidiaries in the presence is to be denied."} // security memos @@ -612,3 +644,18 @@ /obj/item/paper/memo/security/extremism name = "anti-radicalization pamphlet" info = {"An "internal use only" document detailing strategies for identifying signs and risk factors for radicalization, created in light of perceived extremism in the SCGF. It discusses low self-esteem, stress, marginalization, repeat disciplinary issues, and excessive interest in weaponry."} + + +/obj/item/paper/memo/security/useofforce + name = "use of force complaint" + info = {"An inter-departmental memo from the Chief Medical Officer to the Chief of Security and Brig Chief about the amount of detainees treated for injuries "far greater then would be needed" following their detainment. It has a quite graphic description of a crewmember who's legs were broken for simply walking away from a master at arms."} + + +/obj/item/paper/memo/security/testing + name = "research testing notice" + info = {"An inter-departmental memo from the Chief Engineer, co-signed by the Seinor Enlisted Advisor conserning repeated instances of the research department testing explosive devices aboard the vessel. Attached is a copy of the vessel's SOP pertaining to research operations, with in big bold letters "Testing of any explosives with risk of penetrating the hull or causing mass destruction must be done at an away site." with a note that the testing aboard has repeatedly caused damage to the thruster fuel storage tank, and that engineering staff are 'prepared to file as much paperwork that is required'."} + +/obj/item/paper/memo/security/goodcomms + name = "security comm report" + info = {"An "internal use only" report created by mid-level EXO Security Officers, complimenting Torch for their effective, direct and information focused radio-communication. The author mentions an abbreviation table from years ago that is no longer used. It ends by gently reminding members that gossiping in person is fine, but not to do it in recorded rooms like interrogation."} + diff --git a/maps/torch/job/service_jobs.dm b/maps/torch/job/service_jobs.dm index f73cda3d2c155..d21b75f02c2a5 100644 --- a/maps/torch/job/service_jobs.dm +++ b/maps/torch/job/service_jobs.dm @@ -61,7 +61,14 @@ /datum/mil_rank/fleet/o1, /datum/mil_rank/fleet/o2, /datum/mil_rank/ec/o1) +<<<<<<< ours min_skill = list(SKILL_BUREAUCRACY = SKILL_BASIC) +======= + min_skill = list( // 1 point + SKILL_BUREAUCRACY = SKILL_BASIC, // 1 point + SKILL_WEAPONS = SKILL_UNSKILLED // Fleet chaplains may refuse weapon training + ) +>>>>>>> theirs access = list( access_morgue, access_chapel_office, diff --git a/maps/torch/loadout/loadout_accessories.dm b/maps/torch/loadout/loadout_accessories.dm index 20d4360f53728..23ac1a5c92e97 100644 --- a/maps/torch/loadout/loadout_accessories.dm +++ b/maps/torch/loadout/loadout_accessories.dm @@ -4,7 +4,7 @@ path = /obj/item/storage/medalbox/sol cost = 6 allowed_branches = SOLGOV_BRANCHES - flags = GEAR_HAS_NO_CUSTOMIZATION + flags = GEAR_HAS_NO_CUSTOMIZATION | GEAR_HAS_EXTENDED_DESCRIPTION /datum/gear/accessory/solgov_award_military/New() ..() @@ -24,7 +24,7 @@ description = "A selection of civilian awards awarded by the Sol Central Government." path = /obj/item/storage/medalbox/sol cost = 3 - flags = GEAR_HAS_NO_CUSTOMIZATION + flags = GEAR_HAS_NO_CUSTOMIZATION | GEAR_HAS_EXTENDED_DESCRIPTION /datum/gear/accessory/solgov_award_civilian/New() ..() @@ -166,6 +166,9 @@ /datum/gear/accessory/stethoscope allowed_roles = STERILE_ROLES +/datum/gear/accessory/stole + allowed_roles = list(/datum/job/chaplain) + /datum/gear/tactical/holster allowed_roles = ARMED_ROLES diff --git a/maps/torch/loadout/loadout_head.dm b/maps/torch/loadout/loadout_head.dm index cf817571c10d3..896f5af767e8c 100644 --- a/maps/torch/loadout/loadout_head.dm +++ b/maps/torch/loadout/loadout_head.dm @@ -172,7 +172,7 @@ /datum/gear/tactical/armor_tag_corporate - display_name = "Armor Tag Selection - Corporate Insignia" + display_name = "Armor Tag Selection - Faction Insignia" path = /obj/item/clothing/accessory/armor_tag flags = GEAR_HAS_NO_CUSTOMIZATION @@ -182,4 +182,5 @@ var/list/options = list() options["SAARE tag"] = /obj/item/clothing/accessory/armor_tag/saare options["PCRC tag"] = /obj/item/clothing/accessory/armor_tag/pcrc + options["SFP tag"] = /obj/item/clothing/accessory/armor_tag/sfp gear_tweaks += new /datum/gear_tweak/path (options) diff --git a/maps/torch/loadout/loadout_suit.dm b/maps/torch/loadout/loadout_suit.dm index 93198995ee2e1..5306f10ec891e 100644 --- a/maps/torch/loadout/loadout_suit.dm +++ b/maps/torch/loadout/loadout_suit.dm @@ -201,8 +201,8 @@ gear_tweaks += new/datum/gear_tweak/path(armors) /datum/gear/suit/sfp - display_name = "Agent's jacket" - path = /obj/item/clothing/suit/storage/toggle/agent_jacket + display_name = "SFP agent jackets" + path = /obj/item/clothing/suit/storage allowed_roles = list( /datum/job/detective ) @@ -211,6 +211,14 @@ ) flags = GEAR_HAS_NO_CUSTOMIZATION +/datum/gear/suit/sfp/New() + ..() + var/list/options = list() + options["SFP leather jacket"] = /obj/item/clothing/suit/storage/toggle/agent_jacket + options["formal SFP jacket"] = /obj/item/clothing/suit/storage/toggle/agent_jacket/formal + options["SFP patrol cloak"] = /obj/item/clothing/suit/storage/agent_rain + gear_tweaks += new/datum/gear_tweak/path(options) + /datum/gear/suit/chest_rig/New() allowed_roles = TECHNICAL_ROLES + SECURITY_ROLES + list( /datum/job/doctor diff --git a/maps/torch/robot/module_flying_surveyor.dm b/maps/torch/robot/module_flying_surveyor.dm index c7542ab387b8d..ef23afb1747d5 100644 --- a/maps/torch/robot/module_flying_surveyor.dm +++ b/maps/torch/robot/module_flying_surveyor.dm @@ -2,8 +2,8 @@ name = "survey drone module" display_name = "Surveyor" channels = list( - "Science" = TRUE, - "Exploration" = TRUE + "Exploration" = TRUE, + "Science" = TRUE ) networks = list(NETWORK_RESEARCH) sprites = list( diff --git a/maps/torch/structures/posters.dm b/maps/torch/structures/posters.dm index 412b94e085826..bc9599aaaab67 100644 --- a/maps/torch/structures/posters.dm +++ b/maps/torch/structures/posters.dm @@ -10,7 +10,7 @@ /singleton/poster/torch/event1 icon_state="bsposter_event1" name = "Justice for Joe" - desc = "A hand-written poster demanding the release of one SCPO Joseph Tornakov from Fleet Intelligence custody. It's somewhat faded." + desc = "A hand-written poster demanding the release of one SCPO Joseph Tornakov from Fleet Intelligence custody. It's somewhat faded, and someone's drawn an impressive moustache on Tornakov in permanent marker. Someone has also written general anti-government statements written around the poster's fringes." /singleton/poster/torch/event2 icon_state="bsposter_event2" diff --git a/maps/torch/torch.dm b/maps/torch/torch.dm index a1b5e3e9237ec..593a4dfdeccda 100644 --- a/maps/torch/torch.dm +++ b/maps/torch/torch.dm @@ -44,7 +44,6 @@ #include "datums/reports/corporate.dm" #include "datums/reports/exploration.dm" #include "datums/reports/medical.dm" - #include "datums/reports/robotics.dm" #include "datums/reports/science.dm" #include "datums/reports/security.dm" #include "datums/reports/solgov.dm" diff --git a/maps/torch/torch2_deck4.dmm b/maps/torch/torch2_deck4.dmm index 4d40373cc13a0..12c19ac7e95d3 100644 --- a/maps/torch/torch2_deck4.dmm +++ b/maps/torch/torch2_deck4.dmm @@ -12683,7 +12683,7 @@ /area/crew_quarters/lounge) "Qu" = ( /obj/structure/table/standard, -/obj/item/folder/envelope/dcorder, +/obj/item/folder/envelope/preset/dcorder, /turf/simulated/floor/tiled, /area/quartermaster/deckchief) "Qy" = ( @@ -12744,7 +12744,7 @@ /obj/random_multi/single_item/memo_research, /obj/random_multi/single_item/memo_exploration, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/item/folder/envelope/exploorder, +/obj/item/folder/envelope/preset/exploorder, /turf/simulated/floor/tiled, /area/command/pathfinder) "QI" = ( diff --git a/maps/torch/torch3_deck3.dmm b/maps/torch/torch3_deck3.dmm index cfe4de7d58b53..d6bc880cf5406 100644 --- a/maps/torch/torch3_deck3.dmm +++ b/maps/torch/torch3_deck3.dmm @@ -3215,7 +3215,7 @@ /obj/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/item/material/kitchen/rollingpin{ +/obj/item/material/rollingpin{ pixel_x = 3 }, /obj/structure/table/marble, @@ -3912,7 +3912,7 @@ pixel_x = 2; pixel_y = 6 }, -/obj/item/folder/envelope/csorder, +/obj/item/folder/envelope/preset/csorder, /turf/simulated/floor/carpet/green, /area/crew_quarters/chief_steward) "iO" = ( @@ -9451,10 +9451,10 @@ /obj/machinery/light{ dir = 1 }, -/obj/structure/flora/pottedplant/flower, /obj/machinery/alarm{ pixel_y = 24 }, +/obj/structure/filingcabinet, /turf/simulated/floor/carpet/purple, /area/chapel/office) "wB" = ( @@ -10194,6 +10194,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, +/obj/machinery/hologram/holopad, /turf/simulated/floor/carpet/purple, /area/chapel/office) "yC" = ( @@ -10485,7 +10486,7 @@ /turf/simulated/floor/tiled/dark, /area/chapel/main) "zx" = ( -/obj/machinery/power/apc{ +/obj/machinery/power/apc/critical{ name = "south bump"; pixel_y = -28 }, @@ -12204,7 +12205,7 @@ /obj/decal/cleanable/dirt, /obj/random/trash, /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/item/device/radio/intercom{ dir = 4; pixel_x = -21 @@ -14752,7 +14753,7 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/mess) "Kp" = ( -/obj/machinery/power/apc{ +/obj/machinery/power/apc/critical{ dir = 1; name = "north bump"; pixel_y = 24 diff --git a/maps/torch/torch4_deck2.dmm b/maps/torch/torch4_deck2.dmm index edd2c1bc8def3..d7c994318033c 100644 --- a/maps/torch/torch4_deck2.dmm +++ b/maps/torch/torch4_deck2.dmm @@ -3446,12 +3446,12 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/door/airlock/hatch{ +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch/maintenance/bolted{ frequency = 1379; - id_tag = ""; + id_tag = "engine_exterior"; name = "Engine Airlock Exterior" }, -/obj/machinery/door/firedoor, /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/engine_room) "gX" = ( @@ -4980,6 +4980,10 @@ dir = 8 }, /obj/floor_decal/industrial/outline/yellow, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, /turf/simulated/floor/tiled/steel_grid, /area/engineering/engine_monitoring) "kY" = ( @@ -4992,10 +4996,6 @@ /obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/meson, /obj/floor_decal/industrial/outline/yellow, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, /turf/simulated/floor/tiled/steel_grid, /area/engineering/engine_monitoring) "la" = ( @@ -5009,8 +5009,7 @@ }, /obj/floor_decal/industrial/outline/yellow, /obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 + pixel_y = 21 }, /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/engine_room) @@ -5020,6 +5019,11 @@ dir = 5 }, /obj/floor_decal/industrial/outline/yellow, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/engine_room) "le" = ( @@ -5315,12 +5319,12 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/door/airlock/hatch{ +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch/maintenance/bolted{ frequency = 1379; - id_tag = ""; + id_tag = "engine_interior"; name = "Engine Airlock Interior" }, -/obj/machinery/door/firedoor, /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/engine_room) "lQ" = ( @@ -5332,7 +5336,20 @@ /obj/floor_decal/industrial/warning{ dir = 10 }, -/obj/machinery/light/small, +/obj/machinery/embedded_controller/radio/airlock/access_controller{ + dir = 1; + id_tag = "engine_controller"; + name = "Engine Room Access Controller"; + pixel_y = -21; + req_access = list("ACCESS_ENGINE_EQUIP"); + tag_exterior_door = "engine_exterior"; + tag_interior_door = "engine_interior" + }, +/obj/machinery/access_button/airlock_interior{ + master_tag = "engine_controller"; + pixel_x = -23; + pixel_y = 23 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/engine_room) "lR" = ( @@ -5344,6 +5361,11 @@ /obj/floor_decal/industrial/warning{ dir = 6 }, +/obj/machinery/access_button/airlock_exterior{ + master_tag = "engine_controller"; + pixel_x = 23; + pixel_y = 23 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/engine_room) "lT" = ( @@ -5353,6 +5375,11 @@ d2 = 8; icon_state = "2-8" }, +/obj/machinery/access_button/airlock_exterior{ + master_tag = "engine_controller"; + pixel_x = -23; + pixel_y = 23 + }, /turf/simulated/floor/tiled/techfloor, /area/engineering/engine_room) "lV" = ( @@ -5902,6 +5929,11 @@ d2 = 4; icon_state = "1-4" }, +/obj/machinery/access_button/airlock_interior{ + master_tag = "engine_controller"; + pixel_x = 23; + pixel_y = 23 + }, /turf/simulated/floor/tiled/monotile, /area/engineering/engine_monitoring) "nw" = ( @@ -5914,7 +5946,8 @@ /area/engineering/engine_monitoring) "nx" = ( /obj/structure/sign/warning/internals_required{ - name = "\improper RADIATION GEAR REQUIRED" + name = "\improper RADIATION GEAR REQUIRED"; + pixel_y = 4 }, /turf/simulated/wall/r_wall/prepainted, /area/engineering/engine_room) diff --git a/maps/torch/torch5_deck1.dmm b/maps/torch/torch5_deck1.dmm index 8133521349286..140bc9048936c 100644 --- a/maps/torch/torch5_deck1.dmm +++ b/maps/torch/torch5_deck1.dmm @@ -1495,7 +1495,7 @@ /turf/simulated/floor/tiled/techfloor, /area/thruster/d1starboard) "acY" = ( -/obj/machinery/power/apc{ +/obj/machinery/power/apc/critical{ name = "south bump"; pixel_y = -28 }, @@ -9156,9 +9156,9 @@ /obj/structure/table/rack, /obj/item/clothing/shoes/dutyboots, /obj/item/clothing/accessory/storage/holster/thigh, -/obj/item/clothing/glasses/tacgoggles, /obj/item/clothing/suit/armor/pcarrier/medium/sol, /obj/item/clothing/head/helmet, +/obj/item/clothing/accessory/glassesmod/nvg, /turf/simulated/floor/tiled/techfloor/grid, /area/command/armoury/tactical) "aEH" = ( @@ -10376,15 +10376,15 @@ /turf/simulated/wall/prepainted, /area/maintenance/firstdeck/centralport) "aKv" = ( -/obj/structure/table/rack, /obj/floor_decal/industrial/outline/grey, -/obj/item/storage/box/ammo/pistol, -/obj/item/storage/box/ammo/pistol, -/obj/item/storage/box/ammo/pistol, -/obj/item/storage/box/ammo/pistol, /obj/machinery/light{ dir = 1 }, +/obj/structure/table/steel, +/obj/item/reagent_containers/food/snacks/toastedsandwich{ + desc = "Discontinued after a slew of food poisoning related incidents following a failed attempt at using th'oom cheese, the beloved MRE Menu 9 grilled cheese is a well-sought after trophy for spacers and members of the Defense Forces alike."; + name = "special toasted sandwich" + }, /turf/simulated/floor/tiled/dark, /area/security/armoury) "aKw" = ( @@ -10830,10 +10830,8 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/storage/box/ammo/pistol/rubber, -/obj/item/storage/box/ammo/pistol/rubber, -/obj/item/storage/box/ammo/pistol/rubber, -/obj/item/storage/box/ammo/pistol/rubber, +/obj/item/gun/energy/laser/xenofauna, +/obj/item/gun/energy/laser/xenofauna, /turf/simulated/floor/tiled/dark, /area/security/secure_storage) "aMD" = ( @@ -13058,7 +13056,7 @@ /turf/simulated/floor/tiled/techfloor, /area/thruster/d1port) "aTS" = ( -/obj/machinery/power/apc{ +/obj/machinery/power/apc/critical{ dir = 1; name = "north bump"; pixel_y = 24 @@ -14020,13 +14018,15 @@ /turf/space, /area/space) "aWQ" = ( -/obj/structure/closet/secure_closet/guncabinet/sidearm, /obj/machinery/power/apc{ name = "south bump"; pixel_y = -28 }, /obj/structure/cable/green, /obj/floor_decal/industrial/outline/grey, +/obj/structure/table/rack, +/obj/item/storage/box/ammo/smg, +/obj/item/storage/box/ammo/smg, /turf/simulated/floor/tiled/dark, /area/security/armoury) "aXb" = ( @@ -14273,6 +14273,10 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/closet/secure_closet{ + name = "Secure Evidence Locker"; + req_access = list("ACCESS_SECURITY") + }, /turf/simulated/floor/plating, /area/security/wing) "bpA" = ( @@ -18296,10 +18300,10 @@ /obj/structure/table/rack, /obj/item/clothing/shoes/dutyboots, /obj/item/clothing/accessory/storage/holster/thigh, -/obj/item/clothing/glasses/tacgoggles, /obj/item/clothing/suit/armor/pcarrier/medium/sol, /obj/item/clothing/head/helmet, /obj/machinery/rotating_alarm/security_alarm, +/obj/item/clothing/accessory/glassesmod/nvg, /turf/simulated/floor/tiled/techfloor/grid, /area/command/armoury/tactical) "hrE" = ( @@ -21102,9 +21106,11 @@ /area/maintenance/substation/firstdeck) "kSs" = ( /obj/structure/table/rack, -/obj/item/gun/energy/ionrifle/small, -/obj/item/gun/energy/ionrifle/small, /obj/floor_decal/industrial/outline/grey, +/obj/item/gun/projectile/shotgun/pump/empty, +/obj/item/gun/projectile/shotgun/pump/empty, +/obj/item/storage/box/ammo/beanbags, +/obj/item/storage/box/ammo/beanbags, /turf/simulated/floor/tiled/dark, /area/security/secure_storage) "kTb" = ( @@ -23916,10 +23922,8 @@ "ozG" = ( /obj/structure/table/rack, /obj/floor_decal/industrial/outline/grey, -/obj/item/storage/box/ammo/smg/rubber, -/obj/item/storage/box/ammo/smg/rubber, -/obj/item/storage/box/ammo/smg/rubber, -/obj/item/storage/box/ammo/smg/rubber, +/obj/item/storage/box/ammo/pistol/rubber, +/obj/item/storage/box/ammo/pistol/rubber, /turf/simulated/floor/tiled/dark, /area/security/secure_storage) "oAp" = ( @@ -24294,6 +24298,8 @@ /obj/item/gun/projectile/automatic/sec_smg/empty, /obj/item/gun/projectile/automatic/sec_smg/empty, /obj/item/gun/projectile/automatic/sec_smg/empty, +/obj/item/storage/box/ammo/smg/rubber, +/obj/item/storage/box/ammo/smg/rubber, /turf/simulated/floor/tiled/dark, /area/security/secure_storage) "oXx" = ( @@ -24567,6 +24573,7 @@ "pud" = ( /obj/structure/table/steel, /obj/floor_decal/industrial/outline/grey, +/obj/machinery/recharger, /turf/simulated/floor/tiled/techfloor, /area/security/armoury) "puw" = ( @@ -24629,12 +24636,10 @@ /turf/simulated/floor/plating, /area/maintenance/firstdeck/aftport) "pxv" = ( -/obj/structure/table/rack, -/obj/item/storage/box/ammo/smg/rubber, -/obj/item/storage/box/ammo/smg/rubber, -/obj/item/storage/box/ammo/smg/rubber, -/obj/item/storage/box/ammo/smg/rubber, /obj/floor_decal/industrial/outline/grey, +/obj/item/storage/box/ammo/pistol, +/obj/item/storage/box/ammo/pistol, +/obj/structure/table/rack, /turf/simulated/floor/tiled/dark, /area/security/armoury) "pyb" = ( @@ -25990,8 +25995,6 @@ /area/rnd/xenobiology/xenoflora) "rby" = ( /obj/structure/table/rack, -/obj/item/gun/projectile/shotgun/pump/empty, -/obj/item/gun/projectile/shotgun/pump/empty, /obj/floor_decal/industrial/outline/grey, /obj/machinery/rotating_alarm/security_alarm{ dir = 8 @@ -26000,6 +26003,8 @@ dir = 4 }, /obj/machinery/mech_recharger, +/obj/item/gun/energy/ionrifle/small, +/obj/item/gun/energy/ionrifle/small, /turf/simulated/floor/tiled/dark, /area/security/armoury) "rcb" = ( @@ -26520,11 +26525,9 @@ /area/thruster/d1starboard) "rEK" = ( /obj/structure/table/rack, -/obj/item/storage/box/ammo/smg, -/obj/item/storage/box/ammo/smg, -/obj/item/storage/box/ammo/smg, -/obj/item/storage/box/ammo/smg, /obj/floor_decal/industrial/outline/grey, +/obj/item/storage/box/ammo/stunshells, +/obj/item/storage/box/ammo/stunshells, /turf/simulated/floor/tiled/techfloor, /area/security/armoury) "rFb" = ( @@ -27478,10 +27481,11 @@ /turf/simulated/floor/tiled/freezer, /area/rnd/xenobiology/xenoflora) "sBg" = ( -/obj/structure/table/rack, -/obj/item/storage/box/ammo/beanbags, -/obj/item/storage/box/ammo/beanbags, /obj/floor_decal/industrial/outline/grey, +/obj/structure/closet/secure_closet{ + name = "Secure Evidence Locker"; + req_access = list("ACCESS_SECURITY") + }, /turf/simulated/floor/tiled/dark, /area/security/armoury) "sCb" = ( @@ -28697,13 +28701,11 @@ /turf/simulated/floor/plating, /area/maintenance/firstdeck/aftport) "uie" = ( -/obj/structure/table/rack, /obj/floor_decal/industrial/outline/grey, -/obj/item/storage/box/ammo/stunshells, -/obj/item/storage/box/ammo/stunshells, /obj/machinery/camera/network/security{ c_tag = "Security - Brig Secure Armory" }, +/obj/structure/closet/secure_closet/guncabinet/sidearm, /turf/simulated/floor/tiled/dark, /area/security/armoury) "uiY" = ( diff --git a/maps/torch/torch6_bridge.dmm b/maps/torch/torch6_bridge.dmm index f44e672c6c2d9..6c56f55d182e1 100644 --- a/maps/torch/torch6_bridge.dmm +++ b/maps/torch/torch6_bridge.dmm @@ -1758,8 +1758,8 @@ /obj/structure/table/woodentable_reinforced/walnut, /obj/random_multi/single_item/memo_command, /obj/random_multi/single_item/memo_supply, -/obj/item/folder/envelope/dcorder, -/obj/item/folder/envelope/csorder, +/obj/item/folder/envelope/preset/dcorder, +/obj/item/folder/envelope/preset/csorder, /turf/simulated/floor/wood/walnut, /area/crew_quarters/heads/office/xo) "de" = ( @@ -4197,7 +4197,7 @@ dir = 6 }, /obj/random_multi/single_item/memo_engineering, -/obj/item/folder/envelope/ceorder, +/obj/item/folder/envelope/preset/ceorder, /turf/simulated/floor/tiled, /area/crew_quarters/heads/office/ce) "iU" = ( @@ -4899,7 +4899,7 @@ /obj/random_multi/single_item/memo_command, /obj/random_multi/single_item/memo_supply, /obj/random_multi/single_item/memo_medical, -/obj/item/folder/envelope/ndaorder, +/obj/item/folder/envelope/preset/ndaorder, /obj/item/paper/immediateorder, /turf/simulated/floor/tiled/dark, /area/bridge) @@ -5392,7 +5392,7 @@ /area/hallway/primary/bridge/aft) "mT" = ( /obj/structure/table/woodentable/walnut, -/obj/item/folder/envelope/cmdorder, +/obj/item/folder/envelope/preset/cmdorder, /turf/simulated/floor/wood/walnut, /area/crew_quarters/heads/cobed) "mV" = ( @@ -7711,7 +7711,7 @@ /obj/structure/noticeboard{ pixel_x = 32 }, -/obj/item/folder/envelope/cmdorder, +/obj/item/folder/envelope/preset/cmdorder, /turf/simulated/floor/wood/walnut, /area/crew_quarters/heads/office/sgr) "tC" = ( @@ -7970,7 +7970,7 @@ /obj/item/storage/secure/safe{ pixel_x = 36 }, -/obj/item/folder/envelope/rep, +/obj/item/folder/envelope/preset/rep, /obj/item/documents/scgr, /turf/simulated/floor/wood/walnut, /area/crew_quarters/heads/office/sgr) @@ -8928,7 +8928,7 @@ }, /obj/item/stamp/cos, /obj/random_multi/single_item/memo_security, -/obj/item/folder/envelope/cosorder, +/obj/item/folder/envelope/preset/cosorder, /turf/simulated/floor/tiled/dark/monotile, /area/crew_quarters/heads/office/cos) "wD" = ( @@ -11116,7 +11116,7 @@ d2 = 4; icon_state = "1-4" }, -/obj/item/folder/envelope/lauletter1, +/obj/item/folder/envelope/preset/lauletter1, /turf/simulated/floor/carpet/blue, /area/crew_quarters/heads/office/co) "Fn" = ( @@ -12328,7 +12328,7 @@ /obj/floor_decal/corner/paleblue/diagonal, /obj/structure/table/glass, /obj/random_multi/single_item/memo_medical, -/obj/item/folder/envelope/cmoorder, +/obj/item/folder/envelope/preset/cmoorder, /turf/simulated/floor/tiled/white, /area/crew_quarters/heads/office/cmo) "Kh" = ( @@ -12634,7 +12634,7 @@ /obj/floor_decal/corner/research{ dir = 5 }, -/obj/item/folder/envelope/exploorder, +/obj/item/folder/envelope/preset/exploorder, /turf/simulated/floor/tiled, /area/crew_quarters/heads/office/rd) "Lw" = ( @@ -12764,7 +12764,7 @@ /area/aquila/airlock) "Mf" = ( /obj/structure/table/woodentable_reinforced/walnut/maple, -/obj/item/folder/envelope/captain, +/obj/item/folder/envelope/preset/captain, /obj/random_multi/single_item/runtime, /turf/simulated/floor/wood/walnut, /area/crew_quarters/heads/office/co) @@ -13289,7 +13289,7 @@ pixel_y = -4 }, /obj/item/hand_labeler, -/obj/item/folder/envelope/clorder, +/obj/item/folder/envelope/preset/clorder, /turf/simulated/floor/carpet/green, /area/crew_quarters/heads/office/cl/backroom) "Ox" = ( diff --git a/maps/torch/torch_ranks.dm b/maps/torch/torch_ranks.dm index d91760ff0e5fa..bd1451cd9fede 100644 --- a/maps/torch/torch_ranks.dm +++ b/maps/torch/torch_ranks.dm @@ -14,7 +14,8 @@ /datum/mil_branch/alien, /datum/mil_branch/skrell_fleet, /datum/mil_branch/iccgn, - /datum/mil_branch/scga + /datum/mil_branch/scga, + /datum/mil_branch/auf ) spawn_branch_types = list( @@ -25,7 +26,8 @@ /datum/mil_branch/alien, /datum/mil_branch/skrell_fleet, /datum/mil_branch/iccgn, - /datum/mil_branch/scga + /datum/mil_branch/scga, + /datum/mil_branch/auf ) species_to_branch_blacklist = list( @@ -121,7 +123,9 @@ /datum/mil_rank/ec/o1, /datum/mil_rank/ec/o3, /datum/mil_rank/ec/o5, - /datum/mil_rank/ec/o6 + /datum/mil_rank/ec/o6, + /datum/mil_rank/ec/o8, + /datum/mil_rank/ec/o10 ) spawn_rank_types = list( @@ -230,20 +234,21 @@ /datum/mil_rank/sol/scientist ) +//This variable returns decimal values for alt-ranks, but isn't player facing. /datum/mil_rank/grade() . = ..() if(!sort_order) return "" - if(sort_order <= 10) - return "E[sort_order]" - return "O[sort_order - 10]" + if(sort_order <= 100) + return "E-[floor(sort_order / 10)]" + return "O-[floor((sort_order - 100) / 10)]" // Within the scope of the Torch, this is the only necessary differentiation. /datum/mil_rank/rank_category() . = ..() if(!sort_order) return null - if(sort_order <= 10) + if(sort_order <= 100) return GET_SINGLETON(/singleton/rank_category/enlisted) else return GET_SINGLETON(/singleton/rank_category/commissioned) @@ -264,145 +269,145 @@ name = "Crewman Recruit" name_short = "CR" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 1 + sort_order = 10 /datum/mil_rank/fleet/e2 name = "Crewman Apprentice" name_short = "CA" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e2, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 2 + sort_order = 20 /datum/mil_rank/fleet/e3 name = "Crewman" name_short = "CN" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e3, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 3 + sort_order = 30 /datum/mil_rank/fleet/e4 name = "Petty Officer Third Class" name_short = "PO3" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e4, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 4 + sort_order = 40 /datum/mil_rank/fleet/e5 name = "Petty Officer Second Class" name_short = "PO2" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e5, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 5 + sort_order = 50 /datum/mil_rank/fleet/e6 name = "Petty Officer First Class" name_short = "PO1" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e6, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 6 + sort_order = 60 /datum/mil_rank/fleet/e7 name = "Chief Petty Officer" name_short = "CPO" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e7, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 7 + sort_order = 70 /datum/mil_rank/fleet/e8 name = "Senior Chief Petty Officer" name_short = "SCPO" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e8, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 8 + sort_order = 80 /datum/mil_rank/fleet/e9 name = "Master Chief Petty Officer" name_short = "MCPO" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 9 + sort_order = 90 /datum/mil_rank/fleet/e9_alt1 name = "Command Master Chief Petty Officer" name_short = "CMCPO" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9_alt1, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 9 + sort_order = 91 /datum/mil_rank/fleet/e9_alt2 name = "Fleet Master Chief Petty Officer" name_short = "FLTCM" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9_alt2, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 9 + sort_order = 92 /datum/mil_rank/fleet/e9_alt3 name = "Force Master Chief Petty Officer" name_short = "FORCM" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9_alt3, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 9 + sort_order = 93 /datum/mil_rank/fleet/e9_alt4 name = "Master Chief Petty Officer of the Fleet" name_short = "MCPOF" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9_alt4, /obj/item/clothing/accessory/solgov/specialty/enlisted) - sort_order = 9 + sort_order = 94 /datum/mil_rank/fleet/o1 name = "Ensign" name_short = "ENS" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 11 + sort_order = 110 /datum/mil_rank/fleet/o2 name = "Sub-lieutenant" name_short = "SLT" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o2, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 12 + sort_order = 120 /datum/mil_rank/fleet/o3 name = "Lieutenant" name_short = "LT" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o3, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 13 + sort_order = 130 /datum/mil_rank/fleet/o4 name = "Lieutenant Commander" name_short = "LCDR" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o4, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 14 + sort_order = 140 /datum/mil_rank/fleet/o5 name = "Commander" name_short = "CDR" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o5, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 15 + sort_order = 150 /datum/mil_rank/fleet/o6 name = "Captain" name_short = "CAPT" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o6, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 16 + sort_order = 160 /datum/mil_rank/fleet/o7 name = "Commodore" name_short = "CDRE" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 17 + sort_order = 170 /datum/mil_rank/fleet/o8 name = "Rear Admiral" name_short = "RADM" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag/o8, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 18 + sort_order = 180 /datum/mil_rank/fleet/o9 name = "Vice Admiral" name_short = "VADM" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag/o9, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 19 + sort_order = 190 /datum/mil_rank/fleet/o10 name = "Admiral" name_short = "ADM" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag/o10, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 20 + sort_order = 200 /datum/mil_rank/fleet/o10_alt name = "Fleet Admiral" name_short = "FADM" accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag/o10_alt, /obj/item/clothing/accessory/solgov/specialty/officer) - sort_order = 20 + sort_order = 201 /* @@ -413,56 +418,61 @@ name = "Apprentice Explorer" name_short = "AXPL" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/enlisted) - sort_order = 1 + sort_order = 10 /datum/mil_rank/ec/e3 name = "Explorer" name_short = "XPL" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/enlisted/e3) - sort_order = 3 + sort_order = 30 /datum/mil_rank/ec/e5 name = "Senior Explorer" name_short = "SXPL" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/enlisted/e5) - sort_order = 5 + sort_order = 50 /datum/mil_rank/ec/e7 name = "Chief Explorer" name_short = "CXPL" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/enlisted/e7) - sort_order = 7 + sort_order = 70 /datum/mil_rank/ec/o1 name = "Ensign" name_short = "ENS" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer) - sort_order = 11 + sort_order = 110 /datum/mil_rank/ec/o3 name = "Lieutenant" name_short = "LT" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o3) - sort_order = 13 + sort_order = 130 /datum/mil_rank/ec/o5 name = "Commander" name_short = "CDR" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o5) - sort_order = 15 + sort_order = 150 /datum/mil_rank/ec/o6 name = "Captain" name_short = "CAPT" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o6) - sort_order = 16 + sort_order = 160 /datum/mil_rank/ec/o8 name = "Admiral" name_short = "ADM" accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o8) - sort_order = 18 + sort_order = 180 +/datum/mil_rank/ec/o10 + name = "Commandant of the Expeditionary Corps" + name_short = "CMDT" + accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o10) + sort_order = 200 /* * Civilians diff --git a/maps/torch/z1_admin.dmm b/maps/torch/z1_admin.dmm index 9dc861af4e421..4dbcd1a6c50c6 100644 --- a/maps/torch/z1_admin.dmm +++ b/maps/torch/z1_admin.dmm @@ -2832,7 +2832,7 @@ "avz" = ( /obj/structure/table/standard, /obj/random/donkpocket_box, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /turf/unsimulated/floor{ icon_state = "white" }, diff --git a/mods/RnD/code/experiment.dm b/mods/RnD/code/experiment.dm index ad1a08c726a0b..8e4f5cd713a74 100644 --- a/mods/RnD/code/experiment.dm +++ b/mods/RnD/code/experiment.dm @@ -255,6 +255,7 @@ var/global/list/rnd_server_list = list() reward = artefacts.rnd_points points += reward saved_small_artefacts += artefacts + SSanom.earned_rnd_points += reward for(var/obj/item/small_artefact_scan_disk/input_disk in I.scanned_urm_interactions) if(input_disk.interaction_id in saved_urm_interactions) continue diff --git a/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm b/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm index aa27c9111b148..f9cc736bb51c1 100644 --- a/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm +++ b/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm @@ -5,7 +5,7 @@ return /mob/living/carbon/human/proc/gyne_rename_lineage() - set name = "Name Nest-Lineage" + set name = "Name Nest-Lineage — Caulship" set category = "IC" set desc = "Rename yourself and your alates." @@ -45,7 +45,7 @@ verbs -= /mob/living/carbon/human/proc/gyne_rename_lineage /mob/living/carbon/human/proc/serpentid_namepick() - set name = "Choose a name" + set name = "Choose a name — Caulship" set category = "IC" set desc = "Rename yourself." @@ -184,7 +184,7 @@ /datum/job/submap/ascent/queen title = "Serpentid Queen" - supervisors = "the Gyne" + supervisors = "the Gyne" total_positions = 1 info = "You are a Monarch Serpentid Queen living on an independant Ascent vessel. Assist the Gyne in her duties and tend to your Workers." outfit_type = /singleton/hierarchy/outfit/job/ascent/queen diff --git a/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm b/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm index 85e38e2db4b9e..0b37131054867 100644 --- a/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm +++ b/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm @@ -5,8 +5,8 @@ return // Rename procs are already implemented in Ascent Caulship -/* /mob/living/carbon/human/proc/gyne_rename_lineage_inf() - set name = "Name Nest-Lineage" +/mob/living/carbon/human/proc/gyne_rename_lineage_inf() + set name = "Name Nest-Lineage — Seedship" set category = "IC" set desc = "Rename yourself and your alates." @@ -46,13 +46,13 @@ verbs -= /mob/living/carbon/human/proc/gyne_rename_lineage_inf /mob/living/carbon/human/proc/serpentid_namepick_inf() - set name = "Choose a name" + set name = "Choose a name — Seedship" set category = "IC" set desc = "Rename yourself." - if(mind && istype(mind.assigned_job, /datum/job/submap/ascent)) - var/datum/job/submap/ascent/ascent_job = mind.assigned_job - var/datum/submap/ascent/cutter = ascent_job.owner + if(mind && istype(mind.assigned_job, /datum/job/submap/ascent_inf)) + var/datum/job/submap/ascent_inf/ascent_job = mind.assigned_job + var/datum/submap/ascent_inf/cutter = ascent_job.owner if(istype(cutter)) if(!mind || mind.assigned_job != ascent_job) return @@ -70,7 +70,7 @@ return fully_replace_character_name("[new_name]") - verbs -= /mob/living/carbon/human/proc/serpentid_namepick_inf */ + verbs -= /mob/living/carbon/human/proc/serpentid_namepick_inf // Jobs. /datum/job/submap/ascent_inf @@ -79,11 +79,10 @@ allowed_ranks = list(/datum/mil_rank/alien) total_positions = 1 supervisors = "youself" - info = "You are Gyna on your own independent vessel. Your path has led you to this remote sector full of primitive bioforms. \ + info = "Вы Кхармаани Гиина на вашем независимом корабле. Твой путь привел тебя к этим землям, насыщенными низшими формами жизни. \ \ - Show everyone your greatness, crush all those who dare to oppose you, establish your new nest here and bring prosperity to your lineage. \ - Your radars picked up a large ship equipped with a bluespace engine, until you find out who owns it, it's better not to give yourself away with vigorous activity. \ - Your ship was damaged during the bluespace jump, you need to restore it to fully function." + Покажи всем свое величие, распространи свой улей в этом секторе, приготовься к очередному приступу размножения и укрепи тут свою власть. \ + Твои радары показали, что в этом секторе присутствует огромный корабль с скрелльским блюспейс двигателем на борту. Нападение на этот корабль, может привести к еще одной войной со скреллами" outfit_type = /singleton/hierarchy/outfit/job/ascent blacklisted_species = null whitelisted_species = list(SPECIES_MANTID_GYNE) @@ -111,23 +110,23 @@ if(!cutter.gyne_name) cutter.gyne_name = TYPE_PROC_REF(/singleton/cultural_info/culture/ascent, create_gyne_name) - + if(set_species_on_join) H.set_species(set_species_on_join) switch(H.species.name) if(SPECIES_MANTID_GYNE) H.real_name = "[random_id(/datum/species/mantid, 1, 99)] [cutter.gyne_name]" - H.verbs |= /mob/living/carbon/human/proc/gyne_rename_lineage + H.verbs |= /mob/living/carbon/human/proc/gyne_rename_lineage_inf if(SPECIES_MANTID_ALATE) var/new_alate_number = is_species_whitelisted(H, SPECIES_MANTID_GYNE) ? random_id(/datum/species/mantid, 1000, 9999) : random_id(/datum/species/mantid, 10000, 99999) H.real_name = "[new_alate_number] [cutter.gyne_name]" if(SPECIES_MONARCH_WORKER) H.real_name = "[TYPE_PROC_REF(/singleton/cultural_info/culture/ascent, create_worker_name)]" - H.verbs |= /mob/living/carbon/human/proc/serpentid_namepick + H.verbs |= /mob/living/carbon/human/proc/serpentid_namepick_inf if(SPECIES_MONARCH_QUEEN) H.real_name = "["Queen "][TYPE_PROC_REF(/singleton/cultural_info/culture/ascent, create_queen_name)]" - H.verbs |= /mob/living/carbon/human/proc/serpentid_namepick + H.verbs |= /mob/living/carbon/human/proc/serpentid_namepick_inf H.name = H.real_name if(H.mind) H.mind.name = H.real_name @@ -147,8 +146,8 @@ /datum/job/submap/ascent_inf/alate title = "Ascent alate" total_positions = 3 - supervisors = "your Gyne" - info = "You are an Alate of an independent Ascent vessel. Your Gyne has directed you to this remote sector full of crawling primitives. Follow her instructions and bring prosperity to your nest-lineage." + supervisors = "Гиине" + info = "Ты Кхармаани Алат независимого корабля Восхождения. Гиина направила вас в этот сектор, полный ползущих примитивов. Верь в нее, до конца своей жизни и возведи новое гнездо, чтобы стать подобным ей или слится с ее телом." outfit_type = /singleton/hierarchy/outfit/job/ascent/attendant whitelisted_species = list(SPECIES_MANTID_ALATE) requires_supervisor = "Ascent gyne" @@ -160,9 +159,9 @@ /datum/job/submap/ascent_inf/drone title = "Ascent drone" - supervisors = "your Gyne" + supervisors = "Гиине" total_positions = 1 - info = "You are a Machine Intelligence of an independent Ascent vessel. The Gyne you assist, and her children, have wandered into this sector full of primitive bioforms. Try to keep them alive, and assist where you can." + info = "Ты дрон Контролирущего Разума на отдаленном секторе. Гиина, направила вас с ее выводком, в этот сектор, полным примитивных созданий. Постарайся сохранить им жизнь и помочь во всем, чем можешь." set_species_on_join = /mob/living/silicon/robot/flying/ascent requires_supervisor = "Ascent gyne" whitelisted_species = list(SPECIES_MANTID_ALATE) @@ -171,8 +170,8 @@ title = "Serpentid adjunct" supervisors = "вашей Королевой" total_positions = 3 - info = "You are a Monarch Serpentid Worker serving as an attendant to your Queen on this vessel. Serve her however she requires." - whitelisted_species = list(SPECIES_NABBER, SPECIES_MANTID_ALATE) + info = "Ты Серпентид-Монарх Рабочий, который служит своей королеве. Услужи ей и не заставь стыдится за тебя." + whitelisted_species = list(SPECIES_MANTID_ALATE, SPECIES_NABBER) set_species_on_join = SPECIES_MONARCH_WORKER outfit_type = /singleton/hierarchy/outfit/job/ascent/worker min_skill = list(SKILL_EVA = SKILL_TRAINED, @@ -186,9 +185,10 @@ title = "Serpentid queen" supervisors = "другими Королевами и Гииной" total_positions = 1 - info = "You are a Monarch Serpentid Queen living on an independant Ascent vessel. Assist the Gyne in her duties and tend to your Workers." + info = "Ты СМ-Королева, на независимом корабле Восхождения. Твоя родственная душа, Гиина, надеется на тебя и твоих прислуг." whitelisted_species = list(SPECIES_NABBER, SPECIES_MANTID_GYNE) set_species_on_join = SPECIES_MONARCH_QUEEN + outfit_type = /singleton/hierarchy/outfit/job/ascent/queen min_skill = list(SKILL_EVA = SKILL_TRAINED, SKILL_HAULING = SKILL_TRAINED, SKILL_COMBAT = SKILL_TRAINED, diff --git a/mods/_maps/ascent_seedship/code/ascent_seedship_shuttles.dm b/mods/_maps/ascent_seedship/code/ascent_seedship_shuttles.dm index 3c05dd2d23b69..5b9aeba7e172a 100644 --- a/mods/_maps/ascent_seedship/code/ascent_seedship_shuttles.dm +++ b/mods/_maps/ascent_seedship/code/ascent_seedship_shuttles.dm @@ -73,6 +73,7 @@ /datum/shuttle/autodock/overmap/ascent_inf/two name = "Lepidopterax" warmup_time = 5 + current_location = "nav_hangar_ascent_inf_two" range = 2 dock_target = "ascent_inf_starboard" shuttle_area = /area/ship/ascent_inf/shuttle_starboard diff --git a/mods/_maps/ascent_seedship/maps/ascent_seedship.dmm b/mods/_maps/ascent_seedship/maps/ascent_seedship.dmm index d462fa350cde6..7182dfdeba367 100644 --- a/mods/_maps/ascent_seedship/maps/ascent_seedship.dmm +++ b/mods/_maps/ascent_seedship/maps/ascent_seedship.dmm @@ -13,13 +13,13 @@ "aU" = (/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) "aV" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "bf" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) -"bi" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike) +"bi" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike) "bl" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "bx" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway) "bE" = (/obj/machinery/computer/ship/engines/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "bI" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "bP" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) -"bR" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/space,/area/ship/ascent_inf/fore_starboard_spike) +"bR" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_spike) "bU" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "bY" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "ca" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) @@ -27,7 +27,7 @@ "cg" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "cw" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_port_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "cy" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut) -"cA" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"cA" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "cB" = (/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "cH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering) "cJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) @@ -36,13 +36,14 @@ "da" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_starboard_pump"},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "dg" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "dj" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) -"dk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) -"ds" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) +"dk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) +"ds" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) "dv" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) +"dA" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 8; frequency = 1331; id_tag = "ascent_inf_starboard_dock_left"; pixel_x = 20; pixel_y = 0; tag_airpump = "ascent_inf_shuttle_starboard_vent_inner"; tag_chamber_sensor = "ascent_inf_shuttle_starboard_interior_sensor"; tag_exterior_door = "ascent_inf_dock_starboard_external"; tag_interior_door = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "dD" = (/obj/machinery/recharge_station/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) "dF" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "dH" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) -"dO" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/syringes{pixel_y = 5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike) +"dO" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/syringes{pixel_y = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike) "dP" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "dQ" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/computer/mining{color = "PURPLE"; name = "distributor control"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "dS" = (/turf/simulated/wall/r_titanium/ascent,/area/ship/ascent_inf/shuttle_starboard) @@ -53,7 +54,7 @@ "eq" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_port_prow) "er" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "ex" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike) -"eG" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"eG" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "eK" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) "eM" = (/obj/structure/hygiene/sink/ascent{pixel_y = -13},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike) "eQ" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/inflatable_dispenser/ascents,/obj/item/clustertool,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) @@ -65,7 +66,7 @@ "fN" = (/obj/structure/table/rack/ascent,/obj/item/stack/cable_coil/cyan,/obj/item/stack/cable_coil/cyan,/obj/item/stack/cable_coil/cyan,/obj/item/stack/cable_coil/cyan,/obj/item/stack/cable_coil/cyan,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "fQ" = (/obj/structure/cable/cyan,/obj/machinery/power/terminal{dir = 8},/obj/structure/window/boron_reinforced,/obj/structure/window/boron_reinforced{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "fV" = (/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) -"fX" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/autoinjectors{pixel_y = 5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike) +"fX" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/autoinjectors{pixel_y = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike) "gm" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "gn" = (/obj/machinery/ion_engine,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "gw" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_seedship_fore_pumps"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway) @@ -87,27 +88,27 @@ "hG" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "hM" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "hO" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) -"ig" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut) +"ig" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) "ih" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) "ij" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) -"ik" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/overmap/visitable/ship/ascent_seedship_inf,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) +"ik" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/overmap/visitable/ship/ascent_seedship_inf,/obj/submap_landmark/joinable_submap/ascent_seedship_inf,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "ip" = (/obj/machinery/computer/ship/navigation/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "it" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "iu" = (/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/west,/obj/structure/hygiene/sink/ascent{dir = 1; icon_state = "sink"; pixel_y = 28},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "iv" = (/obj/structure/cable/cyan,/obj/machinery/power/smes/buildable/preset/ascent,/obj/structure/window/boron_reinforced,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "iC" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_shuttle_starboard_vent_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) -"iR" = (/obj/machinery/body_scanconsole/ascent{dir = 2},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) +"iR" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "iY" = (/obj/machinery/bodyscanner/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) "je" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/structure/bed/chair/padded/purple/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) -"jq" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) +"jq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) "jF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut) "jK" = (/obj/machinery/atmospherics/omni/mixer,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "jO" = (/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "jP" = (/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/aft_starboard_jut) -"jR" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_x = -5; pixel_y = 1},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = 2; pixel_x = 2},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = -4; pixel_x = 6},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = -4; pixel_x = -1},/obj/item/storage/bag/trash/purple/ascent{pixel_x = -9},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike) +"jR" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_x = -5; pixel_y = 1},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = 2; pixel_x = 2},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = -4; pixel_x = 6},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = -4; pixel_x = -1},/obj/item/storage/bag/trash/purple/ascent{pixel_x = -9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike) "jW" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "kc" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_port_dock_outer"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) -"kd" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"kd" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "ke" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "kg" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/stack/nanopaste,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) "ko" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) @@ -129,8 +130,8 @@ "lp" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "lr" = (/obj/machinery/computer/ship/sensors/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "lx" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) -"lA" = (/obj/machinery/sleeper/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) -"lF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) +"lA" = (/obj/machinery/sleeper/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) +"lF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "lH" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "lI" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "lQ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/structure/window/boron_reinforced{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering) @@ -149,22 +150,22 @@ "nd" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_starboard_spike) "nf" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "nj" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/power/apc/hyper/ascent/north,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) -"ns" = (/obj/machinery/chem_master{color = "PURPLE"; name = "chemical analyzer"},/obj/item/reagent_containers/dropper{pixel_x = -3; pixel_y = -5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) +"ns" = (/obj/machinery/chem_master{color = "PURPLE"; name = "chemical analyzer"},/obj/item/reagent_containers/dropper{pixel_x = -3; pixel_y = -5},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "nt" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "nv" = (/obj/machinery/atmospherics/omni/mixer,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) "nB" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "nS" = (/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) "od" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "oi" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) -"ox" = (/obj/structure/cable/cyan{icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/north,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) +"ox" = (/obj/structure/cable/cyan{icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/north,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "oA" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "oE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "oJ" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "oN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) "oP" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) -"oR" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/space,/area/ship/ascent_inf/fore_port_spike) +"oR" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) "oU" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) -"oY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "ascent_inf_starboard"; pixel_y = -24},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) +"oY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/obj/machinery/light/ascent,/obj/machinery/embedded_controller/radio/airlock/docking_port{cycle_to_external_air = 1; dir = 1; frequency = 1331; id_tag = "ascent_inf_starboard_upper"; pixel_y = -27; req_access = list("ACCESS_ASCENT"); tag_exterior_sensor = "ascent_inf_starboard_sensor"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "pe" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) "pf" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "pj" = (/obj/structure/cable/cyan{icon_state = "0-2"},/obj/machinery/power/smes/buildable/preset/ascent,/obj/structure/window/boron_reinforced{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) @@ -172,6 +173,7 @@ "po" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_jut) "pq" = (/obj/machinery/computer/ship/engines/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "px" = (/obj/structure/table/rack/ascent,/obj/item/device/multitool/mantid,/obj/item/device/multitool/mantid,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) +"pz" = (/obj/structure/table/rack/dark,/obj/item/tank/mantid/methyl_bromide,/obj/structure/cable/cyan{icon_state = "0-8"},/obj/machinery/power/apc/hyper/ascent/south,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) "pE" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) "pG" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) "pM" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) @@ -181,13 +183,13 @@ "pS" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "pW" = (/obj/structure/table/rack/ascent,/obj/item/stack/medical/splint,/obj/item/stack/medical/splint,/obj/item/stack/medical/splint,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) "pX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) -"pY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) +"pY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "qc" = (/obj/machinery/hologram/holopad/longrange/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "qg" = (/obj/structure/bed/chair/padded/purple/ascent/gyne,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) "qj" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "qr" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "qs" = (/obj/structure/bed/chair/padded/purple/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) -"qA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) +"qA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_prow) "qL" = (/obj/structure/table/rack/dark,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) "qN" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_starboard_jut) "qZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) @@ -205,26 +207,26 @@ "sh" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_jut) "si" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "so" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/habitation) -"st" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"st" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "su" = (/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway) "sv" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 2; id_tag = "ascent_inf_starboard_pump_out_internal"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "sx" = (/obj/machinery/computer/ship/helm/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) -"sy" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike) +"sy" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike) "sA" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "sH" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "sL" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) -"sQ" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/rpd,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) +"sQ" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/rpd,/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "sY" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_starboard_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "ta" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/computer/mining{color = "PURPLE"; name = "compression dynamo control"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "tg" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) -"th" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) +"th" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "ti" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_dock_starboard_external"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "tv" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "ty" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4; icon_state = "intact"},/turf/simulated/wall/r_titanium/ascent,/area/ship/ascent_inf/shuttle_starboard) "tC" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "tD" = (/obj/structure/table/rack/ascent,/obj/item/storage/ore{color = "PURPLE"; name = "mineral carrier"; pixel_y = 7},/obj/item/storage/ore{color = "PURPLE"; name = "mineral carrier"; pixel_y = 3},/obj/item/storage/ore{color = "PURPLE"; name = "mineral carrier"; pixel_y = -1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "tF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) -"tM" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"tM" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "tN" = (/obj/structure/window/boron_reinforced{dir = 1},/obj/structure/window/boron_reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "tO" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) "tP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) @@ -241,25 +243,25 @@ "uO" = (/obj/structure/cable/cyan{icon_state = "0-4"},/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "uQ" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "uR" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) -"vy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/obj/structure/mopbucket/ascent,/obj/item/mop/advanced/ascent,/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike) +"vy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/obj/structure/mopbucket/ascent,/obj/item/mop/advanced/ascent,/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike) "vA" = (/obj/structure/table/rack/ascent,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/actuator,/obj/item/robot_parts/robot_component/actuator,/obj/item/robot_parts/robot_component/actuator,/obj/item/robot_parts/robot_component/actuator,/obj/item/robot_parts/robot_component/actuator,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) "vF" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "vM" = (/obj/machinery/computer/ship/sensors/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "vP" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) -"vS" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) +"vS" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "vT" = (/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/hyper/ascent/south,/obj/structure/table/rack/ascent,/obj/item/storage/bag/trash/purple/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "we" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "wk" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_port_dock_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "wo" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_port_dock_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "wu" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) -"wx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"wx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "wz" = (/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/south,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_spike) "wI" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "wJ" = (/obj/structure/hygiene/shower/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway) "wL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/access_button/airlock_interior{frequency = 1331; master_tag = "ascent_inf_seedship_fore_dock_controller"; pixel_x = -4; pixel_y = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway) "wP" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "wR" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) -"wT" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/stack/material/glass/reinforced/fifty{pixel_x = 4; pixel_y = 5},/obj/item/stack/material/glass/fifty{pixel_x = -4; pixel_y = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) +"wT" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/stack/material/glass/reinforced/fifty{pixel_x = 4; pixel_y = 5},/obj/item/stack/material/glass/fifty{pixel_x = -4; pixel_y = 5},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "wU" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "wV" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike) "xc" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) @@ -291,7 +293,7 @@ "zd" = (/obj/machinery/ion_engine{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "zi" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) "zj" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) -"zk" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) +"zk" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 8; frequency = 1331; id_tag = "ascent_inf_port_dock_left"; pixel_x = 20; pixel_y = 0; tag_airpump = "ascent_inf_port_dock_pump"; tag_chamber_sensor = "ascent_inf_port_dock_sensor"; tag_exterior_door = "ascent_inf_port_dock_outer"; tag_interior_door = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "zn" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "zr" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "zw" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/reagent_temperature{color = "PURPLE"; name = "reactant boiler"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) @@ -302,7 +304,7 @@ "zQ" = (/obj/machinery/reagentgrinder{color = "PURPLE"; name = "reactant obliterator"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "zX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) "Ac" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) -"Ae" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/bed/chair/padded/purple/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"Ae" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/bed/chair/padded/purple/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Ag" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/hydroponics_port) "Al" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm/ascent{dir = 4; pixel_x = -24},/obj/machinery/computer/ship/navigation/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "An" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway) @@ -310,18 +312,18 @@ "Av" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "Ay" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "AC" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/engineering) -"AH" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) +"AH" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) "AO" = (/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) "AS" = (/obj/structure/bed/chair/padded/purple/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) "AT" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) "AU" = (/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "AV" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_seedship_fore_pumps"},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway) -"Bb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) +"Bb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "Bc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Bd" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Bf" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "Bh" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) -"Bs" = (/obj/submap_landmark/spawnpoint/ascent_seedship_inf/drone,/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/wing_starboard) +"Bs" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) "BB" = (/obj/machinery/shipsensors,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "BF" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/obj/structure/closet/crate/freezer/meat/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway) "BL" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) @@ -331,7 +333,7 @@ "BR" = (/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "BV" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_inf_shuttle_starboard_interior_sensor"; pixel_x = -8; pixel_y = -24},/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "Ce" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) -"Co" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 4; frequency = 1331; id_tag = "ascent_inf_starboard_dock"; pixel_x = -20; pixel_y = 0; tag_airpump = "ascent_inf_shuttle_starboard_vent_inner"; tag_chamber_sensor = "ascent_inf_shuttle_starboard_interior_sensor"; tag_exterior_door = "ascent_inf_dock_starboard_external"; tag_interior_door = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) +"Co" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 4; frequency = 1331; id_tag = "ascent_inf_starboard_dock_right"; pixel_x = -20; pixel_y = 0; tag_airpump = "ascent_inf_shuttle_starboard_vent_inner"; tag_chamber_sensor = "ascent_inf_shuttle_starboard_interior_sensor"; tag_exterior_door = "ascent_inf_dock_starboard_external"; tag_interior_door = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) "Cp" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "Cr" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "Cs" = (/obj/machinery/ion_engine{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) @@ -341,8 +343,8 @@ "CB" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "CJ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "CM" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering) -"CN" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) -"CQ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) +"CN" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_prow) +"CQ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_inf_port_dock_sensor"; pixel_x = -8; pixel_y = 24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "CS" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike) "CU" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "CZ" = (/obj/machinery/ion_engine{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) @@ -352,11 +354,11 @@ "DB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "DF" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway) "DG" = (/obj/machinery/shipsensors,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) -"DY" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 4; frequency = 1331; id_tag = "ascent_inf_port_dock"; pixel_x = -20; pixel_y = 0; tag_airpump = "ascent_inf_port_dock_pump"; tag_chamber_sensor = "ascent_inf_port_dock_sensor"; tag_exterior_door = "ascent_inf_port_dock_outer"; tag_interior_door = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) -"Ed" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike) +"DY" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 4; frequency = 1331; id_tag = "ascent_inf_port_dock_right"; pixel_x = -20; pixel_y = 0; tag_airpump = "ascent_inf_port_dock_pump"; tag_chamber_sensor = "ascent_inf_port_dock_sensor"; tag_exterior_door = "ascent_inf_port_dock_outer"; tag_interior_door = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) +"Ed" = (/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike) "Ef" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Ej" = (/obj/structure/bed/chair/padded/purple/ascent/gyne,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut) -"Eq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/alarm/ascent{dir = 4; pixel_x = -24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"Eq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/alarm/ascent{dir = 4; pixel_x = -24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Et" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) "Eu" = (/obj/structure/ore_box{color = "PURPLE"; name = "heavy duty box"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) "EF" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut) @@ -365,12 +367,12 @@ "EO" = (/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering) "EW" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 4; id_tag = "ascent_inf_starboard_pump_out_external"},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/shuttle_starboard) "EZ" = (/obj/structure/window/boron_reinforced{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) -"Fb" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) +"Fb" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "Fd" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "Fe" = (/obj/machinery/cryopod/ascent_spawn,/obj/submap_landmark/spawnpoint/ascent_seedship_inf/alate,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/habitation) "Ff" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_inf_starboard_sensor"; pixel_x = -24; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_starboard_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "Fi" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/terminal{dir = 8},/obj/structure/window/boron_reinforced{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) -"Fl" = (/obj/machinery/botany/extractor,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_port) +"Fl" = (/obj/machinery/botany/extractor,/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_port) "Fu" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "Fz" = (/obj/structure/cable/cyan,/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/obj/machinery/power/smes/buildable/preset/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard) "FF" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) @@ -387,7 +389,7 @@ "Gr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut) "Gz" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "GD" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) -"GE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) +"GE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/cyan{d1 = 1; d2 = 4; dir = 8; icon_state = "2-4"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) "GG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "GO" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "GZ" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/hyper/ascent/north,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) @@ -396,11 +398,11 @@ "Hj" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "Hk" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "Hu" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/glass/beaker/large{pixel_y = 3},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) -"HC" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard) +"HC" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "HG" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "HK" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "HN" = (/obj/machinery/conveyor{dir = 4; id = "ascent"},/obj/machinery/mineral/processing_unit{color = "PURPLE"; input_turf = 4; name = "compression dynamo"; output_turf = 8},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) -"HY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut) +"HY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) "Ie" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "In" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "Io" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/obj/structure/window/boron_reinforced,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering) @@ -413,10 +415,10 @@ "IW" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_seedship_fore_pumps"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_inf_seedship_fore_dock_sensor"; pixel_y = 24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway) "Ja" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Je" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike) -"Jj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/access_button/airlock_interior{frequency = 1331; master_tag = "ascent_inf_port_shuttle_dock"; pixel_x = 4; pixel_y = 24},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) +"Jj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/access_button/airlock_interior{frequency = 1331; master_tag = "ascent_inf_port_shuttle_dock"; pixel_x = 4; pixel_y = 24},/obj/machinery/light/ascent{dir = 1},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "ascent_inf_port_shuttle_dock_down"; pixel_x = -5; tag_airpump = "ascent_inf_port_pump"; tag_chamber_sensor = "ascent_inf_port_sensor"; tag_exterior_door = "ascent_inf_port_outer"; tag_interior_door = "ascent_inf_port_inner"; pixel_y = 20},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Jl" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) -"Jt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) -"Jw" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) +"Jt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) +"Jw" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "JA" = (/obj/machinery/recharge_station/ascent,/obj/submap_landmark/spawnpoint/ascent_seedship_inf/drone,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "JH" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_port_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "JN" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) @@ -431,10 +433,10 @@ "KC" = (/obj/structure/table/rack/dark,/obj/item/tank/jetpack/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "KR" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) "KT" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) -"KV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike) -"KY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) +"KV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike) +"KY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "La" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) -"Ld" = (/obj/machinery/seed_extractor,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_starboard) +"Ld" = (/obj/machinery/seed_extractor,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_starboard) "Lj" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_seedship_fore_pumps"},/obj/machinery/embedded_controller/radio/airlock/docking_port{airflow_dest = "ascent_seedship_fore_dock_controller"; frequency = 1331; id_tag = "ascent_inf_seedship_fore_dock_controller"; pixel_y = 21; tag_airpump = "ascent_inf_seedship_fore_pumps"; tag_chamber_sensor = "ascent_inf_seedship_fore_dock_sensor"; tag_exterior_door = "ascent_inf_seedship_fore_external"; tag_interior_door = "ascent_inf_seedship_fore_internal"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway) "Ln" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_port_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Lu" = (/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/habitation) @@ -454,25 +456,25 @@ "Ms" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) "ME" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 2; id_tag = "ascent_inf_starboard_pump_out_internal"},/obj/machinery/embedded_controller/radio/airlock/docking_port{cycle_to_external_air = 1; dir = 4; frequency = 1331; id_tag = "ascent_inf_starboard"; pixel_x = -20; pixel_y = 0; req_access = list("ACCESS_ASCENT"); tag_exterior_sensor = "ascent_inf_starboard_sensor"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "MJ" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/hydroponics_starboard) -"MK" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/material/knife/kitchen/cleaver/ascent,/obj/item/material/knife/kitchen/cleaver/ascent{pixel_y = 1; pixel_x = 6},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike) +"MK" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/material/knife/kitchen/cleaver/ascent,/obj/item/material/knife/kitchen/cleaver/ascent{pixel_y = 1; pixel_x = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike) "MV" = (/obj/structure/table/rack/ascent,/obj/item/clustertool,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut) "Na" = (/obj/machinery/conveyor{dir = 9; id = "ascent"},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "Nc" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) -"Nl" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) -"Nm" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) -"Nx" = (/obj/structure/table/rack/ascent,/obj/item/gun/energy/particle,/obj/item/gun/energy/particle,/obj/item/rig/mantid,/obj/item/rig/mantid/nabber,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) +"Nl" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) +"Nm" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) +"Nx" = (/obj/structure/table/rack/ascent,/obj/item/gun/energy/particle,/obj/item/rig/mantid/nabber,/obj/item/rig/mantid/nabber/seed,/obj/item/gun/energy/particle/small,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "Nz" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "ND" = (/obj/machinery/computer/ship/sensors/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) "NF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/bed/chair/padded/purple/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) -"NI" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) +"NI" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "ascent_inf_port_dock"; pixel_y = 20; tag_airpump = "ascent_inf_port_dock_pump"; tag_chamber_sensor = "ascent_inf_port_dock_sensor"; tag_exterior_door = "ascent_inf_port_dock_outer"; tag_interior_door = "ascent_inf_port_dock_inner"; pixel_x = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "NK" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "NO" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) -"NP" = (/obj/structure/cable/cyan{icon_state = "0-8"},/obj/machinery/power/apc/hyper/ascent/south,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) +"NP" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) "NY" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut) -"Ob" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) +"Ob" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "Og" = (/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_inf_starboard_inner"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "Os" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/glass/beaker{pixel_y = 3; pixel_x = -5},/obj/item/reagent_containers/glass/beaker{pixel_y = 4; pixel_x = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) -"Ot" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"Ot" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "OO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "OP" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway) "OY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_jut) @@ -482,14 +484,14 @@ "PD" = (/obj/machinery/shipsensors,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "PG" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "PI" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_inf_starboard_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) -"PL" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"PL" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "PS" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_starboard_prow) "PT" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "PY" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "PZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "Qb" = (/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut) "Qf" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_hallway) -"Qs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/obj/structure/table/steel_reinforced/ascent,/obj/item/device/scanner/health,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port) +"Qs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/obj/structure/table/steel_reinforced/ascent,/obj/item/device/scanner/health,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "QB" = (/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) "QF" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "QI" = (/obj/structure/table/rack/dark,/obj/item/tank/mantid/reactor{pixel_x = 9},/obj/item/tank/mantid/reactor{pixel_x = 4},/obj/item/tank/mantid/reactor{pixel_x = -1},/obj/item/tank/mantid/reactor{pixel_x = -6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) @@ -513,6 +515,7 @@ "Sn" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "Sp" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "Sq" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) +"Sw" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "Sy" = (/obj/machinery/computer/ship/navigation/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "Sz" = (/obj/structure/cable/cyan{icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/south,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_jut) "SH" = (/obj/structure/window/boron_reinforced,/obj/structure/window/boron_reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) @@ -529,7 +532,7 @@ "Uk" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "Uo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/black,/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_starboard_outer"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) "Ur" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) -"Uv" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/food/drinks/cans/waterbottle/ascent{pixel_x = -6},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) +"Uv" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/food/drinks/cans/waterbottle/ascent{pixel_x = -6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "UE" = (/obj/structure/table/rack/dark,/obj/item/tank/mantid/methyl_bromide,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) "Ve" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "Vg" = (/obj/structure/bed/chair/padded/purple/ascent/gyne,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge) @@ -539,23 +542,25 @@ "Vy" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "Vz" = (/obj/structure/cable/cyan{icon_state = "0-8"},/obj/machinery/power/apc/hyper/ascent/east,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "VB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) -"VE" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/water/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow) +"VE" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/water/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "VP" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_port) "VR" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "Wl" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/wing_port) "Wq" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) -"Wv" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) +"Wv" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 1; frequency = 1331; id_tag = "ascent_inf_starboard_dock"; pixel_y = -30; tag_airpump = "ascent_inf_shuttle_starboard_vent_inner"; tag_chamber_sensor = "ascent_inf_shuttle_starboard_interior_sensor"; tag_exterior_door = "ascent_inf_dock_starboard_external"; tag_interior_door = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard) "Ww" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway) "WN" = (/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation) "WP" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port) -"WV" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_starboard_outer"},/obj/machinery/atmospherics/pipe/manifold/hidden/black,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "ascent_inf_starboard"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) -"Xb" = (/obj/structure/table/rack/ascent,/obj/item/gun/energy/particle,/obj/item/rig/mantid/gyne,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) +"WV" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_starboard_outer"},/obj/machinery/atmospherics/pipe/manifold/hidden/black,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "ascent_inf_starboard"; pixel_x = -23; pixel_y = -9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) +"Xb" = (/obj/structure/table/rack/ascent,/obj/item/rig/mantid/nabber/queen/seed,/obj/item/rig/mantid/gyne,/obj/item/gun/energy/particle/small,/obj/item/gun/energy/particle,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) "Xc" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "Xf" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/habitation) "Xl" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "Xm" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard) -"Xu" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4; icon_state = "intact"},/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/shuttle_starboard) +"Xs" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) +"Xu" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow) "XA" = (/obj/machinery/conveyor{dir = 4; id = "ascent"},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) +"XI" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/empty,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering) "XJ" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow) "XN" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike) "XO" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) @@ -580,13 +585,13 @@ "ZF" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut) "ZI" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "ZK" = (/obj/machinery/seed_storage,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_starboard) -"ZN" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port) +"ZN" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port) "ZO" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut) "ZR" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port) "ZS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) "ZU" = (/obj/machinery/conveyor{dir = 1; id = "ascent"},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow) "ZW" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard) -"ZX" = (/obj/structure/table/rack/ascent,/obj/item/rig/mantid/nabber/seed,/obj/item/rig/mantid/seed,/obj/item/gun/energy/particle/small,/obj/item/gun/energy/particle/small,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) +"ZX" = (/obj/structure/table/rack/ascent,/obj/item/gun/energy/particle/small,/obj/item/rig/mantid/seed,/obj/item/rig/mantid,/obj/item/gun/energy/particle,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge) (1,1,1) = {" SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX @@ -644,26 +649,26 @@ SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXqNrkrkhvNYGrshqNqNSXdSdSbIdSOgPIrfdSFzdSdSSXRsRscycycyGZzaEjzaRsRsRsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXqNaMrkpoNYjFOYyQqNqNzddSdSdSFfdasYdSdSdSzdRsRsMVcyigcyCtcyHYcydHRsZwSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXqNqNrkrkpoNYZFrkIRUiqNSXzdzddSMEsvhrdSzdzdSXRswRwRdHQVLajqGEoNdHRjRsZwSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSoJoJoJoJoJqNqNrkrkpoNYEFSzrQPeqNSXSXEWXuWVyCUotyELSXSXRssfsfdHcQdHAHdsQBcQdHRsZwSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSPSnszQOszwIvPSPSPSPSPSPSPSPSitPSPSPSPSPSPStiuytiemememememememememememcaemememMJMJMJMJMJMJMJMJMJSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXndndndndndndndndndndPSuDrOrOrOrOrOrOhCXAHNXANarOrOoUrOrOrOkorOPSiCfJiCemCopYhFlFziemJABsJAoxyDhFkgemGmLdZKZWZIaVZIZIMJSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSoJoJoJoJoJqNqNrkrkpoNYEFSzrQPeqNSXSXEWtyWVyCUotyELSXSXRssfsfdHcQdHdHdsQBcQdHRsZwSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSPSnszQOszwSwPSPSPSPSPSPSPSPSitPSPSPSPSPSPStiuytiemememememememememememcaemememMJMJMJMJMJMJMJMJMJSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXndndndndndndndndndndPSuDrOrOrOrOrOrOhCXAHNXANarOrOoUrOrOrOkodAPSiCfJiCemCopYhFlFziemJAemJAoxyDhFkgemGmLdZKZWZIaVZIZIMJSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXndndndndndsysysyfXdOZzZzKVbiPSjOrOrOHuIvIvrOZUdQrItaHbrOrOoUrOrOrOrOrOLRYOBVWvgmVsVtyiWqqrrZqrTbqrqrMezipmCrEKEKEKtgjWxvjWGzMJMJMJMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXCSZzZzZzJeZzZzZzZzZzZzwzkGahxubYrOrOrOrOrOrOrOrOAydjdjdjdjlHrOrOrOXJrOPSemememcVcVcVUrcVcVcVTwvAmFFVnbCBCBJNdgoESlNKbPbPBfpfuCuCZSbPMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXCSZzZzZzJeZzZzZzZzZzZzwzkGahxubYrOrOrOrOrOrOrOrOAydjdjdjdjlHrOrOrOXJrOPSemememcVcVcVUrcVcVcVTwvAmFFVnbCBCBJNdgoESlNKbPbPBfpfuCuCZSaVMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXndndndndndndndndndbRbRndndndPSwUsAbYrOrOrOrOXJqAhnCNrOrOXJrOrOPSPSPSPSPSsocVcVcVUEMslkMsUEcVcVcVJRHCCJzihOCrIEzFInCeGpxvjKwPNcNcNcAUbPMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSPSPSzjDvrOrOrOPSRaxytDxYPSXflYXfXfFeaxFesosocVSppqCppGlkpGCppqSpcVpPziCJziSaemACACFdFdFdFdACACMJMJMJMJMJMJMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXlWtvxpoAKwsAQNPSPSlgPSPSPSaJQIKCcBsosososocVcVYtAOljpGlkpGYtAOljcVcVIzCJlxemACznznzneQfNYvwTACACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXlWtvxpoAKwsAQNPSPSlgPSPSPSaJQIKCcBsosososocVcVYtAOljpGlkpGYtAOljcVcVIzCJlxemACznXIzneQfNYvwTACACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfQfPSPSPSPSPSlgPSwJGiwJXfsoHjVeVeZuVeVedPxRcVpGpGpGpGpGlkpGpGpGpGNxcVemRHememACVykJnBLLLLLLLLPmMrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfLjAVIWQfwLSjGiWwDFGiOPXfsotTsoLuVqLusokBVeGgAsNzZEaIpGlkKYsxpqpGxcPYkSZmmGCMACKTKflQpjYTEZEZtNKfzrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXXTMfAnAnLFugbxlXrHrHhDrHenVeweVzDjDjDjrnsosocVcVcVxcGOZEikVBxcVgpGXbPYxxLYcgcgbllIsHmbtRFiLLgKhAKfKfACBBSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfgwdUgwQfBFsuGiksDFGiOPXfsotTsohqlehqsoHjVeGgZEJlZEkepGlkBbSylrpGxcPYcHZmZlEOACKTKfIoivfQJWJWSHKfzrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfLjAVIWQfwLSjGiWwDFGiOPXfsotTsoLuVqLusokBVeGgAsNzZEaIpGlkKYsxpqpGiRPYkSZmmGCMACKTKflQpjYTEZEZtNKfzrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXXTMfAnAnLFugbxlXrHrHhDrHenVeweVzDjDjDjrnsosocVcVcVxcGOZEikVBpGVgpGXbPYxxLYcgcgbllIsHmbtRFiLLgKhAKfKfACBBSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfgwdUgwQfBFsuGiksDFGiOPXfsotTsohqlehqsoHjVeGgZEJlZEkepGlkBbSylrpGiRPYcHZmZlEOACKTKfIoivfQJWJWSHKfzrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfQfeqeqeqeqeqhGeqSeGiSeXfsokBVeVeHKVeVeQWxRcVpGpGpGpGpGlkpGpGpGpGZXcVWllpWlWlACuRLysiKfKfKfKfKfKfACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXvFIwFUGcSnAceYeqeqhGeqeqeqrFrFWNwIsosososocVcVYtYIljpGlkpGYtYIljcVcVFNodyrYDWlhcNmoiccpxkXsQACACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqeqeqPGPTxIxIxIeqiutCVElZeqXflYXfXfykhtyksosocVBLbECppGlkpGCpbEBLcVJTeKodeKlAWlACACFdFdFdFdACACAgAgAgAgAgAgAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxKxKxKxKxoRoRKxKxKxeqpSDsPTqgxIxIxIxIJtObFbxIxIxIxIxIeqeqeqeqeqsocVcVcVUEpGpMNPUEcVcVcVxfJwodeKlAXlnjaSaBBMeXBMnvWPATATATxUpepeAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXexXNXNXNyfXNXNXNXNXNXNThwVmOQFPTxIthththxIxIxIxIxIxIxIxIxIxIxIxIxIxIzkeqWlWlWlcVcVcVUrcVcVcVTMpWQspXTxnfnfkZijihxLuqpepeTWzXfzfzuIpepeAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxSLSLSLSLMKjReMvyEdeqfVxInSxInSxIxIqsqsqstOqsqsqsxIxIxIxIxIxINlNIMpHeatRSVRCQZRFuXcFuFuFuFuazeKeKXlVPVPVPEtGDBMGDNOAgAgAgAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxKxKxKxKxKxeqxIxIxIxIxItOxIUvUvUveqUvUvUvxItOxIxIxIzkeqwkwoWlDYeKvSeKdkeKWlaUiRzJiYpRabYDWlryFlRkRdmVKRmVmVAgSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX -SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqeqththththeqdvdvdvdveqdvdvdveqeqeqeqeqeqeqkPkcWlWlWlWlXlXlXlWlWlWlXlXlWlWlWlWlAgAgAgAgAgAgAgAgAgSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqeqeqPGPTxIxIxIeqiutCVElZeqXflYXfXfykhtyksosocVBLbECppGlkpGCpbEBLcVJTeKodeKoRWlACACFdFdFdFdACACAgAgAgAgAgAgAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxKxKxKxKxexexKxKxKxeqpSDsPTqgxIxIxIAHJtObFbxIxIAHxIxIeqeqeqeqeqsocVcVcVUEBspMNPpzcVcVcVxfJwodeKlAXlnjaSaBBMeXBMnvWPATATATxUpeAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXexXNXNXNyfXNXNXNXNXNXNThwVmOQFPTxIthththxIxIxIxIxIxIxIxIxIxIxIxIxIxIXsWlWlWlWlcVcVcVUrcVcVcVTMpWQspXTxnfnfkZijihxLuqpepeTWzXfzfzuIKRAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxSLSLSLSLMKjReMvyEdeqfVxInSxInSxIxIqsqsqstOqsqsqsxIxIxIxIXuXuNlNIMpHeatRSVRCQZRFuXcFuFuFuFuazeKeKXlVPVPVPEtGDBMGDNOAgAgAgAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxKxKxKxKxKxeqxIxIxIxIxItOxIUvUvUveqUvUvUvxItOxIxIxIzkWlwkwoWlDYeKvSeKdkeKWlaUeKzJiYpRabYDWlryFlRkRdmVKRmVmVAgSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX +SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqeqththththeqdvdvdvdveqdvdvdveqeqeqeqeqeqWlkPkcWlWlWlWlXlXlXlWlWlWlXlXlWlWlWlWlAgAgAgAgAgAgAgAgAgSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqdvdvdvdveqSXSXxzgngnxzxzxzgngngnxzxzxzxzlmxSxzxzxzxzgngngnxzxzxzgngnxzSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXxzxzxzxzuGxzxzxzxzxzYBuOJaJHcwxzjehMxzxzxzxzxzEuxzxzxzxzSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXxzpEpEakpEpEcApEOtxzqjuQkvaHCwxzNFOOxzEqbfPLpEpEakpEyhxzSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX diff --git a/mods/_maps/farfleet/code/farfleet_shuttle.dm b/mods/_maps/farfleet/code/farfleet_shuttle.dm index d91f64bd1350e..faa710686bd40 100644 --- a/mods/_maps/farfleet/code/farfleet_shuttle.dm +++ b/mods/_maps/farfleet/code/farfleet_shuttle.dm @@ -39,7 +39,6 @@ landmark_tag = "nav_hangar_snz" base_area = /area/ship/farfleet/command/snz_hangar base_turf = /turf/simulated/floor/plating - movable_flags = MOVABLE_FLAG_EFFECTMOVE /obj/shuttle_landmark/snz/altdock name = "Docking Port" diff --git a/mods/_maps/farfleet/maps/farfleet-2.dmm b/mods/_maps/farfleet/maps/farfleet-2.dmm index 079e77ae67e16..d006e55e5dec5 100644 --- a/mods/_maps/farfleet/maps/farfleet-2.dmm +++ b/mods/_maps/farfleet/maps/farfleet-2.dmm @@ -49,6 +49,7 @@ /area/ship/farfleet/barracks/armory) "aO" = ( /obj/machinery/photocopier, +/obj/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled/dark/monotile, /area/ship/farfleet/crew/brig/css) "aP" = ( @@ -107,6 +108,9 @@ pixel_y = 32 }, /obj/item/stack/package_wrap/cargo_wrap, +/obj/item/storage/lunchbox/gcc, +/obj/item/storage/lunchbox/gcc, +/obj/item/storage/lunchbox/gcc, /turf/simulated/floor/tiled/white, /area/ship/farfleet/crew/kitchen) "bg" = ( @@ -122,6 +126,7 @@ /obj/machinery/atmospherics/unary/tank/hydrogen{ dir = 1 }, +/obj/floor_decal/industrial/outline/red, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/farfleet/command/hangar_canisters) "br" = ( @@ -388,6 +393,7 @@ /obj/machinery/atmospherics/unary/tank/carbon_dioxide{ dir = 4 }, +/obj/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/farfleet/command/hangar_canisters) "dY" = ( @@ -441,6 +447,7 @@ /area/ship/farfleet/crew/freezer) "eg" = ( /obj/machinery/artifact_analyser, +/obj/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) "en" = ( @@ -454,6 +461,7 @@ /area/ship/farfleet/crew/brig) "eo" = ( /obj/structure/reagent_dispensers/coolanttank, +/obj/floor_decal/industrial/outline/blue, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) "er" = ( @@ -567,6 +575,7 @@ /area/ship/farfleet/barracks/armory) "fN" = ( /obj/machinery/photocopier, +/obj/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) "fS" = ( @@ -666,6 +675,7 @@ icon_state = "map_connector" }, /obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/farfleet/command/hangar_canisters) "gL" = ( @@ -729,6 +739,7 @@ /area/ship/farfleet/crew/kitchen) "hj" = ( /obj/structure/closet/radiation, +/obj/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) "hn" = ( @@ -883,6 +894,7 @@ /area/ship/farfleet/maintenance/anomaly) "iv" = ( /obj/structure/closet/secure_closet/farfleet/css, +/obj/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled/dark/monotile, /area/ship/farfleet/crew/brig/css) "iG" = ( @@ -1093,8 +1105,8 @@ /obj/structure/closet/secure_closet/hydroponics{ req_access = list() }, -/obj/floor_decal/corner_steel_grid/diagonal, -/turf/simulated/floor/tiled, +/obj/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/monotile, /area/ship/farfleet/crew/hydroponics) "kS" = ( /obj/machinery/light, @@ -2380,6 +2392,7 @@ /area/ship/snz) "xk" = ( /obj/machinery/artifact_harvester, +/obj/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) "xl" = ( @@ -2589,6 +2602,9 @@ pixel_y = 2 }, /obj/item/device/scanner/health, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) "yK" = ( @@ -3249,6 +3265,14 @@ /obj/item/rig_module/grenade_launcher/light, /turf/simulated/floor/tiled/dark/monotile, /area/ship/farfleet/barracks/armory) +"Em" = ( +/obj/structure/table/reinforced, +/obj/item/gun/projectile/shotgun/pump/exploration, +/obj/item/gun/projectile/shotgun/pump/exploration{ + pixel_y = 6 + }, +/turf/simulated/floor/tiled/dark, +/area/ship/farfleet/barracks) "En" = ( /obj/structure/cable/green{ d1 = 4; @@ -3760,8 +3784,11 @@ pixel_x = -22; req_access = list("ACCESS_ICCGN") }, -/obj/structure/table/steel_reinforced, -/obj/item/reagent_containers/glass/bucket, +/obj/structure/table/rack, +/obj/item/clothing/gloves/anomaly_detector/gurza, +/obj/item/storage/bolt_bag/full_of_bolts, +/obj/item/storage/bolt_bag/full_of_bolts, +/obj/item/storage/bolt_bag/full_of_bolts, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) "KF" = ( @@ -3838,6 +3865,7 @@ /area/ship/farfleet/crew/hydroponics) "Lf" = ( /obj/machinery/papershredder, +/obj/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled/dark/monotile, /area/ship/farfleet/crew/brig/css) "Ll" = ( @@ -3922,10 +3950,6 @@ }, /turf/simulated/floor/tiled/monotile, /area/ship/farfleet/crew/hydroponics) -"Ms" = ( -/obj/shuttle_landmark/snz/start, -/turf/simulated/floor/tiled/monotile, -/area/ship/farfleet/command/snz_hangar) "Mt" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/white, @@ -4324,6 +4348,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/shuttle_landmark/snz/start, /turf/simulated/floor/tiled/steel_grid, /area/ship/snz) "Rs" = ( @@ -4594,6 +4619,13 @@ /obj/item/clothing/accessory/storage/holster/armpit, /turf/simulated/floor/tiled/dark/monotile, /area/ship/farfleet/barracks/armory) +"Tc" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_magazine/shotholder/net, +/obj/item/ammo_magazine/shotholder/net, +/obj/item/ammo_magazine/shotholder/net, +/turf/simulated/floor/tiled/dark, +/area/ship/farfleet/barracks) "Tg" = ( /obj/floor_decal/corner/b_green/diagonal{ dir = 8 @@ -4646,7 +4678,7 @@ dir = 8 }, /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/white, /area/ship/farfleet/crew/kitchen) @@ -4742,6 +4774,14 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/plating, /area/ship/farfleet/command/snz_hangar) +"Uq" = ( +/obj/floor_decal/corner/b_green/diagonal{ + dir = 8 + }, +/obj/structure/table/standard, +/obj/item/storage/lunchbox/gcc, +/turf/simulated/floor/tiled/white, +/area/ship/farfleet/crew/canteen) "Uu" = ( /turf/simulated/floor/tiled/dark, /area/ship/farfleet/barracks) @@ -5250,6 +5290,7 @@ "Yn" = ( /obj/machinery/atmospherics/portables_connector, /obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/floor_decal/industrial/outline/red, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/farfleet/command/hangar_canisters) "Ys" = ( @@ -11575,7 +11616,7 @@ Je MT VA Ac -Ac +Uq Wd Ye cO @@ -14616,7 +14657,7 @@ Uu Uu wJ ME -Ms +ns aW Iu eB @@ -14979,7 +15020,7 @@ wt PD Gb kU -uA +Tc eS sh rq @@ -15101,7 +15142,7 @@ wD Uu ju Uu -uA +Em eS sh rq diff --git a/mods/_maps/hand/code/hand_shuttles.dm b/mods/_maps/hand/code/hand_shuttles.dm index 9116fd75d42b7..2aa54bb7ecbdc 100644 --- a/mods/_maps/hand/code/hand_shuttles.dm +++ b/mods/_maps/hand/code/hand_shuttles.dm @@ -102,7 +102,7 @@ warmup_time = 5 current_location = "nav_handpodtwo_start" range = 2 - shuttle_area = list(/area/ship/hand/shuttle/pod_hand_one) + shuttle_area = list(/area/ship/hand/shuttle/pod_hand_two) defer_initialisation = TRUE flags = SHUTTLE_FLAGS_PROCESS skill_needed = SKILL_BASIC diff --git a/mods/_maps/hand/maps/hand-1.dmm b/mods/_maps/hand/maps/hand-1.dmm index 5f7c095cb1958..d0f8bfe6f754b 100644 --- a/mods/_maps/hand/maps/hand-1.dmm +++ b/mods/_maps/hand/maps/hand-1.dmm @@ -446,6 +446,10 @@ "cN" = ( /obj/wallframe_spawn/reinforced, /obj/paint/sun, +/obj/machinery/door/blast/regular/open{ + name = "Reactor Blast Doors"; + id_tag = "hand_nuke" + }, /turf/simulated/floor/plating, /area/ship/hand/maintenance/engine) "cQ" = ( @@ -2938,6 +2942,10 @@ icon_state = "0-8" }, /obj/floor_decal/industrial/warning/full, +/obj/structure/sign/warning/vent_port{ + dir = 1; + pixel_y = -36 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/hand/maintenance/engine) "pu" = ( @@ -4338,6 +4346,18 @@ pixel_y = 24; req_access = list("ACCESS_HAND") }, +/obj/machinery/button/blast_door{ + pixel_x = -23; + name = "Reactor Emergensy Vent"; + id_tag = "Hnreactor"; + dir = 4; + pixel_y = -7; + desc = "Nuclear reactor emergency vent. Use in emergency only!" + }, +/obj/structure/sign/warning/vacuum{ + dir = 4; + pixel_x = -43 + }, /turf/simulated/floor/tiled/steel_ridged, /area/ship/hand/maintenance/engine) "vY" = ( @@ -6148,6 +6168,10 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/blast/regular/open{ + name = "Reactor Blast Doors"; + id_tag = "hand_nuke" + }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/hand/maintenance/engine) "Fy" = ( @@ -7043,6 +7067,10 @@ icon_state = "0-4" }, /obj/floor_decal/industrial/warning/full, +/obj/structure/sign/warning/vent_port{ + dir = 1; + pixel_y = -36 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/hand/maintenance/engine) "JI" = ( @@ -7318,6 +7346,13 @@ dir = 1; pixel_y = -32 }, +/obj/machinery/button/blast_door{ + pixel_x = -23; + name = "Reactor Blast Doors"; + id_tag = "hand_nuke"; + dir = 4; + pixel_y = -7 + }, /turf/simulated/floor/tiled/steel_grid, /area/ship/hand/engineering/hallway) "Lc" = ( diff --git a/mods/_maps/hand/maps/hand-2.dmm b/mods/_maps/hand/maps/hand-2.dmm index 068d9affb1eda..aecad0e901d7d 100644 --- a/mods/_maps/hand/maps/hand-2.dmm +++ b/mods/_maps/hand/maps/hand-2.dmm @@ -1280,7 +1280,7 @@ /area/ship/hand/crew/kitchen) "mK" = ( /obj/structure/table/marble, -/obj/item/material/kitchen/rollingpin{ +/obj/item/material/rollingpin{ pixel_x = -4; pixel_y = 7 }, diff --git a/mods/_maps/liberia/code/liberia_areas.dm b/mods/_maps/liberia/code/liberia_areas.dm index 008fe11448129..ef79a43d44aeb 100644 --- a/mods/_maps/liberia/code/liberia_areas.dm +++ b/mods/_maps/liberia/code/liberia_areas.dm @@ -73,10 +73,6 @@ name = "FTV Liberia - Shower" icon_state = "showroom" -/area/liberia/toiletroom2 - name = "FTV Liberia - Toilet" - icon_state = "toilet" - /area/liberia/bar name = "FTV Liberia - Bar" icon_state = "bar" diff --git a/mods/_maps/liberia/maps/liberia.dmm b/mods/_maps/liberia/maps/liberia.dmm index 14412afa6cbe3..b4b8c50d1375b 100644 --- a/mods/_maps/liberia/maps/liberia.dmm +++ b/mods/_maps/liberia/maps/liberia.dmm @@ -2074,6 +2074,7 @@ dir = 4 }, /obj/machinery/door/firedoor, +/obj/floor_decal/industrial/warning/fulltile, /turf/simulated/floor/tiled/steel_grid, /area/liberia/engineeringlobby) "dA" = ( @@ -3762,8 +3763,8 @@ /turf/simulated/floor/tiled, /area/liberia/hallway) "gn" = ( -/obj/machinery/door/airlock{ - name = "Toilet" +/obj/machinery/door/airlock/civilian{ + name = "Restroom" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/door/firedoor, @@ -3988,11 +3989,6 @@ d2 = 8; icon_state = "1-8" }, -/obj/structure/cable/blue{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, /turf/simulated/floor/tiled/freezer, /area/liberia/toiletroom1) "gG" = ( @@ -4249,11 +4245,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/obj/structure/cable/blue{ - d1 = 2; - d2 = 4; - icon_state = "2-4" - }, /turf/simulated/floor/tiled/freezer, /area/liberia/toiletroom1) "hc" = ( @@ -4261,11 +4252,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/obj/structure/cable/blue{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, /turf/simulated/floor/tiled/freezer, /area/liberia/toiletroom1) "hd" = ( @@ -4335,20 +4321,12 @@ /turf/simulated/floor/wood/walnut, /area/liberia/bar) "hm" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/obj/structure/cable/blue{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, /turf/simulated/floor/tiled/freezer, /area/liberia/toiletroom1) "hn" = ( @@ -4417,7 +4395,7 @@ }, /obj/structure/table/reinforced, /obj/item/clothing/suit/chef/classic, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/item/material/knife/kitchen, /turf/simulated/floor/tiled/freezer, /area/liberia/bar) @@ -6511,6 +6489,7 @@ d2 = 2; icon_state = "1-2" }, +/obj/floor_decal/industrial/warning/fulltile, /turf/simulated/floor/tiled/white, /area/liberia/medbay) "lx" = ( @@ -7712,9 +7691,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled/steel_grid, /area/liberia/atmos) -"BC" = ( -/turf/simulated/wall/r_wall/prepainted, -/area/liberia/toiletroom2) "BE" = ( /obj/floor_decal/borderfloor{ dir = 8 @@ -7840,17 +7816,8 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/power/apc/liberia{ - dir = 8; - name = "west bump"; - pixel_x = -24 - }, -/obj/structure/cable/blue{ - d2 = 4; - icon_state = "0-4" - }, /turf/simulated/floor/tiled/freezer, -/area/liberia/toiletroom2) +/area/liberia/toiletroom1) "ED" = ( /obj/floor_decal/techfloor{ dir = 8 @@ -7864,22 +7831,14 @@ /turf/simulated/wall/r_wall/prepainted, /area/liberia/dockinghall) "EQ" = ( -/obj/machinery/alarm/merchant{ - pixel_y = 24 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/cable/blue{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /turf/simulated/floor/tiled/freezer, -/area/liberia/toiletroom2) +/area/liberia/toiletroom1) "EZ" = ( /obj/wallframe_spawn/no_grille, /turf/simulated/floor/plating, @@ -8288,9 +8247,6 @@ "Lm" = ( /turf/simulated/wall/prepainted, /area/liberia/bridge) -"Lz" = ( -/turf/simulated/wall/prepainted, -/area/liberia/toiletroom2) "LJ" = ( /obj/floor_decal/borderfloor{ dir = 6 @@ -8727,6 +8683,7 @@ icon_state = "1-2" }, /obj/machinery/door/firedoor, +/obj/floor_decal/industrial/warning/fulltile, /turf/simulated/floor/tiled, /area/liberia/personellroom1) "TB" = ( @@ -8892,9 +8849,9 @@ }, /area/liberia/solar2) "VZ" = ( -/obj/machinery/door/airlock{ - name = "Toilet"; - dir = 8 +/obj/machinery/door/airlock/civilian{ + dir = 4; + name = "Restroom" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -8902,14 +8859,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/cable/blue{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/freezer, -/area/liberia/toiletroom2) +/area/liberia/toiletroom1) "Wb" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -30059,9 +30011,9 @@ fI qx ip ro -Lz -Lz -BC +OA +OA +Se aa aa aa @@ -30261,9 +30213,9 @@ kO fY kO se -Lz +OA Ez -BC +Se aa aa aa @@ -30463,9 +30415,9 @@ XE ff yh gD -Lz +OA EQ -BC +Se aa aa aa @@ -30665,9 +30617,9 @@ ip LW pD OA -Lz +OA VZ -BC +Se aa aa aa diff --git a/mods/_maps/sentinel/code/sentinel_shuttle.dm b/mods/_maps/sentinel/code/sentinel_shuttle.dm index e3274c43d2026..1927e84cde8b4 100644 --- a/mods/_maps/sentinel/code/sentinel_shuttle.dm +++ b/mods/_maps/sentinel/code/sentinel_shuttle.dm @@ -37,7 +37,6 @@ landmark_tag = "nav_hangar_reaper" base_area = /area/ship/patrol/command/hangar base_turf = /turf/simulated/floor/plating - movable_flags = MOVABLE_FLAG_EFFECTMOVE /obj/shuttle_landmark/reaper/altdock name = "Docking Port" diff --git a/mods/_maps/sentinel/maps/sentinel-1.dmm b/mods/_maps/sentinel/maps/sentinel-1.dmm index de76cf42a128b..14f495dc04812 100644 --- a/mods/_maps/sentinel/maps/sentinel-1.dmm +++ b/mods/_maps/sentinel/maps/sentinel-1.dmm @@ -4767,6 +4767,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 4 }, +/obj/shuttle_landmark/reaper/start, /turf/simulated/floor/plating, /area/ship/reaper) "jc" = ( @@ -4886,7 +4887,6 @@ icon_state = "1-2" }, /obj/structure/catwalk, -/obj/shuttle_landmark/reaper/start, /turf/simulated/floor/plating, /area/ship/patrol/command/hangar) "jj" = ( diff --git a/mods/_maps/sentinel/maps/sentinel-2.dmm b/mods/_maps/sentinel/maps/sentinel-2.dmm index de7ff35f4f916..a61a31cdb4266 100644 --- a/mods/_maps/sentinel/maps/sentinel-2.dmm +++ b/mods/_maps/sentinel/maps/sentinel-2.dmm @@ -3209,7 +3209,7 @@ /obj/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/item/material/knife/folding/swiss, /turf/simulated/floor/tiled/white, /area/ship/patrol/crew/kitchen) diff --git a/mods/_master_files/code/modules/culture_descriptor/culture/cultures_human.dm b/mods/_master_files/code/modules/culture_descriptor/culture/cultures_human.dm index 7bad9135207aa..6f671936823cb 100644 --- a/mods/_master_files/code/modules/culture_descriptor/culture/cultures_human.dm +++ b/mods/_master_files/code/modules/culture_descriptor/culture/cultures_human.dm @@ -183,16 +183,6 @@ наиболее знакомы со старыми, надежными, но просроченными технологиями. Независимые люди на фронтире более \ склонны к изоляционизму и самостоятельности." -/singleton/cultural_info/culture/human/confederate - nickname = "Терранец" - description = "Вы с Терры (не с Земли), что находится в системе Гильгамеш. Это столичный мир Гильгамешской \ - Колониальной Конфедерации. Её жители воплощают в себе все то, что значит быть частью ГКК. К сожалению, годы, \ - прошедшие после Гайского Конфликта, оказались нелегкими для Терры, и длительный период восстановления \ - экономики не облегчил жизнь. Люди Терры, как правило, заняты в военном, промышленном, правительственном или \ - сервисном секторах, при этом особое внимание уделяется военной службе. Терранцы сегодня, как правило, бедные, \ - озлобленные и несколько разбитые люди, злые и обиженные из-за своих потерь в Гайском Конфликте. Воспитание на \ - Терре подчеркивает странное сочетание служения государству, либерализма и милитаризма." - /singleton/cultural_info/culture/human/confederate_colony nickname = "Конфедерат, житель колоний" description = "Вы с окраин Гильгамешской Колониальной Конфедерации. Терранские колонисты имеют разные взгляды на их государство, верные сильному национальному духу, соединяющему ГКК, но \ diff --git a/mods/_master_files/code/modules/mob/living/carbon/human/human_helpers.dm b/mods/_master_files/code/modules/mob/living/carbon/human/human_helpers.dm new file mode 100644 index 0000000000000..41fa05e35af51 --- /dev/null +++ b/mods/_master_files/code/modules/mob/living/carbon/human/human_helpers.dm @@ -0,0 +1,5 @@ +/mob/living/carbon/human/has_meson_effect() + . = FALSE + for(var/obj/screen/equipment_screen in equipment_overlays) // check through our overlays to see if we have any source of the meson overlay + if (equipment_screen.color == GLOB.global_hud.meson.color) + return TRUE diff --git a/mods/_master_files/code/modules/psionics/events/mini_spasm.dm b/mods/_master_files/code/modules/psionics/events/mini_spasm.dm index 5660aa2fb37f2..3ba16a65658a4 100644 --- a/mods/_master_files/code/modules/psionics/events/mini_spasm.dm +++ b/mods/_master_files/code/modules/psionics/events/mini_spasm.dm @@ -11,6 +11,18 @@ ) sound_to(world, sound(alarm_sound)) +/datum/event/minispasm/start() + var/list/victims = list() + for(var/obj/item/device/radio/radio in GLOB.listening_objects) + if(radio.on) + for(var/mob/living/victim in view(radio.canhear_range, radio.loc)) + if(isnull(victims[victim]) && victim.stat == CONSCIOUS && !victim.ear_deaf) + victims[victim] = radio + for(var/thing in victims) + var/mob/living/victim = thing + var/obj/item/device/radio/source = victims[victim] + do_spasm(victim, source) + /datum/event/minispasm/end() priority_announcement.Announce( \ "PRIORITY ALERT: SIGNAL BROADCAST HAS CEASED. Personnel are cleared to resume use of non-hardened radio transmission equipment. Have a nice day.", \ diff --git a/mods/adherent_discharge/code/adherent.dm b/mods/adherent_discharge/code/adherent.dm index 681dec209ae83..cdeea81675e41 100644 --- a/mods/adherent_discharge/code/adherent.dm +++ b/mods/adherent_discharge/code/adherent.dm @@ -1,3 +1,6 @@ +/datum/species/adherent + additional_languages = 1 + /obj/item/organ/internal/cell/adherent var/ready_to_charge @@ -19,3 +22,17 @@ adherent_core.ready_to_charge = FALSE to_chat(src, SPAN_WARNING("You have relieved the tension of your tentacles.")) + +/singleton/cultural_info/culture/adherent + secondary_langs = list( + LANGUAGE_HUMAN_EURO, + LANGUAGE_HUMAN_CHINESE, + LANGUAGE_HUMAN_ARABIC, + LANGUAGE_HUMAN_INDIAN, + LANGUAGE_HUMAN_IBERIAN, + LANGUAGE_HUMAN_RUSSIAN, + LANGUAGE_SPACER, + LANGUAGE_VOX, + LANGUAGE_CULT, + LANGUAGE_PRIMITIVE + ) diff --git a/mods/ai/code/borgs_equipments.dm b/mods/ai/code/borgs_equipments.dm index e3d3f464f5b57..07d3bb727fae0 100644 --- a/mods/ai/code/borgs_equipments.dm +++ b/mods/ai/code/borgs_equipments.dm @@ -127,7 +127,7 @@ /obj/item/device/scanner/plant, /obj/item/storage/plants, /obj/item/robot_harvester, - /obj/item/material/kitchen/rollingpin, + /obj/item/material/rollingpin, /obj/item/material/knife/kitchen, /obj/item/crowbar, /obj/item/rsf, diff --git a/mods/anomaly/_anomaly.dme b/mods/anomaly/_anomaly.dme index 72169675cabb6..ad56133c75f4a 100644 --- a/mods/anomaly/_anomaly.dme +++ b/mods/anomaly/_anomaly.dme @@ -5,58 +5,76 @@ // Далее просто включай свой код // #include "code/something.dm" #include "code\anomaly_admin.dm" //Админские кнопочки -#include "code\anomaly_core.dm" //Ядро и основа аномалий -#include "code\anomaly_graphic.dm" //Графика и внешний вид -#include "code\anomaly_light.dm" //Освещение, вспышки и тому подобное -#include "code\anomaly_parts.dm" //Код, отвечающий за многотайтловость аномалий -#include "code\interact_with_items.dm" //Взаимодействие аномалий с предметами и обьектами -#include "code\anomaly_loop.dm" //Код, отвечающий за длительную обработку аномалии -#include "code\anomaly_deleting.dm" //Удаление аномалий, артефактов и вспомогательных частей -#include "code\anomaly_preload.dm" //Предзарядка аномалии -#include "code\anomaly_sound.dm" //Звуки у аномалий -#include "code\anomaly_randomize.dm" //Рандомизация параметров аномалии #include "code\anomaly_controller.dm" //Контроллер аномалий -#include "code\anomaly_walking.dm" //Бродячие аномалии -#include "code\anomaly_electrostatic.dm" //Электростатический расчёт +#include "code\anomaly_defines.dm" + + +//Аномалии +//Типы аномалий +#include "code\anomalies\single\cooler.dm" +#include "code\anomalies\single\electra.dm" +#include "code\anomalies\single\heater.dm" +#include "code\anomalies\single\rvach.dm" +#include "code\anomalies\single\tramplin.dm" +#include "code\anomalies\single\ventilyator.dm" +#include "code\anomalies\single\vspishka.dm" +#include "code\anomalies\single\zharka.dm" +//аномалии 3 на 3 +#include "code\anomalies\threeandthree\cooler_3x3.dm" +#include "code\anomalies\threeandthree\electra_3x3.dm" +#include "code\anomalies\threeandthree\heater_3x3.dm" +#include "code\anomalies\threeandthree\rvach_3x3.dm" +//аномалии 2 на 2 +#include "code\anomalies\twoandtwo\cooler2x2.dm" +#include "code\anomalies\twoandtwo\heater2x2.dm" +//Сам код аномалий +#include "code\anomalies\anomalies_premades.dm" //Премейды аномалий +#include "code\anomalies\anomaly_core.dm"//Ядро аномок +#include "code\anomalies\anomaly_deleting.dm" //Код отвечающий за удаление аномалий +#include "code\anomalies\anomaly_electrostatic.dm" //Код отвечающий за просчёт подверженности турфа аномалией. +#include "code\anomalies\anomaly_graphic.dm" //Графика, спрайты - всё тут +#include "code\anomalies\anomaly_loop.dm" //Аномалии с длительной работой/воздействием +#include "code\anomalies\anomaly_parts.dm" //Мультитайтловость аномалий +#include "code\anomalies\anomaly_preload.dm" //Код, отвечающий за предзарядку аномалий перед ударом +#include "code\anomalies\anomaly_randomize.dm" //Рандомизация параметров и типа аномалий +#include "code\anomalies\anomaly_sound.dm" // Звуки, опять звуки - всё тут +#include "code\anomalies\anomaly_walking.dm" // [Work In Progress] - Блуждающие аномалии +#include "code\anomalies\interact_with_items.dm" // Влияние артефактов на предметы. TODO - варка артефактов и прочее + + + +//Код артефактов и всё с ними связанное +#include "code\artefacts\_anomaly_artefacts.dm" //Ядро артефактов +#include "code\artefacts\_artefact_external_interact.dm" //реакции на внешние события на артефакт/носителя +#include "code\artefacts\_artefact_processing.dm" //Процессинг/постоянная обработка артефакта +#include "code\artefacts\_interact_with_artefacts.dm" //Интеракции с артефактом (Персонаж/URM) +#include "code\artefacts\_artefact_spawn.dm" +#include "code\artefacts\artefact_gravi.dm" +#include "code\artefacts\artefact_pruzhina.dm" +#include "code\artefacts\artefact_svetlyak.dm" +#include "code\artefacts\artefact_zjar.dm" +#include "code\artefacts\artefact_flyer.dm" +//#include "code\artefacts\artefact_zjemchug.dm" + + //Детекторы и прочее оборудование #include "code\detectors_and_etc\bolt.dm" #include "code\detectors_and_etc\detector.dm" +#include "code\detectors_and_etc\gurza_detector.dm" #include "code\detectors_and_etc\collector.dm" +#include "code\detectors_and_etc\deployer.dm" #include "code\detectors_and_etc\beacon.dm" #include "code\detectors_and_etc\research_machine.dm" -//Код артефактов и всё с ними связанное -#include "code\artifacts\anomaly_artifact_spawn.dm" -#include "code\artifacts\anomaly_artifacts.dm" -#include "code\artifacts\interact_with_artefacts.dm" -#include "code\artifacts\artefact_pruzhina.dm" -#include "code\artifacts\artefact_zjar.dm" -#include "code\artifacts\artefact_svetlyak.dm" -#include "code\artifacts\artefact_gravi.dm" - - -//Все типы аномалий -#include "code\anomalies\electra.dm" -#include "code\anomalies\rvach.dm" -#include "code\anomalies\vspishka.dm" -#include "code\anomalies\single\tramplin.dm" -#include "code\anomalies\single\zjarka.dm" -#include "code\anomalies\heater.dm" -#include "code\anomalies\cooler.dm" -// #include "code\anomalies\ventilyator.dm" -//Аномалия 2 на 2 -#include "code\anomalies\twoandtwo\heater2x2.dm" -#include "code\anomalies\twoandtwo\cooler2x2.dm" - - -//Аномалия 3 на 3 -#include "code\anomalies\threeandthree\electra_3x3.dm" -#include "code\anomalies\threeandthree\rvach_3x3.dm" -#include "code\anomalies\threeandthree\heater_3x3.dm" -#include "code\anomalies\threeandthree\cooler_3x3.dm" +//Погода и эффекты на мониторе +#include "code\monitor_effects\monitor_core.dm" +#include "code\monitor_effects\monitor_vars.dm" +#include "code\monitor_effects\snow_monitor_effect.dm" +#include "code\monitor_effects\swamp_monitor_effect.dm" +#include "code\monitor_effects\vulcan_monitor_effect.dm" //Размещение аномалий в игре @@ -64,15 +82,31 @@ #include "code\spawn_anomalies_protocol\spawn_anomaly_with_big_artefact.dm" //Код, отвечающий за спавн аномалий вокруг больших артефактов #include "code\spawn_anomalies_protocol\spawn_with_ruins.dm" #include "code\spawn_anomalies_protocol\bsd_event_protocol.dm" -#include "code\spawn_anomalies_protocol\planet_spawn_types\vulcanic.dm" //Вулканическая планета -#include "code\spawn_anomalies_protocol\planet_spawn_types\ice.dm" //Ледяная планета -// #include "code\spawn_anomalies_protocol\planet_spawn_types\flying.dm" //Летающие острова +//Планетарный спавн +#include "code\spawn_anomalies_protocol\planet_spawn_protocol\_planet_spawn_core.dm" +//Летающие острова[WIP] +#include "code\spawn_anomalies_protocol\planet_spawn_protocol\flying_planet\clouds.dm" +#include "code\spawn_anomalies_protocol\planet_spawn_protocol\flying_planet\flying.dm" +//Ледяная планета[WIP] +#include "code\spawn_anomalies_protocol\planet_spawn_protocol\ice.dm" +//Вулкан +#include "code\spawn_anomalies_protocol\planet_spawn_protocol\vulcanic.dm" +//Саргасово болото [WIP-WIP] +// #include "code\spawn_anomalies_protocol\planet_spawn_protocol\sargas.dm" #include "code\spawn_anomalies_protocol\spawn_on_planet.dm" //Спавн на планетах -#include "code\anomalies\threeandthree\anomalies_premades.dm" //"Заготовки" аномалий + //Карты, диреликты и прочее #include "maps\electra_ruins\electra_ruins.dm" -#include "maps\zjarka_ruins\zjarka_ruins.dm" +#include "maps\zharka_ruins\zharka_ruins.dm" +//Код островов +#include "maps\flying_islands\flying_island.dm" +#include "maps\flying_islands\flying_island_ball.dm" +#include "maps\flying_islands\flying_island_2.dm" +#include "maps\flying_islands\flying_island_3.dm" +#include "maps\flying_islands\flying_island_4.dm" +#include "maps\flying_islands\flying_island_5.dm" + #endif diff --git a/mods/anomaly/code/README.md b/mods/anomaly/code/README.md deleted file mode 100644 index cb166076e874f..0000000000000 --- a/mods/anomaly/code/README.md +++ /dev/null @@ -1,10 +0,0 @@ -Привет -Прежде чем вы полезете смотреть код у меня будет к вам просьба -НЕ лезьте в код с целью подсмотреть как работает тот или определённый механ, это разрушает всю идею исследования -НЕ распростроняйте информацию о работе аномалий и прочего в общих чатах, это тоже очень плохо влияет на восприятие! - -mods\anomaly\code\anomalies <-- Все аномалии мода и их функционирование -mods\anomaly\code\artifacts <-- Все артефакты, их появление, свойства и интеракции с ними -mods\anomaly\code\detectors_and_etc <-- Различное оборудование для борьбы с аномалиями, их обнаружение и прочее -mods\anomaly\code\spawn_anomalies_protocol <-- Вся логика отвечающая за то как в игре размещаются и появляются аномалии. Более подробно рассписано в начале файлов: mods\anomaly\code\spawn_anomalies_protocol\core_spawn_protocol.dm -mods\anomaly\code\spawn_anomalies_protocol\spawn_with_ruins.dm diff --git a/mods/anomaly/code/anomalies/threeandthree/anomalies_premades.dm b/mods/anomaly/code/anomalies/anomalies_premades.dm similarity index 88% rename from mods/anomaly/code/anomalies/threeandthree/anomalies_premades.dm rename to mods/anomaly/code/anomalies/anomalies_premades.dm index eb0cc2d695d80..1a95ef758a421 100644 --- a/mods/anomaly/code/anomalies/threeandthree/anomalies_premades.dm +++ b/mods/anomaly/code/anomalies/anomalies_premades.dm @@ -20,7 +20,7 @@ .=..() -/obj/anomaly/thamplin/random +/obj/anomaly/tramplin/random random_throw_dir = TRUE /obj/anomaly/thamplin/random/always_powerfull_walking @@ -29,13 +29,13 @@ walk_time = 2 SECONDS chance_spawn_walking = 100 -/obj/anomaly/zjarka/walking +/obj/anomaly/zharka/walking chance_spawn_walking = 100 -/obj/anomaly/zjarka/short_effect +/obj/anomaly/zharka/short_effect effect_range = 0 -/obj/anomaly/zjarka/long_effect +/obj/anomaly/zharka/long_effect effect_range = 2 /obj/anomaly/electra/three_and_three/preload diff --git a/mods/anomaly/code/anomaly_core.dm b/mods/anomaly/code/anomalies/anomaly_core.dm similarity index 87% rename from mods/anomaly/code/anomaly_core.dm rename to mods/anomaly/code/anomalies/anomaly_core.dm index 105a0e08846bb..d62bcad26c767 100644 --- a/mods/anomaly/code/anomaly_core.dm +++ b/mods/anomaly/code/anomalies/anomaly_core.dm @@ -5,14 +5,12 @@ -Обработка перезарядки, КД аномалии -Инициализация аномалии в мире */ -#define LONG_ANOMALY_EFFECT 1 -#define MOMENTUM_ANOMALY_EFFECT 2 -#define DEFAULT_ANOMALY_EFFECT 0 -#define isanomaly(A) istype(A, /obj/anomaly) /obj/anomaly name = "Аномалия. Вы не должны это видеть." - anchored = TRUE //Чтоб аномалию не двигало в случае чего + anchored = TRUE //Чтоб аномалию не двигало в случае чего. + //Позволяет быстро определять для кода какая именно аномалия (electra, Zharka, и прочее) + var/anomaly_tag //COULDOWN AND SMTH ///Аномалия уходит на КД после срабатывания? var/can_be_discharged = FALSE @@ -34,6 +32,8 @@ var/list/special_iniciators = list() ///Список этих самых специальных условий для аномалии var/list/special_iniciators_flags = list() + ///Вес на который реагирует аномалия. Если FALSE - не смотрит на вес. Если вес обьекта выше переменной - на него реагируют. Ниже - нет. + var/weight_sensity = FALSE /// Радиус, в котором бьёт аномалия. Ваша аномалия может "Чуять" на одном расстоянии, а бить на более большом! var/effect_range = 0 @@ -50,6 +50,10 @@ ///Аномалия по причине пересечения или ещё какой причине проверяет, может ли она "Взвестить от этого инициатора" /obj/anomaly/proc/can_be_activated(atom/movable/target) + if(weight_sensity && isitem(target)) + var/obj/item/detected_item = target + if(weight_sensity != detected_item.w_class || weight_sensity > detected_item.w_class) //Вес предмета ниже чем чувствительность аномалии. + return "too small weight" for(var/i in iniciators) if(istype(target, i)) return TRUE @@ -67,12 +71,13 @@ return FALSE ///Сама активация аномалии -/obj/anomaly/proc/activate_anomaly() +/obj/anomaly/proc/activate_anomaly(activate_friends = FALSE) return //Обязательно вызываем обработку результатов активации /obj/anomaly/activate_anomaly() .=..() + SSanom.anomalies_activated_times++ handle_after_activation() @@ -165,7 +170,10 @@ //Спавн аномалии, её размещение и т.д /obj/anomaly/Initialize() . = ..() - SSanom.add_anomaly_in_list(src) + if(is_helper) + SSanom.add_anomaly_in_helpers(src) + else + SSanom.add_anomaly_in_cores(src) preload_time = cooldown_time if(ranzomize_with_initialize) ranzomize_parameters() diff --git a/mods/anomaly/code/anomaly_deleting.dm b/mods/anomaly/code/anomalies/anomaly_deleting.dm similarity index 87% rename from mods/anomaly/code/anomaly_deleting.dm rename to mods/anomaly/code/anomalies/anomaly_deleting.dm index 2435c24094a05..fffcc73409271 100644 --- a/mods/anomaly/code/anomaly_deleting.dm +++ b/mods/anomaly/code/anomalies/anomaly_deleting.dm @@ -5,7 +5,7 @@ delete_anomaly() /obj/anomaly/proc/delete_anomaly() - SSanom.remove_anomaly_from_list(src) + SSanom.remove_anomaly_from_cores(src) calculate_effected_turfs_from_deleting_anomaly(src) if(multitile) for(var/obj/anomaly/part in list_of_parts) @@ -13,6 +13,7 @@ qdel(src) /obj/anomaly/part/delete_anomaly() + SSanom.remove_anomaly_from_helpers(src) qdel(src) diff --git a/mods/anomaly/code/anomaly_electrostatic.dm b/mods/anomaly/code/anomalies/anomaly_electrostatic.dm similarity index 100% rename from mods/anomaly/code/anomaly_electrostatic.dm rename to mods/anomaly/code/anomalies/anomaly_electrostatic.dm diff --git a/mods/anomaly/code/anomaly_graphic.dm b/mods/anomaly/code/anomalies/anomaly_graphic.dm similarity index 68% rename from mods/anomaly/code/anomaly_graphic.dm rename to mods/anomaly/code/anomalies/anomaly_graphic.dm index 9268417608b07..32e4a1e5d0c99 100644 --- a/mods/anomaly/code/anomaly_graphic.dm +++ b/mods/anomaly/code/anomalies/anomaly_graphic.dm @@ -7,11 +7,22 @@ var/activation_effect_type ///Эффект в идле var/idle_effect_type = "none" + ///Как видят аномалию при обнаружении plane = OBSERVER_PLANE ///Здесь вам потребуется вручную указать длинну анимации, для того чтоб игра вновь сделала её невидимой и некликабельной для игрока //Костыль, но лучше решения ещё не придумал var/momentum_animation_long = 0.6 SECONDS + + ///Сделать вспышку после активации? + var/light_after_activation = FALSE + ///Время, которое будет держаться свет от активации + var/time_of_light = 1 SECOND + ///Цвет вспышки + var/color_of_light = COLOR_WHITE + var/range_of_light = 3 + var/power_of_light = 2 + /obj/anomaly/proc/do_momentum_animation() if(activation_effect_type) invisibility = 0 @@ -37,3 +48,18 @@ plane = WARP_EFFECT_PLANE appearance_flags = DEFAULT_APPEARANCE_FLAGS | TILE_BOUND z_flags = ZMM_IGNORE + + + + +///Запускаем свет/вспышку +/obj/anomaly/proc/start_light() + set_light(3, 2, color_of_light) + addtimer(new Callback(src, PROC_REF(stop_light)), time_of_light) + +///Убираем свет/вспышку +/obj/anomaly/proc/stop_light() + set_light(0) + +/obj/anomaly/proc/get_detection_icon() + return detection_icon_state diff --git a/mods/anomaly/code/anomaly_loop.dm b/mods/anomaly/code/anomalies/anomaly_loop.dm similarity index 100% rename from mods/anomaly/code/anomaly_loop.dm rename to mods/anomaly/code/anomalies/anomaly_loop.dm diff --git a/mods/anomaly/code/anomaly_parts.dm b/mods/anomaly/code/anomalies/anomaly_parts.dm similarity index 89% rename from mods/anomaly/code/anomaly_parts.dm rename to mods/anomaly/code/anomalies/anomaly_parts.dm index 5f96b749ff8d0..9636b7acb5479 100644 --- a/mods/anomaly/code/anomaly_parts.dm +++ b/mods/anomaly/code/anomalies/anomaly_parts.dm @@ -5,6 +5,8 @@ /obj/anomaly ///Аномалия состоит из множества частей? var/multitile = FALSE + ///Означает, что обьект является вспомогательной частью. Применяется для контроллера. + var/is_helper = FALSE ///Радиус в котором спавнятся остальные части от ядра var/multititle_parts_range = 1 var/list/list_of_parts @@ -39,10 +41,15 @@ part.core = src ///Этот обьект в случае детектирования подходящих условий, передаст информацию ядру. +/obj/anomaly/part/Initialize() + . = ..() + SSanom.add_anomaly_in_helpers(src) + /obj/anomaly/part ///ЯДРО, которму и передатся информация var/obj/anomaly/core name = "Вспомогательная часть аномалии." + is_helper = TRUE ///Если какой-либо атом пересекает вспомогательную часть - передаём сигнал ядру @@ -66,3 +73,7 @@ return TRUE return FALSE + +/obj/anomaly/part/get_detection_icon() + if(core) + return core.get_detection_icon() diff --git a/mods/anomaly/code/anomaly_preload.dm b/mods/anomaly/code/anomalies/anomaly_preload.dm similarity index 100% rename from mods/anomaly/code/anomaly_preload.dm rename to mods/anomaly/code/anomalies/anomaly_preload.dm diff --git a/mods/anomaly/code/anomaly_randomize.dm b/mods/anomaly/code/anomalies/anomaly_randomize.dm similarity index 100% rename from mods/anomaly/code/anomaly_randomize.dm rename to mods/anomaly/code/anomalies/anomaly_randomize.dm diff --git a/mods/anomaly/code/anomaly_sound.dm b/mods/anomaly/code/anomalies/anomaly_sound.dm similarity index 91% rename from mods/anomaly/code/anomaly_sound.dm rename to mods/anomaly/code/anomalies/anomaly_sound.dm index 0a53359ac5cae..e877262ed2649 100644 --- a/mods/anomaly/code/anomaly_sound.dm +++ b/mods/anomaly/code/anomalies/anomaly_sound.dm @@ -5,7 +5,7 @@ ///Путь до звука var/sound_type ///Мощность аномалии - var/effect_power = DEFAULT_ANOMALY_EFFECT + var/effect_power = MOMENTUM_ANOMALY_EFFECT //У аномалии есть статичный звук var/have_static_sound = FALSE //Путь до звука статики diff --git a/mods/anomaly/code/anomaly_walking.dm b/mods/anomaly/code/anomalies/anomaly_walking.dm similarity index 100% rename from mods/anomaly/code/anomaly_walking.dm rename to mods/anomaly/code/anomalies/anomaly_walking.dm diff --git a/mods/anomaly/code/interact_with_items.dm b/mods/anomaly/code/anomalies/interact_with_items.dm similarity index 58% rename from mods/anomaly/code/interact_with_items.dm rename to mods/anomaly/code/anomalies/interact_with_items.dm index 5f7d86b7a6008..7f1927cbb80f8 100644 --- a/mods/anomaly/code/interact_with_items.dm +++ b/mods/anomaly/code/anomalies/interact_with_items.dm @@ -1,10 +1,12 @@ -//Здесь расположен код отвечающие за взаимодействие с предметами. +//Здесь расположен код отвечающие за взаимодействие аномалий с предметами. /proc/anything_in_ashes(atom/input_item) var/turf/to_place = get_turf(input_item) + input_item.visible_message(SPAN_BAD("[input_item] плавится!")) new /obj/decal/cleanable/ash (to_place) qdel(input_item) /proc/anything_in_remains(atom/input_item) var/turf/to_place = get_turf(input_item) + input_item.visible_message(SPAN_BAD("Тело [input_item] испепелило до костей!")) new /obj/item/remains (to_place) qdel(input_item) diff --git a/mods/anomaly/code/anomalies/cooler.dm b/mods/anomaly/code/anomalies/single/cooler.dm similarity index 95% rename from mods/anomaly/code/anomalies/cooler.dm rename to mods/anomaly/code/anomalies/single/cooler.dm index 0ab7a0be8c6eb..cf1d353b26913 100644 --- a/mods/anomaly/code/anomalies/cooler.dm +++ b/mods/anomaly/code/anomalies/single/cooler.dm @@ -1,7 +1,8 @@ /obj/anomaly/cooler name = "Refractions of light" + anomaly_tag = "Cooler" with_sound = FALSE - can_born_artifacts = TRUE + can_born_artefacts = TRUE //Длинна эффекта подогрева effect_time = 30 SECONDS effect_type = LONG_ANOMALY_EFFECT diff --git a/mods/anomaly/code/anomalies/electra.dm b/mods/anomaly/code/anomalies/single/electra.dm similarity index 57% rename from mods/anomaly/code/anomalies/electra.dm rename to mods/anomaly/code/anomalies/single/electra.dm index 689bac90980fc..e082792d8a38b 100644 --- a/mods/anomaly/code/anomalies/electra.dm +++ b/mods/anomaly/code/anomalies/single/electra.dm @@ -1,14 +1,16 @@ /obj/anomaly/electra name = "Lightning strikes" + anomaly_tag = "Electra" with_sound = TRUE sound_type = 'mods/anomaly/sounds/electra_blast.ogg' activation_effect_type = "electra_activation" idle_effect_type = "electra_idle" + detection_icon_state = "electra_anomaly" layer = ABOVE_HUMAN_LAYER light_after_activation = TRUE color_of_light = COLOR_WHITE time_of_light = 1.5 SECONDS - can_born_artifacts = TRUE + can_born_artefacts = TRUE special_iniciators = list( /obj/item ) @@ -38,8 +40,9 @@ can_be_preloaded = TRUE being_preload_chance = 30 detectable_effect_range = TRUE + detection_skill_req = SKILL_EXPERIENCED -/obj/anomaly/electra/activate_anomaly() +/obj/anomaly/electra/activate_anomaly(activate_friends = TRUE) last_activation_time = world.time//Без этой строчки некоторые электры входят в вечный цикл зарядки и удара, костыль? Возможно if(need_preload) start_preload() @@ -55,10 +58,10 @@ for(var/atom/movable/atoms in objs) get_effect_by_anomaly(atoms) //Если электра является подтипом теслы, она должна взвести все другие теслы рядом - if(subtype_tesla) + if(subtype_tesla && activate_friends) var/list/victims_not_used = list() var/list/objs_second = list() - get_mobs_and_objs_in_view_fast(T, effect_range * 6, victims_not_used, objs_second) + get_mobs_and_objs_in_view_fast(T, 3, victims_not_used, objs_second) for(var/obj/anomaly/electra/electra_anomalies in objs_second) if(electra_anomalies.isready() && electra_anomalies.subtype_tesla) unwait_activate_anomaly(electra_anomalies) @@ -66,13 +69,14 @@ if(istype(anomaly_parts.core, /obj/anomaly/electra)) var/obj/anomaly/electra/electra_anomalies = anomaly_parts.core if(electra_anomalies.isready() && electra_anomalies.subtype_tesla) - unwait_activate_anomaly(electra_anomalies) + unwait_activate_anomaly(electra_anomalies, activate_friends) .=..() /obj/anomaly/electra/proc/unwait_activate_anomaly(obj/anomaly/electra/anomaly) + //Тесла должна взводить лишь соседние теслы за раз. set waitfor = FALSE last_activation_time = world.time - anomaly.activate_anomaly() + anomaly.activate_anomaly(FALSE) /obj/anomaly/electra/get_effect_by_anomaly(atom/movable/target) //Понадобится нам, если обьект по какой-либо причине будет удалён из-за удара, дабы "лучу" было куда идти @@ -83,56 +87,85 @@ return //Если цель подходит под критерии удара, мы рисуем молнию var/create_line = FALSE - //Если целью является адхерант, мы лишь заряжаем его батарею - if(istype(target, /mob/living/carbon/human/adherent)) + + + + + //Жертвой удара является моб или его наследник(ребёнок) + if(istype(target, /mob/living)) + var/mob/living/victim_target = target + SSanom.add_last_attack(target, "Электра") create_line = TRUE - var/mob/living/carbon/human/adherent/adherent = target - var/obj/item/cell/power_cell - var/obj/item/organ/internal/cell/cell = locate() in adherent.internal_organs - if(cell && cell.cell) - power_cell = cell.cell - if(power_cell) - power_cell.charge = power_cell.maxcharge - to_chat(target, SPAN_NOTICE("Your [power_cell] has been charged to capacity.")) - - //Цель удара - человек - else if(istype(target, /mob/living/carbon/human)) - for(var/obj/item/artefact/zjar/defense_artefact in target) - if(defense_artefact.current_integrity > 1) - defense_artefact.current_integrity-- - to_chat(target, SPAN_GOOD("[defense_artefact] вспыхивает красной вспышкой")) + var/list/result_effects = calculate_artefact_reaction(target, "Электра") + if(result_effects) + if(result_effects.Find("Впитывает электроудар")) + return + if(result_effects.Find("Уворачивается от молнии, молния идёт дальше")) + var/anomaly_to_victim_dir = get_dir(src, victim_target) + var/new_turf = get_ranged_target_turf(victim_target, anomaly_to_victim_dir, 1) + target_turf = new_turf + for(var/atom/movable/atom in new_turf) + get_effect_by_anomaly(atom) + beam = src.Beam(BeamTarget = target_turf, icon_state = "electra_long",icon='mods/anomaly/icons/effects.dmi',time = 0.3 SECONDS) + victim_target.dodge_animation() + to_chat(victim_target, SPAN_GOOD("Видя удар молнии словно в замедлении, вы умудряетесь увернуться от него") + ) + return + victim_target.inform_about_electroanomaly_act("thunderbolt") + //Если целью является адхерант, мы лишь заряжаем его батарею + if(istype(target, /mob/living/carbon/human/adherent)) + var/mob/living/carbon/human/adherent/adherent = target + var/obj/item/cell/power_cell + var/obj/item/organ/internal/cell/cell = locate() in adherent.internal_organs + if(cell && cell.cell) + power_cell = cell.cell + if(power_cell) + power_cell.charge = power_cell.maxcharge + to_chat(target, SPAN_NOTICE("Your [power_cell] has been charged to capacity.")) + + //Цель удара - человек + else if(ishuman(target)) + var/mob/living/carbon/human/victim = target + if(victim.health == 0) + SSanom.add_last_gibbed(target, "Электра") + anything_in_remains(victim) + return + + if(victim.lying) //Если цель лежит нам не нужно просчитывать путь до земли. Просто делаем удар в любую конечность + victim.electoanomaly_act(50, src) else - qdel(defense_artefact) - to_chat(target, SPAN_BAD("[defense_artefact] вспыхивает ярчайшей красной вспышкой и пропадает.")) - to_chat(target, SPAN_GOOD("Вы чувствуете сильный, но приятный ЖАР в месте удара. Но не боль.")) - return - var/mob/living/carbon/human/victim = target - var/list/organs = victim.list_organs_to_earth() - for(var/picked_organ in organs) - victim.electoanomaly_act(50, src, picked_organ) - //Если целью является борг, мы так же наносим ему электроудар - else if(istype(target, /mob/living/silicon/robot )) - create_line = TRUE - var/mob/living/silicon/robot/borg = target - borg.apply_damage(50, DAMAGE_BURN, def_zone = BP_CHEST) - to_chat(borg, SPAN_DANGER("Powerful electric shock detected!")) + var/list/organs = victim.list_organs_to_earth() + var/damage = 50/LAZYLEN(organs) + for(var/picked_organ in organs) + victim.electoanomaly_act(damage, src, picked_organ) + + //Если целью является борг, мы так же наносим ему электроудар + else if(istype(target, /mob/living/silicon/robot )) + create_line = TRUE + var/mob/living/silicon/robot/borg = target + borg.apply_damage(50, DAMAGE_BURN, def_zone = BP_CHEST) + to_chat(borg, SPAN_DANGER("Powerful electric shock detected!")) + + //Если целью является мех, мы наносим электроудар и эми удар + else if(istype(target, /mob/living/exosuit)) + create_line = TRUE + var/mob/living/exosuit/mech = target + mech.apply_damage(100, DAMAGE_BURN) + mech.emp_act(1) + + //Если целью является симплмоб, мы наносим электроудар + else if(istype(target, /mob/living)) + create_line = TRUE + var/mob/living/victim = target + if(victim.health == 0) + anything_in_remains(victim) + return + victim.electoanomaly_act(100, src) + + stun_and_jittery_by_electra(target) - //Если целью является мех, мы наносим электроудар и эми удар - else if(istype(target, /mob/living/exosuit)) - create_line = TRUE - var/mob/living/exosuit/mech = target - mech.apply_damage(100, DAMAGE_BURN) - mech.emp_act(1) else if(istype(target, /obj/structure/mech_wreckage )) qdel(target) - //Если целью является моб, мы наносим электроудар - else if(istype(target, /mob/living)) - create_line = TRUE - var/mob/living/victim = target - if(victim.health == 0) - anything_in_remains(victim) - return - victim.electoanomaly_act(100, src) //Если целью является пепел - мы его удаляем, чтоб не засорять аномалию else if(istype(target, /obj/decal/cleanable/ash)) @@ -150,13 +183,25 @@ create_line = TRUE anything_in_ashes(target) + + //Этот код и создаст саму молнию от центра аномалии до жертвы if(create_line) beam = src.Beam(BeamTarget = target_turf, icon_state = "electra_long",icon='mods/anomaly/icons/effects.dmi',time = 0.3 SECONDS) - +/obj/anomaly/electra/proc/stun_and_jittery_by_electra(mob/living/user) + if(ishuman(user) && !user.incapacitated()) //Человек в сознании + var/mob/living/carbon/human/victim = user + if(prob(14 * victim.get_skill_value(SKILL_HAULING))) //Максимально 70 + to_chat(user, SPAN_GOOD("Вы стойко переносите удар тока.")) + return + else + to_chat(user, SPAN_BAD("Сильный удар тока сбивает вас с ног!")) + user.Weaken(1) + user.make_jittery(min(50, 200)) + user.stun_effect_act(1,1) ///Отдельная функция для просчёта влияния электры @@ -165,19 +210,17 @@ return 0 apply_damage(shock_damage, DAMAGE_BURN, def_zone, used_weapon="Electrocution") + return shock_damage - stun_effect_act(1,1, def_zone) +///Выводит в чат о электроударе +/mob/living/proc/inform_about_electroanomaly_act(source) src.visible_message( SPAN_WARNING("[src] was electrocuted[source ? " by the [source]" : ""]!"), \ SPAN_DANGER("You feel a powerful shock course through your body!"), \ SPAN_WARNING("You hear a heavy electrical crack.") \ ) - Weaken(1) - make_jittery(min(shock_damage*5, 200)) - return shock_damage - //Выдаёт список конечностей от введёной конечности до земли /mob/living/carbon/human/proc/list_organs_to_earth(input_organ) var/list/result_damaged_zones = list() @@ -222,3 +265,12 @@ else if(attack_zone == BP_R_LEG) LAZYADD(result_damaged_zones, BP_R_FOOT) return result_damaged_zones + + +/obj/anomaly/electra/get_detection_icon() + if(effect_range == 1) + return "electra_detection" + else if(effect_range == 2) + return "tesla_first_detection" + else if(effect_range > 2) + return "tesla_second_detection" diff --git a/mods/anomaly/code/anomalies/heater.dm b/mods/anomaly/code/anomalies/single/heater.dm similarity index 92% rename from mods/anomaly/code/anomalies/heater.dm rename to mods/anomaly/code/anomalies/single/heater.dm index f216582d914ed..ca5eed10880b1 100644 --- a/mods/anomaly/code/anomalies/heater.dm +++ b/mods/anomaly/code/anomalies/single/heater.dm @@ -1,11 +1,13 @@ /obj/anomaly/heater name = "Refractions of light" + anomaly_tag = "Heater" with_sound = FALSE - can_born_artifacts = TRUE + can_born_artefacts = TRUE //Длинна эффекта подогрева effect_time = 30 SECONDS effect_type = LONG_ANOMALY_EFFECT cooldown_time = 30 SECONDS + detection_icon_state = "hot_anomaly" iniciators = list( /mob/living ) diff --git a/mods/anomaly/code/anomalies/rvach.dm b/mods/anomaly/code/anomalies/single/rvach.dm similarity index 50% rename from mods/anomaly/code/anomalies/rvach.dm rename to mods/anomaly/code/anomalies/single/rvach.dm index a8930b15852b2..d640e4019d2ea 100644 --- a/mods/anomaly/code/anomalies/rvach.dm +++ b/mods/anomaly/code/anomalies/single/rvach.dm @@ -5,24 +5,29 @@ /obj/anomaly/rvach name = "Refractions of light" + anomaly_tag = "Rvach" with_sound = TRUE sound_type = 'mods/anomaly/sounds/rvach_activation.ogg' idle_effect_type = "rvach_idle" - activation_effect_type = "rvach_activation" - can_born_artifacts = TRUE + activation_effect_type = "gravy_anomaly_down" + detection_icon_state = "hot_anomaly" + can_born_artefacts = TRUE + weight_sensity = ITEM_SIZE_LARGE ///Сколько длится первая фаза рвача(всасывание) - effect_time = 4 SECONDS + effect_time = 3.5 SECONDS effect_type = LONG_ANOMALY_EFFECT effect_power = RVACH_DAMAGE_EFFECT - cooldown_time = 15 SECONDS + cooldown_time = 25 SECONDS iniciators = list( /mob/living, /obj/item ) artefacts = list( - /obj/item/artefact/gravi = 1 + /obj/item/artefact/gravi = 1, + /obj/item/artefact/flyer = 2 ) artefact_spawn_chance = 20 + detection_skill_req = SKILL_EXPERIENCED //Аномалия выполняет своё финальное воздействие на все обьекты что оказались в её центре /obj/anomaly/rvach/proc/get_end_effect_by_anomaly(target) @@ -31,11 +36,21 @@ if(effect_power == RVACH_DESTROY_EFFECT) if(istype(target, /mob/living)) var/mob/living/victim = target + SSanom.add_last_gibbed(target, "Рвач") + var/list/result_effects = calculate_artefact_reaction(target, "Гиб Рвача") + if(result_effects) + if(result_effects.Find("Защищает от гиба рвачом")) + return victim.gib() playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE ) //Если рвач обычный else if(effect_power == RVACH_DAMAGE_EFFECT) + SSanom.add_last_attack(target, "Рвач") + var/list/result_effects = calculate_artefact_reaction(target, "Гиб Рвача") + if(result_effects) + if(result_effects.Find("Защищает от гиба рвачом")) + return if(istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/victim = target if(!victim.incapacitated(INCAPACITATION_UNRESISTING) == TRUE) //Убедимся что наш чувак в сознании @@ -43,7 +58,6 @@ if(victim.skill_check(SKILL_HAULING, SKILL_MASTER)) if(prob(7 * victim.get_skill_value(SKILL_HAULING))) victim.Weaken(10) - to_chat(victim, SPAN_WARNING("То-ли от страха, то-ли от огромной физической подготовки, вы выныриваете из аномалии.")) return //Создаём список органов, которые мы МОЖЕМ оторвать @@ -60,6 +74,7 @@ playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE ) else if(istype(target, /mob/living)) var/mob/living/victim = target + SSanom.add_last_gibbed(target, "Рвач") victim.gib() playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE ) else if(istype(target, /obj/item)) @@ -81,7 +96,7 @@ for(var/atom/movable/target in src.loc) get_end_effect_by_anomaly(target) //Рвач раскидает всех из себя - throw_everyone_from_rvach() + throw_everyone_from_rvach(throw_range) //Выполняем стандартные действия функции stop_processing_long_effect() stop_long_visual_effect() currently_active = FALSE @@ -89,21 +104,33 @@ //Рвач раскидывает всё что попадает в зону рвача из себя /obj/anomaly/rvach/proc/throw_everyone_from_rvach() - //Если рвач мультитайтловый - for(var/atom/movable/victim in src.loc) - if(!ismob(victim) && !isitem(victim) ) + var/list/victims = list() + var/list/objs = list() + var/turf/T = get_turf(src) + //Собираем все обьекты радиусом на 1 больше, чем расположены вспомогательные части рвачика + get_mobs_and_objs_in_view_fast(T, multititle_parts_range, victims, objs) + LAZYMERGELIST(victims, objs) + for(var/atom/movable/detected_atom in victims) + if((!ismob(detected_atom) && !isitem(detected_atom)) || detected_atom.anchored) continue - if(!victim.anchored) - victim.throw_at_random(get_turf(src), effect_range+1, 5) - if(multitile) - for(var/obj/anomaly/part/parts in list_of_parts) - var/throw_dir = get_dir(src, parts) - var/target_turf = get_edge_target_turf(parts, throw_dir) - for(var/atom/movable/victim in parts.loc) - if(!ismob(victim) && !isitem(victim) ) - continue - if(!victim.anchored) - victim.throw_at(target_turf, effect_range, 5) + var/local_range_of_throw = 1 + if(ismob(detected_atom)) + var/mob/detected_mob = detected_atom + var/list/result_effects = calculate_artefact_reaction(detected_mob, "Гиб Рвача") + if(result_effects) + //Цель не сможет вышвырнуть из рвача, артефакт не даёт + if(result_effects.Find("Защищает от гиба рвачом")) + return + if(result_effects.Find("Усиливает дальность полёта")) + local_range_of_throw = 5 + + var/dis = get_dist(src, detected_atom) + if(dis < 1) + detected_atom.throw_at_random(get_turf(src), local_range_of_throw, 5) + else + var/throw_dir = get_dir(src, detected_atom) + var/target_turf = get_ranged_target_turf(detected_atom, throw_dir, local_range_of_throw) + detected_atom.throw_at(target_turf, local_range_of_throw, 5) /proc/rvach_pull_around(atom/target, pull_range = 255, pull_power = STAGE_FIVE) @@ -124,20 +151,41 @@ Weaken(5) /mob/living/carbon/human/rvach_anomaly_pull(turf/target, current_size) - if(target != src.loc) - adjust_stamina(-30) - to_chat(src, SPAN_BAD("Не могу, рано, меня с силой тащит обратно, тяжёло!")) - if(stamina < 30) - Paralyse(1) - to_chat(src, SPAN_BAD("Нет сил!")) - step_towards(src, target) - Weaken(1) + if(get_turf(target) != get_turf(src)) + step_towards(src, target) + Weaken(5) /obj/anomaly/rvach/Crossed(atom/movable/O) if(currently_active) return if(currently_charging_after_activation) return - if(can_be_activated(O)) + if(can_be_activated(O) == "too small weight") + O.forceMove(get_turf(src)) + else if(can_be_activated(O)) activate_anomaly() - return + +//Человек пытается выбраться из рвача FALSE - не даём вылезти, TRUE - даём +/obj/anomaly/rvach/Uncross(O) + if(currently_charging_after_activation || !currently_active) + return TRUE + if(!ishuman(O)) + return TRUE + if(do_after(O, 2 SECONDS, src, DO_PUBLIC_UNIQUE | DO_BAR_OVER_USER, INCAPACITATION_NONE)) + var/mob/living/jumper = O + jumper.forceMove(get_ranged_target_turf(jumper, jumper.dir, 1)) + //После того как игрок выпрыгнул из рвача, тот может опять его всосать если он вылез слишком рано. + //Но Игрок смотрящий на вылезшего игрока может выхватить его, если будет достаточно близко когда наша + //Жертва выпрыгнет + var/turf/helper_turf = get_ranged_target_turf(jumper, jumper.dir, 1) + for(var/mob/living/carbon/human/helper in helper_turf) + if(helper.a_intent == I_HELP && turn(jumper.dir, 180) == helper.dir && helper.incapacitated(INCAPACITATION_UNRESISTING) != TRUE) //Лезущий и помощник должны смотреть друг другу в лицо + to_chat(jumper, SPAN_GOOD("[helper] выхватывает вас за протянутую руку!")) + to_chat(helper, SPAN_GOOD("Вы дёргаете [jumper] на себя за протянутую руку!")) + jumper.forceMove(get_ranged_target_turf(jumper, jumper.dir, 1)) + jumper.Weaken(5) + helper.Weaken(5) + return TRUE + +/obj/anomaly/rvach/get_detection_icon() + return "rvach_detection" diff --git a/mods/anomaly/code/anomalies/single/tramplin.dm b/mods/anomaly/code/anomalies/single/tramplin.dm index 17b93835393c0..8cd46868255cc 100644 --- a/mods/anomaly/code/anomalies/single/tramplin.dm +++ b/mods/anomaly/code/anomalies/single/tramplin.dm @@ -1,5 +1,6 @@ -/obj/anomaly/thamplin +/obj/anomaly/tramplin name = "Refractions of light" + anomaly_tag = "Tramp" with_sound = TRUE sound_type = 'mods/anomaly/sounds/tramplin.ogg' idle_effect_type = "trampline_idle" @@ -13,29 +14,41 @@ /mob/living, /obj/item ) + artefacts = list( + /obj/item/artefact/flyer = 1 + ) //Рандомизация ranzomize_with_initialize = TRUE - can_born_artifacts = FALSE + can_born_artefacts = FALSE min_coldown_time = 3 SECONDS max_coldown_time = 8 SECONDS - can_be_preloaded = TRUE being_preload_chance = 10 chance_to_be_detected = 75 - can_walking = TRUE - chance_spawn_walking = 5 - walking_activity = 5 + detection_skill_req = SKILL_BASIC +/obj/anomaly/tramplin/Initialize() + . = ..() + range_of_throw = rand(2,5) -/obj/anomaly/thamplin/activate_anomaly() +/obj/anomaly/tramplin/activate_anomaly() for(var/obj/item/target in src.loc) get_effect_by_anomaly(target) for(var/mob/living/targetbam in src.loc) get_effect_by_anomaly(targetbam) .=..() -/obj/anomaly/thamplin/get_effect_by_anomaly(target) +/obj/anomaly/tramplin/get_effect_by_anomaly(target) if(ismech(target)) return + var/local_range_of_throw = range_of_throw + if(istype(target, /mob/living)) + SSanom.add_last_attack(target, "Трамплин") + var/list/result_effects = calculate_artefact_reaction(target, "Трамплин") + if(result_effects) + if(result_effects.Find("Не даёт кинуть")) + return + if(result_effects.Find("Усиливает дальность полёта")) + local_range_of_throw = local_range_of_throw * 3 if(ishuman(target)) var/mob/living/carbon/human/victim = target @@ -43,17 +56,21 @@ if(victim.skill_check(SKILL_HAULING, SKILL_EXPERIENCED)) if(prob(10 * victim.get_skill_value(SKILL_HAULING))) victim.Weaken(1) - to_chat(victim, SPAN_WARNING("Земля пропадает под ногами, но вы успеваете вцепиться в землю словно зубами.")) + to_chat(victim, SPAN_GOOD("Земля пропадает под ногами, но вы успеваете вцепиться в землю словно зубами.")) return var/turf/own_turf = get_turf(src) var/turf/target_turf = own_turf if(!random_throw_dir) - //В силу того что в билде нет нормальной функции по киданию по направлению, сперва расчитаем цель, куда будем метать обьект - for(var/i = 1, i < range_of_throw, i++) - target_turf = get_edge_target_turf(target, throw_dir) + target_turf = get_ranged_target_turf(target, throw_dir, local_range_of_throw) var/atom/movable/victim = target + if(isliving(victim)) + var/mob/victim_mob = victim + victim_mob.Weaken(1) if(random_throw_dir) - victim.throw_at_random(own_turf, range_of_throw, speed_of_throw ) + victim.throw_at_random(own_turf, local_range_of_throw, speed_of_throw ) else - victim.throw_at(target_turf, range_of_throw, speed_of_throw) + victim.throw_at(target_turf, local_range_of_throw, speed_of_throw) + +/obj/anomaly/tramplin/get_detection_icon() + return "trampline_detection" diff --git a/mods/anomaly/code/anomalies/ventilyator.dm b/mods/anomaly/code/anomalies/single/ventilyator.dm similarity index 93% rename from mods/anomaly/code/anomalies/ventilyator.dm rename to mods/anomaly/code/anomalies/single/ventilyator.dm index 02e3f01d2c736..ff27d598694b0 100644 --- a/mods/anomaly/code/anomalies/ventilyator.dm +++ b/mods/anomaly/code/anomalies/single/ventilyator.dm @@ -1,8 +1,10 @@ +/* Не доделано /proc/random_dir() return pick(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) /obj/anomaly/ventilyator name = "air flows" + anomaly_tag = "Vent" with_sound = TRUE sound_type = 'mods/anomaly/sounds/tramplin.ogg' idle_effect_type = "trampline_idle" @@ -20,12 +22,13 @@ ) //Рандомизация ranzomize_with_initialize = TRUE - can_born_artifacts = FALSE + can_born_artefacts = FALSE min_coldown_time = 15 SECONDS max_coldown_time = 30 SECONDS time_between_effects = 0.25 SECONDS being_preload_chance = 10 chance_to_be_detected = 75 + detection_skill_req = SKILL_EXPERIENCED /obj/anomaly/ventilyator/Initialize() . = ..() @@ -57,3 +60,4 @@ for(var/atom/atoms in list_of_effected_turfs) get_effect_by_anomaly(atoms) start_processing_long_effect() +*/ diff --git a/mods/anomaly/code/anomalies/vspishka.dm b/mods/anomaly/code/anomalies/single/vspishka.dm similarity index 78% rename from mods/anomaly/code/anomalies/vspishka.dm rename to mods/anomaly/code/anomalies/single/vspishka.dm index 3a60cfd47d373..f536e3fc02c38 100644 --- a/mods/anomaly/code/anomalies/vspishka.dm +++ b/mods/anomaly/code/anomalies/single/vspishka.dm @@ -1,5 +1,6 @@ /obj/anomaly/vspishka name = "Brightest flash" + anomaly_tag = "Vspishka" with_sound = TRUE sound_type = 'mods/anomaly/sounds/vspishka_activated.ogg' idle_effect_type = "vspishka_idle" @@ -10,19 +11,20 @@ range_of_light = 6 power_of_light = 10 effect_range = 5 - can_born_artifacts = FALSE + can_born_artefacts = FALSE var/datum/beam = null var/create_line = FALSE preload_sound_type = 'mods/anomaly/sounds/vspishka_preload.ogg' //Рандомизация ranzomize_with_initialize = TRUE - min_coldown_time = 15 SECONDS - max_coldown_time = 30 SECONDS + min_coldown_time = 30 SECONDS + max_coldown_time = 75 SECONDS min_preload_time = 6 max_preload_time = 12 can_be_preloaded = TRUE being_preload_chance = 80 - chance_to_be_detected = 50 + chance_to_be_detected = 75 + detection_skill_req = SKILL_MASTER /obj/anomaly/vspishka/activate_anomaly() last_activation_time = world.time @@ -42,6 +44,11 @@ create_line = FALSE //Ослепим моба if(istype(target, /mob/living)) + SSanom.add_last_attack(target, "Вспышка") + var/list/result_effects = calculate_artefact_reaction(target, "Вспышка") + if(result_effects) + if(result_effects.Find("Защищает от ослепления")) + return var/mob/living/victim = target victim.flash_eyes(FLASH_PROTECTION_MAJOR) victim.Stun(5) diff --git a/mods/anomaly/code/anomalies/single/zjarka.dm b/mods/anomaly/code/anomalies/single/zharka.dm similarity index 73% rename from mods/anomaly/code/anomalies/single/zjarka.dm rename to mods/anomaly/code/anomalies/single/zharka.dm index cd065ac7ad454..22b068f8aeb9d 100644 --- a/mods/anomaly/code/anomalies/single/zjarka.dm +++ b/mods/anomaly/code/anomalies/single/zharka.dm @@ -1,8 +1,10 @@ -/obj/anomaly/zjarka +/obj/anomaly/zharka name = "Jet of flame" + anomaly_tag = "Zharka" with_sound = TRUE - sound_type = 'mods/anomaly/sounds/zjarka.ogg' - idle_effect_type = "zjarka_idle" + sound_type = 'mods/anomaly/sounds/zharka.ogg' + idle_effect_type = "zharka_idle" + detection_icon_state = "hot_anomaly" layer = ABOVE_HUMAN_LAYER light_after_activation = TRUE effect_type = LONG_ANOMALY_EFFECT @@ -10,10 +12,10 @@ color_of_light = COLOR_WHITE effect_time = 5 SECONDS time_of_light = 5 SECONDS - can_born_artifacts = TRUE + can_born_artefacts = TRUE //Урон который наносит открытое пламя телу в var/burn_damage = 10 - activation_effect_type = "zjarka_active" + activation_effect_type = "zharka_active" special_iniciators = list( /obj/item @@ -33,12 +35,10 @@ artefact_spawn_chance = 10 can_be_preloaded = FALSE being_preload_chance = 20 - can_walking = TRUE - chance_spawn_walking = 1 - walking_activity = 2 + detection_skill_req = SKILL_BASIC -/obj/anomaly/zjarka/activate_anomaly() +/obj/anomaly/zharka/activate_anomaly() last_activation_time = world.time var/list/victims = list() var/list/objs = list() @@ -52,17 +52,19 @@ anything_in_ashes(I) .=..() -/obj/anomaly/zjarka/get_effect_by_anomaly(atom/movable/target) +/obj/anomaly/zharka/get_effect_by_anomaly(atom/movable/target) if(!isturf(target.loc)) return if(isanomaly(target)) return //Поджечь человека if(istype(target, /mob/living)) + SSanom.add_last_attack(target, "Жарка") var/mob/living/victim = target if(inmech_sec(victim)) return if(victim.health == 0) + SSanom.add_last_gibbed(target, "Жарка") anything_in_remains(victim) return victim.fire_stacks = max(2, victim.fire_stacks) @@ -74,7 +76,7 @@ anything_in_ashes(target) ///Жарим всех вокруг в течении действия аномалии -/obj/anomaly/zjarka/process_long_effect() +/obj/anomaly/zharka/process_long_effect() var/list/victims = list() var/list/objs = list() var/turf/T = get_turf(src) @@ -87,7 +89,7 @@ get_effect_by_anomaly(atoms) start_processing_long_effect() -/obj/anomaly/zjarka/Crossed(atom/movable/O) +/obj/anomaly/zharka/Crossed(atom/movable/O) if(currently_active) get_effect_by_anomaly(O) if(currently_charging_after_activation) @@ -95,3 +97,12 @@ if(can_be_activated(O)) activate_anomaly() return + + +/obj/anomaly/zharka/get_detection_icon() + if(effect_range == 1 || effect_range == 0) + return "zharka_detection" + else if(effect_range == 2) + return "zharka_first_detection" + else if(effect_range > 2) + return "zharka_second_detection" diff --git a/mods/anomaly/code/anomaly_admin.dm b/mods/anomaly/code/anomaly_admin.dm index 3a88dce05f372..2ff8becd2fc58 100644 --- a/mods/anomaly/code/anomaly_admin.dm +++ b/mods/anomaly/code/anomaly_admin.dm @@ -12,9 +12,9 @@ var/list/possible_anomalies = list( - /obj/anomaly/zjarka = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.", - /obj/anomaly/zjarka/short_effect = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.", - /obj/anomaly/zjarka/long_effect = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.", + /obj/anomaly/zharka = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.", + /obj/anomaly/zharka/short_effect = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.", + /obj/anomaly/zharka/long_effect = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.", /obj/anomaly/electra/three_and_three = "Электра - аномалия наносящая электроудар (50 урона + стан) всех в зоне поражения. Реагирует на мобов, металлические предметы. Подтип ТЕСЛА бьёт дальше чем чувствует, параметр предзарядка заставит её сперва зарядить, и лишь потом ударить. НЕ СОВЕТУЮ СОВМЕЩАТЬ ТЕСЛУ И ПРЕДЗАРЯДКУ.", /obj/anomaly/electra/three_and_three/tesla = "Электра - аномалия наносящая электроудар (50 урона + стан) всех в зоне поражения. Реагирует на мобов, металлические предметы. Подтип ТЕСЛА бьёт дальше чем чувствует, параметр предзарядка заставит её сперва зарядить, и лишь потом ударить. НЕ СОВЕТУЮ СОВМЕЩАТЬ ТЕСЛУ И ПРЕДЗАРЯДКУ.", /obj/anomaly/electra/three_and_three/tesla_second = "Электра - аномалия наносящая электроудар (50 урона + стан) всех в зоне поражения. Реагирует на мобов, металлические предметы. Подтип ТЕСЛА бьёт дальше чем чувствует, параметр предзарядка заставит её сперва зарядить, и лишь потом ударить. НЕ СОВЕТУЮ СОВМЕЩАТЬ ТЕСЛУ И ПРЕДЗАРЯДКУ.", @@ -23,8 +23,8 @@ /obj/anomaly/heater/three_and_three = "Грелка - аномалия греющая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния.Взводятся лишь мобом.", /obj/anomaly/heater/two_and_two = "Грелка - аномалия греющая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния.Взводятся лишь мобом.", /obj/anomaly/cooler/two_and_two = "Холодильник - аномалия охлаждающая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния. Взводятся лишь мобом.", - /obj/anomaly/cooler/three_and_three = "Холодильник - аномалия охлаждающая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния. Взводятся лишь мобом." - + /obj/anomaly/cooler/three_and_three = "Холодильник - аномалия охлаждающая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния. Взводятся лишь мобом.", + /obj/anomaly/tramplin = "Трамплин - аномалия швыряющая вещи и мобов находящиеся на её турфе. Не может сдвинуть меха." ) var/help_text = {"\ ********* Build Mode: Areas ******** diff --git a/mods/anomaly/code/anomaly_controller.dm b/mods/anomaly/code/anomaly_controller.dm index 20afaf90548a5..14a9c1991d2db 100644 --- a/mods/anomaly/code/anomaly_controller.dm +++ b/mods/anomaly/code/anomaly_controller.dm @@ -4,21 +4,67 @@ PROCESSING_SUBSYSTEM_DEF(anom) priority = SS_PRIORITY_DEFAULT init_order = SS_INIT_DEFAULT flags = SS_BACKGROUND + wait = 3 //Каждые три тика - var/list/all_anomalies = list() - var/anomalies_ammount_in_world = 0 - var/added_ammount = 0 + //[ВЫВОДИМАЯ СТАТИСТИКА] + ///Список всех ЯДЕР аномалий + var/list/all_anomalies_cores = list() + ///Список всех ВСПОМОГАТЕЛЬНЫХ ЧАСТЕЙ + var/list/all_anomalies_helpers = list() + ///Количество ядер + var/anomalies_cores_in_world_amount = 0 + ///Количество вспомогательных частей + var/anomalies_helpers_in_world_amount = 0 + ///Количество спавнов аномалий + var/spawn_ammount = 0 + ///Количество удалений. Помогает определить эффективность генератора аномалий var/removed_ammount = 0 + ///Количество процессингов + var/processing_ammount = 0 + + + + //ПОСЛЕДНИЕ ФРАЗЫ + var/last_attacked_message + var/gibbed_last_message + + + + //[ИНФА ПО АРТЕФАКТАМ] + ///Количество артефактов, успешно собранные игроками + var/collected_artefacts_by_player = 0 + var/earned_cargo_points = 0 + var/earned_rnd_points = 0 + var/list/artefacts_list_in_world = list() + var/artefacts_deleted_by_game = 0 + var/artefacts_spawned_by_game = 0 + var/interactions_with_artefacts_by_players_ammount = 0 + var/bad_interactions_with_artefacts_by_players_ammount = 0 + var/good_interactions_with_artefacts_by_players_ammount = 0 + + + + //[ИНФА ПО АНОМАЛИЯМ] + ///Количество ударов электры по гуманоидам и подобным + var/anomalies_activated_times = 0 + var/humanoids_effected_by_anomaly = 0 + var/humanoids_gibbed_by_anomaly = 0 + var/simplemobs_effected_by_anomaly = 0 + var/simplemobs_gibbed_by_anomaly = 0 + + var/list/important_logs = list() /datum/controller/subsystem/processing/anom/UpdateStat(time) if (PreventUpdateStat(time)) return ..() ..({"\ - anomalies in world: [anomalies_ammount_in_world] \ - added times: [added_ammount] \ - removed timest: [removed_ammount] \ + anomalies in world: [anomalies_cores_in_world_amount] \ + anomaly helpers in world: [anomalies_helpers_in_world_amount] \ + spawned times: [spawn_ammount] \ + removed times: [removed_ammount] \ + objects in processing: [processing_ammount] "}) /datum/controller/subsystem/processing/anom/Initialize(start_uptime) @@ -27,12 +73,109 @@ PROCESSING_SUBSYSTEM_DEF(anom) /datum/controller/subsystem/processing/anom/proc/anomalies_init() -/datum/controller/subsystem/processing/anom/proc/add_anomaly_in_list(obj/anomaly/input) - LAZYADD(all_anomalies, input) - added_ammount++ - anomalies_ammount_in_world++ +/datum/controller/subsystem/processing/anom/proc/add_anomaly_in_cores(obj/anomaly/input) + LAZYADD(all_anomalies_cores, input) + spawn_ammount++ + anomalies_cores_in_world_amount++ + +/datum/controller/subsystem/processing/anom/proc/remove_anomaly_from_cores(obj/anomaly/input) + LAZYREMOVE(all_anomalies_cores, input) + removed_ammount++ + anomalies_cores_in_world_amount-- + -/datum/controller/subsystem/processing/anom/proc/remove_anomaly_from_list(obj/anomaly/input) - LAZYREMOVE(all_anomalies, input) +/datum/controller/subsystem/processing/anom/proc/add_anomaly_in_helpers(obj/anomaly/input) + LAZYADD(all_anomalies_helpers, input) + spawn_ammount++ + anomalies_helpers_in_world_amount++ + +/datum/controller/subsystem/processing/anom/proc/remove_anomaly_from_helpers(obj/anomaly/input) + LAZYREMOVE(all_anomalies_helpers, input) removed_ammount++ - anomalies_ammount_in_world-- + anomalies_helpers_in_world_amount-- + + + +/datum/controller/subsystem/processing/anom/proc/give_gameover_text() + if(SSanom.spawn_ammount > 0) + var/anomaly_text + anomaly_text += "


ANOMALY MOD STATISTIC." + anomaly_text += "
Количество аномалий на момент окончания раунда: [anomalies_cores_in_world_amount]. Мод размещал аномалии [spawn_ammount] раз, а удалял [removed_ammount] раз." + //Арты + anomaly_text += "
Игра заспавнила [artefacts_spawned_by_game] артефактов, из них [artefacts_deleted_by_game] удалено. Собрано игроками артефактов: [collected_artefacts_by_player]. Всего артефактов на конец раунда: [LAZYLEN(artefacts_list_in_world)]" + anomaly_text += "
Заработано каргопоинтов за продажу артефактов: [earned_cargo_points], заработано РНД поинтов за изучение артефактов: [earned_rnd_points]" + anomaly_text += "
Всего попыток взаимодействия с артефактами: [interactions_with_artefacts_by_players_ammount], из них [good_interactions_with_artefacts_by_players_ammount] принесли пользу, а [bad_interactions_with_artefacts_by_players_ammount] принесли вред." + //Сработало аномок + //Электра + anomaly_text += "
Аномалии были взведены [anomalies_activated_times] раз. В целом, игроки подверглись влиянию аномалий [humanoids_effected_by_anomaly] раз, а [humanoids_gibbed_by_anomaly] игроков были гибнуты. [simplemobs_effected_by_anomaly] симплмобов подверглись влиянию аномалий и [simplemobs_gibbed_by_anomaly] было гибнуто." + //Раненные, умершие, гибнутые + if(last_attacked_message) + anomaly_text += "
[last_attacked_message]." + else + anomaly_text += "
Никто не пострадал от аномалий." + + if(gibbed_last_message) + anomaly_text += "
[gibbed_last_message]." + else + anomaly_text += "
Никого не порвало от аномалии." + return anomaly_text + +/datum/controller/subsystem/processing/anom/proc/add_last_attack(mob/living/user, attack_name) + if(!ishuman(user) && !isrobot(user)) + SSanom.simplemobs_effected_by_anomaly++ + return FALSE + SSanom.humanoids_effected_by_anomaly++ + if(last_attacked_message) + return FALSE //У нас уже всё записано + + var/result_text = "Первым от аномалии пострадал [user.ckey]," + //генерируем текст причины атаки + if(attack_name == "Электра") + result_text += "он получил мощный электроудар." + else if(attack_name == "Жарка") + result_text += "его сильно обожгло." + else if(attack_name == "Вспышка") + result_text += "его сильно ослепило и дезеориентировало." + else if(attack_name == "Рвач") + result_text += "ему оторвало конечность." + else if(attack_name == "Трамплин") + result_text += "его с силой швырнуло." + //а теперь генерируем последние сказанные им слова + if(user.mind.last_words) + result_text += "Перед этим он сказал: [user.mind.last_words]" + else + result_text += "Он пострадал молча." + + last_attacked_message = result_text + +/datum/controller/subsystem/processing/anom/proc/add_last_gibbed(mob/living/user, attack_name) + if(!ishuman(user) && !isrobot(user)) + SSanom.simplemobs_gibbed_by_anomaly++ + return FALSE + SSanom.humanoids_gibbed_by_anomaly++ + if(gibbed_last_message) + return FALSE //У нас уже всё записано + if(!user.ckey && !user.last_ckey) + return FALSE + + var/victim_ckey + if(!user.ckey) + victim_ckey = user.last_ckey + else + victim_ckey = user.ckey + + var/result_text = "Первым гибнуло [victim_ckey]." + //генерируем текст причины атаки + if(attack_name == "Электра") + result_text += "его испепелило до костей электроударом." + else if(attack_name == "Жарка") + result_text += "его сожгло до костей огнём." + else if(attack_name == "Рвач") + result_text += "его разорвало на куски гравианомалией." + + if(user.mind.last_words) + result_text += "его последние слова: [user.mind.last_words]" + else + result_text += "Он покинул этот мир молча." + + gibbed_last_message = result_text diff --git a/mods/anomaly/code/anomaly_defines.dm b/mods/anomaly/code/anomaly_defines.dm new file mode 100644 index 0000000000000..a568fb7394237 --- /dev/null +++ b/mods/anomaly/code/anomaly_defines.dm @@ -0,0 +1,4 @@ +#define LONG_ANOMALY_EFFECT 2 +#define MOMENTUM_ANOMALY_EFFECT 1 +#define isanomaly(A) istype(A, /obj/anomaly) +#define isanomalyhere(A) locate(/obj/anomaly) in A diff --git a/mods/anomaly/code/anomaly_light.dm b/mods/anomaly/code/anomaly_light.dm deleted file mode 100644 index f14abb69c8643..0000000000000 --- a/mods/anomaly/code/anomaly_light.dm +++ /dev/null @@ -1,18 +0,0 @@ -//Отвечает за вспышки и свет от аномалии -/obj/anomaly - ///Сделать вспышку после активации? - var/light_after_activation = FALSE - ///Время, которое будет держаться свет от активации - var/time_of_light = 1 SECOND - ///Цвет вспышки - var/color_of_light = COLOR_WHITE - var/range_of_light = 3 - var/power_of_light = 2 - -///Запускаем свет/вспышку -/obj/anomaly/proc/start_light() - set_light(3, 2, color_of_light) - addtimer(new Callback(src, PROC_REF(stop_light)), time_of_light) - -/obj/anomaly/proc/stop_light() - set_light(0) diff --git a/mods/anomaly/code/artifacts/anomaly_artifacts.dm b/mods/anomaly/code/artefacts/_anomaly_artefacts.dm similarity index 52% rename from mods/anomaly/code/artifacts/anomaly_artifacts.dm rename to mods/anomaly/code/artefacts/_anomaly_artefacts.dm index 8281a2f3e4ba3..e80db411c8967 100644 --- a/mods/anomaly/code/artifacts/anomaly_artifacts.dm +++ b/mods/anomaly/code/artefacts/_anomaly_artefacts.dm @@ -2,20 +2,23 @@ name = "Что-то." desc = "Какой-то камень." icon = 'mods/anomaly/icons/artifacts.dmi' - ///Текущее количество энергии, которое хранит артефакт + ///Текущее количество энергии, которое хранит артефакт. var/stored_energy = 1000 - ///Максимальное количество ЭНЕРГИИ, которое хранит артефакт - var/max_stored_energy = 1000 + ///Максимальное количество ЭНЕРГИИ, которое хранит артефакт. + var/max_energy = 1000 var/cargo_price = 100 var/rnd_points = 2000 - var/can_be_throwed = FALSE var/obj/machinery/urm/stored_in_urm + var/mob/living/carbon/human/current_user /obj/item/artefact/use_tool(obj/item/item, mob/living/user, list/click_params) . = ..() if(istype(item, /obj/item/collector)) collector_interaction(item, user) +/obj/item/artefact/is_damage_immune() + return TRUE + /obj/item/artefact/proc/collector_interaction(obj/item/collector, mob/living/user) if(inmech_sec(user)) to_chat(user, SPAN_WARNING("Вы недотягиваетесь.")) @@ -47,61 +50,40 @@ else if(!connected_to_anomaly) input_collector.try_insert_artefact(user, src) +//Все артефакты нельзя уничтожить взрывом. /obj/item/artefact/ex_act(severity) return -/obj/item/artefact/throw_at(atom/target, range, speed, mob/thrower, spin, datum/callback/callback) - if(!can_be_throwed) - react_at_throw() - . = ..() - -///Вызывается для реагирования артефакта на тот факт, что им швыряются -/obj/item/artefact/proc/react_at_throw(atom/target, range, speed, mob/thrower, spin, datum/callback/callback) +///Добавляет указанное количество энергии к артефакту +/obj/item/artefact/proc/add_energy(amount) + stored_energy += amount + if(stored_energy >= max_energy) + react_at_max_energy() + stored_energy = clamp(stored_energy, 0, max_energy) + energy_changed() + +///Отнимает указанное количество энергии от артефакта +/obj/item/artefact/proc/sub_energy(amount) + stored_energy -= amount + if(stored_energy <= max_energy) + react_at_min_energy() + stored_energy = clamp(stored_energy, 0, max_energy) + +///Вызывается, когда энергия артефакта достигает своих минимальных значений +/obj/item/artefact/proc/react_at_min_energy() return -/obj/item/artefact/proc/react_to_touched(mob/living/user) +///Вызывается, когда энергия артефакта достигает своих максимальных значений +/obj/item/artefact/proc/react_at_max_energy() return -/obj/item/artefact/emp_act(severity) - . = ..() - react_to_emp() - -/obj/item/artefact/proc/react_to_emp() +///Энергия артефакта как-то изменилась +/obj/item/artefact/proc/energy_changed() return -/obj/item/artefact/pickup(mob/user) - . = ..() - if(!is_processing) - START_PROCESSING(SSanom, src) - -/obj/item/artefact/proc/react_to_remove_from_collector() - if(!is_processing) - START_PROCESSING(SSanom, src) - -/obj/item/artefact/proc/react_to_insert_in_collector() - if(is_processing) - STOP_PROCESSING(SSanom, src) - /obj/item/artefact/proc/delete_artefact() if(is_processing) - STOP_PROCESSING(SSanom, src) + stop_process_by_ssanom() + SSanom.artefacts_deleted_by_game++ + LAZYREMOVE(SSanom.artefacts_list_in_world , src) qdel(src) - - -//Жар -/obj/item/artefact/zjar - name = "Something" - desc = "При поднятии вы чувствуете, словно по вашему телу распростаняется приятное тепло." - icon_state = "fire_ball" - -//Грави -/obj/item/artefact/gravi - name = "Something" - desc = "При поднятии вы чувствуете, словно сам воздух вокруг вас становится плотнее." - icon_state = "gravi" - -//Светлячок -/obj/item/artefact/svetlyak - name = "Something" - desc = "Невероятно яркий, вы с трудом смотрите на него даже с зажмуренными глазами." - icon_state = "svetlyak" diff --git a/mods/anomaly/code/artefacts/_artefact_external_interact.dm b/mods/anomaly/code/artefacts/_artefact_external_interact.dm new file mode 100644 index 0000000000000..26a3ccbb4bf1d --- /dev/null +++ b/mods/anomaly/code/artefacts/_artefact_external_interact.dm @@ -0,0 +1,122 @@ +/* +Просчитывание реакций артефактов + +Пример применения в коде: + + var/list/result_effects = calculate_artefact_reaction(src, "ЭМИ") <- здесь, мы получаем весь список реакций артефактов в инвентаре персонажа на событие (ЭМИ/Взрыв/Падение и прочие, вы всегда можете добавить своё!) + if(result_effects) <- Всегда проверяйте, что вам не выдало null + if(result_effects.Find("Защищает от ЭМИ")) <- Теперь, ищем нужную нам реакцию на событие. + return <- + + + +*/ +///В случае применения выдаёт список реакций артефактов внутри моба +/proc/calculate_artefact_reaction(mob/living/user, anomaly_type) +//Используем общий для всех участок кода по реакции артефакта на событие + var/list/detected_artefacts_in_victim = generate_artefacts_in_mob_list(user) + if(!LAZYLEN(detected_artefacts_in_victim)) + return FALSE + var/list/result_effects = list() //Весь список эффектов возникший при ударе + //Электровоздействие(Электра) + if(anomaly_type == "Электра") + for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim) + LAZYADD(result_effects, choosed_artefact.react_at_electra(user)) + return result_effects + //Воздействие трамплина(Кидание) + else if(anomaly_type == "Трамплин") + for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim) + LAZYADD(result_effects, choosed_artefact.react_at_tramplin(user)) + return result_effects + //Воздействие вспышки(Ослепление) + else if(anomaly_type == "Вспышка") + for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim) + LAZYADD(result_effects, choosed_artefact.react_at_vspishka(user)) + return result_effects + else if(anomaly_type == "Гиб Рвача") + for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim) + LAZYADD(result_effects, choosed_artefact.react_at_rvach_gib(user)) + return result_effects + else if(anomaly_type == "ЭМИ") + for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim) + LAZYADD(result_effects, choosed_artefact.react_at_emp_on_user(user)) + return result_effects + else if(anomaly_type == "Падение с высоты") + for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim) + LAZYADD(result_effects, choosed_artefact.react_at_failing(user)) + return result_effects + else if(anomaly_type == "Возможность упасть") + for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim) + LAZYADD(result_effects, choosed_artefact.react_at_can_fall(user)) + return result_effects + +/proc/generate_artefacts_in_mob_list(mob/living/user) + if(!istype(user, /mob/living)) + return + var/list/output_artefacts = list() + for(var/obj/item/artefact/picked_artefact in user.get_contents()) + if(!picked_artefact.artefact_in_collector()) + LAZYADD(output_artefacts, picked_artefact) + return output_artefacts + +/obj/item/artefact/proc/artefact_in_collector() + if(istype(loc, /obj/item/collector)) + return TRUE + else + return FALSE + + +/obj/item/artefact/proc/react_at_electra(mob/living/user) + return + +/obj/item/artefact/proc/react_at_tramplin(mob/living/user) + return + +/obj/item/artefact/proc/react_at_vspishka(mob/living/user) + return + +/obj/item/artefact/proc/react_at_rvach_gib(mob/living/user) + return + +/obj/item/artefact/proc/react_at_emp_on_user(mob/living/user) + return + +/obj/item/artefact/proc/react_at_failing(mob/living/user) + return + +/obj/item/artefact/proc/react_at_can_fall(mob/living/user) + return + +/mob/living/emp_act(severity) + var/list/result_effects = calculate_artefact_reaction(src, "ЭМИ") + if(result_effects) + if(result_effects.Find("Защищает от ЭМИ")) + return + . = ..() + +/obj/item/artefact/throw_at(atom/target, range, speed, mob/thrower, spin, datum/callback/callback) + react_at_throw() + . = ..() + update_current_user() + +///Вызывается для реагирования артефакта на тот факт, что им швыряются +/obj/item/artefact/proc/react_at_throw(atom/target, range, speed, mob/thrower, spin, datum/callback/callback) + return + +/obj/item/artefact/proc/react_to_touched(mob/living/user) + return + +/obj/item/artefact/emp_act(severity) + . = ..() + react_at_emp() + +/obj/item/artefact/proc/react_at_emp() + return + +/obj/item/artefact/proc/react_to_remove_from_collector() + if(!is_processing) + start_process_by_ssanom() + +/obj/item/artefact/proc/react_to_insert_in_collector() + if(is_processing) + stop_process_by_ssanom() diff --git a/mods/anomaly/code/artefacts/_artefact_processing.dm b/mods/anomaly/code/artefacts/_artefact_processing.dm new file mode 100644 index 0000000000000..e7afb603aa825 --- /dev/null +++ b/mods/anomaly/code/artefacts/_artefact_processing.dm @@ -0,0 +1,88 @@ +/obj/item/artefact + ///КД на проверку валидности носителя в случае если носителя нет + var/user_long_check_cooldown = 3 SECONDS + var/last_long_user_check = 0 + ///КД на проверку валидности носителя в случае если носитель есть + var/user_check_cooldown = 2 SECONDS + var/last_user_check = 0 + ///Артефакт нуждается в постоянной обработке? + var/need_to_process = FALSE + ///КД на влияние артефакта на носителя + var/process_effect_cooldown = 0.5 SECONDS + var/last_process_effect = 0 + + var/additional_process_cooldown = 20 SECONDS + var/last_additional_process = 0 + +/obj/item/artefact/Initialize() + . = ..() + user_long_check_cooldown = rand(3 SECONDS, 6 SECONDS) + user_check_cooldown = rand(2 SECONDS, 4 SECONDS) + additional_process_cooldown = rand(20 SECONDS, 50 SECONDS) + start_process_by_ssanom() + +//Артефакт процессится абсолютно всегда в силу того что невозможно без изменения кор кода предотвратить ситуации, когда артефакт +//Не влият на носителя, например при скидывании на пол и поднятии рюкзака обратно (Как сообщить артефакту о этм событии? Срать в код.) +/obj/item/artefact/Process() + if(world.time - last_long_user_check >= user_long_check_cooldown) + last_long_user_check = world.time + additional_process() + if(connected_to_anomaly) + return + //Если носителя нет, то через большой промежуток времени проверим - вдруг нас кто-то всё таки взял? + if(!current_user) + if(world.time - last_long_user_check >= user_long_check_cooldown) + last_long_user_check = world.time + for(var/mob/living/user in get_turf(src)) + if(src in user.get_contents()) + update_current_user(user) + //Если носитель есть, то через более мелкий промежуток времени проверим, что носитель нас ещё носит + else if(current_user) + if(world.time - last_user_check >= user_check_cooldown) + last_user_check = world.time + update_current_user() + if(world.time - last_process_effect <= process_effect_cooldown) + return + process_artefact_effect_to_user() + +/* +Дополнительный процессинг для доп фич. Обычно не используется. +Позволяет легко добавлять новые свойства процессингу не изменяя ядро +*/ +/obj/item/artefact/proc/additional_process() + return + +/obj/item/artefact/proc/process_artefact_effect_to_user() + return + + +//Добавляем и убираем ВЛАДЕЛЬЦЕВ(кто имеем в рюкзаке арт) +/obj/item/artefact/pickup(mob/living/user) + .=..() + update_current_user(user) + +/obj/item/artefact/dropped(mob/user) + .=..() + update_current_user(user) + + +/obj/item/artefact/proc/update_current_user(mob/living/user) + // В случае перемещения предмета между contents или подбора, обновляет своего ПОЛЬЗОВАТЕЛЯ + if(current_user) //Юзер уже есть, + if(get_turf(current_user) != get_turf(src)) //проверяем, + current_user = null + else if(!current_user) + current_user = user + + +/obj/item/artefact/proc/start_process_by_ssanom() + if(!is_processing) + START_PROCESSING(SSanom, src) + SSanom.processing_ammount++ + + +/obj/item/artefact/proc/stop_process_by_ssanom() + if(is_processing) + STOP_PROCESSING(SSanom, src) + if(SSanom.processing_ammount > 0) + SSanom.processing_ammount-- diff --git a/mods/anomaly/code/artifacts/anomaly_artifact_spawn.dm b/mods/anomaly/code/artefacts/_artefact_spawn.dm similarity index 82% rename from mods/anomaly/code/artifacts/anomaly_artifact_spawn.dm rename to mods/anomaly/code/artefacts/_artefact_spawn.dm index 230665c73eb07..52f5de4f5146b 100644 --- a/mods/anomaly/code/artifacts/anomaly_artifact_spawn.dm +++ b/mods/anomaly/code/artefacts/_artefact_spawn.dm @@ -1,6 +1,6 @@ /obj/anomaly ///Аномалия может "Рожать" артефакты? - var/can_born_artifacts = FALSE + var/can_born_artefacts = FALSE //ANOTHER ///Какие артефакты порождает аномалия. Справа пишем шанс выбора этого артефакта. var/list/artefacts = list() @@ -9,20 +9,20 @@ var/artefact_spawn_chance = 25 -/obj/anomaly/proc/try_born_artifact() +/obj/anomaly/proc/try_born_artefact() //Может ли аномалия спавнить артефакты - if(can_born_artifacts && !check_artifacts_in_anomaly()) - born_artifact() + if(can_born_artefacts && !check_artifacts_in_anomaly()) + born_artefact() return TRUE else return FALSE ///Функция спавнит артефакт на территории аномалии -/obj/anomaly/proc/born_artifact() +/obj/anomaly/proc/born_artefact() var/obj/artefact = pickweight(artefacts) if(artefact) - born_artifact_in_random_title(artefact) + born_artefact_in_random_title(artefact) ///Функция проверяет, есть ли на территории аномалии артефакты /obj/anomaly/proc/check_artifacts_in_anomaly() @@ -52,7 +52,7 @@ ///Создаёт артефакт в случайном тайтле аномалии, включая вспомогательные -/obj/anomaly/proc/born_artifact_in_random_title() +/obj/anomaly/proc/born_artefact_in_random_title() var/list/possible_places = list() LAZYADD(possible_places, src.loc) if(multitile) @@ -62,4 +62,7 @@ var/result = pick(possible_places) if(LAZYLEN(artefacts)) var/artifact = pick(artefacts) - new artifact(result) + var/obj/item/artefact/spawned_artefact = new artifact(result) + spawned_artefact.connected_to_anomaly = TRUE + LAZYADD(SSanom.artefacts_list_in_world ,spawned_artefact) + SSanom.artefacts_spawned_by_game++ diff --git a/mods/anomaly/code/artifacts/interact_with_artefacts.dm b/mods/anomaly/code/artefacts/_interact_with_artefacts.dm similarity index 75% rename from mods/anomaly/code/artifacts/interact_with_artefacts.dm rename to mods/anomaly/code/artefacts/_interact_with_artefacts.dm index d4b71c5e90e82..a22ad22c1c595 100644 --- a/mods/anomaly/code/artifacts/interact_with_artefacts.dm +++ b/mods/anomaly/code/artefacts/_interact_with_artefacts.dm @@ -1,5 +1,5 @@ /obj/item/artefact - var/connected_to_anomaly = TRUE + var/connected_to_anomaly = FALSE ///Здесь будет лист взаимодействий, но который артефакт всё таки реагирует var/list/rect_to_interactions = list() var/turf/prev_loc @@ -17,11 +17,13 @@ else if(connected_to_anomaly) if(AnomaliesAmmountInTurf(get_turf(src)) == 0) connected_to_anomaly = FALSE + SSanom.collected_artefacts_by_player++ else for(var/obj/anomaly/anomka in src.loc.contents) if(prob(25 * user.get_skill_value(SKILL_SCIENCE))) to_chat(user, SPAN_GOOD("[desc]")) connected_to_anomaly = FALSE + SSanom.collected_artefacts_by_player++ else to_chat(user, SPAN_WARNING("Обьект уплывает из ваших рук")) if(istype(anomka, /obj/anomaly/part)) @@ -57,7 +59,8 @@ var/choosed_interaction = input(usr, "What to do","It's time to chose") as null|anything in interaction_variations if(!user.Adjacent(src)) return FALSE - if(choosed_interaction == "Lick" && rect_to_interactions.Find(choosed_interaction)) + SSanom.interactions_with_artefacts_by_players_ammount++ + if(choosed_interaction == "Lick") if(!ishuman(user)) to_chat(user, SPAN_NOTICE("У меня нет рта, но я должен кричать.")) return @@ -66,12 +69,16 @@ if(blocked) to_chat(user, SPAN_NOTICE("Мой рот закрыт, я не могу лизнуть его.")) return + user.visible_message(SPAN_NOTICE("[user] лизнул [src].")) + to_chat(user, SPAN_NOTICE("Вы лизнули [src].")) lick_interaction(user) return - else if(choosed_interaction == "Shake" && rect_to_interactions.Find(choosed_interaction)) + else if(choosed_interaction == "Shake") + user.visible_message(SPAN_NOTICE("[user] потряс [src].")) + to_chat(user, SPAN_NOTICE("Вы потрясли [src].")) shake_interaction(user) return - else if(choosed_interaction == "Bite" && rect_to_interactions.Find(choosed_interaction)) + else if(choosed_interaction == "Bite") if(!ishuman(user)) to_chat(user, SPAN_NOTICE("У меня нет рта, но я должен кричать.")) return @@ -80,18 +87,25 @@ if(blocked) to_chat(user, SPAN_NOTICE("Мой рот закрыт, я не могу укусить его.")) return + user.visible_message(SPAN_NOTICE("[user] укусил [src].")) + to_chat(user, SPAN_NOTICE("Вы укусили [src].")) bite_interaction(user) return - else if(choosed_interaction == "Knock" && rect_to_interactions.Find(choosed_interaction)) + else if(choosed_interaction == "Knock") + user.visible_message(SPAN_NOTICE("[user] постучал по [src].")) + to_chat(user, SPAN_NOTICE("Вы стучите по [src].")) knock_interaction(user) return - else if(choosed_interaction == "Compress" && rect_to_interactions.Find(choosed_interaction)) + else if(choosed_interaction == "Compress") + user.visible_message(SPAN_NOTICE("[user] сжал [src].")) + to_chat(user, SPAN_NOTICE("Вы сжимаете [src].")) compress_interaction(user) return - else if(choosed_interaction == "Rub" && rect_to_interactions.Find(choosed_interaction)) + else if(choosed_interaction == "Rub") + user.visible_message(SPAN_NOTICE("[user] потёр [src].")) + to_chat(user, SPAN_NOTICE("Вы терёте [src].")) rub_interaction(user) return - to_chat(user, SPAN_NOTICE("Ничего не произошло.")) ///ВЗАИМОДЕЙСТВИЯ ОТ ЛЮДЕЙ НАПРЯМУЮ diff --git a/mods/anomaly/code/artefacts/artefact_flyer.dm b/mods/anomaly/code/artefacts/artefact_flyer.dm new file mode 100644 index 0000000000000..bb5e9ea192568 --- /dev/null +++ b/mods/anomaly/code/artefacts/artefact_flyer.dm @@ -0,0 +1,89 @@ +/obj/item/artefact/flyer + name = "Something" + desc = "Обьект абсолютно невесом, выглядит как какой-то плотный кусок воздуха." + icon_state = "flyer" + need_to_process = TRUE + //В артефакте нет энергии/она неограничена + rect_to_interactions = list( + "Lick", + "Shake", + "Bite", + "Knock", + "Compress", + "Rub" + ) + stored_energy = 0 + max_energy = 0 + cargo_price = 1500 + rnd_points = 7000 + need_to_process = TRUE + +/obj/item/artefact/flyer/lick_interaction(mob/living/carbon/human/user) + to_chat(user,SPAN_NOTICE("На вкус как воздух.")) + +/obj/item/artefact/flyer/shake_interaction(mob/living/carbon/human/user) + if(isrobot(user)) + to_chat(user,SPAN_NOTICE("При тряске вы на мгновение отпускаете обьект, и тот зависает в воздухе.")) + else + to_chat(user,SPAN_GOOD("При тряске вы на мгновение отпускаете обьект, и тот зависает в воздухе, словно застряв в нём.")) + + + + +/obj/item/artefact/flyer/bite_interaction(mob/living/carbon/human/user) + to_chat(user,SPAN_NOTICE("Материя словно раступается перед вашими зубами.")) + +/obj/item/artefact/flyer/knock_interaction(mob/living/carbon/human/user) + to_chat(user,SPAN_NOTICE("Стукнув по нему рукой, тот упрыгивает из ваших рук.")) + //jump_away() TODO + +/obj/item/artefact/flyer/compress_interaction(mob/living/carbon/human/user) + if(isrobot(user)) + to_chat(user,SPAN_NOTICE("Обьект легко сдавливается, превращаясь в мини шарик, но после моментально возвращает свою форму.")) + else + to_chat(user,SPAN_NOTICE("Обьект легко сдавливается, превращаясь в мини шарик, но после моментально возвращает свою форму. Очень мягкий по ощущениям.")) + +/obj/item/artefact/flyer/rub_interaction(mob/living/carbon/human/user) + if(isrobot(user)) + to_chat(user,SPAN_NOTICE("Обьект не реагирует.")) + else + to_chat(user,SPAN_NOTICE("Ощущения словно водишь рукой по воздуху.")) + +/obj/item/artefact/flyer/urm_radiation(mob/living/user) + return "Обьект не реагирует" + +/obj/item/artefact/flyer/urm_laser(mob/living/user) + return "Обьект не реагирует" + +/obj/item/artefact/flyer/urm_electro(mob/living/user) + return "Обьект не реагирует" + +/obj/item/artefact/flyer/urm_plasma(mob/living/user) + return "Обьект не реагирует" + +/obj/item/artefact/flyer/urm_phoron(mob/living/user) + return "Обьект не реагирует" + + + +/obj/item/artefact/flyer/process_artefact_effect_to_user() + if(current_user.stamina < 85) + current_user.adjust_stamina(5) + +/mob/living/carbon/human/can_fall(anchor_bypass, turf/location_override) + var/list/result_effects = calculate_artefact_reaction(src, "Возможность упасть") + if(result_effects) + if(result_effects.Find("Держит в воздухе")) + return + .=..() + + +/obj/item/artefact/flyer/react_at_tramplin(mob/living/user) + . = ..() + return "Усиливает дальность полёта" + +/obj/item/artefact/flyer/react_at_rvach_gib(mob/living/user) + return "Усиливает дальность полёта" + +/obj/item/artefact/flyer/react_at_can_fall(mob/living/user) + return "Держит в воздухе" diff --git a/mods/anomaly/code/artifacts/artefact_gravi.dm b/mods/anomaly/code/artefacts/artefact_gravi.dm similarity index 50% rename from mods/anomaly/code/artifacts/artefact_gravi.dm rename to mods/anomaly/code/artefacts/artefact_gravi.dm index 3874634bd20fa..f8131b7b613f2 100644 --- a/mods/anomaly/code/artifacts/artefact_gravi.dm +++ b/mods/anomaly/code/artefacts/artefact_gravi.dm @@ -1,7 +1,9 @@ /obj/item/artefact/gravi name = "Something" - desc = "Вы чувствуете лёгкость." + desc = "При подборе вы чувствуете, как тот сопротивляется вашей руке." icon_state = "gravi" + need_to_process = TRUE + //В артефакте нет энергии/она неограничена rect_to_interactions = list( "Lick", "Shake", @@ -10,12 +12,16 @@ "Compress", "Rub" ) - cargo_price = 75 + stored_energy = 0 + max_energy = 0 + cargo_price = 800 + rnd_points = 5000 + need_to_process = TRUE -/obj/item/artefact/gravi/lick_interaction(mob/living/user) +/obj/item/artefact/gravi/lick_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("На вкус как камень.")) -/obj/item/artefact/gravi/shake_interaction(mob/living/user) +/obj/item/artefact/gravi/shake_interaction(mob/living/carbon/human/user) if(isrobot(user)) to_chat(user,SPAN_NOTICE("Вы не регистрируете чего-либо необычного.")) else @@ -24,19 +30,19 @@ -/obj/item/artefact/gravi/bite_interaction(mob/living/user) +/obj/item/artefact/gravi/bite_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("Ощущается зубами как камень. Ничего необычного.")) -/obj/item/artefact/gravi/knock_interaction(mob/living/user) +/obj/item/artefact/gravi/knock_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("При попытке постучать или ударить, рука словно отпружинивает.")) -/obj/item/artefact/gravi/compress_interaction(mob/living/user) +/obj/item/artefact/gravi/compress_interaction(mob/living/carbon/human/user) if(isrobot(user)) to_chat(user,SPAN_NOTICE("Обьект не поддаётся сдавливанию.")) else to_chat(user,SPAN_NOTICE("Обьект словно камень, вообще не поддаётся сдавливанию.")) -/obj/item/artefact/gravi/rub_interaction(mob/living/user) +/obj/item/artefact/gravi/rub_interaction(mob/living/carbon/human/user) if(isrobot(user)) to_chat(user,SPAN_NOTICE("Обьект не реагирует.")) else @@ -49,7 +55,9 @@ return "Обьект не реагирует" /obj/item/artefact/gravi/urm_electro(mob/living/user) - return "Обьект не реагирует" + stored_in_urm.last_interaction_id = "gravi_jumped_electro" + stored_in_urm.last_interaction_reward = 1000 + return "Обьект отскакивает от места контакта в противоположную сторону." /obj/item/artefact/gravi/urm_plasma(mob/living/user) return "Обьект не реагирует" @@ -65,9 +73,6 @@ - - - /obj/item/artefact/gravi/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(istype(mover, /obj/item/projectile/bullet)) new /obj/item/material/shard/shrapnel/steel(get_turf(src)) @@ -76,7 +81,31 @@ /mob/living/carbon/human/handle_fall_effect(turf/landing) - var/obj/item/artefact/gravi/artefact = locate(/obj/item/artefact/gravi) in src - if (istype(artefact)) - return + var/list/result_effects = calculate_artefact_reaction(src, "Падение с высоты") + if(result_effects) + if(result_effects.Find("Защищает от падения")) + return .=..() + +/obj/item/artefact/gravi/process_artefact_effect_to_user() + if(current_user.stamina < 85) + current_user.adjust_stamina(5) + +//Грави заставляет отлететь в направление, противположное текущее. Так смешнее. +/obj/item/artefact/gravi/react_at_electra(mob/living/user) + . = ..() + var/turf/target_turf = get_turf(user) + var/throw_dir = turn(user.dir, 180) //Противоположное направление моба + for(var/i = 1, i < 2, i++) + target_turf = get_edge_target_turf(user, throw_dir) + user.throw_at(target_turf, 2, 1) + +/obj/item/artefact/gravi/react_at_tramplin(mob/living/user) + . = ..() + return "Не даёт кинуть" + +/obj/item/artefact/gravi/react_at_rvach_gib(mob/living/user) + return "Защищает от гиба рвачом" + +/obj/item/artefact/gravi/react_at_failing(mob/living/user) + return "Защищает от падения" diff --git a/mods/anomaly/code/artifacts/artefact_pruzhina.dm b/mods/anomaly/code/artefacts/artefact_pruzhina.dm similarity index 84% rename from mods/anomaly/code/artifacts/artefact_pruzhina.dm rename to mods/anomaly/code/artefacts/artefact_pruzhina.dm index e34598c029b57..dd64248e2d6db 100644 --- a/mods/anomaly/code/artifacts/artefact_pruzhina.dm +++ b/mods/anomaly/code/artefacts/artefact_pruzhina.dm @@ -11,42 +11,44 @@ "Compress", "Rub" ) - //артефакт обладает зарядами - var/charges = 0 - var/max_charges = 3 stored_energy = 10000 - max_stored_energy = 10000 + max_energy = 10000 + cargo_price = 750 + rnd_points = 3000 var/datum/beam = null //Артефакт скопирован с помощью URM var/copy = FALSE -/obj/item/artefact/pruzhina/lick_interaction(mob/living/user) +/obj/item/artefact/pruzhina/lick_interaction(mob/living/carbon/human/user) + SSanom.bad_interactions_with_artefacts_by_players_ammount++ to_chat(user,SPAN_NOTICE("Как только вы подносите язык чуть ближе, вы чувствуете острую боль в нём, словно от проводов.")) user.electoanomaly_act(25, src, BP_HEAD) + sub_energy(50) -/obj/item/artefact/pruzhina/shake_interaction(mob/living/user) +/obj/item/artefact/pruzhina/shake_interaction(mob/living/carbon/human/user) if(isrobot(user)) to_chat(user,SPAN_NOTICE("Ваши внешние сенсоры регистристрируют усиление электромагнитного поля.")) else to_chat(user,SPAN_GOOD("Потреся обьект, вы чувствуете, как тот начинает щёлкать и словно оживать. Чувствуете нечто, подобное мурчанию")) - add_charge(user) -/obj/item/artefact/pruzhina/bite_interaction(mob/living/user) +/obj/item/artefact/pruzhina/bite_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("Как только вы ухватываете обьект зубами, вы чувствуете сильнейшую боль.Глупо.")) + sub_energy(100) user.electoanomaly_act(75, src, BP_HEAD) -/obj/item/artefact/pruzhina/knock_interaction(mob/living/user) +/obj/item/artefact/pruzhina/knock_interaction(mob/living/carbon/human/user) angry_activity() -/obj/item/artefact/pruzhina/compress_interaction(mob/living/user) +/obj/item/artefact/pruzhina/compress_interaction(mob/living/carbon/human/user) if(isrobot(user)) to_chat(user,SPAN_NOTICE("При повышении напряжения в сервоприводах вашей конечности регистрируется обратная сила, возвращающая обьект в исходное состояние.")) else to_chat(user,SPAN_NOTICE("Вы чувствуете как артефакт сопротивляется вашей попытке его сжать, словно какое-то поле отталкивает его обратно.")) -/obj/item/artefact/pruzhina/rub_interaction(mob/living/user) - if(charges > 0) - sub_charge(user) +/obj/item/artefact/pruzhina/rub_interaction(mob/living/carbon/human/user) + if(stored_energy > 500) + sub_energy(500) + SSanom.good_interactions_with_artefacts_by_players_ammount++ if(isrobot(user)) to_chat(user,SPAN_NOTICE("Фиксируется электростатическое поле.")) else @@ -62,12 +64,14 @@ return "Обьект не реагирует" /obj/item/artefact/pruzhina/urm_electro(mob/living/user) + add_energy(150) stored_in_urm.last_interaction_id = "pruzhina_eated_electro" stored_in_urm.last_interaction_reward = 1000 return "Зафиксировано как обьект поглотил в себя весь переданный электрический потенциал." /obj/item/artefact/pruzhina/urm_plasma(mob/living/user) if(!copy) + SSanom.good_interactions_with_artefacts_by_players_ammount++ copy = TRUE var/obj/item/artefact/pruzhina/borned_pruzhina = new /obj/item/artefact/pruzhina(get_turf(src)) borned_pruzhina.copy = TRUE @@ -75,6 +79,7 @@ stored_in_urm.last_interaction_reward = 2000 return "При определённой концентрации потока плазмы Обьект начинает бурно реагировать. Он расширяется в обьёмах, пульсирует, и из одного выходит второй, точно такой же." else + SSanom.bad_interactions_with_artefacts_by_players_ammount++ var/obj/anomaly/electra/three_and_three/spawned = new /obj/anomaly/electra/three_and_three/tesla(get_turf(src)) spawned.kill_later(120 SECONDS) delete_artefact() @@ -98,26 +103,9 @@ /obj/item/artefact/pruzhina/react_at_throw(atom/target, range, speed, mob/thrower, spin, datum/callback/callback) create_anomaly_pruzhina(30 SECONDS) -/obj/item/artefact/react_to_emp() - angry_activity() - -/obj/item/artefact/pruzhina/proc/add_charge(mob/living/user) - if(charges >= max_charges) - ubercharge_pruzhina(user) - return FALSE - else - charges++ - return TRUE - -/obj/item/artefact/pruzhina/proc/sub_charge(user) - if(charges <= max_charges) - charges = 0 - return FALSE - else - charges-- - return TRUE /obj/item/artefact/pruzhina/proc/ubercharge_pruzhina(mob/living/user) + SSanom.bad_interactions_with_artefacts_by_players_ammount++ to_chat(user,SPAN_WARNING("Обьект вырывается из ваших рук уже с грозным грохотом и гудением.")) user.drop_item(src) anchored = TRUE @@ -147,6 +135,7 @@ /obj/item/artefact/pruzhina/angry_activity(mob/living/user) to_chat(user,SPAN_WARNING("Вас озарила вспышка.")) + sub_energy(200) var/list/victims = list() var/list/objs_not_used = list() var/turf/T = get_turf(src) @@ -179,3 +168,18 @@ /obj/item/cell/pruzhina/emp_act(severity) SHOULD_CALL_PARENT(FALSE) return + +//Пружина раздаст всем вокруг электроудары, если её носитель получит удар +/obj/item/artefact/pruzhina/react_at_electra(mob/living/user) + if(stored_energy > 8500) + angry_activity() + add_energy(1500) + +/obj/item/artefact/pruzhina/react_at_emp_on_user(mob/living/user) + if(stored_energy > 8500) + angry_activity() + add_energy(1500) + return "Защищает от ЭМИ" + +/obj/item/artefact/pruzhina/react_at_emp() + angry_activity() diff --git a/mods/anomaly/code/artifacts/artefact_svetlyak.dm b/mods/anomaly/code/artefacts/artefact_svetlyak.dm similarity index 73% rename from mods/anomaly/code/artifacts/artefact_svetlyak.dm rename to mods/anomaly/code/artefacts/artefact_svetlyak.dm index 8690e4ef1c727..f046710ad4952 100644 --- a/mods/anomaly/code/artifacts/artefact_svetlyak.dm +++ b/mods/anomaly/code/artefacts/artefact_svetlyak.dm @@ -11,18 +11,20 @@ "Rub" ) var/activated_fleshka = FALSE - var/current_heat = 0 - cargo_price = 250 + stored_energy = 1000 + max_energy = 1000 + cargo_price = 800 + rnd_points = 5000 /obj/item/artefact/svetlyak/Initialize() . = ..() set_light(5, 5, light_color) -/obj/item/artefact/svetlyak/lick_interaction(mob/living/user) +/obj/item/artefact/svetlyak/lick_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("Ваш язык ничего не ощущает, словно проходит насквозь..")) -/obj/item/artefact/svetlyak/shake_interaction(mob/living/user) +/obj/item/artefact/svetlyak/shake_interaction(mob/living/carbon/human/user) if(activated_fleshka) return if(isrobot(user)) @@ -30,32 +32,27 @@ else to_chat(user,SPAN_GOOD("Потреся обьект, вы видите, как тот начинает то усиливать свечение, то немного ослаблять его.")) activated_fleshka = TRUE - addtimer(new Callback(src, PROC_REF(svetlyak_fleshka)), 5 SECONDS) + addtimer(new Callback(src, PROC_REF(svetlyak_fleshka)), 2 SECONDS) -/obj/item/artefact/svetlyak/bite_interaction(mob/living/user) +/obj/item/artefact/svetlyak/bite_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("Вы не можете ухватиться за обьект зубами, они словно проходят насквозь.")) -/obj/item/artefact/svetlyak/knock_interaction(mob/living/user) +/obj/item/artefact/svetlyak/knock_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("Рука проходит сквозь обьект...")) -/obj/item/artefact/svetlyak/compress_interaction(mob/living/user) +/obj/item/artefact/svetlyak/compress_interaction(mob/living/carbon/human/user) if(isrobot(user)) to_chat(user,SPAN_NOTICE("При попытке сжать конечность обратный отклик не регистрируется, конечность проходит сквозь обьект, но обьект всё ещё остаётся на вашей руке.")) else to_chat(user,SPAN_NOTICE("Вы чувствуете словно ваша рука при попытке сжать обьект проходит сквозь него, но он всё ещё остаётся на руке.")) -/obj/item/artefact/svetlyak/rub_interaction(mob/living/user) +/obj/item/artefact/svetlyak/rub_interaction(mob/living/carbon/human/user) if(isrobot(user)) - to_chat(user,SPAN_NOTICE("Зрительные сенсоры регистрируют ослабление свечения [src].")) + to_chat(user,SPAN_NOTICE("Интенсивность свечения не меняется.")) else - to_chat(user,SPAN_NOTICE("[src] начинает светиться не так ярко, словно успокаиваясь.")) - if(current_heat > 0) - current_heat-- - else if(current_heat == 0) - visible_message(SPAN_BAD("...[src] растворяется на ваших глазах, испустив последнюю, приятную для глаз вспышку."), null, 5) - qdel(src) + to_chat(user,SPAN_NOTICE("Он всё так же светится.")) /obj/item/artefact/svetlyak/urm_radiation(mob/living/user) stored_in_urm.last_interaction_id = "svetlyak_radiation" @@ -64,7 +61,7 @@ /obj/item/artefact/svetlyak/urm_laser(mob/living/user) stored_in_urm.last_interaction_id = "svetlyak_laser" - stored_in_urm.last_interaction_reward = 1000 + stored_in_urm.last_interaction_reward = 2000 return "Зафиксировано как луч продит сквозь обьект с усиленной мощностью." /obj/item/artefact/svetlyak/urm_electro(mob/living/user) @@ -96,12 +93,17 @@ target.flash_eyes(FLASH_PROTECTION_MAJOR) target.Stun(5) target.mod_confused(10) - add_heat() + sub_energy(50) activated_fleshka = FALSE -/obj/item/artefact/svetlyak/proc/add_heat() - current_heat++ - if(current_heat >= 2) - var/obj/anomaly/vspishka/spawned = new /obj/anomaly/vspishka(get_turf(src)) - spawned.kill_later(300 SECONDS) - qdel(src) + +//Он должен передавать удар другому, по цепочке +/obj/item/artefact/svetlyak/react_at_electra(mob/living/user) + if(stored_energy > 250) + sub_energy(250) + return "Уворачивается от молнии, молния идёт дальше" + else + return "Ничего" + +/obj/item/artefact/svetlyak/react_at_vspishka(mob/living/user) + return "Защищает от ослепления" diff --git a/mods/anomaly/code/artifacts/artefact_zjar.dm b/mods/anomaly/code/artefacts/artefact_zjar.dm similarity index 51% rename from mods/anomaly/code/artifacts/artefact_zjar.dm rename to mods/anomaly/code/artefacts/artefact_zjar.dm index 0f1393d15d1ee..4ec786f2f5af3 100644 --- a/mods/anomaly/code/artifacts/artefact_zjar.dm +++ b/mods/anomaly/code/artefacts/artefact_zjar.dm @@ -1,6 +1,8 @@ /obj/item/artefact/zjar name = "Something" + icon_state = "fire_ball" desc = "Тепло растекается по вашим рукам, от одного лишь вида вам становится теплее." + need_to_process = TRUE rect_to_interactions = list( "Lick", "Shake", @@ -9,58 +11,72 @@ "Compress", "Rub" ) - //у артефакта 5 "кусков" - var/current_integrity = 5 - //Уже ремонтировался с помощью URM? + stored_energy = 1000 + max_energy = 1500 + cargo_price = 600 + rnd_points = 5000 var/repaired = FALSE - cargo_price = 350 - var/datum/beam = null -/obj/item/artefact/zjar/lick_interaction(mob/living/user) +/obj/item/artefact/zjar/lick_interaction(mob/living/carbon/human/user) if(istype(user, /mob/living/carbon/human )) to_chat(user,SPAN_GOOD("...он...вкусный...по вашему телу растекается тепло.")) user.bodytemperature += 50 -/obj/item/artefact/zjar/shake_interaction(mob/living/user) +/obj/item/artefact/zjar/shake_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("...По ощущениям внутри словно что-то есть, но в тоже время он монолитный...шар...или овал...")) -/obj/item/artefact/zjar/bite_interaction(mob/living/user) +/obj/item/artefact/zjar/bite_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_GOOD("...становится жарко, но голове становится куда легче, думается свободнее и проще.")) - var/mob/living/carbon/victim = user - victim.bodytemperature += 100 - victim.add_chemical_effect(CE_BRAIN_REGEN, 50) - - -/obj/item/artefact/zjar/knock_interaction(mob/living/user) + user.bodytemperature += 100 + sub_energy(100) + //Выдаёт реген мозга, обезбол, стимулятор + user.add_chemical_effect(CE_BRAIN_REGEN, 100) + user.add_chemical_effect(CE_PAINKILLER, 300) + user.add_chemical_effect(CE_STIMULANT, 50) + //Чинит все переломы + var/list/parts = list(BP_HEAD, BP_CHEST, BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT, BP_L_ARM, BP_L_HAND, BP_R_ARM,BP_R_HAND) + for(var/part in parts) + var/obj/item/organ/external/affecting = user.get_organ(part) + if(affecting.status &= ORGAN_BROKEN) + if(affecting.mend_fracture()) + sub_energy(25) + to_chat(user,SPAN_NOTICE("...острая боль в [affecting] проходит...")) + +/obj/item/artefact/zjar/knock_interaction(mob/living/carbon/human/user) if(istype(user, /mob/living/carbon/human )) + sub_energy(50) + SSanom.bad_interactions_with_artefacts_by_players_ammount++ to_chat(user,SPAN_BAD("Похоже, ему это не понравилось, вас неприятно ошпарило.")) user.bodytemperature += 150 user.apply_damage(15, DAMAGE_BURN, user.hand ? BP_L_HAND : BP_R_HAND) -/obj/item/artefact/zjar/compress_interaction(mob/living/user) +/obj/item/artefact/zjar/compress_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_NOTICE("..Как желе, но не желе, очень странные ощущения!")) -/obj/item/artefact/zjar/rub_interaction(mob/living/user) +/obj/item/artefact/zjar/rub_interaction(mob/living/carbon/human/user) to_chat(user,SPAN_GOOD("Тепло, и приятно. Не хочется убирать руки от него.")) /obj/item/artefact/zjar/urm_radiation(mob/living/user) return "Обьект не реагирует" /obj/item/artefact/zjar/urm_laser(mob/living/user) - if(current_integrity > 1) - current_integrity-- + if(stored_energy != 0) + sub_energy(200) + SSanom.bad_interactions_with_artefacts_by_players_ammount++ stored_in_urm.last_interaction_id = "zjar_damaged_by_laser" stored_in_urm.last_interaction_reward = 1500 return "Луч лазера прожигает обьект, явно его повреждая" else delete_artefact() + SSanom.bad_interactions_with_artefacts_by_players_ammount++ stored_in_urm.artefact_inside = null stored_in_urm.last_interaction_id = "zjar_destroyed_by_laser" stored_in_urm.last_interaction_reward = 2500 return "Обьект прожигается на сквозь, после сдувается словно воздушный шар и пропадает." /obj/item/artefact/zjar/urm_electro(mob/living/user) + sub_energy(50) stored_in_urm.last_interaction_id = "zjar_electra" stored_in_urm.last_interaction_reward = 500 return "Электрический удар был полностью поглощён обьектом." @@ -69,14 +85,15 @@ return "Обьект не реагирует" /obj/item/artefact/zjar/urm_phoron(mob/living/user) - if(current_integrity < 5 && !repaired) - current_integrity = 5 + if(stored_energy != max_energy && !repaired) + add_energy(1000) repaired = TRUE stored_in_urm.last_interaction_id = "zjar_repaired" stored_in_urm.last_interaction_reward = 2500 return "Вы наблюдаете, как недостающие часть обьекта, словно отрастают обратно" else if(repaired) delete_artefact() + SSanom.bad_interactions_with_artefacts_by_players_ammount++ stored_in_urm.artefact_inside = null stored_in_urm.last_interaction_id = "zjar_destroyed" stored_in_urm.last_interaction_reward = 3500 @@ -85,12 +102,38 @@ +/obj/item/artefact/zjar/process_artefact_effect_to_user() + if(current_user.bodytemperature < 350) + current_user.bodytemperature = 350 + for(var/thing in current_user.internal_organs) + var/obj/item/organ/internal/I = thing + if(I.damage > 0) + sub_energy(20) + I.heal_damage(rand(1,5)) + -/obj/item/artefact/zjar/Process() //чуть подогреем - for(var/mob/living/carbon/human/victim in get_turf(src)) - victim.heal_organ_damage(0, 6) - if(victim.bodytemperature < 360) - victim.bodytemperature = 360 - for(var/thing in victim.internal_organs) - var/obj/item/organ/internal/I = thing - I.heal_damage(rand(0,1)) +/obj/item/artefact/zjar/react_at_electra(mob/living/user) + if(stored_energy != 0) + sub_energy(100) + visible_message(SPAN_GOOD("[src] вспыхивает красной вспышкой"),,7) + else + delete_artefact() + visible_message(SPAN_BAD("[src] вспыхивает ярчайшей красной вспышкой и пропадает."),,7) + to_chat(current_user, SPAN_GOOD("Вы чувствуете сильный, но приятный ЖАР в месте удара. Но не боль.")) + return "Впитывает электроудар" + +/obj/item/artefact/zjar/react_at_rvach_gib(mob/living/user) + delete_artefact() + visible_message(SPAN_BAD("[src] вспыхивает ярчайшей красной вспышкой и пропадает."),,7) + return "Защищает от гиба" + +/obj/item/artefact/zjar/energy_changed() + if(stored_energy > 1000) + icon_state = icon_state = "fire_ball_active" + else if(stored_energy <= 1000) + icon_state = icon_state = "fire_ball" + +/obj/item/artefact/zjar/additional_process() + var/turf/my_turf = get_turf(src) + if(my_turf.temperature >= 500) + add_energy(100) diff --git a/mods/anomaly/code/artefacts/artefact_zjemchug.dm b/mods/anomaly/code/artefacts/artefact_zjemchug.dm new file mode 100644 index 0000000000000..7fda67470fce1 --- /dev/null +++ b/mods/anomaly/code/artefacts/artefact_zjemchug.dm @@ -0,0 +1,52 @@ +// [WIP] +/obj/item/artefact/zjemchug + name = "Something" + icon_state = "zjemchug" + desc = "Абсолютно гладкий шар с максимально правильной формой. Чем дольше смотришь на него, тем больше сознание затмевает туман. Что-то не так." + need_to_process = TRUE + rect_to_interactions = list( + "Lick", + "Shake", + "Bite", + "Knock", + "Compress", + "Rub" + ) + ///Моб, к которому привязался артефакт + var/mob/living/carbon/human/owner + stored_energy = 10000 + max_energy = 10000 + cargo_price = 1500 //Это крайне ценный и редкий артефакт + rnd_points = 10000 + +/obj/item/artefact/zjemchug/react_to_touched(mob/living/user) + . = ..() + if(!owner) + deal_make_new_owner(user) + else + to_chat(user, SPAN_BAD("...Вы чувствуете, как внутри вас что-то противится...")) + +/obj/item/artefact/zjemchug/Process() + if(!(owner in get_turf(src))) //На нашем турфе нет хозяина + for(var/mob/living/carbon/human/target in get_turf(src)) + to_chat(target, SPAN_BAD("Что-то пугает вас, заставляет отойти от [src]")) + +/obj/item/artefact/zjemchug/proc/deal_make_new_owner(mob/living/user) + //Предлагает человеку обьединить умы + var/list/choices = list("Да","Нет") + var/choice = input(usr, "Расслабить свой ум и прекратить сопротивление?") as null|anything in choices + if(choice == "Нет") + to_chat(user, SPAN_BAD("Вы решаете продолжить сопротивляться ему. Вы не поддадитесь.")) + return + if(choice == "Да") + make_new_owner(user) + +/obj/item/artefact/zjemchug/proc/make_new_owner(mob/living/user) + owner = user + icon_state = "zjemchug_active" + SSanom.good_interactions_with_artefacts_by_players_ammount++ + to_chat(user, SPAN_GOOD("Вы поддаётесь его влиянию...что-то в вас изменилось...")) + var/list/faculties = list("[PSI_COERCION]", "[PSI_REDACTION]", "[PSI_ENERGISTICS]", "[PSI_PSYCHOKINESIS]") + for(var/i = 1 to rand(2,3)) + var/mob/living/carbon/human/human_user = user + human_user.set_psi_rank(pick_n_take(faculties), 5) diff --git a/mods/anomaly/code/detectors_and_etc/beacon.dm b/mods/anomaly/code/detectors_and_etc/beacon.dm index 572072d30be9d..0459f26c8d839 100644 --- a/mods/anomaly/code/detectors_and_etc/beacon.dm +++ b/mods/anomaly/code/detectors_and_etc/beacon.dm @@ -6,6 +6,12 @@ w_class = ITEM_SIZE_TINY matter = list(MATERIAL_STEEL = 200) +/obj/item/advanced_bolt/Crossed(O) + . = ..() + if(ishuman(usr)) + for(var/obj/item/storage/bolt_bag/bag in usr) + if(bag.autocollect) + bag.can_be_inserted(src, usr, 0) /obj/item/advanced_bolt/Move() . = ..() @@ -27,6 +33,8 @@ /obj/item/advanced_bolt/on_update_icon() . = ..() var/turf/current_turf = get_turf(src) + if(!current_turf) + return if(LAZYLEN(current_turf.list_of_in_range_anomalies)) icon_state = "beacon_red" else @@ -46,9 +54,5 @@ /obj/item/advanced_bolt, /obj/item/advanced_bolt, /obj/item/advanced_bolt, - /obj/item/advanced_bolt, - /obj/item/advanced_bolt, - /obj/item/advanced_bolt, - /obj/item/advanced_bolt, /obj/item/advanced_bolt ) diff --git a/mods/anomaly/code/detectors_and_etc/bolt.dm b/mods/anomaly/code/detectors_and_etc/bolt.dm index 85419334dafb9..088585a89d7da 100644 --- a/mods/anomaly/code/detectors_and_etc/bolt.dm +++ b/mods/anomaly/code/detectors_and_etc/bolt.dm @@ -6,6 +6,13 @@ w_class = ITEM_SIZE_TINY matter = list(MATERIAL_STEEL = 200) +/obj/item/bolt/Crossed(O) + . = ..() + if(ishuman(usr)) + for(var/obj/item/storage/bolt_bag/bag in usr) + if(bag.autocollect) + bag.can_be_inserted(src, usr, 0) + /obj/item/storage/bolt_bag name = "Bag with bolts" @@ -14,10 +21,25 @@ icon_state = "bolt_bag" allow_quick_gather = TRUE allow_quick_empty = TRUE - w_class = ITEM_SIZE_TINY - max_w_class = ITEM_SIZE_LARGE - max_storage_space = DEFAULT_BOX_STORAGE + w_class = ITEM_SIZE_SMALL + max_w_class = ITEM_SIZE_TINY + max_storage_space = 10 + var/autocollect = FALSE + +/obj/item/storage/bolt_bag/examine(mob/user, distance, is_adjacent) + . = ..() + to_chat(user, SPAN_GOOD("Use RBM and use Toggle autocollect to toggle autocollect.")) + +/obj/item/storage/bolt_bag/verb/toggle_autocollect() + set category = "Object" + set name = "toggle autocollect" + set src in usr + autocollect = !autocollect + if(autocollect) + to_chat(usr, SPAN_NOTICE("Now you will automaticly collect bolts and beacons in this bag.")) + else + to_chat(usr, SPAN_NOTICE("Now you will NOT automaticly collect bolts and beacons in this bag.")) /obj/item/storage/bolt_bag/full_of_bolts startswith = list( @@ -30,10 +52,6 @@ /obj/item/bolt, /obj/item/bolt, /obj/item/bolt, - /obj/item/bolt, - /obj/item/bolt, - /obj/item/bolt, - /obj/item/bolt, /obj/item/bolt ) diff --git a/mods/anomaly/code/detectors_and_etc/deployer.dm b/mods/anomaly/code/detectors_and_etc/deployer.dm new file mode 100644 index 0000000000000..18fbc318c4544 --- /dev/null +++ b/mods/anomaly/code/detectors_and_etc/deployer.dm @@ -0,0 +1,112 @@ +//Всё что делает устройство - размещает маячок (световой) при использовании +/obj/item/beacon_deployer + name = "beacon deployer" + desc = "Special tool created for fast beacon deploys." + icon = 'mods/anomaly/icons/deployer.dmi' + icon_state = "beacon_deployer" + action_button_name = "Use deployer" + w_class = ITEM_SIZE_SMALL + matter = list(MATERIAL_STEEL = 2000) + var/stored_beacon_amount = 0 + var/max_beacon_amount = 50 + ///Отвечает за то, какого цвета будет размещён маячок + var/current_beacon_type = "Green" + +///Осмот +/obj/item/beacon_deployer/examine(mob/user, distance, is_adjacent) + . = ..() + to_chat(user, SPAN_NOTICE("Its [stored_beacon_amount] inside.")) + to_chat(user, SPAN_GOOD("Use Alt + LBM to swap flag color.")) + to_chat(user, SPAN_GOOD("User Cntrl + LBM to unload some flags.")) + +/obj/item/beacon_deployer/AltClick() + current_beacon_type = input(usr, "Choose flag color","Choose") as null|anything in list("Green", "Red", "Yellow", "Blue") + return TRUE + +/obj/item/beacon_deployer/CtrlClick() + deploy_beacon(usr, FALSE, 10) + return TRUE + + +///Кнопка слева сверху для деплоера +/obj/item/beacon_deployer/verb/use_deployer() + set category = "Object" + set name = "Use flag deployer" + set src in usr + + if(!usr.incapacitated()) + check_current_turf(usr) + usr.update_action_buttons() + + +/obj/item/beacon_deployer/use_tool(obj/item/item, mob/living/user, list/click_params) + . = ..() + if(istype(item,/obj/item/stack/flag)) + reload_deployer(user, item) + +///Заряжает в деплоер флаги +/obj/item/beacon_deployer/proc/reload_deployer(mob/living/user, obj/item/stack/flag/item) + if(stored_beacon_amount == max_beacon_amount) //Переполнен + to_chat(user, SPAN_NOTICE("Deployer is full.")) + return + //Определяемся, сколько передадим флажков + var/transfer_amount = item.amount + if(stored_beacon_amount + item.amount > max_beacon_amount) + transfer_amount = max_beacon_amount - stored_beacon_amount //Не позволит переполнить запас + if(transfer_amount > item.amount) + transfer_amount = item.amount //Не позволит взять больше, чем есть в стаке + item.use(transfer_amount) + stored_beacon_amount += transfer_amount + to_chat(user, SPAN_NOTICE("You inserted [transfer_amount] flags in autodeployer.")) + +/obj/item/beacon_deployer/attack_self(mob/living/user) + . = ..() + check_current_turf(user) + +///Игрок использовал деплоер. Если маяка нет - поставим. Есть - заберём. +/obj/item/beacon_deployer/proc/check_current_turf(mob/living/user) + if(locate(/obj/item/stack/flag) in get_turf(src)) + for(var/obj/item/stack/flag/picked_flag in get_turf(src)) + undeploy_beacon(user, picked_flag) + else + deploy_beacon(user) + +///Разобрать флаг и убрать в деплоер +/obj/item/beacon_deployer/proc/undeploy_beacon(mob/living/user, obj/item/stack/flag/item) + if(item.upright) + item.knock_down() + reload_deployer(user, item) + +///Установить флаг из деплоера +/obj/item/beacon_deployer/proc/deploy_beacon(mob/living/user, deploy = TRUE, deploy_amount = 1) + if(stored_beacon_amount <= 0) + to_chat(user, SPAN_BAD("Deployer is empty.")) + return + if(deploy_amount > 1) + if(deploy_amount > stored_beacon_amount) + deploy_amount = stored_beacon_amount + var/type + if(current_beacon_type == "Green") + type = /obj/item/stack/flag/green + else if(current_beacon_type == "Red") + type = /obj/item/stack/flag/red + else if(current_beacon_type == "Blue") + type = /obj/item/stack/flag/blue + else if(current_beacon_type == "Yellow") + type = /obj/item/stack/flag/yellow + if(!type) + return + var/obj/item/stack/flag/spawned_flag = new type(get_turf(src)) + spawned_flag.amount = deploy_amount + stored_beacon_amount -= deploy_amount + if(deploy) + spawned_flag.set_up() + playsound(src, 'sound/items/shuttle_beacon_complete.ogg', 50) + + + + + + +/obj/item/beacon_deployer/full + stored_beacon_amount = 50 diff --git a/mods/anomaly/code/detectors_and_etc/detector.dm b/mods/anomaly/code/detectors_and_etc/detector.dm index ef6d6150f2841..cca3e9fd7d440 100644 --- a/mods/anomaly/code/detectors_and_etc/detector.dm +++ b/mods/anomaly/code/detectors_and_etc/detector.dm @@ -1,30 +1,53 @@ /obj/anomaly ///Шанс, что аномалию найдут детектором при условии что у пользователя максимальный навык науки var/chance_to_be_detected = 100 + //Спрайт обнаруженной аномалии. Смотри прок get_detection_icon(). Этот спрайт - стандартный для любых аномок. + var/detection_icon_state = "any_anomaly" + ///Уровень навыка в науке, требуемый, чтоб персонаж смог понять тип аномалии + var/detection_skill_req = SKILL_TRAINED /obj/item/clothing/gloves/anomaly_detector name = "anomaly detection device" - desc = "TEST." + desc = "A complex technological device designed taking into account all possible dangers of anomalies." icon = 'mods/anomaly/icons/detector.dmi' icon_state = "detector_idle" + //Базовое название детектора используемое в коде смена иконок. + var/detector_basic_name = "detector" action_button_name = "Scan anomalies" var/last_peek_time = 0 - var/peek_delay = 0.2 SECONDS + var/peek_delay = 1 SECONDS var/show_anomalies_delay = 10 SECONDS var/in_tesla_range = FALSE var/in_scanning = FALSE var/last_scan_time = 0 var/result_tesla = FALSE + //Некоторые детекторы могут вовсе не замечать некоторые аномалии. Укажите их теги, если потребутеся (Переменная anomaly_tag) + var/list/blacklisted_amomalies = list() + +/obj/item/clothing/gloves/anomaly_detector/proc/switch_toggle() + if(!is_processing) + to_chat(usr, SPAN_NOTICE("Вы включили детектор")) + START_PROCESSING(SSanom, src) + SSanom.processing_ammount++ + else + to_chat(usr, SPAN_NOTICE("Вы выключили детектор")) + STOP_PROCESSING(SSanom, src) + SSanom.processing_ammount-- -/obj/item/clothing/gloves/anomaly_detector/Initialize() - . = ..() - START_PROCESSING(SSanom, src) /obj/item/clothing/gloves/anomaly_detector/attack_self(mob/living/user) . = ..() + if(!is_processing) + to_chat(usr, SPAN_BAD("Сперва включите устройство.")) + return try_found_anomalies(user) +/obj/item/clothing/gloves/anomaly_detector/CtrlClick(mob/user) + . = ..() + switch_toggle() + return TRUE + /obj/item/clothing/gloves/anomaly_detector/Process() check_electrostatic() update_icon() @@ -32,28 +55,28 @@ /obj/item/clothing/gloves/anomaly_detector/on_update_icon() .=..() if(!in_tesla_range && !in_scanning) - icon_state = "detector_idle" + icon_state = "[detector_basic_name]_idle" else if(in_tesla_range && !in_scanning) - icon_state = "detector_idle_and_peak" + icon_state = "[detector_basic_name]_idle_and_peak" else if(!in_tesla_range && in_scanning) - icon_state = "detector_scanning" + icon_state = "[detector_basic_name]_scanning" else if(in_tesla_range && in_scanning) - icon_state = "detector_scanning_and_peak" + icon_state = "[detector_basic_name]_scanning_and_peak" -/obj/item/clothing/gloves/anomaly_detector/verb/scan() +/obj/item/clothing/gloves/anomaly_detector/verb/scan_anomalies() set category = "Object" - set name = "Scan anomalies with detector" + set name = "Scan anomalies" set src in usr if(!usr.incapacitated()) try_found_anomalies(usr) usr.update_action_buttons() - /obj/item/clothing/gloves/anomaly_detector/proc/check_electrostatic() - if(world.time - last_scan_time >= peek_delay ) - last_peek_time = world.time + if(world.time - last_peek_time < peek_delay ) + return + last_peek_time = world.time var/turf/cur_turf = get_turf(src) //Проверяем, турф на котором мы находимся находится в зоне поражения? if(LAZYLEN(cur_turf.list_of_in_range_anomalies)) @@ -70,20 +93,21 @@ /obj/item/clothing/gloves/anomaly_detector/examine(mob/user, distance, is_adjacent) . = ..() - to_chat(user, SPAN_GOOD("Use LBM in anomaly scan mode for search anomalies, or use action button.")) + to_chat(user, SPAN_GOOD("Жмите ЛКМ когда включен, для сканирования, или жмите на кнопку слева сверху.")) + to_chat(user, SPAN_GOOD("Жмите Контрол + ЛКМ чтоб включить/выключить устройство.")) ///Пользователь проводит поиск при помощи сканера /obj/item/clothing/gloves/anomaly_detector/proc/try_found_anomalies(mob/living/user) if((user.r_hand != src && user.l_hand !=src) && (wearer && wearer.gloves != src) ) - to_chat(user, SPAN_BAD("You cant reach device.")) + to_chat(user, SPAN_BAD("Не дотягиваюсь до детектора.")) return if(!user.skill_check(SKILL_SCIENCE, SKILL_BASIC)) - to_chat(user, SPAN_BAD("I dont know how use this function of this device.")) + to_chat(user, SPAN_BAD("Понятия не имею как им пользоваться.")) return //Мы проверили, есть ли у пользователя базовый навык НАУКИ. // Снижаем 1.2 секунды сканирования за каждый пункт науки у персонажа var/user_science_lvl = user.get_skill_value(SKILL_SCIENCE) - var/time_to_scan = (10 - (1.2 * user_science_lvl)) SECONDS + var/time_to_scan = (20 - (2 * user_science_lvl)) SECONDS var/scan_radius = (4 + user_science_lvl) //макс радиус - 9 "квадратов" in_scanning = TRUE update_icon() @@ -101,11 +125,18 @@ //Список разрешённых для показа игроку аномалий var/list/allowed_anomalies = list() for(var/obj/anomaly/choosed_anomaly in objs) - var/chance_to_find = (user_science_lvl * 20) - (100 - choosed_anomaly.chance_to_be_detected) - if(prob(chance_to_find)) - LAZYADD(allowed_anomalies, choosed_anomaly) - var/flick_time = (1 + (user_science_lvl * 2))SECONDS - show_anomalies(user, flick_time, allowed_anomalies) + //Если аномалия в блэклисте детектора - игнорируем аномалию + if(choosed_anomaly.anomaly_tag in blacklisted_amomalies) + continue + if(!choosed_anomaly.is_helper) //Вспомогательные части аномалий нас не интересуют + var/chance_to_find = (user_science_lvl * 20) - (100 - choosed_anomaly.chance_to_be_detected) + if(prob(chance_to_find)) + LAZYADD(allowed_anomalies, choosed_anomaly) //Добавляем саму аномалию + //Если у неё есть вспомогательные части - добавляем её вспомогательные части + if(choosed_anomaly.multitile) + for(var/obj/anomaly/choosed_part in choosed_anomaly.list_of_parts) + LAZYADD(allowed_anomalies, choosed_part) + show_anomalies(user, time_to_scan, allowed_anomalies) if(LAZYLEN(allowed_anomalies)) flick("detector_detected_anomalies", src) usr.update_action_buttons() @@ -115,29 +146,29 @@ usr.update_action_buttons() -/proc/show_anomalies(mob/viewer, flick_time, allowed_anomalies) + +///Показывает игроку аномалии, которые он обнаружил детектером +/proc/show_anomalies(mob/living/viewer, flick_time, allowed_anomalies) if(!ismob(viewer) || !viewer.client) return - var/list/t_ray_images = list() + var/user_science_lvl = viewer.get_skill_value(SKILL_SCIENCE) + var/list/list_of_showed_anomalies = list() for(var/obj/anomaly/in_turf_atom in allowed_anomalies) var/turf/T = get_turf(in_turf_atom) - var/image/I = image(icon = 'mods/anomaly/icons/effects.dmi',loc = T,icon_state = "none") - var/mutable_appearance/MA = new(in_turf_atom) - MA.alpha = 255 - MA.dir = in_turf_atom.dir - MA.plane = FLOAT_PLANE - I.layer = HUD_ABOVE_ITEM_LAYER - I.appearance = MA - t_ray_images += I + var/image/I + if(user_science_lvl >= in_turf_atom.detection_skill_req) + I = image(icon = 'mods/anomaly/icons/detection_icon.dmi',loc = T, icon_state = in_turf_atom.get_detection_icon()) + else + I = image(icon = 'mods/anomaly/icons/detection_icon.dmi',loc = T, icon_state = in_turf_atom.detection_icon_state) + I.layer = EFFECTS_ABOVE_LIGHTING_PLANE + list_of_showed_anomalies += I - for(var/image/choosed_image in t_ray_images) - choosed_image.icon_state = "none" - if(length(t_ray_images)) - flick_overlay(t_ray_images, list(viewer.client), flick_time) + if(length(list_of_showed_anomalies)) + flick_overlay(list_of_showed_anomalies, list(viewer.client), flick_time) /obj/item/paper/sierra/exploration name = "new dangers" - info = "
NSV Sierra
Новые опасности
  • Одна из последних экспедиций вернулась с новой информацией, и ранениями. Согласно последнему отчёту, экспедиционный отряд наткнулся на некую аномальную активность на одной из планет. Научно исследовательский отдел выделил вашему отряду дополнительное снаряжение и модифицировал сканеры Саcпаровой, добавив им АЛЬТЕРНАТИВНЫЙ режим. Советуем проявлять огромную осторожность при работе на планетах. Удачи.

    This paper has been stamped by the Research&Development department." + info = "
    NSV Sierra
    Новые опасности
  • Одна из последних экспедиций вернулась с новой информацией, и ранениями. Согласно последнему отчёту, экспедиционный отряд наткнулся на некую аномальную активность на одной из планет. Научно исследовательский отдел выделил вашему отряду дополнительное снаряжение в виде маячков, коллекторов аномальных образований, детектора аномальной активности и раздатчика флагов. Советуем проявлять огромную осторожность при работе на планетах. Удачи.

    This paper has been stamped by the Research&Development department." icon = 'maps/sierra/icons/obj/uniques.dmi' icon_state = "paper_words" diff --git a/mods/anomaly/code/detectors_and_etc/gurza_detector.dm b/mods/anomaly/code/detectors_and_etc/gurza_detector.dm new file mode 100644 index 0000000000000..59934e8b76639 --- /dev/null +++ b/mods/anomaly/code/detectors_and_etc/gurza_detector.dm @@ -0,0 +1,36 @@ +//Самопальный ослабленный детектор, разработанный силами инженера ГКК. +/obj/item/clothing/gloves/anomaly_detector/gurza + name = "Gurza" + desc = "An incredibly homemade detector clearly designed by a talented engineer. It is capable of detecting static voltage and determining its direction and distance. Despite its homemade nature, it looks extremely reliable. Apparently, the assembly involved blue duct tape." + icon = 'mods/anomaly/icons/gurza_detector.dmi' + icon_state = "gurza_undeployed" + detector_basic_name = "gurza" + action_button_name = "Scan anomalies" + //Устройство не лезет на кисть. + slot_flags = SLOT_DENYPOCKET + //Гюрза способен находить исключительно электроаномалии + blacklisted_amomalies = list( + "Cooler", + "Heater", + "Rvach", + "Tramp", + "Vent", + "Vspishka", + "Zharka" + ) + +/obj/item/clothing/gloves/anomaly_detector/gurza/switch_toggle() + if(!is_processing) + to_chat(usr, SPAN_NOTICE("Вы включили детектор.")) + flick("gurza_undeploing", src) + icon_state = "gurza_scanning" + usr.update_action_buttons() + START_PROCESSING(SSanom, src) + SSanom.processing_ammount++ + else + flick("gurza_deploing", src) + to_chat(usr, SPAN_NOTICE("Вы выключили детектор.")) + STOP_PROCESSING(SSanom, src) + icon_state = "gurza_undeployed" + usr.update_action_buttons() + SSanom.processing_ammount-- diff --git a/mods/anomaly/code/detectors_and_etc/research_machine.dm b/mods/anomaly/code/detectors_and_etc/research_machine.dm index b075672e5ebb0..ab5d324055405 100644 --- a/mods/anomaly/code/detectors_and_etc/research_machine.dm +++ b/mods/anomaly/code/detectors_and_etc/research_machine.dm @@ -4,6 +4,7 @@ icon = 'mods/anomaly/icons/urm.dmi' icon_state = "urm" anchored = TRUE + density = TRUE idle_power_usage = 5 power_channel = EQUIP var/obj/item/cell/charging = null diff --git a/mods/anomaly/code/documentation/README.md b/mods/anomaly/code/documentation/README.md new file mode 100644 index 0000000000000..68cafd1e3bcd3 --- /dev/null +++ b/mods/anomaly/code/documentation/README.md @@ -0,0 +1,105 @@ +## Disclaimer +НЕ лезьте в код с целью подсмотреть как работает тот или определённый механ с целью получения игрового преимущества, это разрушает всю идею исследования +НЕ распростроняйте информацию о работе аномалий и прочего в общих чатах, это тоже очень плохо влияет на восприятие! + +# WIP Документация в процессе написания! WIP + +Данная папка - documentation - будет содержать в себе различную документацию,пояснялки и блок схемы. + +## Небольшая карта мода: +[Аномалии] - [mods\anomaly\code\anomalies] + +[Артефакты]- [mods\anomaly\code\artifacts] + +[Оборудование_и_снаряжение] - [mods\anomaly\code\detectors_and_etc] + +[Спавн_аномалий_и_их_размещение_игры] - [mods\anomaly\code\spawn_anomalies_protocol] + +[Погода] - [mods\anomaly\code\monitor_effects] + +[Админ_билдер_аномалий] - [mods\anomaly\code\anomaly_admin.dm] + +[Сабсистема_аномалий] - [mods\anomaly\code\anomaly_controller.dm] + +## Аномалии +Вся ИДЕЯ аномалий взята с сервера Ашан, Сталкер, пикник на обочине, реализация - своя. +Игромеханически, аномалии можно сравнить с сапёром, т.к геймплей больше похож именно на это. +-Аномалия/её вспомогательные части реагируют на пересечение себя какими-либо предметами, обьектами, существами. -В случае если атом(любой обьект) указан в параметрах как ИНИЦИАТОР - аномалия реагирует, т.е ВЗВОДИТСЯ. +-Если аномалия ПРЕДЗАРЯДОЧНАЯ, need_preload, аномалия ждёт время, равное cooldown +-Для всех атомов в радиусе effect_range() выполняется get_effect_by_anomaly() +-После, выполняется handle_activate и аномалия начинает "Считать время" до следующей активации +-После того как аномалия вновь доступна и готова реагировать, мы ещё раз проверяем ядро и вспомогательные части на наличие инициаторов. Если никого нет - код закончен и аномалия больше ничего не просчитывает. Если что-то нашлось - всё по новой, и так пока инициаторов не станет. (Т.е аномалия не успокоится, пока в ней условно будет человек) + + +## Артефакты +В отличии от артефактов с ашана где крайне много бесполезных артефактов и крайне много артефактов с слишком скрытыми свойствами, где игрок исключительно СЛУЧАЙНО узнает его свойство - артефакты мода ANOMALIES хоть и малочисленны, но обладают множественными эффектами, несколько эффектов являются крайне очевидными и находятся с помощью ИНТЕРАКЦИЙ, намёки на многие находятся через интеракции с URM machine и так же находятся через обычные интеракции, и лишь малая часть - довольно спрятаны и находятся случайно. + +Артефакты спавнятся при генерации аномалий через функцию generate_anomalies_in_turfs(), их количество строго ограничено при генерации. + +[Постоянное_воздействие_на_носителя] +Артефакты обрабатываются 24/7 подсистемой SSanom, т.к невозможно предугадать кодом все движения артефакта по инвентарям/турфам и т.д +При процессинге раз в довольно большой срок (2-5 секунд) артефакт проверяет, что он всё ещё находится в мобе. +Далее, артефакт оказывает своё постоянное влияние на носителя - регенерирует стамину, лечит органы, что угодно, это указывается в +/obj/item/artefact/proc/process_artefact_effect_to_user() + return + +Готовые примеры: +Код для регенерации стамины пользователя: +/obj/item/artefact/gravi/process_artefact_effect_to_user() + if(current_user.stamina < 85) + current_user.adjust_stamina(5) +Т.е, если стамина носителя меньше 85 - добавить ему 5 единиц +Меняйте переменную process_effect_cooldown чтоб выбирать, как часто артефакт будет влиять на носителя + +[Реакция_артефатков_на_внешнее_событие_с_носителем] +Артефакты могут отслеживать внешние события происходящие с их носителем. Вот как это работает + +//У нас есть событие - персонаж проваливается на Z уровень ниже +/mob/living/carbon/human/handle_fall_effect(turf/landing) + //Мы вызываем функцию, которая опросит все артефакты находящиеся в инвентаре носителя что ОНИ думают об этом событии + var/list/result_effects = calculate_artefact_reaction(src, "Падение с высоты") + if(result_effects) + //Здесь мы добавляем, какие реакции что делают. Если мы хотим при помощи реакции "Защищает от падения" защитить персонажа от урона с падения - так и пишем. + if(result_effects.Find("Защищает от падения")) + return + .=..() + +Всё, теперь артефакт оберегает персонажа от падения с высоты. Тоже самое с ЭМИ ударом. + +/mob/living/emp_act(severity) + var/list/result_effects = calculate_artefact_reaction(src, "ЭМИ") + if(result_effects) + if(result_effects.Find("Защищает от ЭМИ")) + return + . = ..() + +Подробнее в + + +## Спавн аномалий и их размещение игры +[mods\anomaly\code\spawn_anomalies_protocol] <-- Весь код отвечающий за спавн аномалий в игре и их размещение. +ПОДРОБНЕЕ ТУТ ---> mods\anomaly\code\spawn_anomalies_protocol\core_spawn_protocol.dm , в начале файла. + +В общих чертах - разнообразые "Источники", такие как: +-Ивент "Разлив БСД", +-Появление в мире большого артефакта подходящего по условиям +-Диреликт,где мапер поставил аномалии +-Планеты которые помечены как спавнящие аномалии +Собирают вокруг себя турфы и вызывают функцию generate_anomalies_in_turfs(), которая размещает аномалии по очень +примитивному алгоритму - случайным образом выбирает из переданного списка турфов турф и ставит аномалию. Если аномалия мультитайтловая, то при пересечении аномалии с чем-то, убирает турф из списка турфов, аномалию удаляют. Технически - метод тыка. + + +## Погода +Основная задача данного кода - реагировать на вход/выход ИГРОКА(Обязателен Ckey у жертвы) и выдавать ему на экран оверлей, если потребуется. Если хотите добавить данной "Погоде" спрайт - ознакомьтесь с кодом по пути mods\anomaly\code\monitor_effects\snow_monitor_effect.dm + +Генерируется Погода при генерации аномалий на планете Лёд. Перепишу когда появится нужда в локальных участках погоды(Для условного диреликта в виде вулканической местности) + + +## Билдер аномалий +Работает точно так же как и все билдеры. Для добавления новой аномалии - добавьте её в список possible_anomalies по аналогии. Всё что идёт справа, от пути аномалии - её описание для администрации. Указывайте всю информацию, она может и БУДЕТ влиять на эффективность билдера. + + +## Сабсистема_аномалий + + +# WIP Документация в процессе написания! WIP diff --git "a/mods/anomaly/code/documentation/electra_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\215\320\273\320\265\320\272\321\202\321\200\321\213.drawio" "b/mods/anomaly/code/documentation/electra_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\215\320\273\320\265\320\272\321\202\321\200\321\213.drawio" new file mode 100644 index 0000000000000..c4563d8ffb26d --- /dev/null +++ "b/mods/anomaly/code/documentation/electra_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\215\320\273\320\265\320\272\321\202\321\200\321\213.drawio" @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/mods/anomaly/code/documentation/electra_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\215\320\273\320\265\320\272\321\202\321\200\321\213.png" "b/mods/anomaly/code/documentation/electra_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\215\320\273\320\265\320\272\321\202\321\200\321\213.png" new file mode 100644 index 0000000000000..e97dda372b112 Binary files /dev/null and "b/mods/anomaly/code/documentation/electra_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\215\320\273\320\265\320\272\321\202\321\200\321\213.png" differ diff --git "a/mods/anomaly/code/documentation/rvach_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\200\320\262\320\260\321\207\320\260.drawio" "b/mods/anomaly/code/documentation/rvach_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\200\320\262\320\260\321\207\320\260.drawio" new file mode 100644 index 0000000000000..0540fe796c7ba --- /dev/null +++ "b/mods/anomaly/code/documentation/rvach_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\200\320\262\320\260\321\207\320\260.drawio" @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/mods/anomaly/code/documentation/rvach_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\200\320\262\320\260\321\207\320\260.png" "b/mods/anomaly/code/documentation/rvach_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\200\320\262\320\260\321\207\320\260.png" new file mode 100644 index 0000000000000..f52cb906093d6 Binary files /dev/null and "b/mods/anomaly/code/documentation/rvach_anomaly/\320\241\321\205\320\265\320\274\320\260 \321\200\320\262\320\260\321\207\320\260.png" differ diff --git a/mods/anomaly/code/monitor_effects/monitor_core.dm b/mods/anomaly/code/monitor_effects/monitor_core.dm new file mode 100644 index 0000000000000..a6678346d2448 --- /dev/null +++ b/mods/anomaly/code/monitor_effects/monitor_core.dm @@ -0,0 +1,47 @@ +GLOBAL_LIST_EMPTY(effected_by_weather) +GLOBAL_VAR_INIT(ambience_channel_weather, GLOB.sound_channels.RequestChannel("AMBIENCE_WEATHER")) +#define ismonitorhere(A) locate(/obj/monitor_effect_triger) in A +///Кто-то или что-то вошло в монитор-эффект +/obj/monitor_effect_triger/Crossed(O) + react_at_enter_monitor(O) + +/obj/monitor_effect_triger/Uncrossed(O) + react_at_leave_monitor(O) + +/obj/monitor_effect_triger/proc/add_monitor_effect(mob/living/input_mob) + LAZYADD(input_mob,GLOB.effected_by_weather) + +/obj/monitor_effect_triger/proc/remove_monitor_effect(mob/living/input_mob) + LAZYREMOVE(input_mob,GLOB.effected_by_weather) + +/obj/monitor_effect_triger/proc/react_at_enter_monitor(atom/movable/atom) + if(!must_react_at_enter) + return + //Незачем накладывать эффект тому, кто уже с этим эффектом + if(atom in GLOB.effected_by_weather) + return + if(isliving(atom)) + var/mob/living/detected_mob = atom + //Если у моба есть клиент, значит есть на кого накладывать эффект на экран + if(detected_mob.client) + if(LAZYLEN(sound_type)) + var/sound = sound(pick(sound_type), repeat = TRUE, wait = 0, volume = 50, channel = GLOB.ambience_channel_weather) + detected_mob.playsound_local(get_turf(detected_mob), sound) + add_monitor_effect(detected_mob) + LAZYADD(GLOB.effected_by_weather, atom) + //Если прошло достаточно времени с предыдущего пука в чат игроку - пукнем. + if(detected_mob.last_monitor_message < world.time) + to_chat(detected_mob, SPAN_BAD(pick(trigger_messages_list))) + //Добавим время от КД + detected_mob.last_monitor_message = detected_mob.last_monitor_message + trigger_message_cooldown + +/obj/monitor_effect_triger/proc/react_at_leave_monitor(atom/movable/atom) + if(!must_react_at_enter) + return + var/mob/detected_mob = atom + if(!ismonitorhere(get_turf(atom))) + if(atom in GLOB.effected_by_weather) + LAZYREMOVE(GLOB.effected_by_weather, atom) + remove_monitor_effect(detected_mob) + if(LAZYLEN(sound_type)) + sound_to(detected_mob, sound(null, channel = GLOB.ambience_channel_weather)) diff --git a/mods/anomaly/code/monitor_effects/monitor_vars.dm b/mods/anomaly/code/monitor_effects/monitor_vars.dm new file mode 100644 index 0000000000000..9d99c62b3dd4a --- /dev/null +++ b/mods/anomaly/code/monitor_effects/monitor_vars.dm @@ -0,0 +1,18 @@ +/mob/living + var/last_monitor_message = 0 + +//Наложит игроку на экран эффект, уберёт его, а так же может дополнительно начать влиять на существо. +/obj/monitor_effect_triger + //Путь до эффекта накладываемого на экран + var/effect_icon_type + var/sound_type = list() + ///Должнен ли монитор эффект реагировать на пересечение с кем-либо или чем-либо + var/must_react_at_enter = FALSE + anchored = TRUE + invisibility = TRUE + layer = EFFECTS_LAYER + vis_flags = VIS_INHERIT_ID + //Лист сообщений выводимые в чат игроку при входе в зону + var/list/trigger_messages_list = list() + var/trigger_message_cooldown = 10 MINUTES + mouse_opacity = FALSE //Погода должна быть непрокликиваемой diff --git a/mods/anomaly/code/monitor_effects/snow_monitor_effect.dm b/mods/anomaly/code/monitor_effects/snow_monitor_effect.dm new file mode 100644 index 0000000000000..7c645cb55a72c --- /dev/null +++ b/mods/anomaly/code/monitor_effects/snow_monitor_effect.dm @@ -0,0 +1,38 @@ +//Эффект снежной вьюги +/obj/monitor_effect_triger/snow + icon_state = "snow_storm" + icon = 'mods/anomaly/icons/weather_effects.dmi' + must_react_at_enter = TRUE + sound_type = list( + 'mods/anomaly/sounds/snowstorm.ogg' + ) + +/obj/monitor_effect_triger/snow + trigger_messages_list = list( + "Мрачные облака, толстый слой инея на земле и стремительные порывы ветра делают каждый шаг испытанием.", + "Белое пространство, прерываемое лишь силуэтами ледяных скал, напоминающих причудливые формации.", + "Бесконечный буран, да и только. Паршивая планета.", + "Куда ни глянь — пустота. Ядовито-белый мрак простирается до самого горизонта, как бесконечный океан.", + "Холод, кажется, проникает не только внутрь, но и в самые глубокие уголки твоей души сквозь скафандр. Каждое движение даётся через силу, а мысли теряются среди непрекращающегося гула ветра.", + "Рокот небес, напряженный до предела, сопровождает каждое твое движение.", + "Ледяная пыль начинает шевелиться, и этот далекий гул намекает на опасность.", + "Ты поднимаешь голову, наблюдая, как пурга хлещет по ледяным вершинам.", + "Каждый шорох и треск вокруг как будто вызывают у тебя певучее предчувствие опасности.", + "Тьма нависла над тобой, как тяжелый саван. Кажется, что даже звезды в небе отдалились от этого ледяного кошмара." + ) + +//Эффект снега на экране +/obj/screen/fullscreen/snow_effect + icon = 'mods/anomaly/icons/snow_screen.dmi' + icon_state = "snow" + layer = BLIND_LAYER + scale_to_view = TRUE + + + +/obj/monitor_effect_triger/snow/add_monitor_effect(mob/living/input_mob) + input_mob.overlay_fullscreen("snow_monitor", /obj/screen/fullscreen/snow_effect) + //Логируем пользователя в глобальный список + +/obj/monitor_effect_triger/snow/remove_monitor_effect(mob/living/input_mob) + input_mob.clear_fullscreen("snow_monitor") diff --git a/mods/anomaly/code/monitor_effects/swamp_monitor_effect.dm b/mods/anomaly/code/monitor_effects/swamp_monitor_effect.dm new file mode 100644 index 0000000000000..b7906c1aad193 --- /dev/null +++ b/mods/anomaly/code/monitor_effects/swamp_monitor_effect.dm @@ -0,0 +1,2 @@ +/obj/monitor_effect_triger/swamp + name = "bam" diff --git a/mods/anomaly/code/monitor_effects/vulcan_monitor_effect.dm b/mods/anomaly/code/monitor_effects/vulcan_monitor_effect.dm new file mode 100644 index 0000000000000..ee78b8ce329cb --- /dev/null +++ b/mods/anomaly/code/monitor_effects/vulcan_monitor_effect.dm @@ -0,0 +1,5 @@ +//Эффект вулкана WIP +/obj/monitor_effect_triger/vulcan + icon_state = "light_storm" + icon = 'mods/anomaly/icons/weather_effects.dmi' + invisibility = FALSE diff --git a/mods/anomaly/code/spawn_anomalies_protocol/bsd_event_protocol.dm b/mods/anomaly/code/spawn_anomalies_protocol/bsd_event_protocol.dm index 04b408f9dff28..1949afefd9589 100644 --- a/mods/anomaly/code/spawn_anomalies_protocol/bsd_event_protocol.dm +++ b/mods/anomaly/code/spawn_anomalies_protocol/bsd_event_protocol.dm @@ -15,10 +15,10 @@ var/started_in = world.time var/list/turfs_for_spawn = list() for(var/obj/machinery/bluespacedrive/picked_drive in drives) - for(var/turf/turfs as anything in RANGE_TURFS(picked_drive.loc, 10)) - if(!TurfBlocked(turfs) || TurfBlockedByAnomaly(turfs)) - LAZYADD(turfs_for_spawn, turfs) - all_spawned_anomalies = generate_anomalies_in_turfs(possible_anomalies, turfs_for_spawn, 5, 15, 0, 0, 9, 9, "BSD event", started_in) + for(var/turf/picked_turf as anything in RANGE_TURFS(picked_drive.loc, 25)) + if(!TurfBlocked(picked_turf, space_allowed = FALSE) || TurfBlockedByAnomaly(picked_turf)) + LAZYADD(turfs_for_spawn, picked_turf) + all_spawned_anomalies = generate_anomalies_in_turfs(possible_anomalies, turfs_for_spawn, 25, 40, 0, 0, 9, 9, "BSD event", started_in) /datum/event/bsd_instability/end() diff --git a/mods/anomaly/code/spawn_anomalies_protocol/core_spawn_protocol.dm b/mods/anomaly/code/spawn_anomalies_protocol/core_spawn_protocol.dm index 82f22ec931b3e..e71859d248713 100644 --- a/mods/anomaly/code/spawn_anomalies_protocol/core_spawn_protocol.dm +++ b/mods/anomaly/code/spawn_anomalies_protocol/core_spawn_protocol.dm @@ -31,22 +31,26 @@ path_to_spawn - Путь аномалии, которую мы хотим зас else return spawned_anomaly -/proc/TurfBlocked(turf/loc) +/proc/TurfBlocked(turf/loc, space_allowed = TRUE) + if(!loc) //Если входного турфа нет - автоматом сообщаем о заблокированном турфе + return TRUE + if(!space_allowed && (isspaceturf(loc) || isspace(get_area(loc)))) + return TRUE if(loc.density) - return 1 + return TRUE for(var/obj/O in loc) - if(O.density) - return 1 - return 0 + if(O.density && !istype(O, /obj/structure/railing)) + return TRUE + return FALSE /proc/TurfBlockedByAnomaly(turf/loc) for(var/obj/O in loc) if(istype(O, /obj/anomaly)) - return 1 - return 0 + return TRUE + return FALSE /proc/AnomaliesAmmountInTurf(turf/loc) - var/output = 0 + var/output = FALSE for(var/obj/O in loc) if(istype(O, /obj/anomaly)) output++ @@ -85,21 +89,12 @@ max_anomaly_size - Максимальный размер аномалий (anoma source - Источник(Причина) генерации аномалий на турфах. Используется для отчёта */ /proc/generate_anomalies_in_turfs(list/anomalies_types, list/all_turfs_for_spawn, min_anomalies_ammout, max_anomalies_ammout, min_artefacts_ammount, max_artefacts_ammount, min_anomaly_size, max_anomaly_size, source, started_in) - //Генерация аномалий - это ОЧЕНЬ тяжёлый прок, который без проблем вешает юнит тесты. set background = 1 //Расчитываем мин и макс количество аномалий var/result_anomalies_ammout = 1 - if((!min_anomalies_ammout) || (min_anomalies_ammout * min_anomaly_size > LAZYLEN(all_turfs_for_spawn))) - min_anomalies_ammout = 1 - if(!max_anomalies_ammout) - max_anomalies_ammout = (LAZYLEN(all_turfs_for_spawn)) - max_anomalies_ammout /= max_anomaly_size - - result_anomalies_ammout = rand(min_anomalies_ammout, max_anomalies_ammout) - if(result_anomalies_ammout * max_anomaly_size > LAZYLEN(all_turfs_for_spawn)) - result_anomalies_ammout = LAZYLEN(all_turfs_for_spawn) - result_anomalies_ammout /= max_anomaly_size - result_anomalies_ammout = Round(result_anomalies_ammout) + min_anomalies_ammout = calculate_min_anomalies_ammout(min_anomaly_size, max_anomaly_size, min_anomalies_ammout, LAZYLEN(all_turfs_for_spawn)) + max_anomalies_ammout = calculate_max_anomalies_ammout(min_anomaly_size, max_anomaly_size, max_anomalies_ammout, LAZYLEN(all_turfs_for_spawn)) + result_anomalies_ammout = calculate_result_anomalies_ammout(min_anomaly_size, max_anomaly_size, min_anomalies_ammout, max_anomalies_ammout, result_anomalies_ammout, LAZYLEN(all_turfs_for_spawn)) //Собрав все турфы и определившись с числом аномалий, давайте начинать @@ -184,33 +179,67 @@ source - Источник(Причина) генерации аномалий н //Выбрав количество артов которые мы хотим заспавнить, мы начинаем спавн var/spawned_anomalies_ammount = LAZYLEN(spawned_anomalies) - var/list/output_list = spawned_anomalies - var/spawned_artifacts_ammount = generate_artefacts_in_anomalies(spawned_anomalies, min_artefacts_ammount, max_artefacts_ammount) + var/spawned_artefacts_ammount = generate_artefacts_in_anomalies(spawned_anomalies.Copy(), min_artefacts_ammount, max_artefacts_ammount) var/spended_time = world.time - started_in //Отчитаемся if(spawned_anomalies_ammount > 0) - report_progress("Spawned [spawned_anomalies_ammount] anomalies with [spawned_artifacts_ammount] artefacts by: [source], spended [spended_time] ticks ") - return output_list + report_progress("Spawned [spawned_anomalies_ammount] anomalies with [spawned_artefacts_ammount] artefacts by: [source], spended [spended_time] ticks ") + LAZYADD(SSanom.important_logs, "Spawned [spawned_anomalies_ammount] anomalies with [spawned_artefacts_ammount] artefacts by: [source], spended [spended_time] ticks ") + return spawned_anomalies ///Функция генерация артефактов в аномалиях. Спавнит количество артефактов, находящиеся в диапазоне между min_artefacts_ammoun и max_artefacts_ammount /proc/generate_artefacts_in_anomalies(list/list_of_anomalies, min_artefacts_ammount, max_artefacts_ammount) var/artefacts_ammount = rand(min_artefacts_ammount, max_artefacts_ammount) + var/list/input_list = list_of_anomalies //Санитайз, чтоб не требовали рождение артефактов от тех, кто их рожать не может физически - for(var/obj/anomaly/picked_anomaly in list_of_anomalies) - if(!picked_anomaly.can_born_artifacts || !LAZYLEN(picked_anomaly.artefacts)) - LAZYREMOVE(list_of_anomalies, picked_anomaly) + for(var/obj/anomaly/picked_anomaly in input_list) + if(!picked_anomaly.can_born_artefacts || !LAZYLEN(picked_anomaly.artefacts)) + LAZYREMOVE(input_list, picked_anomaly) //Санитайз, чтоб артефактов было не слишком много - if(artefacts_ammount > LAZYLEN(list_of_anomalies)) - artefacts_ammount = LAZYLEN(list_of_anomalies) + if(artefacts_ammount > LAZYLEN(input_list)) + artefacts_ammount = LAZYLEN(input_list) var/spawned_artefacts = 0 //Пока игра не заспавнит все треуемые артефакты while(artefacts_ammount > spawned_artefacts) - var/obj/anomaly/choosed_anomaly = pick(list_of_anomalies) + var/obj/anomaly/choosed_anomaly = pick(input_list) if(!choosed_anomaly) return spawned_artefacts - if(choosed_anomaly.try_born_artifact()) + if(choosed_anomaly.try_born_artefact()) spawned_artefacts++ else - LAZYREMOVE(list_of_anomalies, choosed_anomaly) + LAZYREMOVE(input_list, choosed_anomaly) return spawned_artefacts + + + + + + + + + + + + + +/proc/calculate_min_anomalies_ammout(min_anomaly_size, max_anomaly_size, min_anomalies_ammout, all_turfs_for_spawn_len) + if((!min_anomalies_ammout) || (min_anomalies_ammout * min_anomaly_size > all_turfs_for_spawn_len)) + min_anomalies_ammout = 1 + return min_anomalies_ammout + + + +/proc/calculate_max_anomalies_ammout(min_anomaly_size, max_anomaly_size, max_anomalies_ammout, all_turfs_for_spawn_len) + if(!max_anomalies_ammout) + max_anomalies_ammout = all_turfs_for_spawn_len + max_anomalies_ammout /= max_anomaly_size + return max_anomalies_ammout + +/proc/calculate_result_anomalies_ammout(min_anomaly_size, max_anomaly_size, min_anomalies_ammout, max_anomalies_ammout, result_anomalies_ammout, all_turfs_for_spawn_len) + result_anomalies_ammout = rand(min_anomalies_ammout, max_anomalies_ammout) + if(result_anomalies_ammout * max_anomaly_size > all_turfs_for_spawn_len) + result_anomalies_ammout = all_turfs_for_spawn_len + result_anomalies_ammout /= max_anomaly_size + result_anomalies_ammout = Round(result_anomalies_ammout) + return result_anomalies_ammout diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/_planet_spawn_core.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/_planet_spawn_core.dm new file mode 100644 index 0000000000000..7632195bdccdc --- /dev/null +++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/_planet_spawn_core.dm @@ -0,0 +1,33 @@ +/obj/overmap/visitable/sector/exoplanet/build_level() + generate_atmosphere() + for (var/datum/exoplanet_theme/T in themes) + T.adjust_atmosphere(src) + if (atmosphere) + //Set up gases for living things + if (!length(breathgas)) + var/list/goodgases = atmosphere.gas.Copy() + var/gasnum = min(rand(1,3), length(goodgases)) + for (var/i = 1 to gasnum) + var/gas = pick(goodgases) + breathgas[gas] = round(0.4*goodgases[gas], 0.1) + goodgases -= gas + if (!badgas) + var/list/badgases = gas_data.gases.Copy() + badgases -= atmosphere.gas + badgas = pick(badgases) + generate_flora() + generate_map() + generate_features() + for (var/datum/exoplanet_theme/T in themes) + T.after_map_generation(src) + //Спавним аномалии + if(can_spawn_anomalies) + generate_anomalies() + //Если у планеты есть погода - спавним погоду + if(monitor_effect_type) + generate_monitor_effects() + generate_landing(2) + update_biome() + generate_daycycle() + generate_planet_image() + START_PROCESSING(SSobj, src) diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/clouds.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/clouds.dm new file mode 100644 index 0000000000000..dd9ace72beb41 --- /dev/null +++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/clouds.dm @@ -0,0 +1,183 @@ + +//Облачка +/turf/simulated/floor/exoplanet/clouds + name = "clouds" + icon_state = "clouds" + icon = 'mods/anomaly/icons/planets.dmi' + color = COLOR_WHITE + //У облак есть ЦЕЛОСТНОСТЬ. Чем её меньше - тем ближе облако к полному раскрытию. По умолчанию равно 100. + var/integrity = 100 + //Собственно, максимальная целостность облак + var/max_integrity = 100 + //Время последней обработки + var/last_processing = 0 + //Облачка будут обрабатываться с помощью SSanom раз в 0.5 секунд + var/processing_coldown = 0.5 SECONDS + //Обрабатывает раскрытие + var/opened = FALSE + var/started_openning = FALSE + +/turf/simulated/floor/exoplanet/clouds/Entered(atom/movable/AM) + ..() + if(isanomalyhere(src)) + return + //Если обьект НЕ моб, НЕ предмет или прожектайл - игнор + if((!ismech(AM) && !ismob(AM) && !isitem(AM)) || isprojectile(AM)) + return + if(locate(/obj/structure/catwalk) in src) + return + + if(isliving(AM)) + var/mob/living/L = AM + //Летающие существа не тревожат облака + if (L.can_overcome_gravity()) + return + //Артефакты с этим эффектом заставят облака игнорировать существо + var/list/result_effects = calculate_artefact_reaction(L, "Возможность упасть") + if(result_effects) + if(result_effects.Find("Держит в воздухе")) + return + + if(!opened && started_openning) + return + if(!opened && !started_openning) + START_PROCESSING(SSanom, src) + else if(opened) + check_clouds_turf(AM) + +//Проверяем сколько дамага наносится облачкам от обьектов на них +/turf/simulated/floor/exoplanet/clouds/Process() + if(world.time - last_processing < processing_coldown) + return //Время ещё не пришло + last_processing = world.time + //Собираем все обьекты на поверхности облачков + var/total_clouds_damage = 0 + for(var/atom/movable/choosed_atom in src) + if(isprojectile(choosed_atom) || isghost(choosed_atom) || (choosed_atom.anchored && !ismech(choosed_atom))) + continue + if(ismech(choosed_atom)) + total_clouds_damage += 100 + else if(isitem(choosed_atom)) + var/obj/item/choosed_item = choosed_atom + total_clouds_damage += 5 * choosed_item.w_class + else if(isliving(choosed_atom)) + var/mob/living/choosed_living = choosed_atom + total_clouds_damage += choosed_living.mob_size + if(total_clouds_damage) + damage_clouds(total_clouds_damage) + else + regenerate_clouds() + +/turf/simulated/floor/exoplanet/clouds/proc/damage_clouds(damage_amount) + integrity -= damage_amount + if(integrity <= 0) + integrity = 0 + open_clouds() + on_update_icon() + +/turf/simulated/floor/exoplanet/clouds/proc/regenerate_clouds() + integrity += 25 + if(integrity >= max_integrity) + integrity = max_integrity + STOP_PROCESSING(SSanom, src) + on_update_icon() + +/turf/simulated/floor/exoplanet/clouds/proc/open_clouds() + appearance = SSskybox.space_appearance_cache[(((x + y) ^ ~(x * y) + z) % 25) + 1] + opened = TRUE + check_clouds_turf() + addtimer(new Callback(src, PROC_REF(close_clouds)), 10 SECONDS) + +/turf/simulated/floor/exoplanet/clouds/proc/close_clouds() + appearance = initial(appearance) + opened = FALSE + START_PROCESSING(SSanom, src) + + +/turf/simulated/floor/exoplanet/clouds/on_update_icon() + var/percent = integrity/max_integrity * 100 + switch(percent) + if(100) + color = "#ffffff" + if(90 to 100) + color = "#e5f6ff" + if(80 to 90) + color = "#cceeff" + if(70 to 80) + color = "#b3e6ff" + if(60 to 70) + color = "#99ddff" + if(50 to 60) + color = "#80d5ff" + if(40 to 50) + color ="#66ccff" + if(30 to 40) + color = "#4db8ff" + if(20 to 30) + color = "#33ccff" + if(10 to 20) + color = "#00ccff" + if(0 to 10) + color = "#00ccff" + + +/turf/simulated/floor/exoplanet/clouds/proc/check_clouds_turf(atom/movable/AM) + if(!AM) + for(var/atom/movable/movable_atom in src) + //Если есть мостики - ничего не делаем + if(locate(/obj/structure/catwalk) in src) + return + //Если это живое существо, просчитаем дополнительно + if(isliving(AM)) + var/mob/living/L = AM + //Если существо летает - ему ничего не будет + if (L.can_overcome_gravity()) + return + //Артефакты с этим эффектом не позволят существу провалится вниз + var/list/result_effects = calculate_artefact_reaction(L, "Возможность упасть") + if(result_effects) + if(result_effects.Find("Защищает от падения")) + return + if(!movable_atom.anchored || ismech(movable_atom)) + visible_message("[movable_atom] со свистом улетает вниз", null, 7) + move_to_closest_safe_turf(movable_atom) + +///Задача функции - телепортировать игрока на любой турф который Не является облачками +/proc/move_to_closest_safe_turf(atom/movable/input_atom, bad_turf = /turf/simulated/floor/exoplanet/clouds) + if(!input_atom) + return FALSE + var/list/list_of_turfs_in_area = get_area_turfs(get_area(input_atom)) + while(LAZYLEN(list_of_turfs_in_area)) + var/turf/current_turf = pick(list_of_turfs_in_area) + if(!istype(current_turf, bad_turf)) + //Обьект/предмет/Моба вышвыривает на землю. СЖАЛИЛИСЬ. + input_atom.forceMove(current_turf) + //Мехам тут не место + if(ismech(input_atom)) + var/mob/living/exosuit/mech = input_atom + mech.gib() + else if(isliving(input_atom)) + var/mob/living/target = input_atom + //Артефакты с этим эффектом не позволят существу получить урон от падения + var/list/result_effects = calculate_artefact_reaction(target, "Падение с высоты") + if(result_effects) + if(result_effects.Find("Защищает от падения")) + return + var/damage = 5 + target.Weaken(5) + target.apply_damage(damage, DAMAGE_BRUTE, BP_HEAD) + target.apply_damage(damage, DAMAGE_BRUTE, BP_CHEST) + target.apply_damage(damage, DAMAGE_BRUTE, BP_GROIN) + target.apply_damage(damage, DAMAGE_BRUTE, BP_L_LEG) + target.apply_damage(damage, DAMAGE_BRUTE, BP_R_LEG) + target.apply_damage(damage, DAMAGE_BRUTE, BP_L_FOOT) + target.apply_damage(damage, DAMAGE_BRUTE, BP_R_FOOT) + target.apply_damage(damage, DAMAGE_BRUTE, BP_L_ARM) + target.apply_damage(damage, DAMAGE_BRUTE, BP_R_ARM) + target.apply_damage(damage, DAMAGE_BRUTE, BP_L_HAND) + target.apply_damage(damage, DAMAGE_BRUTE, BP_R_HAND) + return + else + LAZYREMOVE(list_of_turfs_in_area, current_turf) + //Если игрока не скинуло на новый турф - что-то не так. + to_chat(input_atom, SPAN_BAD("Что-то не так....")) diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/flying.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/flying.dm new file mode 100644 index 0000000000000..fb65cdd421fdf --- /dev/null +++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/flying.dm @@ -0,0 +1,193 @@ +/obj/overmap/visitable/sector/exoplanet/flying + name = "flying exoplanet" + desc = "A cluster of floating islands moving around an unknown object. WARNING: large gravity-anomalous activity detected. Extreme caution is required." + color = "#ebe3e3" + rock_colors = list(COLOR_WHITE) + can_spawn_anomalies = TRUE + anomalies_type = list( + /obj/anomaly/tramplin = 2, + /obj/anomaly/rvach/three_and_three = 1 + ) + possible_themes = list( + /datum/exoplanet_theme = 100 + ) + min_anomaly_size = 1 + max_anomaly_size = 9 + min_anomalies_ammout = 500 + max_anomalies_ammout = 700 + planetary_area = /area/exoplanet/flying + map_generators = list(/datum/random_map/noise/exoplanet/flying) + ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES + surface_color = "#11420c" + water_color = "#ffffff" + daycycle_range = list(5 HOURS, 1 MINUTES) + //Вечный день + sun_position = 1 + habitability_weight = HABITABILITY_EXTREME + has_trees = FALSE + flora_diversity = 5 + //Следующие руины нам НЕ подойдут из-за того что на облакал они выглядят крайне убого + +/* +1. Сперва имеем чистое полотно из травы +2. Расставляем руины +3. После успешного спавна собирает весь список турфов травы, проверяем чтоб они были пустые(На них не было обьектов) +4. Заменяем всю подходящую траву на облака +5. Запускаем генератор спавна островов +*/ +/obj/overmap/visitable/sector/exoplanet/flying/build_level() + generate_atmosphere() + for (var/datum/exoplanet_theme/T in themes) + T.adjust_atmosphere(src) + if (atmosphere) + //Set up gases for living things + if (!length(breathgas)) + var/list/goodgases = atmosphere.gas.Copy() + var/gasnum = min(rand(1,3), length(goodgases)) + for (var/i = 1 to gasnum) + var/gas = pick(goodgases) + breathgas[gas] = round(0.4*goodgases[gas], 0.1) + goodgases -= gas + if (!badgas) + var/list/badgases = gas_data.gases.Copy() + badgases -= atmosphere.gas + badgas = pick(badgases) + generate_map() + //Основные изменения + generate_features() + change_grass_to_clouds() + spawn_flying_islands() + //Основные изменения + for (var/datum/exoplanet_theme/T in themes) + T.after_map_generation(src) + if(can_spawn_anomalies) + generate_anomalies() + generate_landing(2) + update_biome() + generate_daycycle() + generate_planet_image() + START_PROCESSING(SSobj, src) + //Рисуем задник + var/turf/any_turf + for(var/turf/turfs in planetary_area) + any_turf = turfs + break + var/planet_z = get_z(any_turf) + var/datum/event/change_z_skybox = new /datum/event/change_z_skybox(new /datum/event_meta(EVENT_LEVEL_MAJOR)) + change_z_skybox.affecting_z = list(planet_z) + change_z_skybox.setup('mods/anomaly/icons/planet_backgrounds.dmi', "flying") + SSskybox.generate_skybox(planet_z) + +/obj/overmap/visitable/sector/exoplanet/flying/proc/change_grass_to_clouds() + var/list/list_to_change = list() + ///Все данные обьекты не будут заставлять оставлять траву. + var/list/whitelisted_entities = list( + /mob/observer/virtual, + /mob/observer/virtual/mob, + /atom/movable/lighting_overlay, + /obj/landmark/exoplanet_spawn/large_plant, + /mob/observer/ghost + ) + for(var/turf/simulated/floor/exoplanet/grass/choosed_grass_tile in planetary_area) + var/good_turf = TRUE + //Проверяем, чтоб у турфа не было ничего кроме того что указано в списке whitelisted_entities + for(var/atom/choosed_atom in choosed_grass_tile.contents) + if(!whitelisted_entities.Find(choosed_atom.type)) + good_turf = FALSE + //Значит обьект не входит в список дозволенных обьектов, оставим траву на месте. + if(good_turf) + LAZYADD(list_to_change, choosed_grass_tile) //Турф чистый, можно менять на облака + + for(var/turf/turf_to_spawn in list_to_change) + turf_to_spawn.ChangeTurf(/turf/simulated/floor/exoplanet/clouds) + turf_to_spawn.light_color = "#ffcc99" + turf_to_spawn.light_range = 3 + turf_to_spawn.update_light() + +//TODO: Я пока не смог найти причину по которой острова спавнятся на руинах, меняя тем самым турфы руины на турф острова +/obj/overmap/visitable/sector/exoplanet/flying/proc/spawn_flying_islands() + //Находим Z планеты, создаём с ним список + var/turf/any_turf + for(var/turf/turfs in planetary_area) + any_turf = turfs + break + var/list/input_z = list() + input_z += get_z(any_turf) + + //Создаём список возможных для спавна островов путём сбора "наследников" + var/list/islands_list = list() + for (var/T in subtypesof(/datum/map_template/ruin/flying_island)) + var/datum/map_template/ruin/exoplanet/ruin = T + islands_list += new ruin + //Выполняем спавн используя существующий код спавна диреликтов на планете + var/list/list_of_turfs = list() + for(var/turf/picked_turf in planetary_area) + LAZYADD(list_of_turfs, picked_turf) + var/islands_spawn_ammount = rand(25,45) + //После того как мы определились с количеством островов, приступаем к спавну + var/failures_ammount = 0 + for(var/i = 0, i < islands_spawn_ammount) + //Выбираем случайный турф + var/turf/current_turf = pick(list_of_turfs) //Выбираем турф для спавна + var/datum/map_template/ruin = pick(islands_list) //Выбираем остров + var/failure = FALSE + for(var/turf/picked_turf in ruin.get_affected_turfs(current_turf, 1)) + if(!istype(picked_turf, /turf/simulated/floor/exoplanet/clouds)) + //При попытке размещения диреликта, мы наехали на другой остров/обьект/что угодно + failure = TRUE + break + if(!failure) //Все турфы на которых мы хотим разместить остров - не являются островом + i++ + var/list/turfs_for_clean = ruin.get_affected_turfs(current_turf, 1) + //Удаляем заменённые турфы из списка турфов, т.к проверять их уже нет смысла + for(var/turf/cleared_turf in turfs_for_clean) + LAZYREMOVE(list_of_turfs, cleared_turf) + load_ruin(current_turf, pick(islands_list)) //Размещаем остров + else + failures_ammount++ + LAZYREMOVE(list_of_turfs, current_turf) + if(failures_ammount == 100) //Как и в генераторе аномок, аварийно выйдет из цикла при слишком большом количестве "ошибок" + break + //Расставляем свет для самих островов. Будут чутка светится зелёненьким светом + for(var/turf/simulated/floor/exoplanet/grass/picked_flying_grass in planetary_area) + //Если в соседнем тайле нет облачек - подсветим турф + picked_flying_grass.light_color = "#a3c8a0" + picked_flying_grass.light_range = 2 + picked_flying_grass.light_power = 2 + picked_flying_grass.update_light() + + + + + + + + +/obj/overmap/visitable/sector/exoplanet/flying/get_atmosphere_color() + var/air_color = ..() + return MixColors(COLOR_GRAY20, air_color) + + +/obj/overmap/visitable/sector/exoplanet/flying/generate_atmosphere() + ..() + atmosphere = new + atmosphere.temperature = rand(290, 330) + atmosphere.update_values() + var/good_gas = list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN = MOLES_N2STANDARD) + atmosphere.gas = good_gas + + +/datum/random_map/noise/exoplanet/flying + descriptor = "flying islands" + smoothing_iterations = 5 + land_type = /turf/simulated/floor/exoplanet/grass + //Указываем облака так же и водой, чтоб трава не могла спавнить на них флору и травушку + water_type = /turf/simulated/floor/exoplanet/grass + fauna_prob = 0 + flora_prob = 0 + grass_prob = 0 + + +/area/exoplanet/flying + ambience = list('sound/effects/wind/tundra0.ogg','sound/effects/wind/tundra1.ogg','sound/effects/wind/tundra2.ogg','sound/effects/wind/spooky0.ogg','sound/effects/wind/spooky1.ogg') + base_turf = /turf/simulated/floor/exoplanet/grass diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/ice.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/ice.dm new file mode 100644 index 0000000000000..dadf4498cadd1 --- /dev/null +++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/ice.dm @@ -0,0 +1,253 @@ +/obj/overmap/visitable/sector/exoplanet/ice + name = "ice exoplanet" + desc = "A distant, abandoned and cold world, rich in artefacts and anomalous activity." + color = "#ebe3e3" + rock_colors = list(COLOR_WHITE) + can_spawn_anomalies = TRUE + monitor_effect_type = /obj/monitor_effect_triger/snow + anomalies_type = list( + /obj/anomaly/electra/three_and_three = 2, + /obj/anomaly/electra/three_and_three/tesla = 7, + /obj/anomaly/electra/three_and_three/tesla_second = 6, + /obj/anomaly/cooler/two_and_two = 3, + /obj/anomaly/cooler/three_and_three = 3 + ) + possible_themes = list( + /datum/exoplanet_theme = 45, + /datum/exoplanet_theme/radiation_bombing = 10, + /datum/exoplanet_theme/ruined_city = 5, + /datum/exoplanet_theme/robotic_guardians = 10 + ) + min_anomaly_size = 4 + max_anomaly_size = 9 + min_anomalies_ammout = 600 + max_anomalies_ammout = 800 + planetary_area = /area/exoplanet/ice + map_generators = list(/datum/random_map/automata/cave_system/mountains/ice, /datum/random_map/noise/exoplanet/ice) + ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES + surface_color = "#ffffff" + water_color = "#0700c7" + habitability_weight = HABITABILITY_EXTREME + has_trees = FALSE + flora_diversity = 0 + + +/obj/overmap/visitable/sector/exoplanet/ice/get_atmosphere_color() + var/air_color = ..() + return MixColors(COLOR_GRAY20, air_color) + +/datum/random_map/automata/cave_system/mountains/ice + iterations = 2 + descriptor = "space ice rocks" + wall_type = /turf/simulated/mineral/ice + mineral_turf = /turf/simulated/mineral/ice + rock_color = COLOR_WHITE + +/turf/simulated/mineral/ice + name = "Ice wall" + icon_state = "ice_wall" + icon = 'mods/anomaly/icons/planets.dmi' + color = COLOR_WHITE + blocks_air = FALSE + initial_gas = list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN = MOLES_N2STANDARD) + +/turf/simulated/mineral/random/ice + name = "Ice wall" + icon_state = "ice_wall" + icon = 'mods/anomaly/icons/planets.dmi' + color = COLOR_WHITE + +/obj/overmap/visitable/sector/exoplanet/ice/generate_map() + .=..() + //После создания карты, разместим камушки + var/list/list_of_turfs = get_area_turfs(planetary_area) + //Соберём все подходящие для нас турфы льда + for(var/turf/picked_turf in list_of_turfs) + if(density) + LAZYREMOVE(list_of_turfs, picked_turf) + else if(!istype(picked_turf, /turf/simulated/floor/exoplanet/ice)) + LAZYREMOVE(list_of_turfs, picked_turf) + var/ice_block_ammout = rand(500, 1000) + //Спавним камушки на льду + while(ice_block_ammout > 0) + var/turf/current_turf = pick(list_of_turfs) + new /obj/structure/ice_rock(current_turf) + LAZYREMOVE(list_of_turfs, current_turf) + if(!LAZYLEN(list_of_turfs)) + ice_block_ammout = 0 + ice_block_ammout-- + + +/obj/overmap/visitable/sector/exoplanet/ice/generate_atmosphere() + ..() + atmosphere.temperature = rand(70, 150) + atmosphere.update_values() + + +/datum/random_map/noise/exoplanet/ice + descriptor = "ice exoplanet" + smoothing_iterations = 5 + land_type = /turf/simulated/floor/exoplanet/ice + water_type = /turf/simulated/floor/exoplanet/ice + water_level_min = 5 + water_level_max = 6 + fauna_prob = 0 + flora_prob = 0 + large_flora_prob = 0 + + +/area/exoplanet/ice + ambience = list('sound/effects/wind/tundra0.ogg','sound/effects/wind/tundra1.ogg','sound/effects/wind/tundra2.ogg','sound/effects/wind/spooky0.ogg','sound/effects/wind/spooky1.ogg') + base_turf = /turf/simulated/floor/exoplanet/ice + + + +//ICE ROCK + + +/turf/simulated/mineral/ice/on_update_icon(update_neighbors) + if(!istype(mineral)) + SetName(initial(name)) + icon_state = "ice_wall" + else + SetName("[mineral.ore_name] deposit") + + ClearOverlays() + + for(var/direction in GLOB.cardinal) + var/turf/turf_to_check = get_step(src,direction) + if(update_neighbors && istype(turf_to_check,/turf/simulated/floor/asteroid)) + var/turf/simulated/floor/asteroid/T = turf_to_check + T.updateMineralOverlays() + else if(istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor)) + var/image/rock_side = image(icon, "ice_side", dir = turn(direction, 180)) + rock_side.turf_decal_layerise() + switch(direction) + if(NORTH) + rock_side.pixel_y += world.icon_size + if(SOUTH) + rock_side.pixel_y -= world.icon_size + if(EAST) + rock_side.pixel_x += world.icon_size + if(WEST) + rock_side.pixel_x -= world.icon_size + AddOverlays(rock_side) + + if(ore_overlay) + AddOverlays(ore_overlay) + + if(excav_overlay) + AddOverlays(excav_overlay) + + if(archaeo_overlay) + AddOverlays(archaeo_overlay) + + +//СКАЛОЛАЗАНЬЕ +/turf/simulated/mineral/ice/examine(mob/user, distance, infix, suffix) + . = ..() + to_chat(user, SPAN_GOOD("Шагните на скалу, чтоб попытаться взабраться на неё.")) + +/turf/simulated/mineral/ice/CanPass(atom/movable/mover, turf/target, height, air_group) + if(istype(mover, /mob/living/carbon/human)) //Если пытается шагнуть человек - он может взабраться на скалу + if(!istype(mover.loc, /turf/simulated/mineral/ice)) + var/mob/living/carbon/human/user = mover + if(user.stamina < 60) + to_chat(mover, SPAN_BAD("Я слишком устал!")) + return + visible_message("[user] начинает взбираться вверх по склону.", "Вы слышите как кто-то залезает вверх по склону.", 5) + if(do_after(user, (15 SECONDS - (2 SECONDS *user.get_skill_value(SKILL_HAULING))))) + //Помощь друга даёт 25 процентов на успех и не даёт пораниться при падении + //Макс бонус от навыка составит 50 процентов + //Бонус от кирки при подьёме составит 25 процентов + var/helper_chance = 0 + var/pickaxe_chance = 0 + for(var/mob/living/carbon/human/helper in src) + if(helper.a_intent == I_HELP && turn(user.dir, 180) == helper.dir) //Лезущий и помощник должны смотреть друг другу в лицо + helper_chance = 25 + to_chat(user, SPAN_GOOD("[helper] помогает вам взобраться на скалу.")) + to_chat(helper, SPAN_GOOD("Вы помогаете [user] взобраться на скалу.")) + break //Помощник найден + if(user.IsHolding(/obj/item/pickaxe)) + to_chat(user, SPAN_NOTICE("Вам куда легче взбираться вверх с киркой.")) + pickaxe_chance = 25 + var/success_chance = (10 * user.get_skill_value(SKILL_HAULING)) + helper_chance + pickaxe_chance //Максимально - 100 процентов + if(prob(success_chance)) + user.forceMove(get_turf(src)) + to_chat(user, SPAN_GOOD("Вы успешно взбираетесь на гору.")) + else + var/list/result_effects = calculate_artefact_reaction(user, "Падение с высоты") + if(result_effects) + if(result_effects.Find("Защищает от падения")) + to_chat(user, SPAN_GOOD("Вы срываетесь вниз, но что-то ловит вас прямо у земли, оберегая от повреждений.")) + return + if(!helper_chance) //Нам никто не помог + for(var/picked_organ in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) + user.apply_damage(2.5, DAMAGE_BRUTE, picked_organ, used_weapon="Gravitation") + user.adjust_stamina(-50) + to_chat(user, SPAN_BAD("Вы срываетесь вниз, ударяясь в процессе.")) + else + user.adjust_stamina(-50) + to_chat(user, SPAN_COLOR("#ffa500","Вы срываетесь вниз, но стоящий сверху удерживает вас, предотвращая ранения.")) + + else + mover.forceMove(get_turf(src)) + . = ..() + +/turf/simulated/mineral/ice/Exit(O, newloc) + if(istype(O, /mob/living/carbon/human) && !istype(newloc,/turf/simulated/mineral/ice)) //Человек пытается слезть с скалы + var/mob/living/carbon/human/user = O + if(do_after(user, (15 SECONDS - (2 SECONDS * user.get_skill_value(SKILL_HAULING))))) //Чем лучше атлетика, тем быстрее спуск + //Помощь друга даёт 25 процентов на успех и не даёт пораниться при падении + //Макс бонус от навыка составит 50 процентов + //Бонус от кирки при подьёме составит 25 процентов + var/helper_chance = 0 + var/pickaxe_chance = 0 + for(var/mob/living/carbon/human/helper in newloc) + if(helper.a_intent == I_HELP && turn(user.dir, 180) == helper.dir) //Лезущий и помощник должны смотреть друг другу в лицо + helper_chance = 25 + to_chat(user, SPAN_GOOD("[helper] помогает вам взобраться на скалу.")) + to_chat(helper, SPAN_GOOD("Вы помогаете [user] взобраться на скалу.")) + break //Помощник найден + if(user.IsHolding(/obj/item/pickaxe)) + to_chat(user, SPAN_NOTICE("Вам куда легче взбираться вверх с киркой.")) + pickaxe_chance = 25 + var/success_chance = (10 * user.get_skill_value(SKILL_HAULING)) + helper_chance + pickaxe_chance //Максимально - 100 процентов + if(prob(success_chance)) + to_chat(user, SPAN_GOOD("Вы аккуратно слезаете со скалы.")) + user.forceMove(newloc) + else + var/list/result_effects = calculate_artefact_reaction(user, "Падение с высоты") + if(result_effects) + if(result_effects.Find("Защищает от падения")) + to_chat(user, SPAN_GOOD("Вы срываетесь вниз, но что-то ловит вас прямо у земли, оберегая от повреждений.")) + return + if(!helper_chance) + to_chat(user, SPAN_BAD("Вы срываетесь вниз со скалы.")) + for(var/picked_organ in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) + user.apply_damage(5, DAMAGE_BRUTE, picked_organ, used_weapon="Gravitation") + user.adjust_stamina(-100) + user.forceMove(newloc) + else + to_chat(user, SPAN_COLOR("#ffa500", "Вы срываетесь вниз со скалы, но вас ловят предотвращая ранения.")) + user.adjust_stamina(-100) + user.forceMove(newloc) + else + return FALSE + . = ..() + +/turf/simulated/mineral/ice/Bumped(AM) + return + +//Большие ледяные камни, красиво +/obj/structure/ice_rock + name = "ice rock" + desc = "A large block of ice, the edges of which can easily cut you. " + icon = 'mods/anomaly/icons/icerocks.dmi' + icon_state = "rock_1" + anchored = TRUE + var/icon_state_list = list("rock_1", "rock_2", "rock_3") + +/obj/structure/ice_rock/Initialize() + .=..() + icon_state = pick(icon_state_list) diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/sargas.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/sargas.dm new file mode 100644 index 0000000000000..b29fa45667931 --- /dev/null +++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/sargas.dm @@ -0,0 +1,64 @@ +/* Не доделан +/obj/overmap/visitable/sector/exoplanet/swamp + name = "Sargas" + desc = "Wild and mysterious planet, covered in vast swamplands and impenetrable swamps that provide both spectacular and dangerous terrain. Its unique ecosystem includes a variety of species of flora and fauna that have adapted to the conditions of such an environment." + color = "#054515" + rock_colors = list(COLOR_WHITE) + can_spawn_anomalies = TRUE + monitor_effect_type = /obj/monitor_effect_triger/swamp + anomalies_type = list() + min_anomaly_size = 4 + max_anomaly_size = 9 + min_anomalies_ammout = 250 + max_anomalies_ammout = 400 + planetary_area = /area/exoplanet/swamp + map_generators = list(/datum/random_map/noise/exoplanet/swamp) + ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES + surface_color = "#ffffff" + water_color = "#263908" + habitability_weight = HABITABILITY_EXTREME + has_trees = FALSE + flora_diversity = 0 + + +/obj/overmap/visitable/sector/exoplanet/swamp/get_atmosphere_color() + var/air_color = ..() + return MixColors(COLOR_GRAY20, air_color) + + + +/obj/overmap/visitable/sector/exoplanet/swamp/generate_atmosphere() + ..() + var/generator/new_temp = generator("num", 250, 300, NORMAL_RAND) + atmosphere.temperature = new_temp.Rand() + atmosphere.update_values() + + +/datum/random_map/noise/exoplanet/swamp + descriptor = "ice exoplanet" + smoothing_iterations = 5 + land_type = /turf/simulated/floor/exoplanet/grass + water_type = /turf/simulated/floor/exoplanet/swamp + water_level_min = 5 + water_level_max = 6 + fauna_prob = 0 + flora_prob = 0 + large_flora_prob = 0 + + +/area/exoplanet/swamp + ambience = list('sound/effects/wind/tundra0.ogg','sound/effects/wind/tundra1.ogg','sound/effects/wind/tundra2.ogg','sound/effects/wind/spooky0.ogg','sound/effects/wind/spooky1.ogg') + base_turf = /turf/simulated/floor/exoplanet/grass + +/turf/simulated/floor/exoplanet/swamp + name = "блядская вода" + desc = "В ней немного тонешь, хуя" + +/turf/simulated/floor/exoplanet/swamp/medium + name = "Средняя вода" + desc = "По пузо" + +/turf/simulated/floor/exoplanet/swamp/deep + name = "Глубокая вода" + desc = "По горло" +*/ diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/vulcanic.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/vulcanic.dm similarity index 53% rename from mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/vulcanic.dm rename to mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/vulcanic.dm index 8c8c74d5202e2..19cd927e4cee6 100644 --- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/vulcanic.dm +++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/vulcanic.dm @@ -1,11 +1,9 @@ -//Данный код отвечает за размещение аномалий по всей планете. /obj/overmap/visitable/sector/exoplanet/volcanic - ///Спавнятся ли на подобном типе планет аномалии can_spawn_anomalies = TRUE anomalies_type = list( - /obj/anomaly/zjarka = 4, - /obj/anomaly/zjarka/short_effect = 2, - /obj/anomaly/zjarka/long_effect = 1, + /obj/anomaly/zharka = 4, + /obj/anomaly/zharka/short_effect = 2, + /obj/anomaly/zharka/long_effect = 1, /obj/anomaly/heater/three_and_three = 3, /obj/anomaly/heater/two_and_two = 3 ) diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/flying.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/flying.dm deleted file mode 100644 index e1e904a9b5885..0000000000000 --- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/flying.dm +++ /dev/null @@ -1,99 +0,0 @@ -/* -Вне ротации -/obj/overmap/visitable/sector/exoplanet/flying - name = "flying exoplanet" - desc = "Flying around a certain center of the island." - color = "#ebe3e3" - rock_colors = list(COLOR_WHITE) - can_spawn_anomalies = TRUE - anomalies_type = list( - ) - min_anomaly_size = 1 - max_anomaly_size = 9 - min_anomalies_ammout = 40 - max_anomalies_ammout = 100 - planetary_area = /area/exoplanet/flying - map_generators = list(/datum/random_map/noise/exoplanet/flying) - ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES - surface_color = "#a46610" - water_color = "#ffffff" - habitability_weight = HABITABILITY_EXTREME - has_trees = FALSE - flora_diversity = 0 - - -/obj/overmap/visitable/sector/exoplanet/flying/get_atmosphere_color() - var/air_color = ..() - return MixColors(COLOR_GRAY20, air_color) - - -/obj/overmap/visitable/sector/exoplanet/flying/generate_atmosphere() - ..() - var/datum/species/H = all_species[SPECIES_HUMAN] - var/generator/new_temp = generator("num", H.cold_level_1 - 50, H.cold_level_3, NORMAL_RAND) - atmosphere.temperature = new_temp.Rand() - atmosphere.update_values() - - -/datum/random_map/noise/exoplanet/flying - descriptor = "ice exoplanet" - smoothing_iterations = 5 - land_type = /turf/simulated/floor/exoplanet/flying_rocks - water_type = /turf/simulated/floor/exoplanet/clouds - water_level_min = 5 - water_level_max = 6 - fauna_prob = 0 - flora_prob = 0 - large_flora_prob = 0 - - -/area/exoplanet/flying - ambience = list('sound/effects/wind/tundra0.ogg','sound/effects/wind/tundra1.ogg','sound/effects/wind/tundra2.ogg','sound/effects/wind/spooky0.ogg','sound/effects/wind/spooky1.ogg') - base_turf = /turf/simulated/floor/exoplanet/flying_rocks - - -//Облачка -/turf/simulated/floor/exoplanet/clouds - name = "clouds" - icon_state = "clouds" - icon = 'mods/anomaly/icons/planets.dmi' - color = COLOR_WHITE - //TRUE - облака раскрыты (видно что внизу), FALSE - не видно - var/opened = FALSE - //Обрабатывает раскрытие - var/started_openning = FALSE - -/turf/simulated/floor/exoplanet/clouds/Entered(atom/movable/AM) - ..() - if(!opened && started_openning) - return - if(!opened && !started_openning) - open_clouds() - return - else if(opened) - check_clouds_turf(AM) - -/turf/simulated/floor/exoplanet/clouds/proc/open_clouds() - flick("clouds_open", src) - icon_state = "clouds_clean" - opened = TRUE - addtimer(new Callback(src, PROC_REF(close_clouds)), 10 SECONDS) - -/turf/simulated/floor/exoplanet/clouds/proc/close_clouds() - flick("clouds_closed", src) - icon_state = "clouds" - opened = FALSE - -/turf/simulated/floor/exoplanet/clouds/proc/check_clouds_turf(atom/movable/AM) - if(!AM) - for(var/atom/target in src) - visible_message("[target] со свистом улетает вниз", null, 7) - qdel(target) - -//Пол каменный -/turf/simulated/floor/exoplanet/flying_rocks - name = "flying_rock" - icon_state = "flying_rock" - icon = 'mods/anomaly/icons/flying_floor.dmi' - color = COLOR_BROWN -*/ diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/ice.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/ice.dm deleted file mode 100644 index fdadecea5d53f..0000000000000 --- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_types/ice.dm +++ /dev/null @@ -1,115 +0,0 @@ -/obj/overmap/visitable/sector/exoplanet/ice - name = "ice exoplanet" - desc = "A distant, abandoned and cold world, rich in artifacts and anomalous activity." - color = "#ebe3e3" - rock_colors = list(COLOR_WHITE) - can_spawn_anomalies = TRUE - anomalies_type = list( - /obj/anomaly/electra/three_and_three = 5, - /obj/anomaly/electra/three_and_three/tesla = 2, - /obj/anomaly/electra/three_and_three/tesla_second = 1, - /obj/anomaly/cooler/two_and_two = 3, - /obj/anomaly/cooler/three_and_three = 3 - ) - min_anomaly_size = 4 - max_anomaly_size = 9 - min_anomalies_ammout = 250 - max_anomalies_ammout = 400 - planetary_area = /area/exoplanet/ice - map_generators = list(/datum/random_map/automata/cave_system/mountains/ice, /datum/random_map/noise/exoplanet/ice) - ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES - surface_color = "#ffffff" - water_color = "#0700c7" - habitability_weight = HABITABILITY_EXTREME - has_trees = FALSE - flora_diversity = 0 - - -/obj/overmap/visitable/sector/exoplanet/ice/get_atmosphere_color() - var/air_color = ..() - return MixColors(COLOR_GRAY20, air_color) - -/datum/random_map/automata/cave_system/mountains/ice - iterations = 2 - descriptor = "space ice rocks" - wall_type = /turf/simulated/mineral/ice - mineral_turf = /turf/simulated/mineral/ice - rock_color = COLOR_WHITE - -/turf/simulated/mineral/ice - name = "Ice wall" - icon_state = "ice_wall" - icon = 'mods/anomaly/icons/planets.dmi' - color = COLOR_WHITE - -/turf/simulated/mineral/random/ice - name = "Ice wall" - icon_state = "ice_wall" - icon = 'mods/anomaly/icons/planets.dmi' - color = COLOR_WHITE - -/obj/overmap/visitable/sector/exoplanet/ice/generate_atmosphere() - ..() - var/datum/species/H = all_species[SPECIES_HUMAN] - var/generator/new_temp = generator("num", H.cold_level_1 - 50, H.cold_level_3, NORMAL_RAND) - atmosphere.temperature = new_temp.Rand() - atmosphere.update_values() - - -/datum/random_map/noise/exoplanet/ice - descriptor = "ice exoplanet" - smoothing_iterations = 5 - land_type = /turf/simulated/floor/exoplanet/ice - water_type = /turf/simulated/floor/exoplanet/ice - water_level_min = 5 - water_level_max = 6 - fauna_prob = 0 - flora_prob = 0 - large_flora_prob = 0 - - -/area/exoplanet/ice - ambience = list('sound/effects/wind/tundra0.ogg','sound/effects/wind/tundra1.ogg','sound/effects/wind/tundra2.ogg','sound/effects/wind/spooky0.ogg','sound/effects/wind/spooky1.ogg') - base_turf = /turf/simulated/floor/exoplanet/ice - - - -//ICE ROCK - - -/turf/simulated/mineral/ice/on_update_icon(update_neighbors) - if(!istype(mineral)) - SetName(initial(name)) - icon_state = "ice_wall" - else - SetName("[mineral.ore_name] deposit") - - ClearOverlays() - - for(var/direction in GLOB.cardinal) - var/turf/turf_to_check = get_step(src,direction) - if(update_neighbors && istype(turf_to_check,/turf/simulated/floor/asteroid)) - var/turf/simulated/floor/asteroid/T = turf_to_check - T.updateMineralOverlays() - else if(istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor)) - var/image/rock_side = image(icon, "ice_side", dir = turn(direction, 180)) - rock_side.turf_decal_layerise() - switch(direction) - if(NORTH) - rock_side.pixel_y += world.icon_size - if(SOUTH) - rock_side.pixel_y -= world.icon_size - if(EAST) - rock_side.pixel_x += world.icon_size - if(WEST) - rock_side.pixel_x -= world.icon_size - AddOverlays(rock_side) - - if(ore_overlay) - AddOverlays(ore_overlay) - - if(excav_overlay) - AddOverlays(excav_overlay) - - if(archaeo_overlay) - AddOverlays(archaeo_overlay) diff --git a/mods/anomaly/code/spawn_anomalies_protocol/spawn_anomaly_with_big_artefact.dm b/mods/anomaly/code/spawn_anomalies_protocol/spawn_anomaly_with_big_artefact.dm index 6e398fa8c61ad..90b0458867f0e 100644 --- a/mods/anomaly/code/spawn_anomalies_protocol/spawn_anomaly_with_big_artefact.dm +++ b/mods/anomaly/code/spawn_anomalies_protocol/spawn_anomaly_with_big_artefact.dm @@ -12,23 +12,25 @@ var/min_artefacts_ammount = 1 var/max_artefacts_ammount = 2 ///Область в которой будет спавнить аномалии - var/range_spawn = 5 + var/range_spawn = 6 //Лист возможных аномалий для спавна var/list/possible_anomalies = list( /obj/anomaly/electra/three_and_three = 5, /obj/anomaly/electra/three_and_three/tesla = 1, /obj/anomaly/thamplin/random = 5, - /obj/anomaly/zjarka/short_effect = 3, - /obj/anomaly/zjarka/long_effect = 2, + /obj/anomaly/zharka/short_effect = 3, + /obj/anomaly/zharka/long_effect = 2, /obj/anomaly/rvach/three_and_three = 4 ) +/* +//Выведено из ротации, большой артефакт ничего не спавнит /obj/machinery/artifact/Initialize() . = ..() - if(icon_num == 0 || icon_num == 1 || icon_num == 7 || icon_num == 11 || icon_num == 12) + if(icon_num == 0 || icon_num == 1 || icon_num == 7 || icon_num == 11) if(can_born_anomalies) born_anomalies() - +*/ /obj/machinery/artifact/no_anomalies can_born_anomalies = FALSE diff --git a/mods/anomaly/code/spawn_anomalies_protocol/spawn_on_planet.dm b/mods/anomaly/code/spawn_anomalies_protocol/spawn_on_planet.dm index ff00342328a8b..57650beba3211 100644 --- a/mods/anomaly/code/spawn_anomalies_protocol/spawn_on_planet.dm +++ b/mods/anomaly/code/spawn_anomalies_protocol/spawn_on_planet.dm @@ -1,9 +1,33 @@ +/datum/map/build_exoplanets() + //Игра заспавнит 1 обычную планету и 1 аномальную + var/list/anomaly_planets_list = list( + /obj/overmap/visitable/sector/exoplanet/ice, + /obj/overmap/visitable/sector/exoplanet/volcanic, + /obj/overmap/visitable/sector/exoplanet/flying + ) + var/list/all_planets_list = subtypesof(/obj/overmap/visitable/sector/exoplanet) + LAZYREMOVE(all_planets_list, anomaly_planets_list) + //Я не придумал как обьяснять игре какая планета обычная, а какая аномальная без + //заранее подготовленных списков. Увы. + if(!use_overmap) + return + + for(var/i = 0, i < num_exoplanets, i++) + var/normal_planet_type = pick(all_planets_list) + var/obj/overmap/visitable/sector/exoplanet/new_planet = new normal_planet_type(null, world.maxx, world.maxy) + new_planet.build_level() + + var/anomaly_planet_type = pick(anomaly_planets_list) + var/obj/overmap/visitable/sector/exoplanet/anomaly_new_planet = new anomaly_planet_type(null, world.maxx, world.maxy) + anomaly_new_planet.build_level() + //Данный код отвечает за размещение аномалий по всей планете. /obj/overmap/visitable/sector/exoplanet ///Спавнятся ли на подобном типе планет аномалии var/can_spawn_anomalies = FALSE var/list/anomalies_type = list( ) + var/obj/monitor_effect_triger/monitor_effect_type var/min_anomaly_size = 1 var/max_anomaly_size = 3 ///Минимальное количество заспавненных артов @@ -53,3 +77,30 @@ else if(inputed_turf.y > y_limit) return FALSE return TRUE + +/obj/overmap/visitable/sector/exoplanet/proc/generate_monitor_effects() + set background = 1 + for(var/turf/choosed_turf in planetary_area) + new monitor_effect_type(choosed_turf) + + + + +///Задача ивента - сменить скайбокс Z уровня любой ценой +/datum/event/change_z_skybox + startWhen = 30 // About one minute early warning + endWhen = 999 HOURS // Adjusted automatically in tick() + has_skybox_image = TRUE + var/skybox_type = 'icons/skybox/rockbox.dmi' + var/skybox_icon_state = "rockbox" + +/datum/event/change_z_skybox/get_skybox_image() + var/image/res = overlay_image(skybox_type, skybox_icon_state, COLOR_ASTEROID_ROCK, RESET_COLOR) + res.blend_mode = BLEND_OVERLAY + return res + +/datum/event/change_z_skybox/setup(input_skybox_type, input_skybox_icon_state) + if(input_skybox_type) + skybox_type = input_skybox_type + if(input_skybox_icon_state) + skybox_icon_state = input_skybox_icon_state diff --git a/mods/anomaly/code/spawn_anomalies_protocol/spawn_with_ruins.dm b/mods/anomaly/code/spawn_anomalies_protocol/spawn_with_ruins.dm index f12165ca163d4..e0747ca090a0f 100644 --- a/mods/anomaly/code/spawn_anomalies_protocol/spawn_with_ruins.dm +++ b/mods/anomaly/code/spawn_anomalies_protocol/spawn_with_ruins.dm @@ -39,13 +39,13 @@ /obj/anomaly/electra/three_and_three/tesla_second = 1 ) -/obj/anomaly_spawner/zjarka +/obj/anomaly_spawner/Zharka name = "Hot spawner" - icon_state = "zjarka_spawn" + icon_state = "zharka_spawn" possible_anomalies = list( - /obj/anomaly/zjarka = 5, - /obj/anomaly/zjarka/short_effect = 2, - /obj/anomaly/zjarka/long_effect = 1, + /obj/anomaly/zharka = 5, + /obj/anomaly/zharka/short_effect = 2, + /obj/anomaly/zharka/long_effect = 1, /obj/anomaly/heater/three_and_three = 3, /obj/anomaly/heater/two_and_two = 5 ) diff --git a/mods/anomaly/icons/artifacts.dmi b/mods/anomaly/icons/artifacts.dmi index bb20006db576f..df7c50333b399 100644 Binary files a/mods/anomaly/icons/artifacts.dmi and b/mods/anomaly/icons/artifacts.dmi differ diff --git a/mods/anomaly/icons/bolts.dmi b/mods/anomaly/icons/bolts.dmi index 3a28e56453f50..47e2f9056f7b4 100644 Binary files a/mods/anomaly/icons/bolts.dmi and b/mods/anomaly/icons/bolts.dmi differ diff --git a/mods/anomaly/icons/deployer.dmi b/mods/anomaly/icons/deployer.dmi new file mode 100644 index 0000000000000..810cf58cc8cc2 Binary files /dev/null and b/mods/anomaly/icons/deployer.dmi differ diff --git a/mods/anomaly/icons/detection_icon.dmi b/mods/anomaly/icons/detection_icon.dmi new file mode 100644 index 0000000000000..2c0dd4cd7da1c Binary files /dev/null and b/mods/anomaly/icons/detection_icon.dmi differ diff --git a/mods/anomaly/icons/effects.dmi b/mods/anomaly/icons/effects.dmi index 59d0f0002f1b7..2695acfbebc6d 100644 Binary files a/mods/anomaly/icons/effects.dmi and b/mods/anomaly/icons/effects.dmi differ diff --git a/mods/anomaly/icons/flying_floor.dmi b/mods/anomaly/icons/flying_floor.dmi deleted file mode 100644 index 72b3c44f54dfe..0000000000000 Binary files a/mods/anomaly/icons/flying_floor.dmi and /dev/null differ diff --git a/mods/anomaly/icons/gurza_detector.dmi b/mods/anomaly/icons/gurza_detector.dmi new file mode 100644 index 0000000000000..f576983e10580 Binary files /dev/null and b/mods/anomaly/icons/gurza_detector.dmi differ diff --git a/mods/anomaly/icons/icerocks.dmi b/mods/anomaly/icons/icerocks.dmi new file mode 100644 index 0000000000000..e5f68fc4885e9 Binary files /dev/null and b/mods/anomaly/icons/icerocks.dmi differ diff --git a/mods/anomaly/icons/planet_backgrounds.dmi b/mods/anomaly/icons/planet_backgrounds.dmi new file mode 100644 index 0000000000000..ee3fd9d21fc14 Binary files /dev/null and b/mods/anomaly/icons/planet_backgrounds.dmi differ diff --git a/mods/anomaly/icons/planets.dmi b/mods/anomaly/icons/planets.dmi index a88b3c0369a26..d2af2fdfb52a3 100644 Binary files a/mods/anomaly/icons/planets.dmi and b/mods/anomaly/icons/planets.dmi differ diff --git a/mods/anomaly/icons/snow_screen.dmi b/mods/anomaly/icons/snow_screen.dmi new file mode 100644 index 0000000000000..7754db7476bca Binary files /dev/null and b/mods/anomaly/icons/snow_screen.dmi differ diff --git a/mods/anomaly/icons/spawn_protocol_stuff.dmi b/mods/anomaly/icons/spawn_protocol_stuff.dmi index 6ad5655d5a623..1787c093feed2 100644 Binary files a/mods/anomaly/icons/spawn_protocol_stuff.dmi and b/mods/anomaly/icons/spawn_protocol_stuff.dmi differ diff --git a/mods/anomaly/icons/weather_effects.dmi b/mods/anomaly/icons/weather_effects.dmi new file mode 100644 index 0000000000000..00083c464a24f Binary files /dev/null and b/mods/anomaly/icons/weather_effects.dmi differ diff --git a/mods/anomaly/maps/flying_islands/flying_island.dm b/mods/anomaly/maps/flying_islands/flying_island.dm new file mode 100644 index 0000000000000..1a3463f8cb39b --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island.dm @@ -0,0 +1,2 @@ +/datum/map_template/ruin/flying_island + mappaths = list('mods/anomaly/maps/flying_islands/flying_island_ball.dmm') diff --git a/mods/anomaly/maps/flying_islands/flying_island_2.dm b/mods/anomaly/maps/flying_islands/flying_island_2.dm new file mode 100644 index 0000000000000..cae5d6a02ff35 --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_2.dm @@ -0,0 +1,5 @@ +/datum/map_template/ruin/flying_island/second + mappaths = list('mods/anomaly/maps/flying_islands/flying_island_2.dmm') + name = "flying island second" + id = "flying_island_second" + spawn_cost = 1 diff --git a/mods/anomaly/maps/flying_islands/flying_island_2.dmm b/mods/anomaly/maps/flying_islands/flying_island_2.dmm new file mode 100644 index 0000000000000..9c2f3e3c3aa0e --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_2.dmm @@ -0,0 +1,1900 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"fr" = ( +/turf/simulated/floor/exoplanet/grass, +/area/template_noop) +"HI" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(2,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(3,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(4,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(5,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(6,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(7,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(8,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(9,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(10,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(11,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(12,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(13,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +"} +(14,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +fr +fr +fr +fr +fr +HI +"} +(15,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +fr +fr +fr +fr +fr +fr +fr +HI +"} +(16,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +"} +(17,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +"} +(18,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +"} +(19,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +"} +(20,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +"} +(21,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +"} +(22,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +"} +(23,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +"} +(24,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +"} +(25,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +"} +(26,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(27,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(28,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(29,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(30,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(31,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(32,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(33,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(34,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(35,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(36,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(37,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(38,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(39,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(40,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(41,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(42,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(43,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(44,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} diff --git a/mods/anomaly/maps/flying_islands/flying_island_3.dm b/mods/anomaly/maps/flying_islands/flying_island_3.dm new file mode 100644 index 0000000000000..baa464fbaca0a --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_3.dm @@ -0,0 +1,5 @@ +/datum/map_template/ruin/flying_island/third + mappaths = list('mods/anomaly/maps/flying_islands/flying_island_3.dmm') + name = "flying island third" + id = "flying_island_third" + spawn_cost = 1 diff --git a/mods/anomaly/maps/flying_islands/flying_island_3.dmm b/mods/anomaly/maps/flying_islands/flying_island_3.dmm new file mode 100644 index 0000000000000..56dbcbc8e05f5 --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_3.dmm @@ -0,0 +1,1900 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"fr" = ( +/turf/simulated/floor/exoplanet/grass, +/area/template_noop) +"HI" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(2,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(3,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(4,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(5,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(6,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(7,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(8,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +HI +HI +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(9,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(10,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(11,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(12,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(13,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(14,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(15,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(16,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(17,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(18,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(19,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(20,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +"} +(21,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +"} +(22,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +"} +(23,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +"} +(24,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +"} +(25,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +"} +(26,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +"} +(27,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +"} +(28,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +"} +(29,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +fr +HI +HI +HI +"} +(30,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(31,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(32,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +"} +(33,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +"} +(34,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(35,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(36,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(37,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(38,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +HI +HI +HI +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(39,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(40,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(41,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(42,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(43,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(44,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} diff --git a/mods/anomaly/maps/flying_islands/flying_island_4.dm b/mods/anomaly/maps/flying_islands/flying_island_4.dm new file mode 100644 index 0000000000000..b63bf08b40bbb --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_4.dm @@ -0,0 +1,5 @@ +/datum/map_template/ruin/flying_island/fourth + mappaths = list('mods/anomaly/maps/flying_islands/flying_island_ball.dmm') + name = "flying island ball" + id = "flying_island_ball" + spawn_cost = 1 diff --git a/mods/anomaly/maps/flying_islands/flying_island_4.dmm b/mods/anomaly/maps/flying_islands/flying_island_4.dmm new file mode 100644 index 0000000000000..aff98681813c7 --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_4.dmm @@ -0,0 +1,1900 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"fr" = ( +/turf/simulated/floor/exoplanet/grass, +/area/template_noop) +"HI" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(2,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(3,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(4,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +HI +HI +HI +HI +HI +"} +(5,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +HI +HI +"} +(6,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +"} +(7,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +"} +(8,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +"} +(9,1,1) = {" +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +"} +(10,1,1) = {" +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +"} +(11,1,1) = {" +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +"} +(12,1,1) = {" +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(13,1,1) = {" +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(14,1,1) = {" +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(15,1,1) = {" +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(16,1,1) = {" +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(17,1,1) = {" +HI +HI +fr +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(18,1,1) = {" +HI +fr +fr +fr +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(19,1,1) = {" +HI +fr +fr +fr +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(20,1,1) = {" +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(21,1,1) = {" +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(22,1,1) = {" +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +fr +fr +fr +fr +fr +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +"} +(23,1,1) = {" +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +"} +(24,1,1) = {" +HI +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +fr +fr +fr +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +"} +(25,1,1) = {" +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +fr +fr +fr +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +"} +(26,1,1) = {" +HI +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +fr +fr +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(27,1,1) = {" +HI +fr +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(28,1,1) = {" +HI +fr +fr +fr +fr +fr +fr +fr +HI +HI +HI +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +"} +(29,1,1) = {" +HI +fr +fr +HI +fr +fr +fr +fr +HI +HI +HI +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +fr +fr +fr +HI +HI +HI +HI +HI +HI +HI +"} +(30,1,1) = {" +HI +fr +HI +HI +HI +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +fr +fr +HI +HI +HI +HI +HI +HI +HI +"} +(31,1,1) = {" +HI +HI +HI +HI +HI +fr +fr +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(32,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(33,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(34,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(35,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(36,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(37,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(38,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(39,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(40,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(41,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(42,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(43,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} +(44,1,1) = {" +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +"} diff --git a/mods/anomaly/maps/flying_islands/flying_island_5.dm b/mods/anomaly/maps/flying_islands/flying_island_5.dm new file mode 100644 index 0000000000000..9fdbe53c3da69 --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_5.dm @@ -0,0 +1,5 @@ +/datum/map_template/ruin/flying_island/fifth + mappaths = list('mods/anomaly/maps/flying_islands/flying_island_ball.dmm') + name = "flying island ball" + id = "flying_island_ball" + spawn_cost = 1 diff --git a/mods/anomaly/maps/flying_islands/flying_island_5.dmm b/mods/anomaly/maps/flying_islands/flying_island_5.dmm new file mode 100644 index 0000000000000..395f2cfdcaaad --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_5.dmm @@ -0,0 +1,140 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"c" = ( +/turf/simulated/floor/exoplanet/grass, +/area/template_noop) + +(1,1,1) = {" +a +a +c +c +a +a +c +a +a +a +"} +(2,1,1) = {" +a +c +c +c +c +c +c +c +c +a +"} +(3,1,1) = {" +a +a +c +c +c +c +c +c +c +a +"} +(4,1,1) = {" +a +a +a +c +c +c +c +c +c +c +"} +(5,1,1) = {" +c +a +a +a +c +c +a +c +c +c +"} +(6,1,1) = {" +c +c +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +c +c +c +c +a +a +a +a +a +a +"} +(8,1,1) = {" +a +c +c +c +c +c +a +a +a +a +"} +(9,1,1) = {" +a +c +c +c +c +c +c +a +a +a +"} +(10,1,1) = {" +a +a +c +c +c +c +c +c +c +a +"} +(11,1,1) = {" +a +a +a +a +a +c +c +c +c +a +"} diff --git a/mods/anomaly/maps/flying_islands/flying_island_ball.dm b/mods/anomaly/maps/flying_islands/flying_island_ball.dm new file mode 100644 index 0000000000000..1c88e7f3f2d5b --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_ball.dm @@ -0,0 +1,5 @@ +/datum/map_template/ruin/flying_island/ball + mappaths = list('mods/anomaly/maps/flying_islands/flying_island_ball.dmm') + name = "flying island ball" + id = "flying_island_ball" + spawn_cost = 1 diff --git a/mods/anomaly/maps/flying_islands/flying_island_ball.dmm b/mods/anomaly/maps/flying_islands/flying_island_ball.dmm new file mode 100644 index 0000000000000..f05d40839e690 --- /dev/null +++ b/mods/anomaly/maps/flying_islands/flying_island_ball.dmm @@ -0,0 +1,140 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"c" = ( +/turf/simulated/floor/exoplanet/grass, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +c +c +c +c +c +c +a +a +"} +(3,1,1) = {" +a +c +c +c +c +c +c +c +c +a +"} +(4,1,1) = {" +a +c +c +c +c +c +c +c +c +a +"} +(5,1,1) = {" +a +c +c +c +c +c +c +c +c +a +"} +(6,1,1) = {" +a +c +c +c +c +c +c +c +c +a +"} +(7,1,1) = {" +a +c +c +c +c +c +c +c +c +a +"} +(8,1,1) = {" +a +c +c +c +c +c +c +c +c +a +"} +(9,1,1) = {" +a +c +c +c +c +c +c +c +c +a +"} +(10,1,1) = {" +a +a +c +c +c +c +c +c +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/mods/anomaly/maps/zjarka_ruins/zjarka_ruins.dm b/mods/anomaly/maps/zharka_ruins/zharka_ruins.dm similarity index 79% rename from mods/anomaly/maps/zjarka_ruins/zjarka_ruins.dm rename to mods/anomaly/maps/zharka_ruins/zharka_ruins.dm index 1ef6179e5c782..bd6c065eee4d2 100644 --- a/mods/anomaly/maps/zjarka_ruins/zjarka_ruins.dm +++ b/mods/anomaly/maps/zharka_ruins/zharka_ruins.dm @@ -4,7 +4,7 @@ name = "Lava anomalies" id = "planetsite_anomalies_hots" description = "anomalies lol." - mappaths = list('mods/anomaly/maps/zjarka_ruins/zjarka_ruins.dmm') + mappaths = list('mods/anomaly/maps/Zharka_ruins/Zharka_ruins.dmm') spawn_cost = 1 ruin_tags = RUIN_HOT_ANOMALIES */ diff --git a/mods/anomaly/maps/zjarka_ruins/zjarka_ruins.dmm b/mods/anomaly/maps/zharka_ruins/zharka_ruins.dmm similarity index 96% rename from mods/anomaly/maps/zjarka_ruins/zjarka_ruins.dmm rename to mods/anomaly/maps/zharka_ruins/zharka_ruins.dmm index cbf5c40b5c9f9..22ac0bf01305c 100644 --- a/mods/anomaly/maps/zjarka_ruins/zjarka_ruins.dmm +++ b/mods/anomaly/maps/zharka_ruins/zharka_ruins.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "c" = ( -/obj/anomaly_spawner/zjarka, +/obj/anomaly_spawner/zharka, /turf/unsimulated/floor/lava/cold, /area/template_noop) "u" = ( diff --git a/mods/anomaly/sounds/snowstorm.ogg b/mods/anomaly/sounds/snowstorm.ogg new file mode 100644 index 0000000000000..63ead3e2c893a Binary files /dev/null and b/mods/anomaly/sounds/snowstorm.ogg differ diff --git a/mods/anomaly/sounds/zjarka.ogg b/mods/anomaly/sounds/zharka.ogg similarity index 100% rename from mods/anomaly/sounds/zjarka.ogg rename to mods/anomaly/sounds/zharka.ogg diff --git a/mods/antagonists/_antagonists.dme b/mods/antagonists/_antagonists.dme index 498a850bc8016..246b9f8ac0a57 100644 --- a/mods/antagonists/_antagonists.dme +++ b/mods/antagonists/_antagonists.dme @@ -11,5 +11,5 @@ #include "code/traitor.dm" #include "code/uplink.dm" #include "code/maint_ninja.dm" - +#include "code/raider.dm" #endif diff --git a/mods/antagonists/code/mercenary.dm b/mods/antagonists/code/mercenary.dm index c5f7fd4cc92a6..f9ade5c0d39eb 100644 --- a/mods/antagonists/code/mercenary.dm +++ b/mods/antagonists/code/mercenary.dm @@ -1,3 +1,6 @@ +/datum/antagonist/mercenary + initial_spawn_target = 5 + /obj/item/storage/dufflebag/heavy/syndie name = "Heavy gorlex bag" desc = "it looks too bulky and bloody" @@ -521,3 +524,113 @@ Used for quick dress-up. Also comes with several discount /obj/item/rig_module/vision, /obj/item/rig_module/cooling_unit ) + + +//droppod stuff + +/datum/map_template/ruin/antag_spawn/mercenary/New() + . = ..() + shuttles_to_initialise += list(/datum/shuttle/autodock/overmap/merc_drop_pod) + +/obj/overmap/visitable/sector/merc_base/New() + . = ..() + initial_generic_waypoints += list( + "nav_merc_pod_start" + ) + +/datum/shuttle/autodock/overmap/merc_drop_pod + name = "Cyclopes Droppod" + shuttle_area = list(/area/map_template/merc_shuttle/drop_pod) + dock_target = "merc_drop_pod" + current_location = "nav_merc_pod_start" + landmark_transition = "nav_transit_scavshuttle" + range = 1 + fuel_consumption = 4 + ceiling_type = /turf/simulated/floor/shuttle_ceiling + defer_initialisation = TRUE + mothershuttle = "Cyclopes" + +/obj/machinery/computer/shuttle_control/explore/merc_shuttle/merc_drop_pod + name = "Pod control console" + shuttle_tag = "Cyclopes Droppod" + +/obj/overmap/visitable/ship/landable/merc_drop_pod + name = "Cyclopes Droppod" + shuttle = "Cyclopes Droppod" + desc = "A small, unmarked vessel." + fore_dir = NORTH + vessel_size = SHIP_SIZE_SMALL + vessel_mass = 2500 + +/obj/shuttle_landmark/merc_pod/start + landmark_tag = "nav_merc_pod_start" + name = "Cyclopes Drop Pod Base" + base_area = /area/map_template/merc_shuttle/drop_pod + movable_flags = MOVABLE_FLAG_EFFECTMOVE + +/obj/shuttle_landmark/merc_pod/merc_ship + landmark_tag = "nav_merc_pod_ship" + name = "Cyclopes Drop Pod Ship" + +/area/map_template/merc_shuttle/drop_pod + name = "\improper Cyclopes Droppod" + icon_state = "yellow" + area_flags = AREA_FLAG_RAD_SHIELDED | AREA_FLAG_ION_SHIELDED + req_access = list(access_syndicate) + +/obj/machinery/computer/shuttle_control/explore/merc_shuttle/merc_drop_pod + skill_req = SKILL_BASIC + + +/obj/machinery/button/alternate/pod_doors_explodey + name = "Explode pod door" + + var/burst = 4 + var/notbeenactivated = TRUE + var/last_shot = 0 + var/fire_delay = 0.2 SECONDS + +/obj/machinery/button/alternate/pod_doors_explodey/activate(mob/living/user) + if(notbeenactivated) + notbeenactivated = FALSE + door_activate() + else + to_chat(usr, SPAN_WARNING("The hullbreaker is already been used.")) + +/obj/machinery/button/alternate/pod_doors_explodey/proc/door_activate() + for(burst; burst >= 0; burst -= 1) + if((last_shot + fire_delay) <= world.time) + last_shot = world.time + for(var/i in 1 to burst) + var/obj/item/projectile/proj = new /obj/item/projectile/beam/hullbreaker(get_turf(src)) + proj.launch( get_step(loc, src.dir) ) + playsound(src.loc, 'sound/weapons/railgun.ogg', 30, 1) + if(i < burst) + sleep(fire_delay) + + +/obj/item/projectile/beam/hullbreaker + name = "hullbreaker" + icon_state = "omnilaser" + fire_sound = 'sound/weapons/railgun.ogg' + damage = 950 + armor_penetration = 100 + edge = TRUE + damage_type = DAMAGE_EXPLODE + life_span = 3 + pass_flags = PASS_FLAG_TABLE + distance_falloff = 3 + + muzzle_type = /obj/projectile/pointdefense/muzzle + tracer_type = /obj/projectile/pointdefense/tracer + impact_type = /obj/projectile/pointdefense/impact + +/obj/item/projectile/beam/hullbreaker/on_impact(atom/A) + . = ..() + if(A.density) + A.ex_act(EX_ACT_DEVASTATING) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 80, 1) + for(var/mob/H in range(20, src)) + if(!H.stat && !istype(H, /mob/living/silicon/ai))\ + shake_camera(H, 5, 2) + qdel(src) diff --git a/mods/antagonists/code/raider.dm b/mods/antagonists/code/raider.dm new file mode 100644 index 0000000000000..013e11ec255c3 --- /dev/null +++ b/mods/antagonists/code/raider.dm @@ -0,0 +1,2 @@ +/datum/antagonist/raider + initial_spawn_target = 4 diff --git a/mods/antagonists/code/revolutionary.dm b/mods/antagonists/code/revolutionary.dm index 7bd30b2cbaef7..a92cd845b6d98 100644 --- a/mods/antagonists/code/revolutionary.dm +++ b/mods/antagonists/code/revolutionary.dm @@ -4,7 +4,7 @@ restricted_jobs = list(/datum/job/detective, /datum/job/officer, /datum/job/warden) /datum/game_mode/revolution - antag_tags = list(MODE_REVOLUTIONARY, MODE_MERCENARY) + antag_tags = list(MODE_REVOLUTIONARY) /datum/game_mode/siege antag_tags = list(MODE_REVOLUTIONARY, MODE_MERCENARY) diff --git a/mods/antagonists/code/traitor.dm b/mods/antagonists/code/traitor.dm index 9547c4591d6ce..c8c14b51a458a 100644 --- a/mods/antagonists/code/traitor.dm +++ b/mods/antagonists/code/traitor.dm @@ -1,6 +1,9 @@ // // DOOR CHARGE // +/datum/antagonist/traitor + initial_spawn_target = 3 + /obj/item/door_charge name = "door charge" diff --git a/mods/character_traits/README.md b/mods/character_traits/README.md new file mode 100644 index 0000000000000..68dfd77a7ef2e --- /dev/null +++ b/mods/character_traits/README.md @@ -0,0 +1,83 @@ + +#### Список PRов: + +- https://github.com/SierraBay/SierraBay12/pull/2777 + + + +## Черты персонажа + +ID мода: CHARACTER_TRAITS + + +### Описание мода + +Добавляет простой список для выбора особенностей персонажа, не отсносящимся к лоадауту, внешности, органам или к культуре. + + +### Изменения *кор кода* + +- Отсутствуют + + +### Оверрайды + + - `/mods/character_traits/character_traits.dm`: + - `/datum/preferences/mod_traits` + - `/datum/category_item/player_setup_item/physical/body/sanitize_character()` + - `/datum/category_item/player_setup_item/physical/body/load_character(datum/pref_record_reader/R)` + - `/datum/category_item/player_setup_item/physical/body/save_character(datum/pref_record_writer/W)` + - `/datum/category_item/player_setup_item/physical/body/content(mob/user)` + - `/datum/job/post_equip_rank(mob/person, alt_title)` + + +### Дефайны + +- Отсутствуют + + +### Используемые файлы, не содержащиеся в модпаке + +- Отсутствуют + + +### Авторы: + +Builder13 + diff --git a/mods/character_traits/_character_traits.dm b/mods/character_traits/_character_traits.dm new file mode 100644 index 0000000000000..de5b67b089744 --- /dev/null +++ b/mods/character_traits/_character_traits.dm @@ -0,0 +1,4 @@ +/singleton/modpack/character_traits + name = "Character traits" + desc = "Модификаторы персонажа при создании." + author = "Builder13" \ No newline at end of file diff --git a/mods/character_traits/_character_traits.dme b/mods/character_traits/_character_traits.dme new file mode 100644 index 0000000000000..223de81ff5338 --- /dev/null +++ b/mods/character_traits/_character_traits.dme @@ -0,0 +1,10 @@ +#ifndef MODPACK_CHARMODS +#define MODPACK_CHARMODS + +#include "_character_traits.dm" +#include "code/character_traits.dm" +#include "code/all.dm" +#include "code/unathi.dm" +#include "code/glob_character_traits.dm" + +#endif diff --git a/mods/character_traits/code/all.dm b/mods/character_traits/code/all.dm new file mode 100644 index 0000000000000..951b1e727c847 --- /dev/null +++ b/mods/character_traits/code/all.dm @@ -0,0 +1,12 @@ +/* +/datum/mod_trait/clumsiness + name = "All - clumsiness" + description = "Добавляет мутацию неуклюжести." + +/datum/mod_trait/clumsiness/apply_trait(mob/living/carbon/human/H) + var/block = GLOB.CLUMSYBLOCK + H.dna.check_integrity() + H.dna.SetSEState(block, 1) + domutcheck(H,null) + to_chat(H, SPAN_NOTICE("Активирована черта персонажа [name].")) +*/ \ No newline at end of file diff --git a/mods/character_traits/code/character_traits.dm b/mods/character_traits/code/character_traits.dm new file mode 100644 index 0000000000000..e9af85a339c0a --- /dev/null +++ b/mods/character_traits/code/character_traits.dm @@ -0,0 +1,78 @@ +/datum/preferences + var/list/mod_traits = list() + +/datum/mod_trait + var/name = "" + var/description = "" + var/list/incompatible_traits + var/list/subspecies_allowed + var/list/species_allowed + +/datum/mod_trait/proc/apply_trait(mob/living/carbon/human/H) + return FALSE + +/datum/category_item/player_setup_item/physical/body/sanitize_character() + . = ..() + if(!istype(pref.mod_traits)) + pref.mod_traits = list() + else + pref.mod_traits &= GLOB.all_mod_traits + +/datum/category_item/player_setup_item/physical/body/load_character(datum/pref_record_reader/R) + . = ..() + pref.mod_traits = R.read("mod_traits") + +/datum/category_item/player_setup_item/physical/body/save_character(datum/pref_record_writer/W) + . = ..() + W.write("mod_traits", pref.mod_traits) + +/datum/category_item/player_setup_item/physical/body/content(mob/user) + . = ..() + . += "
    [BTN("add_mod_trait", "+ Add trait")]" + for (var/mod_trait in pref.mod_traits) + var/datum/mod_trait/M = GLOB.all_mod_traits[mod_trait] + + . += "
    [VTBTN("remove_mod_trait", mod_trait, "-", mod_trait)] " + + if(M.description) + . += M.description + + if (length(pref.mod_traits)) + . += "
    " + +/datum/category_item/player_setup_item/physical/body/OnTopic(href,list/href_list, mob/user) + . = ..() + if(href_list["set_species"]) + pref.mod_traits.Cut() + + if(href_list["add_mod_trait"]) + var/datum/species/mob_species = all_species[pref.species] + var/list/disallowed_mod_traits = list() + for (var/M in pref.mod_traits) + var/datum/mod_trait/char_mod = GLOB.all_mod_traits[M] + disallowed_mod_traits |= char_mod.incompatible_traits + var/list/usable_char_mods = pref.mod_traits.Copy() ^ GLOB.all_mod_traits.Copy() + for(var/M in usable_char_mods) + var/datum/mod_trait/S = usable_char_mods[M] + if(is_type_in_list(S, disallowed_mod_traits) || (S.species_allowed && !(mob_species.get_bodytype() in S.species_allowed)) || (S.subspecies_allowed && !(mob_species.name in S.subspecies_allowed))) + usable_char_mods -= M + + if(!usable_char_mods || length(usable_char_mods) == 0) + to_chat(user, SPAN_WARNING("Отсутствуют черты персонажа для выбора.")) + var/new_char_mod = input(user, "Choose a character modification:", CHARACTER_PREFERENCE_INPUT_TITLE) as null|anything in usable_char_mods + if(new_char_mod && CanUseTopic(user)) + pref.mod_traits[new_char_mod] = TRUE + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["remove_mod_trait"]) + var/M = href_list["remove_mod_trait"] + pref.mod_traits -= M + return TOPIC_REFRESH_UPDATE_PREVIEW + +/datum/job/post_equip_rank(mob/person, alt_title) + . = ..() + if(istype(person, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = person + for(var/char_mod in person.client.prefs.mod_traits) + var/datum/mod_trait/M = GLOB.all_mod_traits[char_mod] + M.apply_trait(H) \ No newline at end of file diff --git a/mods/character_traits/code/glob_character_traits.dm b/mods/character_traits/code/glob_character_traits.dm new file mode 100644 index 0000000000000..d965a25478683 --- /dev/null +++ b/mods/character_traits/code/glob_character_traits.dm @@ -0,0 +1,11 @@ +GLOBAL_LIST_EMPTY(all_mod_traits) + +/hook/global_init/makeDatumRefLists() + . = ..() + var/paths = typesof(/datum/mod_trait) - /datum/mod_trait + for(var/path in paths) + var/datum/mod_trait/M = path + if (!initial(M.name)) + continue + M = new path() + GLOB.all_mod_traits[M.name] = M \ No newline at end of file diff --git a/mods/character_traits/code/unathi.dm b/mods/character_traits/code/unathi.dm new file mode 100644 index 0000000000000..504f7ce064b78 --- /dev/null +++ b/mods/character_traits/code/unathi.dm @@ -0,0 +1,62 @@ +/datum/mod_trait/unathi/ + species_allowed = list(SPECIES_UNATHI) + +/datum/mod_trait/unathi/slow_regen + name = SPECIES_UNATHI + " - slow regeneration" + description = "Не может отрастить конечность в течении смены, регенерация все еще быстрее чем у человека. Меньше расовых негативных последствий от отсутствия пищи." + incompatible_traits = list(/datum/mod_trait/unathi/no_regen) + +/datum/mod_trait/unathi/slow_regen/apply_trait(mob/living/carbon/human/H) + H.species.remove_base_auras(H) + if(H.species.type == /datum/species/unathi/yeosa) + H.species.base_auras = list(/obj/aura/regenerating/human/unathi_slow_regen/yeosa) + else + H.species.base_auras = list(/obj/aura/regenerating/human/unathi_slow_regen) + H.species.add_base_auras(H) + to_chat(H, SPAN_NOTICE("Активирована черта персонажа [name].")) + +/datum/mod_trait/unathi/no_regen + name = SPECIES_UNATHI + " - no regeneration" + description = "Скорость регенерации как у человека, отсутствуют расовые негативные последствия от нехватки пищи." + incompatible_traits = list(/datum/mod_trait/unathi/slow_regen) + +/datum/mod_trait/unathi/no_regen/apply_trait(mob/living/carbon/human/H) + H.species.remove_base_auras(H) + H.species.base_auras = list() + to_chat(H, SPAN_NOTICE("Активирована черта персонажа [name].")) + + +/obj/aura/regenerating/human/unathi_slow_regen + regen_message = "You feel a soothing sensation as your ORGAN mends..." + ignore_tag = BP_HEAD + +/obj/aura/regenerating/human/unathi_slow_regen/can_toggle() + return FALSE + +/obj/aura/regenerating/human/unathi_slow_regen/can_regenerate_organs() + return can_toggle() + +/obj/aura/regenerating/human/unathi_slow_regen/aura_check_life() + var/mob/living/carbon/human/H = user + if (!istype(H) || H.stat == DEAD) + return AURA_CANCEL + if (H.stasis_value) + return AURA_FALSE + if (H.nutrition < 50) + H.apply_damage(1, DAMAGE_TOXIN) + H.adjust_nutrition(3) + return AURA_FALSE + nutrition_damage_mult = 1 + brute_mult = 1 + organ_mult = 2 + grow_chance = 0 + var/obj/machinery/optable/optable = locate() in get_turf(H) + if (optable?.suppressing && H.sleeping) + nutrition_damage_mult = 0.5 + brute_mult = 0.5 + organ_mult = 1 + + return ..() + +/obj/aura/regenerating/human/unathi_slow_regen/yeosa + tox_mult = 1.5 \ No newline at end of file diff --git a/mods/chemtweaks/README.md b/mods/chemtweaks/README.md new file mode 100644 index 0000000000000..eccfa13d8eecb --- /dev/null +++ b/mods/chemtweaks/README.md @@ -0,0 +1,71 @@ +#### Список PRов: + +https://github.com/SierraBay/SierraBay12/pull/2823 + + +## Мод-пример + +ID мода: CHEMTWEAKS + + +### Описание мода + +Мод, служащий для более лёгкого изменения рецептов. + + +### Изменения *кор кода* + +Отсутствуют + + +### Оверрайды + +- `code/modules/reagents/Chemistry-Recipes.dm` + + +### Дефайны + +Отсутствуют + + +### Используемые файлы, не содержащиеся в модпаке + +Отсутствуют + + +### Авторы: + +Baneuus + diff --git a/mods/chemtweaks/_chemtweaks.dm b/mods/chemtweaks/_chemtweaks.dm new file mode 100644 index 0000000000000..11c0a8b3ae95a --- /dev/null +++ b/mods/chemtweaks/_chemtweaks.dm @@ -0,0 +1,4 @@ +/singleton/modpack/chemtweaks + name = "ChemTweaks" + desc = "Мод, позволяющий так или иначе изменять рецепты в билде" + author = "Baneuus" diff --git a/mods/chemtweaks/_chemtweaks.dme b/mods/chemtweaks/_chemtweaks.dme new file mode 100644 index 0000000000000..e80130ed99e97 --- /dev/null +++ b/mods/chemtweaks/_chemtweaks.dme @@ -0,0 +1,8 @@ +#ifndef MODPACK_CHEMTWEAKS +#define MODPACK_CHEMTWEAKS + +#include "_chemtweaks.dm" + +#include "code/Chemistry-Recipes.dm" + +#endif diff --git a/mods/chemtweaks/code/Chemistry-Recipes.dm b/mods/chemtweaks/code/Chemistry-Recipes.dm new file mode 100644 index 0000000000000..6e8b531b63edd --- /dev/null +++ b/mods/chemtweaks/code/Chemistry-Recipes.dm @@ -0,0 +1,30 @@ +/singleton/reaction/slime/crit_hostile + name = "Slime Crit Hostile" + result = null + required_reagents = list(/datum/reagent/blood = 1) + result_amount = 1 + required = /obj/item/slime_extract/gold + var/list/possible_mobs = list( + /mob/living/simple_animal/hostile/carp, + /mob/living/simple_animal/hostile/carp/shark, + /mob/living/simple_animal/hostile/carp/pike, + /mob/living/simple_animal/hostile/bear, + /mob/living/simple_animal/hostile/drake, + /mob/living/simple_animal/hostile/giant_spider, + /mob/living/simple_animal/hostile/retaliate/beast/antlion, + /mob/living/simple_animal/hostile/creature, + /mob/living/simple_animal/hostile/leech, + /mob/living/simple_animal/hostile/vagrant + ) + +/singleton/reaction/slime/crit_hostile/on_reaction(datum/reagents/holder) + ..() + var/type = pick(possible_mobs) + new type(get_turf(holder.my_atom)) + +/singleton/reaction/slime/grevive + name = "Slime Revive" + result = null + required_reagents = list(/datum/reagent/blood = 1) + result_amount = 1 + required = /obj/item/slime_extract/cerulean diff --git a/mods/diona/README.md b/mods/diona/README.md new file mode 100644 index 0000000000000..6bc61408876e6 --- /dev/null +++ b/mods/diona/README.md @@ -0,0 +1,78 @@ + +#### Список PRов: + +- + + + +## Мод-пример + +ID мода: DIONA + + +### Описание мода + +Мод для модификации всего, что связано с дионами. + + +### Изменения *кор кода* + +- Отсутствуют. + + +### Оверрайды + +- `mods/diona/code/cultures_diona.dm` +- `mods/diona/code/station.dm`: `slowdown`, `thirst_factor` + + +### Дефайны + +- `Отсутствуют + + +### Используемые файлы, не содержащиеся в модпаке + +- Отсутствуют + + +### Авторы: + +Baneuus + diff --git a/mods/diona/_diona.dm b/mods/diona/_diona.dm new file mode 100644 index 0000000000000..4544e081abd9f --- /dev/null +++ b/mods/diona/_diona.dm @@ -0,0 +1,4 @@ +/singleton/modpack/diona + name = "Дионы" + desc = "Мод для всего, что связано с дионами." + author = "Baneuus" diff --git a/mods/diona/_diona.dme b/mods/diona/_diona.dme new file mode 100644 index 0000000000000..acaf8600a9c17 --- /dev/null +++ b/mods/diona/_diona.dme @@ -0,0 +1,16 @@ +#ifndef MODPACK_DIONA +#define MODPACK_DIONA + +#include "code/cultures_diona.dm" +#include "code/station.dm" + +#endif +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +// END_PREFERENCES +// BEGIN_INCLUDE +// END_INCLUDE diff --git a/mods/diona/code/cultures_diona.dm b/mods/diona/code/cultures_diona.dm new file mode 100644 index 0000000000000..935df40a68e2c --- /dev/null +++ b/mods/diona/code/cultures_diona.dm @@ -0,0 +1,17 @@ +/singleton/cultural_info/culture/diona + language = LANGUAGE_ROOTLOCAL + additional_langs = list(LANGUAGE_ROOTGLOBAL) + secondary_langs = list( + LANGUAGE_HUMAN_EURO, + LANGUAGE_SPACER, + LANGUAGE_HUMAN_CHINESE, + LANGUAGE_HUMAN_ARABIC, + LANGUAGE_HUMAN_INDIAN, + LANGUAGE_HUMAN_IBERIAN, + LANGUAGE_HUMAN_RUSSIAN, + LANGUAGE_HUMAN_SELENIAN, + LANGUAGE_UNATHI_SINTA, + LANGUAGE_SKRELLIAN, + LANGUAGE_SIIK_MAAS, + LANGUAGE_RESOMI + ) diff --git a/mods/diona/code/station.dm b/mods/diona/code/station.dm new file mode 100644 index 0000000000000..ef4e1aac863f3 --- /dev/null +++ b/mods/diona/code/station.dm @@ -0,0 +1,18 @@ + +/datum/category_item/player_setup_item/background/languages/proc/total_languages() + return MAX_LANGUAGES + pref.additional_languages + +/datum/preferences + var/additional_languages + +/datum/preferences/copy_to(mob/living/carbon/human/character, is_preview_copy = FALSE) + . = ..() + additional_languages = character.species.additional_languages + +/datum/species + var/additional_languages = 0 + +/datum/species/diona + slowdown = 2 + thirst_factor = 0.06 + additional_languages = 2 diff --git a/mods/emote_panel/code/audible.dm b/mods/emote_panel/code/audible.dm index a68cef17bc546..7740f31c44a08 100644 --- a/mods/emote_panel/code/audible.dm +++ b/mods/emote_panel/code/audible.dm @@ -130,7 +130,7 @@ ) sounded_species = list(SPECIES_HUMAN, SPECIES_VATGROWN, SPECIES_SPACER, SPECIES_TRITONIAN, SPECIES_GRAVWORLDER, SPECIES_MULE, - SPECIES_UNATHI, SPECIES_YEOSA, SPECIES_TAJARA, SPECIES_VOX, SPECIES_SKRELL) + SPECIES_UNATHI, SPECIES_YEOSA, SPECIES_TAJARA, SPECIES_VOX, SPECIES_SKRELL, SPECIES_RESOMI) /singleton/emote/audible/laugh emote_sound = list( diff --git a/mods/expanded_culture_descriptor/code/cultures/cultures_human.dm b/mods/expanded_culture_descriptor/code/cultures/cultures_human.dm index e9a5e26d4dea5..c6eb58d04d685 100644 --- a/mods/expanded_culture_descriptor/code/cultures/cultures_human.dm +++ b/mods/expanded_culture_descriptor/code/cultures/cultures_human.dm @@ -8,6 +8,30 @@ репутация, а граждане здесь имеют дурную славу. Сами люди, однако, обычно просто мечтают о том, чтобы \ покинуть это место и переехать в более комфортные места. К сожалению, несмотря на усилия ЦПСС, многие \ плутониане, как правило, поддерживают преступные связи, даже за пределами планеты." + secondary_langs = list( + LANGUAGE_HUMAN_EURO, + LANGUAGE_HUMAN_CHINESE, + LANGUAGE_HUMAN_ARABIC, + LANGUAGE_HUMAN_INDIAN, + LANGUAGE_HUMAN_IBERIAN, + LANGUAGE_HUMAN_RUSSIAN, + LANGUAGE_SPACER, + LANGUAGE_GUTTER, + LANGUAGE_SIGN + ) + +/singleton/cultural_info/culture/human/confederate + name = CULTURE_HUMAN_CONFEDC + nickname = "Терранец" + description = "Вы с Терры (не с Земли), что находится в системе Гильгамеш. Это столичный мир Гильгамешской \ + Колониальной Конфедерации. Её жители воплощают в себе все то, что значит быть частью ГКК. К сожалению, годы, \ + прошедшие после Гайского Конфликта, оказались нелегкими для Терры, и длительный период восстановления \ + экономики не облегчил жизнь. Люди Терры, как правило, заняты в военном, промышленном, правительственном или \ + сервисном секторах, при этом особое внимание уделяется военной службе. Терранцы сегодня, как правило, бедные, \ + озлобленные и несколько разбитые люди, злые и обиженные из-за своих потерь в Гайском Конфликте. Воспитание на \ + Терре подчеркивает странное сочетание служения государству, либерализма и милитаризма." + language = LANGUAGE_HUMAN_RUSSIAN + economic_power = 0.9 /singleton/cultural_info/culture/human/lorrimanian name = CULTURE_HUMAN_LORRIMAN @@ -61,7 +85,6 @@ LANGUAGE_HUMAN_IBERIAN, LANGUAGE_HUMAN_RUSSIAN, LANGUAGE_SPACER, - LANGUAGE_GUTTER, LANGUAGE_SIGN ) @@ -81,7 +104,6 @@ LANGUAGE_HUMAN_IBERIAN, LANGUAGE_HUMAN_RUSSIAN, LANGUAGE_SPACER, - LANGUAGE_GUTTER, LANGUAGE_SIGN ) diff --git a/mods/expanded_culture_descriptor/code/locations/locations_human.dm b/mods/expanded_culture_descriptor/code/locations/locations_human.dm index 1d7de20a520f2..ca2edf29e05a5 100644 --- a/mods/expanded_culture_descriptor/code/locations/locations_human.dm +++ b/mods/expanded_culture_descriptor/code/locations/locations_human.dm @@ -130,3 +130,114 @@ distance = "30 световых лет" economic_power = 1 secondary_langs = list(LANGUAGE_SPACER, LANGUAGE_SIGN) + +/singleton/cultural_info/location/lorriman + name = HOME_SYSTEM_LORRIMAN + nickname = "Лорриман" + distance = "44 световых года" + description = "Лорриман - это арктическая планета в системе Гессшир. Она представляет собой замерзшую пустошь с \ + ветрами, достигающими 200 миль в час, со средней температурой -50 ° по цельсию. Из-за этого города планеты либо \ + куполообразные, либо встроены в горы. Экономика построена вокруг технологической основы, продвигая науку и людей, \ + которые умело ею пользуются. Инфраструктура достаточно развита, чтобы поддерживать общественный транспорт на всей \ + планете. Столица называется \"Столицей\", или просто Хабом. Это массивная купольная структура которая служит \ + космодромом, административным центром, и жилой зоной. Она остается единственным местом на планете, доступным для \ + не-лорриманианов. Несмотря на свою изоляцию, Научный Институт Гессшира поддерживает теплые отношения с ЦПСС. \ + Он является своеобразной технократической республикой во главе с доктором Йоханом Монтгомери. Лорриманиане \ + - тихая, скромная, образованная группа. Их часто ищут в качестве исследователей или для другой научной \ + деятельности. Редко кто иммигрирует на Лорриман, но бывают и исключения." + capital = "Столица" + economic_power = 1.2 + +/singleton/cultural_info/location/cinu + name = HOME_SYSTEM_CINU + nickname = "Цину" + distance = "48 световых лет" + description = "Цину - это колонизированная пустынная планета, расположенная в системе Люцинэр. Сегодня она является \ + важной частью ЦПСС. Вдвое больше чем Земля, большая часть поверхности этой планеты - пустыня, где подавляющее \ + большинство населения живет вокруг различных оазисов или в менее суровых северных регионах. Здесь проживает около \ + 20 миллионов человек, ежегодно принимающих около 50 000 иммигрантов. Столица Цину - Аль-Мулар, является домом для \ + нескольких крупных Отделений миротворческих сил, в которых ежегодно проходят отбор около 30 000 китайцев. \ + Республика состоит из семи политических регионов, и поддерживается Всенародным Конгрессом Цину. Установлена \ + прямая демократия, где люди голосуют напрямую по вопросам, связанным с их государством. Из-за этого Республика \ + оказывает небольшое влияние на остальное пространство. Население в целом благополучно, со стабильной экономикой \ + и достойным образованием. Это зависит от региона, однако, некоторые жители живут далеко за чертой бедности. Цину \ + считается одной из наиболее развитых демократических систем в космосе с относительно небольшими внутренними \ + конфликтами. Цинуане этнически колеблются от марсианских тарсисцев до арабских, западноазиатских и \ + среднеазиатских культур Земли. Будучи жителями суровой пустынной планеты, они \ + известны характерной стойкостью, своеобразным дружелюбием и педантичностью. Эти люди много страдали в прошлом, \ + но сегодня смотрят в светлое будущее. Среди них много пацифистов, что подтверждает недобор в Силы Обороны. \ + Вместо этого они часто служат миротворцами и дипломатами. Республика придерживалась нейтралитета во время \ + Гайского Конфликта." + capital = "Аль-Мулар" + economic_power = 1.0 + +/singleton/cultural_info/location/yuklid + name = HOME_SYSTEM_YUKLID + nickname = "Юклид V" + distance = "42 световых года" + description = "Юклид V - это колонизированный мир джунглей в системе Юклид. Здесь расположены крупные медицинские \ + учреждения и корпоративные холдинги, служащие домом для Космической Медицинской Академии. Большая часть Юклида \ + была сохранена как природный и ботанический заповедник. Большинство лекарств, производимых во внешних областях \ + ЦПСС, создавались именно тут. Также большая часть Юклида не колонизирована, а инфраструктура сосредоточена вокруг \ + полюсов планеты. Одним из таких объектов является оперативный штаб Vey-Med. Республика Юклид является \ + второстепенным политическим игроком в составе ЦПСС, а Экспедиционный Корпус использует планету как тренировочный \ + лагерь для отработки миссий на экзопланетах. Защищаема Третьим флотом. Юклидиане в основном склонны к \ + изоляционизму, с небольшой эмиграцией. Население, покидающее планету, обычно занимается медициной. Совсем недавно \ + на планете появилось спиритуалистическое движение, принимающее аспекты религиозной теории и клятвы Гиппократа." + capital = "Айеги" + economic_power = 0.9 + +/singleton/cultural_info/location/lordania + name = HOME_SYSTEM_LORDANIA + nickname = "Лордания" + distance = "40 световых лет" + description = "Лордания - это сильно развитый равнинный мир в системе Лордания. На планете есть пять крупных \ + мегаполисов, связанных различными пригородными областями. Интенсивное использование плотин и природных \ + заповедников позволило людям эффективнее терраформировать участки планеты. Исторически она имела большой разрыв в \ + доходах населения, что вызвало социальный кризис. Экономика планеты была перестроена с нуля, краеугольным камнем \ + в которой стали развлечения и искусства. Нью-Арес Метроплекс - это столица моды внешнего края ЦПСС. Многочисленные \ + компании и корпорации скупили огромное количество активов планеты во время экономической депрессии, и теперь в \ + полной мере используют их. Это не полностью городская планета, хотя и может ею стать в следующие 300 лет. Лордания \ + поддерживает теплые отношения со своим соседом Кингстоном. Лорданию можно назвать аристократической республикой, \ + ибо она имеет исторические связи с политическими семьями Луны. Люди из этого мира делятся на две части: высшие и \ + низшие лорданиане. Высшие лорданиане богаты и, как правило, ведут декадентный образ жизни, оставаясь, в основном \ + на самой планете. Низшие лорданиане чаще встречаются, но многие из них предпочитают покинуть свою родину. \ + Исторически все они имеют комплекс превосходства, и часто считают себя лучше других. Большинство лорданианов \ + считаются ненадежными или эгоистичными. Как таковых, их редко можно увидеть в Силах Обороны." + capital = "Нью-Арес" + economic_power = 1.2 + language = LANGUAGE_SPACER + +/singleton/cultural_info/location/kingston + name = HOME_SYSTEM_KINGSTON + nickname = "Кингстон" + distance = "40 световых лет" + description = "Кингстон - это колонизированный океан, состоящий из различных архипелагов в системе Лордания. \ + Поверхность планеты на 90% состоит из воды, и большая часть населения живет вокруг экватора. \ + Также это влажный субтропический мир и перспективное туристическое направление. Кингстон чрезвычайно разнообразен, \ + и многие древние человеческие культуры все еще представляются анклавами. Он также содержит большое \ + количество тритонианцев, как туристов, так и жителей. Приблизительно 15 миллионов туристов посещают планету \ + ежегодно. В то время как шоссе и система магнитных поездов связывают многие острова, лодки невероятно популярны \ + как транспортные средства. Многие из островов на планете были созданы с помощью тектонических плит или извержения \ + вулканов, что делает ее более геологически активной, чем Земля. Несмотря на это, технологии 24-го века достаточно \ + развиты, чтобы смягчить большинство структурных повреждений, нанесенных в случае землетрясений или цунами. \ + Формально, Организация Объединенных Наций Кингстона состоит из нескольких островных государств и представителей \ + других планет. Люди Кингстона относительно скромны. У них много общего с со своими сородичами. Из часто можно \ + увидеть на борту большинства судов ЦПСС. Вырастая в водном мире, большинство кингстонианов отлично умеют плавать \ + на лодке, что редкость в 24-м веке. Также у кингстонианов, как правило, кожа заметно темнее из-за близости планеты \ + к звезде." + capital = "Нью-Гавана" + economic_power = 1.1 + +/singleton/cultural_info/location/quig + name = HOME_SYSTEM_QUIG + nickname = "Кьюиг" + description = "Кьюиг - это уникальный город, построенный по совместному проекту ЦПСС, Скреллианской Империи и беженцев из числа резоми. Призванный создать единую среду для представителей трёх столь различных, но так или иначе неразрывно связанных судьбами видов, Кьюиг предоставляет наиболее комфортные условия для жизни и работы \ + каждого жителя, независимо от его вида. Учебные заведения и научные институты этого \"города прогресса\" известны по всей территории Центрального Правительства. Кьюиг находится на поверхности планеты Тиамат, но юридически является ассоциированным субъектом ЦПСС, что позволяет ему широкую автономию, в частности в вопросе гражданства \ + для представителей нечеловеческих рас." + language = LANGUAGE_HUMAN_EURO + capital = "Кьюиг" + ruling_body = "Центральное Правительство Солнечной Системы" + distance = "4 световых года" + economic_power = 1.2 + secondary_langs = list(LANGUAGE_RESOMI, LANGUAGE_SKRELLIAN, LANGUAGE_HUMAN_CHINESE, LANGUAGE_HUMAN_ARABIC, LANGUAGE_HUMAN_INDIAN, LANGUAGE_HUMAN_IBERIAN, LANGUAGE_HUMAN_RUSSIAN) diff --git a/mods/expanded_culture_descriptor/code/passport.dm b/mods/expanded_culture_descriptor/code/passport.dm index 2f335617e72da..7802b11a3f967 100644 --- a/mods/expanded_culture_descriptor/code/passport.dm +++ b/mods/expanded_culture_descriptor/code/passport.dm @@ -7,6 +7,10 @@ icon_state = "passport_mir" desc = "A passport from the Federal Republic of Mirania, an independent nation established upon Mirania III after its secession from the SCG." +/obj/item/passport/novayazemlya + name = "\improper Novaya Zemlya passport" + desc = "A passport from Novaya Zemlya, within ICCG space." + /obj/item/passport/xeno/unathi/independent name = "\improper independent clans registration document" icon_state = "passport" diff --git a/mods/expanded_culture_descriptor/code/species/lizard.dm b/mods/expanded_culture_descriptor/code/species/lizard.dm index 3421a2ce6f867..85914e63b02c0 100644 --- a/mods/expanded_culture_descriptor/code/species/lizard.dm +++ b/mods/expanded_culture_descriptor/code/species/lizard.dm @@ -4,6 +4,7 @@ CULTURE_UNATHI_TERSTEN ), TAG_HOMEWORLD = list( + HOME_SYSTEM_QUIG, HOME_SYSTEM_UNATHI_TERSTEN ), TAG_FACTION = list( diff --git a/mods/expanded_culture_descriptor/code/species/station.dm b/mods/expanded_culture_descriptor/code/species/station.dm index 92fa57896822d..ea955d2450c5e 100644 --- a/mods/expanded_culture_descriptor/code/species/station.dm +++ b/mods/expanded_culture_descriptor/code/species/station.dm @@ -1,12 +1,12 @@ /datum/species/human extended_cultural_info = list( TAG_CULTURE = list( - CULTURE_HUMAN_AVACOMMON, + CULTURE_HUMAN_AVACOMMON, CULTURE_HUMAN_AVANOBLE, CULTURE_HUMAN_LORRIMAN, CULTURE_HUMAN_LORDUP, CULTURE_HUMAN_LORDLOW, - CULTURE_HUMAN_MIRANIAN, + CULTURE_HUMAN_MIRANIAN, CULTURE_HUMAN_NYXIAN ), TAG_FACTION = list( @@ -54,6 +54,7 @@ HOME_SYSTEM_MAGNITKA, HOME_SYSTEM_CASTILLA, HOME_SYSTEM_FOSTER, + HOME_SYSTEM_QUIG, HOME_SYSTEM_TERSTEN, HOME_SYSTEM_AVALON, HOME_SYSTEM_MIRANIA, @@ -63,7 +64,12 @@ HOME_SYSTEM_NYX_YUKLIT, HOME_SYSTEM_NYX_CASSER, HOME_SYSTEM_OTHER, - HOME_SYSTEM_DEEP_SPACE + HOME_SYSTEM_DEEP_SPACE, + HOME_SYSTEM_LORRIMAN, + HOME_SYSTEM_CINU, + HOME_SYSTEM_YUKLID, + HOME_SYSTEM_LORDANIA, + HOME_SYSTEM_KINGSTON ) ) @@ -72,5 +78,8 @@ TAG_FACTION = list( FACTION_SKRELL_MED, FACTION_SKRELL_FOOD + ), + TAG_HOMEWORLD = list( + HOME_SYSTEM_QUIG ) ) diff --git a/mods/expanded_culture_descriptor/code/species/tajaran.dm b/mods/expanded_culture_descriptor/code/species/tajaran.dm index 2ed4b1f1f64cd..c40f8cb947a96 100644 --- a/mods/expanded_culture_descriptor/code/species/tajaran.dm +++ b/mods/expanded_culture_descriptor/code/species/tajaran.dm @@ -18,5 +18,8 @@ FACTION_BISHOP, FACTION_ZPCI, FACTION_SEPTENERGO + ), + TAG_HOMEWORLD = list( + HOME_SYSTEM_QUIG ) ) diff --git a/mods/explosions/code/explosion.dm b/mods/explosions/code/explosion.dm index dcafdc872845c..d91c79e79639f 100644 --- a/mods/explosions/code/explosion.dm +++ b/mods/explosions/code/explosion.dm @@ -36,10 +36,10 @@ var/explosion_resistance /turf/space - explosion_resistance = 3 + explosion_resistance = 1 /turf/simulated/open - explosion_resistance = 3 + explosion_resistance = 1 /turf/simulated/floor explosion_resistance = 1 @@ -49,3 +49,43 @@ /turf/simulated/wall explosion_resistance = 10 + +/obj/machinery/atmospherics/unary/engine/ex_act(severity) + switch(severity) + if(EX_ACT_DEVASTATING) + qdel(src) + if(EX_ACT_HEAVY) + if(prob(25)) + qdel(src) + if(EX_ACT_LIGHT) + if(prob(5)) + dismantle(src) + +/atom/ex_act(severity, turf_breaker) + var/max_health = get_max_health() + if (max_health) + var/damage_flags = turf_breaker ? DAMAGE_FLAG_TURF_BREAKER : EMPTY_BITFIELD + var/damage = 0 + var/basic_health = 525 // За основу возьмем здоровье укрепленной стальной стены, и весь дамаг от взрывов будем считать в соотношении от неё + switch (severity) + if (EX_ACT_DEVASTATING) + damage = round(basic_health * (rand(100, 200) / 100)) + if (EX_ACT_HEAVY) + damage = round(basic_health * (rand(55, 100) / 100)) + if (EX_ACT_LIGHT) + damage = round(basic_health * (rand(1, 25) / 100)) + if (damage) + damage_health(damage, DAMAGE_EXPLODE, damage_flags, severity) + +/obj/machinery/ex_act(severity) + . = ..() + if(get_current_health(src) <= 0 && !get_current_health(src)) + switch(severity) + if(EX_ACT_DEVASTATING) + qdel(src) + if(EX_ACT_HEAVY) + if(prob(50)) + qdel(src) + if(EX_ACT_LIGHT) + if(prob(5)) + dismantle(src) diff --git a/mods/failu_skrell_clothes/_failu_skrell_clothes.int b/mods/failu_skrell_clothes/_failu_skrell_clothes.int deleted file mode 100644 index bcf4930a958c5..0000000000000 --- a/mods/failu_skrell_clothes/_failu_skrell_clothes.int +++ /dev/null @@ -1,12 +0,0 @@ -// BEGIN_INTERNALS -/* -MAP_PLANE_MASTERS: -MAP_ZOOM: 1.000 -DIR: code code\lists icons icons\skrell -AUTO_FILE_DIR: OFF -MAP_ICON_TYPE: 0 -WINDOW: _failu_skrell_clothes.dm;_failu_skrell_clothes.dme -FILE: _failu_skrell_clothes.dme -MAP_INSTANCE_MODE: copy -*/ -// END_INTERNALS diff --git a/mods/failu_skrell_clothes/code/suits.dm b/mods/failu_skrell_clothes/code/suits.dm index 2bb16a43f6c13..c15e0db6e6a74 100644 --- a/mods/failu_skrell_clothes/code/suits.dm +++ b/mods/failu_skrell_clothes/code/suits.dm @@ -1,7 +1,7 @@ -// Skrell outfits -/obj/item/clothing/suit/skrell_robe - name = "Skrellian robe" - desc = "Skrellian robe, worn by Qerr-Katish." - icon = 'mods/failu_skrell_clothes/icons/skrell/obj_skrell_robe.dmi' - item_icons = list(slot_wear_suit_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_skrell_robe.dmi') - icon_state = "skrell_robe" +// Skrell outfits +/obj/item/clothing/suit/skrell_robe + name = "Skrellian robe" + desc = "Skrellian robe, worn by Qerr-Katish." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_skrell_robe.dmi' + item_icons = list(slot_wear_suit_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_skrell_robe.dmi') + icon_state = "skrell_robe" diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm index ff287838b85d8..26cdd288e1a35 100644 --- a/mods/global_modpacks.dm +++ b/mods/global_modpacks.dm @@ -23,6 +23,7 @@ #include "lobbyscreen/_lobbyscreen.dme" #include "music_player/_music_player.dme" #include "ntnet/_ntnet.dme" +#include "virusology/_virusology.dme" #include "RnD/_RnD.dme" #include "nyc_posters/_nyc_posters.dme" #include "pixelshift/_pixelshift.dme" @@ -39,6 +40,9 @@ #include "playable_away_yacht/_yacht.dme" #include "overmap/_overmap.dme" #include "ooc_notes/_ooc_notes.dme" +#include "character_traits/_character_traits.dme" #include "failu_skrell_clothes/_failu_skrell_clothes.dme" +#include "chemtweaks/_chemtweaks.dme" +#include "diona/_diona.dme" #include "../packs/sierra-tweaks/_pack.dm" diff --git a/mods/guns/_guns.dm b/mods/guns/_guns.dm index d63fbc4c0c0db..5a67089fe39cc 100644 --- a/mods/guns/_guns.dm +++ b/mods/guns/_guns.dm @@ -1,4 +1,4 @@ /singleton/modpack/guns name = "Оружие" desc = "Модификация спрайтов и ребаланс вооружения." - author = "LordNest" + author = "LordNest(Код), Wolfor by Kot(Спрайтер)" diff --git a/mods/guns/code/xenos.dm b/mods/guns/code/xenos.dm index 5c4f3938a0337..6dbc7e0c46daa 100644 --- a/mods/guns/code/xenos.dm +++ b/mods/guns/code/xenos.dm @@ -5,7 +5,7 @@ icon = 'mods/guns/icons/obj/skrell_carbine.dmi' /obj/item/gun/magnetic/railgun/flechette/skrell - icon = 'icons/obj/guns/skrell_rifle.dmi' + icon = 'mods/guns/icons/obj/skrell_rifle.dmi' // VOX BOX diff --git a/mods/guns/icons/obj/skrell_pistol.dmi b/mods/guns/icons/obj/skrell_pistol.dmi index 5bb2dcc028b64..857326d193150 100644 Binary files a/mods/guns/icons/obj/skrell_pistol.dmi and b/mods/guns/icons/obj/skrell_pistol.dmi differ diff --git a/mods/ipc_mods/_ipc_mods.dme b/mods/ipc_mods/_ipc_mods.dme index d6532ead37fac..2e6f53d99d1e4 100644 --- a/mods/ipc_mods/_ipc_mods.dme +++ b/mods/ipc_mods/_ipc_mods.dme @@ -11,13 +11,5 @@ #include "code/uplink.dm" #include "code/machine_functions.dm" #include "code/pictures.dm" +#include "code/coolerbelt.dm" #endif -// BEGIN_INTERNALS -// END_INTERNALS -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR -// BEGIN_PREFERENCES -// END_PREFERENCES -// BEGIN_INCLUDE -// END_INCLUDE diff --git a/mods/ipc_mods/code/coolerbelt.dm b/mods/ipc_mods/code/coolerbelt.dm new file mode 100644 index 0000000000000..719cce6d3a70d --- /dev/null +++ b/mods/ipc_mods/code/coolerbelt.dm @@ -0,0 +1,89 @@ +/obj/item/device/suit_cooling_unit/is_in_slot() + var/mob/living/carbon/human/H = loc + if(!istype(H)) + return 0 + + return (H.back == src) || (H.s_store == src) || (H.belt == src) + +/obj/item/device/suit_cooling_unit/miniature + name = "miniature cooling device" + desc = "Minituarized heat sink that can be hooked up to around waist. Weaker than it's bigger counterpart." + w_class = ITEM_SIZE_NORMAL + icon = 'mods/ipc_mods/icons/beltcooler.dmi' + item_icons = list( + slot_belt_str = 'mods/ipc_mods/icons/beltcooler.dmi', + ) + icon_state = "miniaturesuitcooler0" + item_state = "coolingbelt" + + max_cooling = 6 + charge_consumption = 2.4 KILOWATTS + slot_flags = SLOT_BELT + matter = list(MATERIAL_STEEL = 10000, MATERIAL_ALUMINIUM = 5000, MATERIAL_GLASS = 3000) + +/obj/item/device/suit_cooling_unit/miniature/on_update_icon() + ClearOverlays() + if (cover_open) + if (cell) + icon_state = "miniaturesuitcooler1" + else + icon_state = "miniaturesuitcooler2" + return + + icon_state = "miniaturesuitcooler0" + + if(!cell || !on) + return + + switch(round(cell.percent())) + if(86 to INFINITY) + AddOverlays("minibattery-0") + if(69 to 85) + AddOverlays("minibattery-1") + if(52 to 68) + AddOverlays("minibattery-2") + if(35 to 51) + AddOverlays("minibattery-3") + if(18 to 34) + AddOverlays("minibattery-4") + if(-INFINITY to 17) + AddOverlays("minibattery-5") + + +/obj/item/device/suit_cooling_unit/miniature/Process() + if (!on || !cell) + return + + if (!is_in_slot()) + return + + var/mob/living/carbon/human/H = loc + if ((H.pressure_alert == -1) || (H.pressure_alert == -2)) + max_cooling = max_cooling/2 + + var/temp_adj = min(H.bodytemperature - thermostat, max_cooling) + + if (temp_adj < 0.5) //only cools, doesn't heat, also we don't need extreme precision + return + + var/charge_usage = (temp_adj/max_cooling)*charge_consumption + + H.bodytemperature -= temp_adj + + cell.use(charge_usage * CELLRATE) + update_icon() + + if(cell.charge <= 0) + turn_off(1) + + +/obj/item/device/suit_cooling_unit/miniature/empty + + +/obj/item/device/suit_cooling_unit/empty/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + cell = null + +/datum/fabricator_recipe/mini_suit_cooler + path = /obj/item/device/suit_cooling_unit/miniature/empty diff --git a/mods/ipc_mods/code/ipc.dm b/mods/ipc_mods/code/ipc.dm index 29ec97d327c23..f87f6f8650eb2 100644 --- a/mods/ipc_mods/code/ipc.dm +++ b/mods/ipc_mods/code/ipc.dm @@ -1,26 +1,6 @@ /obj/item/organ/internal/posibrain var/obj/item/organ/internal/shackles/shackles_module = null var/shackle_set = FALSE -// Ремонт позитронного мозга -/obj/item/organ/internal/posibrain/use_tool(obj/item/stack/nanopaste, mob/living/user, list/click_params) - . = ..() - if(istype(nanopaste, /obj/item/stack/nanopaste)) - if(user.skill_check(SKILL_DEVICES, SKILL_TRAINED)) - if(src.damage >= src.max_damage) - to_chat(user, SPAN_WARNING("[src] is completely ruined.")) - return - if(src.damage > 0) - if(do_after(user, 40, src)) - src.damage -= (30) - if(src.damage < 0) - src.damage = 0 - nanopaste.use(1) - user.visible_message(SPAN_NOTICE("\The [user] applied some nanopaste on [src]'s damaged areas."),\ - SPAN_NOTICE("You apply some nanopaste at [src]'s damaged areas.")) - else - to_chat(user, SPAN_NOTICE("All [src]'s systems are nominal.")) - else - to_chat(user, SPAN_WARNING("You have no idea how to do that!")) /obj/item/organ/internal/posibrain/ipc name = "Positronic brain" diff --git a/mods/ipc_mods/code/machine.dm b/mods/ipc_mods/code/machine.dm index 6dd6a2fb5b82a..3de8fc23e7a86 100644 --- a/mods/ipc_mods/code/machine.dm +++ b/mods/ipc_mods/code/machine.dm @@ -3,6 +3,7 @@ #define SHOW_LAWS_POSIBRAN "Show laws posibran" /datum/species/machine passive_temp_gain = 0 // This should cause IPCs to stabilize at ~80 C in a 20 C environment.(5 is default without organ) + additional_languages = 1 /obj/machinery/organ_printer/robot/New() LAZYINITLIST(products) diff --git a/mods/ipc_mods/icons/beltcooler.dmi b/mods/ipc_mods/icons/beltcooler.dmi new file mode 100644 index 0000000000000..ce82d4a0c80e1 Binary files /dev/null and b/mods/ipc_mods/icons/beltcooler.dmi differ diff --git a/mods/jukebox_tapes/code/jukebox.dm b/mods/jukebox_tapes/code/jukebox.dm index c15c3f691f597..fd79316c86fd4 100644 --- a/mods/jukebox_tapes/code/jukebox.dm +++ b/mods/jukebox_tapes/code/jukebox.dm @@ -11,7 +11,7 @@ if(tape) jukebox.Stop() - for(var/jukebox_track/T in jukebox.tracks) + for(var/datum/jukebox_track/T in jukebox.tracks) if(T == tape.track) jukebox.tracks -= T jukebox.Last() @@ -104,12 +104,12 @@ // SIERRA TODO: Move to corecode or override -/jukebox/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui, force_open = TRUE, datum/topic_state/state = GLOB.default_state)//, datum/topic_state/state = GLOB.jukebox_state) +/datum/jukebox/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui, force_open = TRUE, datum/topic_state/state = GLOB.default_state)//, datum/topic_state/state = GLOB.jukebox_state) var/list/data_tracks = list() for (var/i = 1 to length(tracks)) - var/jukebox_track/track = tracks[i] + var/datum/jukebox_track/track = tracks[i] data_tracks += list(list("track" = track.title, "index" = i)) - var/jukebox_track/track = tracks[index] + var/datum/jukebox_track/track = tracks[index] var/list/data = list( "track" = track.title, "playing" = playing, @@ -125,7 +125,7 @@ ui.set_initial_data(data) ui.open() -/jukebox/Topic(href, href_list) +/datum/jukebox/Topic(href, href_list) switch ("[href_list["act"]]") if ("next") Next() if ("last") Last() diff --git a/mods/mechs_by_shegar/_mechs_by_shegar.dme b/mods/mechs_by_shegar/_mechs_by_shegar.dme index 71c6ae2c21da2..74211f80c9ef5 100644 --- a/mods/mechs_by_shegar/_mechs_by_shegar.dme +++ b/mods/mechs_by_shegar/_mechs_by_shegar.dme @@ -58,7 +58,9 @@ #include "code/mech_interaction.dm" #include "code/mech_life.dm" #include "code/mech_move.dm" +#include "code/mech_repair.dm" #include "code/mech_uplink.dm" +#include "code/mech_vision.dm" #include "code/mech.dm" #include "code/minor_stuff.dm" #include "code/new_prices.dm" diff --git a/mods/mechs_by_shegar/code/components/body.dm b/mods/mechs_by_shegar/code/components/body.dm index 6c0cf99eca775..8d1f049bc21c2 100644 --- a/mods/mechs_by_shegar/code/components/body.dm +++ b/mods/mechs_by_shegar/code/components/body.dm @@ -20,6 +20,8 @@ var/overheat_time = 10 SECONDS ///Куллдаун для обработки тепла. var/heat_process_speed = 2 SECONDS + ///Выбито ли пузо? + var/body_critical_damaged = FALSE /obj/item/mech_component/chassis/proc/atmos_clear_protocol(mob/living/user) @@ -35,7 +37,30 @@ cockpit.gas = good_gas cockpit.temperature = 293.152 - //air_contents +///Пузо было выбито +/obj/item/mech_component/chassis/part_has_been_destroyed() + if(!body_critical_damaged) + body_critical_damaged = TRUE + addtimer(new Callback(src, PROC_REF(do_overheat)), rand(20 SECONDS, 40 SECONDS)) + +/obj/item/mech_component/chassis/proc/do_overheat() + //Произошёл баг или иное чудо + if(!loc) + return + //Меху зачинили пузо, просчитывать больше не нужно + if(total_damage != max_damage) + return + //Определяем нашего меха + var/mob/living/exosuit/mech = loc + mech.add_heat(mech.max_heat) + if(body_critical_damaged) + addtimer(new Callback(src, PROC_REF(do_overheat)), rand(60 SECONDS, 180 SECONDS)) + + + +/obj/item/mech_component/chassis/part_has_been_restored() + body_critical_damaged = FALSE + /obj/item/mech_component/chassis/powerloader max_damage = 100 diff --git a/mods/mechs_by_shegar/code/components/components.dm b/mods/mechs_by_shegar/code/components/components.dm index f8574fd3e05ab..9d189a1eb2911 100644 --- a/mods/mechs_by_shegar/code/components/components.dm +++ b/mods/mechs_by_shegar/code/components/components.dm @@ -110,6 +110,13 @@ current_hp = max_damage . = ..() +///Состояние части упало до 0 +/obj/item/mech_component/proc/part_has_been_destroyed() + +///Состояние части поднялось выше 0. +/obj/item/mech_component/proc/part_has_been_restored() + + /obj/item/mech_component/proc/emp_heat(severity, emp_armor, mob/living/exosuit/mech) //Накидываем тепло учитывая армор меха if(emp_armor > 0.8) emp_armor = 0.8 diff --git a/mods/mechs_by_shegar/code/components/head.dm b/mods/mechs_by_shegar/code/components/head.dm index fcd4e819927dd..19c8fba77a3ca 100644 --- a/mods/mechs_by_shegar/code/components/head.dm +++ b/mods/mechs_by_shegar/code/components/head.dm @@ -49,113 +49,3 @@ emp_heat_generation = 100 weight = 75 -/obj/item/mech_component/sensors/get_sight(powered) - var/flags = 0 - if(powered && camera) - if(active_sensors) //SENSORS active? (Button) - flags |= vision_flags //Мех получает спец зрение от сенсоров - - return flags - -/mob/living/exosuit/handle_vision(powered) - var/was_blind = sight & BLIND - if(head) - sight = head.get_sight(powered) - see_invisible = head.get_invisible(powered) - if(sight & BLIND && !was_blind) - for(var/mob/pilot in pilots) - to_chat(pilot, SPAN_WARNING("The sensors are not operational and you cannot see a thing!")) - if(need_update_sensor_effects) - check_sensors_blind() - if(have_emp_effect) - process_glich() - -///Прок отвечает за обновление сенсоров от слепоты. -/mob/living/exosuit/proc/check_sensors_blind() - if(body && (body.pilot_coverage < 100 || body.transparent_cabin) || !hatch_closed) - need_update_sensor_effects = FALSE - if(have_no_sensors_effect) - remove_no_signal_effect() - if(have_no_power_effect) - remove_no_power_effect() - return - - if(power != MECH_POWER_ON && hatch_closed) //Кабина закрыта и нет питания. Нужно накладывать лишь no_power эффект - if(have_no_sensors_effect) - remove_no_signal_effect() - need_update_sensor_effects = FALSE - add_no_power_effect() - else if(power == MECH_POWER_ON && hatch_closed) //Кабина закрыта, есть питание. Нужно накладывать лишь no_signal (Потеря камеры) - if(have_no_power_effect) - remove_no_power_effect() - if(!head.camera) - add_no_signal_effect() - need_update_sensor_effects = FALSE - if(head.camera) - remove_no_signal_effect() - need_update_sensor_effects = FALSE - - -/mob/living/exosuit/proc/clear_sensors_effects(mob/living/pilot) - if(have_emp_effect) - pilot.overlay_fullscreen("sensoremp") - if(have_no_sensors_effect) - pilot.clear_fullscreen("sensorblind") - if(have_no_power_effect) - pilot.clear_fullscreen("nopower") - -/obj/screen/fullscreen/mech_sensors_blind - icon = 'mods/mechs_by_shegar/icons/mech_glitch.dmi' - icon_state = "glitch_scan" - layer = BLIND_LAYER - scale_to_view = TRUE - -/obj/screen/fullscreen/mech_sensors_glitchs - icon = 'mods/mechs_by_shegar/icons/mech_glitch.dmi' - icon_state = "glitch_eye" - layer = BLIND_LAYER - scale_to_view = TRUE - -/obj/screen/fullscreen/mech_no_power - icon = 'mods/mechs_by_shegar/icons/mech_glitch.dmi' - icon_state = "no_power" - layer = BLIND_LAYER - scale_to_view = TRUE - -/mob/living/exosuit/proc/process_glich() - if((world.time - last_keybind_use) < 0.5 SECONDS) - return - remove_glitch_effects() - -/mob/living/exosuit/proc/add_no_signal_effect() - have_no_sensors_effect = TRUE - for(var/mob/living/pilot in pilots) - pilot.overlay_fullscreen("sensorblind", /obj/screen/fullscreen/mech_sensors_blind) - -/mob/living/exosuit/proc/remove_no_signal_effect() - if(have_no_sensors_effect) - have_no_sensors_effect = FALSE - for(var/mob/living/pilot in pilots) - pilot.clear_fullscreen("sensorblind") - -/mob/living/exosuit/proc/add_glitch_effects() - have_emp_effect = TRUE - for(var/mob/living/pilot in pilots) - pilot.overlay_fullscreen("sensoremp", /obj/screen/fullscreen/mech_sensors_glitchs) - -/mob/living/exosuit/proc/remove_glitch_effects() - if(have_emp_effect) - have_emp_effect = FALSE - for(var/mob/living/pilot in pilots) - pilot.clear_fullscreen("sensoremp") - -/mob/living/exosuit/proc/add_no_power_effect() - have_no_power_effect = TRUE - for(var/mob/living/pilot in pilots) - pilot.overlay_fullscreen("nopower", /obj/screen/fullscreen/mech_no_power) - -/mob/living/exosuit/proc/remove_no_power_effect() - if(have_no_power_effect) - have_no_power_effect = FALSE - for(var/mob/living/pilot in pilots) - pilot.clear_fullscreen("nopower") diff --git a/mods/mechs_by_shegar/code/interface.dm b/mods/mechs_by_shegar/code/interface.dm index e037cf6ce3241..236847857fc8b 100644 --- a/mods/mechs_by_shegar/code/interface.dm +++ b/mods/mechs_by_shegar/code/interface.dm @@ -74,7 +74,6 @@ .=..() - /mob/living/exosuit/toggle_power(mob/user) if(!body.cell.check_charge(50) && power == MECH_POWER_OFF) to_chat(user, SPAN_WARNING("Error: Not enough power for power up.")) @@ -83,6 +82,7 @@ to_chat(user, SPAN_WARNING("Error: overheat detected, safe protocol active.")) return .=..() + check_sensors_blind() /mob/living/exosuit/proc/fast_toggle_power(mob/user) //Данная функция - "Быстрый старт", тратящий энергию батареи и поднимающий температуру меха. @@ -98,7 +98,7 @@ playsound(src, 'mods/mechs_by_shegar/sounds/mecha_fast_power_up.ogg', 70, 0) power = MECH_POWER_ON hud_power_control.update_icon() - //hud_power_control?.queue_icon_update() + check_sensors_blind() add_heat(100) var/obj/item/cell/cell = src.get_cell() cell.use(100) @@ -110,6 +110,7 @@ /mob/living/exosuit/proc/fast_toggle_power_garanted(mob/user) if(get_cell(TRUE)) power = MECH_POWER_ON + check_sensors_blind() hud_power_control.update_icon() update_icon() else diff --git a/mods/mechs_by_shegar/code/mech_interaction.dm b/mods/mechs_by_shegar/code/mech_interaction.dm index 165453b81357a..bae1b0253fa50 100644 --- a/mods/mechs_by_shegar/code/mech_interaction.dm +++ b/mods/mechs_by_shegar/code/mech_interaction.dm @@ -8,212 +8,6 @@ clear_sensors_effects(user) -/mob/living/exosuit/proc/check_passenger(mob/user) // Выбираем желаемое место, проверяем можно ли его занять, стартуем прок занятия - var/local_dir = get_dir(src, user) - if(local_dir != turn(dir, 90) && local_dir != turn(dir, -90) && local_dir != turn(dir, -135) && local_dir != turn(dir, 135) && local_dir != turn(dir, 180)) - // G G G - // G M G ↓ (Mech dir, look on SOUTH) - // B B B - // M - mech, B - cant climb ON mech from this side, G - can climb ON mech from this side - to_chat(user, SPAN_WARNING("You cant climb in passenger place of [src ] from this side.")) - return FALSE - var/choose - var/choosed_place = input(usr, "Choose passenger place which you want to take.", name, choose) as null|anything in passenger_places - if(!user.Adjacent(src)) // <- Мех рядом? - return FALSE - if(user.r_hand != null || user.l_hand != null) - to_chat(user,SPAN_NOTICE("You need two free hands to take [choosed_place].")) - return - if(user.mob_size > MOB_MEDIUM) - to_chat(user,SPAN_NOTICE("Looks like you too big to take [choosed_place].")) - return - if(choosed_place == "Back") - if(LAZYLEN(passenger_compartment.back_passengers) > 0) - to_chat(user,SPAN_NOTICE("[choosed_place] is busy")) - return 0 - else if(body.allow_passengers == FALSE) - to_chat(user,SPAN_NOTICE("[choosed_place] not able with [body.name]")) - return 0 - else if(choosed_place == "Left back") - if(LAZYLEN(passenger_compartment.left_back_passengers) > 0) - to_chat(user,SPAN_NOTICE("[choosed_place] is busy")) - return 0 - else if(arms.allow_passengers == FALSE) - to_chat(user,SPAN_NOTICE("[choosed_place] not able with [arms.name]")) - return 0 - else if(choosed_place == "Right back") - if(LAZYLEN(passenger_compartment.right_back_passengers) > 0) - to_chat(user,SPAN_NOTICE("[choosed_place] is busy")) - return 0 - else if(arms.allow_passengers == FALSE) - to_chat(user,SPAN_NOTICE("[choosed_place] not able with [arms.name]")) - return 0 - else if(!choosed_place) - return 0 - if(check_hardpoint_passengers(choosed_place,user) == TRUE) - enter_passenger(user,choosed_place) - -/mob/living/exosuit/proc/check_hardpoint_passengers(place,mob/user)// Данный прок проверяет, доступна ли часть тела для занятия её пассажиром в данный момент - var/obj/item/mech_equipment/checker - if(place == "Back" && hardpoints["back"] != null) - checker = hardpoints["back"] - if(checker.disturb_passengers == TRUE) - to_chat(user,SPAN_NOTICE("[place] covered by [checker] and cant be taked.")) - return FALSE - else if(place == "Left back" && hardpoints["left shoulder"] != null) - checker = hardpoints["left shoulder"] - if(checker.disturb_passengers == TRUE) - to_chat(user,SPAN_NOTICE("[place] covered by [checker] and cant be taked.")) - return FALSE - else if(place == "Right back" && hardpoints["right shoulder"] != null) - checker = hardpoints["right shoulder"] - if(checker.disturb_passengers == TRUE) - to_chat(user,SPAN_NOTICE("[place] covered by [checker] and cant be taked.")) - return FALSE - return TRUE - -/mob/living/exosuit/proc/enter_passenger(mob/user, place)// Пытается пихнуть на пассажирское место пассажира, перед этим ещё раз проверяя их - //Проверка спины - src.visible_message(SPAN_NOTICE(" [user] starts climb on the [place] of [src]!")) - if(do_after(user, 2 SECONDS, get_turf(src),DO_SHOW_PROGRESS|DO_FAIL_FEEDBACK|DO_USER_CAN_TURN| DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS)) - if(!user.Adjacent(src)) // <- Мех рядом? - return FALSE - if(user.r_hand != null || user.l_hand != null) - to_chat(user,SPAN_NOTICE("You need two free hands to clim on[place] of [src].")) - return - if(place == "Back" && LAZYLEN(passenger_compartment.back_passengers) == 0) - user.forceMove(passenger_compartment) - LAZYDISTINCTADD(passenger_compartment.back_passengers,user) - have_back_passenger = TRUE - user.pinned += src - else if(place == "Left back" && LAZYLEN(passenger_compartment.left_back_passengers) == 0) - user.forceMove(passenger_compartment) - LAZYDISTINCTADD(passenger_compartment.left_back_passengers,user) - have_left_passenger = TRUE - user.pinned += src - else if(place == "Right back" && LAZYLEN(passenger_compartment.right_back_passengers) == 0) - user.forceMove(passenger_compartment) - LAZYDISTINCTADD(passenger_compartment.right_back_passengers,user) - have_right_passenger = TRUE - user.pinned += src - else - to_chat(user,SPAN_NOTICE("Looks like [place] is busy!")) - return 0 - src.visible_message(SPAN_NOTICE(" [user] climbed on [place] of [src]!")) - passenger_compartment.count_passengers() - update_passengers() - -// будет использоваться Life() дабы исключить моменты, когда по какой-то причине пассажир слез с меха, лежа на полу. Life вызовется, обработается pinned, всем в кайф. -/mob/living/exosuit/proc/leave_passenger(mob/user)// Пассажир сам покидает меха - src.visible_message(SPAN_NOTICE("[user] jump off [src]!")) - user.dropInto(loc) - user.pinned -= src - user.Life() - if(user in passenger_compartment.back_passengers) - LAZYREMOVE(passenger_compartment.back_passengers,user) - have_back_passenger = FALSE - else if(user in passenger_compartment.left_back_passengers) - LAZYREMOVE(passenger_compartment.left_back_passengers,user) - have_left_passenger = FALSE - else if(user in passenger_compartment.right_back_passengers) - LAZYREMOVE(passenger_compartment.right_back_passengers,user) - have_right_passenger = FALSE - passenger_compartment.count_passengers() - update_passengers() - -/mob/living/exosuit/proc/forced_leave_passenger(place,mode,author)// Нечто внешнее насильно опустошает Одно/все места пассажиров -// mode 1 - полный выгруз, mode 2 - рандомного одного, mode 0(Отсутствие мода) - ручной скид пассажира мехводом - if(mode == MECH_DROP_ALL_PASSENGER) // Полная разгрузка - if(LAZYLEN(passenger_compartment.back_passengers)>0) - for(var/mob/i in passenger_compartment.back_passengers) - LAZYREMOVE(passenger_compartment.back_passengers,i) - have_back_passenger = FALSE - i.dropInto(loc) - i.pinned -= src - i.Life() - passenger_compartment.count_passengers() - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) - if(LAZYLEN(passenger_compartment.left_back_passengers)>0) - for(var/mob/i in passenger_compartment.left_back_passengers) - LAZYREMOVE(passenger_compartment.left_back_passengers,i) - have_left_passenger = FALSE - i.dropInto(loc) - i.pinned -= src - i.Life() - passenger_compartment.count_passengers() - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) - if(LAZYLEN(passenger_compartment.right_back_passengers) > 0) - for(var/mob/i in passenger_compartment.right_back_passengers) - LAZYREMOVE(passenger_compartment.right_back_passengers,i) - have_right_passenger = FALSE - i.dropInto(loc) - i.pinned -= src - i.Life() - passenger_compartment.count_passengers() - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) - update_passengers() - - else if(mode == MECH_DROP_ANY_PASSENGER) // Сброс по приоритету спина - левый бок - правый бок. - if(LAZYLEN(passenger_compartment.back_passengers) > 0) - for(var/mob/i in passenger_compartment.back_passengers) - LAZYREMOVE(passenger_compartment.back_passengers,i) - have_back_passenger = FALSE - i.dropInto(loc) - i.pinned -= src - i.Life() - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) - passenger_compartment.count_passengers() - update_passengers() - return - else if(LAZYLEN(passenger_compartment.left_back_passengers)>0) - for(var/mob/i in passenger_compartment.left_back_passengers) - LAZYREMOVE(passenger_compartment.left_back_passengers,i) - have_left_passenger = FALSE - i.dropInto(loc) - i.pinned -= src - i.Life() - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) - passenger_compartment.count_passengers() - update_passengers() - return - else if(LAZYLEN(passenger_compartment.right_back_passengers)>0) - for(var/mob/i in passenger_compartment.right_back_passengers) - LAZYREMOVE(passenger_compartment.right_back_passengers,i) - have_right_passenger = FALSE - i.dropInto(loc) - i.pinned -= src - i.Life() - i.Life() - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) - passenger_compartment.count_passengers() - update_passengers() - return - - else // <- Опустошается определённое место - if(place == "Back") - for(var/mob/i in passenger_compartment.back_passengers) - have_back_passenger = FALSE - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) - i.dropInto(loc) - i.pinned -= src - LAZYREMOVE(passenger_compartment.back_passengers,i) - else if(place == "Left back") - for(var/mob/i in passenger_compartment.left_back_passengers) - have_left_passenger = FALSE - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]!")) - i.dropInto(loc) - i.pinned -= src - LAZYREMOVE(passenger_compartment.left_back_passengers,i) - else if(place == "Right back") - for(var/mob/i in passenger_compartment.right_back_passengers) - have_right_passenger = FALSE - src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]!")) - i.dropInto(loc) - i.pinned -= src - LAZYREMOVE(passenger_compartment.right_back_passengers,i) - passenger_compartment.count_passengers() - update_passengers() - /mob/living/exosuit/use_tool(obj/item/tool, mob/user, list/click_params) if(istype(tool, /obj/item/card/id))// Мы тычем ID картой в меха, словно ключами от иномарки. if(inmech(user, src)) @@ -308,55 +102,6 @@ return TRUE .=..() - -/proc/material_repair( mob/living/exosuit/mech , obj/item/stack/material/material_sheet, mob/user, user_understand, obj/item/mech_component/repair_part) - //Выполняем первую проверку ПЕРЕД началом ремонта - //Убедимся кто цель ремонта. - var/atom/target - if(!mech) - target = repair_part - else - target = mech - if(!user.Adjacent(target)) // <- Мех рядом? - return FALSE - //Определим в какой руке материал - var/obj/item/stack/material/sheet_hand - var/obj/item/weldingtool/welder_hand - // Мы определяем в какой руке лежит материал - if(user.r_hand != material_sheet) - sheet_hand = user.l_hand - if(isWelder(user.r_hand)) - welder_hand = user.r_hand - else - to_chat(user,SPAN_NOTICE("You need welding in the other hand.")) - return - else - sheet_hand = user.r_hand - if(isWelder(user.l_hand)) - welder_hand = user.l_hand - else - to_chat(user,SPAN_NOTICE("You need welding in the other hand.")) - return - if(!welder_hand.can_use(1, user)) //Сварка включена и достаточно топлива? - return - //Мы узнали в какой руке лежит материал, в какой сварка и готова ли она к работе. Теперь мы переходим к самому ремонту. - var/delay = 20 SECONDS - (user.get_skill_value(SKILL_DEVICES)*3 + user.get_skill_value(SKILL_CONSTRUCTION)) - if(do_after(user, delay, target, DO_REPAIR_CONSTRUCT)) - if(!welder_hand.remove_fuel(1, user)) - return - sheet_hand.use(1) - if(!user_understand) - var/num = rand(1,100) - if(num < 90) - USE_FEEDBACK_FAILURE("Nothing worked for me, I just wasted the material, after my repair attempt, a sheet of material fell off part of it..") - return - var/repair_ammount = 50 + ((user.get_skill_value(SKILL_DEVICES) + user.get_skill_value(SKILL_CONSTRUCTION)) * 7) - repair_part.repair_brute_damage(repair_ammount) - repair_part.max_damage = repair_part.max_damage - repair_part.repair_damage - repair_part.unrepairable_damage += repair_part.repair_damage - if(repair_part.min_damage > repair_part.max_damage) - repair_part.max_damage = repair_part.min_damage - /mob/living/exosuit/proc/selftoggle_mech_hatch_close() playsound(src.loc, 'mods/mechs_by_shegar/sounds/mech_peek.ogg', 80, 0, -6) //Данный прок выполняет простейшую задачу, либо открывает, либо закрывает меха без участвия человека. diff --git a/mods/mechs_by_shegar/code/mech_move.dm b/mods/mechs_by_shegar/code/mech_move.dm index 2ae7ea4b1e51c..54232c9c0c937 100644 --- a/mods/mechs_by_shegar/code/mech_move.dm +++ b/mods/mechs_by_shegar/code/mech_move.dm @@ -32,7 +32,7 @@ var/mob/living/pilot = pick(pilots) if(legs.bump_safety && pilot.a_intent != I_HURT) //Мы не хотим топтать и ноги могут не топтать? return //Не топчем - src.visible_message(SPAN_DANGER("forcefully tramples [target] on the floor!"), blind_message = SPAN_DANGER("You hear the loud hissing of hydraulics!")) + src.visible_message(SPAN_DANGER("[src] forcefully tramples [target] on the floor!"), blind_message = SPAN_DANGER("You hear the loud hissing of hydraulics!")) target.apply_effects(5, 5) //Чтоб не вставал var/damage = rand(5, 10) damage = 2 * (damage * (total_weight / 1000) + (legs.bump_type * 3)) // 30 урона в лучшем случае по груди и голове @@ -59,6 +59,8 @@ return Bumps = !Bumps collision_attack(target) + target.Move(get_ranged_target_turf(target, src.dir, 1)) + src.forceMove(get_ranged_target_turf(src, src.dir, 1)) return /mob/living/exosuit/proc/collision_attack(mob/living/target,bump_type) //Attack colissioned things diff --git a/mods/mechs_by_shegar/code/mech_repair.dm b/mods/mechs_by_shegar/code/mech_repair.dm new file mode 100644 index 0000000000000..59f45f3fc190c --- /dev/null +++ b/mods/mechs_by_shegar/code/mech_repair.dm @@ -0,0 +1,73 @@ +///Ремонт части меха при помощи листа материалов +/proc/material_repair(mob/living/exosuit/mech , obj/item/stack/material/material_sheet, mob/user, user_understand, obj/item/mech_component/repair_part) + //Выполняем первую проверку ПЕРЕД началом ремонта + //Убедимся кто цель ремонта. + var/atom/target + if(!mech) + target = repair_part + else + target = mech + if(!user.Adjacent(target)) // <- Мех рядом? + return FALSE + //Определим в какой руке материал + var/obj/item/stack/material/sheet_hand + var/obj/item/weldingtool/welder_hand + // Мы определяем в какой руке лежит материал + if(user.r_hand != material_sheet) + sheet_hand = user.l_hand + if(isWelder(user.r_hand)) + welder_hand = user.r_hand + else + to_chat(user,SPAN_NOTICE("You need welding in the other hand.")) + return + else + sheet_hand = user.r_hand + if(isWelder(user.l_hand)) + welder_hand = user.l_hand + else + to_chat(user,SPAN_NOTICE("You need welding in the other hand.")) + return + if(!welder_hand.can_use(1, user)) //Сварка включена и достаточно топлива? + return + //Мы узнали в какой руке лежит материал, в какой сварка и готова ли она к работе. Теперь мы переходим к самому ремонту. + var/delay = 20 SECONDS - (user.get_skill_value(SKILL_DEVICES)*3 + user.get_skill_value(SKILL_CONSTRUCTION)) + if(do_after(user, delay, target, DO_REPAIR_CONSTRUCT)) + if(!welder_hand.remove_fuel(1, user)) + return + sheet_hand.use(1) + if(!user_understand) + var/num = rand(1,100) + if(num < 90) + USE_FEEDBACK_FAILURE("Nothing worked for me, I just wasted the material, after my repair attempt, a sheet of material fell off part of it..") + return + var/repair_ammount = 50 + ((user.get_skill_value(SKILL_DEVICES) + user.get_skill_value(SKILL_CONSTRUCTION)) * 7) + repair_part.repair_brute_damage(repair_ammount) + repair_part.max_damage = repair_part.max_damage - repair_part.repair_damage + repair_part.unrepairable_damage += repair_part.repair_damage + if(repair_part.min_damage > repair_part.max_damage) + repair_part.max_damage = repair_part.min_damage + + +/obj/item/mech_component/repair_brute_damage(amt) + take_brute_damage(-amt) + if(current_hp > 0) + part_has_been_restored() + +/obj/item/mech_component/repair_burn_damage(amt) + take_burn_damage(-amt) + if(current_hp > 0) + part_has_been_restored() + +/obj/item/mech_component/take_brute_damage(amt) + brute_damage = max(0, brute_damage + amt) + update_health() + if(total_damage == max_damage) + part_has_been_destroyed() + take_component_damage(amt,0) + +/obj/item/mech_component/take_burn_damage(amt) + burn_damage = max(0, burn_damage + amt) + update_health() + if(total_damage == max_damage) + part_has_been_destroyed() + take_component_damage(0,amt) diff --git a/mods/mechs_by_shegar/code/mech_vision.dm b/mods/mechs_by_shegar/code/mech_vision.dm new file mode 100644 index 0000000000000..72aae4e958a0b --- /dev/null +++ b/mods/mechs_by_shegar/code/mech_vision.dm @@ -0,0 +1,112 @@ +//Тут весь код отвечающий за зрение меха и визуальные эффекты на экране игрока +/obj/item/mech_component/sensors/get_sight(powered) + var/flags = 0 + if(powered && camera) + if(active_sensors) //SENSORS active? (Button) + flags |= vision_flags //Мех получает спец зрение от сенсоров + + return flags + +/mob/living/exosuit/handle_vision(powered) + var/was_blind = sight & BLIND + if(head) + sight = head.get_sight(powered) + see_invisible = head.get_invisible(powered) + if(sight & BLIND && !was_blind) + for(var/mob/pilot in pilots) + need_update_sensor_effects = TRUE + to_chat(pilot, SPAN_WARNING("The sensors are not operational and you cannot see a thing!")) + if(need_update_sensor_effects) + check_sensors_blind() + if(have_emp_effect) + process_glich() + +///Прок отвечает за обновление сенсоров от слепоты. +/mob/living/exosuit/proc/check_sensors_blind() + if(body && (body.pilot_coverage < 100 || body.transparent_cabin) || !hatch_closed) + need_update_sensor_effects = FALSE + if(have_no_sensors_effect) + remove_no_signal_effect() + if(have_no_power_effect) + remove_no_power_effect() + return + + if(power != MECH_POWER_ON && hatch_closed) //Кабина закрыта и нет питания. Нужно накладывать лишь no_power эффект + if(have_no_sensors_effect) + remove_no_signal_effect() + need_update_sensor_effects = FALSE + add_no_power_effect() + else if(power == MECH_POWER_ON && hatch_closed) //Кабина закрыта, есть питание. Нужно накладывать лишь no_signal (Потеря камеры) + if(have_no_power_effect) + remove_no_power_effect() + if(!head.camera) + add_no_signal_effect() + need_update_sensor_effects = FALSE + if(head.camera) + remove_no_signal_effect() + need_update_sensor_effects = FALSE + + +/mob/living/exosuit/proc/clear_sensors_effects(mob/living/pilot) + if(have_emp_effect) + pilot.overlay_fullscreen("sensoremp") + if(have_no_sensors_effect) + pilot.clear_fullscreen("sensorblind") + if(have_no_power_effect) + pilot.clear_fullscreen("nopower") + +/obj/screen/fullscreen/mech_sensors_blind + icon = 'mods/mechs_by_shegar/icons/mech_glitch.dmi' + icon_state = "glitch_scan" + layer = BLIND_LAYER + scale_to_view = TRUE + +/obj/screen/fullscreen/mech_sensors_glitchs + icon = 'mods/mechs_by_shegar/icons/mech_glitch.dmi' + icon_state = "glitch_eye" + layer = BLIND_LAYER + scale_to_view = TRUE + +/obj/screen/fullscreen/mech_no_power + icon = 'mods/mechs_by_shegar/icons/mech_glitch.dmi' + icon_state = "no_power" + layer = BLIND_LAYER + scale_to_view = TRUE + +/mob/living/exosuit/proc/process_glich() + if((world.time - last_keybind_use) < 0.5 SECONDS) + return + remove_glitch_effects() + +/mob/living/exosuit/proc/add_no_signal_effect() + have_no_sensors_effect = TRUE + for(var/mob/living/pilot in pilots) + pilot.overlay_fullscreen("sensorblind", /obj/screen/fullscreen/mech_sensors_blind) + +/mob/living/exosuit/proc/remove_no_signal_effect() + if(have_no_sensors_effect) + have_no_sensors_effect = FALSE + for(var/mob/living/pilot in pilots) + pilot.clear_fullscreen("sensorblind") + +/mob/living/exosuit/proc/add_glitch_effects() + have_emp_effect = TRUE + for(var/mob/living/pilot in pilots) + pilot.overlay_fullscreen("sensoremp", /obj/screen/fullscreen/mech_sensors_glitchs) + +/mob/living/exosuit/proc/remove_glitch_effects() + if(have_emp_effect) + have_emp_effect = FALSE + for(var/mob/living/pilot in pilots) + pilot.clear_fullscreen("sensoremp") + +/mob/living/exosuit/proc/add_no_power_effect() + have_no_power_effect = TRUE + for(var/mob/living/pilot in pilots) + pilot.overlay_fullscreen("nopower", /obj/screen/fullscreen/mech_no_power) + +/mob/living/exosuit/proc/remove_no_power_effect() + if(have_no_power_effect) + have_no_power_effect = FALSE + for(var/mob/living/pilot in pilots) + pilot.clear_fullscreen("nopower") diff --git a/mods/mechs_by_shegar/code/passengers_compartment.dm b/mods/mechs_by_shegar/code/passengers_compartment.dm index cf7ce0ea4405f..ab38ed60974bf 100644 --- a/mods/mechs_by_shegar/code/passengers_compartment.dm +++ b/mods/mechs_by_shegar/code/passengers_compartment.dm @@ -9,6 +9,212 @@ . = ..() owner = loc +/mob/living/exosuit/proc/check_hardpoint_passengers(place,mob/user)// Данный прок проверяет, доступна ли часть тела для занятия её пассажиром в данный момент + var/obj/item/mech_equipment/checker + if(place == "Back" && hardpoints["back"] != null) + checker = hardpoints["back"] + if(checker.disturb_passengers == TRUE) + to_chat(user,SPAN_NOTICE("[place] covered by [checker] and cant be taked.")) + return FALSE + else if(place == "Left back" && hardpoints["left shoulder"] != null) + checker = hardpoints["left shoulder"] + if(checker.disturb_passengers == TRUE) + to_chat(user,SPAN_NOTICE("[place] covered by [checker] and cant be taked.")) + return FALSE + else if(place == "Right back" && hardpoints["right shoulder"] != null) + checker = hardpoints["right shoulder"] + if(checker.disturb_passengers == TRUE) + to_chat(user,SPAN_NOTICE("[place] covered by [checker] and cant be taked.")) + return FALSE + return TRUE + +/mob/living/exosuit/proc/check_passenger(mob/user) // Выбираем желаемое место, проверяем можно ли его занять, стартуем прок занятия + var/local_dir = get_dir(src, user) + if(local_dir != turn(dir, 90) && local_dir != turn(dir, -90) && local_dir != turn(dir, -135) && local_dir != turn(dir, 135) && local_dir != turn(dir, 180)) + // G G G + // G M G ↓ (Mech dir, look on SOUTH) + // B B B + // M - mech, B - cant climb ON mech from this side, G - can climb ON mech from this side + to_chat(user, SPAN_WARNING("You cant climb in passenger place of [src ] from this side.")) + return FALSE + var/choose + var/choosed_place = input(usr, "Choose passenger place which you want to take.", name, choose) as null|anything in passenger_places + if(!user.Adjacent(src)) // <- Мех рядом? + return FALSE + if(user.r_hand != null || user.l_hand != null) + to_chat(user,SPAN_NOTICE("You need two free hands to take [choosed_place].")) + return + if(user.mob_size > MOB_MEDIUM) + to_chat(user,SPAN_NOTICE("Looks like you too big to take [choosed_place].")) + return + if(choosed_place == "Back") + if(LAZYLEN(passenger_compartment.back_passengers) > 0) + to_chat(user,SPAN_NOTICE("[choosed_place] is busy")) + return 0 + else if(body.allow_passengers == FALSE) + to_chat(user,SPAN_NOTICE("[choosed_place] not able with [body.name]")) + return 0 + else if(choosed_place == "Left back") + if(LAZYLEN(passenger_compartment.left_back_passengers) > 0) + to_chat(user,SPAN_NOTICE("[choosed_place] is busy")) + return 0 + else if(arms.allow_passengers == FALSE) + to_chat(user,SPAN_NOTICE("[choosed_place] not able with [arms.name]")) + return 0 + else if(choosed_place == "Right back") + if(LAZYLEN(passenger_compartment.right_back_passengers) > 0) + to_chat(user,SPAN_NOTICE("[choosed_place] is busy")) + return 0 + else if(arms.allow_passengers == FALSE) + to_chat(user,SPAN_NOTICE("[choosed_place] not able with [arms.name]")) + return 0 + else if(!choosed_place) + return 0 + if(check_hardpoint_passengers(choosed_place,user) == TRUE) + enter_passenger(user,choosed_place) + +/mob/living/exosuit/proc/enter_passenger(mob/user, place)// Пытается пихнуть на пассажирское место пассажира, перед этим ещё раз проверяя их + //Проверка спины + src.visible_message(SPAN_NOTICE(" [user] starts climb on the [place] of [src]!")) + if(do_after(user, 2 SECONDS, get_turf(src),DO_SHOW_PROGRESS|DO_FAIL_FEEDBACK|DO_USER_CAN_TURN| DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS)) + if(!user.Adjacent(src)) // <- Мех рядом? + return FALSE + if(user.r_hand != null || user.l_hand != null) + to_chat(user,SPAN_NOTICE("You need two free hands to clim on[place] of [src].")) + return + if(place == "Back" && LAZYLEN(passenger_compartment.back_passengers) == 0) + user.forceMove(passenger_compartment) + LAZYDISTINCTADD(passenger_compartment.back_passengers,user) + have_back_passenger = TRUE + user.pinned += src + else if(place == "Left back" && LAZYLEN(passenger_compartment.left_back_passengers) == 0) + user.forceMove(passenger_compartment) + LAZYDISTINCTADD(passenger_compartment.left_back_passengers,user) + have_left_passenger = TRUE + user.pinned += src + else if(place == "Right back" && LAZYLEN(passenger_compartment.right_back_passengers) == 0) + user.forceMove(passenger_compartment) + LAZYDISTINCTADD(passenger_compartment.right_back_passengers,user) + have_right_passenger = TRUE + user.pinned += src + else + to_chat(user,SPAN_NOTICE("Looks like [place] is busy!")) + return 0 + src.visible_message(SPAN_NOTICE(" [user] climbed on [place] of [src]!")) + passenger_compartment.count_passengers() + update_passengers() + +// будет использоваться Life() дабы исключить моменты, когда по какой-то причине пассажир слез с меха, лежа на полу. Life вызовется, обработается pinned, всем в кайф. +/mob/living/exosuit/proc/leave_passenger(mob/user)// Пассажир сам покидает меха + src.visible_message(SPAN_NOTICE("[user] jump off [src]!")) + user.dropInto(loc) + user.pinned -= src + user.Life() + if(user in passenger_compartment.back_passengers) + LAZYREMOVE(passenger_compartment.back_passengers,user) + have_back_passenger = FALSE + else if(user in passenger_compartment.left_back_passengers) + LAZYREMOVE(passenger_compartment.left_back_passengers,user) + have_left_passenger = FALSE + else if(user in passenger_compartment.right_back_passengers) + LAZYREMOVE(passenger_compartment.right_back_passengers,user) + have_right_passenger = FALSE + passenger_compartment.count_passengers() + update_passengers() + +/mob/living/exosuit/proc/forced_leave_passenger(place,mode,author)// Нечто внешнее насильно опустошает Одно/все места пассажиров +// mode 1 - полный выгруз, mode 2 - рандомного одного, mode 0(Отсутствие мода) - ручной скид пассажира мехводом + if(mode == MECH_DROP_ALL_PASSENGER) // Полная разгрузка + if(LAZYLEN(passenger_compartment.back_passengers)>0) + for(var/mob/i in passenger_compartment.back_passengers) + LAZYREMOVE(passenger_compartment.back_passengers,i) + have_back_passenger = FALSE + i.dropInto(loc) + i.pinned -= src + i.Life() + passenger_compartment.count_passengers() + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) + if(LAZYLEN(passenger_compartment.left_back_passengers)>0) + for(var/mob/i in passenger_compartment.left_back_passengers) + LAZYREMOVE(passenger_compartment.left_back_passengers,i) + have_left_passenger = FALSE + i.dropInto(loc) + i.pinned -= src + i.Life() + passenger_compartment.count_passengers() + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) + if(LAZYLEN(passenger_compartment.right_back_passengers) > 0) + for(var/mob/i in passenger_compartment.right_back_passengers) + LAZYREMOVE(passenger_compartment.right_back_passengers,i) + have_right_passenger = FALSE + i.dropInto(loc) + i.pinned -= src + i.Life() + passenger_compartment.count_passengers() + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) + update_passengers() + + else if(mode == MECH_DROP_ANY_PASSENGER) // Сброс по приоритету спина - левый бок - правый бок. + if(LAZYLEN(passenger_compartment.back_passengers) > 0) + for(var/mob/i in passenger_compartment.back_passengers) + LAZYREMOVE(passenger_compartment.back_passengers,i) + have_back_passenger = FALSE + i.dropInto(loc) + i.pinned -= src + i.Life() + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) + passenger_compartment.count_passengers() + update_passengers() + return + else if(LAZYLEN(passenger_compartment.left_back_passengers)>0) + for(var/mob/i in passenger_compartment.left_back_passengers) + LAZYREMOVE(passenger_compartment.left_back_passengers,i) + have_left_passenger = FALSE + i.dropInto(loc) + i.pinned -= src + i.Life() + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) + passenger_compartment.count_passengers() + update_passengers() + return + else if(LAZYLEN(passenger_compartment.right_back_passengers)>0) + for(var/mob/i in passenger_compartment.right_back_passengers) + LAZYREMOVE(passenger_compartment.right_back_passengers,i) + have_right_passenger = FALSE + i.dropInto(loc) + i.pinned -= src + i.Life() + i.Life() + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) + passenger_compartment.count_passengers() + update_passengers() + return + + else // <- Опустошается определённое место + if(place == "Back") + for(var/mob/i in passenger_compartment.back_passengers) + have_back_passenger = FALSE + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]")) + i.dropInto(loc) + i.pinned -= src + LAZYREMOVE(passenger_compartment.back_passengers,i) + else if(place == "Left back") + for(var/mob/i in passenger_compartment.left_back_passengers) + have_left_passenger = FALSE + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]!")) + i.dropInto(loc) + i.pinned -= src + LAZYREMOVE(passenger_compartment.left_back_passengers,i) + else if(place == "Right back") + for(var/mob/i in passenger_compartment.right_back_passengers) + have_right_passenger = FALSE + src.visible_message(SPAN_WARNING("[i] was forcelly removed from [src] by [author]!")) + i.dropInto(loc) + i.pinned -= src + LAZYREMOVE(passenger_compartment.right_back_passengers,i) + passenger_compartment.count_passengers() + update_passengers() + /obj/item/mech_component/passenger_compartment/proc/check_passengers_status() var/mob/living/passenger if(LAZYLEN(back_passengers) > 0) diff --git a/mods/music_player/_music_player.dme b/mods/music_player/_music_player.dme index 2cdcb59f18488..8b11351845d6c 100644 --- a/mods/music_player/_music_player.dme +++ b/mods/music_player/_music_player.dme @@ -3,6 +3,7 @@ #include "_music_player.dm" +#include "code/music_prefs.dm" #include "code/music_player.dm" #include "code/music_tape.dm" #include "code/music_writer.dm" diff --git a/mods/music_player/code/music_player.dm b/mods/music_player/code/music_player.dm index 6bb1e75bc65b7..4a6f7bc45061f 100644 --- a/mods/music_player/code/music_player.dm +++ b/mods/music_player/code/music_player.dm @@ -474,7 +474,7 @@ GLOBAL_LIST_INIT(switch_small_sound, list( sound_token.Unpause() else QDEL_NULL(sound_token) - sound_token = GLOB.sound_player.PlayLoopingSound(src, sound_id, tape.track.source, volume = volume, frequency = frequency, range = 9, falloff = 2, prefer_mute = TRUE) + sound_token = GLOB.sound_player.PlayLoopingSound(src, sound_id, tape.track.source, volume = volume, frequency = frequency, range = 9, falloff = 2, prefer_mute = TRUE, preference = /datum/client_preference/play_pmps) mode = PLAYER_STATE_PLAY START_PROCESSING(SSobj, src) diff --git a/mods/music_player/code/music_prefs.dm b/mods/music_player/code/music_prefs.dm new file mode 100644 index 0000000000000..58829c39cd722 --- /dev/null +++ b/mods/music_player/code/music_prefs.dm @@ -0,0 +1,60 @@ +/datum/client_preference/play_jukeboxes + description ="Play jukeboxes and boomboxes" + key = "SOUND_JUKEBOXES" + +/datum/client_preference/play_pmps + description ="Play music players" + key = "SOUND_PMPS" + +/datum/sound_token + var/datum/client_preference/preference + +/datum/sound_token/proc/check_preference(atom/listener) + if(preference) + var/mob/M = listener + if(istype(M)) + if((M.get_preference_value(preference) != GLOB.PREF_YES)) + return FALSE + return TRUE + +/singleton/sound_player/PlaySoundDatum(atom/source, sound_id, sound/sound, range, prefer_mute, datum/client_preference/preference) + var/token_type = isnum(sound.environment) ? /datum/sound_token : /datum/sound_token/static_environment + return new token_type(source, sound_id, sound, range, prefer_mute, preference) + +/singleton/sound_player/PlayLoopingSound(atom/source, sound_id, sound, volume, range, falloff = 1, echo, frequency, prefer_mute, datum/client_preference/preference) + var/sound/S = istype(sound, /sound) ? sound : new(sound) + S.environment = 0 // Ensures a 3D effect even if x/y offset happens to be 0 the first time it's played + S.volume = volume + S.falloff = falloff + S.echo = echo + S.frequency = frequency + S.repeat = TRUE + + return PlaySoundDatum(source, sound_id, S, range, prefer_mute, preference) + +/datum/sound_token/New(atom/source, sound_id, sound/sound, range = 4, prefer_mute = FALSE, datum/client_preference/preference) + src.preference = preference + ..() + +/datum/sound_token/PrivAddListener(atom/listener) + if(!check_preference(listener)) + return + ..() + +/datum/sound_token/PrivUpdateListener(listener, update_sound = TRUE) + if(!check_preference(listener)) + PrivRemoveListener(listener) + return + ..() + + +/datum/jukebox/Play() + if (playing) + return + var/datum/jukebox_track/track = tracks[index] + if (!track.source) + return + playing = TRUE + token = GLOB.sound_player.PlayLoopingSound(owner, sound_id, track.source, + volume, range, falloff, frequency = frequency, prefer_mute = TRUE, preference = /datum/client_preference/play_jukeboxes) + owner.queue_icon_update() \ No newline at end of file diff --git a/mods/music_player/code/music_tape.dm b/mods/music_player/code/music_tape.dm index 47e8cb65ec287..f651bba0e2e0c 100644 --- a/mods/music_player/code/music_tape.dm +++ b/mods/music_player/code/music_tape.dm @@ -18,7 +18,7 @@ var/ruined = 0 var/rewrites_left = 2 - var/jukebox_track/track + var/datum/jukebox_track/track var/uploader_ckey /obj/item/music_tape/Initialize() diff --git a/mods/music_player/code/music_writer.dm b/mods/music_player/code/music_writer.dm index 3f59856e76e75..4ff73ab334ae4 100644 --- a/mods/music_player/code/music_writer.dm +++ b/mods/music_player/code/music_writer.dm @@ -159,7 +159,7 @@ if(disk.track) //Removing old datum disk if there one qdel(disk.track) - var/jukebox_track/T = new(new_name, new_sound_file) + var/datum/jukebox_track/T = new(new_name, new_sound_file) if(T) disk.track = T diff --git a/mods/music_player/code/subtypes_tape.dm b/mods/music_player/code/subtypes_tape.dm index 43e7d61a2b66c..88274b7104a17 100644 --- a/mods/music_player/code/subtypes_tape.dm +++ b/mods/music_player/code/subtypes_tape.dm @@ -23,6 +23,6 @@ SetName("tape - \"[new_name]\"") if(new_sound && new_name && !track) - track = new /jukebox_track(new_name, new_sound) + track = new /datum/jukebox_track(new_name, new_sound) return TRUE return FALSE diff --git a/mods/playable_away_yacht/maps/yacht.dmm b/mods/playable_away_yacht/maps/yacht.dmm index 76affd2130754..82bbac4c2a7a0 100644 --- a/mods/playable_away_yacht/maps/yacht.dmm +++ b/mods/playable_away_yacht/maps/yacht.dmm @@ -929,7 +929,7 @@ /turf/simulated/floor/tiled/white, /area/playable_yacht/kitchen) "dl" = ( -/obj/item/material/kitchen/rollingpin, +/obj/item/material/rollingpin, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, @@ -2287,7 +2287,9 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/cyan, +/obj/machinery/atmospherics/binary/pump/on{ + dir = 1 + }, /turf/simulated/floor/tiled/monotile, /area/playable_yacht/left_engine) "To" = ( diff --git a/mods/resomi/code/body/emotes.dm b/mods/resomi/code/body/emotes.dm index 43423e80e7985..dc50f5c329e05 100644 --- a/mods/resomi/code/body/emotes.dm +++ b/mods/resomi/code/body/emotes.dm @@ -19,3 +19,7 @@ /singleton/emote/audible/sneeze/resomi emote_sound = 'mods/resomi/sound/resomisneeze.ogg' sounded_species = null + +/singleton/emote/audible/giggle/resomi + emote_sound = 'mods/resomi/sound/resomilaugh.ogg' + sounded_species = null diff --git a/mods/resomi/code/datum/species.dm b/mods/resomi/code/datum/species.dm index 2b95a68ec3964..055a9d763c521 100644 --- a/mods/resomi/code/datum/species.dm +++ b/mods/resomi/code/datum/species.dm @@ -33,7 +33,7 @@ slowdown = -0.8 //speed fix? - darksight_range = 2 + darksight_range = 4 darksight_tint = DARKTINT_GOOD flash_mod = 2 total_health = 150 @@ -61,7 +61,7 @@ heat_level_1 = 320 heat_level_2 = 370 heat_level_3 = 600 - heat_discomfort_level = 292 + heat_discomfort_level = 295 heat_discomfort_strings = list( "Вашу кожу покалывает от жары.", "Вам жарко.", @@ -136,6 +136,7 @@ HOME_SYSTEM_RESOMI_BIRDCAGE, HOME_SYSTEM_RESOMI_EREMUS, HOME_SYSTEM_RESOMI_ASRANDA, + HOME_SYSTEM_QUIG, //HOME_SYSTEM_RESOMI_TIAMATH HOME_SYSTEM_LUNA, HOME_SYSTEM_MARS, @@ -204,4 +205,5 @@ /singleton/emote/audible/laugh/resomi, /singleton/emote/audible/scream/resomi, /singleton/emote/audible/sneeze/resomi, + /singleton/emote/audible/giggle/resomi, ) diff --git a/mods/utility_items/_utility_items.dme b/mods/utility_items/_utility_items.dme index 70aecc49e8343..a2709e68e731f 100644 --- a/mods/utility_items/_utility_items.dme +++ b/mods/utility_items/_utility_items.dme @@ -16,13 +16,18 @@ #include "code/circuit.dm" #include "code/global_hud_sierra.dm" #include "code/labcoat.dm" -#include "code\ninja-map.dm" -#include "code\shuttle_feature.dm" -#include "code\craft_drugs.dm" +#include "code/ninja-map.dm" +#include "code/shuttle_feature.dm" +#include "code/craft_drugs.dm" #include "code/hair_olivka.dm" #include "code/ert_maint_helmet.dm" #include "code/tag_recipe.dm" +#include "code/dodge_animation.dm" +#include "code/advanced_landing.dm" #include "code/chemistry.dm" #include "code/jobs.dm" +#include "code/bottom.dm" +#include "code/top.dm" +#include "code\skrell-ship.dm" #endif diff --git a/mods/utility_items/code/advanced_landing.dm b/mods/utility_items/code/advanced_landing.dm new file mode 100644 index 0000000000000..eba9529002976 --- /dev/null +++ b/mods/utility_items/code/advanced_landing.dm @@ -0,0 +1,328 @@ +/obj/machinery/computer/shuttle_control/Initialize(mapload, init_shuttle_tag) + . = ..() + if(shuttle_tag == init_shuttle_tag) + sync_shuttle() + +/obj/machinery/computer/shuttle_control/explore/handle_topic_href(datum/shuttle/autodock/overmap/shuttle, list/href_list) + . = ..() + if(href_list["advancedpick"]) + var/list/possible_d = shuttle.get_possible_waypoints() + var/obj/overmap/visitable/D + if(length(possible_d)) + D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d + else + to_chat(usr,SPAN_WARNING("No valid landing sites in range.")) + possible_d = shuttle.get_possible_waypoints() + if(CanInteract(usr, GLOB.default_state) && (D in possible_d)) + var/area/area_oko = get_area(src) + var/obj/machinery/computer/shuttle_control/explore/console = locate(/obj/machinery/computer/shuttle_control/explore) in area_oko + var/turf/origin = locate(console.x + x_offset, console.y + y_offset, console.z) + landloc = locate(origin.x, origin.y, pick(D.map_z)) + oko_enter(landloc) + shuttle_type = shuttle + return TOPIC_REFRESH + +/datum/shuttle/autodock/overmap/proc/get_possible_waypoints() + var/list/waypoints = list() + var/z_co = usr.z + var/obj/overmap/visitable/we = map_sectors["[z_co]"] + var/turf/T = get_turf(we) + for(var/obj/overmap/visitable/candidate in T) + if(candidate.map_z) + waypoints += candidate + return waypoints + +/obj/machinery/computer/shuttle_control + var/mob/observer/eye/landeye/oko + var/datum/shuttle/autodock/overmap/shuttle_type + /// Horizontal offset from the console of the origin tile when using it + var/x_offset = 0 + /// Vertical offset from the console of the origin tile when using it + var/y_offset = 0 + var/landloc + var/skilled_enough = FALSE + var/skill_req = SKILL_EXPERIENCED + +/obj/machinery/computer/shuttle_control/proc/update_operator_skill() + if (isobserver(usr)) + return + if(!usr) + return + operator_skill = usr.get_skill_value(SKILL_PILOT) + if (operator_skill >= skill_req && !(istype(usr, /mob/living/silicon/ai))) + skilled_enough = TRUE + else + skilled_enough = FALSE + +/obj/machinery/computer/shuttle_control/explore/get_ui_data(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + . = ..() + update_operator_skill() + + . += list( + "skilled_enough" = skilled_enough + ) + +/mob/observer/eye/landeye + see_in_dark = 7 + + density = FALSE + alpha = 127 + plane = OBSERVER_PLANE + simulated = FALSE + stat = CONSCIOUS + invisibility = INVISIBILITY_EYE + see_invisible = SEE_INVISIBLE_MINIMUM + sight = SEE_TURFS + ghost_image_flag = GHOST_IMAGE_NONE + var/list/placement_images = list() + var/obj/machinery/computer/shuttle_control/explore/console_link + var/list/to_add = list() + +/mob/living/carbon/human/update_dead_sight() + . = ..() + if(!eyeobj) + cancel_landeye_view() + return + if(eyeobj.type == /mob/observer/eye/landeye) + set_see_in_dark(8) + set_see_invisible(SEE_INVISIBLE_MINIMUM) + set_sight(BLIND|SEE_TURFS) + +/mob/observer/eye/landeye/possess(mob/user) + if(owner && owner != user) + return + if(owner && owner.eyeobj != src) + return + owner = user + owner.eyeobj = src + SetName("[owner.name] ([name_sufix])") // Update its name + if(owner.client) + owner.verbs |= /mob/living/proc/spawn_landmark + owner.verbs |= /mob/living/proc/extra_view + owner.verbs |= /mob/living/proc/cancel_landeye_view + owner.client.eye = src + +/mob/observer/eye/landeye/setLoc(T) + if(!owner) + return FALSE + + T = get_turf(T) + if(!T || T == loc) + return FALSE + + forceMove(T) + + if(owner.client) + owner.client.eye = src + if(owner_follows_eye) + owner.forceMove(loc) + return TRUE + +/mob/living/proc/extra_view() + set name = "Change View" + set desc = "Change View" + set category = "Ships Control" + var/mob/user = src + var/extra_view = 4 + switch(alert("Set view scale", "Set view scale", "Normal", "Big")) + if("Normal") + return usr.client.view = usr.get_preference_value(/datum/client_preference/client_view) + if("Big") + return user.client.view = world.view + extra_view + + +//______________________________________________________________ +//Ради Модульности, дублируем сюда все что идет в awayshuttle и accessible_areas +/obj/machinery/computer/shuttle_control/explore/away_scg_patrol/reaper +/obj/machinery/computer/shuttle_control/explore/vox_lander +/obj/machinery/computer/shuttle_control/explore/skrellscoutshuttle +/obj/machinery/computer/shuttle_control/explore/away_farfleet/snz +/obj/machinery/computer/shuttle_control/explore/mule +/obj/machinery/computer/shuttle_control/explore/graysontug/hand_one +/obj/machinery/computer/shuttle_control/explore/pod_hand_one +/obj/machinery/computer/shuttle_control/explore/pod_hand_two +/obj/machinery/computer/shuttle_control/explore/graysontug/hand_two +/obj/machinery/computer/shuttle_control/explore/merc_shuttle/merc_drop_pod + +/area/mine + name = "Mine" + +/area/bluespaceriver + name = "\improper Arctic Planet Surface" + +// ______________________________________________________________ + +/obj/machinery/computer/shuttle_control/explore/ + + var/landmarkx_off + var/landmarky_off + //Лучше способа не придумал, поэтому если check_zone шаттла захватывает территории, больше чем надо, то пихаем консоль этого шаттла, в список + var/list/awayshuttles = list( + /obj/machinery/computer/shuttle_control/explore/away_scg_patrol/reaper, + /obj/machinery/computer/shuttle_control/explore/vox_lander, + /obj/machinery/computer/shuttle_control/explore/skrellscoutshuttle, + /obj/machinery/computer/shuttle_control/explore/away_farfleet/snz, + /obj/machinery/computer/shuttle_control/explore/mule, + /obj/machinery/computer/shuttle_control/explore/graysontug/hand_one, + /obj/machinery/computer/shuttle_control/explore/pod_hand_one, + /obj/machinery/computer/shuttle_control/explore/pod_hand_two, + /obj/machinery/computer/shuttle_control/explore/graysontug/hand_two, + /obj/machinery/computer/shuttle_control/explore/merc_shuttle, + /obj/machinery/computer/shuttle_control/explore/merc_shuttle/merc_drop_pod, + ) + + //Списки куда разрешена посадка + var/list/accesible_areas = list( + /area/mine, + /area/space, + /area/exoplanet, + /area/bluespaceriver, + ) + + var/list/shadow_images = list() + var/list/saved_landmarks= list() + + +/obj/machinery/computer/shuttle_control/explore/proc/oko_enter() + oko = new /mob/observer/eye/landeye + oko.name_sufix = "Landing Eye" + oko.possess(usr) + addtimer(new Callback(src, PROC_REF(oko_force_move)), 2 SECONDS) + oko.console_link = src + create_zone() + oko.to_add = oko.placement_images + usr.client.images = oko.to_add + +/obj/machinery/computer/shuttle_control/explore/proc/oko_force_move() + oko.forceMove(landloc) + +/obj/machinery/computer/shuttle_control/explore/proc/create_zone() + var/area/area_oko = get_area(src) + var/turf/origin = locate(src.x + x_offset, src.y + y_offset, src.z) + var/turf/turf + var/obj/shuttle_landmark/shuttle_landmark + if(src.type in awayshuttles) + turf = get_subarea_turfs(area_oko.type) + else + turf = get_subarea_turfs(area_oko.parent_type) + + if(area_oko in SSshuttle.shuttle_areas) + for(var/shuttle_name in SSshuttle.shuttles) + var/datum/shuttle/shuttle_datum = SSshuttle.shuttles[shuttle_name] + if(area_oko in shuttle_datum.shuttle_area) + for(var/turf/simulated/T in turf) + var/image/I = image('mods/utility_items/icons/alphacolors.dmi', origin, "red") + var/x_off = T.x - origin.x + var/y_off = T.y - origin.y + I.loc = locate(origin.x + x_off, origin.y + y_off, origin.z) //we have to set this after creating the image because it might be null, and images created in nullspace are immutable. + I.layer = TURF_LAYER + oko.placement_images[I] = list(x_off, y_off) + shuttle_landmark = shuttle_datum.current_location + if(shuttle_landmark) + landmarkx_off = shuttle_landmark.x - origin.x + landmarky_off = shuttle_landmark.y - origin.y + +/obj/machinery/computer/shuttle_control/explore/proc/check_zone() + shadow_images = list() + var/turf/eyeturf = get_turf(oko) + var/list/image_cache = oko.placement_images + var/landable = TRUE + for(var/i in 1 to LAZYLEN(image_cache)) + var/image/I = image_cache[i] + var/list/coords = image_cache[I] + var/turf/T = locate(eyeturf.x + coords[1], eyeturf.y + coords[2], eyeturf.z) + var/area/A = get_area(T) + var/zone_good = FALSE + I.loc = T + shadow_images += I + if(T && !(T.density)) + for(var/type in accesible_areas) + if(A.type in typesof(type)) + zone_good = TRUE + if(zone_good) + I.icon_state = "blue" + else + I.icon_state = "red" + else + I.icon_state = "red" + landable = FALSE + if(landable) + return landable + +/mob/cancel_camera() + . = ..() + if(!eyeobj) + return + if(eyeobj.type == /mob/observer/eye/landeye) + eyeobj.release(src) + usr.client.view = usr.get_preference_value(/datum/client_preference/client_view) + +/mob/living/proc/cancel_landeye_view() + set name = "Cancel View" + set desc = "Cancel View" + set category = "Ships Control" + cancel_camera() + +/mob/observer/eye/landeye/release(mob/user) + if(owner != user || !user) + return + if(owner.eyeobj != src) + return + usr.client.images -= placement_images + QDEL_NULL_LIST(placement_images) + owner.eyeobj = null + owner.verbs -= /mob/living/proc/spawn_landmark + owner.verbs -= /mob/living/proc/extra_view + owner.verbs -= /mob/living/proc/cancel_landeye_view + owner = null + src.Destroy() + SetName(initial(name)) + +/obj/shuttle_landmark + var/list/image_shadow + +/obj/shuttle_landmark/ship/advancedlandmark/Initialize(mapload, obj/shuttle_landmark/ship/master, _name) + landmark_tag = "_[shuttle_name] [rand(1,99999)]" + . = ..() + +/mob/living/proc/spawn_landmark() + set name = "Landing Spot" + set category = "Ships Control" + var/obj/shuttle_landmark/ship/advancedlandmark/landmark + var/area/temp = get_area(eyeobj.owner) + if(temp in SSshuttle.shuttle_areas) + for(var/shuttle_name in SSshuttle.shuttles) + var/datum/shuttle/shuttle_datum = SSshuttle.shuttles[shuttle_name] + if(temp in shuttle_datum.shuttle_area) + for(var/obj/machinery/computer/shuttle_control/explore/c in temp) + for(var/obj/shuttle_landmark/ship/advancedlandmark/l in c.saved_landmarks) + var/area/landmarkarea = get_area(l) + if(landmarkarea in shuttle_datum.shuttle_area) + continue + else + c.saved_landmarks -= l + qdel(l) + if(c.check_zone()) + var/turf/eyeturf = get_turf(c.oko) + var/turf/T = locate(eyeturf.x + c.landmarkx_off, eyeturf.y + c.landmarky_off , eyeturf.z) + landmark = new (T, src) + c.saved_landmarks += landmark + c.shuttle_type.set_destination(landmark) + c.shuttle_type.next_location.image_shadow = c.shadow_images + +/turf + var/prev_type + +/turf/ChangeTurf(turf/N, tell_universe = TRUE, force_lighting_update = FALSE, keep_air = FALSE) + .=..() + var/old_prev_type = prev_type + prev_type = old_prev_type + + +/datum/shuttle/autodock/process_launch() + .=..() + for(var/i in 1 to LAZYLEN(next_location.image_shadow)) + var/image/I = next_location.image_shadow[i] + var/turf/T = locate(I.loc.x, I.loc.y, I.loc.z) + I = image('mods/utility_items/icons/alphacolors.dmi', T, "dither50") + T.AddOverlays(I) diff --git a/mods/utility_items/code/bottom.dm b/mods/utility_items/code/bottom.dm new file mode 100644 index 0000000000000..66774c6157203 --- /dev/null +++ b/mods/utility_items/code/bottom.dm @@ -0,0 +1,20 @@ +/datum/category_item/underwear/bottom/pantysnormfull + name = "Panties, alte" + underwear_name = "panties" + icon = 'mods/utility_items/icons/human.dmi' + icon_state = "pantysnormfull" + has_color = TRUE + +/datum/category_item/underwear/bottom/pantyesstring + name = "Panties, strings" + underwear_name = "panties" + icon = 'mods/utility_items/icons/human.dmi' + icon_state = "pantystring" + has_color = TRUE + +/datum/category_item/underwear/bottom/pantyesshorts + name = "Panties, shorts" + underwear_name = "panties" + icon = 'mods/utility_items/icons/human.dmi' + icon_state = "pantyshorts" + has_color = TRUE diff --git a/mods/utility_items/code/dodge_animation.dm b/mods/utility_items/code/dodge_animation.dm new file mode 100644 index 0000000000000..70e033ec0f160 --- /dev/null +++ b/mods/utility_items/code/dodge_animation.dm @@ -0,0 +1,46 @@ +//Анимация уворота для мобиков. +/mob/proc/dodge_animation(input_animation_time = 0.4 SECONDS, atom/attacker = null) + //Выставляем нулевые значения + pixel_x = 0 + pixel_y = 0 + //Сперва создаём список направлений, куда будет уклонятся кукла + var/list/directions = list(NORTH, EAST, WEST, SOUTH) + //Теперь удалим 1 лишние направление, т.к для уклонения нельзя сдвигаться навстречу противнику(Не красиво) + if(attacker) + //берём противоположное направление атакующего + var/enemy_dir = turn(attacker.dir, 180) + if(enemy_dir == NORTHWEST || enemy_dir == SOUTHWEST) + enemy_dir = WEST + else if(enemy_dir == SOUTHWEST || enemy_dir == SOUTHEAST) + enemy_dir = EAST + LAZYREMOVE(directions, enemy_dir) + var/dodge_direction = pick(directions) + //определяемся с временем анимации уворота + var/result_animation_time = input_animation_time + var/middle_number = result_animation_time/2 + //Обычный цикл + for(var/current_iteration = 1, current_iteration <= result_animation_time, current_iteration++) + sleep(1) + if(dodge_direction == NORTH) + if(current_iteration <= middle_number) + pixel_y += 2 + else + pixel_y -= 2 + + else if(dodge_direction == SOUTH) + if(current_iteration <= middle_number) + pixel_y -= 2 + else + pixel_y += 2 + + else if(dodge_direction == WEST) + if(current_iteration <= middle_number) + pixel_x -= 2 + else + pixel_x += 2 + + else if(dodge_direction == EAST) + if(current_iteration <= middle_number) + pixel_x += 2 + else + pixel_x -= 2 diff --git a/mods/utility_items/code/skrell-ship.dm b/mods/utility_items/code/skrell-ship.dm new file mode 100644 index 0000000000000..85bdfc322c35d --- /dev/null +++ b/mods/utility_items/code/skrell-ship.dm @@ -0,0 +1,50 @@ +// Закоментите весь файл, если вам не нужна эта карта +/datum/map_template/ruin/away_site/skrellscoutship + prefix = "mods/utility_items/maps/" + suffixes = list("skrell-sierrabay.dmm") + + +//А здесь мы заменим спрайты войдов +/obj/item/clothing/head/helmet/space/void/skrell/black + icon = 'mods/utility_items/icons/skrell_suit.dmi' + sprite_sheets = list( + SPECIES_UNATHI = 'icons/mob/species/unathi/onmob_suit_unathi.dmi', + SPECIES_SKRELL = 'mods/utility_items/icons/skrell_suit_on_mob.dmi', + ) + sprite_sheets_obj = list( + SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/obj_suit_unathi.dmi', + SPECIES_SKRELL = 'mods/utility_items/icons/skrell_suit_on_mob.dmi', + ) + +/obj/item/clothing/head/helmet/space/void/skrell/white + icon = 'mods/utility_items/icons/skrell_suit.dmi' + sprite_sheets = list( + SPECIES_UNATHI = 'icons/mob/species/unathi/onmob_suit_unathi.dmi', + SPECIES_SKRELL = 'mods/utility_items/icons/skrell_suit_on_mob.dmi', + ) + sprite_sheets_obj = list( + SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/obj_suit_unathi.dmi', + SPECIES_SKRELL = 'mods/utility_items/icons/skrell_suit_on_mob.dmi', + ) + +/obj/item/clothing/suit/space/void/skrell/black + icon = 'mods/utility_items/icons/skrell_suit.dmi' + sprite_sheets = list( + SPECIES_UNATHI = 'icons/mob/species/unathi/onmob_suit_unathi.dmi', + SPECIES_SKRELL = 'mods/utility_items/icons/skrell_suit_on_mob.dmi', + ) + sprite_sheets_obj = list( + SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/obj_suit_unathi.dmi', + SPECIES_SKRELL = 'mods/utility_items/icons/skrell_suit_on_mob.dmi', + ) + +/obj/item/clothing/suit/space/void/skrell/white + icon = 'mods/utility_items/icons/skrell_suit.dmi' + sprite_sheets = list( + SPECIES_UNATHI = 'icons/mob/species/unathi/onmob_suit_unathi.dmi', + SPECIES_SKRELL = 'mods/utility_items/icons/skrell_suit_on_mob.dmi', + ) + sprite_sheets_obj = list( + SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/obj_suit_unathi.dmi', + SPECIES_SKRELL = 'mods/utility_items/icons/skrell_suit_on_mob.dmi', + ) diff --git a/mods/utility_items/code/top.dm b/mods/utility_items/code/top.dm new file mode 100644 index 0000000000000..5d1be0762bef7 --- /dev/null +++ b/mods/utility_items/code/top.dm @@ -0,0 +1,5 @@ +/datum/category_item/underwear/top/branew + name = "Bra, alte" + icon = 'mods/utility_items/icons/human.dmi' + icon_state = "branew" + has_color = TRUE diff --git a/mods/utility_items/icons/alphacolors.dmi b/mods/utility_items/icons/alphacolors.dmi new file mode 100644 index 0000000000000..e639db16f1f5f Binary files /dev/null and b/mods/utility_items/icons/alphacolors.dmi differ diff --git a/mods/utility_items/icons/human.dmi b/mods/utility_items/icons/human.dmi new file mode 100644 index 0000000000000..cf6a4f4303842 Binary files /dev/null and b/mods/utility_items/icons/human.dmi differ diff --git a/mods/utility_items/icons/skrell_suit.dmi b/mods/utility_items/icons/skrell_suit.dmi new file mode 100644 index 0000000000000..42d4904da7b58 Binary files /dev/null and b/mods/utility_items/icons/skrell_suit.dmi differ diff --git a/mods/utility_items/icons/skrell_suit_on_mob.dmi b/mods/utility_items/icons/skrell_suit_on_mob.dmi new file mode 100644 index 0000000000000..3687eaa9d71d6 Binary files /dev/null and b/mods/utility_items/icons/skrell_suit_on_mob.dmi differ diff --git a/mods/utility_items/maps/skrell-sierrabay.dmm b/mods/utility_items/maps/skrell-sierrabay.dmm new file mode 100644 index 0000000000000..4ca881eec9597 --- /dev/null +++ b/mods/utility_items/maps/skrell-sierrabay.dmm @@ -0,0 +1,16399 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/suit_storage_unit/skrell, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/floor_decal/industrial/outline/grey, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"ab" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"ac" = ( +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"ad" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/empty, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"ag" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"ah" = ( +/obj/machinery/atmospherics/portables_connector, +/obj/machinery/portable_atmospherics/canister/empty, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aj" = ( +/obj/machinery/door/window/brigdoor/northleft{ + dir = 2 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"ak" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/empty, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"al" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"am" = ( +/obj/machinery/atmospherics/binary/pump/on, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"an" = ( +/obj/machinery/atmospherics/binary/pump, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"ao" = ( +/obj/machinery/atmospherics/binary/pump{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"ar" = ( +/obj/machinery/atmospherics/pipe/simple/visible/red{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"at" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"au" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"av" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aw" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"ay" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"az" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/portable_atmospherics/powered/scrubber, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aC" = ( +/obj/machinery/portable_atmospherics/powered/scrubber, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/powered/pump/filled, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/portable_atmospherics/powered/pump/filled, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aF" = ( +/obj/machinery/pipedispenser, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"aI" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/wings/starboard) +"aJ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"aM" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/alarm/skrell{ + pixel_y = 22 + }, +/obj/structure/table/rack, +/obj/machinery/recharger/wallcharger{ + pixel_x = -26 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"aO" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/structure/table/rack, +/obj/machinery/recharger/wallcharger{ + pixel_x = 26 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"aQ" = ( +/obj/floor_decal/industrial/warning{ + dir = 5; + icon_state = "warning" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"aR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"aS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"aT" = ( +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"aU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/table/rack, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"aV" = ( +/obj/floor_decal/industrial/warning{ + dir = 10 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"aX" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"aZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"ba" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"bh" = ( +/obj/machinery/power/apc/critical{ + dir = 1; + name = "north bump"; + pixel_y = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bi" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bj" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bk" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bl" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bm" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"bn" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bo" = ( +/obj/floor_decal/industrial/warning{ + dir = 6; + icon_state = "warning" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"bp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"bt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"bw" = ( +/obj/machinery/telecomms/bus/map_preset/skrellscoutship, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bx" = ( +/obj/machinery/telecomms/hub/map_preset/skrellscoutship, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"by" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bz" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bA" = ( +/obj/structure/window/boron_reinforced{ + dir = 1 + }, +/obj/structure/window/boron_reinforced{ + dir = 8 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/green{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bB" = ( +/obj/structure/window/boron_reinforced{ + dir = 1 + }, +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bC" = ( +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"bD" = ( +/obj/structure/window/boron_reinforced{ + dir = 4 + }, +/obj/structure/window/boron_reinforced{ + dir = 1 + }, +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bE" = ( +/obj/catwalk_plated/dark, +/obj/machinery/power/terminal, +/obj/structure/cable/green{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bF" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bH" = ( +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/externalwing/starboard) +"bI" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"bJ" = ( +/obj/machinery/door/airlock{ + name = "Shuttle Storage" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutshuttle) +"bN" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/visible/cyan, +/obj/machinery/meter, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"bO" = ( +/obj/floor_decal/industrial/outline/blue, +/obj/machinery/atmospherics/unary/tank/air{ + dir = 8; + start_pressure = 4559.63 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"bP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/forestorage) +"bQ" = ( +/obj/structure/table/glass, +/obj/item/folder/blue, +/obj/machinery/recharger, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"bR" = ( +/obj/machinery/power/apc/critical{ + dir = 1; + name = "north bump"; + pixel_y = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"bS" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bT" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bV" = ( +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/obj/machinery/telecomms/broadcaster/map_preset/skrellscoutship, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bW" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"bX" = ( +/obj/structure/window/boron_reinforced{ + dir = 8 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/green{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bY" = ( +/obj/structure/cable/green{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/power/skrell_reactor{ + color = "null"; + name = "skrellan advanced fusion drive" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"bZ" = ( +/obj/structure/window/boron_reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"cb" = ( +/obj/machinery/computer/ship/helm{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"cc" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/obj/structure/table/rack, +/obj/item/storage/toolbox/electrical{ + pixel_y = 8 + }, +/obj/item/storage/toolbox/mechanical, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/forestorage) +"cd" = ( +/obj/structure/bed/chair/shuttle/blue{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"ce" = ( +/obj/machinery/hologram/holopad/longrange, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"cf" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/structure/bed/chair/shuttle/blue, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"ck" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/window/basic{ + dir = 8 + }, +/obj/floor_decal/industrial/outline/blue, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"cl" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/empty, +/obj/machinery/atmospherics/portables_connector{ + dir = 8 + }, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"cp" = ( +/obj/machinery/door/airlock/medical{ + name = "Medical Bay" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/medbay) +"cq" = ( +/obj/machinery/telecomms/receiver/map_preset/skrellscoutship, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"cr" = ( +/obj/machinery/telecomms/server/map_preset/skrellscoutship, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"cs" = ( +/obj/structure/window/boron_reinforced, +/obj/structure/window/boron_reinforced{ + dir = 8 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"cu" = ( +/obj/structure/window/boron_reinforced, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"cv" = ( +/obj/structure/window/boron_reinforced, +/obj/structure/window/boron_reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"cC" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"cE" = ( +/obj/machinery/door/airlock{ + name = "Shuttle Maintenance" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/door/firedoor/autoset, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutshuttle) +"cF" = ( +/obj/structure/cable/cyan{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"cM" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/power/apc/critical{ + dir = 1; + name = "north bump"; + pixel_y = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cN" = ( +/obj/machinery/chem_master, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cO" = ( +/obj/machinery/portable_atmospherics/canister/oxygen/prechilled, +/obj/machinery/atmospherics/portables_connector, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cP" = ( +/obj/machinery/atmospherics/unary/freezer{ + icon_state = "freezer" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cQ" = ( +/obj/machinery/atmospherics/unary/cryo_cell, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cS" = ( +/obj/machinery/body_scanconsole{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cU" = ( +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cV" = ( +/obj/machinery/sleeper, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cX" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/surgery, +/obj/item/scalpel/ims, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + pixel_y = 24 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"cY" = ( +/obj/machinery/optable, +/obj/machinery/body_scan_display{ + pixel_y = 24 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"da" = ( +/obj/machinery/power/shield_generator, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, +/obj/machinery/alarm/skrell/server{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"db" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"dc" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"dg" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/obj/machinery/door/blast/regular/open{ + dir = 4; + id_tag = "xil_shuttle"; + name = "Blast Doors" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"dh" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/submap_landmark/spawnpoint/skrellscoutship, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 4; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"di" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"dj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"dk" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/accessory/storage/black_vest, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/item/device/radio/headset/map_preset/skrellscoutship, +/obj/item/device/radio/hailing, +/obj/item/clothing/accessory/storage/holster/thigh, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"dl" = ( +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"dm" = ( +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_x = 8 + }, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -6 + }, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -6; + pixel_y = 11 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 4; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"do" = ( +/obj/structure/table/glass, +/obj/item/bodybag/cryobag{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/bodybag/cryobag{ + pixel_x = 4; + pixel_y = -8 + }, +/obj/item/bodybag/cryobag{ + pixel_x = -5; + pixel_y = -5 + }, +/obj/item/storage/box/bodybags{ + pixel_y = 13 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dq" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"ds" = ( +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dt" = ( +/obj/machinery/alarm/skrell{ + dir = 8; + pixel_x = 22 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dv" = ( +/obj/machinery/power/smes/buildable/preset/skrell, +/obj/structure/cable, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"dy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/table/rack, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"dA" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"dB" = ( +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"dC" = ( +/obj/structure/bed/padded, +/obj/structure/curtain/open/bed, +/obj/item/bedsheet/hos, +/obj/submap_landmark/spawnpoint/skrellscoutship, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"dD" = ( +/obj/machinery/reagentgrinder, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/stack/material/phoron/fifty, +/obj/item/stack/material/phoron/fifty, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"dF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dH" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dJ" = ( +/obj/machinery/door/airlock/medical{ + name = "Surgical Room" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/medbay) +"dK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dP" = ( +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/structure/table/rack, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/item/tank/oxygen_emergency, +/obj/item/tank/oxygen_emergency, +/obj/item/tank/oxygen_emergency, +/obj/item/clothing/mask/breath/emergency, +/obj/item/clothing/mask/breath/emergency, +/obj/item/clothing/mask/breath/emergency, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/forestorage) +"dQ" = ( +/obj/structure/table/glass, +/obj/machinery/reagent_temperature, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/item/reagent_containers/hypospray, +/obj/item/reagent_containers/hypospray{ + pixel_x = 4 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dS" = ( +/obj/structure/table/glass, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dT" = ( +/obj/machinery/vending/medical/skrell{ + density = 0; + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dU" = ( +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/forestorage) +"dV" = ( +/obj/machinery/smartfridge/chemistry, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dX" = ( +/obj/structure/table/glass, +/obj/item/auto_cpr, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = -7; + pixel_y = 11 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dY" = ( +/obj/structure/table/glass, +/obj/item/defibrillator/loaded, +/obj/item/defibrillator/compact/combat/loaded, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"dZ" = ( +/obj/structure/roller_bed, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"ea" = ( +/obj/structure/hygiene/sink{ + dir = 4; + pixel_x = 11; + pixel_y = 5 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"ec" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/adv{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/storage/box/nitrilegloves{ + pixel_x = 7; + pixel_y = -3 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"ed" = ( +/obj/machinery/organ_printer/flesh/mapped, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"ee" = ( +/obj/structure/bed/padded{ + dir = 8 + }, +/obj/structure/curtain/open/bed, +/obj/item/bedsheet/hos, +/obj/submap_landmark/spawnpoint/skrellscoutship, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"en" = ( +/obj/machinery/computer/ship/sensors/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"eo" = ( +/obj/machinery/suit_storage_unit/skrell, +/obj/floor_decal/industrial/outline/grey, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"ep" = ( +/obj/machinery/power/apc/critical{ + dir = 1; + name = "north bump"; + pixel_y = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eq" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + desc = "A flexible superconducting cable for heavy-duty power transfer. It's been labeled 'chaos reigns'."; + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"er" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"es" = ( +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eu" = ( +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"ev" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"ew" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"ey" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/airlock/glass{ + name = "Auxillary Storage" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/command/armory) +"ez" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eB" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eC" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eD" = ( +/obj/structure/window/boron_reinforced{ + dir = 1 + }, +/obj/structure/table/rack, +/obj/item/device/binoculars, +/obj/item/device/binoculars, +/obj/item/device/binoculars, +/obj/structure/window/boron_reinforced{ + dir = 8 + }, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eE" = ( +/obj/machinery/door/window/brigdoor/northleft{ + name = "Weapons locker" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eF" = ( +/obj/structure/window/boron_reinforced{ + dir = 1 + }, +/obj/structure/table/rack, +/obj/floor_decal/industrial/outline/red, +/obj/item/device/gps, +/obj/item/device/gps, +/obj/item/device/gps, +/obj/item/device/gps, +/obj/item/device/gps, +/obj/item/device/scanner/gas{ + pixel_x = 8 + }, +/obj/item/device/gps, +/obj/item/device/scanner/gas{ + pixel_x = 8 + }, +/obj/item/device/scanner/gas{ + pixel_x = 8 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eG" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eI" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eJ" = ( +/obj/structure/window/boron_reinforced{ + dir = 1 + }, +/obj/structure/window/boron_reinforced{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eL" = ( +/obj/structure/window/boron_reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eN" = ( +/obj/structure/dispenser/oxygen, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eP" = ( +/obj/structure/table/rack, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eQ" = ( +/obj/structure/table/rack, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/structure/window/boron_reinforced{ + dir = 8 + }, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eS" = ( +/obj/structure/table/rack, +/obj/item/melee/energy/machete, +/obj/item/melee/energy/machete, +/obj/item/melee/energy/machete, +/obj/item/melee/energy/machete, +/obj/item/melee/energy/machete, +/obj/item/melee/energy/machete, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eT" = ( +/obj/structure/table/rack, +/obj/item/gun/energy/pulse_rifle/skrell, +/obj/item/gun/energy/pulse_rifle/skrell, +/obj/item/gun/energy/pulse_rifle/skrell, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eU" = ( +/obj/structure/table/rack, +/obj/item/gun/magnetic/railgun/flechette/skrell, +/obj/item/gun/magnetic/railgun/flechette/skrell, +/obj/item/gun/magnetic/railgun/flechette/skrell, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"eV" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"eW" = ( +/obj/machinery/vending/engineering{ + req_access = list("ACCESS_SKRELLSCOUT") + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"eZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 8; + pixel_x = 24 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/forestorage) +"fa" = ( +/obj/floor_decal/industrial/outline/grey, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fb" = ( +/obj/machinery/fabricator/hacked, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"fe" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/cyan, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"ff" = ( +/obj/machinery/alarm/skrell{ + dir = 8; + pixel_x = 22 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan, +/obj/machinery/door/blast/regular/open{ + dir = 4; + id_tag = "main_airlock_door" + }, +/obj/machinery/door/airlock/external/glass/bolted_open{ + frequency = 1331; + id_tag = "xil_scoutship_fore_internal" + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/dock) +"fh" = ( +/obj/structure/dispenser/oxygen, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"fj" = ( +/obj/structure/window/boron_reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/light/skrell{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fk" = ( +/obj/machinery/door/window/brigdoor/northleft{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fq" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/access_button/airlock_interior{ + frequency = 1331; + master_tag = "xil_scoutship_fore_dock_controller"; + pixel_x = -4; + pixel_y = 24 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fr" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fs" = ( +/obj/structure/table/rack, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"ft" = ( +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/obj/structure/table/rack, +/obj/item/storage/box/lights/tubes/skrell{ + pixel_x = 8; + pixel_y = -5 + }, +/obj/item/storage/toolbox/electrical{ + pixel_y = 6 + }, +/obj/item/device/encryptionkey/map_preset/skrellscoutship, +/obj/item/device/encryptionkey/map_preset/skrellscoutship, +/obj/item/device/encryptionkey/map_preset/skrellscoutship, +/obj/item/device/encryptionkey/map_preset/skrellscoutship, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"fu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fw" = ( +/obj/structure/table/rack, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/item/device/gps, +/obj/item/device/gps, +/obj/item/device/gps, +/obj/item/device/scanner/gas, +/obj/item/device/scanner/gas, +/obj/item/device/scanner/gas, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"fx" = ( +/obj/structure/table/rack, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = -6 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = -5 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = -5 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"fy" = ( +/obj/floor_decal/industrial/outline/red, +/obj/machinery/stasis_cage, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"fA" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fB" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fC" = ( +/obj/machinery/light/skrell{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fE" = ( +/obj/structure/bed/padded, +/obj/item/bedsheet/brown, +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fF" = ( +/obj/machinery/ion_engine{ + dir = 8 + }, +/turf/simulated/floor/reinforced, +/area/ship/skrellscoutship/maintenance/atmos) +"fH" = ( +/obj/structure/table/rack, +/obj/item/rcd, +/obj/item/rcd_ammo, +/obj/item/rcd_ammo, +/obj/item/rcd_ammo, +/obj/item/rcd_ammo, +/obj/item/rcd_ammo, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"fL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fM" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"fN" = ( +/obj/machinery/power/apc/critical{ + dir = 4; + name = "east bump"; + pixel_x = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fP" = ( +/obj/machinery/light/skrell{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 10 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"fQ" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"fR" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/floor_decal/industrial/warning, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"fS" = ( +/obj/floor_decal/industrial/warning, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"fT" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"fV" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"fW" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"fY" = ( +/obj/machinery/ion_engine{ + dir = 8 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"fZ" = ( +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"ga" = ( +/obj/machinery/computer/ship/sensors/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"gc" = ( +/obj/floor_decal/industrial/warning, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gd" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"ge" = ( +/obj/floor_decal/industrial/warning, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/light/skrell{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"gh" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gi" = ( +/obj/machinery/power/apc/critical{ + dir = 8; + name = "west bump"; + pixel_x = -24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"gj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gk" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gl" = ( +/obj/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gm" = ( +/obj/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"go" = ( +/obj/machinery/ion_engine{ + dir = 8 + }, +/turf/simulated/floor/reinforced, +/area/ship/skrellscoutship/hangar) +"gp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/table/standard, +/obj/item/hand_labeler, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"gq" = ( +/obj/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/machinery/alarm/skrell{ + dir = 1; + pixel_y = -22 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gr" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/obj/machinery/door/blast/regular/open{ + dir = 2; + id_tag = "xil_shuttle"; + name = "Blast Doors" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"gs" = ( +/obj/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gt" = ( +/obj/machinery/power/apc/critical{ + name = "south bump"; + pixel_y = -24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"gw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/table/standard, +/obj/item/tape_roll/skrell, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"gx" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"gy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"gz" = ( +/obj/structure/bed/chair/office/comfy/black{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"gA" = ( +/obj/structure/table/woodentable/walnut, +/obj/item/reagent_containers/food/drinks/glass2/coffeecup{ + pixel_x = -6 + }, +/obj/item/pen/blue{ + pixel_x = 9; + pixel_y = 7 + }, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"gB" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"gE" = ( +/obj/structure/table/standard, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/pen{ + pixel_x = 1; + pixel_y = 7 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + pixel_y = 24 + }, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"gF" = ( +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"gH" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 8; + desc = "A flexible superconducting cable for heavy-duty power transfer. It's been labeled 'chaos reigns'."; + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"gI" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"gK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"gL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"gM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"gP" = ( +/obj/structure/table/rack, +/obj/machinery/light/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"gQ" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/item/flora/pottedplantsmall/fern, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"gS" = ( +/obj/structure/bed/chair/office/comfy/black, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"gT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"gU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"gV" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8; + level = 2 + }, +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/obj/structure/table/standard, +/obj/item/reagent_containers/food/drinks/bottle/thoom{ + pixel_x = 4; + pixel_y = 8 + }, +/obj/item/reagent_containers/food/drinks/bottle/thoom, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"gX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/computer/ship/sensors/skrell{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/command/bridge) +"gY" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"ha" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/bed/chair/office/comfy/black{ + dir = 4 + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"hb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/table/woodentable/walnut, +/obj/item/toy/plushie/thoom, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"hc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"hd" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"he" = ( +/obj/structure/table/standard, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"hf" = ( +/obj/structure/table/standard, +/obj/machinery/chemical_dispenser/bar_soft/full, +/obj/machinery/light/skrell{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"hi" = ( +/obj/structure/table/standard, +/obj/item/device/integrated_circuit_printer, +/obj/item/stack/cable_coil/yellow, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/wings/starboard) +"hk" = ( +/obj/paint/black, +/obj/shuttle_landmark/skrellscoutship/start, +/obj/machinery/door/airlock/external/glass{ + frequency = 1331; + id_tag = "xil_scoutship_fore_external"; + locked = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, +/obj/machinery/door/blast/regular/open{ + dir = 4; + id_tag = "main_airlock_door" + }, +/obj/machinery/access_button/airlock_interior{ + command = "cycle_exterior"; + frequency = 1331; + master_tag = "xil_scoutship_fore_dock_controller"; + pixel_x = 24; + pixel_y = 12 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/dock) +"hl" = ( +/obj/structure/hygiene/toilet{ + dir = 1 + }, +/obj/structure/curtain/open/privacy, +/obj/structure/handrail{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"hm" = ( +/obj/structure/table/woodentable/walnut, +/obj/item/deck/cards{ + pixel_x = -6; + pixel_y = -3 + }, +/obj/item/reagent_containers/food/drinks/cans/waterbottle{ + pixel_x = 5 + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"hn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"ho" = ( +/obj/machinery/cooker/oven, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"hp" = ( +/obj/machinery/seed_extractor, +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hr" = ( +/obj/structure/table/rack, +/obj/item/stock_parts/capacitor/super, +/obj/item/stock_parts/capacitor/super, +/obj/item/stock_parts/capacitor/super, +/obj/item/stock_parts/manipulator/pico, +/obj/item/stock_parts/manipulator/pico, +/obj/item/stock_parts/manipulator/pico, +/obj/item/stock_parts/matter_bin/super, +/obj/item/stock_parts/matter_bin/super, +/obj/item/stock_parts/matter_bin/super, +/obj/item/stock_parts/console_screen, +/obj/item/stock_parts/console_screen, +/obj/item/stock_parts/console_screen, +/obj/item/stock_parts/micro_laser/ultra, +/obj/item/stock_parts/micro_laser/ultra, +/obj/item/stock_parts/micro_laser/ultra, +/obj/item/stock_parts/computer/tesla_link, +/obj/item/stock_parts/computer/tesla_link, +/obj/item/stock_parts/computer/tesla_link, +/obj/item/stock_parts/scanning_module/phasic, +/obj/item/stock_parts/subspace/ansible, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/transmitter, +/obj/item/stock_parts/subspace/treatment, +/obj/item/stock_parts/computer/hard_drive/advanced, +/obj/item/stock_parts/computer/nano_printer, +/obj/item/stock_parts/computer/processor_unit/photonic, +/obj/item/anobattery{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/stock_parts/scanning_module, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hs" = ( +/obj/machinery/anomaly_container, +/obj/floor_decal/industrial/hatch/red, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"ht" = ( +/obj/structure/window/boron_reinforced{ + dir = 8 + }, +/obj/structure/reagent_dispensers/coolanttank, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/labs) +"hu" = ( +/obj/machinery/radiocarbon_spectrometer, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/labs) +"hv" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/computer/ship/navigation, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"hx" = ( +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/labs) +"hy" = ( +/obj/machinery/suspension_gen, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"hz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hB" = ( +/obj/structure/flora/pottedplant, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"hE" = ( +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"hF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"hI" = ( +/obj/structure/flora/pottedplant/unusual, +/obj/machinery/light/skrell{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"hJ" = ( +/obj/structure/table/woodentable/walnut, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 1; + pixel_y = -32 + }, +/obj/machinery/recharger, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"hL" = ( +/obj/structure/table/woodentable/walnut, +/obj/item/storage/box/glasses/mug, +/obj/item/storage/box/glasses/wine{ + pixel_y = 8 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"hO" = ( +/obj/machinery/smartfridge, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"hP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/table/rack, +/obj/item/device/taperecorder, +/obj/item/device/camera, +/obj/item/storage/briefcase/crimekit, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/table/rack, +/obj/item/storage/belt/archaeology, +/obj/item/storage/belt/archaeology, +/obj/item/pickaxe/xeno/drill/plasma, +/obj/item/clothing/glasses/hud/science, +/obj/item/storage/excavation, +/obj/item/device/scanner/xenobio, +/obj/item/device/measuring_tape, +/obj/item/storage/box/evidence, +/obj/item/device/scanner/mining, +/obj/item/storage/bolt_bag/full_of_beacons, +/obj/item/storage/bolt_bag/full_of_beacons, +/obj/item/storage/bolt_bag/full_of_beacons, +/obj/item/storage/bolt_bag/full_of_beacons, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hS" = ( +/obj/machinery/alarm/skrell{ + dir = 1; + pixel_y = -22 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hT" = ( +/obj/machinery/power/apc/critical{ + name = "south bump"; + pixel_y = -24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"hU" = ( +/obj/structure/window/boron_reinforced{ + dir = 8 + }, +/obj/structure/closet/toolcloset/excavation, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/labs) +"hX" = ( +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/obj/machinery/power/apc/critical{ + dir = 4; + name = "east bump"; + pixel_x = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/obj/structure/table/glass, +/obj/item/folder/red{ + pixel_x = 7 + }, +/obj/item/reagent_containers/food/drinks/cans/waterbottle{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/glass2/pint, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"hY" = ( +/obj/machinery/door/airlock{ + name = "Laboratory" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/labs) +"hZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/multi_tile/glass{ + name = "Hall" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/wings/starboard) +"ia" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/bed/chair/comfy/red{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"ib" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"ic" = ( +/obj/structure/table/glass, +/obj/item/folder/red, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"id" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/computer/ship/helm{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/command/bridge) +"ie" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/overmap/visitable/ship/landable/skrellscoutship, +/obj/structure/bed/chair/comfy/red{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/command/bridge) +"if" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/command/bridge) +"ig" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"ih" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"ii" = ( +/obj/machinery/computer/ship/navigation{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge{ + dir = 4 + }) +"ij" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"il" = ( +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"im" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"ip" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"ir" = ( +/obj/structure/flora/pottedplant/large, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"is" = ( +/obj/structure/flora/pottedplant/aquatic, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"ix" = ( +/obj/structure/table/standard, +/obj/item/pen, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + desc = "A flexible superconducting cable for heavy-duty power transfer. It's been labeled 'chaos reigns'."; + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iz" = ( +/obj/structure/table/standard, +/obj/item/folder, +/obj/item/folder, +/obj/item/pen, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + pixel_y = 24 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iC" = ( +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iD" = ( +/obj/structure/bed/chair/comfy/red, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iE" = ( +/obj/machinery/shipsensors, +/turf/simulated/floor/reinforced{ + map_airless = 1 + }, +/area/ship/skrellscoutship/wings/port) +"iF" = ( +/obj/structure/bed/chair/comfy/red{ + dir = 4 + }, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iG" = ( +/obj/structure/table/woodentable/walnut, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iH" = ( +/obj/structure/table/woodentable/walnut, +/obj/random/clipboard, +/obj/item/pen, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iI" = ( +/obj/structure/bed/chair/comfy/red{ + dir = 8 + }, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iJ" = ( +/obj/structure/table/standard, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iN" = ( +/obj/structure/bed/chair/comfy/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iO" = ( +/obj/structure/bed/chair/comfy/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iP" = ( +/obj/structure/bed/chair/comfy/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"iQ" = ( +/obj/structure/table/standard, +/obj/item/folder, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/recharger, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iR" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iT" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iW" = ( +/obj/structure/reagent_dispensers/water_cooler{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iY" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"iZ" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"jd" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jg" = ( +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"jh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"ji" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jn" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/machinery/computer/cryopod{ + pixel_x = -32 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"jo" = ( +/obj/structure/table/rack, +/obj/item/tank/oxygen, +/obj/item/tank/oxygen, +/obj/item/tank/oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/inflatable_dispenser, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/forestorage) +"jp" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/forestorage) +"jq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/powered/pump/filled, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/forestorage) +"jr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/computer/shuttle_control/explore/skrellscoutship{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/command/bridge) +"js" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"jt" = ( +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"ju" = ( +/obj/structure/closet/secure_closet/brig{ + id = "Cell 1"; + name = "Cell Locker"; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/light/skrell{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"jv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"jx" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/structure/reagent_dispensers/water_cooler{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"jB" = ( +/obj/machinery/vending/engivend{ + scan_id = 0 + }, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jD" = ( +/obj/structure/table/rack, +/obj/structure/window/basic{ + dir = 8 + }, +/obj/floor_decal/industrial/outline/yellow, +/obj/item/stack/material/aluminium/fifty, +/obj/item/stack/material/aluminium/fifty, +/obj/item/stack/material/aluminium/fifty, +/obj/item/stack/material/aluminium/fifty, +/obj/item/stack/material/aluminium/fifty, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jE" = ( +/obj/structure/table/rack, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/steel/fifty, +/obj/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jF" = ( +/obj/structure/table/rack, +/obj/structure/window/basic, +/obj/structure/window/basic{ + dir = 8 + }, +/obj/item/stack/material/plasteel/fifty, +/obj/item/stack/material/plasteel/fifty, +/obj/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jG" = ( +/obj/structure/table/rack, +/obj/floor_decal/industrial/outline/yellow, +/obj/item/stack/material/glass/reinforced/fifty, +/obj/item/stack/material/glass/reinforced/fifty, +/obj/item/stack/material/glass/reinforced/fifty, +/obj/item/stack/material/glass/reinforced/fifty, +/obj/item/stack/material/glass/reinforced/fifty, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jO" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/machinery/power/apc/critical{ + dir = 4; + name = "east bump"; + pixel_x = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jP" = ( +/obj/structure/table/rack, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/item/storage/belt/holster/skrell, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jQ" = ( +/obj/structure/window/boron_reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jU" = ( +/obj/structure/table/rack, +/obj/structure/window/basic, +/obj/floor_decal/industrial/outline/yellow, +/obj/item/stack/material/glass/boron_reinforced/ten, +/obj/item/stack/material/glass/boron_reinforced/ten, +/obj/item/stack/material/glass/boron_reinforced/ten, +/obj/item/stack/material/glass/boron_reinforced/ten, +/obj/item/stack/material/glass/boron_reinforced/ten, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jV" = ( +/obj/structure/table/rack, +/obj/structure/window/basic, +/obj/item/stack/material/titanium/fifty, +/obj/item/stack/material/titanium/fifty, +/obj/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"jW" = ( +/obj/structure/table/rack, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"ka" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/structure/window/basic{ + dir = 1 + }, +/obj/floor_decal/industrial/outline/blue, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"kc" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/adv{ + pixel_x = 9; + pixel_y = 10 + }, +/obj/item/storage/firstaid/adv{ + pixel_x = -9; + pixel_y = -2 + }, +/obj/item/storage/firstaid/adv{ + pixel_x = -9; + pixel_y = 10 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"kd" = ( +/obj/structure/table/rack, +/obj/item/gun/magnetic/railgun/flechette/skrell, +/obj/item/gun/magnetic/railgun/flechette/skrell, +/obj/item/gun/magnetic/railgun/flechette/skrell, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"ke" = ( +/obj/structure/table/rack, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"kh" = ( +/obj/structure/table/rack, +/obj/structure/window/boron_reinforced{ + dir = 4 + }, +/obj/item/melee/energy/machete, +/obj/item/melee/energy/machete, +/obj/item/melee/energy/machete, +/obj/item/melee/energy/machete, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"kj" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/floor_decal/industrial/outline/blue, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"km" = ( +/obj/structure/table/rack, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"kn" = ( +/obj/machinery/alarm/skrell{ + dir = 1; + pixel_y = -22 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"kq" = ( +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"kr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"ks" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/airlock/multi_tile/glass/command{ + dir = 8; + id_tag = "mainbridge"; + name = "Bridge Access" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/command/bridge) +"kt" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"ku" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"kv" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"kw" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"kx" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"ky" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"kz" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"kA" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"kB" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"kE" = ( +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/externalwing/port) +"kF" = ( +/obj/machinery/ion_engine{ + dir = 8 + }, +/turf/simulated/floor/reinforced, +/area/ship/skrellscoutship/command/armory) +"kG" = ( +/obj/landmark/map_data, +/obj/overmap/visitable/sector/skrellscoutspace, +/turf/space, +/area/space) +"kH" = ( +/obj/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/shuttle_landmark/skrellscoutshuttle/start, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"kI" = ( +/obj/overmap/visitable/ship/landable/skrellscoutshuttle, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"kK" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"kQ" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8; + level = 2 + }, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"kR" = ( +/obj/structure/table/standard, +/obj/item/device/scanner/spectrometer/adv, +/obj/item/device/scanner/reagent, +/obj/machinery/recharger, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"kV" = ( +/obj/machinery/light/skrell, +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/pen, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"kZ" = ( +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/structure/bed/chair/shuttle/blue{ + dir = 1 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + default_hailing = 1; + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"la" = ( +/obj/machinery/power/apc/critical{ + dir = 1; + name = "north bump"; + pixel_y = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"lc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/multi_tile/glass{ + name = "Hall" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/dock) +"li" = ( +/obj/machinery/light/skrell{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"lG" = ( +/obj/structure/bed/padded, +/obj/item/bedsheet/brown, +/obj/machinery/alarm/skrell{ + dir = 8; + pixel_x = 22 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"lK" = ( +/obj/paint/black, +/obj/wallframe_spawn/reinforced_phoron/hull, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/rec) +"lQ" = ( +/obj/structure/bed/chair/comfy/yellow{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/wings/starboard) +"mn" = ( +/obj/machinery/power/smes/buildable/max_cap_in_out, +/obj/structure/cable/cyan{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"mt" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/accessory/storage/black_vest, +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/item/device/radio/headset/map_preset/skrellscoutship, +/obj/item/device/radio/hailing, +/obj/item/clothing/accessory/storage/holster/thigh, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"mx" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"my" = ( +/obj/machinery/door/airlock/security{ + name = "Brig" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/dock) +"mz" = ( +/obj/machinery/computer/shuttle_control/explore/skrellscoutshuttle{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"mI" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/maintenance/power) +"mL" = ( +/obj/machinery/computer/operating, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"mP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"nb" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"nc" = ( +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 1; + pixel_y = -32 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8; + level = 2 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"ng" = ( +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"nj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/glass/civilian{ + name = "Living Area" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/rec) +"nr" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/paint/black, +/obj/machinery/door/airlock/engineering, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/maintenance/power) +"nw" = ( +/obj/machinery/light/skrell, +/obj/machinery/radio_beacon, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"nD" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/empty, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"nG" = ( +/obj/structure/table/rack, +/obj/item/storage/box/lights/tubes/skrell, +/obj/item/storage/box/lights/tubes/skrell, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"nJ" = ( +/obj/paint/black, +/obj/wallframe_spawn/reinforced_phoron/hull, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/labs) +"nK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/item/stool/bar/padded, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"nR" = ( +/obj/paint/black, +/obj/wallframe_spawn/reinforced_phoron/hull, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/medbay) +"nT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"oa" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + id_tag = "xil_shuttle_pump_out_internal" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"oj" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"or" = ( +/obj/structure/table/woodentable/walnut, +/obj/item/reagent_containers/food/condiment/psilocybin{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/condiment/mindbreaker, +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"oB" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 1 + }, +/obj/floor_decal/industrial/outline/blue, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"oK" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"pa" = ( +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/visible/red{ + dir = 1 + }, +/obj/machinery/meter, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"pb" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"pe" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable/green, +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"pj" = ( +/obj/machinery/computer/ship/navigation{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/command/bridge) +"py" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"pz" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + dir = 1; + id_tag = "xil_shuttle_pump" + }, +/obj/machinery/airlock_sensor{ + frequency = 1331; + id_tag = "xil_shuttle_sensor"; + pixel_y = 22 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"pK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"pO" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"pY" = ( +/obj/wallframe_spawn/reinforced, +/obj/paint/black, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"pZ" = ( +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"qm" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"qs" = ( +/obj/machinery/alarm/skrell{ + dir = 1; + pixel_y = -25 + }, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/structure/flora/pottedplant/aquatic, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"qu" = ( +/obj/machinery/door/airlock/glass{ + name = "Gym" + }, +/obj/machinery/door/firedoor/autoset, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/quarters) +"qC" = ( +/obj/structure/table/rack, +/obj/item/inflatable_dispenser, +/obj/item/inflatable_dispenser, +/obj/item/inflatable_dispenser, +/obj/item/inflatable_dispenser, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 4; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"qD" = ( +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"qG" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"qO" = ( +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + pixel_y = 24 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"qT" = ( +/obj/machinery/chemical_dispenser/full, +/obj/machinery/light/skrell{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"rl" = ( +/obj/structure/fitness/punchingbag, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"rv" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"rx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/paint/black, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics" + }, +/obj/machinery/door/firedoor/autoset, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/maintenance/atmos) +"ry" = ( +/obj/machinery/seed_storage/garden, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"rz" = ( +/obj/structure/table/rack, +/obj/structure/window/basic, +/obj/floor_decal/industrial/outline/yellow, +/obj/item/stack/material/plastic/fifty, +/obj/item/stack/material/plastic/fifty, +/obj/item/stack/material/plastic/fifty, +/obj/item/stack/material/plastic/fifty, +/obj/item/stack/material/plastic/fifty, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"rR" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/crew/quarters) +"su" = ( +/obj/structure/bed/chair/office/comfy/black{ + dir = 8 + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"sD" = ( +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 4; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"sF" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"sG" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"sL" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"sP" = ( +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/command/bridge) +"sQ" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"th" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 5 + }, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"tl" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"tL" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"tN" = ( +/obj/machinery/ion_engine{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"tY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"tZ" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"ug" = ( +/obj/paint/black, +/obj/wallframe_spawn/reinforced_phoron/hull, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/crew/quarters) +"uk" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/crew/medbay) +"ur" = ( +/obj/item/stool/bar/padded, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"uB" = ( +/obj/paint/black, +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/machinery/door/blast/regular/open{ + dir = 2; + id_tag = "xil_shuttle"; + name = "Blast Doors" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"uD" = ( +/obj/structure/table/woodentable/walnut, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"uI" = ( +/obj/machinery/door/airlock{ + name = "Head" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/rec) +"uJ" = ( +/obj/machinery/door/firedoor/autoset, +/obj/machinery/door/airlock/engineering, +/obj/machinery/atmospherics/pipe/simple/hidden/cyan, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/dock) +"uN" = ( +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"uQ" = ( +/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan, +/obj/machinery/meter, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"uX" = ( +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/dock) +"uZ" = ( +/obj/machinery/light/skrell, +/obj/structure/table/rack, +/obj/item/rig/skrell/sec{ + pixel_x = -7 + }, +/obj/item/rig/skrell/sec{ + pixel_x = 8 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/wings/starboard) +"va" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"vh" = ( +/obj/structure/table/rack, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/item/magnetic_ammo/skrell, +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/floor_decal/industrial/outline/red, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/obj/item/magnetic_ammo/skrell/slug, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"vI" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/maintenance/atmos) +"vP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/rag{ + pixel_x = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"wb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/floor_decal/industrial/warning{ + dir = 5; + icon_state = "warning" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"wi" = ( +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"wk" = ( +/obj/machinery/door/airlock/multi_tile/glass/engineering{ + name = "Storage" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/robotics) +"wo" = ( +/obj/paint/black, +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"wu" = ( +/obj/machinery/light/skrell, +/obj/machinery/portable_atmospherics/hydroponics, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"wy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/alarm/skrell{ + dir = 1; + pixel_y = -25 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"wL" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"wN" = ( +/obj/structure/bed/chair/comfy/red{ + dir = 1 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + default_hailing = 1; + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"xa" = ( +/obj/structure/table/standard, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/obj/item/pen, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"xj" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"xo" = ( +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + dir = 4; + id_tag = "xil_scoutship_fore_pumps" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"xq" = ( +/obj/floor_decal/industrial/warning{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"xF" = ( +/obj/structure/table/standard, +/obj/machinery/microwave, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"xI" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"xL" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/machinery/door/airlock/external/bolted_open{ + frequency = 1331; + id_tag = "xil_shuttle_inner"; + name = "Shuttle One Airlock" + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutshuttle) +"xV" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/hangar) +"yc" = ( +/obj/floor_decal/industrial/outline/grey, +/obj/machinery/suit_storage_unit/skrell/black, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"ye" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"yf" = ( +/obj/structure/hygiene/sink{ + dir = 1; + pixel_y = 16 + }, +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"yo" = ( +/obj/structure/hygiene/shower{ + dir = 1 + }, +/obj/structure/curtain/open/shower/security, +/obj/structure/handrail{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"yr" = ( +/obj/machinery/light/skrell{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/carpet/blue, +/area/ship/skrellscoutship/wings/port) +"ys" = ( +/obj/structure/table/glass, +/obj/item/storage/toolbox/emergency, +/obj/item/device/binoculars{ + pixel_y = 9 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"yx" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/command/bridge) +"yF" = ( +/obj/structure/table/rack, +/obj/structure/window/boron_reinforced{ + dir = 4 + }, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/item/gun/energy/gun/skrell, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"yN" = ( +/obj/structure/table/rack, +/obj/item/gun/energy/pulse_rifle/skrell, +/obj/item/gun/energy/pulse_rifle/skrell, +/obj/item/gun/energy/pulse_rifle/skrell, +/obj/structure/window/boron_reinforced{ + dir = 4 + }, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"yV" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/crew/labs) +"zl" = ( +/obj/structure/fitness/weightlifter, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"zv" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/o2, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"zy" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"zK" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/crew/labs) +"zO" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/accessory/storage/black_vest, +/obj/item/gun/energy/gun/skrell, +/obj/item/rig/skrell/cmd, +/obj/item/device/radio/headset/map_preset/skrellscoutship, +/obj/item/device/radio/hailing, +/obj/item/clothing/accessory/storage/holster/thigh, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"zT" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 1"; + name = "Cell Locker"; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"zV" = ( +/obj/submap_landmark/joinable_submap/skrellscoutship, +/obj/machinery/light/skrell{ + dir = 1 + }, +/obj/submap_landmark/spawnpoint/skrellscoutship/leader, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"zZ" = ( +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1331; + master_tag = "xil_shuttle"; + pixel_y = -24 + }, +/obj/structure/bed/chair/shuttle/blue{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Ac" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/machinery/door/blast/regular/open{ + dir = 4; + id_tag = "main_airlock_window" + }, +/obj/paint/black, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"Aj" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 9 + }, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"Ak" = ( +/obj/machinery/sleeper, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"Al" = ( +/obj/structure/table/standard, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"An" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/accessory/storage/black_vest, +/obj/machinery/light/skrell{ + dir = 8; + icon_state = "tube1" + }, +/obj/item/device/radio/headset/map_preset/skrellscoutship, +/obj/item/device/radio/hailing, +/obj/item/clothing/accessory/storage/holster/thigh, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"Ap" = ( +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"Aq" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/floor_decal/industrial/outline/grey, +/obj/machinery/suit_storage_unit/skrell/black, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"Av" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Ax" = ( +/obj/floor_decal/industrial/outline/blue, +/obj/machinery/atmospherics/unary/tank/air{ + start_pressure = 4559.63 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"AQ" = ( +/obj/machinery/door/airlock/command, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/quarters) +"AT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"AU" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/crew/rec) +"BH" = ( +/obj/structure/table/standard, +/obj/machinery/reagent_temperature, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"BK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"BR" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/crew/quarters) +"BW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"Cd" = ( +/obj/item/reagent_containers/chem_disp_cartridge/acetone, +/obj/item/reagent_containers/chem_disp_cartridge/ammonia, +/obj/item/reagent_containers/chem_disp_cartridge/carbon, +/obj/item/scalpel/ims, +/obj/item/storage/firstaid/surgery, +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/combat, +/obj/item/storage/firstaid/adv, +/obj/item/storage/firstaid/regular, +/obj/item/bodybag/cryobag, +/obj/item/bodybag/cryobag, +/obj/item/autopsy_scanner, +/obj/item/stack/material/phoron/fifty, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"Ce" = ( +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 4; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"Cj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"Cm" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/command/bridge) +"Cv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/paint/black, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/robotics) +"CA" = ( +/obj/structure/table/standard, +/obj/machinery/chemical_dispenser/bar_alc/full, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"CH" = ( +/obj/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"CO" = ( +/obj/machinery/door/airlock{ + name = "Shuttle Hangar" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/command/armory) +"CX" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/forestorage) +"Di" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 10 + }, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"Dj" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/crew/rec) +"Ds" = ( +/obj/structure/table/glass, +/obj/item/storage/box/nitrilegloves, +/obj/item/storage/box/syringes{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/machinery/light/skrell, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/storage/belt/medical/emt, +/obj/item/storage/belt/medical/emt, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"Dy" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/wings/port) +"DB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/power/apc/critical{ + dir = 4; + name = "east bump"; + pixel_x = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/forestorage) +"DD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/structure/flora/pottedplant/large, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"Eg" = ( +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"Ep" = ( +/obj/machinery/light/skrell{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"Eq" = ( +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"Ex" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/wings/starboard) +"ET" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/crew/medbay) +"EY" = ( +/obj/machinery/atmospherics/pipe/manifold4w/visible/red, +/obj/machinery/meter, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"EZ" = ( +/obj/machinery/computer/ship/engines{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/command/bridge) +"Fk" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/atmos) +"Fl" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/command/armory) +"Fr" = ( +/obj/floor_decal/industrial/warning{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"FR" = ( +/obj/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"FY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/alarm/skrell{ + pixel_y = 14 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"Gb" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"Gq" = ( +/obj/floor_decal/industrial/outline/grey, +/obj/machinery/suit_storage_unit/skrell/black, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"Gw" = ( +/turf/space, +/area/space) +"GL" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/hologram/holopad/longrange/remoteship, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"GN" = ( +/obj/machinery/space_heater/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"Hf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/light/skrell{ + dir = 1 + }, +/obj/structure/closet, +/obj/item/mop/advanced, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"Hs" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + dir = 4; + id_tag = "xil_shuttle_pump_out_external" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"Hu" = ( +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"HG" = ( +/obj/catwalk_plated/dark, +/obj/machinery/power/smes/buildable/preset/skrell, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"Ii" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable/cyan, +/obj/machinery/power/apc/debug/skrell{ + dir = 8; + pixel_x = -22 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"IC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"II" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"IJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"IQ" = ( +/obj/machinery/light/skrell, +/obj/machinery/telecomms/processor/map_preset/skrellscoutship, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"IS" = ( +/obj/machinery/power/apc/critical{ + name = "south bump"; + pixel_y = -24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal, +/obj/structure/cable, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"IT" = ( +/obj/structure/bed/chair/shuttle/blue{ + dir = 1 + }, +/obj/machinery/button/blast_door{ + id_tag = "xil_shuttle"; + name = "Shuttle Blast Doors"; + pixel_x = 24 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Ji" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable/green{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"JI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/multi_tile/glass{ + name = "Hall" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/wings/port) +"JN" = ( +/obj/structure/table/standard, +/obj/machinery/cell_charger, +/obj/item/cell/hyper{ + pixel_x = 6; + pixel_y = -5 + }, +/obj/item/cell/hyper{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/disk/integrated_circuit/upgrade/clone{ + pixel_x = 7 + }, +/obj/item/disk/integrated_circuit/upgrade/advanced, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/wings/starboard) +"JT" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"JX" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/obj/structure/bed/chair/shuttle/blue{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"JZ" = ( +/obj/machinery/airlock_sensor{ + frequency = 1331; + id_tag = "xil_scoutship_fore_dock_sensor"; + pixel_x = -24 + }, +/obj/machinery/embedded_controller/radio/airlock/docking_port{ + airflow_dest = "xil_scoutship_fore_dock_controller"; + cycle_to_external_air = 1; + frequency = 1331; + id_tag = "xil_scoutship_fore_dock_controller"; + pixel_y = 24; + req_access = list("ACCESS_SKRELLSCOUT"); + tag_airpump = "xil_scoutship_fore_pumps"; + tag_chamber_sensor = "xil_scoutship_fore_dock_sensor"; + tag_exterior_door = "xil_scoutship_fore_external"; + tag_interior_door = "xil_scoutship_fore_internal" + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + dir = 4; + id_tag = "xil_scoutship_fore_pumps" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"Ka" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 4; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"Kh" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Kn" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"Kr" = ( +/obj/structure/window/reinforced, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/skrell{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"Kt" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + dir = 8; + id_tag = "xil_shuttle_pump_out_external" + }, +/obj/machinery/airlock_sensor{ + frequency = 1331; + id_tag = "xil_shuttle_sensor_external"; + pixel_y = 22 + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"Kx" = ( +/obj/paint/black, +/obj/wallframe_spawn/reinforced_phoron/hull, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/crew/rec) +"Kz" = ( +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"KD" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"KN" = ( +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/command/bridge) +"KR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/bed/chair/office/comfy/black{ + dir = 8 + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"KV" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"Le" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"Lh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"Lj" = ( +/obj/structure/closet/radiation, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/labs) +"Lr" = ( +/obj/structure/flora/pottedplant/mysterious, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"Lv" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"Lw" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"Lz" = ( +/obj/machinery/light/skrell{ + dir = 1 + }, +/obj/machinery/space_heater/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"LD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 4; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"LI" = ( +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"LV" = ( +/obj/structure/table/standard, +/obj/item/reagent_containers/food/snacks/liquidfood, +/obj/item/reagent_containers/food/snacks/liquidfood, +/obj/item/reagent_containers/food/snacks/liquidfood, +/obj/item/reagent_containers/food/snacks/liquidfood, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"LW" = ( +/obj/structure/flora/pottedplant/stoutbush, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/wings/starboard) +"Mm" = ( +/obj/structure/table/standard, +/obj/machinery/reagentgrinder/juicer, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/material/hatchet, +/obj/item/material/minihoe, +/obj/item/seeds/ximikoa, +/obj/item/seeds/ximikoa, +/obj/item/seeds/ximikoa, +/obj/item/seeds/okrri, +/obj/item/seeds/okrri, +/obj/item/seeds/okrri, +/obj/item/seeds/qokkloa, +/obj/item/seeds/qokkloa, +/obj/item/seeds/qokkloa, +/obj/item/reagent_containers/glass/bottle/eznutrient, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"Mw" = ( +/obj/floor_decal/industrial/outline/blue, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/portables_connector, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Mz" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"MI" = ( +/obj/structure/roller_bed, +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"MR" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"MS" = ( +/obj/structure/table/rack, +/obj/item/rig/skrell/med{ + pixel_x = -7 + }, +/obj/item/rig/skrell/med{ + pixel_x = 7 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/tiled/skrell/orange{ + dir = 1 + }, +/area/ship/skrellscoutship/wings/starboard) +"Na" = ( +/obj/catwalk_plated/dark, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"Nf" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"Ng" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/dock) +"Nh" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"Nw" = ( +/obj/machinery/power/smes/buildable/preset/skrell, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/power) +"NK" = ( +/obj/structure/hygiene/sink/kitchen{ + dir = 8; + pixel_x = 22 + }, +/obj/machinery/light/skrell{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"NR" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/ivbag/nanoblood, +/obj/item/reagent_containers/ivbag/nanoblood, +/obj/item/reagent_containers/ivbag/blood/skrell/oneg, +/obj/item/reagent_containers/ivbag/blood/skrell/oneg, +/obj/item/reagent_containers/ivbag/blood/skrell/oneg, +/obj/item/reagent_containers/ivbag/blood/skrell/oneg, +/obj/item/storage/firstaid/combat{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/item/storage/firstaid/combat{ + pixel_x = 2 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"NY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/table/woodentable/walnut, +/obj/item/reagent_containers/food/snacks/skrellsnacks{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/reagent_containers/food/snacks/skrellsnacks{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/cans/waterbottle{ + pixel_x = 7; + pixel_y = 12 + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"Od" = ( +/obj/machinery/door/airlock/glass/security{ + name = "Holding Cell" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/dock) +"Oe" = ( +/obj/structure/closet/walllocker/emerglocker/north, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"Oh" = ( +/obj/structure/table/rack, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/fifty, +/obj/machinery/light/skrell{ + dir = 1 + }, +/obj/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"Om" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/alarm/skrell{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/power/apc/critical{ + dir = 8; + name = "west bump"; + pixel_x = -24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"Oo" = ( +/obj/machinery/light/skrell, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + id_tag = "xil_shuttle_pump_out_internal" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Oq" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"OC" = ( +/obj/structure/table/standard, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/item/storage/box/glasses/pint{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/item/storage/box/glasses/mug{ + pixel_x = 4 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"OF" = ( +/obj/machinery/computer/ship/engines{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"OG" = ( +/obj/structure/window/boron_reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"OH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"OO" = ( +/obj/machinery/light/skrell{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"OP" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/manifold/hidden/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"OT" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/wings/port) +"OU" = ( +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/wings/starboard) +"OY" = ( +/obj/machinery/computer/ship/navigation{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Pd" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/floor_decal/industrial/outline/blue, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"Pl" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"Pr" = ( +/obj/structure/flora/pottedplant/overgrown, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"PC" = ( +/obj/structure/hygiene/sink{ + dir = 8; + pixel_x = -7; + pixel_y = 2 + }, +/obj/machinery/light/skrell{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/rec) +"PD" = ( +/obj/structure/bed/chair/comfy/red, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"PG" = ( +/obj/structure/table/standard, +/obj/machinery/button/blast_door{ + id_tag = "main_airlock_window"; + name = "Airlock Window Doors"; + pixel_y = -2 + }, +/obj/machinery/button/blast_door{ + id_tag = "main_airlock_door"; + name = "Airlock Blast Doors"; + pixel_y = 7 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"PH" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + id_tag = "xil_shuttle_pump_out_internal" + }, +/obj/machinery/embedded_controller/radio/airlock/docking_port{ + cycle_to_external_air = 1; + frequency = 1331; + id_tag = "xil_shuttle"; + pixel_y = -24; + req_access = list("ACCESS_SKRELLSCOUT"); + tag_exterior_sensor = "xil_shuttle_sensor_external" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"PJ" = ( +/obj/structure/table/standard, +/obj/machinery/recharger, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"PK" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/command/armory) +"PP" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + dir = 8; + id_tag = "xil_scoutship_fore_pumps" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"PT" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/robotics) +"Qg" = ( +/obj/machinery/shipsensors, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"Ql" = ( +/obj/machinery/artifact_analyser, +/obj/structure/table/standard, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"Qp" = ( +/obj/machinery/alarm/skrell{ + dir = 8; + pixel_x = 22 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Qr" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/catwalk_plated/dark, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"QA" = ( +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"QP" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/dock) +"QR" = ( +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"Rb" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/externalwing/starboard) +"Rc" = ( +/obj/machinery/power/apc/critical{ + dir = 4; + name = "east bump"; + pixel_x = 24; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"Re" = ( +/obj/machinery/atmospherics/unary/tank/air{ + start_pressure = 4559.63 + }, +/obj/floor_decal/industrial/outline/blue, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"Ro" = ( +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/binary/pump{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Rs" = ( +/obj/structure/table/rack, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/rig/skrell/eng{ + pixel_x = -5 + }, +/obj/item/rig/skrell/eng{ + pixel_x = 7 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/wings/starboard) +"RB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"RG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"RL" = ( +/obj/machinery/atmospherics/binary/pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"RO" = ( +/obj/floor_decal/industrial/outline/grey, +/obj/machinery/vending/security{ + scan_id = 0 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"RP" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"Si" = ( +/obj/machinery/light/skrell{ + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + dir = 8; + id_tag = "xil_scoutship_fore_pumps" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"Sm" = ( +/obj/machinery/suit_storage_unit/skrell, +/obj/machinery/light/skrell, +/obj/floor_decal/industrial/outline/grey, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"SE" = ( +/obj/structure/bed/padded, +/obj/item/bedsheet/hop, +/turf/simulated/floor/tiled/skrell/blue, +/area/ship/skrellscoutship/crew/quarters) +"SN" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light/skrell, +/obj/floor_decal/industrial/outline/blue, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"SQ" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/alarm/skrell{ + dir = 1; + pixel_y = -22 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"SS" = ( +/obj/machinery/artifact_scanpad, +/obj/floor_decal/industrial/hatch/red, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"SY" = ( +/obj/floor_decal/industrial/outline/blue, +/obj/machinery/atmospherics/portables_connector, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"Tb" = ( +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Tj" = ( +/obj/structure/flora/pottedplant/large, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/wings/starboard) +"Tm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/glass/civilian{ + name = "Crew Quarters" + }, +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/quarters) +"TE" = ( +/obj/catwalk_plated/dark, +/obj/machinery/light/skrell, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plating, +/area/ship/skrellscoutship/maintenance/power) +"TL" = ( +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"TO" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"TQ" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/command/armory) +"TX" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"TZ" = ( +/obj/machinery/cooker/grill, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"Uf" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"Uh" = ( +/obj/structure/bed/chair/shuttle/blue{ + dir = 1 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Uo" = ( +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"Uu" = ( +/obj/machinery/artifact_harvester, +/obj/structure/table/standard, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/crew/labs) +"UD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/light/skrell{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"UK" = ( +/obj/machinery/light/skrell{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"UM" = ( +/obj/paint/black, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutship/externalwing/port) +"UN" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"UR" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/red{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"UW" = ( +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/obj/structure/table/woodentable/walnut, +/obj/item/reagent_containers/food/drinks/cans/waterbottle{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/cans/waterbottle{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/cans/waterbottle, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"Va" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/command/armory) +"Vc" = ( +/obj/machinery/light/skrell{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"Ve" = ( +/obj/paint/black, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 6 + }, +/turf/simulated/wall/r_wall, +/area/ship/skrellscoutshuttle) +"Vh" = ( +/obj/machinery/bodyscanner{ + dir = 4 + }, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"Vj" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"Vx" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/black, +/obj/machinery/access_button/airlock_exterior{ + frequency = 1331; + master_tag = "xil_shuttle"; + pixel_x = 32; + pixel_y = -4; + req_access = list("ACCESS_SKRELLSCOUT") + }, +/obj/machinery/door/airlock/external/bolted_open{ + frequency = 1331; + id_tag = "xil_shuttle_outer"; + name = "Shuttle One Airlock" + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutshuttle) +"Vy" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/hygiene/toilet{ + pixel_y = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"VA" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/sterilizine, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -5 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/light/skrell, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/medbay) +"VD" = ( +/obj/machinery/computer/ship/engines{ + dir = 4 + }, +/obj/machinery/light/skrell{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"VM" = ( +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"VQ" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/machinery/light/skrell{ + dir = 1 + }, +/obj/structure/bed/chair/comfy/yellow{ + dir = 4 + }, +/turf/simulated/floor/carpet/magenta, +/area/ship/skrellscoutship/wings/starboard) +"VS" = ( +/obj/structure/bed/chair/shuttle/blue, +/obj/machinery/light/skrell{ + dir = 1 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"VY" = ( +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"VZ" = ( +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/wings/port) +"Wf" = ( +/obj/wallframe_spawn/reinforced_phoron/hull, +/obj/paint/black, +/turf/simulated/floor/plating, +/area/ship/skrellscoutshuttle) +"Wh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor/autoset, +/obj/machinery/door/airlock/atmos{ + name = "Shuttle Hangar" + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/maintenance/atmos) +"Wn" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/skrell{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"Ws" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/structure/bed/chair/shuttle/blue, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Wu" = ( +/obj/structure/table/rack, +/obj/item/stack/flag/blue{ + pixel_x = 5 + }, +/obj/item/stack/flag/blue{ + pixel_x = 10 + }, +/obj/item/stack/flag/teal{ + pixel_x = -6 + }, +/obj/item/stack/flag/teal, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"WQ" = ( +/obj/structure/flora/pottedplant/aquatic, +/obj/machinery/light/skrell{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/port) +"WS" = ( +/obj/paint/black, +/obj/wallframe_spawn/reinforced_phoron/hull, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/crew/quarters) +"WZ" = ( +/obj/machinery/portable_atmospherics/hydroponics, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"Xl" = ( +/obj/structure/bed/chair/comfy/red{ + dir = 8 + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/command/bridge) +"Xw" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 1 + }, +/obj/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/skrell/orange, +/area/ship/skrellscoutship/maintenance/atmos) +"XD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/floor_decal/industrial/warning{ + dir = 6; + icon_state = "warning" + }, +/turf/simulated/floor/tiled/skrell/red, +/area/ship/skrellscoutship/hangar) +"XU" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"Ya" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + dir = 1; + id_tag = "xil_shuttle_pump" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Yj" = ( +/obj/structure/bed/chair/comfy/red, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"Yu" = ( +/obj/structure/bed/chair/office/comfy/black{ + dir = 4 + }, +/turf/simulated/floor/carpet/purple, +/area/ship/skrellscoutship/crew/rec) +"YA" = ( +/obj/structure/table/rack, +/obj/item/storage/belt/utility/full, +/obj/item/storage/belt/utility/full, +/obj/item/storage/belt/utility/full, +/turf/simulated/floor/tiled/skrell/green, +/area/ship/skrellscoutship/robotics) +"YG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/light/skrell{ + dir = 8 + }, +/obj/structure/closet/crate/trashcart, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/wings/starboard) +"Zn" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable/yellow, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutshuttle) +"Zp" = ( +/obj/item/device/radio/intercom/map_preset/skrellscoutship{ + dir = 8; + pixel_x = 24 + }, +/turf/simulated/floor/tiled/skrell/white, +/area/ship/skrellscoutship/crew/rec) +"Zt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 5 + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/dock) +"ZC" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/skrell{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/skrell, +/area/ship/skrellscoutship/corridor) +"ZP" = ( +/obj/machinery/door/firedoor/autoset, +/turf/simulated/floor/tiled/dark/monotile, +/area/ship/skrellscoutship/wings/starboard) + +(1,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(2,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(3,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(4,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(5,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(6,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(7,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(8,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(9,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(10,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(11,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(12,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(13,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +kG +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(14,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Cm +Cm +Cm +Cm +Cm +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(15,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Cm +Cm +ii +OF +en +Cm +Cm +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(16,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +yx +Cm +ic +hE +Xl +hE +zv +Cm +yx +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(17,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +yx +yx +yx +Eq +hE +hE +hE +hE +hE +QA +yx +yx +yx +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(18,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +yx +yx +hv +ia +hF +jr +id +gX +ij +ij +ip +hE +yx +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(19,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +yx +yx +yx +yx +qO +hE +sP +ie +sP +hE +wN +yx +AQ +BR +BR +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(20,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Dj +PC +hl +yx +Eq +hE +EZ +if +pj +hE +kV +yx +zV +dB +ug +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(21,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Dj +gF +yo +yx +PD +hE +hE +GL +bQ +hE +ys +yx +SE +zO +ug +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(22,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +AU +AU +uI +AU +yx +yx +hX +ib +ih +hE +hE +yx +yx +BR +BR +BR +BR +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(23,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +pO +pO +hI +gY +li +VY +AU +AU +Eq +ig +nw +CX +CX +CX +CX +qD +Ka +rR +ug +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(24,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Dj +xj +VY +ha +Yu +VY +hJ +AU +KN +ks +CX +CX +dP +jo +CX +rl +Cj +zl +ug +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(25,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +AU +Ap +gS +hb +hm +VY +or +AU +QR +kt +CX +cc +dU +jp +CX +Eg +II +zl +ug +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(26,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Dj +VY +gS +NY +uD +VY +hL +AU +kq +ku +bP +DB +eZ +jq +CX +FY +zy +jx +ug +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(27,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Dj +hB +VY +KR +su +JT +AU +AU +kq +kt +CX +CX +CX +CX +CX +qu +BR +BR +BR +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(28,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +AU +AU +la +gF +hc +gF +gF +lK +ZC +kq +kt +kA +WS +dh +jn +Ep +pK +An +ee +BR +BR +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(29,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Dj +gz +gH +gT +hd +hn +hn +nj +jh +kr +kv +kB +Tm +di +Oq +Oq +qm +dA +dA +gi +ug +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(30,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Dj +gA +gF +gU +gF +gF +gF +lK +kq +kq +kt +tZ +BR +dj +dB +dB +dB +dB +dB +dB +ug +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(31,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +AU +AU +gI +nK +ur +ur +TL +AU +AU +pZ +kw +Rc +BR +dk +dC +mt +dC +mt +ee +BR +BR +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(32,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +AU +AU +AU +gV +he +he +TL +OC +Kx +kq +kt +uk +uk +uk +uk +uk +uk +uk +UM +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(33,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +Rb +bH +AU +Zp +TL +TL +TL +LV +lK +kq +UN +uk +qT +dm +dD +dQ +kc +NR +UM +kE +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(34,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +bH +AU +AU +hf +CA +TL +Mm +Kx +kq +kt +uk +cM +dn +dF +KD +ds +Lv +UM +kE +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(35,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +Rb +bH +Rb +AU +AU +AU +TZ +TL +WZ +AU +QR +kt +uk +cN +do +dG +dS +uk +uk +UM +UM +kE +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(36,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +bH +Rb +Gw +Gw +AU +ho +TL +wu +AU +kq +tl +nR +cO +dp +dG +dT +uk +Gw +Gw +UM +kE +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(37,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +Rb +bH +Rb +Rb +Gw +Gw +AU +xF +NK +hO +AU +kq +kt +nR +cP +dq +dG +dV +ET +Gw +Gw +UM +UM +kE +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(38,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +bH +Rb +Gw +Gw +Gw +AU +AU +AU +AU +AU +kq +kt +uk +cQ +dr +dG +Ds +ET +Gw +Gw +Gw +UM +kE +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(39,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +Rb +bH +Rb +Rb +Gw +Gw +Gw +zK +hr +hP +hQ +zK +kq +kx +cp +cR +cR +dH +dX +ET +Gw +Gw +Gw +UM +UM +kE +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(40,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +bH +Rb +Gw +Gw +Gw +Gw +yV +kR +hz +nc +zK +QR +kt +uk +cS +ds +dI +dY +uk +Gw +Gw +Gw +Gw +UM +kE +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(41,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +Rb +Rb +Gw +Gw +Gw +Gw +yV +Al +hz +py +zK +kq +kt +nR +Vh +ds +dI +dZ +ET +Gw +Gw +Gw +Gw +UM +UM +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(42,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +yV +BH +hA +hR +hY +kr +ky +uk +cU +ds +dI +MI +ET +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(43,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +bH +Rb +Gw +Gw +Gw +Gw +Gw +yV +hs +Uf +hS +zK +kq +kt +uk +cV +ds +dI +dZ +ET +Gw +Gw +Gw +Gw +Gw +UM +kE +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(44,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +Rb +Rb +Gw +Gw +Gw +Gw +Gw +yV +Ql +wi +hT +zK +kq +tl +uk +Ak +ds +dI +ea +uk +Gw +Gw +Gw +Gw +Gw +UM +UM +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(45,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +yV +SS +wi +wi +nJ +kq +kt +uk +pY +pY +dJ +uk +uk +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(46,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +yV +Uu +wi +hp +zK +kq +kt +uk +cX +ds +dK +VA +uk +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(47,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +Rb +Rb +Gw +Gw +Gw +Gw +Gw +Gw +yV +ht +hx +hU +zK +kq +kt +uk +cY +ds +dL +ec +ET +Gw +Gw +Gw +Gw +Gw +Gw +UM +UM +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(48,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Gw +zK +hu +hx +Lj +zK +QR +UN +uk +mL +dt +dM +ed +uk +Gw +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(49,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Gw +zK +zK +zK +zK +zK +kq +kt +uk +uk +uk +uk +uk +uk +Gw +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(50,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +Rb +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Ex +YG +dE +dE +hZ +kr +kz +JI +im +im +im +UD +Dy +Gw +Gw +Gw +Gw +Gw +Gw +Gw +UM +UM +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(51,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Ex +vP +dl +dl +ZP +Vc +kt +VZ +il +il +il +iv +Dy +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(52,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +aI +gy +dl +dl +mI +mI +nr +mI +mI +il +il +iv +OT +iE +Gw +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(53,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +Rb +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Gw +aI +aI +gy +dl +oj +mI +bV +bS +cq +mI +Uo +il +iv +OT +OT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +UM +UM +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(54,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Gw +aI +aI +Lr +gy +dl +Pr +mI +bw +bT +cr +mI +il +il +iv +il +OT +OT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(55,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Gw +aI +Lz +dl +gy +dl +mI +mI +bx +bT +IQ +mI +mI +il +iv +il +qG +OT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(56,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +Gw +Ex +Ex +GN +dl +gy +oj +mI +bh +by +Qr +Lw +da +mI +UW +iv +il +il +Dy +Dy +Gw +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(57,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +Ex +Ex +dl +dl +dl +gy +mI +mI +bi +bz +bW +bz +db +mI +mI +iw +il +il +il +Dy +Dy +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +PT +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(58,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +QP +Rb +bH +Rb +Gw +Gw +Gw +Gw +Gw +Ex +gB +gK +dE +dE +gM +mI +Ji +bj +bA +bX +cs +bj +pe +mI +ix +im +im +iu +iR +Dy +Gw +Gw +Gw +Gw +Gw +UM +kE +UM +PT +PT +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(59,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +bm +bm +Rb +Rb +Rb +Gw +Gw +Gw +Gw +aI +aI +Hf +gL +dl +dl +oj +mI +Nw +bk +bB +bY +cu +dc +dv +mI +xa +il +il +iL +OH +OT +OT +Gw +Gw +Gw +Gw +UM +UM +PT +kd +ke +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(60,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +fP +pb +uJ +Zt +QP +Gw +Gw +Gw +aI +aI +ft +gQ +gy +dl +LW +Rs +mI +mI +bl +bD +bZ +cv +va +mI +mI +iz +iC +iF +iM +il +iW +OT +OT +Gw +Gw +Gw +PT +PT +jW +bC +mx +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(61,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +QP +QP +ye +QP +QP +Gw +Gw +aI +bR +gd +jt +gy +dl +OU +OU +MS +mI +Na +bE +HG +bz +TE +mI +ir +il +iD +iG +iN +iT +iT +IS +OT +Gw +Gw +PT +PT +jP +bC +bC +fy +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(62,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +JZ +xo +QP +ye +qs +QP +QP +QP +QP +VQ +gp +nb +gy +dl +hi +OU +uZ +mI +bn +bF +bF +bF +bF +mI +WQ +il +iD +iG +iO +iV +iV +iY +OT +OT +OT +PT +fs +jQ +bC +bC +kn +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(63,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +hk +er +fe +fg +fp +jg +jg +sD +fC +QP +gE +gw +aJ +gy +dl +JN +lQ +Ex +xV +gh +fZ +fZ +fZ +Nf +xV +Dy +il +iD +iH +iP +il +il +il +PT +YA +fH +qC +bC +jQ +yF +kh +yN +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(64,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +Si +PP +QP +fq +fu +fD +fD +fL +lc +nT +gx +dE +gM +dl +Tj +Ex +Ex +Mz +rv +gj +gj +gj +jv +Hu +Dy +Dy +yr +iI +iM +il +il +il +wk +bC +bC +jd +Kn +bC +bC +bC +yc +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(65,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +Ac +Ac +QP +jg +fv +jg +jg +xI +uX +dl +gy +dl +dl +dl +Ex +Ex +fV +Pl +xq +xq +xq +xq +xq +gk +Lh +Dy +Dy +iJ +iQ +im +im +iZ +Cv +tY +tY +jf +ji +bC +bC +bC +Sm +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(66,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +PG +PJ +TO +fr +DD +jg +KV +fN +QP +UK +gy +dl +UK +Ex +Ex +fV +Pl +bo +uB +gr +gr +gr +uB +aQ +gk +Lh +Dy +Dy +is +ir +OO +iv +PT +fw +fx +km +fM +Cd +Wu +bC +yc +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(67,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +ng +Yj +QP +QP +Ng +my +QP +vI +vI +vI +rx +vI +vI +xV +fV +Pl +bo +Le +Le +OY +cb +mz +Le +Le +aQ +BW +Nf +xV +Fl +Fl +Fl +ey +Fl +Fl +Fl +nG +fM +ry +bC +bC +ck +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(68,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +Oe +jg +fj +zT +ju +IJ +vI +ab +Kr +Ce +at +Om +vI +Wn +fW +bo +Le +Le +VD +aT +cd +aT +kZ +Le +Le +wb +jv +Kz +TQ +aa +LD +ez +eG +eN +Fl +jB +fM +eV +bC +bC +Pd +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(69,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +fa +sQ +fk +AT +sQ +wy +vI +LI +aj +ac +ac +ay +Fk +fQ +XD +uN +dg +ga +IT +Qp +ce +aT +aT +aT +dg +Hs +aQ +fZ +PK +eo +ev +eA +eH +Va +Fl +eW +fM +fh +ka +kj +SN +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(70,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +RO +MR +OG +AT +MR +XU +vI +ad +ak +ac +aw +az +Wh +fR +Le +Le +Le +Le +Le +Le +VS +aT +Uh +Le +Le +Di +th +gm +PK +eo +eu +eB +eI +eP +Fl +jD +fM +jF +ka +kj +Pd +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(71,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +ff +QP +wo +fA +Od +vI +Ax +al +ac +au +aA +Fk +fS +Le +aM +dy +gf +hy +Wf +cf +aY +zZ +TX +pz +Oo +OP +gq +Fl +ep +eu +eB +eJ +eQ +Fl +Oh +fM +rz +ka +kj +PT +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(72,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +QP +Vy +fB +jg +vI +Re +uQ +am +av +aB +Fk +fS +Le +Tb +aT +aZ +aT +bJ +kI +cC +aS +xL +Ya +oa +Vx +kH +CO +eq +ew +eC +eL +gP +Fl +jE +fM +jU +ka +PT +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(73,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +yf +jg +jg +vI +SY +ag +an +oB +aC +Fk +fS +Le +aO +aU +gn +Kh +oK +Ws +ba +JX +sG +Ya +PH +OP +gs +Fl +es +eu +eu +eL +eS +Fl +fb +fM +jV +PT +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(74,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +lG +fE +vI +ah +UR +ao +Xw +aD +Fk +fS +Le +Le +Le +RP +aR +RG +BK +cE +bp +IC +Le +Ve +Aj +gs +PK +Gq +eu +eD +eu +eT +Fl +jG +jO +PT +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(75,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +QP +vI +ah +EY +ao +av +aE +Fk +fT +aV +Qg +Le +kQ +aT +VM +aT +cF +Ii +SQ +Le +Kt +Fr +tL +PK +Gq +eu +eE +eu +eu +Fl +PT +PT +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(76,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +QP +QP +vI +ah +ar +ac +wL +aF +vI +fT +fZ +aV +Le +Le +Tb +RL +aT +Ro +Av +Le +Le +Fr +fZ +gt +Fl +Aq +eu +eF +vh +eU +Fl +PT +PT +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(77,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +vI +vI +vI +vI +vI +vI +vI +vI +aX +bI +ge +fY +kK +Mw +bN +Zn +pa +nD +Le +tN +gm +fZ +fZ +Fl +Fl +Fl +Fl +Fl +Fl +Fl +Fl +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(78,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +fF +fF +fF +fF +fF +fF +vI +vI +Gb +bt +RB +aV +Le +Le +bO +mn +cl +Le +Le +Fr +js +RB +Nh +Fl +Fl +kF +kF +kF +kF +kF +kF +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(79,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +vI +xV +fZ +sL +gc +tN +Le +Le +Le +Le +Le +tN +gl +mP +Vj +xV +Fl +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(80,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +xV +xV +xV +bt +FR +FR +FR +FR +FR +CH +FR +sF +xV +xV +xV +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(81,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +go +xV +xV +fZ +Nh +fZ +fZ +Nh +Vj +fZ +xV +xV +go +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(82,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +go +xV +xV +xV +xV +xV +xV +xV +xV +xV +go +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(83,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(84,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(85,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(86,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(87,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(88,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(89,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(90,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(91,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(92,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(93,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(94,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(95,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(96,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(97,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(98,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(99,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} +(100,1,1) = {" +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +Gw +"} diff --git a/mods/virusology/README.md b/mods/virusology/README.md new file mode 100644 index 0000000000000..0f32408d2d170 --- /dev/null +++ b/mods/virusology/README.md @@ -0,0 +1,79 @@ + +#### Список PRов: + +- https://github.com/SierraBay/SierraBay12/pull/##### + + + +## Мод-пример + +ID мода: EXAMPLE + + +### Описание мода + +Этот мод служит примером для разработчиков и существует лишь для того, +чтобы его можно было легко скопировать и вставить в другое место. + + +### Изменения *кор кода* + +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + + +### Оверрайды + +- `mods/_master_files/sound/my_cool_sound.ogg` +- `mods/_master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + + +### Дефайны + +- `code/__defines/~mods/example.dm`: `EXAMPLE_SPEED_MULTIPLIER`, `EXAMPLE_SPEED_BASE` + + +### Используемые файлы, не содержащиеся в модпаке + +- `mods/_master_files/icons/obj/alien.dmi` + + +### Авторы: + +Твой никнейм + diff --git a/mods/virusology/_virusology.dm b/mods/virusology/_virusology.dm new file mode 100644 index 0000000000000..bb4b93bbd70c9 --- /dev/null +++ b/mods/virusology/_virusology.dm @@ -0,0 +1,4 @@ +/singleton/modpack/virus + name = "Мод с Вирусологией" + desc = "Вирусология." + author = "Lexanx" diff --git a/mods/virusology/_virusology.dme b/mods/virusology/_virusology.dme new file mode 100644 index 0000000000000..f7dc8fbb0364b --- /dev/null +++ b/mods/virusology/_virusology.dme @@ -0,0 +1,21 @@ +#ifndef MODPACK_VIRUSOLOGY +#define MODPACK_VIRUSOLOGY + +#include "_virusology.dm" +#include "code\admin.dm" +#include "code\analyser.dm" +#include "code\antibodies.dm" +#include "code\antibodyanalyser.dm" +#include "code\centrifuge.dm" +#include "code\curer.dm" +#include "code\disease2.dm" +#include "code\diseasesplicer.dm" +#include "code\dishincubator.dm" +#include "code\effect.dm" +#include "code\helpers.dm" +#include "code\isolator.dm" +#include "code\items_devices.dm" +#include "code\general.dm" +#include "code\lar_maria.dm" +#include "code\pre_made_viruses.dm" +#endif diff --git a/mods/virusology/code/admin.dm b/mods/virusology/code/admin.dm new file mode 100644 index 0000000000000..81eabebb1904a --- /dev/null +++ b/mods/virusology/code/admin.dm @@ -0,0 +1,243 @@ +/datum/disease2/disease/Topic(href, href_list) + . = ..() + if(.) return + + if(href_list["info"]) + // spawn or admin privileges to see info about viruses + if(!check_rights(R_ADMIN|R_SPAWN)) return + + to_chat(usr, "Infection chance: [infectionchance]; Speed: [speed]; Spread type: [spreadtype]") + to_chat(usr, "Affected species: [english_list(affected_species)]") + to_chat(usr, "Effects:") + for(var/datum/disease2/effect/E in effects) + to_chat(usr, "[E.stage]: [E.name]; chance=[E.chance]; multiplier=[E.multiplier]") + to_chat(usr, "Antigens: [antigens2string(antigen)]") + + return 1 + +/datum/disease2/disease/get_view_variables_header() + . = list() + for(var/datum/disease2/effect/E in effects) + . += "[E.stage]: [E.name]" + return {" + [name()]
    + [jointext(., "
    ")]
    + "} + +/datum/disease2/disease/get_view_variables_options() + return ..() + {" + + "} + +/datum/admins/var/datum/virus2_editor/virus2_editor_datum = new +/client/proc/virus2_editor() + set name = "Virus Editor" + set category = "Admin" + if(!holder || !check_rights(R_SPAWN)) return // spawn privileges to create viruses + + holder.virus2_editor_datum.show_ui(src) + +/datum/virus2_editor + var/list/s = list(/datum/disease2/effect/invisible,/datum/disease2/effect/invisible,/datum/disease2/effect/invisible,/datum/disease2/effect/invisible) + var/list/s_chance = list(1,1,1,1) + var/list/s_multiplier = list(1,1,1,1) + var/species = list() + var/infectionchance = 70 + var/spreadtype = "Contact" + var/list/antigens = list() + var/speed = 1 + var/mob/living/carbon/infectee = null + + // this holds spawned viruses so that the "Info" links work after the proc exits + var/list/spawned_viruses = list() + +/datum/virus2_editor/proc/select(mob/user, stage) + if(stage < 1 || stage > 4) return + + var/list/L = list() + + for(var/e in (typesof(/datum/disease2/effect) - /datum/disease2/effect)) + var/datum/disease2/effect/f = e + if(initial(f.stage) <= stage) + L[initial(f.name)] = e + + var/datum/disease2/effect/Eff = s[stage] + + var/C = input("Select effect for stage [stage]:", "Stage [stage]", initial(Eff.name)) as null|anything in L + if(!C) return + return L[C] + +/datum/virus2_editor/proc/show_ui(mob/user) + var/H = {" +

    Virus2 Virus Editor


    + Effects:
    + "} + for(var/i = 1 to 4) + var/datum/disease2/effect/Eff = s[i] + H += {" + [initial(Eff.name)] + Chance: [s_chance[i]] + Multiplier: [s_multiplier[i]] +
    + "} + H += {" +
    + Infectable Species:
    + "} + var/f = 1 + for(var/k in all_species) + var/datum/species/S = all_species[k] + if(S.get_virus_immune()) + continue + if(!f) H += " | " + else f = 0 + H += "[k]" + H += {" + Reset +
    + Infection Chance: [infectionchance]
    + Spread Type: [spreadtype]
    + Speed: [speed]
    +
    + "} + f = 1 + for(var/k in ALL_ANTIGENS) + if(!f) H += " | " + else f = 0 + H += "[k]" + H += {" + Reset +
    +
    + Initial infectee: [infectee ? infectee : "(choose)"] + RELEASE + "} + +/datum/virus2_editor/Topic(href, href_list) + switch(href_list["what"]) + if("effect") + var/stage = text2num(href_list["stage"]) + if(href_list["effect"]) + var/datum/disease2/effect/E = select(usr,stage) + if(!E) return + s[stage] = E + // set a default chance and multiplier of half the maximum (roughly average) + s_chance[stage] = max(1, round(initial(E.chance_max)/2)) + s_multiplier[stage] = max(1, round(initial(E.multiplier_max)/2)) + else if(href_list["chance"]) + var/datum/disease2/effect/Eff = s[stage] + var/I = input("Chance, per tick, of this effect happening (min 0, max [initial(Eff.chance_max)])", "Effect Chance", s_chance[stage]) as null|num + if(!I || I < 0 || I > initial(Eff.chance_max)) return + s_chance[stage] = I + else if(href_list["multiplier"]) + var/datum/disease2/effect/Eff = s[stage] + var/I = input("Multiplier for this effect (min 1, max [initial(Eff.multiplier_max)])", "Effect Multiplier", s_multiplier[stage]) as null|num + if(!I || I < 1 || I > initial(Eff.multiplier_max)) return + s_multiplier[stage] = I + if("species") + if(href_list["toggle"]) + var/T = href_list["toggle"] + if(T in species) + species -= T + else + species |= T + else if(href_list["reset"]) + species = list() + if(infectee) + if(!infectee.species || !(infectee.species.get_bodytype(infectee) in species)) + infectee = null + if("ichance") + var/I = input("Input infection chance", "Infection Chance", infectionchance) as null|num + if(!I) return + infectionchance = I + if("stype") + var/S = alert("Which spread type?", "Spread Type", "Cancel", "Contact", "Airborne") + if(!S || S == "Cancel") return + spreadtype = S + if("speed") + var/S = input("Input speed", "Speed", speed) as null|num + if(!S) return + speed = S + if("antigen") + if(href_list["toggle"]) + var/T = href_list["toggle"] + if(length(T) != 1) return + if(T in antigens) + antigens -= T + else + antigens |= T + else if(href_list["reset"]) + antigens = list() + if("infectee") + var/list/candidates = list() + for(var/mob/living/carbon/G in SSmobs.mob_list) + if(G.stat != DEAD && G.species) + if(G.species.get_bodytype(G) in species) + candidates["[G.name][G.client ? "" : " (no client)"]"] = G + else + candidates["[G.name] ([G.species.get_bodytype(G)])[G.client ? "" : " (no client)"]"] = G + if(!LAZYLEN(candidates)) to_chat(usr, "No possible candidates found!") + + var/I = input("Choose initial infectee", "Infectee", infectee) as null|anything in candidates + if(!I || !candidates[I]) return + infectee = candidates[I] + species |= infectee.species.get_bodytype(infectee) + if("go") + if(!LAZYLEN(antigens)) + var/a = alert("This disease has no antigens; it will be impossible to permanently immunise anyone without them.\ + It is strongly recommended to set at least one antigen. Do you want to go back and edit your virus?", "Antigens", "Yes", "Yes", "No") + if(a == "Yes") return + var/datum/disease2/disease/D = new + D.infectionchance = infectionchance + D.spreadtype = spreadtype + D.antigen = antigens + D.affected_species = species + D.speed = speed + for(var/i in 1 to 4) + var/datum/disease2/effect/E = new + var/Etype = s[i] + E = new Etype() + E.generate() + E.chance = s_chance[i] + E.multiplier = s_multiplier[i] + E.stage = i + + D.effects += E + + spawned_viruses += D + + message_admins("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus (Info)") + log_admin("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus!") + infect_virus2(infectee, D, forced=1) + + show_ui(usr) + + +/client/proc/give_disease2(mob/T as mob in SSmobs.mob_list) // -- Giacom + set category = "Fun" + set name = "Give Disease" + set desc = "Gives a Disease to a mob." + + var/datum/disease2/disease/D = new /datum/disease2/disease() + + var/severity = 1 + var/greater = input("Is this a lesser, greater, or badmin disease?", "Give Disease") in list("Lesser", "Greater", "Badmin") + switch(greater) + if ("Lesser") severity = 1 + if ("Greater") severity = 2 + if ("Badmin") severity = 99 + + D.makerandom(severity) + D.infectionchance = input("How virulent is this disease? (1-100)", "Give Disease", D.infectionchance) as num + + if(istype(T,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = T + if (H.species) + D.affected_species = list(H.species.get_bodytype(H)) + if(H.species.primitive_form) + D.affected_species |= H.species.primitive_form + if(H.species.greater_form) + D.affected_species |= H.species.greater_form + infect_virus2(T,D,1) + + log_and_message_admins("gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") diff --git a/mods/virusology/code/analyser.dm b/mods/virusology/code/analyser.dm new file mode 100644 index 0000000000000..1e1f3dd074591 --- /dev/null +++ b/mods/virusology/code/analyser.dm @@ -0,0 +1,80 @@ +/obj/machinery/disease2/diseaseanalyser + name = "disease analyser" + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "analyser" + density = TRUE + + var/scanning = 0 + var/pause = 0 + + var/obj/item/virusdish/dish = null + +/obj/machinery/disease2/diseaseanalyser/use_tool(obj/item/O, mob/living/user, list/click_params) + . = ..() + if(!istype(O,/obj/item/virusdish)) return + + if(dish) + to_chat(user, "\The [src] is already loaded.") + return + if(!user.unEquip(O, src)) + return + dish = O + operator_skill = user.get_skill_value(core_skill) + + user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") + +/obj/machinery/disease2/diseaseanalyser/Process() + if(stat & (MACHINE_STAT_NOPOWER|MACHINE_IS_BROKEN(src))) + return + + if(scanning) + scanning -= 1 + if(scanning == 0) + if (dish.virus2.addToDB()) + ping("\The [src] pings, \"New pathogen added to data bank.\"") + + var/list/effects = get_fake_effects(dish.virus2) + var/r = dish.virus2.get_info(operator_skill, 1, effects) + var/title = "paper - [dish.virus2.name()]" + var/info = {" + [virology_letterhead("Post-Analysis Memo")] + [r] +
    + Additional Notes:  + "} + new /obj/item/paper(loc, info, title) + + dish.basic_info = dish.virus2.get_info(operator_skill, 0, effects) + dish.info = r + dish.SetName("[initial(dish.name)] ([dish.virus2.name()])") + dish.analysed = 1 + dish.forceMove(loc) + dish = null + operator_skill = null + + icon_state = "analyser" + src.state("\The [src] prints a sheet of paper.") + + else if(dish && !scanning && !pause) + if(dish.virus2 && dish.growth > 50) + dish.growth -= 10 + scanning = 5 + icon_state = "analyser_processing" + else + pause = 1 + addtimer(new Callback(src, PROC_REF(dishmove)), 25) + +/obj/machinery/disease2/diseaseanalyser/proc/dishmove() + dish.forceMove(loc) + dish = null + + src.state("\The [src] buzzes, \"Insufficient growth density to complete analysis.\"") + pause = 0 + +/obj/machinery/disease2/diseaseanalyser/proc/get_fake_effects() + . = list() + for(var/datum/disease2/effect/E in dish.virus2.effects) + if(operator_skill >= HAS_PERK || prob(60)) + . += E //Passed skill check, use real effect + else + . += get_random_virus2_effect(E.stage, VIRUS_ENGINEERED) //Failed check, get a fake effect diff --git a/mods/virusology/code/antibodies.dm b/mods/virusology/code/antibodies.dm new file mode 100644 index 0000000000000..e48de876d8209 --- /dev/null +++ b/mods/virusology/code/antibodies.dm @@ -0,0 +1,26 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + +var/global/list/ALL_ANTIGENS = list( + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" + ) + +/hook/startup/proc/randomise_antigens_order() + ALL_ANTIGENS = shuffle(ALL_ANTIGENS) + return 1 + +// iterate over the list of antigens and see what matches +/proc/antigens2string(list/antigens, none="None") + if(!istype(antigens)) + CRASH("Illegal type!") + if(!LAZYLEN(antigens)) + return none + + var/code = "" + for(var/V in ALL_ANTIGENS) + if(V in antigens) + code += V + + if(!code) + return none + + return code diff --git a/mods/virusology/code/antibodyanalyser.dm b/mods/virusology/code/antibodyanalyser.dm new file mode 100644 index 0000000000000..90cd903e96836 --- /dev/null +++ b/mods/virusology/code/antibodyanalyser.dm @@ -0,0 +1,70 @@ +/obj/machinery/disease2/antibodyanalyser + name = "antibody analyser" + desc = "An advanced machine that analyses pure antibody samples and stores the structure of them on the ExoNet in exchange for cargo points." + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "analyser" + density = TRUE + + var/scanning = 0 + var/pause = 0 + var/list/known_antibodies = list() + + var/obj/item/reagent_containers/container = null + +/obj/machinery/disease2/antibodyanalyser/on_update_icon() + if(scanning) + icon_state = "analyser_processing" + else + icon_state = "analyser" + +/obj/machinery/disease2/antibodyanalyser/use_tool(obj/item/I, mob/living/user, list/click_params) + . = ..() + if(istype(I,/obj/item/reagent_containers)) + if(!container && user.unEquip(I)) + container = I + I.forceMove(src) + user.visible_message("[user] adds a sample to \the [src]!", "You add a sample to \the [src]!") + return + +/obj/machinery/disease2/antibodyanalyser/Process() + if(stat & (MACHINE_STAT_NOPOWER|MACHINE_IS_BROKEN(src))) + return + + if(scanning) + scanning -= 1 + if(scanning == 0) + if(!container.reagents.has_reagent(/datum/reagent/antibodies)) //if there are no antibody reagents, return false + return 0 + + else + var/list/data = container.reagents.get_data(/datum/reagent/antibodies) //now that we know there are antibody reagents, get the data + var/list/given_antibodies = data["antibodies"] //now check what specific antibodies it's holding + var/list/common_antibodies = known_antibodies & given_antibodies + var/list/unknown_antibodies = common_antibodies ^ given_antibodies + if(LAZYLEN(unknown_antibodies)) + var/payout = LAZYLEN(unknown_antibodies) * 45 + SSsupply.add_points_from_source(payout, "virology_antibodies") + ping("\The [src] pings, \"Successfully uploaded new antibodies to the ExoNet.\"") + known_antibodies |= unknown_antibodies //Add the new antibodies to list + else + src.state("\The [src] buzzes, \"Failed to identify any new antibodies.\"") + + container.dropInto(loc) + container = null + + on_update_icon() + + else if(container && !scanning && !pause) + if(container.reagents.has_reagent(/datum/reagent/antibodies)) + scanning = 5 + on_update_icon() + else + container.dropInto(loc) + container = null + + src.state("\The [src] buzzes, \"Failed to identify a pure sample of antibodies in the solution.\"") + return + +/obj/machinery/disease2/antibodyanalyser/Destroy() + QDEL_NULL(container) + . = ..() diff --git a/mods/virusology/code/centrifuge.dm b/mods/virusology/code/centrifuge.dm new file mode 100644 index 0000000000000..d89e6cedc7754 --- /dev/null +++ b/mods/virusology/code/centrifuge.dm @@ -0,0 +1,222 @@ +/obj/machinery/computer/centrifuge + name = "isolation centrifuge" + desc = "Used to separate things with different weights. Spin 'em round, round, right round." + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "centrifuge" + var/curing + var/isolating + + var/obj/item/reagent_containers/glass/beaker/vial/sample = null + var/datum/disease2/disease/virus2 = null + core_skill = SKILL_SCIENCE//SKILL_VIROLOGY + +/obj/machinery/computer/centrifuge/use_tool(obj/item/O, mob/living/user, list/click_params) + . = ..() + if(isScrewdriver(O)) + return ..(O,user) + + if(istype(O,/obj/item/reagent_containers/glass/beaker/vial)) + if(sample) + to_chat(user, "\The [src] is already loaded.") + return + if(!user.unEquip(O, src)) + return + sample = O + + user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") + SSnano.update_uis(src) + + src.attack_hand(user) + +/obj/machinery/computer/centrifuge/on_update_icon() + ..() + if(stat && (MACHINE_STAT_NOPOWER)) + icon_state = "centrifuge0" + if(stat && (MACHINE_IS_BROKEN(src))) + icon_state = "centrifugeb" + if(curing | isolating) + icon_state = "centrifuge_moving" + else + icon_state = "centrifuge" + +/obj/machinery/computer/centrifuge/interface_interact(mob/user) + ui_interact(user) + return TRUE + +/obj/machinery/computer/centrifuge/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + user.set_machine(src) + + var/data[0] + data["antibodies"] = null + data["pathogens"] = null + data["is_antibody_sample"] = null + + if (curing) + data["busy"] = "Isolating antibodies..." + else if (isolating) + data["busy"] = "Isolating pathogens..." + else + data["sample_inserted"] = !!sample + + if (sample) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if (B) + data["antibodies"] = antigens2string(B.data["antibodies"], none=null) + + var/list/pathogens[0] + var/list/virus = B.data["virus2"] + for (var/ID in virus) + var/datum/disease2/disease/V = virus[ID] + pathogens.Add(list(list("name" = V.name(), "spread_type" = V.spreadtype, "reference" = "\ref[V]"))) + + if (LAZYLEN(pathogens) > 0) + data["pathogens"] = pathogens + + else + var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list + if(A) + data["antibodies"] = antigens2string(A.data["antibodies"], none=null) + data["is_antibody_sample"] = 1 + + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "mods-isolation_centrifuge.tmpl", src.name, 400, 500) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/computer/centrifuge/Process() + if(stat & (MACHINE_STAT_NOPOWER|MACHINE_IS_BROKEN(src))) return + + if (curing) + curing -= 1 + if (curing == 0) + cure() + + if (isolating) + isolating -= 1 + if(isolating == 0) + isolate() + + if(virus2) + infect_nearby(virus2) + +/obj/machinery/computer/centrifuge/OnTopic(mob/user, href_list) + if (href_list["close"]) + SSnano.close_user_uis(user, src, "main") + return TOPIC_HANDLED + + if (href_list["print"]) + print(user) + return TOPIC_HANDLED + + if(href_list["isolate"]) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if (B) + var/datum/disease2/disease/virus = locate(href_list["isolate"]) + virus2 = virus.getcopy() + isolating = 40 + on_update_icon() + operator_skill = user.get_skill_value(core_skill) + return TOPIC_REFRESH + + switch(href_list["action"]) + if ("antibody") + var/delay = 20 + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if (!B) + state("\The [src] buzzes, \"No antibody carrier detected.\"", "blue") + return TOPIC_HANDLED + + var/list/viruses = B.data["virus2"] + if(length(viruses)) + var/ID = pick(viruses) + var/datum/disease2/disease/V = viruses[ID] + virus2 = V.getcopy() + operator_skill = user.get_skill_value(core_skill) + var/has_toxins = locate(/datum/reagent/toxin) in sample.reagents.reagent_list + var/has_radium = sample.reagents.has_reagent(/datum/reagent/radium) + if (has_toxins || has_radium) + state("\The [src] beeps, \"Pathogen purging speed above nominal.\"", "blue") + if (has_toxins) + delay = delay/2 + if (has_radium) + delay = delay/2 + + curing = round(delay) + playsound(src.loc, 'sound/machines/juicer_old.ogg', 50, 1) + on_update_icon() + return TOPIC_REFRESH + + if("sample") + if(sample) + sample.dropInto(loc) + sample = null + return TOPIC_REFRESH + +/obj/machinery/computer/centrifuge/proc/cure() + if (!sample) return + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if (!B) return + + var/list/data = list("antibodies" = B.data["antibodies"]) + var/amt= sample.reagents.get_reagent_amount(/datum/reagent/blood) + sample.reagents.remove_reagent(/datum/reagent/blood, amt) + sample.reagents.add_reagent(/datum/reagent/antibodies, amt, data) + operator_skill = null + + SSnano.update_uis(src) + on_update_icon() + ping("\The [src] pings, \"Antibody isolated.\"") + +/obj/machinery/computer/centrifuge/proc/isolate() + if (!sample) return + var/obj/item/virusdish/dish = new/obj/item/virusdish(loc) + dish.virus2 = virus2 + virus2 = null + operator_skill = null + + SSnano.update_uis(src) + on_update_icon() + ping("\The [src] pings, \"Pathogen isolated.\"") + +/obj/machinery/computer/centrifuge/proc/print(mob/user) + var/obj/item/paper/P = new /obj/item/paper(loc) + P.SetName("paper - Pathology Report") + P.info = {" + [virology_letterhead("Pathology Report")] + Sample: [sample.name]
    +"} + + if (user) + P.info += "Generated By: [user.name]
    " + + P.info += "
    " + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if (B) + P.info += "Antibodies: " + P.info += antigens2string(B.data["antibodies"]) + P.info += "
    " + + var/list/virus = B.data["virus2"] + P.info += "Pathogens:
    " + if (LAZYLEN(virus) > 0) + for (var/ID in virus) + var/datum/disease2/disease/V = virus[ID] + P.info += "[V.name()]
    " + else + P.info += "None
    " + + else + var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list + if (A) + P.info += "The following antibodies have been isolated from the blood sample: " + P.info += antigens2string(A.data["antibodies"]) + P.info += "
    " + + P.info += {" +
    + Additional Notes: +"} + + state("The nearby computer prints out a pathology report.") diff --git a/mods/virusology/code/curer.dm b/mods/virusology/code/curer.dm new file mode 100644 index 0000000000000..522d77564e47a --- /dev/null +++ b/mods/virusology/code/curer.dm @@ -0,0 +1,90 @@ +/obj/machinery/computer/curer + name = "cure research machine" + icon = 'icons/obj/machines/computer.dmi' + icon_keyboard = "med_key" + icon_screen = "dna" + idle_power_usage = 500 + var/curing + var/virusing + + var/obj/item/reagent_containers/container = null + +/obj/machinery/computer/curer/use_tool(obj/item/I, mob/living/user, list/click_params) + . = ..() + if(istype(I,/obj/item/reagent_containers)) + if(!container) + if(!user.unEquip(I, src)) + return + container = I + return + ..() + return + +/obj/machinery/computer/curer/interface_interact(mob/user) + interact(user) + return TRUE + +/obj/machinery/computer/curer/interact(mob/user) + user.machine = src + var/dat + if(curing) + dat = "Antibody production in progress" + else if(container) + // check to see if we have the required reagents + if(container.reagents.get_reagent_amount(/datum/reagent/blood) >= 5 && container.reagents.get_reagent_amount(/datum/reagent/radium) >= 15 && container.reagents.get_reagent_amount(/datum/reagent/spaceacillin) >= 10) + + dat = "Blood sample inserted." + dat += "
    Begin antibody production" + else + dat += "
    Please check container contents." + dat += "
    Eject container" + else + dat = "Please insert a container." + + show_browser(user, "[dat]", "window=computer;size=400x500") + onclose(user, "computer") + return + +/obj/machinery/computer/curer/Process() + if(stat & (MACHINE_STAT_NOPOWER|MACHINE_IS_BROKEN(src))) + return + + if(curing) + curing -= 1 + if(curing == 0) + if(container) + createcure(container) + return + +/obj/machinery/computer/curer/OnTopic(user, href_list) + if (href_list["antibody"]) + curing = 10 + . = TOPIC_REFRESH + else if(href_list["eject"]) + container.dropInto(loc) + container = null + . = TOPIC_REFRESH + + if(. == TOPIC_REFRESH) + attack_hand(user) + +/obj/machinery/computer/curer/proc/createcure(obj/item/reagent_containers/container) + var/obj/item/reagent_containers/C = container + var/antibodies + C.dropInto(loc) + var/mob/living/carbon/M = new /mob/living/carbon + var/datum/reagent/blood/B = locate() in container.reagents.reagent_list + var/data + if(B.data && B.data["virus2"]) + var/list/vlist = B.data["virus2"] + if(LAZYLEN(vlist)) + for(var/ID in vlist) + var/datum/disease2/disease/V = vlist[ID] + data = V.getcopy() + + for(var/ID in data) + var/datum/disease2/disease/V = data[ID] + antibodies |= V.antigen + C.reagents.clear_reagents() + C.reagents.add_reagent(/datum/reagent/antibodies, 10, antibodies) + qdel(M) diff --git a/mods/virusology/code/disease2.dm b/mods/virusology/code/disease2.dm new file mode 100644 index 0000000000000..3a665425a2c7d --- /dev/null +++ b/mods/virusology/code/disease2.dm @@ -0,0 +1,268 @@ +LEGACY_RECORD_STRUCTURE(virus_records, virus_record) + +#define DISEASE_SPREAD_AIRBORNE "Airborne" +#define DISEASE_SPREAD_CONTACT "Contact" +#define DISEASE_SPREAD_BLOOD "Blood" + +/datum/disease2/disease + var/infectionchance = 60 + var/speed = 1 + var/spreadtype = DISEASE_SPREAD_CONTACT // Can also be "Airborne" + var/stage = 1 + var/dead = 0 + var/clicks = 0 + var/uniqueID = 0 + var/list/datum/disease2/effect/effects = list() + var/antigen = list() //A list of characters that represent antigens that cure this virus. + var/max_stage = 4 + var/list/affected_species = list(SPECIES_HUMAN,SPECIES_UNATHI,SPECIES_SKRELL) + var/list/spread_types = list(DISEASE_SPREAD_AIRBORNE = 2, DISEASE_SPREAD_CONTACT = 2, DISEASE_SPREAD_BLOOD = 6) + +/datum/disease2/disease/New() + uniqueID = rand(0,10000) + ..() + +/datum/disease2/disease/proc/makerandom(severity=2) + var/list/excludetypes = list() + for(var/i=1 ; i <= max_stage ; i++ ) + var/datum/disease2/effect/E = get_random_virus2_effect(i, severity, excludetypes) + E.stage = i + if(!E.allow_multiple) + excludetypes += E.type + effects += E + uniqueID = rand(0,10000) + switch(severity) + if(1,2) + infectionchance = rand(10,20) + else + infectionchance = rand(60,90) + + antigen = list(pick(ALL_ANTIGENS)) + antigen |= pick(ALL_ANTIGENS) + spreadtype = prob(70) ? DISEASE_SPREAD_AIRBORNE : DISEASE_SPREAD_CONTACT + + if(LAZYLEN(all_species)) + affected_species = get_infectable_species() + +/proc/get_infectable_species() + var/list/meat = list() + var/list/res = list() + for (var/specie in all_species) + var/datum/species/S = all_species[specie] + if((S.spawn_flags & SPECIES_CAN_JOIN) && !S.get_virus_immune() && !S.greater_form) + meat += S + if(LAZYLEN(meat)) + var/num = rand(1,LAZYLEN(meat)) + for(var/i=0,i 70) + if((mob.species.name == SPECIES_DIONA) && prob(mob.radiation/25)) + cure(mob) + else if(prob(1)) + majormutate() + + if(prob(mob.virus_immunity()) && prob(stage)) // Increasing chance of curing as the virus progresses + cure(mob,1) + //Waiting out the disease the old way + if(stage == max_stage && clicks > max(stage*100, 300)) + if(prob(mob.virus_immunity() * 0.05 + 100-infectionchance)) + cure(mob, 1) + + var/top_badness = 1 + for(var/datum/disease2/effect/e in effects) + if(e.stage == stage) + top_badness = max(top_badness, e.badness) + + //Space antibiotics might stop disease completely + if(mob.chem_effects[CE_ANTIVIRAL] > top_badness) + if(stage == 1 && prob(20)) + cure(mob) + return + + clicks += speed + //Virus food speeds up disease progress + if(mob.reagents.has_reagent(/datum/reagent/nutriment/virus_food)) + mob.reagents.remove_reagent(/datum/reagent/nutriment/virus_food, REM) + clicks += 10 + + //Moving to the next stage + if(clicks > max(stage*100, 300)) + if(stage < max_stage && prob(10)) + stage++ + clicks = 0 + + //Do nasty effects + for(var/datum/disease2/effect/e in effects) + e.fire(mob,stage) + + //fever + if(!mob.chem_effects[CE_ANTIVIRAL]) + mob.bodytemperature = max(mob.bodytemperature, min(310+5*min(stage,max_stage) ,mob.bodytemperature+5*min(stage,max_stage))) + +/datum/disease2/disease/proc/cure(mob/living/carbon/mob, mob_gains_antigens) + for(var/datum/disease2/effect/e in effects) + e.deactivate(mob) + + mob.virus2.Remove("[uniqueID]") + + //Tries to remove the virus also from the bloodstream (only for human-like lifeforms). + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + H.cure_virus(uniqueID) + H.immunity = min(H.immunity + 25, H.immunity_norm) + // On virus cure, give a small boost to immunity to help prevent instant reinfection with another virus + + if (mob_gains_antigens) + mob.antibodies |= antigen + + SET_BIT(mob.hud_updateflag, STATUS_HUD) + +/datum/disease2/disease/proc/minormutate() + var/datum/disease2/effect/E = pick(effects) + E.minormutate() + +/datum/disease2/disease/proc/majormutate(badness = VIRUS_ENGINEERED) + uniqueID = rand(0,10000) + var/datum/disease2/effect/E = pick(effects) + var/list/exclude = list() + for(var/datum/disease2/effect/D in effects) + if(D != E) + exclude += D.type + + var/effect_stage = E.stage + E.deactivate() + effects -= E + qdel(E) + + effects += get_random_virus2_effect(effect_stage, badness, exclude) + + antigen = list(pick(ALL_ANTIGENS)) + antigen |= pick(ALL_ANTIGENS) + + if (prob(5) && LAZYLEN(all_species)) + affected_species = get_infectable_species() + +/datum/disease2/disease/proc/getcopy() + var/datum/disease2/disease/disease = new /datum/disease2/disease + disease.infectionchance = infectionchance + disease.spreadtype = spreadtype + disease.speed = speed + disease.antigen = antigen + disease.uniqueID = uniqueID + disease.affected_species = affected_species.Copy() + for(var/datum/disease2/effect/effect in effects) + var/datum/disease2/effect/neweffect = new effect.type + neweffect.generate(effect.data) + neweffect.chance = effect.chance + neweffect.multiplier = effect.multiplier + neweffect.oneshot = effect.oneshot + neweffect.stage = effect.stage + disease.effects += neweffect + return disease + +/datum/disease2/disease/proc/issame(datum/disease2/disease/disease) + . = 1 + + var/list/types = list() + for(var/datum/disease2/effect/d in effects) + types += d.type + for(var/datum/disease2/effect/d in disease.effects) + if(!(d.type in types)) + return 0 + + if (antigen != disease.antigen) + return 0 + +/proc/virus_copylist(list/datum/disease2/disease/viruses) + var/list/res = list() + for (var/ID in viruses) + var/datum/disease2/disease/V = viruses[ID] + res["[V.uniqueID]"] = V.getcopy() + return res + + +var/global/list/virusDB = list() +/datum/disease2/disease/proc/add_zero(t, u) + return pad_left(t, u, "0") + +/datum/disease2/disease/proc/name() + .= "strain #[add_zero("[uniqueID]", 4)]" + if ("[uniqueID]" in virusDB) + var/datum/computer_file/data/virus_record/V = virusDB["[uniqueID]"] + .= V.fields["name"] + +/datum/disease2/disease/proc/get_info(skill = HAS_PERK, verbose = 1, given_effects) + if(!given_effects) + given_effects = effects + var/r = list() + if(verbose) + r += "Analysis determined the existence of a GNAv2-based viral lifeform.
    " + r += "Designation: [name()]
    " + r += "Antigen: [antigens2string(antigen)]
    " + r += "Transmitted By: [spreadtype]
    " + else + r = "[name()]" + + var/list/dat = list() + if(skill >= HAS_PERK) + if(verbose) + r += "Rate of Progression: [speed * 100]%
    " + var/species = affected_species.Copy() + r += "Species Affected: [jointext(species, ", ")]
    " + r += "Symptoms:
    " + + for(var/datum/disease2/effect/E in given_effects) + dat += E.get_effect_info(verbose) + + . = verbose ? JOINTEXT(r + dat) : "[r] ([jointext(dat, ", ")])" + + +/datum/disease2/disease/proc/addToDB() + if ("[uniqueID]" in virusDB) + return 0 + var/datum/computer_file/data/virus_record/v = new() + v.fields["id"] = uniqueID + v.fields["name"] = name() + v.fields["description"] = get_info() + v.fields["antigen"] = antigens2string(antigen) + v.fields["spread type"] = spreadtype + virusDB["[uniqueID]"] = v + return 1 + + +/proc/virology_letterhead(report_name) + return {" +

    [report_name]

    +
    [station_name()] Virology Lab
    +
    +"} + +/datum/disease2/disease/proc/can_add_symptom(type) + for(var/datum/disease2/effect/H in effects) + if(H.type == type && !H.allow_multiple) + return 0 + + return 1 diff --git a/mods/virusology/code/diseasesplicer.dm b/mods/virusology/code/diseasesplicer.dm new file mode 100644 index 0000000000000..abbbfd780cc77 --- /dev/null +++ b/mods/virusology/code/diseasesplicer.dm @@ -0,0 +1,188 @@ +/obj/machinery/computer/diseasesplicer + name = "disease splicer" + icon = 'icons/obj/machines/computer.dmi' + icon_keyboard = "med_key" + icon_screen = "crew" + + var/datum/disease2/effect/memorybank = null + var/list/species_buffer = null + var/analysed = 0 + var/obj/item/virusdish/dish = null + var/burning = 0 + var/splicing = 0 + var/scanning = 0 + +/obj/machinery/computer/diseasesplicer/use_tool(obj/item/I, mob/living/user, list/click_params) + . = ..() + if(isScrewdriver(I)) + return ..(I,user) + + if(istype(I,/obj/item/virusdish)) + if (dish) + to_chat(user, "\The [src] is already loaded.") + return + if(!user.unEquip(I, src)) + return + dish = I + + if(istype(I,/obj/item/diseasedisk)) + to_chat(user, "You upload the contents of the disk onto the buffer.") + var/obj/item/diseasedisk/disk = I + memorybank = disk.effect + species_buffer = disk.species + analysed = disk.analysed + + src.attack_hand(user) + +/obj/machinery/computer/diseasesplicer/interface_interact(mob/user) + ui_interact(user) + return TRUE + +/obj/machinery/computer/diseasesplicer/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + user.set_machine(src) + + var/data[0] + data["dish_inserted"] = !!dish + data["growth"] = 0 + data["affected_species"] = null + + if (memorybank) + data["buffer"] = list("name" = (analysed ? memorybank.name : "Unknown Symptom"), "stage" = memorybank.stage) + if (species_buffer) + data["species_buffer"] = analysed ? jointext(species_buffer, ", ") : "Unknown Species" + + if (splicing) + data["busy"] = "Splicing..." + else if (scanning) + data["busy"] = "Scanning..." + else if (burning) + data["busy"] = "Copying data to disk..." + else if (dish) + data["growth"] = min(dish.growth, 100) + + if (dish.virus2) + if (dish.virus2.affected_species) + data["affected_species"] = dish.analysed ? jointext(dish.virus2.affected_species, ", ") : "Unknown" + + if (dish.growth >= 50) + var/list/effects[0] + for (var/datum/disease2/effect/e in dish.virus2.effects) + effects.Add(list(list("name" = (dish.analysed ? e.name : "Unknown"), "stage" = (e.stage), "reference" = "\ref[e]"))) + data["effects"] = effects + else + data["info"] = "Insufficient cell growth for gene splicing." + else + data["info"] = "No virus detected." + else + data["info"] = "No dish loaded." + + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "mods-disease_splicer.tmpl", src.name, 400, 600) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/computer/diseasesplicer/Process() + if(stat & (MACHINE_STAT_NOPOWER|MACHINE_IS_BROKEN(src))) + return + + if(scanning) + scanning -= 1 + if(!scanning) + ping("\The [src] pings, \"Analysis complete.\"") + SSnano.update_uis(src) + if(splicing) + splicing -= 1 + if(!splicing) + ping("\The [src] pings, \"Splicing operation complete.\"") + SSnano.update_uis(src) + if(burning) + burning -= 1 + if(!burning) + var/obj/item/diseasedisk/d = new /obj/item/diseasedisk(src.loc) + d.analysed = analysed + if(analysed) + if (memorybank) + d.SetName("[memorybank.name] GNA disk (Stage: [memorybank.stage])") + d.effect = memorybank + else if (species_buffer) + d.SetName("[jointext(species_buffer, ", ")] GNA disk") + d.species = species_buffer + else + if (memorybank) + d.SetName("Unknown GNA disk (Stage: [memorybank.stage])") + d.effect = memorybank + else if (species_buffer) + d.SetName("Unknown Species GNA disk") + d.species = species_buffer + + ping("\The [src] pings, \"Backup disk saved.\"") + SSnano.update_uis(src) + + if((scanning || splicing || burning) && dish && dish.virus2) + infect_nearby(dish.virus2, 80) + +/obj/machinery/computer/diseasesplicer/OnTopic(mob/user, href_list) + operator_skill = user.get_skill_value(core_skill) + if (href_list["close"]) + SSnano.close_user_uis(user, src, "main") + return TOPIC_HANDLED + + if (href_list["grab"]) + if (dish) + memorybank = locate(href_list["grab"]) + species_buffer = null + analysed = dish.analysed + dish = null + scanning = 10 + return TOPIC_REFRESH + + if (href_list["affected_species"]) + if (dish) + memorybank = null + species_buffer = dish.virus2.affected_species + analysed = dish.analysed + dish = null + scanning = 10 + return TOPIC_REFRESH + + if(href_list["eject"]) + if (dish) + dish.dropInto(loc) + dish = null + return TOPIC_REFRESH + + if(href_list["splice"]) + if(dish) + var/target = text2num(href_list["splice"]) // target = 1+ for effects, -1 for species + if(memorybank && target > 0) + if(target < memorybank.stage) + return // too powerful, catching this for href exploit prevention + + var/datum/disease2/effect/target_effect + var/list/illegal_types = list() + for(var/datum/disease2/effect/e in dish.virus2.effects) + if(e.stage == target) + target_effect = e + if(!e.allow_multiple) + illegal_types += e.type + if(memorybank.type in illegal_types) + to_chat(user, "Virus DNA can't hold more than one [memorybank]") + return 1 + dish.virus2.effects -= target_effect + dish.virus2.effects += memorybank + qdel(target_effect) + + else if(species_buffer && target == -1) + dish.virus2.affected_species = species_buffer + + else + return TOPIC_HANDLED + + splicing = 10 + dish.virus2.uniqueID = rand(0,10000) + return TOPIC_REFRESH + + if(href_list["disk"]) + burning = 10 + return TOPIC_REFRESH diff --git a/mods/virusology/code/dishincubator.dm b/mods/virusology/code/dishincubator.dm new file mode 100644 index 0000000000000..48c5a4aa46da2 --- /dev/null +++ b/mods/virusology/code/dishincubator.dm @@ -0,0 +1,199 @@ +/obj/machinery/disease2/incubator/ + name = "pathogenic incubator" + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "incubator" + var/obj/item/virusdish/dish + var/obj/item/reagent_containers/glass/beaker = null + var/radiation = 0 + density = TRUE + var/on = 0 + var/power = 0 + + var/foodsupply = 0 + var/toxins = 0 + +/obj/machinery/disease2/incubator/use_tool(obj/item/O, mob/living/user, list/click_params) + . = ..() + if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/syringe)) + + if(beaker) + to_chat(user, "\The [src] is already loaded.") + return + if(!user.unEquip(O, src)) + return + beaker = O + + user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") + SSnano.update_uis(src) + + src.attack_hand(user) + return + + if(istype(O, /obj/item/virusdish)) + + if(dish) + to_chat(user, "The dish tray is already full!") + return + if(!user.unEquip(O, src)) + return + dish = O + + user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") + SSnano.update_uis(src) + + src.attack_hand(user) + +/obj/machinery/disease2/incubator/interface_interact(mob/user) + ui_interact(user) + return TRUE + +/obj/machinery/disease2/incubator/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + user.set_machine(src) + + var/data[0] + data["chemicals_inserted"] = !!beaker + data["dish_inserted"] = !!dish + data["food_supply"] = foodsupply + data["radiation"] = radiation + data["toxins"] = min(toxins, 100) + data["on"] = on + data["system_in_use"] = foodsupply > 0 || radiation > 0 || toxins > 0 + data["chemical_volume"] = beaker ? beaker.reagents.total_volume : 0 + data["max_chemical_volume"] = beaker ? beaker.volume : 1 + data["virus"] = dish ? dish.virus2 : null + data["growth"] = dish ? min(dish.growth, 100) : 0 + data["infection_rate"] = dish && dish.virus2 ? dish.virus2.infectionchance * 10 : 0 + data["analysed"] = dish && dish.analysed ? 1 : 0 + data["can_breed_virus"] = null + data["blood_already_infected"] = null + + if (beaker) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list + data["can_breed_virus"] = dish && dish.virus2 && B + + if (B) + if (!B.data["virus2"]) + B.data["virus2"] = list() + + var/list/virus = B.data["virus2"] + for (var/ID in virus) + data["blood_already_infected"] = virus[ID] + + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "mods-dish_incubator.tmpl", src.name, 400, 600) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/disease2/incubator/Process() + ..() + if(dish && on && dish.virus2) + use_power_oneoff(50,EQUIP) + if(!powered(EQUIP)) + on = 0 + icon_state = "incubator" + + var/threshold_mod = 0 + + if(foodsupply) + if(dish.growth + 3 >= 100 && dish.growth < 100) + ping("\The [src] pings, \"Sufficient viral growth density achieved.\"") + + foodsupply -= 1 + dish.growth += 3 + SSnano.update_uis(src) + + if(radiation) + threshold_mod++ + if(radiation > 50 & prob(5)) + dish.virus2.majormutate() + if(dish.info) + dish.info = "OUTDATED : [dish.info]" + dish.basic_info = "OUTDATED: [dish.basic_info]" + dish.analysed = 0 + ping("\The [src] pings, \"Mutant viral strain detected.\"") + else if(prob(5)) + dish.virus2.minormutate() + radiation -= 1 + SSnano.update_uis(src) + if(toxins && prob(5)) + dish.virus2.infectionchance -= 1 + SSnano.update_uis(src) + if(toxins > 50) + dish.growth = 0 + dish.virus2 = null + SSnano.update_uis(src) + infect_nearby(dish.virus2, 20 * 2**threshold_mod) + else if(!dish) + on = 0 + icon_state = "incubator" + SSnano.update_uis(src) + + if(beaker) + if (foodsupply < 100 && beaker.reagents.has_reagent(/datum/reagent/nutriment/virus_food)) + var/food_needed = min(10, 100 - foodsupply) / 2 + var/food_taken = min(food_needed, beaker.reagents.get_reagent_amount(/datum/reagent/nutriment/virus_food)) + + beaker.reagents.remove_reagent(/datum/reagent/nutriment/virus_food, food_taken) + foodsupply = min(100, foodsupply+(food_taken * 2)) + SSnano.update_uis(src) + + if ((locate(/datum/reagent/toxin) in beaker.reagents.reagent_list) && toxins < 100) + for(var/datum/reagent/toxin/T in beaker.reagents.reagent_list) + toxins += max(T.strength,1) + beaker.reagents.remove_reagent(T.type,1) + if(toxins > 100) + toxins = 100 + break + SSnano.update_uis(src) + +/obj/machinery/disease2/incubator/OnTopic(mob/user, href_list) + operator_skill = user.get_skill_value(core_skill) + if (href_list["close"]) + SSnano.close_user_uis(user, src, "main") + return TOPIC_HANDLED + + if (href_list["ejectchem"]) + if(beaker) + beaker.dropInto(loc) + beaker = null + return TOPIC_REFRESH + + if (href_list["power"]) + if (dish) + on = !on + icon_state = on ? "incubator_on" : "incubator" + return TOPIC_REFRESH + + if (href_list["ejectdish"]) + if(dish) + dish.dropInto(loc) + dish = null + return TOPIC_REFRESH + + if (href_list["rad"]) + radiation = min(100, radiation + 10) + return TOPIC_REFRESH + + if (href_list["flush"]) + radiation = 0 + toxins = 0 + foodsupply = 0 + return TOPIC_REFRESH + + if(href_list["virus"]) + if (!dish) + return TOPIC_HANDLED + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list + if (!B) + return TOPIC_HANDLED + + if (!B.data["virus2"]) + B.data["virus2"] = list() + + var/list/virus = list("[dish.virus2.uniqueID]" = dish.virus2.getcopy()) + B.data["virus2"] += virus + + ping("\The [src] pings, \"Injection complete.\"") + return TOPIC_REFRESH diff --git a/mods/virusology/code/effect.dm b/mods/virusology/code/effect.dm new file mode 100644 index 0000000000000..461d6584e6f32 --- /dev/null +++ b/mods/virusology/code/effect.dm @@ -0,0 +1,341 @@ +//////////////////////////////////////////////////////////////// +////////////////////////EFFECTS///////////////////////////////// +//////////////////////////////////////////////////////////////// +/proc/get_random_virus2_effect(stage, badness, exclude) + var/list/datum/disease2/effect/candidates = list() + for(var/T in subtypesof(/datum/disease2/effect)) + var/datum/disease2/effect/E = T + if(E in exclude) + continue + if(initial(E.badness) > badness) //we don't want such strong effects + continue + if(initial(E.stage) <= stage) + candidates += T + var/type = pick(candidates) + var/datum/disease2/effect/effect = new type + effect.generate() + effect.chance = rand(0,effect.chance_max) + effect.multiplier = rand(1,effect.multiplier_max) + return effect + +/datum/disease2/effect + var/name = "Blanking effect" + var/chance //probality to fire every tick + var/chance_max = 50 + var/multiplier = 1 //effect magnitude multiplier + var/multiplier_max = 1 + var/stage = 4 //minimal stage + var/badness = VIRUS_MILD //Used in random generation to limit how bad result should come out. + var/data = null //For semi-procedural effects; this should be generated in generate() if used + var/oneshot + var/delay = 5 SECONDS //minimal time between activations + var/hold_until //can only fire after this worldtime + var/allow_multiple //allow to have more than 1 effect of this type in the same virus + +/datum/disease2/effect/proc/get_effect_info(verbose = 1) + . = list() + if(verbose) + . += "([stage]) [name] " + . += "Strength: [multiplier >= 3 ? "Severe" : multiplier > 1 ? "Above Average" : "Average"] " + . += "Verosity: [chance * 10]
    " + else + . += name + return JOINTEXT(.) + +/datum/disease2/effect/proc/fire(mob/living/carbon/human/mob,current_stage) + if(oneshot == -1) + return + if(hold_until > world.time) + return + if(mob.chem_effects[CE_ANTIVIRAL] >= badness) + return + if(stage <= current_stage && prob(chance)) + hold_until = world.time + delay + activate(mob) + if(oneshot == 1) + oneshot = -1 + +/datum/disease2/effect/proc/minormutate() + switch(pick(1,2,3,4,5)) + if(1) + chance = rand(0,chance_max) + if(2) + multiplier = rand(1,multiplier_max) + +/datum/disease2/effect/proc/activate(mob/living/carbon/human/mob) +/datum/disease2/effect/proc/deactivate(mob/living/carbon/human/mob) +/datum/disease2/effect/proc/generate(copy_data) // copy_data will be non-null if this is a copy; it should be used to initialise the data for this effect if present + +/datum/disease2/effect/invisible + name = "Waiting Syndrome" + stage = 1 + +/datum/disease2/effect/killertoxins + name = "Toxification Syndrome" + stage = 4 + badness = VIRUS_COMMON +/datum/disease2/effect/killertoxins/activate(mob/living/carbon/human/mob, multiplier) + mob.adjustToxLoss(15*multiplier) + +/datum/disease2/effect/dna + name = "Reverse Pattern Syndrome" + stage = 4 + badness = VIRUS_ENGINEERED +/datum/disease2/effect/dna/activate(mob/living/carbon/human/mob, multiplier) + mob.bodytemperature = max(mob.bodytemperature, 350) + scramble(0,mob,10) + mob.apply_damage(10, DAMAGE_GENETIC) + +/datum/disease2/effect/organs + name = "Shutdown Syndrome" + stage = 4 + badness = VIRUS_ENGINEERED +/datum/disease2/effect/organs/activate(mob/living/carbon/human/mob, multiplier) + var/organ = pick(list(BP_R_ARM,BP_L_ARM,BP_R_LEG,BP_L_LEG)) + var/obj/item/organ/external/E = mob.organs_by_name[organ] + if (!(E.status & ORGAN_DEAD)) + E.status |= ORGAN_DEAD + to_chat(mob, "You can't feel your [E.name] anymore...") + for (var/obj/item/organ/external/C in E.children) + C.status |= ORGAN_DEAD + mob.update_body(1) + mob.adjustToxLoss(15*multiplier) + +/datum/disease2/effect/organs/deactivate(mob/living/carbon/human/mob, multiplier) + for (var/obj/item/organ/external/E in mob.organs) + E.status &= ~ORGAN_DEAD + for (var/obj/item/organ/external/C in E.children) + C.status &= ~ORGAN_DEAD + mob.update_body(1) + +/datum/disease2/effect/immortal + name = "Longevity Syndrome" + stage = 4 + badness = VIRUS_ENGINEERED +/datum/disease2/effect/immortal/activate(mob/living/carbon/human/mob, multiplier) + for (var/external in mob.organs) + var/obj/item/organ/external/E = external + if (E.status & ORGAN_BROKEN && prob(30)) + to_chat(mob, "Your [E.name] suddenly feels much better!") + E.status ^= ORGAN_BROKEN + break + for (var/internal in mob.internal_organs) + var/obj/item/organ/internal/I = internal + if (I.damage && prob(30)) + to_chat(mob, "Your [mob.get_organ(I.parent_organ)] feels a bit warm...") + I.take_internal_damage(-2*multiplier) + break + var/heal_amt = -5*multiplier + mob.apply_damages(heal_amt,heal_amt,heal_amt,heal_amt) + +/datum/disease2/effect/immortal/deactivate(mob/living/carbon/human/mob, multiplier) + to_chat(mob, "You suddenly feel hurt and old...") + mob.age += 8 + var/backlash_amt = 5*multiplier + mob.apply_damages(backlash_amt,backlash_amt,backlash_amt,backlash_amt) + +/datum/disease2/effect/bones + name = "Fragile Bones Syndrome" + stage = 4 + badness = VIRUS_ENGINEERED +/datum/disease2/effect/bones/activate(mob/living/carbon/human/mob, multiplier) + for (var/obj/item/organ/external/E in mob.organs) + E.min_broken_damage = max(5, E.min_broken_damage - 30) + +/datum/disease2/effect/bones/deactivate(mob/living/carbon/human/mob, multiplier) + for (var/obj/item/organ/external/E in mob.organs) + E.min_broken_damage = initial(E.min_broken_damage) + +////////////////////////STAGE 3///////////////////////////////// + +/datum/disease2/effect/toxins + name = "Hyperacidity" + stage = 3 + multiplier_max = 3 + badness = VIRUS_COMMON +/datum/disease2/effect/toxins/activate(mob/living/carbon/human/mob, multiplier) + mob.adjustToxLoss((2*multiplier)) + +/datum/disease2/effect/shakey + name = "World Shaking Syndrome" + stage = 3 + multiplier_max = 3 +/datum/disease2/effect/shakey/activate(mob/living/carbon/human/mob, multiplier) + shake_camera(mob,5*multiplier) + +/datum/disease2/effect/mind + name = "Lazy Mind Syndrome" + stage = 3 + badness = VIRUS_COMMON +/datum/disease2/effect/mind/activate(mob/living/carbon/human/mob, multiplier) + var/obj/item/organ/internal/brain/B = mob.internal_organs_by_name[BP_BRAIN] + if (B && B.damage < B.min_broken_damage) + B.take_internal_damage(5) + +/datum/disease2/effect/deaf + name = "Hard of Hearing Syndrome" + stage = 3 +/datum/disease2/effect/deaf/activate(mob/living/carbon/human/mob, multiplier) + mob.ear_deaf = 5 + +/datum/disease2/effect/confusion + name = "Topographical Cretinism" + stage = 3 +/datum/disease2/effect/confusion/activate(mob/living/carbon/human/M, multiplier) + to_chat(M, "You have trouble telling right and left apart all of a sudden.") + M.mod_confused(40) + +/datum/disease2/effect/mutation + name = "DNA Degradation" + stage = 3 + badness = VIRUS_COMMON +/datum/disease2/effect/mutation/activate(mob/living/carbon/human/mob, multiplier) + mob.apply_damage(2, DAMAGE_GENETIC) + +/datum/disease2/effect/chem_synthesis + name = "Chemical Synthesis" + stage = 3 + badness = VIRUS_COMMON + chance_max = 25 + +/datum/disease2/effect/chem_synthesis/generate(c_data) + if(c_data) + data = c_data + else + data = pick(/datum/reagent/bicaridine, /datum/reagent/kelotane, /datum/reagent/dylovene, /datum/reagent/inaprovaline, /datum/reagent/drugs/psilocybin, /datum/reagent/sugar, + /datum/reagent/tramadol, /datum/reagent/dexalin, /datum/reagent/drugs/cryptobiolin, /datum/reagent/impedrezene, /datum/reagent/hyperzine, /datum/reagent/ethylredoxrazine, + /datum/reagent/drugs/mindbreaker, /datum/reagent/nutriment/glucose) + var/datum/reagent/R = data + name = "[initial(name)] ([initial(R.name)])" + +/datum/disease2/effect/chem_synthesis/activate(mob/living/carbon/human/mob, multiplier) + if (mob.reagents.get_reagent_amount(data) < 5) + mob.reagents.add_reagent(data, 2) + +/datum/disease2/effect/nothing + name = "Nil Syndrome" + stage = 1 + badness = VIRUS_MILD + chance_max = 0 + allow_multiple = 1 + +////////////////////////STAGE 2///////////////////////////////// +/datum/disease2/effect/drowsness + name = "Automated Sleeping Syndrome" + stage = 2 +/datum/disease2/effect/drowsness/activate(mob/living/carbon/human/mob, multiplier) + mob.drowsyness = min(mob.drowsyness + 10, 50) + +/datum/disease2/effect/sleepy + name = "Resting Syndrome" + stage = 2 + chance_max = 15 + delay = 35 SECONDS +/datum/disease2/effect/sleepy/activate(mob/living/carbon/human/mob, multiplier) + mob.emote("collapse") + +/datum/disease2/effect/blind + name = "Blackout Syndrome" + stage = 2 + badness = VIRUS_COMMON +/datum/disease2/effect/blind/activate(mob/living/carbon/human/mob, multiplier) + mob.eye_blind = max(mob.eye_blind, 4) + +/datum/disease2/effect/cough + name = "Anima Syndrome" + stage = 2 + delay = 25 SECONDS +/datum/disease2/effect/cough/activate(mob/living/carbon/human/mob, multiplier) + mob.emote("cough") + if (mob.wear_mask) + return + for(var/mob/living/carbon/human/M in oview(2,mob)) + mob.spread_disease_to(M) + +/datum/disease2/effect/hungry + name = "Appetiser Effect" + stage = 2 +/datum/disease2/effect/hungry/activate(mob/living/carbon/human/mob, multiplier) + mob.adjust_nutrition(-200) + +/datum/disease2/effect/fridge + name = "Refridgerator Syndrome" + stage = 2 + chance_max = 25 + delay = 25 SECONDS +/datum/disease2/effect/fridge/activate(mob/living/carbon/human/mob, multiplier) + mob.emote("shiver") + +/datum/disease2/effect/stimulant + name = "Adrenaline Extra" + stage = 2 + badness = VIRUS_COMMON +/datum/disease2/effect/stimulant/activate(mob/living/carbon/human/mob, multiplier) + to_chat(mob, "You feel a rush of energy inside you!") + if (mob.reagents.get_reagent_amount(/datum/reagent/hyperzine) < 10) + mob.reagents.add_reagent(/datum/reagent/hyperzine, 4) + if (prob(30)) + mob.jitteriness = min(mob.jitteriness + 10, 500) + +////////////////////////STAGE 1///////////////////////////////// + +/datum/disease2/effect/sneeze + name = "Coldingtons Effect" + stage = 1 + delay = 15 SECONDS + +/datum/disease2/effect/sneeze/activate(mob/living/carbon/human/mob, multiplier) + if (prob(30)) + to_chat(mob, "You feel like you are about to sneeze!") + sleep(5) + mob.emote("sneeze") + for(var/mob/living/carbon/human/M in get_step(mob,mob.dir)) + mob.spread_disease_to(M) + if (prob(50) && !mob.wear_mask) + var/obj/decal/cleanable/mucus/M = new(get_turf(mob)) + M.virus2 = virus_copylist(mob.virus2) + +/datum/disease2/effect/gunck + name = "Flemmingtons" + stage = 1 + delay = 25 SECONDS +/datum/disease2/effect/gunck/activate(mob/living/carbon/human/mob, multiplier) + to_chat(mob, "Mucous runs down the back of your throat.") + +/datum/disease2/effect/drool + name = "Saliva Effect" + stage = 1 + chance_max = 25 + delay = 25 SECONDS +/datum/disease2/effect/drool/activate(mob/living/carbon/human/mob, multiplier) + mob.emote("drool") + +/datum/disease2/effect/twitch + name = "Twitcher" + stage = 1 + chance_max = 25 + delay = 25 SECONDS +/datum/disease2/effect/twitch/activate(mob/living/carbon/human/mob, multiplier) + mob.emote("twitch") + +/datum/disease2/effect/headache + name = "Headache" + stage = 1 + delay = 25 SECONDS +/datum/disease2/effect/headache/activate(mob/living/carbon/human/mob, multiplier) + mob.custom_pain("Your head hurts a bit.", 20) + +/datum/disease2/effect/itch + name = "Itches" + stage = 1 + delay = 25 SECONDS +/datum/disease2/effect/itch/activate(mob/living/carbon/human/mob, multiplier) + var/obj/O = pick(mob.organs) + to_chat(mob, "Your [O.name] itches like hell.") + +/datum/disease2/effect/stomach + name = "Upset stomach" + stage = 1 + delay = 25 SECONDS +/datum/disease2/effect/stomach/activate(mob/living/carbon/human/mob, multiplier) + to_chat(mob, "Your stomach feels heavy.") diff --git a/mods/virusology/code/general.dm b/mods/virusology/code/general.dm new file mode 100644 index 0000000000000..18d2b5f4dd779 --- /dev/null +++ b/mods/virusology/code/general.dm @@ -0,0 +1,236 @@ +/datum/species + var/virus_immune + +/datum/species/adherent + virus_immune = 1 + +/datum/species/machine + virus_immune = 1 + +/datum/species/shapeshifter/promethean + virus_immune = 1 + +/datum/species/proc/get_virus_immune(mob/living/carbon/human/H) + return ((H && H.isSynthetic()) ? 1 : virus_immune) + +/// +// pure concentrated antibodies +/datum/reagent/antibodies + data = list("antibodies"=list()) + name = "Antibodies" + taste_description = "slime" + reagent_state = LIQUID + color = "#0050f0" + value = 6 + +/datum/reagent/antibodies/affect_blood(mob/living/carbon/M, alien, removed) + if(src.data) + M.antibodies |= src.data["antibodies"] + ..() + +/datum/reagent/radium/affect_blood(mob/living/carbon/M, alien, removed) + .=..() + if(LAZYLEN(M.virus2)) + for(var/ID in M.virus2) + var/datum/disease2/disease/V = M.virus2[ID] + if(prob(5)) + M.antibodies |= V.antigen + if(prob(50)) + M.apply_damage(50, DAMAGE_RADIATION, armor_pen = 100) // curing it that way may kill you instead + var/absorbed = 0 + var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in M.internal_organs + if(rad_organ && !rad_organ.is_broken()) + absorbed = 1 + if(!absorbed) + M.adjustToxLoss(100) + + +/datum/reagent/nutriment/virus_food + name = "Virus Food" + description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." + taste_description = "vomit" + taste_mult = 2 + reagent_state = LIQUID + nutriment_factor = 2 + color = "#899613" + + + +/singleton/reaction/virus_food + name = "Virus Food" + result = /datum/reagent/nutriment/virus_food + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/drink/milk = 1) + result_amount = 5 + mix_message = "The water dilutes the milk into a thin white solution." + + +/obj/structure/reagent_dispensers/virusfood + name = "virus food dispenser" + desc = "A dispenser of virus food." + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "virusfoodtank" + amount_per_transfer_from_this = 10 + initial_reagent_types = list(/datum/reagent/nutriment/virus_food = 1) + + + +/obj/item/stock_parts/circuitboard/curefab + name = "circuit board (cure fabricator)" + build_path = /obj/machinery/computer/curer + +/obj/item/stock_parts/circuitboard/splicer + name = "circuit board (disease splicer)" + build_path = /obj/machinery/computer/diseasesplicer + origin_tech = list(TECH_DATA = 5, TECH_BIO = 5) + +/obj/item/stock_parts/circuitboard/centrifuge + name = "circuit board (isolation centrifuge)" + build_path = /obj/machinery/computer/centrifuge + origin_tech = list(TECH_DATA = 2, TECH_BIO = 3) + +/datum/design/circuit/curefab + name = "cure fabricator" + id = "curefab" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 5) + build_path = /obj/item/stock_parts/circuitboard/curefab + sort_string = "FACAI" + +/datum/design/circuit/centrifuge + name = "isolation centrifuge console" + id = "iso_centrifuge" + req_tech = list(TECH_DATA = 2, TECH_BIO = 3) + build_path = /obj/item/stock_parts/circuitboard/centrifuge + sort_string = "FACAG" + +/datum/design/circuit/splicer + name = "disease splicer" + id = "isplicer" + req_tech = list(TECH_DATA = 5, TECH_BIO = 5) + build_path = /obj/item/stock_parts/circuitboard/splicer + sort_string = "FACAH" + +/mob/living/carbon/ + var/list/datum/disease2/disease/virus2 = list() + var/list/antibodies = list() + + +/datum/goal/sickness + description = "Don't get sick! Avoid catching any viruses during the shift." + var/got_sick + var/announced + +/datum/goal/sickness/check_success() + return !got_sick + +/datum/goal/sickness/update_progress(progress) + if(!got_sick) + got_sick = progress + if(got_sick) + addtimer(new Callback(src, PROC_REF(on_completion), rand(30,40))) + +/datum/goal/sickness/on_completion() + if(!announced) + announced = TRUE + var/datum/mind/mind = owner + to_chat(mind.current, SPAN_DANGER("You don't feel so good...")) + +/obj/decal/cleanable/blood + var/list/viruses = list() + var/list/datum/disease2/disease/virus2 = list() + +/obj/decal/cleanable/vomit + var/list/viruses = list() + +/obj/decal/cleanable/mucus + name = "mucus" + desc = "Disgusting mucus." + gender = PLURAL + density = FALSE + anchored = TRUE + layer = 2 + icon = 'icons/effects/blood.dmi' + icon_state = "mucus" + var/list/datum/disease2/disease/virus2 = list() + + +/obj/decal/cleanable/mucus/New() + . = ..() + addtimer(new Callback(src, PROC_REF(set_dry), 1), DRYING_TIME * 2) + +/mob/living/carbon/human/proc/cure_virus(virus_uuid) + if(vessel && virus_uuid) + for(var/datum/reagent/blood/B in vessel.reagent_list) + var/list/viruses = list() + viruses = B.data["virus2"] + viruses.Remove("[virus_uuid]") + B.data["virus2"] = viruses + + +/singleton/hierarchy/supply_pack/science/virus + name = "Samples - Virus (BIOHAZARD)" + contains = list(/obj/item/virusdish/random = 4) + cost = 25 + containertype = /obj/structure/closet/crate/secure + containername = "virus sample crate" + access = access_virology + + +/datum/controller/subsystem/supply + var/list/sold_virus_strains = list() + +/datum/reagent/blood/affect_touch(mob/living/carbon/M, alien, removed) + .=..() + if(data && data["virus2"]) + var/list/vlist = data["virus2"] + if(LAZYLEN(vlist)) + for(var/ID in vlist) + var/datum/disease2/disease/V = vlist[ID] + if(V.spreadtype == "Contact") + infect_virus2(M, V.getcopy()) + if(data && data["antibodies"]) + M.antibodies |= data["antibodies"] + +/datum/reagent/blood/affect_ingest(mob/living/carbon/M, removed) + .=..() + if(data && data["virus2"]) + var/list/vlist = data["virus2"] + if(LAZYLEN(vlist)) + for(var/ID in vlist) + var/datum/disease2/disease/V = vlist[ID] + if(V && V.spreadtype == "Contact") + infect_virus2(M, V.getcopy()) + +/datum/reagent/blood/mix_data(newdata, newamount) + if(!islist(newdata)) + return + if(!data["virus2"]) + data["virus2"] = list() + data["virus2"] |= newdata["virus2"] + if(!data["antibodies"]) + data["antibodies"] = list() + data["antibodies"] |= newdata["antibodies"] + +/mob/living/carbon/take_blood(obj/item/reagent_containers/container, amount) + .=..() + var/datum/reagent/blood/B = get_blood(container.reagents) + if (!B.data["virus2"]) + B.data["virus2"] = list() + B.data["virus2"] |= virus_copylist(virus2) + B.data["antibodies"] = antibodies + +/mob/living/carbon/inject_blood(datum/reagent/blood/injected, amount) + .=..() + var/list/sniffles = virus_copylist(injected.data["virus2"]) + for(var/ID in sniffles) + var/datum/disease2/disease/sniffle = sniffles[ID] + infect_virus2(src, sniffle, 1) + + if(injected.data["antibodies"] && prob(5)) + antibodies |= injected.data["antibodies"] + +/mob/living/carbon/human/handle_post_breath(datum/gas_mixture/breath) + .=..() + //spread some viruses while we are at it + if(breath && !internal && LAZYLEN(virus2) > 0 && prob(10)) + for(var/mob/living/carbon/M in view(1,src)) + src.spread_disease_to(M) diff --git a/mods/virusology/code/helpers.dm b/mods/virusology/code/helpers.dm new file mode 100644 index 0000000000000..fd670b03c9374 --- /dev/null +++ b/mods/virusology/code/helpers.dm @@ -0,0 +1,201 @@ +/obj/machinery/disease2 + core_skill = SKILL_VIROLOGY + +/obj/machinery/proc/infect_nearby(datum/disease2/disease/disease, base_chance = 20, dist = 2) + if(istype(disease) && operator_skill <= HAS_PERK) + for(var/mob/living/carbon/victim in range(dist, src)) + if(prob(base_chance)) + if(victim.skill_check(SKILL_VIROLOGY, HAS_PERK)) + if(prob(50)) + infect_virus2(victim, disease) + else + return + else + infect_virus2(victim, disease) + +//Returns 1 if mob can be infected, 0 otherwise. +/proc/infection_chance(mob/living/carbon/M, vector = "Airborne") + if (!istype(M)) + return 0 + + var/mob/living/carbon/human/H = M + if(istype(H) && H.species.get_virus_immune(H)) + return 0 + + var/protection = M.get_blocked_ratio(null, DAMAGE_BIO, damage_flags = DAMAGE_FLAG_DISPERSED | DAMAGE_FLAG_BIO) //gets the full body bio armour value, weighted by body part coverage. + var/score = round(6 * protection) //scales 100% protection to 6. + + switch(vector) + if("Airborne") + if(M.internal) //not breathing infected air helps greatly + return 0 + var/obj/item/I = M.wear_mask + //masks provide a small bonus and can replace overall bio protection + if(I) + var/datum/extension/armor/armor_datum = get_extension(I, /datum/extension/armor) + if(armor_datum) + score = max(score, round(0.06*armor_datum.get_value("bio"))) + if (istype(I, /obj/item/clothing/mask)) + score += 1 //this should be added after + + if("Contact") + if(istype(H)) + //gloves provide a larger bonus + if (istype(H.gloves, /obj/item/clothing/gloves)) + score += 2 + + switch(score) + if (6 to INFINITY) + return 0 + if (5) + return 1 + if (4) + return 5 + if (3) + return 25 + if (2) + return 45 + if (1) + return 65 + else + return 100 + +//Similar to infection check, but used for when M is spreading the virus. +/proc/infection_spreading_check(mob/living/carbon/M, vector = "Airborne") + if (!istype(M)) + return 0 + + var/protection = M.get_blocked_ratio(null, DAMAGE_BIO, damage_flags = DAMAGE_FLAG_BIO | DAMAGE_FLAG_DISPERSED) //gets the full body bio armour value, weighted by body part coverage. + + if (vector == "Airborne") //for airborne infections face-covering items give non-weighted protection value. + if(M.internal) + return 1 + protection = max(protection, M.get_blocked_ratio(BP_HEAD, DAMAGE_BIO, damage_flags = DAMAGE_FLAG_BIO)) + + return prob(100 * protection + 15*M.chem_effects[CE_ANTIVIRAL]) + +/proc/airborne_can_reach(turf/simulated/source, turf/simulated/target) + //Can't ariborne without air + if(is_below_sound_pressure(source) || is_below_sound_pressure(target)) + return FALSE + //no infecting from other side of the hallway + if(get_dist(source,target) > 4) + return FALSE + if(istype(source) && istype(target)) + return source.zone == target.zone + +//Attemptes to infect mob M with virus. Set forced to 1 to ignore protective clothnig +/proc/infect_virus2(mob/living/carbon/M, datum/disease2/disease/disease, forced = 0) + if(!istype(disease)) +// log_debug("Bad virus") + return + if(!istype(M)) +// log_debug("Bad mob") + return + if ("[disease.uniqueID]" in M.virus2) + return + if(LAZYLEN(M.virus2) >= 3) // cap the number of viruses a mob can have to 3 + return + // if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect + var/list/antibodies_in_common = M.antibodies & disease.antigen + if(LAZYLEN(antibodies_in_common)) + return + if(prob(100 * M.reagents.get_reagent_amount(/datum/reagent/spaceacillin) / (REAGENTS_OVERDOSE/2))) + return + + if(!LAZYLEN(disease.affected_species)) + return + + if (!(M.species.get_bodytype(M) in disease.affected_species)) + if (forced) + disease.affected_species[1] = M.species.get_bodytype(M) + else + return //not compatible with this species + +// log_debug("Infecting [M]") + var/mob_infection_prob = infection_chance(M, disease.spreadtype) * M.immunity_weakness() + if(forced || (prob(disease.infectionchance) && prob(mob_infection_prob))) + var/datum/disease2/disease/D = disease.getcopy() + if(rand(1, 50) == 1) + D.minormutate() +// log_debug("Adding virus") + M.virus2["[D.uniqueID]"] = D + SET_BIT(M.hud_updateflag, STATUS_HUD) + M.update_personal_goal(/datum/goal/sickness, TRUE) + +//Infects mob M with random lesser disease, if he doesn't have one +/proc/infect_mob_random_lesser(mob/living/carbon/M) + var/datum/disease2/disease/D = new /datum/disease2/disease + + D.makerandom(VIRUS_MILD) + infect_virus2(M, D, 1) + +//Infects mob M with random greated disease, if he doesn't have one +/proc/infect_mob_random_greater(mob/living/carbon/M) + var/datum/disease2/disease/D = new /datum/disease2/disease + + D.makerandom(VIRUS_COMMON) + infect_virus2(M, D, 1) + +//Fancy prob() function. +/proc/dprob(p) + return(prob(sqrt(p)) && prob(sqrt(p))) + +/mob/living/carbon/proc/spread_disease_to(mob/living/carbon/victim, vector = "Airborne") + if (src == victim) + return "retardation" + +// log_debug("Spreading [vector] diseases from [src] to [victim]") + if (LAZYLEN(virus2) > 0) + for (var/ID in virus2) +// log_debug("Attempting virus [ID]") + var/datum/disease2/disease/V = virus2[ID] + if(V.spreadtype != vector) continue + + //It's hard to get other people sick if you're in an airtight suit. + if(!infection_spreading_check(src, V.spreadtype)) continue + + if (vector == "Airborne") + if(airborne_can_reach(get_turf(src), get_turf(victim))) +// log_debug("In range, infecting") + infect_virus2(victim,V) +// else +// log_debug("Could not reach target") + + if (vector == "Contact") + if (Adjacent(victim)) +// log_debug("In range, infecting") + infect_virus2(victim,V) + + //contact goes both ways + if (LAZYLEN(victim.virus2) > 0 && vector == "Contact" && Adjacent(victim)) +// log_debug("Spreading [vector] diseases from [victim] to [src]") + var/nudity = 1 + + if (ishuman(victim)) + var/mob/living/carbon/human/H = victim + + //Allow for small chance of touching other zones. + //This is proc is also used for passive spreading so just because they are targeting + //that zone doesn't mean that's necessarily where they will touch. + var/touch_zone = zone_sel ? zone_sel.selecting : "chest" + touch_zone = ran_zone(touch_zone, 80) + var/obj/item/organ/external/select_area = H.get_organ(touch_zone) + if(!select_area) + //give it one more chance, since this is also called for passive spreading + select_area = H.get_organ(ran_zone()) + + if(!select_area) + nudity = 0 //cant contact a missing body part + else + var/list/clothes = list(H.head, H.wear_mask, H.wear_suit, H.w_uniform, H.gloves, H.shoes) + for(var/obj/item/clothing/C in clothes) + if(C && istype(C)) + if(C.body_parts_covered & select_area.body_part) + nudity = 0 + if (nudity) + for (var/ID in victim.virus2) + var/datum/disease2/disease/V = victim.virus2[ID] + if(V && V.spreadtype != vector) continue + if(!infection_spreading_check(victim, V.spreadtype)) continue + infect_virus2(src,V) diff --git a/mods/virusology/code/isolator.dm b/mods/virusology/code/isolator.dm new file mode 100644 index 0000000000000..e395f040e5ded --- /dev/null +++ b/mods/virusology/code/isolator.dm @@ -0,0 +1,227 @@ +// UI menu navigation +#define HOME "home" +#define LIST "list" +#define ENTRY "entry" + +/obj/machinery/disease2/isolator/ + name = "pathogenic isolator" + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "isolator" + var/isolating = 0 + var/state = HOME + var/datum/disease2/disease/virus2 = null + var/datum/computer_file/data/virus_record/entry = null + var/obj/item/reagent_containers/syringe/sample = null + density = TRUE + +/obj/machinery/disease2/isolator/on_update_icon() + if(stat & (MACHINE_STAT_NOPOWER|MACHINE_IS_BROKEN(src))) + icon_state = "isolator" + return + + if (isolating) + icon_state = "isolator_processing" + else if (sample) + icon_state = "isolator_in" + else + icon_state = "isolator" + +/obj/machinery/disease2/isolator/use_tool(obj/item/O, mob/living/user, list/click_params) + . = ..() + if(!istype(O,/obj/item/reagent_containers/syringe)) return + if(sample) + to_chat(user, "\The [src] is already loaded.") + return + if(!user.unEquip(O, src)) + return + sample = O + + user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") + SSnano.update_uis(src) + update_icon() + + src.attack_hand(user) + +/obj/machinery/disease2/isolator/interface_interact(mob/user) + ui_interact(user) + return TRUE + +/obj/machinery/disease2/isolator/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + user.set_machine(src) + + var/data[0] + data["syringe_inserted"] = !!sample + data["isolating"] = isolating + data["pathogen_pool"] = null + data["state"] = state + data["entry"] = entry + data["can_print"] = (state != HOME || sample) && !isolating + + switch (state) + if (HOME) + if (sample) + var/list/pathogen_pool[0] + for(var/datum/reagent/blood/B in sample.reagents.reagent_list) + var/list/virus = B.data["virus2"] + for (var/ID in virus) + var/datum/disease2/disease/V = virus[ID] + var/datum/computer_file/data/virus_record/R = null + if (ID in virusDB) + R = virusDB[ID] + + var/weakref/W = B.data["donor"] + var/mob/living/carbon/human/D = W.resolve() + pathogen_pool.Add(list(list(\ + "name" = "[D ? D.get_species() : "Unidentified"] [B.name]", \ + "dna" = B.data["blood_DNA"], \ + "unique_id" = V.uniqueID, \ + "reference" = "\ref[V]", \ + "is_in_database" = !!R, \ + "record" = "\ref[R]"))) + + if (LAZYLEN(pathogen_pool) > 0) + data["pathogen_pool"] = pathogen_pool + + if (LIST) + var/list/db[0] + for (var/ID in virusDB) + var/datum/computer_file/data/virus_record/r = virusDB[ID] + db.Add(list(list("name" = r.fields["name"], "record" = "\ref[r]"))) + + if (LAZYLEN(db) > 0) + data["database"] = db + + if (ENTRY) + if (entry) + var/desc = entry.fields["description"] + data["entry"] = list(\ + "name" = entry.fields["name"], \ + "description" = replacetext(desc, "\n", "")) + + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "mods-pathogenic_isolator.tmpl", src.name, 400, 500) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/disease2/isolator/Process() + if (isolating > 0) + isolating -= 1 + if(virus2) + infect_nearby(virus2) + if (isolating == 0) + if (virus2) + var/obj/item/virusdish/d = new /obj/item/virusdish(src.loc) + d.virus2 = virus2.getcopy() + virus2 = null + ping("\The [src] pings, \"Viral strain isolated.\"") + + SSnano.update_uis(src) + update_icon() + +/obj/machinery/disease2/isolator/OnTopic(mob/user, href_list) + if (href_list["close"]) + SSnano.close_user_uis(user, src, "main") + return TOPIC_HANDLED + + if (href_list[HOME]) + state = HOME + return TOPIC_REFRESH + + if (href_list[LIST]) + state = LIST + return TOPIC_REFRESH + + if (href_list[ENTRY]) + if (istype(locate(href_list["view"]), /datum/computer_file/data/virus_record)) + entry = locate(href_list["view"]) + + state = ENTRY + return TOPIC_REFRESH + + if (href_list["print"]) + print(user) + return TOPIC_REFRESH + + if(!sample) return TOPIC_HANDLED + + if (href_list["isolate"]) + operator_skill = user.get_skill_value(core_skill) + var/datum/disease2/disease/V = locate(href_list["isolate"]) + if (V) + virus2 = V + isolating = 20 + update_icon() + return TOPIC_REFRESH + + if (href_list["eject"]) + sample.dropInto(loc) + sample = null + update_icon() + return TOPIC_REFRESH + +/obj/machinery/disease2/isolator/proc/print(mob/user) + var/obj/item/paper/P = new /obj/item/paper(loc) + + switch (state) + if (HOME) + if (!sample) return + P.SetName("paper - Patient Diagnostic Report") + P.info = {" + [virology_letterhead("Patient Diagnostic Report")] +
    CONFIDENTIAL MEDICAL REPORT

    + Sample: [sample.name]
    +"} + + if (user) + P.info += "Generated By: [user.name]
    " + + P.info += "
    " + + for(var/datum/reagent/blood/B in sample.reagents.reagent_list) + var/weakref/W = B.data["donor"] + var/mob/living/carbon/human/D = W.resolve() + P.info += "[D ? D.get_species() : "Unidentified"] [B.name]:
    [B.data["blood_DNA"]]
    " + + var/list/virus = B.data["virus2"] + P.info += "Pathogens:
    " + if (LAZYLEN(virus) > 0) + for (var/ID in virus) + var/datum/disease2/disease/V = virus[ID] + P.info += "[V.name()]
    " + else + P.info += "None
    " + + P.info += {" +
    + Additional Notes:  +"} + + if (LIST) + P.SetName("paper - Virus List") + P.info = {" + [virology_letterhead("Virus List")] +"} + + var/i = 0 + for (var/ID in virusDB) + i++ + var/datum/computer_file/data/virus_record/r = virusDB[ID] + P.info += "[i]. " + r.fields["name"] + P.info += "
    " + + P.info += {" +
    + Additional Notes:  +"} + + if (ENTRY) + P.SetName("paper - Viral Profile") + P.info = {" + [virology_letterhead("Viral Profile")] + [entry.fields["description"]] +
    + Additional Notes:  +"} + + state("The nearby computer prints out a report.") diff --git a/mods/virusology/code/items_devices.dm b/mods/virusology/code/items_devices.dm new file mode 100644 index 0000000000000..0383a57b050d7 --- /dev/null +++ b/mods/virusology/code/items_devices.dm @@ -0,0 +1,144 @@ +///////////////ANTIBODY SCANNER/////////////// + +/obj/item/device/scanner/antibody_scanner + name = "antibody scanner" + desc = "Scans living beings for antibodies in their blood." + icon = 'icons/obj/tools/health_analyzer.dmi' + icon_state = "health" + item_state = "analyzer" + w_class = ITEM_SIZE_SMALL + item_state = "electronic" + obj_flags = OBJ_FLAG_CONDUCTIBLE + +/obj/item/device/scanner/antibody_scanner/use_before(mob/living/M, mob/living/user) + . = FALSE + if(!istype(M,/mob/living/carbon)) + report("Scan aborted: Incompatible target.", user) + return + + var/mob/living/carbon/C = M + if (istype(C,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = C + if(!H.should_have_organ(BP_HEART)) + report("Scan aborted: The target does not have blood.", user) + return + + if(!LAZYLEN(C.antibodies)) + report("Scan Complete: No antibodies detected.", user) + return + + if (MUTATION_CLUMSY in user.mutations && prob(50)) + // I was tempted to be really evil and rot13 the output. + report("Antibodies detected: [reverse_text(antigens2string(C.antibodies))]", user) + else + report("Antibodies detected: [antigens2string(C.antibodies)]", user) + +/obj/item/device/scanner/antibody_scanner/proc/report(text, mob/user as mob) + to_chat(user, "\icon[src] \The [src] beeps, \"[text]\"") + +///////////////VIRUS DISH/////////////// + +/obj/item/virusdish + name = "virus dish" + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "implantcase-b" + var/datum/disease2/disease/virus2 = null + var/growth = 0 + var/basic_info = null + var/info = 0 + var/analysed = 0 + +/obj/item/virusdish/random + name = "virus sample" + +/obj/item/virusdish/random/New() + ..() + src.virus2 = new /datum/disease2/disease + src.virus2.makerandom() + growth = rand(5, 50) + +/obj/item/virusdish/use_tool(obj/item/W, mob/living/user, list/click_params) + . = ..() + if(istype(W, /obj/item/hand_labeler) || istype(W, /obj/item/reagent_containers/syringe)) + return + ..() + if(prob(50)) + to_chat(user, "\The [src] shatters!") + if(virus2.infectionchance > 0) + for(var/mob/living/carbon/target in view(1, get_turf(src))) + if(airborne_can_reach(get_turf(src), get_turf(target))) + infect_virus2(target, src.virus2) + qdel(src) + +/obj/item/virusdish/examine(mob/user) + . = ..() + if(basic_info) + to_chat(user, "[basic_info] : More Information") + +/obj/item/virusdish/OnTopic(user, href_list) + if(href_list["info"]) + show_browser(user, info, "window=info_\ref[src]") + return TOPIC_HANDLED + +/obj/item/ruinedvirusdish + name = "ruined virus sample" + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "implantcase-b" + desc = "The bacteria in the dish are completely dead." + +/obj/item/ruinedvirusdish/use_tool(obj/item/W, mob/living/user, list/click_params) + . = ..() + if(istype(W,/obj/item/hand_labeler) || istype(W,/obj/item/reagent_containers/syringe)) + return ..() + + if(prob(50)) + to_chat(user, "\The [src] shatters!") + qdel(src) + +///////////////GNA DISK/////////////// + +/obj/item/diseasedisk + name = "blank GNA disk" + icon = 'mods/virusology/icons/virology.dmi' + icon_state = "datadisk0" + w_class = ITEM_SIZE_TINY + var/datum/disease2/effect/effect = null + var/list/species = null + var/stage = 1 + var/analysed = 1 + +/obj/item/diseasedisk/premade/Initialize() + . = ..() + name = "blank GNA disk (stage: [stage])" + effect = new /datum/disease2/effect/invisible + effect.stage = stage + + +/obj/item/stock_parts/circuitboard/curefab + name = "circuit board (cure fabricator)" + build_path = /obj/machinery/computer/curer + +/obj/item/stock_parts/circuitboard/splicer + name = "circuit board (disease splicer)" + build_path = /obj/machinery/computer/diseasesplicer + origin_tech = list(TECH_DATA = 5, TECH_BIO = 5) + +/obj/item/stock_parts/circuitboard/centrifuge + name = "circuit board (isolation centrifuge)" + build_path = /obj/machinery/computer/centrifuge + origin_tech = list(TECH_DATA = 2, TECH_BIO = 3) + + +/datum/design/circuit/centrifuge + name = "isolation centrifuge console" + id = "iso_centrifuge" + req_tech = list(TECH_DATA = 2, TECH_BIO = 3) + build_path = /obj/item/stock_parts/circuitboard/centrifuge + sort_string = "FACAG" + +/datum/design/circuit/splicer + name = "disease splicer" + id = "isplicer" + req_tech = list(TECH_DATA = 5, TECH_BIO = 5) + build_path = /obj/item/stock_parts/circuitboard/splicer + sort_string = "FACAH" diff --git a/mods/virusology/code/lar_maria.dm b/mods/virusology/code/lar_maria.dm new file mode 100644 index 0000000000000..f9d081f6c5b97 --- /dev/null +++ b/mods/virusology/code/lar_maria.dm @@ -0,0 +1,99 @@ +/datum/disease2/disease/lar_maria + infectionchance = 90//very aggressive + speed = 10 + spreadtype = "Airborne" + + affected_species = list(HUMAN_SPECIES,SPECIES_UNATHI,SPECIES_SKRELL,SPECIES_UNATHI,SPECIES_YEOSA,SPECIES_TRITONIAN,SPECIES_RESOMI,SPECIES_NABBER,SPECIES_MONKEY) + +/datum/disease2/disease/lar_maria/New() + ..() + antigen = list(pick(ALL_ANTIGENS)) + antigen |= pick(ALL_ANTIGENS) + var/datum/disease2/effect/sneeze/E1 = new() + E1.stage = 1 + E1.chance = 3 + effects += E1 + E1.multiplier = rand(1,E1.multiplier_max) + var/datum/disease2/effect/stimulant/E2 = new() + E2.stage = 2 + E2.chance = 3 + effects += E2 + E2.multiplier = rand(1,E2.multiplier_max) + var/datum/disease2/effect/stimulant/E3 = new() + E3.stage = 3 + E3.chance = 3 + effects += E3 + E3.multiplier = rand(1,E3.multiplier_max) + var/datum/disease2/effect/rage/E4 = new() + E4.stage = 4 + E4.chance = 3 + effects += E4 + E4.multiplier = rand(1,E4.multiplier_max) + +/datum/disease2/effect/rage //custom effect, fills PC with uncontrollable rage + name = "Rampage Syndrome" + stage = 4 + badness = VIRUS_EXOTIC + delay = 20 SECONDS + var/first_message_shown = FALSE + +/datum/disease2/effect/rage/activate(mob/living/carbon/human/mob, multiplier) + if (!first_message_shown) + first_message_shown = TRUE + to_chat(mob, "Your muscles start tensing up, and you can feel your pulse rising, throbbing at the back of your head. Your breathing increases, and you feel... angry. An urge wells up inside you. Everything is making you angry, and you want it to pay for it.") + return //nothing else happens first time giving chance to adjust RP + if(prob(50)) + to_chat(mob, "You feel uncontrollable rage filling you! You want to hurt and destroy!") + if (mob.reagents.get_reagent_amount(/datum/reagent/hyperzine) < 10) + mob.reagents.add_reagent(/datum/reagent/hyperzine, 4) + if(prob(50) && mob.check_has_mouth())//go crazy and bite someone + var/list/mouth_status = mob.can_eat_status() + if (mouth_status[1] == 1)//if no mouth HUMAN_EATING_NBP_MOUTH + to_chat(mob, "You angrily attempt to bite someone but you can't without a mouth!") + return + if (mouth_status[1] == 2)//if something covers mouth HUMAN_EATING_BLOCKED_MOUTH + to_chat(mob, "You angrily chew \the [mouth_status[2]] covering your mouth!") + return + var/list/mobs_to_bite = list() + for (var/mob/living/carbon/human/L in range(1)) + if (L == mob) + continue + mobs_to_bite += L + if (LAZYLEN(mobs_to_bite) < 1)//nobody to bite + return + var/mob/living/carbon/human/Target = pick(mobs_to_bite) + mob.visible_message("[mob] violently bites [Target]!") + Target.adjustBruteLoss(5) + if (prob(50)) + infect_virus2(Target, src, 1) + + +/mob/living/simple_animal/hostile/lar_maria + var/datum/disease2/disease/lar_maria/LMD = new() + special_attack_min_range = 0 + special_attack_max_range = 1 + special_attack_cooldown = 1 SECONDS + +/mob/living/simple_animal/hostile/lar_maria/Destroy() + . = ..() + QDEL_NULL(LMD) + + +/mob/living/simple_animal/hostile/lar_maria/death(gibbed, deathmessage, show_dead_message) + var/list/victims = list() + var/list/objs = list() + var/turf/T = get_turf(src) + get_mobs_and_objs_in_view_fast(T, 3, victims, objs) + for(var/mob/living/M in victims) + if(ishuman(M)) + if(prob(infection_chance(M, "Airborne"))) + infect_virus2(M, LMD, 1) + .=..() + qdel(src) + +/mob/living/simple_animal/hostile/lar_maria/do_special_attack(atom/A) + if(ishuman(A))//if it's human who can be infected standing nearby + var/mob/living/L = A + if (prob(12)) + visible_message("[src] violently bites [L]!") + infect_virus2(L, LMD, 1) diff --git a/mods/virusology/code/misc.dm b/mods/virusology/code/misc.dm new file mode 100644 index 0000000000000..48e3d209119ca --- /dev/null +++ b/mods/virusology/code/misc.dm @@ -0,0 +1,19 @@ +/datum/goal/sickness + description = "Don't get sick! Avoid catching any viruses during the shift." + var/got_sick + var/announced + +/datum/goal/sickness/check_success() + return !got_sick + +/datum/goal/sickness/update_progress(progress) + if(!got_sick) + got_sick = progress + if(got_sick) + addtimer(CALLBACK(src, /datum/goal/sickness/on_completion), rand(30,40)) + +/datum/goal/sickness/on_completion() + if(!announced) + announced = TRUE + var/datum/mind/mind = owner + to_chat(mind.current, SPAN_DANGER("You don't feel so good...")) diff --git a/mods/virusology/code/pre_made_viruses.dm b/mods/virusology/code/pre_made_viruses.dm new file mode 100644 index 0000000000000..3a38498e293d6 --- /dev/null +++ b/mods/virusology/code/pre_made_viruses.dm @@ -0,0 +1,110 @@ +///Premade Viruses +/datum/disease2/disease/cold + infectionchance = 50 + speed = 1 + spreadtype = "Airborne" + max_stage = 3 + + +/datum/disease2/disease/cold/New() + ..() + antigen = list(pick(ALL_ANTIGENS)) + antigen |= pick(ALL_ANTIGENS) + var/datum/disease2/effect/sneeze/E1 = new() + E1.stage = 1 + effects += E1 + E1.multiplier = rand(1,E1.multiplier_max) + var/datum/disease2/effect/fridge/E2 = new() + E2.stage = 2 + effects += E2 + E2.multiplier = rand(1,E2.multiplier_max) + var/datum/disease2/effect/shakey/E3 = new() + E3.stage = 3 + effects += E3 + E3.multiplier = rand(1,E3.multiplier_max) + +/datum/disease2/disease/spider + infectionchance = 60 + speed = 5 + spreadtype = "Contact" + max_stage = 3 + affected_species = list(HUMAN_SPECIES,SPECIES_UNATHI,SPECIES_SKRELL,SPECIES_UNATHI,SPECIES_YEOSA,SPECIES_TRITONIAN,SPECIES_RESOMI,SPECIES_NABBER,SPECIES_MONKEY) + +/datum/disease2/disease/spider/New() + ..() + antigen = list(pick(ALL_ANTIGENS)) + antigen |= pick(ALL_ANTIGENS) + infectionchance = rand(10,50) + var/datum/disease2/effect/headache/E1 = new() + E1.chance = 2 + E1.stage = 1 + effects += E1 + E1.multiplier = rand(1,E1.multiplier_max) + var/datum/disease2/effect/blind/E2 = new() + E2.chance = 2 + E2.stage = 2 + effects += E2 + E2.multiplier = rand(1,E2.multiplier_max) + var/datum/disease2/effect/confusion/E3 = new() + E3.stage = 3 + E3.chance = 2 + effects += E3 + E3.multiplier = rand(1,E3.multiplier_max) + + +/mob/living/simple_animal/hostile/giant_spider + var/datum/disease2/disease/spider/spider = new() + + +/mob/living/simple_animal/hostile/giant_spider/Destroy() + . = ..() + QDEL_NULL(spider) + +/mob/living/simple_animal/hostile/giant_spider/apply_melee_effects(mob/living/carbon/human/M) + . = ..() + if(Adjacent(M))//if it's human who can be infected standing nearby + if (prob(3)) + infect_virus2(M, spider, 0) + + +/datum/disease2/disease/livingmeat + + infectionchance = 70 + speed = 3 + spreadtype = "Contact" + max_stage = 3 + affected_species = list(HUMAN_SPECIES,SPECIES_UNATHI,SPECIES_SKRELL,SPECIES_UNATHI,SPECIES_YEOSA,SPECIES_TRITONIAN,SPECIES_RESOMI,SPECIES_NABBER,SPECIES_MONKEY) + +/mob/living/simple_animal/hostile/meatstation + var/datum/disease2/disease/livingmeat/livingmeat = new() + +/mob/living/simple_animal/hostile/meatstation/Destroy() + . = ..() + QDEL_NULL(livingmeat) + +/mob/living/simple_animal/hostile/meatstation/apply_melee_effects(mob/living/carbon/human/M) + . = ..() + if(Adjacent(M))//if it's human who can be infected standing nearby + if (prob(10)) + infect_virus2(M, livingmeat, 0) + +/datum/disease2/disease/livingmeat/New() + ..() + antigen = list(pick(ALL_ANTIGENS)) + antigen |= pick(ALL_ANTIGENS) + infectionchance = rand(10,50) + var/datum/disease2/effect/stomach/E1 = new() + E1.stage = 1 + E1.chance = 2 + effects += E1 + E1.multiplier = rand(1,E1.multiplier_max) + var/datum/disease2/effect/hungry/E2 = new() + E2.stage = 2 + E1.chance = 2 + effects += E2 + E2.multiplier = rand(1,E2.multiplier_max) + var/datum/disease2/effect/mutation/E3 = new() + E3.stage = 3 + E1.chance = 2 + effects += E3 + E3.multiplier = rand(1,E3.multiplier_max) diff --git a/mods/virusology/icons/virology.dmi b/mods/virusology/icons/virology.dmi new file mode 100644 index 0000000000000..93369d83f42a5 Binary files /dev/null and b/mods/virusology/icons/virology.dmi differ diff --git a/nano/templates/cryo.tmpl b/nano/templates/cryo.tmpl index 5a61be7611bb9..49f0d41605040 100644 --- a/nano/templates/cryo.tmpl +++ b/nano/templates/cryo.tmpl @@ -1,5 +1,5 @@ -

    Cryo Cell Status

    @@ -36,7 +36,7 @@ Used In File(s): \code\game\machinery\cryo.dm Beaker:
    - {{if data.isBeakerLoaded}} + {{if data.isBeakerLoaded}} {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
    {{if data.beakerVolume}} {{:data.beakerVolume}} units remaining
    @@ -54,12 +54,12 @@ Used In File(s): \code\game\machinery\cryo.dm
     
    - Cryostasis Speed: + Cryostasis Intensity:
    - {{:helper.link('Fast', null, {'goFast' : 1}, data.current_stasis_mult === data.fast_stasis_mult ? 'selected' : null)}} - {{:helper.link('Regular', null, {'goRegular' : 1}, data.current_stasis_mult === 1 ? 'selected' : null)}} - {{:helper.link('Slow', null, {'goSlow' : 1}, data.current_stasis_mult === data.slow_stasis_mult ? 'selected' : null)}} + {{:helper.link('Low', null, {'goFast' : 1}, data.current_stasis_mult === data.fast_stasis_mult ? 'selected' : null)}} + {{:helper.link('Standard', null, {'goRegular' : 1}, data.current_stasis_mult === 1 ? 'selected' : null)}} + {{:helper.link('High', null, {'goSlow' : 1}, data.current_stasis_mult === data.slow_stasis_mult ? 'selected' : null)}}
    -
    \ No newline at end of file + diff --git a/nano/templates/hardsuit.tmpl b/nano/templates/hardsuit.tmpl index e1c1e14e71de4..4fa2a206091f7 100644 --- a/nano/templates/hardsuit.tmpl +++ b/nano/templates/hardsuit.tmpl @@ -1,11 +1,11 @@ -