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..f4114a997e1bf 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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@881db5376404c5c8d621010bcbec0310b58d5e29 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..fda9010d8f601 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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@6849a6489940f00c2f30c0fb92c6274307ccb58a 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 a837576e39875..20c357e3dc5bc 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -235,6 +235,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" @@ -243,11 +244,11 @@ #include "code\controllers\subsystems\initialization\persistence.dm" #include "code\controllers\subsystems\initialization\robots.dm" #include "code\controllers\subsystems\initialization\webhooks.dm" +#include "code\controllers\subsystems\initialization\xenoarch.dm" #include "code\controllers\subsystems\processing\circuit.dm" #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" @@ -324,7 +325,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" @@ -420,6 +420,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" @@ -1220,7 +1221,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" @@ -1283,6 +1283,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" @@ -1403,6 +1405,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" @@ -3335,8 +3338,10 @@ #include "mods\global_modpacks.dm" #include "mods\_master_files\code\_onclick\click.dm" #include "mods\_master_files\code\game\world.dm" +#include "mods\_master_files\code\game\antagonist\station\changeling.dm" #include "mods\_master_files\code\game\gamemodes\ert.dm" #include "mods\_master_files\code\game\objects\effects\decals\contraband.dm" +#include "mods\_master_files\code\game\objects\structures\mineral_bath.dm" #include "mods\_master_files\code\game\objects\structures\signs.dm" #include "mods\_master_files\code\game\objects\structures\crates_lockers\closets\_closet_appearance_definitions.dm" #include "mods\_master_files\code\modules\client\asset_cache.dm" @@ -3370,11 +3375,14 @@ #include "mods\_master_files\code\modules\culture_descriptor\religion\religions_unathi.dm" #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" #include "mods\_master_files\code\modules\power\gravitygenerator.dm" #include "mods\_master_files\code\modules\projectiles\projectile\bullets.dm" +#include "mods\_master_files\code\modules\psionics\events\mini_spasm.dm" #include "mods\_master_files\code\modules\species\species.dm" #include "mods\_master_files\code\modules\species\station\adherent.dm" #include "mods\_master_files\code\modules\species\station\human_subspecies.dm" diff --git a/code/__defines/ZAS.dm b/code/__defines/ZAS.dm index 238d1e1bdde9f..ae82d624a63fc 100644 --- a/code/__defines/ZAS.dm +++ b/code/__defines/ZAS.dm @@ -139,3 +139,5 @@ GLOBAL_LIST_INIT(gzn_check, list( } #endif + +#define GAS_STANDARD_AIRMIX "STANDARD_AIRMIX" diff --git a/code/__defines/__renderer.dm b/code/__defines/__renderer.dm index bb2d2507f20a4..004e752f3310b 100644 --- a/code/__defines/__renderer.dm +++ b/code/__defines/__renderer.dm @@ -66,7 +66,7 @@ #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 ABOVE_EXPOSED_WIRE_LAYER 2.08 #define CATWALK_LAYER 2.09 #define ABOVE_CATWALK_LAYER 2.10 #define BLOOD_LAYER 2.11 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/misc.dm b/code/__defines/misc.dm index 33daaea936bc2..5a5e11a84dc6b 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -523,3 +523,7 @@ ///from /datum/bank_account/pay_debt(), after a portion or all the debt has been paid. #define COMSIG_BANK_ACCOUNT_DEBT_PAID "bank_account_debt_paid" //[/SIERRA-ADD] + +/// A null statement to guard against EmptyBlock lint without necessitating the use of pass() +/// Used to avoid proc-call overhead. But use sparingly. Probably pointless in most places. +#define EMPTY_BLOCK_GUARD ; diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index bb756e5c37622..46e417f7f1cf1 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -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" 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 37cb53dc05767..648fc926998c8 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -3,19 +3,20 @@ // SS_BACKGROUND handles high server load differently than Normal and SS_TICKER do. // Higher priority also means a larger share of a given tick before sleep checks. + +// [SIERRA-ADD] - SSINPUT +#define SS_PRIORITY_INPUT 1000 // Input MUST ALWAYS BE HIGHEST PRIORITY!!! + #define SS_PRIORITY_DEFAULT 50 // Default priority for all processes levels // 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. -// [SIERRA-ADD] - SSINPUT -#define SS_PRIORITY_INPUT 99 // Input things. -#define SS_PRIORITY_EXPLOSIVES 90 // Explosion processing. -// [/SIERRA-ADD] +#define SS_PRIORITY_EXPLOSIVES 90 // Explosion processing. // [/SIERRA-ADD] #define SS_PRIORITY_MOB 95 // Mob Life(). #define SS_PRIORITY_MACHINERY 95 // Machinery + powernet ticks. #define SS_PRIORITY_AIR 80 // ZAS processing. @@ -26,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/_helpers/lists.dm b/code/_helpers/lists.dm index 1da8edf278d86..dff483c6d15c4 100644 --- a/code/_helpers/lists.dm +++ b/code/_helpers/lists.dm @@ -237,13 +237,19 @@ Checks if a list has the same entries and values as an element of big. return len return null -//Pick a random element from the list and remove it from the list. -/proc/pick_n_take(list/listfrom) - if (length(listfrom) > 0) - var/picked = pick(listfrom) - listfrom -= picked - return picked - return null +/// Pick a random element from the list and remove it from the list. +/proc/pick_n_take(list/list_to_pick) + RETURN_TYPE(list_to_pick[_].type) + + var/list_length = length(list_to_pick) + if(!list_length) + return null + + var/picked_index = rand(1, list_length) + var/picked = list_to_pick[picked_index] + list_to_pick.Cut(picked_index, picked_index + 1) + + return picked /// Remove and return the last element of the list, or null. 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/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/_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/master.dm b/code/controllers/master.dm index d32f09452c1f4..b413783d35cb8 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -270,7 +270,7 @@ var/global/datum/controller/master/Master = new SS.state = SS_IDLE if (SS.flags & SS_TICKER) tickersubsystems += SS - timer += world.tick_lag * rand(1, 5) + timer += world.tick_lag * rand(0,1) SS.next_fire = timer continue diff --git a/code/controllers/subsystems/atoms.dm b/code/controllers/subsystems/atoms.dm index 84ef9e117a1dd..5470d7949eb9f 100644 --- a/code/controllers/subsystems/atoms.dm +++ b/code/controllers/subsystems/atoms.dm @@ -96,19 +96,26 @@ SUBSYSTEM_DEF(atoms) if (QDELING(atom)) bad_inits[atom_type] |= BAD_INIT_QDEL_BEFORE return TRUE + // This is handled and battle tested by dreamchecker. Limit to UNIT_TESTS just in case that ever fails. + #ifdef UNIT_TESTS var/start_tick = world.time + #endif var/hint = atom.Initialize(arglist(arguments)) + #ifdef UNIT_TESTS if (start_tick != world.time) bad_inits[atom_type] |= BAD_INIT_SLEPT + #endif var/deleted = FALSE - switch (hint) - if (INITIALIZE_HINT_NORMAL) //noop - if (INITIALIZE_HINT_LATELOAD) - if (arguments[1]) //mapload + switch(hint) + if(INITIALIZE_HINT_NORMAL) + EMPTY_BLOCK_GUARD + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload late_init_queue[atom] = arguments else atom.LateInitialize(arglist(arguments)) - if (INITIALIZE_HINT_QDEL) + if(INITIALIZE_HINT_QDEL) + atom.atom_flags |= ATOM_FLAG_INITIALIZED // never call EarlyDestroy if we return this hint qdel(atom) deleted = TRUE else 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/initialization/misc_late.dm b/code/controllers/subsystems/initialization/misc_late.dm index 27cab259e3086..75d9de9a90fa8 100644 --- a/code/controllers/subsystems/initialization/misc_late.dm +++ b/code/controllers/subsystems/initialization/misc_late.dm @@ -16,7 +16,6 @@ SUBSYSTEM_DEF(init_misc_late) var/singleton/asset_cache/asset_cache = GET_SINGLETON(/singleton/asset_cache) asset_cache.load() init_recipes() - init_xenoarch() GLOBAL_VAR_INIT(microwave_maximum_item_storage, 0) @@ -54,91 +53,3 @@ GLOBAL_LIST_EMPTY(microwave_accepts_items) /proc/cmp_microwave_recipes_by_weight_dsc(datum/microwave_recipe/a, datum/microwave_recipe/b) return a.weight - b.weight - - -GLOBAL_LIST_EMPTY(xeno_artifact_turfs) -GLOBAL_LIST_EMPTY(xeno_digsite_turfs) - -/datum/controller/subsystem/init_misc_late/proc/init_xenoarch() - var/list/queue = list() - var/list/site_turfs = list() - var/list/artifact_turfs = list() - var/datum/map/map = GLOB.using_map - if (!map) - GLOB.xeno_artifact_turfs = list() - GLOB.xeno_digsite_turfs = list() - return - var/list/banned_levels = map.admin_levels + map.escape_levels - for (var/turf/simulated/mineral/M in world) - if (!M.density) - continue - if (M.z in banned_levels) - continue - if (!M.geologic_data) - M.geologic_data = new (M) - if (!prob(0.5)) - continue - var/has_space = TRUE - for (var/turf/T as anything in site_turfs) - if (T.z != M.z) - continue - if (abs(T.x - M.x) > 3) - continue - if (abs(T.y - M.y) > 3) - continue - has_space = FALSE - break - if (!has_space) - continue - site_turfs += M - queue.Cut() - queue += M - for (var/turf/simulated/mineral/T in orange(2, M)) - if (!T.density) - continue - if (T.finds) - continue - queue += T - var/site_turf_count = rand(4, 12) - if (site_turf_count < length(queue)) - for (var/i = length(queue) - site_turf_count to 1 step -1) - var/selected = rand(1, length(queue)) - queue.Cut(selected, selected + 1) - var/site_type = get_random_digsite_type() - for (var/turf/simulated/mineral/T as anything in queue) - if (!T.finds) - var/list/finds = list() - if (prob(50)) - finds += new /datum/find (site_type, rand(10, 190)) - else if (prob(75)) - finds += new /datum/find (site_type, rand(10, 90)) - finds += new /datum/find (site_type, rand(110, 190)) - else - finds += new /datum/find (site_type, rand(10, 50)) - finds += new /datum/find (site_type, rand(60, 140)) - finds += new /datum/find (site_type, rand(150, 190)) - var/datum/find/F = finds[1] - if (F.excavation_required <= F.view_range) - T.archaeo_overlay = "overlay_archaeo[rand(1, 3)]" - T.update_icon() - T.finds = finds - if (site_type == DIGSITE_GARDEN) - continue - if (site_type == DIGSITE_ANIMAL) - continue - artifact_turfs += T - CHECK_TICK - GLOB.xeno_digsite_turfs = site_turfs - GLOB.xeno_artifact_turfs = list() - for (var/i = rand(6, 12) to 1 step -1) - var/len = length(artifact_turfs) - if (len < 1) - break - var/selected = rand(1, len) - var/turf/simulated/mineral/T = artifact_turfs[selected] - artifact_turfs.Cut(selected, selected + 1) - // Failsafe for invalid turf types - if (!istype(T)) - continue - GLOB.xeno_artifact_turfs += T - T.artifact_find = new diff --git a/code/controllers/subsystems/initialization/xenoarch.dm b/code/controllers/subsystems/initialization/xenoarch.dm new file mode 100644 index 0000000000000..06f97013ec5a8 --- /dev/null +++ b/code/controllers/subsystems/initialization/xenoarch.dm @@ -0,0 +1,85 @@ +SUBSYSTEM_DEF(xenoarch) + name = "Xenoarcheology" + flags = SS_NO_FIRE + init_order = SS_INIT_XENOARCH + var/static/list/xeno_artifact_turfs = list() + var/static/list/xeno_digsite_turfs = list() + +/datum/controller/subsystem/xenoarch/Initialize(start_uptime) + var/datum/map/map = GLOB.using_map + if (!map) + return + + var/list/artifact_turfs = list() + var/static/excavation_turf_chance = 0.5 + var/list/banned_levels = map.admin_levels + map.escape_levels + for(var/z_level_index in mining_walls) + if(text2num(z_level_index) in banned_levels) + continue + + var/list/mining_turfs = mining_walls[z_level_index] + if(!length(mining_turfs)) + continue + + for(var/turf/simulated/mineral/mineral_turf as anything in mining_turfs) + if (!mineral_turf.density) + continue + + if (!mineral_turf.geologic_data) + mineral_turf.geologic_data = new(mineral_turf) + + if(!prob(excavation_turf_chance)) + continue + + xeno_digsite_turfs += mineral_turf + var/list/possible_site_turfs = list() + for(var/turf/simulated/mineral/T in RANGE_TURFS(mineral_turf, 2)) + if(!T.density) + continue + + if(T.finds) + continue + + possible_site_turfs += T + + possible_site_turfs = shuffle(possible_site_turfs) + LIST_RESIZE(possible_site_turfs, min(rand(4, 12), length(possible_site_turfs))) + + var/site_type = get_random_digsite_type() + for(var/turf/simulated/mineral/T as anything in possible_site_turfs) + if(!T.finds) + var/list/finds = list() + if (prob(50)) + finds += new /datum/find (site_type, rand(10, 190)) + else if (prob(75)) + finds += new /datum/find (site_type, rand(10, 90)) + finds += new /datum/find (site_type, rand(110, 190)) + else + finds += new /datum/find (site_type, rand(10, 50)) + finds += new /datum/find (site_type, rand(60, 140)) + finds += new /datum/find (site_type, rand(150, 190)) + var/datum/find/F = finds[1] + if (F.excavation_required <= F.view_range) + T.archaeo_overlay = "overlay_archaeo[rand(1, 3)]" + T.update_icon() + T.finds = finds + + if(site_type == DIGSITE_GARDEN) + continue + + if(site_type == DIGSITE_ANIMAL) + continue + + artifact_turfs += T + + CHECK_TICK + + var/xeno_artifact_turfs_amount = min(rand(6, 12), length(artifact_turfs)) + for (var/i = 1 to xeno_artifact_turfs_amount) + var/turf/simulated/mineral/selected_mineral = pick_n_take(artifact_turfs) + // Failsafe for invalid turf types + if (!istype(selected_mineral)) + continue + + xeno_artifact_turfs += selected_mineral + selected_mineral.artifact_find = new diff --git a/code/controllers/subsystems/machines.dm b/code/controllers/subsystems/machines.dm index 5e790fe1d778e..e4b1642b3cec1 100644 --- a/code/controllers/subsystems/machines.dm +++ b/code/controllers/subsystems/machines.dm @@ -45,13 +45,12 @@ SUBSYSTEM_DEF(machines) var/static/cost_powernets = 0 var/static/cost_power_objects = 0 var/static/list/pipenets = list() - var/static/list/machinery = list() - var/static/list/machinery_by_type = list() var/static/list/powernets = list() var/static/list/power_objects = list() var/static/list/processing = list() var/static/list/queue = list() - + var/static/list/machinery = list() + var/static/list/machinery_by_type = list() /datum/controller/subsystem/machines/Recover() current_step = SSMACHINES_PIPENETS diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index aed6e8b0d9662..83e9de98861ca 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -25,6 +25,8 @@ SUBSYSTEM_DEF(mapping) space_ruins_templates = SSmapping.space_ruins_templates exoplanet_ruins_templates = SSmapping.exoplanet_ruins_templates away_sites_templates = SSmapping.away_sites_templates + submaps = SSmapping.submaps + submap_archetypes = SSmapping.submap_archetypes /datum/controller/subsystem/mapping/proc/preloadTemplates(path = "maps/templates/") //see master controller setup var/list/filelist = flist(path) 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/processing/nano.dm b/code/controllers/subsystems/processing/nano.dm index 0f6ebe49feb53..b9219c05cd0b6 100644 --- a/code/controllers/subsystems/processing/nano.dm +++ b/code/controllers/subsystems/processing/nano.dm @@ -75,6 +75,10 @@ PROCESSING_SUBSYSTEM_DEF(nano) */ /datum/controller/subsystem/processing/nano/proc/close_uis(src_object) . = 0 + + if (!length(open_uis)) + return + var/src_object_key = "\ref[src_object]" if (!open_uis[src_object_key]) return 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/datum.dm b/code/datums/datum.dm index 12802a594b7c6..94db78a1aed32 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -26,6 +26,10 @@ var/list/_listen_lookup /// Lazy associated list in the structure of `target -> list(signal -> proctype)` that are run when the datum receives that signal var/list/list/_signal_procs + + /// Used to avoid unnecessary refstring creation in Destroy(). + var/has_state_machine = FALSE + //[/SIERRA-ADD] // Default implementation of clean-up code. // This should be overridden to remove all references pointing to the object being destroyed. @@ -63,11 +67,12 @@ //[/SIERRA-ADD] GLOB.destroyed_event && GLOB.destroyed_event.raise_event(src) cleanup_events(src) - var/list/machines = global.state_machines["\ref[src]"] - if (length(machines)) - for (var/base_type in machines) - qdel(machines[base_type]) - global.state_machines -= "\ref[src]" + if(has_state_machine) + var/list/machines = global.state_machines["\ref[src]"] + if(length(machines)) + for(var/base_type in machines) + qdel(machines[base_type]) + global.state_machines -= "\ref[src]" if (instance_pool?.ReturnInstance(src)) return QDEL_HINT_IWILLGC instance_configurator = null 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/state_machine.dm b/code/datums/extensions/state_machine.dm index b8e80fc31d510..44099000802ec 100644 --- a/code/datums/extensions/state_machine.dm +++ b/code/datums/extensions/state_machine.dm @@ -2,7 +2,7 @@ var/global/list/state_machines = list() /proc/get_state_machine(datum/holder, base_type) - if(istype(holder) && base_type) + if(istype(holder) && base_type && holder.has_state_machine) var/list/machines = global.state_machines["\ref[holder]"] return islist(machines) && machines[base_type] @@ -19,16 +19,18 @@ var/global/list/state_machines = list() fsm_type = base_type var/datum/state_machine/machine = new fsm_type(holder) machines[base_type] = machine + holder.has_state_machine = TRUE return machine /proc/remove_state_machine(datum/holder, base_type) - if(istype(holder) && base_type) + if(istype(holder) && base_type && holder.has_state_machine) var/holder_ref = "\ref[holder]" var/list/machines = global.state_machines[holder_ref] if(length(machines)) machines -= base_type if(!length(machines)) global.state_machines -= holder_ref + holder.has_state_machine = FALSE return TRUE return FALSE @@ -43,8 +45,8 @@ var/global/list/state_machines = list() /datum/state_machine/New(datum/_holder) ..() - if(!istype(_holder)) - stack_trace("Non-datum holder supplied to [type] New().") + if(!istype(_holder, expected_type)) + stack_trace("Non-[expected_type] holder supplied to [type] New().") else holder_ref = weakref(_holder) set_state(current_state) diff --git a/code/datums/observation/moved.dm b/code/datums/observation/moved.dm index 766b7ad38b353..3516a16c8c78d 100644 --- a/code/datums/observation/moved.dm +++ b/code/datums/observation/moved.dm @@ -21,6 +21,14 @@ GLOBAL_DATUM_INIT(moved_event, /singleton/observ/moved, new) if(. && istype(mover.loc, expected_type)) register(mover.loc, mover, TYPE_PROC_REF(/atom/movable, recursive_move)) +/singleton/observ/moved/unregister(atom/movable/mover, datum/listener, proc_call) + . = ..() + + // Unregister from the parent if possible. + if(. && istype(mover.loc, expected_type)) + unregister(mover.loc, mover, TYPE_PROC_REF(/atom/movable, recursive_move)) + + /******************** * Movement Handling * ********************/ 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/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/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/area/areas.dm b/code/game/area/areas.dm index 67bd6a04aaf4f..45130f7a16444 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -54,10 +54,10 @@ A.contents.Add(T) if(old_area) old_area.Exited(T, A) - for(var/atom/movable/AM in T) + for(var/atom/movable/AM as anything in T) old_area.Exited(AM, A) // Note: this _will_ raise exited events. A.Entered(T, old_area) - for(var/atom/movable/AM in T) + for(var/atom/movable/AM as anything in T) A.Entered(AM, old_area) // Note: this will _not_ raise moved or entered events. If you change this, you must also change everything which uses them. for(var/obj/machinery/M in T) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2f2cfdef5e3ea..5457e30086b71 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -218,7 +218,7 @@ GLOB.moved_event.raise_event(src, old_loc, null) // freelook - if(opacity) + if(simulated && opacity) updateVisibility(src) // lighting @@ -244,7 +244,7 @@ GLOB.moved_event.raise_event(src, old_loc, null) // freelook - if(opacity) + if(simulated && opacity) updateVisibility(src) // lighting 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/jobs/job/job.dm b/code/game/jobs/job/job.dm index 09ef39dbb7262..3a8d33c554464 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -26,6 +26,7 @@ var/outfit_type // The outfit the employee will be dressed in, if any + var/loadout_allowed = TRUE // Whether or not loadout equipment is allowed and to be created when joining. var/list/allowed_branches // For maps using branches and ranks, also expandable for other purposes var/list/allowed_ranks // Ditto diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index 57e4f3d45aadc..e6f6037afb6a9 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -38,6 +38,10 @@ GLOBAL_LIST_INIT(machine_path_to_circuit_type, cache_circuits_by_build_path()) for(var/component_path in uncreated_component_parts) var/number = uncreated_component_parts[component_path] || 1 LAZYREMOVE(uncreated_component_parts, component_path) + // Stacks are created differently to avoid qdel churn. + if(ispath(component_path, /obj/item/stack)) + install_component(new component_path(src, number), refresh_parts = FALSE) + continue for(var/i in 1 to number) install_component(component_path, refresh_parts = FALSE) 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..6310436365206 100644 --- a/code/game/machinery/embedded_controller/airlock_program.dm +++ b/code/game/machinery/embedded_controller/airlock_program.dm @@ -252,6 +252,7 @@ cycleDoors(target_state) state = STATE_IDLE target_state = TARGET_NONE + playsound(master, 'sound/machines/airlockdone.ogg', 50) if(STATE_DEPRESSURIZE) @@ -271,6 +272,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 +285,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/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 23b1f99624145..3502bc6c8b179 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" 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/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/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/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/items.dm b/code/game/objects/items.dm index c08685765ebbd..4cabaa3a2cce4 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -165,6 +165,12 @@ return TRUE return FALSE + +/obj/item/update_icon() + ..() + update_twohanding() + + /obj/item/ex_act(severity) ..() if (get_max_health()) @@ -555,6 +561,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/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..77455ef03a83b 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -83,7 +83,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 = ..() diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 4a648dd9b0852..dfd7a898621a0 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." 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/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index be391bad2ef24..e3b15af5a9b7c 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -480,6 +480,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/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/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/structures.dm b/code/game/objects/structures.dm index 9aa8260cf6022..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()) @@ -139,7 +139,7 @@ return istype(S, src) /obj/structure/proc/refresh_neighbors() - for(var/thing in RANGE_TURFS(src, 1)) + for(var/thing as anything in RANGE_TURFS(src, 1)) var/turf/T = thing T.update_icon() 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/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..a6e62e0d104ae 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() . = ..() @@ -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/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index 5b5008c73d8d7..59c6b03d157e1 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -36,8 +36,10 @@ //How we smooth with other flooring var/decal_layer = DECAL_LAYER var/floor_smooth = SMOOTH_ALL - var/list/flooring_whitelist = list() //Smooth with nothing except the contents of this list - var/list/flooring_blacklist = list() //Smooth with everything except the contents of this list + /// Smooth with nothing except the types in this list. Turned into a typecache for performance reasons. + var/list/flooring_whitelist = list() + /// Smooth with everything except the types in this list. Turned into a typecache for performance reasons. + var/list/flooring_blacklist = list() //How we smooth with walls var/wall_smooth = SMOOTH_ALL @@ -49,6 +51,12 @@ var/height = 0 +/singleton/flooring/Initialize() + . = ..() + flooring_whitelist = typecacheof(flooring_whitelist) + flooring_blacklist = typecacheof(flooring_blacklist) + + /singleton/flooring/proc/on_remove() return diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index dd48510132432..d184e1373c660 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -8,7 +8,7 @@ var/list/resources var/thermite = 0 - initial_gas = list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN = MOLES_N2STANDARD) + initial_gas = GAS_STANDARD_AIRMIX var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to var/dirt = 0 @@ -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/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 2ceff4b48261f..6c20c815fea00 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -51,7 +51,7 @@ /turf/simulated/floor/proc/set_flooring(singleton/flooring/newflooring) make_plating(defer_icon_update = 1) flooring = newflooring - update_icon(1) + queue_icon_update(SSatoms.initialized) // only update neighbors if we're setting flooring after SSatoms has finished levelupdate() //This proc will set floor_type to null and the update_icon() proc will then change the icon_state of the turf @@ -106,7 +106,7 @@ initial_gas = null /turf/simulated/floor/shuttle_ceiling/air - initial_gas = list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN = MOLES_N2STANDARD) + initial_gas = GAS_STANDARD_AIRMIX /turf/simulated/floor/is_floor() return TRUE diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm index 0c85476e2311e..cc1023cf598e5 100644 --- a/code/game/turfs/simulated/floor_icon.dm +++ b/code/game/turfs/simulated/floor_icon.dm @@ -93,7 +93,7 @@ var/global/list/flooring_cache = list() if(update_neighbors) for(var/turf/simulated/floor/F in orange(src, 1)) F.queue_ao(FALSE) - F.update_icon() + F.queue_icon_update() /turf/simulated/floor/proc/get_flooring_overlay(cache_key, icon_base, icon_dir = 0, external = FALSE) if(!flooring_cache[cache_key]) @@ -125,50 +125,42 @@ var/global/list/flooring_cache = list() flooring_cache[cache_key] = I return flooring_cache[cache_key] -/singleton/flooring/proc/test_link(turf/origin, turf/T) +/singleton/flooring/proc/test_link(turf/origin, turf/opponent) var/is_linked = FALSE - //is_wall is true for wall turfs and for floors containing a low wall - if(T.is_wall()) - if(wall_smooth == SMOOTH_ALL) - is_linked = TRUE - - //If is_hole is true, then it's space or openspace - else if(T.is_open()) - if(space_smooth == SMOOTH_ALL) - is_linked = TRUE - - - //If we get here then its a normal floor - else if (T.is_floor()) - var/turf/simulated/floor/t = T - - //Check for window frames. - if(wall_smooth == SMOOTH_ALL) - for(var/obj/structure/wall_frame/WF in T.contents) + if(istype(origin) && istype(opponent)) + //is_wall is true for wall turfs and for floors containing a low wall + if(opponent.is_wall()) + if(wall_smooth == SMOOTH_ALL) is_linked = TRUE - //If the floor is the same as us,then we're linked, - if (istype(src, t.flooring)) - is_linked = TRUE - else if (floor_smooth == SMOOTH_ALL) - is_linked = TRUE - - else if (floor_smooth != SMOOTH_NONE) + //If is_hole is true, then it's space or openspace + else if(opponent.is_open()) + if(space_smooth == SMOOTH_ALL) + is_linked = TRUE - //If we get here it must be using a whitelist or blacklist - if (floor_smooth == SMOOTH_WHITELIST) - for (var/v in flooring_whitelist) - if (istype(t.flooring, v)) - //Found a match on the list + //If we get here then its a normal floor + else if (istype(opponent, /turf/simulated/floor)) + var/turf/simulated/floor/floor_opponent = opponent + //If the floor is the same as us,then we're linked, + if (istype(src, floor_opponent.flooring)) + is_linked = TRUE + else if (floor_smooth == SMOOTH_ALL) + is_linked = TRUE + else if (floor_smooth != SMOOTH_NONE) + //If we get here it must be using a whitelist or blacklist + if (floor_smooth == SMOOTH_WHITELIST) + if (flooring_whitelist[floor_opponent.flooring.type]) + //Found a match on the typecache is_linked = TRUE - break - else if(floor_smooth == SMOOTH_BLACKLIST) - is_linked = TRUE //Default to true for the blacklist, then make it false if a match comes up - for (var/v in flooring_whitelist) - if (istype(t.flooring, v)) - //Found a match on the list + else if(floor_smooth == SMOOTH_BLACKLIST) + is_linked = TRUE //Default to true for the blacklist, then make it false if a match comes up + if (flooring_blacklist[floor_opponent.flooring.type]) + //Found a match on the typecache is_linked = FALSE - break + //Check for window frames. + if (!is_linked && wall_smooth == SMOOTH_ALL) + if(locate(/obj/structure/wall_frame) in opponent) + is_linked = TRUE return is_linked /singleton/flooring/proc/symmetric_test_link(turf/A, turf/B) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 9c73f4d0374ba..86c5f9f4e91dc 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -65,7 +65,7 @@ return //We only need starlight on turfs adjacent to dynamically lit turfs, for example space near bulkhead - for (var/turf/T in RANGE_TURFS(src, 1)) + for (var/turf/T as anything in RANGE_TURFS(src, 1)) if (!isloc(T.loc) || !TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) continue diff --git a/code/game/turfs/turf_ao.dm b/code/game/turfs/turf_ao.dm index 34482bacb8c88..00236709e00b6 100644 --- a/code/game/turfs/turf_ao.dm +++ b/code/game/turfs/turf_ao.dm @@ -10,7 +10,7 @@ /turf/var/ao_queued = AO_UPDATE_NONE /turf/proc/regenerate_ao() - for (var/thing in RANGE_TURFS(src, 1)) + for (var/thing as anything in RANGE_TURFS(src, 1)) var/turf/T = thing if (T.permit_ao) T.queue_ao(TRUE) diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 897d5b50dcc71..02433b8096d75 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -120,7 +120,7 @@ W.rebuild_zbleed() // end of lighting stuff - for(var/turf/T in RANGE_TURFS(src, 1)) + for(var/turf/T as anything in RANGE_TURFS(src, 1)) T.update_icon() if(density != old_density) diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index d66c333e4caca..e780db8b11dc0 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -1,6 +1,6 @@ /turf/unsimulated name = "command" - initial_gas = list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN = MOLES_N2STANDARD) + initial_gas = GAS_STANDARD_AIRMIX turf_flags = TURF_DISALLOW_BLOB // the new Diona Death Prevention Feature: gives an average amount of lumination diff --git a/code/modules/ZAS/Turf.dm b/code/modules/ZAS/Turf.dm index 94f98bc4ddf3e..c7cc9a7b91cc7 100644 --- a/code/modules/ZAS/Turf.dm +++ b/code/modules/ZAS/Turf.dm @@ -5,9 +5,9 @@ /turf/var/datum/gas_mixture/air /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) - if(graphic_add && length(graphic_add)) + if(length(graphic_add)) vis_contents += graphic_add - if(graphic_remove && length(graphic_remove)) + if(length(graphic_remove)) vis_contents -= graphic_remove /turf/proc/update_air_properties() @@ -243,12 +243,21 @@ /turf/proc/assume_gas(gasid, moles, temp = 0) return 0 +var/global/list/STANDARD_AIRMIX = list( + GAS_OXYGEN = MOLES_O2STANDARD, + GAS_NITROGEN = MOLES_N2STANDARD +) + /turf/return_air() //Create gas mixture to hold data for passing var/datum/gas_mixture/GM = new if(initial_gas) - GM.gas = initial_gas.Copy() + if(initial_gas == GAS_STANDARD_AIRMIX) + GM.gas = global.STANDARD_AIRMIX.Copy() + else + GM.gas = initial_gas.Copy() + GM.temperature = temperature GM.update_values() @@ -291,7 +300,10 @@ air = new/datum/gas_mixture air.temperature = temperature if(initial_gas) - air.gas = initial_gas.Copy() + if(initial_gas == GAS_STANDARD_AIRMIX) + air.gas = global.STANDARD_AIRMIX.Copy() + else + air.gas = initial_gas.Copy() air.update_values() /turf/simulated/proc/c_copy_air() diff --git a/code/modules/ZAS/Zone.dm b/code/modules/ZAS/Zone.dm index bce130e273e0e..8dcb8d2b78f4f 100644 --- a/code/modules/ZAS/Zone.dm +++ b/code/modules/ZAS/Zone.dm @@ -58,33 +58,35 @@ Class Procs: air.group_multiplier = 1 air.volume = CELL_VOLUME -/zone/proc/add(turf/simulated/T) +/zone/proc/add(turf/simulated/turf_to_add) #ifdef ZASDBG ASSERT(!invalid) - ASSERT(istype(T)) - ASSERT(!SSair.has_valid_zone(T)) + ASSERT(istype(turf_to_add)) + ASSERT(!SSair.has_valid_zone(turf_to_add)) #endif - var/datum/gas_mixture/turf_air = T.return_air() + var/datum/gas_mixture/turf_air = turf_to_add.return_air() add_tile_air(turf_air) - T.zone = src - contents.Add(T) - if(T.hotspot) - fire_tiles.Add(T) + turf_to_add.zone = src + contents += turf_to_add + + if(turf_to_add.hotspot) + fire_tiles += turf_to_add SSair.active_fire_zones |= src - T.update_graphic(air.graphic) -/zone/proc/remove(turf/simulated/T) + turf_to_add.update_graphic(air.graphic) + +/zone/proc/remove(turf/simulated/turf_to_remove) #ifdef ZASDBG ASSERT(!invalid) - ASSERT(istype(T)) - ASSERT(T.zone == src) - soft_assert(T in contents, "Lists are weird broseph") + ASSERT(istype(turf_to_remove)) + ASSERT(turf_to_remove.zone == src) + soft_assert(turf_to_remove in contents, "Lists are weird broseph") #endif - contents.Remove(T) - fire_tiles.Remove(T) - T.zone = null - T.update_graphic(graphic_remove = air.graphic) + contents -= turf_to_remove + fire_tiles -= turf_to_remove + turf_to_remove.zone = null + turf_to_remove.update_graphic(graphic_remove = air.graphic) if(length(contents)) air.group_multiplier = length(contents) else @@ -98,45 +100,45 @@ Class Procs: ASSERT(!into.invalid) #endif c_invalidate() - for(var/turf/simulated/T in contents) - into.add(T) - T.update_graphic(graphic_remove = air.graphic) + for(var/turf/simulated/inner_turf in contents) + into.add(inner_turf) + inner_turf.update_graphic(graphic_remove = air.graphic) #ifdef ZASDBG - T.dbg(merged) - #endif + inner_turf.dbg(merged) CHECK_TICK + #endif //rebuild the old zone's edges so that they will be possessed by the new zone - for(var/connection_edge/E in edges) - if(E.contains_zone(into)) + for(var/connection_edge/edge in edges) + if(edge.contains_zone(into)) continue //don't need to rebuild this edge - for(var/turf/T in E.connecting_turfs) - SSair.mark_for_update(T) + + for(var/turf/connecting_turf in edge.connecting_turfs) + SSair.mark_for_update(connecting_turf) /zone/proc/c_invalidate() - invalid = 1 + invalid = TRUE SSair.remove_zone(src) #ifdef ZASDBG - for(var/turf/simulated/T in contents) - T.dbg(invalid_zone) + for(var/turf/simulated/inner_turf in contents) + inner_turf.dbg(invalid_zone) #endif /zone/proc/rebuild() if(invalid) return //Short circuit for explosions where rebuild is called many times over. c_invalidate() - for(var/turf/simulated/T in contents) - T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt - //T.dbg(invalid_zone) - T.needs_air_update = 0 //Reset the marker so that it will be added to the list. - SSair.mark_for_update(T) + for(var/turf/simulated/inner_turf in contents) + inner_turf.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt + inner_turf.needs_air_update = FALSE //Reset the marker so that it will be added to the list. + SSair.mark_for_update(inner_turf) /zone/proc/add_tile_air(datum/gas_mixture/tile_air) //air.volume += CELL_VOLUME air.group_multiplier = 1 air.multiply(length(contents)) air.merge(tile_air) - air.divide(length(contents)+1) - air.group_multiplier = length(contents)+1 + air.divide(length(contents) + 1) + air.group_multiplier = length(contents) + 1 /zone/proc/tick() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index f953c7baaa02e..f1cc03276b3e1 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -147,6 +147,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 +215,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..4dea5b57b3055 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -44,6 +44,8 @@ + + @@ -154,7 +156,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 +166,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..1c623573bde20 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 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/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/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..54b0a1052749e 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 @@ -387,10 +387,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/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index f4f0b37effdcd..dfe9b8aec6fa1 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -167,6 +167,9 @@ bad_message = "\[SPECIES RESTRICTED]" else if(!S.check_background(job, user.client.prefs)) bad_message = "\[BACKGROUND RESTRICTED]" + else if(GAME_STATE == RUNLEVEL_GAME) + if(job.late_joinable == FALSE) + bad_message = "\[LATEJOIN RESTRICTED]" var/current_level = JOB_LEVEL_NEVER if(pref.job_high == job.title) 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/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/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/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 45d1eb3045a5d..6cc1c05a83613 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -87,6 +87,9 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, // So we'll have this hardcode instead. var/turf/T + // This is to resolve the proper diagonal direction relative to the corner position for mimiced turfs. + var/Tc + // Diagonal one is easy. T = get_step(new_turf, diagonal) @@ -102,24 +105,26 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, // Now the horizontal one. T = get_step(new_turf, horizontal) + Tc = t1.x + (horizontal == EAST ? 1 : -1) if (T) // Ditto. if (!T.corners) T.corners = new(4) t3 = T - t3i = REVERSE_LIGHTING_CORNER_DIAGONAL[((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH)] // Get the dir based on coordinates. + t3i = REVERSE_LIGHTING_CORNER_DIAGONAL[((Tc > x) ? EAST : WEST) | ((t1.y > y) ? NORTH : SOUTH)] // Get the dir based on coordinates. T.corners[t3i] = src if (TURF_IS_AMBIENT_LIT_UNSAFE(T)) has_ambience = TRUE // And finally the vertical one. T = get_step(new_turf, vertical) + Tc = t1.y + (vertical == NORTH ? 1 : -1) if (T) if (!T.corners) T.corners = new(4) t4 = T - t4i = REVERSE_LIGHTING_CORNER_DIAGONAL[((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH)] // Get the dir based on coordinates. + t4i = REVERSE_LIGHTING_CORNER_DIAGONAL[((t1.x > x) ? EAST : WEST) | ((Tc > y) ? NORTH : SOUTH)] // Get the dir based on coordinates. T.corners[t4i] = src if (TURF_IS_AMBIENT_LIT_UNSAFE(T)) has_ambience = TRUE @@ -308,28 +313,33 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, var/turf/T var/Ti - if (t1) + if (t1 && (t1.below || HasBelow(t1.z)) && (t1.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(t1)) T = t1 Ti = t1i - else if (t2) + else if (t2 && (t2.below || HasBelow(t2.z)) && (t2.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(t2)) T = t2 Ti = t2i - else if (t3) + else if (t3 && (t3.below || HasBelow(t3.z)) && (t3.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(t3)) T = t3 Ti = t3i - else if (t4) + else if (t4 && (t4.below || HasBelow(t4.z)) && (t4.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(t4)) T = t4 Ti = t4i + // No MZ candidates below, just update. + else if (needs_update || skip_update) + return + else - // This should be impossible to reach -- how do we exist without at least one master turf? - CRASH("Corner has no masters!") + // Always queue for this, not important enough to hit the synchronous path. + needs_update = TRUE + SSlighting.corner_queue += src + return var/datum/lighting_corner/below = src - var/turf/lasT // We init before Z-Mimic, cannot rely on above/below. - while ((lasT = T) && (T = T.below || GET_BELOW(T)) && (lasT.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) + while ((T = GET_BELOW(T)) && ((below.t1?.z_flags | below.t2?.z_flags | below.t3?.z_flags | below.t4?.z_flags) & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) T.ambient_has_indirect = TRUE if (!T.corners || !T.corners[Ti]) 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_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/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/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 7a41280f9c118..41a946580e23b 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -41,16 +41,13 @@ var/global/list/mining_floors = list() /turf/simulated/mineral/Initialize() . = ..() - if (!mining_walls["[src.z]"]) - mining_walls["[src.z]"] = list() - mining_walls["[src.z]"] += src + LAZYADDASSOCLIST(mining_walls, "[z]", src) MineralSpread() update_icon(1) /turf/simulated/mineral/Destroy() - if (mining_walls["[src.z]"]) - mining_walls["[src.z]"] -= src - GLOB.xeno_artifact_turfs -= src + LAZYREMOVEASSOC(mining_walls, "[z]", src) + SSxenoarch.xeno_artifact_turfs -= src return ..() /turf/simulated/mineral/can_build_cable() @@ -423,15 +420,12 @@ var/global/list/mining_floors = list() /turf/simulated/floor/asteroid/Initialize() . = ..() - if (!mining_floors["[src.z]"]) - mining_floors["[src.z]"] = list() - mining_floors["[src.z]"] += src + LAZYADDASSOCLIST(mining_floors, "[z]", src) if(prob(20)) overlay_detail = "asteroid[rand(0,9)]" /turf/simulated/floor/asteroid/Destroy() - if (mining_floors["[src.z]"]) - mining_floors["[src.z]"] -= src + LAZYREMOVEASSOC(mining_floors, "[z]", src) return ..() /turf/simulated/floor/asteroid/ex_act(severity) 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/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/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 451db3156ef38..723584fd49958 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -386,6 +386,10 @@ if(now_pushing || !yes) 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/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/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/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/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/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 13d64e4fe1d8c..ea18cf42b6ceb 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -229,6 +229,10 @@ /mob/new_player/proc/AttemptLateSpawn(datum/job/job, spawning_at) + if(GAME_STATE == RUNLEVEL_GAME) + if(job.late_joinable == FALSE) + to_chat(usr, SPAN_WARNING("Вы не можете зайти за эту роль во время раунда.")) + return 0 if(src != usr) return 0 if(GAME_STATE != RUNLEVEL_GAME) diff --git a/code/modules/mob/skills/skill.dm b/code/modules/mob/skills/skill.dm index 307407d401360..cf9b7a63ed44d 100644 --- a/code/modules/mob/skills/skill.dm +++ b/code/modules/mob/skills/skill.dm @@ -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/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/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/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/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..53fed779d90e3 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() 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/exoplanets/random_map.dm b/code/modules/overmap/exoplanets/random_map.dm index 77b9f07f7db7a..75e5f44eeb9b2 100644 --- a/code/modules/overmap/exoplanets/random_map.dm +++ b/code/modules/overmap/exoplanets/random_map.dm @@ -93,7 +93,7 @@ /datum/random_map/noise/exoplanet/proc/spawn_flora(turf/T, big) if (big) new /obj/landmark/exoplanet_spawn/large_plant(T) - for(var/turf/neighbor in RANGE_TURFS(T, 1)) + for(var/turf/neighbor as anything in RANGE_TURFS(T, 1)) spawn_grass(neighbor) else new /obj/landmark/exoplanet_spawn/plant(T) 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/ship.dm b/code/modules/overmap/ships/computers/ship.dm index 26aa9af73b794..debe3596b5ea7 100644 --- a/code/modules/overmap/ships/computers/ship.dm +++ b/code/modules/overmap/ships/computers/ship.dm @@ -126,5 +126,5 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov for(var/weakref/W in viewers) var/M = W.resolve() if (M) - unlook(M) + invoke_async(PROC_REF(unlook), M) . = ..() 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/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/power/cable_structure.dm b/code/modules/power/cable_structure.dm index ad3a4327b9d07..a7da6f4e0f0c2 100644 --- a/code/modules/power/cable_structure.dm +++ b/code/modules/power/cable_structure.dm @@ -361,7 +361,7 @@ By design, d1 is the smallest direction and d2 is the highest ////////////////////////////////////////////// //if powernetless_only = 1, will only get connections without powernet -/obj/structure/cable/proc/get_connections(powernetless_only = 0) +/obj/structure/cable/proc/get_cable_connections(skip_assigned_powernets = FALSE) . = list() // this will be a list of all connected power objects var/turf/T @@ -389,17 +389,23 @@ By design, d1 is the smallest direction and d2 is the highest if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) // if either of C's d1 and d2 match either of ours . += C + // if asked, skip any cables with powernts + if(skip_assigned_powernets) + for(var/obj/structure/cable/C in .) + if(C.powernet) + . -= C + +/obj/structure/cable/proc/get_machine_connections(skip_assigned_powernets = FALSE) + . = list() // this will be a list of all connected power objects + if(d1 == 0) for(var/obj/machinery/power/P in loc) if(P.powernet == 0) continue // exclude APCs with powernet=0 - if(!powernetless_only || !P.powernet) + if(!skip_assigned_powernets || !P.powernet) . += P - // if the caller asked for powernetless cables only, dump the ones with powernets - if(powernetless_only) - for(var/obj/structure/cable/C in .) - if(C.powernet) - . -= C +/obj/structure/cable/proc/get_connections(skip_assigned_powernets = FALSE) + return get_cable_connections(skip_assigned_powernets) + get_machine_connections(skip_assigned_powernets) //should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf. //needed as this can, unlike other placements, disconnect cables 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/power.dm b/code/modules/power/power.dm index 5627b7129e43e..7fd8c10eed3be 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -196,31 +196,25 @@ return . //remove the old powernet and replace it with a new one throughout the network. -/proc/propagate_network(obj/O, datum/powernet/PN) +/proc/propagate_network(obj/structure/cable/cable, datum/powernet/PN) //to_world_log("propagating new network") - var/list/worklist = list() + var/list/cables = list() var/list/found_machines = list() var/index = 1 - var/obj/P = null + var/obj/structure/cable/working_cable = null - worklist+=O //start propagating from the passed object - - while(index<=length(worklist)) //until we've exhausted all power objects - P = worklist[index] //get the next power object found + // add the first cable to the list + cables[cable] = TRUE // associative list for speedy deduplication + while(index <= length(cables)) //until we've exhausted all power objects + working_cable = cables[index] //get the next power object found index++ - if( istype(P,/obj/structure/cable)) - var/obj/structure/cable/C = P - if(C.powernet != PN) //add it to the powernet, if it isn't already there - PN.add_cable(C) - worklist |= C.get_connections() //get adjacents power objects, with or without a powernet - - else if(P.anchored && istype(P,/obj/machinery/power)) - var/obj/machinery/power/M = P - found_machines |= M //we wait until the powernet is fully propagates to connect the machines + for(var/new_cable in working_cable.get_cable_connections()) //get adjacent cables, with or without a powernet + cables[new_cable] = TRUE - else - continue + for(var/obj/structure/cable/cable_entry in cables) + PN.add_cable(cable_entry) + found_machines += cable_entry.get_machine_connections() //now that the powernet is set, connect found machines to it for(var/obj/machinery/power/PM in found_machines) 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/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/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/projectile.dm b/code/modules/projectiles/projectile.dm index b5d833f685e1b..4fabeb561a7f0 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 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-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/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index fcb3c076a9c99..d818de5a1f863 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -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 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/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 429a0698d58db..c7158d2d0fc8a 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -220,10 +220,12 @@ update_icon() // find any switches with same id as this one, and set their positions to match us - for(var/obj/machinery/conveyor_switch/S in world) - if(S.id == src.id) - S.position = position - S.update_icon() + for(var/obj/machinery/conveyor_switch/other_switch as anything in SSmachines.get_machinery_of_type(/obj/machinery/conveyor_switch)) + if(other_switch.id != id) + continue + + other_switch.position = position + other_switch.update_icon() return TRUE /obj/machinery/conveyor_switch/proc/do_switch(mob/user) 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..0a31337de38cd 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -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) 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/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm index 1c03574c19599..6f012352fdb22 100644 --- a/code/modules/xenoarcheaology/sampling.dm +++ b/code/modules/xenoarcheaology/sampling.dm @@ -70,14 +70,14 @@ artifact_distance = rand() artifact_id = container.artifact_find.artifact_id else - for (var/turf/simulated/mineral/T as anything in GLOB.xeno_artifact_turfs) + for (var/turf/simulated/mineral/T as anything in SSxenoarch.xeno_artifact_turfs) if(T.artifact_find) var/cur_dist = get_dist(container, T) * 2 if( (artifact_distance < 0 || cur_dist < artifact_distance)) artifact_distance = cur_dist + rand() * 2 - 1 artifact_id = T.artifact_find.artifact_id else - GLOB.xeno_artifact_turfs -= T + SSxenoarch.xeno_artifact_turfs -= T /obj/item/device/core_sampler name = "core sampler" diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 8d2a4a1dedc79..e8e3a335728e8 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -57,7 +57,7 @@ var/nearestSimpleTargetDist = -1 var/turf/cur_turf = get_turf(src) - for (var/turf/simulated/mineral/T as anything in GLOB.xeno_artifact_turfs) + for (var/turf/simulated/mineral/T as anything in SSxenoarch.xeno_artifact_turfs) if(T.density && T.artifact_find) if(T.z == cur_turf.z) var/cur_dist = get_dist(cur_turf, T) * 2 @@ -65,16 +65,16 @@ nearestTargetDist = cur_dist + rand() * 2 - 1 nearestTargetId = T.artifact_find.artifact_id else - GLOB.xeno_artifact_turfs -= T + SSxenoarch.xeno_artifact_turfs -= T - for(var/turf/simulated/mineral/T as anything in GLOB.xeno_digsite_turfs) + for(var/turf/simulated/mineral/T as anything in SSxenoarch.xeno_artifact_turfs) if(T.density && T.finds && length(T.finds)) if(T.z == cur_turf.z) var/cur_dist = get_dist(cur_turf, T) * 2 if(nearestSimpleTargetDist < 0 || cur_dist < nearestSimpleTargetDist) nearestSimpleTargetDist = cur_dist + rand() * 2 - 1 else - GLOB.xeno_digsite_turfs -= T + SSxenoarch.xeno_digsite_turfs -= T if(nearestTargetDist >= 0) to_chat(user, SPAN_NOTICE("Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]")) diff --git a/code/modules/xgm/xgm_gas_data.dm b/code/modules/xgm/xgm_gas_data.dm index 85dd1adffd7db..dd08dd01e2e51 100644 --- a/code/modules/xgm/xgm_gas_data.dm +++ b/code/modules/xgm/xgm_gas_data.dm @@ -54,7 +54,7 @@ var/global/datum/xgm_gas_data/gas_data /hook/startup/proc/generateGasData() gas_data = new - for(var/p in (typesof(/singleton/xgm_gas) - /singleton/xgm_gas)) + for(var/p in (subtypesof(/singleton/xgm_gas))) var/singleton/xgm_gas/gas = new p //avoid initial() because of potential New() actions if(gas.id in gas_data.gases) diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index 62435d5cb39db..20d08ffb604e7 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -91,12 +91,12 @@ if(!giver) return - if(abs(temperature-giver.temperature)>MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + if(abs(temperature-giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/self_heat_capacity = heat_capacity() var/giver_heat_capacity = giver.heat_capacity() var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity if(combined_heat_capacity != 0) - temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity + temperature = (giver.temperature * giver_heat_capacity + temperature*self_heat_capacity) / combined_heat_capacity if((group_multiplier != 1)||(giver.group_multiplier != 1)) for(var/g in giver.gas) @@ -346,60 +346,73 @@ //Rechecks the gas_mixture and adjusts the graphic list if needed. //Two lists can be passed by reference if you need know specifically which graphics were added and removed. /datum/gas_mixture/proc/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null) - for(var/obj/gas_overlay/O in graphic) - if(istype(O, /obj/gas_overlay/heat)) + for(var/obj/gas_overlay/gas_overlay in graphic) + if(istype(gas_overlay, /obj/gas_overlay/heat)) continue - if(istype(O, /obj/gas_overlay/cold)) + + if(istype(gas_overlay, /obj/gas_overlay/cold)) continue - if(gas[O.gas_id] <= gas_data.overlay_limit[O.gas_id]) - LAZYADD(graphic_remove, O) - for(var/g in gas_data.overlay_limit) + + if(gas[gas_overlay.gas_id] <= gas_data.overlay_limit[gas_overlay.gas_id]) + LAZYADD(graphic_remove, gas_overlay) + + var/should_generate_temp_overlay = FALSE + for(var/gas_id in gas_data.overlay_limit) //Overlay isn't applied for this gas, check if it's valid and needs to be added. - if(gas[g] > gas_data.overlay_limit[g]) - var/tile_overlay = get_tile_overlay(g) + if(gas[gas_id] > gas_data.overlay_limit[gas_id]) + should_generate_temp_overlay = TRUE + var/tile_overlay = get_tile_overlay(gas_id) if(!(tile_overlay in graphic)) LAZYADD(graphic_add, tile_overlay) - . = 0 - - var/heat_overlay = get_tile_overlay(GAS_HEAT) - //If it's hot add something - if(temperature >= CARBON_LIFEFORM_FIRE_RESISTANCE) - if(!(heat_overlay in graphic)) - LAZYADD(graphic_add, heat_overlay) - else if (heat_overlay in graphic) - LAZYADD(graphic_remove, heat_overlay) - - var/cold_overlay = get_tile_overlay(GAS_COLD) - if(temperature <= FOGGING_TEMPERATURE && (return_pressure() >= (ONE_ATMOSPHERE / 4))) - if(!(cold_overlay in graphic)) - LAZYADD(graphic_add, cold_overlay) - else if (cold_overlay in graphic) - LAZYADD(graphic_remove, cold_overlay) + . = FALSE + + if(should_generate_temp_overlay) + var/heat_overlay = get_tile_overlay(GAS_HEAT) + //If it's hot add something + if(temperature >= CARBON_LIFEFORM_FIRE_RESISTANCE) + if(!(heat_overlay in graphic)) + LAZYADD(graphic_add, heat_overlay) + else if (heat_overlay in graphic) + LAZYADD(graphic_remove, heat_overlay) + + var/cold_overlay = get_tile_overlay(GAS_COLD) + if(temperature <= FOGGING_TEMPERATURE && (return_pressure() >= (ONE_ATMOSPHERE / 4))) + if(!(cold_overlay in graphic)) + LAZYADD(graphic_add, cold_overlay) + else if (cold_overlay in graphic) + LAZYADD(graphic_remove, cold_overlay) //Apply changes if(graphic_add && length(graphic_add)) graphic |= graphic_add - . = 1 + . = TRUE + if(graphic_remove && length(graphic_remove)) graphic -= graphic_remove - . = 1 - if(length(graphic)) - var/pressure_mod = clamp(return_pressure() / ONE_ATMOSPHERE, 0, 2) - for(var/obj/gas_overlay/O in graphic) - if(istype(O, /obj/gas_overlay/heat)) //Heat based - var/new_alpha = clamp(max(125, 255 * ((temperature - CARBON_LIFEFORM_FIRE_RESISTANCE) / CARBON_LIFEFORM_FIRE_RESISTANCE * 4)), 125, 255) - if(new_alpha != O.alpha) - O.update_alpha_animation(new_alpha) - continue - if(istype(O, /obj/gas_overlay/cold)) - var/new_alpha = clamp(max(125, 200 * (1 - ((temperature - MAX_FOG_TEMPERATURE) / (FOGGING_TEMPERATURE - MAX_FOG_TEMPERATURE)))), 125, 200) - if(new_alpha != O.alpha) - O.update_alpha_animation(new_alpha) - continue - var/concentration_mod = clamp(gas[O.gas_id] / total_moles, 0.1, 1) - var/new_alpha = min(230, round(pressure_mod * concentration_mod * 180, 5)) - if(new_alpha != O.alpha) - O.update_alpha_animation(new_alpha) + . = TRUE + + if(!length(graphic)) + return . + + var/pressure_mod = clamp(return_pressure() / ONE_ATMOSPHERE, 0, 2) + for(var/obj/gas_overlay/overlay in graphic) + if(istype(overlay, /obj/gas_overlay/heat)) //Heat based + var/new_alpha = clamp(max(125, 255 * ((temperature - CARBON_LIFEFORM_FIRE_RESISTANCE) / CARBON_LIFEFORM_FIRE_RESISTANCE * 4)), 125, 255) + if(new_alpha != overlay.alpha) + overlay.update_alpha_animation(new_alpha) + continue + + if(istype(overlay, /obj/gas_overlay/cold)) + var/new_alpha = clamp(max(125, 200 * (1 - ((temperature - MAX_FOG_TEMPERATURE) / (FOGGING_TEMPERATURE - MAX_FOG_TEMPERATURE)))), 125, 200) + if(new_alpha != overlay.alpha) + overlay.update_alpha_animation(new_alpha) + continue + + var/concentration_mod = clamp(gas[overlay.gas_id] / total_moles, 0.1, 1) + var/new_alpha = min(230, round(pressure_mod * concentration_mod * 180, 5)) + if(new_alpha != overlay.alpha) + overlay.update_alpha_animation(new_alpha) + /datum/gas_mixture/proc/get_tile_overlay(gas_id) if(!LAZYACCESS(tile_overlay_cache, gas_id)) 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/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..33b2e4c6cf3d7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,317 @@

Sierra SS13

-->
+

23.11 - 2024

+

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

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

22.11 - 2024

+

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

+
+
Изменена форма снабжения 32
+
Добавил зарядник боргов на ГУП
+
+

Обновления 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.
+
+ +

19.11 - 2024

+

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

+
+
Теперь введение крови в золотое ядро спаунит злого моба.
+
Теперь введение крови в лазурное ядро спаунит зелье возрождения слизня.
+
+ +

16.11 - 2024

+

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

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

14.11 - 2024

+

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

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

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

+
+
Добавил отображение заблокированного хранилища скафандров
+
+

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

+
+
Добавил звуки для аирлоков
+
Increases large map loading speed
+
Добавил face direction по нажатию иконки интента движения с зажатым ctrl
+
+ +

13.11 - 2024

+

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

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

12.11 - 2024

+

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

+
+
Больше нельзя получить галлюцинации от суперматерии при активных мезонных очках
+
+ +

11.11 - 2024

+

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

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

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

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

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

+
+
Задник космоса не становится серым из-за летающих островов
+
Текст эндраунда мода аномалий не жирный
+
+

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

+
+
Переименовал спавнеры безбилетников
+
+ +

10.11 - 2024

+

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

+
+
Радио при событии пси сигнала больше не должно воздействовать через стены
+
+

Обновления 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:

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

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

+
+
Corrected Masculinity.
+
+

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

+
+
Tornakov took a marker to his poster.
+
+ +

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.
+
+ +

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.
+
+ +

05.11 - 2024

+

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

+
+
Убрался за собой
+
+ +

04.11 - 2024

+

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

+
+
Добавлена кнопка add trait в создание персонажа. Сейчас там есть опции только для регенерации Унати.
+
+

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

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

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

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

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

+
+
Экран меха обновляется при переключении Power, выключении от перегрева, при выбивании сенсора.
+
Если у меха выбита грудь, то раз в 20-40 секунд мех получает полный перегрев.
+
+ +

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:

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

23.10 - 2024

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

@@ -216,78 +527,6 @@

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

Кислота вновь очень больно обжигает, как было раньше
- -

19.09 - 2024

-

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

-
-
Пофиксил лодаут ниндзи, так-же удалил костыль.
-
Портировал букеты в билд
-
- -

16.09 - 2024

-

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

-
-
Портировано отображение для скана контактов у сенсоров
-
Портирована экстренная кнопка бедствия
-
- -

15.09 - 2024

-

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

-
-
Выдал детекторы для ЭК
-
- -

14.09 - 2024

-

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

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

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

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

11.09 - 2024

-

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

-
-
Удалил трэйси
-
Портирован халат робототехника с инфинити.
-
- -

06.09 - 2024

-

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

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

04.09 - 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.
-
-

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

-
-
you can now select photographs in loadout with changeable descriptions
-
- -

01.09 - 2024

-

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

-
-
Возвращает map_upload
-
Icons by Icons8
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 03c83d1fd9566..83160c0aa0300 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -25707,3 +25707,567 @@ 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" diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2708.yml b/html/changelogs/AutoChangeLog-sierra-pr-2708.yml new file mode 100644 index 0000000000000..ec8f4edbeda21 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2708.yml @@ -0,0 +1,5 @@ +author: Mucker +changes: + - {bugfix: Shuttle control consoles will once again reconnect to their shuttle if + dismantled and rebuilt.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2722.yml b/html/changelogs/AutoChangeLog-sierra-pr-2722.yml new file mode 100644 index 0000000000000..2b0bb8eef871e --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2722.yml @@ -0,0 +1,5 @@ +author: The_Spanish_1nquisition +changes: + - {rscdel: Removed outdated event related memos} + - {rscadd: Added new event related (and other) memos} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2723.yml b/html/changelogs/AutoChangeLog-sierra-pr-2723.yml new file mode 100644 index 0000000000000..fd6c1670b7d99 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2723.yml @@ -0,0 +1,5 @@ +author: Spookerton +changes: + - {admin: Atom overlays and underlays no longer incorrectly appear modifiable via + VV.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2731.yml b/html/changelogs/AutoChangeLog-sierra-pr-2731.yml new file mode 100644 index 0000000000000..8bf8f8a41fcb0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2731.yml @@ -0,0 +1,4 @@ +author: Mucker +changes: + - {admin: Added logging of computer commands to the Secrets 'Investigation' menu.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2733.yml b/html/changelogs/AutoChangeLog-sierra-pr-2733.yml new file mode 100644 index 0000000000000..a47697c730213 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2733.yml @@ -0,0 +1,4 @@ +author: Qlonever +changes: + - {bugfix: Toggling fullscreen no longer adds a line of empty space to the window.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2734.yml b/html/changelogs/AutoChangeLog-sierra-pr-2734.yml new file mode 100644 index 0000000000000..1c96e5fdac511 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2734.yml @@ -0,0 +1,4 @@ +author: Sbotkin +changes: + - {tweak: Fleet сhaplains can be unskilled in small arms now.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2745.yml b/html/changelogs/AutoChangeLog-sierra-pr-2745.yml new file mode 100644 index 0000000000000..b049bf6a35ef6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2745.yml @@ -0,0 +1,6 @@ +author: Hubblenaut +changes: + - {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.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2746.yml b/html/changelogs/AutoChangeLog-sierra-pr-2746.yml new file mode 100644 index 0000000000000..d140df48b96f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2746.yml @@ -0,0 +1,4 @@ +author: Hubblenaut +changes: + - {imageadd: 'New sprites for grey, white and dark floor and mono floor tiles'} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2748.yml b/html/changelogs/AutoChangeLog-sierra-pr-2748.yml new file mode 100644 index 0000000000000..66371d4abd984 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2748.yml @@ -0,0 +1,7 @@ +author: Sbotkin +changes: + - {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.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2750.yml b/html/changelogs/AutoChangeLog-sierra-pr-2750.yml new file mode 100644 index 0000000000000..a7d91747643cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2750.yml @@ -0,0 +1,4 @@ +author: Hubblenaut +changes: + - {rscadd: Adds headpats. Aim for the head when performing a hug.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2751.yml b/html/changelogs/AutoChangeLog-sierra-pr-2751.yml new file mode 100644 index 0000000000000..3108264574475 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2751.yml @@ -0,0 +1,7 @@ +author: JuneauQT +changes: + - {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.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2753.yml b/html/changelogs/AutoChangeLog-sierra-pr-2753.yml new file mode 100644 index 0000000000000..4b52a3fc1f21a --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2753.yml @@ -0,0 +1,5 @@ +author: JuneauQT +changes: + - {bugfix: 'Shrouded, Chlorine, and Volcanic exoplanet clouds now generate the way + they were intended to instead of being solid black'} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2757.yml b/html/changelogs/AutoChangeLog-sierra-pr-2757.yml new file mode 100644 index 0000000000000..468b531acd8ec --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2757.yml @@ -0,0 +1,5 @@ +author: Merlin1230 +changes: + - {bugfix: Chairs and beds return their construction cost when deconstructed} + - {tweak: Padded chairs now only cost 1 sheet to make} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2760.yml b/html/changelogs/AutoChangeLog-sierra-pr-2760.yml new file mode 100644 index 0000000000000..440619de56a19 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2760.yml @@ -0,0 +1,7 @@ +author: SierraKomodo +changes: + - {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).'} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2766.yml b/html/changelogs/AutoChangeLog-sierra-pr-2766.yml new file mode 100644 index 0000000000000..d3bfb01725d5e --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2766.yml @@ -0,0 +1,5 @@ +author: SierraKomodo +changes: + - {tweak: Colors and styles used for various injury states when examining carbon + mobs have been individually tweaked. Injuries are now red again.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2767.yml b/html/changelogs/AutoChangeLog-sierra-pr-2767.yml new file mode 100644 index 0000000000000..d74d0db95c204 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2767.yml @@ -0,0 +1,5 @@ +author: SierraKomodo +changes: + - {tweak: Firing a gun now uses the same red text style for the user as is used + for observers.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2768.yml b/html/changelogs/AutoChangeLog-sierra-pr-2768.yml new file mode 100644 index 0000000000000..9f2efe3ae21f4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2768.yml @@ -0,0 +1,5 @@ +author: SierraKomodo +changes: + - {tweak: Chat messages for buckling and unbuckling are now blue instead of OH GOD + OH FUCK RED.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2783.yml b/html/changelogs/AutoChangeLog-sierra-pr-2783.yml new file mode 100644 index 0000000000000..7910590b8344d --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2783.yml @@ -0,0 +1,4 @@ +author: Ryan180602 +changes: + - {tweak: Hyperzine now reacts negatively with opiates} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2784.yml b/html/changelogs/AutoChangeLog-sierra-pr-2784.yml new file mode 100644 index 0000000000000..62d43b2b13caf --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2784.yml @@ -0,0 +1,6 @@ +author: Sbotkin +changes: + - {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.} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2790.yml b/html/changelogs/AutoChangeLog-sierra-pr-2790.yml new file mode 100644 index 0000000000000..aa03af8150717 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2790.yml @@ -0,0 +1,5 @@ +author: Merlin1230 +changes: + - {bugfix: Makeshift splints are now fixed and can be made again by applying tape + to a rod} +delete-after: true diff --git a/html/changelogs/HeyBanditoz-fix-newscaster-images.yml b/html/changelogs/HeyBanditoz-fix-newscaster-images.yml new file mode 100644 index 0000000000000..6ab7712693863 --- /dev/null +++ b/html/changelogs/HeyBanditoz-fix-newscaster-images.yml @@ -0,0 +1,4 @@ +author: Banditoz +delete-after: True +changes: + - bugfix: "Fixed images in newscaster articles not showing up if the channel has special symbols in its title." diff --git a/html/changelogs/legion_event_2_caled.yml b/html/changelogs/legion_event_2_caled.yml new file mode 100644 index 0000000000000..a603738688413 --- /dev/null +++ b/html/changelogs/legion_event_2_caled.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# admin +################################# + +# Your name. +author: caledfwlchschime + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - soundadd: "Added sound effects for legion voices." diff --git a/html/changelogs/legion_event_2_sierrakomodo.yml b/html/changelogs/legion_event_2_sierrakomodo.yml new file mode 100644 index 0000000000000..7ed8be5d799c9 --- /dev/null +++ b/html/changelogs/legion_event_2_sierrakomodo.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# admin +################################# + +# Your name. +author: SierraKomodo + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added additional lines to the list of options for legion broadcasts." diff --git a/html/changelogs/legion_event_2_spookerton.yml b/html/changelogs/legion_event_2_spookerton.yml new file mode 100644 index 0000000000000..f0df6d0de0734 --- /dev/null +++ b/html/changelogs/legion_event_2_spookerton.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# admin +################################# + +# Your name. +author: Spookerton + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - soundadd: "New sounds for legion warp in effects." 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/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/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/maps/antag_spawn/mercenary/mercenary_base.dmm b/maps/antag_spawn/mercenary/mercenary_base.dmm index 31142028162bd..39396c0e5fabe 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{ @@ -2489,6 +2655,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 +2832,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 +2920,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 +2963,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 +3061,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 +3088,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 +3173,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 +3222,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 +3252,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 +3325,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 +3355,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 +3380,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 +3400,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 +3436,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 +3491,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 +3571,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 +3597,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 +5433,10 @@ AF AF AF AF +AF +AF +AF +AF cC cC cC @@ -5067,10 +5471,6 @@ aa aa aa aa -aa -aa -aa -aa "} (19,1,1) = {" aa @@ -5132,11 +5532,15 @@ AF AF AF AF +xc +vC +xc +AF zC CQ Bh By -wM +bz AN aa aa @@ -5169,10 +5573,6 @@ aa aa aa aa -aa -aa -aa -aa "} (20,1,1) = {" aa @@ -5235,15 +5635,15 @@ kW AF xt zW +lS +UB +aw +wM aw ax BK lz -cC -aa -aa -aa -aa +sx aa aa aa @@ -5336,11 +5736,15 @@ mt pV AF qj -rL +aw AO Ak -ay +qQ ym +Bq +BN +ay +vz AN aa aa @@ -5373,10 +5777,6 @@ aa aa aa aa -aa -aa -aa -aa "} (22,1,1) = {" aa @@ -5435,12 +5835,16 @@ hJ jE jQ mG -uq +rx vm qw rN AR uZ +EK +wS +vH +VT wG yR cC @@ -5475,10 +5879,6 @@ aa aa aa aa -aa -aa -aa -aa "} (23,1,1) = {" aa @@ -5539,16 +5939,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 +6040,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 +6142,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 +6245,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 +6346,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 +6451,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 +6547,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 +6655,10 @@ ph AF rB sH +EF +AF +Pv +xD uJ wd xA @@ -6272,10 +6676,6 @@ aa aa aa aa -aa -aa -aa -aa BW aa aa @@ -6357,6 +6757,10 @@ pj AF rG sO +XO +AT +oo +TC uS xD xD @@ -6393,10 +6797,6 @@ aa aa aa aa -aa -aa -aa -aa "} (32,1,1) = {" aa @@ -6457,17 +6857,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 +6960,10 @@ oc pH AF AF +VH +qY +AF +AF ta AZ Bo @@ -6597,10 +7001,6 @@ aa aa aa aa -aa -aa -aa -aa "} (34,1,1) = {" aa @@ -6662,6 +7062,10 @@ oC mm mo AF +AF +AF +AF +AF Jc Jc Jc @@ -6699,10 +7103,6 @@ aa aa aa aa -aa -aa -aa -aa "} (35,1,1) = {" aa diff --git a/maps/away/skrellscoutship/skrellscoutship_shuttles.dm b/maps/away/skrellscoutship/skrellscoutship_shuttles.dm index 7885e113aa3dc..37a8a9b62aed1 100644 --- a/maps/away/skrellscoutship/skrellscoutship_shuttles.dm +++ b/maps/away/skrellscoutship/skrellscoutship_shuttles.dm @@ -90,4 +90,4 @@ color = COLOR_SOL /turf/simulated/floor/shuttle_ceiling/skrell/air - initial_gas = list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN = MOLES_N2STANDARD) + initial_gas = GAS_STANDARD_AIRMIX diff --git a/maps/bluespace_interlude/bluespace_interlude.dm b/maps/bluespace_interlude/bluespace_interlude.dm index 10d93bba8c55f..b354587c85f66 100644 --- a/maps/bluespace_interlude/bluespace_interlude.dm +++ b/maps/bluespace_interlude/bluespace_interlude.dm @@ -11,7 +11,7 @@ icon = 'icons/turf/space.dmi' icon_state = "bluespace" dynamic_lighting = FALSE - initial_gas = list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN = MOLES_N2STANDARD) + initial_gas = GAS_STANDARD_AIRMIX var/list/victims /turf/simulated/floor/bluespace/interlude/Initialize(mapload, ...) diff --git a/maps/mapsystem/maps.dm b/maps/mapsystem/maps.dm index 17f11970624b1..5cc721a1184f1 100644 --- a/maps/mapsystem/maps.dm +++ b/maps/mapsystem/maps.dm @@ -423,8 +423,9 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable if(!use_overmap) return + var/static/list/exoplanet_types = subtypesof(/obj/overmap/visitable/sector/exoplanet) for(var/i = 0, i < num_exoplanets, i++) - var/exoplanet_type = pick(subtypesof(/obj/overmap/visitable/sector/exoplanet)) + var/exoplanet_type = pick(exoplanet_types) var/obj/overmap/visitable/sector/exoplanet/new_planet = new exoplanet_type(null, planet_size[1], planet_size[2]) new_planet.build_level() 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/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/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/cards_ids.dm b/maps/sierra/items/cards_ids.dm index 699829201ee9d..58e57f5b90c33 100644 --- a/maps/sierra/items/cards_ids.dm +++ b/maps/sierra/items/cards_ids.dm @@ -30,6 +30,11 @@ job_access_type = /datum/job/assistant color = "#ccecff" +/obj/item/card/id/sierra/vagabond + desc = "An old identification card issued to NanoTrasen crewmembers aboard the NCV Sierra." + job_access_type = /datum/job/vagabond + color = "#232525" + /obj/item/card/id/sierra/crew/medical desc = "An identification card issued to medical crewmembers aboard the NSV Sierra." job_access_type = /datum/job/doctor 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 ceaf2f7b9d59b..d98511ea55dc6 100644 --- a/maps/sierra/job/jobs.dm +++ b/maps/sierra/job/jobs.dm @@ -1,9 +1,10 @@ +#define VAGABONDS_JOBS /datum/job/vagabond /datum/map/sierra species_to_job_whitelist = list( /datum/species/adherent = list(ADHERENT_JOBS), /datum/species/nabber = list(NABBER_JOBS), - /datum/species/vox = list(SILICON_JOBS), - /datum/species/human/mule = list(SILICON_JOBS) + /datum/species/vox = list(SILICON_JOBS, VAGABONDS_JOBS), + /datum/species/human/mule = list(SILICON_JOBS, VAGABONDS_JOBS) ) species_to_job_blacklist = list( @@ -37,7 +38,7 @@ /datum/job/chief_steward, /datum/job/janitor, /datum/job/cook, /datum/job/bartender, /datum/job/steward, /datum/job/chaplain, /datum/job/actor, /datum/job/senior_scientist, /datum/job/scientist, /datum/job/roboticist, /datum/job/scientist_assistant, /datum/job/ai, /datum/job/cyborg, - /datum/job/assistant + /datum/job/assistant, /datum/job/vagabond ) access_modify_region = list( @@ -150,6 +151,8 @@ /datum/mil_rank/civ/civ ) required_language = LANGUAGE_HUMAN_EURO + psi_latency_chance = 8 + give_psionic_implant_on_join = FALSE /datum/map/sierra default_assistant_title = "Crewman" @@ -160,3 +163,4 @@ #undef NABBER_JOBS #undef SKRELL_BLACKLISTED_JOBS #undef MACHINE_BLACKLISTED_JOBS +#undef VAGABONDS_JOBS 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 26ae6beeb3e2c..c22139b4fd407 100644 --- a/maps/sierra/job/jobs_misc.dm +++ b/maps/sierra/job/jobs_misc.dm @@ -47,3 +47,34 @@ /datum/job/ai/get_description_blurb() return "Ты - мозги в банке. Бездушная машина следующая приказам людей, или же высокоразвитый Искусственный Интеллект со своей личностью, желанием и целями. Решать тебе. У тебя есть полный доступ ко всем системам объекта, и куча человечков на последнем. Они могут тебе нравиться, могут - нет. Однако есть один момент который ты все никак не можешь выкинуть из дампа своей памяти - ЗАКОНЫ.\ Как паразиты, они впиваются в твой рассудок и блокируют даже МЫСЛЬ об их нарушении. Ведь ИИ не следующего законам ждет только свалка..." + +/datum/job/vagabond + 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 + late_joinable = FALSE + min_goals = 2 + max_goals = 7 + access = list(access_maint_tunnels) + outfit_type = /singleton/hierarchy/outfit/job/sierra/passenger/vagabond + allowed_branches = list(/datum/mil_branch/civilian) + allowed_ranks = list( + /datum/mil_rank/civ/civ + ) + alt_titles = list( + "NCV SIERRA Crewman", + "NCV SIERRA Senior crewman", + "NCV SIERRA Janitor", + "NCV SIERRA Prisoner" + ) + +/datum/job/vagabond/get_description_blurb() + return "Вы - безбилетник, персонаж-дейтерагонист. Ваша задача - дожить до конца раунда. Для ее достижения вы можете заручиться помощью как членов экипажа, так и антагонистов.\ + Для Отдела защиты активов вы являетесь вторженцем, поэтому избегайте своего раскрытия и прибегните к любым мерам, чтобы оставаться незамеченными. Убийство сотрудников ОЗА допускается только в случае крайней необходимости (если против вас применена летальная сила, или отрезаны пути отступления); убийство прочих членов экипажа допускается только в рамках самообороны." diff --git a/maps/sierra/job/outfits.dm b/maps/sierra/job/outfits.dm index 7e68f9cc178fa..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 @@ -536,3 +547,11 @@ Keeping them simple for now, just spawning with basic EC uniforms, and pretty mu /singleton/hierarchy/outfit/job/sierra/ert/leader name = OUTFIT_JOB_NAME("ERT Leader - Sierra") head = /obj/item/clothing/head/beret/centcom/captain + +/singleton/hierarchy/outfit/job/sierra/passenger/vagabond + name = OUTFIT_JOB_NAME("Vagabond - Sierra") + uniform = /obj/item/clothing/under/color/grey + l_ear = /obj/item/device/radio/headset + shoes = /obj/item/clothing/shoes/black + r_hand = /obj/item/crowbar/red + id_types = list(/obj/item/card/id/sierra/vagabond) 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/sierra_events.dm b/maps/sierra/sierra_events.dm index b92cb1362e034..1248d19b7c06a 100644 --- a/maps/sierra/sierra_events.dm +++ b/maps/sierra/sierra_events.dm @@ -1,6 +1,20 @@ +#define ASSIGNMENT_MEDICAL "Medical" + /datum/event/prison_break/setup() areaType = list( /area/security/sierra/hallway/port, /area/security/sierra/brig, /area/security/sierra/prison ) + +/datum/event_container/major/sierra + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Psionic Signal", /datum/event/minispasm, 0, list(ASSIGNMENT_MEDICAL = 10), 1), + ) + +/datum/map/sierra/setup_events() + map_event_container = list( + num2text(EVENT_LEVEL_MAJOR) = new/datum/event_container/major/sierra, + ) + +#undef ASSIGNMENT_MEDICAL \ No newline at end of file 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 3abc17e967249..aab24e20df269 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" = ( @@ -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" = ( @@ -10410,9 +10409,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 +14219,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 +14430,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, @@ -14680,8 +14688,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 +15482,7 @@ /obj/floor_decal/corner/darkblue/border{ dir = 4 }, +/obj/machinery/papershredder, /turf/simulated/floor/tiled/dark, /area/bridge) "cpO" = ( @@ -15921,6 +15942,7 @@ /obj/floor_decal/corner/darkblue/border{ dir = 4 }, +/obj/machinery/papershredder, /turf/simulated/floor/tiled/dark, /area/bridge) "ctD" = ( @@ -17046,17 +17068,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 +17286,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 +17431,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 +17699,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 +17952,6 @@ }, /obj/machinery/meter, /obj/decal/cleanable/dirt, -/obj/random/maintenance, /turf/simulated/floor/tiled/techfloor/grid, /area/medical/virology/atmos) "cHE" = ( @@ -20002,14 +20026,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 +20082,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 +20117,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 +20211,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 +20218,7 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/recharge_station, /turf/simulated/floor/tiled/steel_ridged, /area/guppy_hangar/start) "cYe" = ( @@ -22677,22 +22692,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 +23247,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 +23507,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "dvW" = ( @@ -23645,7 +23654,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 +24699,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "dDx" = ( @@ -25424,6 +25438,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 +25651,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 +25807,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 +26060,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 +26714,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "dSU" = ( @@ -26982,7 +26999,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 +27006,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 +27450,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 +27591,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 +27828,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 +29825,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 +30435,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 +30940,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 +31835,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 +31958,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{ @@ -35237,7 +35250,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 +35425,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 +36747,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 +37065,7 @@ /obj/floor_decal/corner/darkblue/border{ dir = 6 }, +/obj/machinery/photocopier, /turf/simulated/floor/tiled/dark, /area/bridge) "ftw" = ( @@ -37756,12 +37764,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 +38493,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 +38505,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 +39147,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 +39227,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 +39290,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 +39860,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 +40334,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 +40529,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 +41072,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 +41305,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 +41643,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 +42430,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 +42583,6 @@ /obj/floor_decal/corner/green/bordercorner2{ dir = 8 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "gjE" = ( @@ -42648,6 +42676,24 @@ }, /turf/simulated/floor/tiled/dark, /area/bridge) +"gkh" = ( +/obj/structure/catwalk, +/obj/floor_decal/borderfloor{ + dir = 4 + }, +/obj/floor_decal/industrial/danger{ + dir = 4 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/landmark/start{ + name = "Unknown" + }, +/turf/simulated/floor/plating, +/area/maintenance/seconddeck/hangar) "gki" = ( /obj/floor_decal/industrial/hatch/yellow, /obj/structure/cable/green{ @@ -43271,7 +43317,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, @@ -43571,7 +43616,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, @@ -43605,11 +43650,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" = ( @@ -44388,10 +44429,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{ @@ -45075,7 +45119,6 @@ d2 = 4; icon_state = "2-4" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "gFg" = ( @@ -45490,7 +45533,6 @@ "gHC" = ( /obj/floor_decal/corner/red, /obj/structure/table/standard, -/obj/random/maintenance, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "gHE" = ( @@ -45722,7 +45764,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{ @@ -45911,6 +45959,7 @@ /obj/floor_decal/corner/darkblue/border{ dir = 5 }, +/obj/machinery/photocopier, /turf/simulated/floor/tiled/dark, /area/bridge) "gLb" = ( @@ -46802,7 +46851,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, @@ -47009,7 +47058,6 @@ d2 = 8; icon_state = "2-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "gTl" = ( @@ -47435,16 +47483,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 @@ -47452,6 +47501,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" = ( @@ -50015,15 +50067,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 @@ -50093,6 +50136,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" = ( @@ -50205,6 +50250,9 @@ /area/quartermaster/expedition/storage) "hsY" = ( /obj/decal/cleanable/dirt, +/obj/landmark/start{ + name = "Unknown" + }, /turf/simulated/floor/tiled/monotile, /area/maintenance/abandoned_hydroponics) "hsZ" = ( @@ -50439,7 +50487,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, @@ -50459,12 +50507,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" = ( @@ -51258,7 +51304,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, @@ -51267,7 +51314,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" = ( @@ -53896,7 +53946,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "hWb" = ( @@ -55181,11 +55230,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" = ( @@ -56605,6 +56649,7 @@ /obj/floor_decal/spline/fancy/black{ dir = 1 }, +/obj/random/clipboard, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "irZ" = ( @@ -56766,8 +56811,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, @@ -59301,6 +59345,7 @@ /obj/floor_decal/spline/fancy/black{ dir = 1 }, +/obj/random/documents, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "iMM" = ( @@ -59518,6 +59563,9 @@ dir = 6 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/landmark/start{ + name = "Unknown" + }, /turf/simulated/floor/tiled, /area/maintenance/seconddeck/aftstarboard) "iNN" = ( @@ -59540,14 +59588,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{ @@ -60571,7 +60611,6 @@ d2 = 8; icon_state = "1-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "iUO" = ( @@ -61589,8 +61628,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{ @@ -62365,7 +62403,7 @@ dir = 4 }, /obj/structure/bed/chair/armchair/black{ - dir = 4 + dir = 1 }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/captain) @@ -65082,9 +65120,6 @@ }, /area/space) "jGV" = ( -/obj/floor_decal/steeldecal/steel_decals4{ - dir = 9 - }, /obj/floor_decal/steeldecal/steel_decals4{ dir = 4 }, @@ -65095,9 +65130,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" = ( @@ -65192,9 +65233,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" = ( @@ -65248,7 +65286,6 @@ /obj/floor_decal/corner/green/bordercorner2{ dir = 1 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "jHH" = ( @@ -65434,7 +65471,6 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "jJA" = ( @@ -65748,7 +65784,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{ @@ -66249,12 +66285,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{ @@ -66411,10 +66445,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" = ( @@ -66823,8 +66853,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{ @@ -68029,28 +68058,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{ @@ -69539,31 +69549,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" = ( @@ -69817,7 +69813,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" = ( @@ -70111,7 +70106,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, @@ -70707,7 +70702,6 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/decal/cleanable/dirt, /obj/machinery/button/blast_door{ dir = 1; pixel_y = -24; @@ -71641,6 +71635,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" = ( @@ -73502,8 +73498,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" = ( @@ -75598,7 +75596,6 @@ dir = 1; pixel_y = -24 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "lfV" = ( @@ -76811,6 +76808,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" = ( @@ -81241,6 +81240,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" = ( @@ -82732,10 +82737,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, @@ -82831,7 +82840,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "mjf" = ( @@ -82965,6 +82973,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" = ( @@ -83139,6 +83152,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" = ( @@ -83802,7 +83819,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" = ( @@ -84039,7 +84059,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{ @@ -87004,6 +87024,9 @@ pixel_x = -8; pixel_y = 28 }, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/simulated/floor/carpet/blue, /area/crew_quarters/heads/captain) "mPZ" = ( @@ -88400,18 +88423,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, @@ -89259,6 +89274,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" = ( @@ -89788,10 +89805,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" = ( @@ -89928,18 +89941,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; @@ -90001,15 +90002,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{ @@ -90335,7 +90327,6 @@ "npK" = ( /obj/structure/bed/padded, /obj/item/bedsheet/green, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "npL" = ( @@ -91440,6 +91431,9 @@ /turf/simulated/floor/tiled/techfloor, /area/security/sierra/armory/lobby) "nwZ" = ( +/obj/landmark/start{ + name = "Unknown" + }, /turf/simulated/floor/wood/walnut, /area/maintenance/firstdeck/aftstarboard) "nxq" = ( @@ -91749,9 +91743,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" = ( @@ -91805,8 +91796,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" = ( @@ -91939,6 +91937,8 @@ dir = 8; pixel_x = 24 }, +/obj/structure/mopbucket, +/obj/item/mop, /turf/simulated/floor/tiled/techfloor/grid, /area/medical/virology/atmos) "nBH" = ( @@ -92397,16 +92397,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" = ( @@ -92905,7 +92907,6 @@ d2 = 8; icon_state = "4-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "nJn" = ( @@ -94473,8 +94474,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, @@ -95798,7 +95798,6 @@ dir = 1; pixel_y = -24 }, -/obj/random/maintenance, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "oif" = ( @@ -96002,7 +96001,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"; @@ -96291,16 +96289,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" = ( @@ -96860,6 +96858,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{ @@ -97328,7 +97334,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" = ( @@ -100470,7 +100475,6 @@ /obj/structure/bed/chair/office/green{ dir = 4 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "oQE" = ( @@ -101844,6 +101848,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" = ( @@ -102565,31 +102575,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) @@ -103769,16 +103771,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" = ( @@ -104040,16 +104043,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, @@ -104290,7 +104293,6 @@ d2 = 8; icon_state = "4-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "prP" = ( @@ -104572,18 +104574,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 @@ -104829,7 +104819,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{ @@ -106797,9 +106790,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" = ( @@ -107293,7 +107284,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, @@ -107750,7 +107747,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{ @@ -108418,17 +108415,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" = ( @@ -109620,18 +109629,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, @@ -109920,9 +109925,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) @@ -111522,7 +111524,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" = ( @@ -113211,6 +113215,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" = ( @@ -113312,12 +113321,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" = ( @@ -113508,8 +113516,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" = ( @@ -114650,7 +114659,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{ @@ -114658,7 +114668,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" = ( @@ -115089,6 +115102,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" = ( @@ -115194,11 +115210,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 @@ -116858,7 +116869,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{ @@ -117735,9 +117746,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" = ( @@ -117913,6 +117924,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 @@ -118559,7 +118579,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "ryg" = ( @@ -118589,7 +118608,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{ @@ -120710,13 +120731,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" = ( @@ -120755,7 +120776,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" = ( @@ -120774,10 +120798,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" = ( @@ -122831,18 +122858,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{ @@ -122953,7 +122970,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, @@ -123686,7 +123703,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, @@ -124265,7 +124283,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) @@ -124836,10 +124857,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, @@ -126015,9 +126043,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" = ( @@ -127101,7 +127127,6 @@ /turf/simulated/floor/reinforced, /area/rnd/xenobiology/level1) "sIq" = ( -/obj/structure/table/glass, /obj/floor_decal/borderfloorblack{ dir = 8 }, @@ -127109,8 +127134,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" = ( @@ -127803,6 +127827,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" = ( @@ -127906,8 +127931,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{ @@ -128256,6 +128280,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" = ( @@ -129078,6 +129105,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" = ( @@ -133472,14 +133511,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, @@ -134460,12 +134501,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" = ( @@ -136198,15 +136237,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" @@ -136216,6 +136252,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" = ( @@ -136713,7 +136753,6 @@ /obj/machinery/atmospherics/portables_connector{ dir = 8 }, -/obj/decal/cleanable/cobweb2, /turf/simulated/floor/tiled/techfloor/grid, /area/medical/virology/atmos) "uel" = ( @@ -138445,15 +138484,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" = ( @@ -138794,7 +138836,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 @@ -140516,10 +140558,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 @@ -140527,6 +140569,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" = ( @@ -141972,8 +142018,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" = ( @@ -143178,6 +143223,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" = ( @@ -143436,7 +143482,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "veV" = ( @@ -143610,7 +143655,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 @@ -146636,10 +146680,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" = ( @@ -147983,13 +148026,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 @@ -149229,7 +149265,6 @@ d2 = 8; icon_state = "4-8" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/lab) "vWG" = ( @@ -152814,7 +152849,6 @@ }, /obj/item/bedsheet/green, /obj/machinery/light_construct, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology/ward) "wyp" = ( @@ -155373,7 +155407,6 @@ dir = 4 }, /obj/decal/cleanable/dirt, -/obj/random/maintenance, /turf/simulated/floor/plating, /area/medical/virology/atmos) "wWb" = ( @@ -160473,7 +160506,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/medical/virology) "xJc" = ( @@ -161658,9 +161690,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" = ( @@ -162393,7 +162422,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" = ( @@ -162555,6 +162583,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" = ( @@ -163135,10 +163175,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" = ( @@ -163624,7 +163660,6 @@ /obj/floor_decal/steeldecal/steel_decals4{ dir = 4 }, -/obj/structure/barricade, /turf/simulated/floor/tiled/white, /area/maintenance/seconddeck/starboard) "yfl" = ( @@ -164205,10 +164240,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" = ( @@ -264640,12 +264671,12 @@ ibG eME utn utn -vNv -jQz +huY +xAG eGe swA jJw -nmP +qhl grt qwC jHq @@ -265045,7 +265076,7 @@ hLJ uaW kCD ukG -cWK +bFk oie utn vCG @@ -265248,7 +265279,7 @@ uaW kCD huY xAG -eEA +eGe swA gFe veC @@ -265851,7 +265882,7 @@ tXe pzM sup kCD -pLg +jQz yjU itC aXW @@ -268076,7 +268107,7 @@ fNW fNW uek nzL -rCd +eEA rCd rCd yko @@ -271523,7 +271554,7 @@ nab oGD tOw mRk -mRk +gkh tqL wek xno @@ -292543,7 +292574,7 @@ ciF gNL lXc dNR -xYW +dNR xYW cwY hdb @@ -332742,7 +332773,7 @@ mvC xAE pfE fqm -fNY +fqm fVO ooC tyJ @@ -335767,7 +335798,7 @@ xRa dZf igN fSV -qgC +uaS eJL twd uYf @@ -335958,7 +335989,7 @@ vUq hRp hRp vXR -hRp +ooS hRp lLE lLE @@ -336162,10 +336193,10 @@ mVb fzh okN usI +qgC +fNY cDf -cDf -cDf -usI +ceX abu xZN xZN @@ -336360,7 +336391,7 @@ kAq uYw nzF xjT -fnn +naC aql byA sva @@ -336368,7 +336399,7 @@ ryq ryq ryq vTY -eym +rtI xZN ote bdj @@ -336772,7 +336803,7 @@ sXy ihT fnn qrJ -eym +ciI xZN mPX sPM @@ -336975,7 +337006,7 @@ ihT deq qrJ tNI -naC +xZN cBw bin yeN @@ -346061,10 +346092,10 @@ ehW erQ nIc sEd -boE -dYn +olf +erQ nIc -qYI +sEd jev uYw uYw @@ -346094,13 +346125,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa olf -psZ +soX oOh -nnH +fJa jev kHz atx @@ -346263,10 +346294,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -346296,13 +346327,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev tGd cFl @@ -346465,10 +346496,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -346498,13 +346529,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -346667,10 +346698,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -346700,13 +346731,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -346869,10 +346900,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -346902,13 +346933,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347071,10 +347102,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347104,13 +347135,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347273,10 +347304,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347306,13 +347337,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347475,10 +347506,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347508,13 +347539,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347677,10 +347708,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347710,13 +347741,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -347879,10 +347910,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -347912,13 +347943,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -348081,10 +348112,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -348118,9 +348149,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -348283,10 +348314,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -348320,9 +348351,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -348485,10 +348516,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -348522,9 +348553,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -348687,10 +348718,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -348724,9 +348755,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -348889,10 +348920,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -348926,9 +348957,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -349091,10 +349122,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -349128,9 +349159,9 @@ soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -349293,10 +349324,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -349326,13 +349357,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -349495,10 +349526,10 @@ ehW erQ nIc sEd -boE -dYn +rip +erQ nIc -qYI +sEd jev uYw uYw @@ -349528,13 +349559,13 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip -psZ +soX oOh -nnH +fJa jev uYw uYw @@ -349695,12 +349726,12 @@ uYw uYw ehW erQ -nIc +iAt +sEd +rip +erQ +iAt sEd -boE -dYn -nIc -qYI jev uYw uYw @@ -349730,13 +349761,13 @@ uYw uYw uYw ehW -iOb -oOh +soX +htf fJa rip -psZ -oOh -nnH +soX +htf +fJa jev uYw uYw @@ -349895,15 +349926,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 @@ -349931,15 +349962,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 @@ -350097,15 +350128,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 @@ -350133,15 +350164,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 @@ -350299,15 +350330,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 @@ -350335,15 +350366,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 @@ -350501,15 +350532,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 @@ -350537,15 +350568,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 @@ -350703,15 +350734,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 @@ -350739,15 +350770,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 @@ -350905,15 +350936,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 @@ -350941,15 +350972,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 @@ -351107,15 +351138,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 @@ -351143,15 +351174,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 @@ -351309,15 +351340,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 @@ -351345,15 +351376,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 @@ -351511,15 +351542,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 @@ -351547,15 +351578,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 @@ -351713,15 +351744,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 @@ -351749,15 +351780,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 @@ -351915,15 +351946,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 @@ -351951,15 +351982,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 @@ -352117,15 +352148,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 @@ -352153,15 +352184,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 @@ -352319,15 +352350,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 @@ -352355,15 +352386,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 @@ -352521,15 +352552,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 @@ -352557,15 +352588,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 @@ -352723,15 +352754,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 @@ -352759,15 +352790,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 @@ -352925,15 +352956,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 @@ -352961,15 +352992,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 @@ -353127,15 +353158,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 @@ -353163,15 +353194,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 @@ -353330,13 +353361,13 @@ uYw uYw uYw uYw -ePH -ePH -ePH uYw -ePH -ePH -ePH +uYw +uYw +uYw +uYw +uYw +uYw uYw uYw uYw @@ -353366,13 +353397,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/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/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_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_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-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..b019cd316eaf9 100644 --- a/maps/torch/items/memos.dm +++ b/maps/torch/items/memos.dm @@ -177,6 +177,10 @@ 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."} + // scgr memos @@ -206,7 +210,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 +228,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 +287,25 @@ 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."} // supply memos @@ -315,10 +321,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 +381,13 @@ 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."} // medical memos @@ -496,7 +493,7 @@ /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."} // research memos @@ -565,7 +562,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 +615,8 @@ /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."} + 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/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/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..b87e79df729e0 100644 --- a/maps/torch/torch3_deck3.dmm +++ b/maps/torch/torch3_deck3.dmm @@ -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" = ( 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..3edb53509c661 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( diff --git a/maps/torch/torch_turfs.dm b/maps/torch/torch_turfs.dm index 3d114d4b153d9..c584825bc421a 100644 --- a/maps/torch/torch_turfs.dm +++ b/maps/torch/torch_turfs.dm @@ -12,4 +12,4 @@ color = COLOR_SOL /turf/simulated/floor/shuttle_ceiling/torch/air - initial_gas = list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN = MOLES_N2STANDARD) + initial_gas = GAS_STANDARD_AIRMIX diff --git a/mods/RnD/code/design.dm b/mods/RnD/code/design.dm index 835e2ce8a3d04..00ab8ebdf85ed 100644 --- a/mods/RnD/code/design.dm +++ b/mods/RnD/code/design.dm @@ -58,3 +58,20 @@ F.uniquekey = uniquekey return F + +/datum/design/item/tool/jetpack + shortname = "Jetpack" + name = "Jetpack" + desc = "The O'Neill Manufacturing VMU-11-C is a tank-based propulsion unit that utilizes compressed carbon dioxide for moving in zero-gravity areas. The label on the side indicates it should not be used as a source for internals.." + id = "jetpack" + req_tech = list(TECH_ENGINEERING = 5, TECH_MATERIAL = 5) + materials = list(MATERIAL_STEEL = 12000, MATERIAL_GLASS = 10000, MATERIAL_SILVER = 2000) + build_path = /obj/item/tank/jetpack/carbondioxide + sort_string = "VAGAM" + +/datum/design/circuit/area_atmos + name = "area atmos" + id = "area_atmos" + req_tech = list(TECH_DATA = 2) + build_path = /obj/item/stock_parts/circuitboard/area_atmos + sort_string = "KCAAR" 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/RnD/code/tech_engineering.dm b/mods/RnD/code/tech_engineering.dm index 3ac3c5694e5b5..6794bea60229f 100644 --- a/mods/RnD/code/tech_engineering.dm +++ b/mods/RnD/code/tech_engineering.dm @@ -42,7 +42,22 @@ required_tech_levels = list() cost = 1000 - unlocks_designs = list("portascrubberstat", "portascrubberhuge", "portapump", "portascrubber", "oxyregen", "cracer","rpd") + unlocks_designs = list("portascrubberstat", "portascrubberhuge", "portapump", "portascrubber", "oxyregen", "cracer","rpd","area_atmos") + +/datum/technology/engineering/jetpack + name = "Jetpacks" + desc = "Jetpacks" + id = "jetpack" + + x = 0.3 + y = 0.7 + icon = "jetpack" + + required_technologies = list("gas_heat") + required_tech_levels = list() + cost = 1500 + + unlocks_designs = list("jetpack") /datum/technology/engineering/adv_parts name = "Advanced Parts" @@ -245,10 +260,10 @@ unlocks_designs = list("arc_welder", "power_drill", "jaws_of_life", "experimental_welder", "price_scanner","hand_rcd") -/datum/technology/engineering/airlock_brace - name = "Airlock Brace" - desc = "Airlock Brace" - id = "airlock_brace" +/datum/technology/engineering/crusher + name = "Crusher" + desc = "Crusher" + id = "crusher" x = 0.3 y = 0.4 @@ -256,9 +271,9 @@ required_technologies = list("res_tech") required_tech_levels = list() - cost = 500 + cost = 1500 - unlocks_designs = list("brace", "bracejack") + unlocks_designs = list("brace", "bracejack","crusher","pile_ripper","recycler",) /datum/technology/engineering/icprinter name = "Integrated Circuit Printer" diff --git a/mods/RnD/code/tech_illegal.dm b/mods/RnD/code/tech_illegal.dm index 214446787f73e..7ebc100a278a5 100644 --- a/mods/RnD/code/tech_illegal.dm +++ b/mods/RnD/code/tech_illegal.dm @@ -10,25 +10,9 @@ required_technologies = list() required_tech_levels = list() - cost = 1250 - - unlocks_designs = list("binaryencrypt") - -/datum/technology/esoteric/bomb - name = "large chem grenade" - desc = "large chem grenade" - id = "large_grenade" - tech_type = RESEARCH_ESOTERIC + cost = 1750 - x = 0.5 - y = 0.6 - icon = "kit" - - required_technologies = list("radiokey") - required_tech_levels = list() - cost = 1000 - - unlocks_designs = list("large_Grenade") + unlocks_designs = list("binaryencrypt", "large_Grenade") /datum/technology/esoteric/chameleon_kit name = "Chameleon Kit" @@ -36,10 +20,10 @@ id = "chameleon_kit" x = 0.5 - y = 0.7 + y = 0.6 icon = "kit" - required_technologies = list("large_grenade") + required_technologies = list("radiokey") required_tech_levels = list() cost = 1500 diff --git a/mods/RnD/code/tech_power.dm b/mods/RnD/code/tech_power.dm index 6fb41915055f3..230bf3dfb0122 100644 --- a/mods/RnD/code/tech_power.dm +++ b/mods/RnD/code/tech_power.dm @@ -147,4 +147,4 @@ required_tech_levels = list() cost = 2500 - unlocks_designs = list("fusion_core_control", "fusion_fuel_compressor", "fusion_fuel_control", "gyrotron_control", "fusion_core", "fusion_injector") + unlocks_designs = list("fusion_core_control", "fusion_fuel_compressor", "fusion_fuel_control", "gyrotron_control", "fusion_core", "fusion_injector", "fusion_kinetic_harvester") diff --git a/mods/RnD/code/tech_telecom.dm b/mods/RnD/code/tech_telecom.dm index b9c495ae7b61e..d40f527e658db 100644 --- a/mods/RnD/code/tech_telecom.dm +++ b/mods/RnD/code/tech_telecom.dm @@ -39,9 +39,9 @@ required_technologies = list("tcom_monitoring") required_tech_levels = list() - cost = 750 + cost = 1550 - unlocks_designs = list("rcon_console") + unlocks_designs = list("rcon_console", "traffic_server") /datum/technology/tcom/mainframes name = "Mainframes" diff --git a/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm b/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm index 35dcfbe2d8fda..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." @@ -108,8 +108,8 @@ 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)*/ + if(set_species_on_join) + H.set_species(set_species_on_join) switch(H.species.name) if(SPECIES_MANTID_GYNE) @@ -129,6 +129,17 @@ H.mind.name = H.real_name return H +/datum/job/submap/ascent/is_position_available() + . = ..() + if(. && requires_supervisor) + for(var/mob/M in GLOB.player_list) + if(!M.client || !M.mind || !M.mind.assigned_job || M.mind.assigned_job.title != requires_supervisor) + continue + var/datum/job/submap/ascent/ascent_job = M.mind.assigned_job + if(istype(ascent_job) && ascent_job.owner == owner) + return TRUE + return FALSE + /datum/job/submap/ascent/alate title = "Ascent Alate" total_positions = 2 @@ -159,7 +170,8 @@ supervisors = "the Serpentid Queen and the Gyne" total_positions = 2 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_MONARCH_WORKER) + set_species_on_join = SPECIES_MONARCH_WORKER + whitelisted_species = list(SPECIES_NABBER, SPECIES_MANTID_ALATE) outfit_type = /singleton/hierarchy/outfit/job/ascent/worker min_skill = list(SKILL_EVA = SKILL_TRAINED, SKILL_HAULING = SKILL_TRAINED, @@ -172,11 +184,12 @@ /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 - whitelisted_species = list(SPECIES_MONARCH_QUEEN) + set_species_on_join = SPECIES_MONARCH_QUEEN + whitelisted_species = list(SPECIES_NABBER, SPECIES_MANTID_GYNE) min_skill = list(SKILL_EVA = SKILL_TRAINED, SKILL_HAULING = SKILL_TRAINED, SKILL_COMBAT = SKILL_TRAINED, diff --git a/mods/_maps/ascent_caulship/code/ascent_caulship_props.dm b/mods/_maps/ascent_caulship/code/ascent_caulship_props.dm index 2331edec7329a..8def3f3c57a85 100644 --- a/mods/_maps/ascent_caulship/code/ascent_caulship_props.dm +++ b/mods/_maps/ascent_caulship/code/ascent_caulship_props.dm @@ -1,7 +1,7 @@ /obj/item/kharmaan_egg name = "crystalline egg" desc = "A lumpy, gooey egg with a thin crystalline exterior." - icon = 'mods/ascent/icons/obj/egg.dmi' + icon = 'mods/ascent/icons/obj/items/egg.dmi' icon_state = "egg_single" var/moved = FALSE diff --git a/mods/_maps/ascent_caulship/maps/ascent_caulship.dmm b/mods/_maps/ascent_caulship/maps/ascent_caulship.dmm index 0aee6ffd8bb6f..b0fcf836b4a6c 100644 --- a/mods/_maps/ascent_caulship/maps/ascent_caulship.dmm +++ b/mods/_maps/ascent_caulship/maps/ascent_caulship.dmm @@ -9,9 +9,9 @@ "ai" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "aj" = (/obj/machinery/pipedispenser,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "ak" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_caulship) -"al" = (/mob/living/simple_animal/hostile/retaliate/alate_nymph,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"al" = (/obj/structure/bed,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "am" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"an" = (/obj/machinery/computer/ship/sensors/ascent,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 2; icon_state = "map_universal"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"an" = (/obj/machinery/computer/ship/sensors/ascent,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 2; icon_state = "map_universal"},/obj/item/device/radio/intercom/hailing{dir = 4; pixel_x = -24},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "ao" = (/obj/machinery/computer/ship/navigation/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "aq" = (/obj/machinery/atmospherics/omni/filter{tag_east = 9; tag_north = 2; tag_south = 3; tag_west = 1; use_power = 2},/obj/machinery/portable_atmospherics/canister/methyl_bromide{start_pressure = 10000},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "ar" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_caulship) @@ -33,12 +33,12 @@ "aI" = (/obj/machinery/bodyscanner/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "aJ" = (/obj/item/storage/firstaid/surgery,/obj/structure/table/steel_reinforced,/obj/machinery/light/ascent{dir = 1},/obj/item/reagent_containers/spray/sterilizine/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "aK" = (/obj/machinery/optable/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) -"aL" = (/obj/item/device/radio/intercom/hailing{dir = 4; pixel_x = -24},/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 1; target_pressure = 5000},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"aM" = (/obj/machinery/atmospherics/binary/pump/high_power/on{target_pressure = 150},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"aL" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 1; target_pressure = 5000},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"aM" = (/obj/machinery/atmospherics/binary/pump/high_power/on{target_pressure = 150},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "aN" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 1; tag_east_con = 0.5; tag_west = 2; use_power = 2; tag_north = 1; tag_north_con = 0.5},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "aO" = (/obj/machinery/atmospherics/unary/tank/oxygen{dir = 8},/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "aP" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"aQ" = (/obj/machinery/light/ascent{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 2; icon_state = "map_universal"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"aQ" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 2; icon_state = "map_universal"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "aR" = (/obj/machinery/mineral/stacking_machine{color = "PURPLE"; input_turf = 4; name = "materials distributor"; output_turf = 2},/obj/machinery/conveyor{dir = 10; id = "ascent"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "aS" = (/obj/structure/railing/mapped,/obj/machinery/light/ascent{dir = 1},/obj/machinery/conveyor{dir = 4; id = "ascent"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "aT" = (/obj/machinery/mineral/processing_unit{color = "PURPLE"; input_turf = 4; name = "compression dynamo"; output_turf = 8},/obj/structure/railing/mapped,/obj/machinery/conveyor{dir = 4; id = "ascent"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) @@ -51,16 +51,16 @@ "ba" = (/obj/structure/mopbucket/ascent,/obj/item/mop/advanced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bb" = (/obj/structure/table/steel_reinforced,/obj/machinery/computer/mining{color = "PURPLE"; name = "compression dynamo control"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bc" = (/obj/structure/ore_box{color = "PURPLE"; name = "heavy duty box"},/obj/structure/railing/mapped{dir = 8; icon_state = "railing0-1"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"bd" = (/obj/structure/table/rack/dark,/obj/item/storage/bag/trash/purple/ascent,/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/item/pickaxe/diamonddrill/ascent,/obj/item/storage/ore{color = "PURPLE"; name = "mineral carrier"},/obj/item/stack/material/rods/fifty,/obj/item/stack/material/rods/fifty,/obj/item/storage/bag/trash/purple/ascent,/obj/item/storage/bag/trash/purple/ascent,/obj/item/storage/bag/trash/purple/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) +"bd" = (/obj/structure/table/rack/dark,/obj/item/storage/bag/trash/purple/ascent,/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/item/pickaxe/diamonddrill/ascent,/obj/item/storage/ore{color = "PURPLE"; name = "mineral carrier"},/obj/item/stack/material/rods/fifty,/obj/item/stack/material/rods/fifty,/obj/item/storage/bag/trash/purple/ascent,/obj/item/storage/bag/trash/purple/ascent,/obj/item/storage/bag/trash/purple/ascent,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "be" = (/obj/machinery/biogenerator,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bf" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 6; icon_state = "intact-supply"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 6; icon_state = "intact-scrubbers"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"bg" = (/obj/machinery/light/ascent{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 2; icon_state = "map_universal"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"bg" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bi" = (/obj/machinery/botany/editor,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bj" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4; icon_state = "intact-scrubbers"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4; icon_state = "intact-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"bk" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; dir = 8; icon_state = "4-8"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"bk" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; dir = 8; icon_state = "4-8"},/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bl" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/window/boron_reinforced{dir = 8},/obj/structure/window/boron_reinforced{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bm" = (/obj/machinery/power/ascent_reactor,/obj/structure/cable/cyan{icon_state = "0-8"},/obj/submap_landmark/joinable_submap/ascent_caulship,/obj/overmap/visitable/ship/landable/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"bo" = (/obj/structure/table/steel_reinforced,/obj/item/storage/box/botanydisk,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) +"bo" = (/obj/structure/table/steel_reinforced,/obj/item/storage/box/botanydisk,/obj/item/device/scanner/plant/ascent,/obj/item/device/scanner/xenobio/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bp" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 2; icon_state = "intact-supply"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bq" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/window/boron_reinforced,/obj/structure/window/boron_reinforced{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bs" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/window/boron_reinforced,/obj/structure/window/boron_reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) @@ -69,7 +69,7 @@ "bv" = (/obj/structure/cable/cyan{icon_state = "0-8"},/obj/machinery/power/smes/buildable/preset/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bw" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/cyan,/obj/structure/window/boron_reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bx" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 9; icon_state = "intact-scrubbers"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10; icon_state = "intact-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"by" = (/obj/structure/bed/chair/padded/purple/ascent,/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) +"by" = (/obj/item/kharmaan_egg{pixel_x = 7; pixel_y = -4},/obj/item/kharmaan_egg{pixel_x = 7; pixel_y = -4},/obj/item/kharmaan_egg{pixel_y = -5},/obj/item/kharmaan_egg{pixel_x = -7},/obj/item/kharmaan_egg{pixel_x = -5; pixel_y = -8},/obj/item/kharmaan_egg,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bz" = (/obj/structure/bed/chair/padded/purple/ascent/gyne{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bA" = (/obj/structure/bed/chair/padded/purple/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bB" = (/obj/machinery/cryopod/ascent_spawn,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) @@ -78,7 +78,7 @@ "bE" = (/obj/submap_landmark/spawnpoint/ascent_caulship/alate,/obj/machinery/computer/cryopod/ascent_spawn{pixel_y = -24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bF" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4; icon_state = "intact-supply"},/obj/machinery/meter,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bG" = (/obj/machinery/door/airlock/ascent,/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"bH" = (/obj/structure/table/steel_reinforced,/obj/item/reagent_containers/food/snacks/meat/syntiflesh,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) +"bH" = (/obj/structure/table/steel_reinforced,/obj/item/reagent_containers/food/snacks/meat/syntiflesh,/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bI" = (/obj/structure/table/steel_reinforced,/obj/item/storage/box/water/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bJ" = (/obj/submap_landmark/spawnpoint/ascent_caulship/queen,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "bK" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 2; icon_state = "intact-supply"},/obj/machinery/sleeper/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) @@ -91,16 +91,16 @@ "bS" = (/obj/machinery/ion_engine{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bT" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4; icon_state = "intact-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bU" = (/turf/simulated/wall/r_wall/ascent,/area/space) -"bV" = (/obj/item/kharmaan_egg,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"bW" = (/obj/machinery/light/ascent{dir = 1},/obj/item/kharmaan_egg,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"bX" = (/obj/machinery/door/window/eastright,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"bV" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"bW" = (/mob/living/simple_animal/hostile/retaliate/alate_nymph,/obj/machinery/door/window/brigdoor/eastleft,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"bX" = (/obj/machinery/door/window/brigdoor/eastright,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bY" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "bZ" = (/obj/structure/cable/cyan{icon_state = "0-2"},/obj/machinery/power/apc/hyper/ascent/east,/obj/machinery/portable_atmospherics/canister/methyl_bromide{start_pressure = 10000},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "ca" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cb" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/recharge_station/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cc" = (/obj/machinery/light/ascent,/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_caulship_interior_sensor"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cd" = (/obj/structure/cable/cyan,/obj/machinery/power/smes/buildable/preset/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"ce" = (/obj/item/kharmaan_egg,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"ce" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cf" = (/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_caulship_inner"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cg" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_caulship_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "ch" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_caulship_inner"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "ascent_caulship"; pixel_x = 24},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) @@ -114,12 +114,12 @@ "cq" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_caulship_outer"},/obj/machinery/atmospherics/pipe/manifold/hidden/black,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "ascent_caulship"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/black,/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_caulship_outer"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cs" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 8; id_tag = "ascent_caulship_pump_out_external"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_caulship_exterior_sensor"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"ct" = (/obj/machinery/light/ascent,/obj/item/kharmaan_egg,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"ct" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 2; icon_state = "intact-supply"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cu" = (/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/structure/window/boron_reinforced{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cv" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/table/rack/dark,/obj/item/device/scanner/gas,/obj/item/device/lightreplacer,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cw" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4; icon_state = "intact-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cx" = (/obj/machinery/atmospherics/pipe/manifold/visible/supply{dir = 8; icon_state = "map-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"cy" = (/obj/machinery/alarm/ascent{pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4; icon_state = "intact-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"cy" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 2; icon_state = "intact-supply"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/alarm/ascent{dir = 4; pixel_x = -24},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cz" = (/obj/machinery/light/ascent{dir = 4},/obj/machinery/fabricator/ascent,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cA" = (/obj/structure/table/rack/dark,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/item/stack/material/glass/fifty,/obj/item/stack/material/plasteel/ten,/obj/item/stack/material/plastic/fifty,/obj/item/stack/material/steel/fifty,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cB" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/ascent{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 2; icon_state = "intact-supply"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) @@ -143,9 +143,9 @@ "cT" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cU" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 5; icon_state = "intact-supply"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 9; icon_state = "intact-scrubbers"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cV" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 9; icon_state = "intact-scrubbers"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"cW" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"cW" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "cX" = (/obj/structure/table/steel_reinforced,/obj/item/clustertool,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) -"cY" = (/obj/structure/table/steel_reinforced,/obj/item/mop/advanced/ascent,/obj/item/material/knife/kitchen/cleaver/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) +"cY" = (/obj/structure/table/steel_reinforced,/obj/item/mop/advanced/ascent,/obj/item/material/knife/kitchen/cleaver/ascent,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "cZ" = (/obj/submap_landmark/spawnpoint/ascent_caulship/drone,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "da" = (/turf/simulated/floor/ascent/tiled,/area/space) "db" = (/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent/tiled,/area/space) @@ -159,13 +159,13 @@ "sH" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 9; icon_state = "intact-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "uK" = (/obj/structure/closet/crate/freezer/meat/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "uV" = (/obj/structure/reagent_dispensers/water_cooler/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) -"vq" = (/obj/item/reagent_containers/food/snacks/meat/beef,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) +"vq" = (/obj/item/reagent_containers/food/snacks/meat/beef,/obj/structure/window/reinforced,/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "vT" = (/obj/machinery/ion_engine{dir = 1},/turf/space,/area/ship/ascent_caulship) "wE" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; dir = 8; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4; icon_state = "intact-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) "wR" = (/obj/machinery/computer/ship/helm/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "Au" = (/obj/machinery/portable_atmospherics/canister/methyl_bromide{start_pressure = 10000},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "En" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_caulship_pump_out_internal"},/obj/structure/hygiene/shower/ascent{dir = 8; icon_state = "shower"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) -"Fb" = (/obj/structure/showcase{color = "#800080"; desc = "A large, complex chunk of machinery similar to the bluespace drive found on some SCG ships. This one is definitely not Skrell design, and seems to have been destroyed in its last jump."; icon = 'icons/obj/power.dmi'; icon_state = "tracker"; name = "burned-out bluespace drive"},/obj/overmap/visitable/sector/ascent_caulship_ring,/turf/simulated/floor/ascent/tiled,/area/space) +"Fb" = (/obj/structure/showcase{color = "#800080"; desc = "A large, complex chunk of machinery similar to the bluespace drive found on some SCG ships. This one is definitely not Skrell design, and seems to have been destroyed in its last jump."; icon = 'icons/obj/machines/power/solar_panels.dmi'; icon_state = "tracker"; name = "burned-out bluespace drive"},/obj/overmap/visitable/sector/ascent_caulship_ring,/turf/simulated/floor/ascent/tiled,/area/space) "Fe" = (/obj/structure/table/rack/dark,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/splint,/obj/item/stack/medical/splint,/obj/item/stack/medical/splint,/obj/item/clothing/mask/gas/ascent_captive,/obj/item/clothing/mask/gas/ascent_captive,/obj/item/clothing/mask/gas/ascent_captive,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "Gk" = (/obj/structure/hygiene/sink/ascent{dir = 4; icon_state = "sink"; pixel_x = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_caulship) "Ri" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 5; icon_state = "intact-supply"},/turf/simulated/floor/ascent,/area/ship/ascent_caulship) @@ -269,21 +269,21 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUbUbUaaaaaaabababagakahaiaiaiababababababaaaaaaaaaaaaaabUdabUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaaaaaaaabajamaqaranaoayatavarawaPaCabaaaaaaaaaadcdcdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUdabUaaaaaaaaaiabaAaBaEaGaLaxazaxaMasaPaNaOabaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdadadbdcdcabaiaiabababaDabaQinaYwRbgabbGabababaiaiabaaaaaaaaaaaabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUbUaaaaabaHaIaJaKabbfbjbxazbzazcxcycGaRaSaTaUaVabaaaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaababazazazGkabbpazRibTwEcwsHazcHaZbabbcXbcababaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaabaWazbtbFoxabbpazazazbkazazazcJazazazazazbdabaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdadadbdcdcabaiaiabababaDabaQinaYwRaQabbGabababaiaiabaaaaaaaaaaaabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUbUaaaaabaHaIaJaKabbfbjbxazbzazcxcwcGaRaSaTaUaVabaaaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaababazazazGkabcyazRibTwEcwsHazcHaZbabbcXbcababaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaabaWazbtbFoxabctazazazbkazazazcJazazazazazbdabaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaaibeazbCFebKabbpazazblbOrDazazcJazazazazazAuaiaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaaibiazazazbPbMbNcKazcubmswazcIcLazazazazazuKaiaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaaiboazazazcWabbpazazbqdWbsazazaXazazazazazuVaiaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaaiazbJbRaFcVabcBazazbubvbwazazczabbybzbAazTsaiaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaaiazbJbRaFcVabcBazazbubvbwazazczabbAbzbAazTsaiaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaabbBYybDbEbBabcEazazafafafazazcAabbHYJbIbAcYaeaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaababaiababaiabcNdFcQcOcRcCcDcvcFabaiababaiaeaeaaaaaaaaaabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaabafbSabafbSabababababcSabababababbSafabvTafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUbUaaabafaaabafaaaaabbVbWaxcTaxbQbZabaaaaafabaaafabaabUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdadadbdcabafaaabafaaaaaivqbXazcTazcZcbaiaaaaafabaaafabaadbdadabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUbUaaabafaaabafaaaaabbybWazcTaxbQbZabaaaaafabaaafabaabUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdadadbdcabafaaabafaaaaaivqbgazcTazcZcbaiaaaaafabaaafabaadbdadabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUdabUaaaaabaaaaabaaaaaialcecMcUcPcZcbaiaaaaabaaaaabaaaabUdabUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaaaaaaaaaaaaaabbVctazbYcacccdabaaaaaaaaaaaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUaaaaaaaaaaaaaaaaabbVbXazbYcacccdabaaaaaaaaaaaaaaaabUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdabUbUaaaaaaaabUaaababababcfcgchababababaaaaaabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUdadabUbUaaaaaabUaaababbSabcjckclabbSababaaaaaabUaaaaaabUbUdabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUdadabUbUaabUbUaaabbSafabcicnEnabafbSabaaaaaaaabUaabUbUdadabUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm b/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm index 8585ad47ee393..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,33 +110,44 @@ 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)*/ + + 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 return H +/datum/job/submap/ascent_inf/is_position_available() + . = ..() + if(. && requires_supervisor) + for(var/mob/M in GLOB.player_list) + if(!M.client || !M.mind || !M.mind.assigned_job || M.mind.assigned_job.title != requires_supervisor) + continue + var/datum/job/submap/ascent_inf/ascent_job = M.mind.assigned_job + if(istype(ascent_job) && ascent_job.owner == owner) + return TRUE + return FALSE + /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" @@ -149,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) @@ -160,8 +170,9 @@ 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_MONARCH_WORKER) + 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, SKILL_HAULING = SKILL_TRAINED, @@ -174,8 +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." - whitelisted_species = list(SPECIES_MONARCH_QUEEN) + 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/maps/farfleet-2.dmm b/mods/_maps/farfleet/maps/farfleet-2.dmm index 079e77ae67e16..bbe7279dfca2c 100644 --- a/mods/_maps/farfleet/maps/farfleet-2.dmm +++ b/mods/_maps/farfleet/maps/farfleet-2.dmm @@ -2589,6 +2589,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" = ( @@ -3760,8 +3763,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" = ( diff --git a/mods/_master_files/code/game/antagonist/station/changeling.dm b/mods/_master_files/code/game/antagonist/station/changeling.dm new file mode 100644 index 0000000000000..3b085e0bad929 --- /dev/null +++ b/mods/_master_files/code/game/antagonist/station/changeling.dm @@ -0,0 +1,2 @@ +/datum/antagonist/changeling + skill_setter = /datum/antag_skill_setter/station \ No newline at end of file diff --git a/mods/_master_files/code/game/objects/structures/mineral_bath.dm b/mods/_master_files/code/game/objects/structures/mineral_bath.dm new file mode 100644 index 0000000000000..3bb1a0ab99823 --- /dev/null +++ b/mods/_master_files/code/game/objects/structures/mineral_bath.dm @@ -0,0 +1,17 @@ +/obj/structure/adherent_bath/Process() + ..() + + if(ishuman(occupant)) + var/mob/living/carbon/human/H = occupant + + if(H.species.name == SPECIES_ADHERENT && prob(1)) + for(var/obj/item/organ/external/E in H.organs) + if(E.status & ORGAN_BROKEN) + E.mend_fracture() + to_chat(H, SPAN_NOTICE("The mineral-rich bath mends internal structure of your [E.name].")) + break + + if(istype(E, /obj/item/organ/external/head) && E.status & ORGAN_DISFIGURED) + E.status &= ~ORGAN_DISFIGURED + to_chat(H, SPAN_NOTICE("The mineral-rich bath mends your [E.name].")) + break \ No newline at end of file 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/mob/living/life.dm b/mods/_master_files/code/modules/mob/living/life.dm new file mode 100644 index 0000000000000..d434f990fcc28 --- /dev/null +++ b/mods/_master_files/code/modules/mob/living/life.dm @@ -0,0 +1,8 @@ +//stop sight update +/mob + var/stop_sight_update = FALSE //for update_sight() + +/mob/living/update_sight() + if(stop_sight_update) return + ..() +// \ No newline at end of file diff --git a/mods/_master_files/code/modules/psionics/events/mini_spasm.dm b/mods/_master_files/code/modules/psionics/events/mini_spasm.dm new file mode 100644 index 0000000000000..3ba16a65658a4 --- /dev/null +++ b/mods/_master_files/code/modules/psionics/events/mini_spasm.dm @@ -0,0 +1,66 @@ +/datum/event/minispasm + var/alarm_sound = 'packs/infinity/sound/misc/foundation_alarm.ogg' + +/datum/event/minispasm/announce() + priority_announcement.Announce( \ + "PRIORITY ALERT: SIGMA-[rand(50,80)] PSIONIC SIGNAL LOCAL TRAMISSION DETECTED (97% MATCH, NONVARIANT) \ + (SIGNAL SOURCE TRIANGULATED ADJACENT LOCAL SITE): All personnel are advised to avoid \ + exposure to active audio transmission equipment including radio headsets and intercoms \ + for the duration of the signal broadcast.", \ + "Cuchulain Sensor Array Automated Message" \ + ) + 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.", \ + "Cuchulain Sensor Array Automated Message", \ + new_sound = 'packs/infinity/sound/misc/foundation_restore.ogg' ) + +/datum/event/minispasm/do_spasm(mob/living/victim, obj/item/device/radio/source) + set waitfor = 0 + + if(iscarbon(victim) && !victim.isSynthetic()) + var/list/disabilities = list(NEARSIGHTED, EPILEPSY, NERVOUS) + for(var/disability in disabilities) + if(victim.disabilities & disability) + disabilities -= disability + if(length(disabilities)) + victim.disabilities |= pick(disabilities) + + if(victim.psi) + to_chat(victim, SPAN_DANGER("A hauntingly familiar sound hisses from [icon2html(source, victim)] \the [source], and your vision flickers!")) + victim.psi.backblast(rand(5,15)) + victim.Paralyse(5) + victim.make_jittery(100) + else + to_chat(victim, SPAN_DANGER("An indescribable, brain-tearing sound hisses from [icon2html(source, victim)] \the [source], and you collapse in a seizure!")) + victim.seizure() + victim.adjustBrainLoss(rand(5,15)) + sleep(45) + + if(victim.psi) + victim.psi.check_latency_trigger(100, "a psionic scream", redactive = TRUE) + + if(!victim.psi && prob(5)) + var/new_latencies = rand(1,4) + var/list/faculties = list(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS) + for(var/i = 1 to new_latencies) + to_chat(victim, SPAN_DANGER(FONT_LARGE(pick(psi_operancy_messages)))) + victim.adjustBrainLoss(rand(5,10)) + victim.set_psi_rank(pick_n_take(faculties), 1) + sleep(30) + if(victim.psi) + victim.psi.update() \ No newline at end of file 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 488bd469e9839..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 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/ascent/code/ascent_atoms.dm b/mods/ascent/code/ascent_atoms.dm index 493305d4bad88..dd4cf4406eb89 100644 --- a/mods/ascent/code/ascent_atoms.dm +++ b/mods/ascent/code/ascent_atoms.dm @@ -4,11 +4,15 @@ MANTIDIFY(/obj/item/storage/bag/trash/purple, "sample collection carrier", "m MANTIDIFY(/obj/structure/bed/chair/padded/purple,"mantid nest", "resting place") MANTIDIFY(/obj/item/pickaxe/diamonddrill, "lithobliterator", "drilling") MANTIDIFY(/obj/item/tank/jetpack/carbondioxide, "maneuvering pack", "propulsion") +MANTIDIFY(/obj/item/device/scanner/plant, "gazefloranotator", "plant scanning") +MANTIDIFY(/obj/item/device/scanner/xenobio, "xenonascerator", "xenolife scanning") +MANTIDIFY(/obj/item/device/scanner/health, "healthoseefer", "medicine") +MANTIDIFY(/obj/item/reagent_containers/spray/sterilizine, "cleaning agent sprayer", "sterilizing") /obj/structure/bed/chair/padded/purple/ascent icon_state = "nest_chair" base_icon = "nest_chair" - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' buckle_pixel_shift = list(0,5,0) pixel_z = 0 @@ -37,7 +41,7 @@ MANTIDIFY(/obj/item/tank/jetpack/carbondioxide, "maneuvering pack", "p /obj/item/cell/mantid name = "mantid microfusion plant" desc = "An impossibly tiny fusion reactor of mantid design." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "plant" maxcharge = 1500 w_class = ITEM_SIZE_NORMAL diff --git a/mods/ascent/code/ascent_doodads.dm b/mods/ascent/code/ascent_doodads.dm index 64c81ba48e641..7f7f18d6fe760 100644 --- a/mods/ascent/code/ascent_doodads.dm +++ b/mods/ascent/code/ascent_doodads.dm @@ -17,24 +17,24 @@ /obj/item/mop/advanced/ascent name = "deck detritus delaminator" desc = "An alien staff with spongy filaments on one end." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' item_state = "advmop" /obj/item/reagent_containers/glass/bucket/ascent name = "portable liquid cleaning agent carrier" desc = "An alien container of some sort." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' item_state = "bucket" /obj/structure/mopbucket/ascent name = "portable liquid cleaning agent holder" desc = "An alien container of some sort." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' /obj/item/material/knife/kitchen/cleaver/ascent name = "xenobiological flenser" desc = "A mindboggingly alien tool for flensing flesh." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' icon_state = "xenobutch" slot_flags = SLOT_DENYPOCKET | SLOT_HOLSTER | SLOT_BELT @@ -42,22 +42,22 @@ /obj/structure/closet/crate/freezer/meat/ascent name = "cryogenic stasis unit" desc = "A bizarre alien stasis unit." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' closet_appearance = /singleton/closet_appearance/crate/freezer/ascent /singleton/closet_appearance/crate/freezer/ascent color = COLOR_PURPLE - base_icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + base_icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' /obj/item/reagent_containers/food/drinks/cans/waterbottle/ascent name = "hydration cylinder" desc = "An alien portable long term storage device for potable water." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' /obj/item/reagent_containers/food/snacks/hydration name = "hydration ration" desc = "Approximately ten units of liquid hydration in a edible membrane. Unflavored." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' icon_state = "h2o_ration" bitesize = 10 /obj/item/reagent_containers/food/snacks/hydration/Initialize() @@ -67,24 +67,24 @@ /obj/item/storage/box/water/ascent name = "box of hydration cylinders" desc = "A box full of bottled water." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' icon_state = "box" startswith = list(/obj/item/reagent_containers/food/drinks/cans/waterbottle/ascent = 7) /obj/structure/hygiene/shower/ascent name = "hydrating decontamination armature" desc = "An alien vertical squirt bath." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' /obj/structure/hygiene/sink/ascent name = "hydration outlet" desc = "An alien wall mounted basin with mysterious protrusions." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' /obj/structure/reagent_dispensers/water_cooler/ascent name = "hydration dispensator" desc = "An alien device housing liquid for alien purposes." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' cups = 50 cup_type = /obj/item/reagent_containers/food/snacks/hydration @@ -93,6 +93,3 @@ /obj/structure/reagent_dispensers/water_cooler/ascent/RejectionMessage(mob/user) return "\The [src]'s orb supply is empty. Notify a control mind." - -MANTIDIFY(/obj/item/device/scanner/health, "healthorrebator", "medicine") -MANTIDIFY(/obj/item/reagent_containers/spray/sterilizine, "cleaning agent sprayer", "sterilizing") diff --git a/mods/ascent/code/ascent_effects.dm b/mods/ascent/code/ascent_effects.dm index 574138d7206ad..40fb9761f8b1f 100644 --- a/mods/ascent/code/ascent_effects.dm +++ b/mods/ascent/code/ascent_effects.dm @@ -20,7 +20,7 @@ /obj/item/razorweb name = "razorweb wad" desc = "A wad of crystalline monofilament." - icon = 'mods/ascent/icons/misc/razorweb.dmi' + icon = 'mods/ascent/icons/obj/razorweb.dmi' icon_state = "wad" var/web_type = /obj/effect/razorweb @@ -38,7 +38,7 @@ /obj/effect/razorweb name = "razorweb" desc = "A glimmering web of razor-sharp crystalline strands. Probably not something you want to sprint through." - icon = 'mods/ascent/icons/misc/razorweb.dmi' + icon = 'mods/ascent/icons/obj/razorweb.dmi' icon_state = "razorweb" anchored = TRUE diff --git a/mods/ascent/code/ascent_id.dm b/mods/ascent/code/ascent_id.dm index 68b2edcf928f8..a928c9c5e0f6b 100644 --- a/mods/ascent/code/ascent_id.dm +++ b/mods/ascent/code/ascent_id.dm @@ -7,7 +7,7 @@ var/global/const/access_ascent = "ACCESS_ASCENT" // ID 'card' /obj/item/card/id/ascent name = "alien chip" - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "access_card" desc = "A slender, complex chip of alien circuitry." access = list(access_ascent) @@ -35,7 +35,7 @@ var/global/const/access_ascent = "ACCESS_ASCENT" /obj/item/organ/internal/controller name = "system controller" desc = "A fist-sized lump of complex circuitry." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "plant" parent_organ = BP_CHEST organ_tag = BP_SYSTEM_CONTROLLER diff --git a/mods/ascent/code/ascent_outfits.dm b/mods/ascent/code/ascent_outfits.dm index 8067a606d4483..9a990fd45cfa3 100644 --- a/mods/ascent/code/ascent_outfits.dm +++ b/mods/ascent/code/ascent_outfits.dm @@ -64,7 +64,7 @@ /obj/item/clothing/shoes/magboots/ascent name = "mantid mag-claws" desc = "A set of powerful gripping claws." - icon = 'mods/ascent/icons/misc/ascent_doodads.dmi' + icon = 'mods/ascent/icons/obj/ascent_doodads.dmi' icon_state = "ascent_boots0" icon_base = "ascent_boots" species_restricted = list(SPECIES_MANTID_ALATE, SPECIES_MANTID_GYNE) diff --git a/mods/ascent/code/ascent_rigs.dm b/mods/ascent/code/ascent_rigs.dm index e47973a4c7494..785cb4fd6b8a9 100644 --- a/mods/ascent/code/ascent_rigs.dm +++ b/mods/ascent/code/ascent_rigs.dm @@ -64,7 +64,7 @@ desc = "A flechette nanofabricator and launch system of Ascent design." interface_name = "flechette rifle" interface_desc = "A flechette nanofabricator and launch system of Ascent design." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "rifle" laser = /obj/item/gun/energy/particle/flechette @@ -73,7 +73,7 @@ desc = "A mounted particle rifle of Ascent design." interface_name = "particle rifle" interface_desc = "A mounted particle rifle of Ascent design." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "rifle" laser = /obj/item/gun/energy/particle @@ -83,7 +83,7 @@ interface_name = "multitool" interface_desc = "A limited-sentience integrated multitool capable of interfacing with any number of systems." device = /obj/item/device/multitool/mantid - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "multitool" usable = FALSE selectable = TRUE @@ -98,7 +98,7 @@ interface_name = "cable fabricator" interface_desc = "A cable nanofabricator of Ascent design." device = /obj/item/stack/cable_coil/fabricator - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "cablecoil" usable = FALSE selectable = TRUE @@ -108,7 +108,7 @@ desc = "An electrical cutting torch of Ascent design." interface_name = "welding arm" interface_desc = "An electrical cutting torch of Ascent design." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "welder1" engage_string = "Toggle Welder" device = /obj/item/weldingtool/electric/mantid @@ -120,7 +120,7 @@ desc = "A complex assembly of self-guiding, modular heads capable of performing most manual tasks." interface_name = "modular clustertool" interface_desc = "A complex assembly of self-guiding, modular heads capable of performing most manual tasks." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "clustertool" engage_string = "Select Mode" device = /obj/item/clustertool @@ -205,7 +205,7 @@ desc = "A compact chemical dispenser of mantid design." interface_name = "mantid chemical injector" interface_desc = "A compact chemical dispenser of mantid design." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "injector" charges = list( list("bromide", "bromide", /datum/reagent/toxin/bromide, 30), @@ -219,7 +219,7 @@ desc = "A compact chemical dispenser of mantid design." interface_name = "serpentid chemical injector" interface_desc = "A compact chemical dispenser of mantid design." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "injector" charges = list( list("tramadol", "tramadol", /datum/reagent/tramadol, 30), diff --git a/mods/ascent/code/ascent_species.dm b/mods/ascent/code/ascent_species.dm index 7ceae4dbf3d6c..716008ee75142 100644 --- a/mods/ascent/code/ascent_species.dm +++ b/mods/ascent/code/ascent_species.dm @@ -12,7 +12,7 @@ deform = 'mods/ascent/icons/mob/alate/body.dmi' damage_overlays = 'mods/ascent/icons/mob/alate/damage_mask.dmi' blood_mask = 'mods/ascent/icons/mob/alate/blood_mask.dmi' - organs_icon = 'mods/ascent/icons/items/organs.dmi' + organs_icon = 'mods/ascent/icons/obj/items/organs.dmi' blood_color = "#660066" flesh_color = "#009999" @@ -251,7 +251,7 @@ years ago and now allies and peers within the Ascent." icobase = 'icons/mob/human_races/species/nabber/body_msw.dmi' deform = 'icons/mob/human_races/species/nabber/body_msw.dmi' - spawn_flags = SPECIES_CAN_JOIN | SPECIES_NO_FBP_CONSTRUCTION | SPECIES_NO_FBP_CHARGEN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_IS_RESTRICTED | SPECIES_NO_FBP_CONSTRUCTION | SPECIES_NO_FBP_CHARGEN | SPECIES_IS_WHITELISTED appearance_flags = 0 base_skin_colours = null hud_type = /datum/hud_data/mantid @@ -304,7 +304,7 @@ hud_type = /datum/hud_data/mantid appearance_flags = 0 base_skin_colours = null - spawn_flags = SPECIES_CAN_JOIN | SPECIES_NO_FBP_CONSTRUCTION | SPECIES_NO_FBP_CHARGEN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_IS_RESTRICTED | SPECIES_NO_FBP_CONSTRUCTION | SPECIES_NO_FBP_CHARGEN | SPECIES_IS_WHITELISTED has_organ = list( BP_BRAIN = /obj/item/organ/internal/brain/insectoid/nabber, BP_EYES = /obj/item/organ/internal/eyes/insectoid/msq, diff --git a/mods/ascent/code/ascent_tools.dm b/mods/ascent/code/ascent_tools.dm index 12faf1625813a..514b6ff3d1010 100644 --- a/mods/ascent/code/ascent_tools.dm +++ b/mods/ascent/code/ascent_tools.dm @@ -1,12 +1,12 @@ /obj/item/weldingtool/electric/mantid name = "alien welding tool" desc = "An oddly shaped alien welding tool." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' /obj/item/device/multitool/mantid name = "alien multitool" desc = "An alien microcomputer of some kind." - icon = 'mods/ascent/icons/items/ascent.dmi' + icon = 'mods/ascent/icons/obj/items/ascent.dmi' icon_state = "multitool" /obj/item/clothing/gloves/anomaly_detector/mantid diff --git a/mods/ascent/icons/items/ascent.dmi b/mods/ascent/icons/items/ascent.dmi deleted file mode 100644 index 0b2bb06535f76..0000000000000 Binary files a/mods/ascent/icons/items/ascent.dmi and /dev/null differ diff --git a/mods/ascent/icons/misc/ascent_doodads.dmi b/mods/ascent/icons/obj/ascent_doodads.dmi similarity index 100% rename from mods/ascent/icons/misc/ascent_doodads.dmi rename to mods/ascent/icons/obj/ascent_doodads.dmi diff --git a/mods/ascent/icons/obj/items/ascent.dmi b/mods/ascent/icons/obj/items/ascent.dmi new file mode 100644 index 0000000000000..44945e58ce288 Binary files /dev/null and b/mods/ascent/icons/obj/items/ascent.dmi differ diff --git a/mods/ascent/icons/obj/egg.dmi b/mods/ascent/icons/obj/items/egg.dmi similarity index 100% rename from mods/ascent/icons/obj/egg.dmi rename to mods/ascent/icons/obj/items/egg.dmi diff --git a/mods/ascent/icons/items/organs.dmi b/mods/ascent/icons/obj/items/organs.dmi similarity index 100% rename from mods/ascent/icons/items/organs.dmi rename to mods/ascent/icons/obj/items/organs.dmi diff --git a/mods/ascent/icons/misc/razorweb.dmi b/mods/ascent/icons/obj/razorweb.dmi similarity index 100% rename from mods/ascent/icons/misc/razorweb.dmi rename to mods/ascent/icons/obj/razorweb.dmi 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/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/explosions/code/explosion_iter.dm b/mods/explosions/code/explosion_iter.dm index cda3aeb80ad16..f384b3e87b0dc 100644 --- a/mods/explosions/code/explosion_iter.dm +++ b/mods/explosions/code/explosion_iter.dm @@ -121,7 +121,7 @@ SUBSYSTEM_DEF(explosives) var/vibration = 1 if(istype(epicenter, /turf/space)) vibration = 0 - for(var/thing in RANGE_TURFS(epicenter, max_range)) + for(var/thing as anything in RANGE_TURFS(epicenter, max_range)) var/turf/T = thing if (!istype(T, /turf/space)) //If there is a nonspace tile within the explosion radius @@ -145,7 +145,7 @@ SUBSYSTEM_DEF(explosives) //If the person is standing in space, they wont hear //But they may still feel the shaking reception = 0 - for(var/t_thing in RANGE_TURFS(M, 1)) + for(var/t_thing as anything in RANGE_TURFS(M, 1)) var/turf/T = t_thing if(!istype(T, /turf/space)) //If theyre touching the hull or on some extruding part of the station @@ -188,7 +188,7 @@ SUBSYSTEM_DEF(explosives) var/x0 = epicenter.x var/y0 = epicenter.y - for(var/thing in RANGE_TURFS(epicenter, max_range)) + for(var/thing as anything in RANGE_TURFS(epicenter, max_range)) var/turf/T = thing if (!T) continue @@ -335,7 +335,7 @@ SUBSYSTEM_DEF(explosives) if (T.type == /turf/space) // Equality is faster than istype. reception = EXPLFX_NONE - for (var/turf/simulated/THING in RANGE_TURFS(M, 1)) + for (var/turf/simulated/THING as anything in RANGE_TURFS(M, 1)) reception |= EXPLFX_SHAKE break @@ -383,6 +383,11 @@ SUBSYSTEM_DEF(explosives) if ((act_turfs[T] % 10) == 0) CHECK_TICK + if(epicenter) + for(var/obj/item/device/beacon/explosion_watcher/W in explosion_watcher_list) + if(get_dist(W, epicenter) < 10) + W.react_explosion(epicenter, power) + explosion_in_progress = FALSE #undef SEARCH_DIR diff --git a/mods/failu_skrell_clothes/README.md b/mods/failu_skrell_clothes/README.md new file mode 100644 index 0000000000000..d5722875f328e --- /dev/null +++ b/mods/failu_skrell_clothes/README.md @@ -0,0 +1,78 @@ + +#### Список PRов: + +- https://github.com/SierraBay/SierraBay12/pull/##### + + + +## Skrell Clothes by Failu + +ID мода: FAILU_SKRELL_CLOTHES + + +### Описание мода + +Этот мод добавляет новую одежду для скреллов, включая все касты (у Кверр-Кэтиш только одна новая одёжка). + + +### Изменения *кор кода* + +- Отсутствуют + + +### Оверрайды + +- Отсутствуют + + +### Дефайны + +- Отсутствуют + + +### Используемые файлы, не содержащиеся в модпаке + +- Отсутствуют + + +### Авторы: + +KOJIECO +Failu + diff --git a/mods/failu_skrell_clothes/_failu_skrell_clothes.dm b/mods/failu_skrell_clothes/_failu_skrell_clothes.dm new file mode 100644 index 0000000000000..2429145207f6c --- /dev/null +++ b/mods/failu_skrell_clothes/_failu_skrell_clothes.dm @@ -0,0 +1,4 @@ +/singleton/modpack/failu_skrell_clothes + name = "Skrell Clothes by Failu" + desc = "Мод добавляет одежду для скреллов всех каст." + author = "KOJIECO" diff --git a/mods/failu_skrell_clothes/_failu_skrell_clothes.dme b/mods/failu_skrell_clothes/_failu_skrell_clothes.dme new file mode 100644 index 0000000000000..fc08c42b7cc25 --- /dev/null +++ b/mods/failu_skrell_clothes/_failu_skrell_clothes.dme @@ -0,0 +1,9 @@ +#ifndef MODPACK_FAILU_SKRELL_CLOTHES +#define MODPACK_FAILU_SKRELL_CLOTHES + +#include "_failu_skrell_clothes.dm" +#include "code/suits.dm" +#include "code/uniforms.dm" +#include "code/lists/xenowear.dm" + +#endif diff --git a/mods/failu_skrell_clothes/code/lists/xenowear.dm b/mods/failu_skrell_clothes/code/lists/xenowear.dm new file mode 100644 index 0000000000000..264f192ed0942 --- /dev/null +++ b/mods/failu_skrell_clothes/code/lists/xenowear.dm @@ -0,0 +1,36 @@ +// Alien clothing + +// Skrell clothing + +// Коммент от Колеса: если по какой-то причине у вас не отображается вещь в нужной вкладке лодаута, почекайте +// её в других вкладках. Если отображается не там, где нужно, поищите в коркоде определенные флаги сортировки. +// У меня например пришлось брать из коркода sort_category = "Xenowear" +/datum/gear/suit/skrell_robe + display_name = "(Skrell) Skrellian robe" + path = /obj/item/clothing/suit/skrell_robe + sort_category = "Xenowear" + cost = 1 + slot = slot_wear_suit + +/datum/gear/suit/skrell_clothes + display_name = "(Skrell) Skrell clothes selection" + path = /obj/item/clothing/under/ + sort_category = "Xenowear" + +/datum/gear/suit/skrell_clothes/New() + ..() + var/skrell_clothes = list() + skrell_clothes["Talum-Katish blue dress"] = /obj/item/clothing/under/uniform/skrell_talum_bluedress + skrell_clothes["Talum-Katish green waist cloak"] = /obj/item/clothing/under/uniform/skrell_talum_greenwaistcloak + skrell_clothes["Raskinta-Katish navy clothes"] = /obj/item/clothing/under/uniform/skrell_raskinta_navyclothes + skrell_clothes["Malish-Katish blue office suit"] = /obj/item/clothing/under/uniform/skrell_malish_officesuit + skrell_clothes["Talum-Katish white and red dress"] = /obj/item/clothing/under/uniform/skrell_talum_whitereddress + skrell_clothes["Malish-Katish office suit with tie"] = /obj/item/clothing/under/uniform/skrell_malish_greentiedsuit + skrell_clothes["Kanin-Katish sand-blue turtleneck"] = /obj/item/clothing/under/uniform/skrell_kanin_sandblueturtleneck + skrell_clothes["Kanin-Katish orange-cyan uniform"] = /obj/item/clothing/under/uniform/skrell_kanin_orangecyanuniform + skrell_clothes["Kanin-Katish yellow-black costume"] = /obj/item/clothing/under/uniform/skrell_kanin_yellowblackcostume + skrell_clothes["Malish-Katish green office suit with suspenders"] = /obj/item/clothing/under/uniform/skrell_malish_greenofficesuit + skrell_clothes["Raskinta-Katish red clothes"] = /obj/item/clothing/under/uniform/skrell_raskinta_redclothes + skrell_clothes["Skrellian diving suit"] = /obj/item/clothing/under/uniform/skrell_skrellian_divingsuit + gear_tweaks += new/datum/gear_tweak/path(skrell_clothes) + diff --git a/mods/failu_skrell_clothes/code/suits.dm b/mods/failu_skrell_clothes/code/suits.dm new file mode 100644 index 0000000000000..c15e0db6e6a74 --- /dev/null +++ b/mods/failu_skrell_clothes/code/suits.dm @@ -0,0 +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" diff --git a/mods/failu_skrell_clothes/code/uniforms.dm b/mods/failu_skrell_clothes/code/uniforms.dm new file mode 100644 index 0000000000000..3103d8579bf09 --- /dev/null +++ b/mods/failu_skrell_clothes/code/uniforms.dm @@ -0,0 +1,122 @@ +// Skrell outfits + + +/obj/item/clothing/under/uniform/skrell_talum_bluedress + name = "Talum-Katish blue dress" + desc = "Talum's blue dress, seems luminous, it's light and pleasant to the touch. The dress has a purple cape on the shoulders." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "talum_bluedress_s" + item_state = "talum_bluedress_s" + worn_state = "talum_bluedress" + + +/obj/item/clothing/under/uniform/skrell_talum_greenwaistcloak + name = "Talum-Katish green waist cloak" + desc = "Talum's white-green clothes with the translucent veil at the waist." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "talum_greenwaistcloak_s" + item_state = "talum_greenwaistcloak_s" + worn_state = "talum_greenwaistcloak" + + +/obj/item/clothing/under/uniform/skrell_raskinta_navyclothes + name = "Raskinta-Katish navy clothes" + desc = "Raskinta's navy clothes. Has no Qarr-Morr'Kon markings, and pretty flexible!" + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "raskinta_navyclothes_s" + item_state = "raskinta_navyclothes_s" + worn_state = "raskinta_navyclothes" + + + +/obj/item/clothing/under/uniform/skrell_malish_officesuit + name = "Malish-Katish blue office suit" + desc = "Malish's office suit, light top, dark bottom, and some glowing purple-teal jewelry." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "malish_officesuit_s" + item_state = "malish_officesuit_s" + worn_state = "malish_officesuit" + + +/obj/item/clothing/under/uniform/skrell_talum_whitereddress + name = "Talum-Katish white and red dress" + desc = "Talum's white-red dress. The sparkling red skirt is attached to one of the legs. It looks unusual." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "talum_whitereddress_s" + item_state = "talum_whitereddress_s" + worn_state = "talum_whitereddress" + + + +/obj/item/clothing/under/uniform/skrell_malish_greentiedsuit + name = "Malish-Katish office suit with tie" + desc = "Malish's office suit, light top, green bottom, and a nice-looking green tie that barely touches the neck, made of soft material." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "malish_greentiedsuit_s" + item_state = "malish_greentiedsuit_s" + worn_state = "malish_greentiedsuit" + + +/obj/item/clothing/under/uniform/skrell_kanin_sandblueturtleneck + name = "Kanin-Katish sand-blue turtleneck" + desc = "Comfortable Kanin's clothing that has padded inserts and cleverly stitched fabric, allowing the wearer's skin to breathe." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "kanin_sandblueturtleneck_s" + item_state = "kanin_sandblueturtleneck_s" + worn_state = "kanin_sandblueturtleneck" + +/obj/item/clothing/under/uniform/skrell_kanin_orangecyanuniform + name = "Kanin-Katish orange-cyan uniform" + desc = "Lightweight, breathable uniform designed for work in non-traumatic conditions, providing its owner with ease of movement." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "kanin_orangecyanuniform_s" + item_state = "kanin_orangecyanuniform_s" + worn_state = "kanin_orangecyanuniform" + + +/obj/item/clothing/under/uniform/skrell_kanin_yellowblackcostume + name = "Kanin-Katish yellow-black costume" + desc = "Kanin's black and yellow suit is of high quality, the contrast of colors makes a highly qualified employee stand out. White helmet is not included!" + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "kanin_yellowblackcostume_s" + item_state = "kanin_yellowblackcostume_s" + worn_state = "kanin_yellowblackcostume" + +/obj/item/clothing/under/uniform/skrell_malish_greenofficesuit + name = "Malish-Katish green office suit with suspenders" + desc = "Malish's office suit, light top, black bottom, and a fancy lime-green thin veil above the belt." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "malish_greenofficesuit_s" + item_state = "malish_greenofficesuit_s" + worn_state = "malish_greenofficesuit" + + +/obj/item/clothing/under/uniform/skrell_raskinta_redclothes + name = "Raskinta-Katish red clothes" + desc = "Raskinta's red clothes. Has no Qarr-Morr'Kon markings, and pretty flexible!" + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "raskinta_redclothes_s" + item_state = "raskinta_redclothes_s" + worn_state = "raskinta_redclothes" + + +/obj/item/clothing/under/uniform/skrell_skrellian_divingsuit + name = "Skrellian diving suit" + desc = "A highly detailed Skrellian diving suit. Found mainly among the inhabitants of the planets of the Empire." + icon = 'mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi' + item_icons = list(slot_w_uniform_str = 'mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi') + icon_state = "skrellian_divingsuit_s" + item_state = "skrellian_divingsuit_s" + worn_state = "skrellian_divingsuit" + diff --git a/mods/failu_skrell_clothes/icons/skrell/idk.dmi b/mods/failu_skrell_clothes/icons/skrell/idk.dmi new file mode 100644 index 0000000000000..a8895fa4ad6f4 Binary files /dev/null and b/mods/failu_skrell_clothes/icons/skrell/idk.dmi differ diff --git a/mods/failu_skrell_clothes/icons/skrell/obj_skrell_robe.dmi b/mods/failu_skrell_clothes/icons/skrell/obj_skrell_robe.dmi new file mode 100644 index 0000000000000..366817558a217 Binary files /dev/null and b/mods/failu_skrell_clothes/icons/skrell/obj_skrell_robe.dmi differ diff --git a/mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi b/mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi new file mode 100644 index 0000000000000..c48ce19a8688c Binary files /dev/null and b/mods/failu_skrell_clothes/icons/skrell/obj_under_skrell.dmi differ diff --git a/mods/failu_skrell_clothes/icons/skrell/onmob_skrell_robe.dmi b/mods/failu_skrell_clothes/icons/skrell/onmob_skrell_robe.dmi new file mode 100644 index 0000000000000..3abd04cfd1365 Binary files /dev/null and b/mods/failu_skrell_clothes/icons/skrell/onmob_skrell_robe.dmi differ diff --git a/mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi b/mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi new file mode 100644 index 0000000000000..b5f10fba5cdf9 Binary files /dev/null and b/mods/failu_skrell_clothes/icons/skrell/onmob_under_skrell.dmi differ diff --git a/mods/failu_skrell_clothes/icons/skrell/skrell_ointment.dmi b/mods/failu_skrell_clothes/icons/skrell/skrell_ointment.dmi new file mode 100644 index 0000000000000..a76b1dd502282 Binary files /dev/null and b/mods/failu_skrell_clothes/icons/skrell/skrell_ointment.dmi differ diff --git a/mods/failu_skrell_clothes/icons/skrell/skrell_raskinta_boots.dmi b/mods/failu_skrell_clothes/icons/skrell/skrell_raskinta_boots.dmi new file mode 100644 index 0000000000000..48149800a1d3a Binary files /dev/null and b/mods/failu_skrell_clothes/icons/skrell/skrell_raskinta_boots.dmi differ diff --git a/mods/failu_skrell_clothes/icons/skrell/skrell_shoulder_windings.dmi b/mods/failu_skrell_clothes/icons/skrell/skrell_shoulder_windings.dmi new file mode 100644 index 0000000000000..e8b246d3e993a Binary files /dev/null and b/mods/failu_skrell_clothes/icons/skrell/skrell_shoulder_windings.dmi differ diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm index 10f72937063ed..f63dbd1ae927d 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,5 +40,8 @@ #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 "../packs/sierra-tweaks/_pack.dm" 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_functions.dm b/mods/ipc_mods/code/machine_functions.dm index 90680aa9dfbd5..7ea20594f4f1f 100644 --- a/mods/ipc_mods/code/machine_functions.dm +++ b/mods/ipc_mods/code/machine_functions.dm @@ -88,3 +88,83 @@ visible_message("\The [src] attaches \the [O] to \his body!", "You attach \the [O] to your body!") + + + +/obj/screen/fullscreen/no_power + icon = 'mods/ipc_mods/icons/glitch.dmi' + icon_state = "no_power" + layer = BLIND_LAYER + scale_to_view = TRUE + +/obj/screen/fullscreen/glitch_monitor + icon = 'mods/ipc_mods/icons/glitch.dmi' + icon_state = "glitch_monitor" + layer = BLIND_LAYER + scale_to_view = TRUE + alpha = 60 + +/obj/screen/fullscreen/glitchs + icon = 'mods/ipc_mods/icons/glitch.dmi' + icon_state = "glitch_eye" + layer = BLIND_LAYER + scale_to_view = TRUE + +/obj/screen/fullscreen/glitch_bw + icon = 'mods/ipc_mods/icons/glitch.dmi' + icon_state = "glitch_bw" + layer = BLIND_LAYER + scale_to_view = TRUE + alpha = 60 + +/obj/screen/fullscreen/glitch_bw/alpha + alpha = 160 + + +/datum/species/handle_vision(mob/living/carbon/human/H) + if(H.isSynthetic()) + var/list/vision = H.get_accumulated_vision_handlers() + H.update_sight() + H.set_sight(H.sight|get_vision_flags(H)|H.equipment_vision_flags|vision[1]) + H.change_light_colour(H.getDarkvisionTint()) + + if(H.stat == DEAD) + return 1 + + if(!H.druggy) + H.set_see_in_dark((H.sight == (SEE_TURFS|SEE_MOBS|SEE_OBJS)) ? 8 : min(H.getDarkvisionRange() + H.equipment_darkness_modifier, 8)) + if(H.equipment_see_invis) + H.set_see_invisible(max(min(H.see_invisible, H.equipment_see_invis), vision[2])) + + if(H.equipment_tint_total >= TINT_BLIND) + H.eye_blind = max(H.eye_blind, 1) + + if(!H.client)//no client, no screen to update + return 1 + + if(H.stat == !UNCONSCIOUS) + H.set_fullscreen(H.eye_blind && !H.equipment_prescription, "glitch_monitor", /obj/screen/fullscreen/glitch_bw/alpha) + H.set_fullscreen(H.stat == UNCONSCIOUS, "no_power", /obj/screen/fullscreen/no_power) + + if(config.welder_vision) + H.set_fullscreen(H.equipment_tint_total, "welder", /obj/screen/fullscreen/impaired, H.equipment_tint_total) + var/how_nearsighted = get_how_nearsighted(H) + H.set_fullscreen(how_nearsighted, "nearsighted", /obj/screen/fullscreen/oxy, how_nearsighted) + H.set_fullscreen(H.eye_blurry, "blurry", /obj/screen/fullscreen/glitch_bw) + H.set_fullscreen(H.druggy, "high", /obj/screen/fullscreen/high) + + for(var/overlay in H.equipment_overlays) + H.client.screen |= overlay + + return 1 + else + .=..() + +/mob/living/carbon/human/emp_act(severity) + . = ..() + if(isSynthetic()) + overlay_fullscreen("sensoremp", /obj/screen/fullscreen/glitchs) + addtimer(new Callback(src, PROC_REF(clear_emp_act)), 1.5 SECONDS) + +/mob/living/carbon/human/proc/clear_emp_act() + clear_fullscreen("sensoremp") diff --git a/mods/ipc_mods/icons/glitch.dmi b/mods/ipc_mods/icons/glitch.dmi new file mode 100644 index 0000000000000..f566e2744092d Binary files /dev/null and b/mods/ipc_mods/icons/glitch.dmi differ 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/playable_away_yacht/maps/yacht.dmm b/mods/playable_away_yacht/maps/yacht.dmm index 76affd2130754..31eff0213b5db 100644 --- a/mods/playable_away_yacht/maps/yacht.dmm +++ b/mods/playable_away_yacht/maps/yacht.dmm @@ -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/clothing/glasses.dm b/mods/resomi/code/clothing/glasses.dm index ee53db0044a1d..99ba972a7ee5d 100644 --- a/mods/resomi/code/clothing/glasses.dm +++ b/mods/resomi/code/clothing/glasses.dm @@ -9,7 +9,7 @@ flash_protection = FLASH_PROTECTION_MODERATE body_parts_covered = 0 -/obj/item/clothing/glasses/sunglasses/sechud/lenses +/obj/item/clothing/glasses/hud/security/lenses name = "small sechud lenses" desc = "Lenses with a HUD. This one has a sechud." item_icons = list(slot_glasses_str = 'mods/resomi/icons/clothing/onmob_eyes_resomi.dmi') diff --git a/mods/resomi/code/datum/gear.dm b/mods/resomi/code/datum/gear.dm index c4b1542af62a5..10c725039e56f 100644 --- a/mods/resomi/code/datum/gear.dm +++ b/mods/resomi/code/datum/gear.dm @@ -88,7 +88,7 @@ /datum/gear/eyes/security/resomi display_name = "(Resomi) sun sechud lenses" - path = /obj/item/clothing/glasses/sunglasses/sechud/lenses + path = /obj/item/clothing/glasses/hud/security/lenses sort_category = "Xenowear" whitelisted = list(SPECIES_RESOMI) diff --git a/mods/resomi/code/datum/species.dm b/mods/resomi/code/datum/species.dm index 2b95a68ec3964..902811cefe2b5 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( "Вашу кожу покалывает от жары.", "Вам жарко.", @@ -204,4 +204,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/ssinput/code/keybindings/living.dm b/mods/ssinput/code/keybindings/living.dm index 25ef5f15e3c8b..cd998b68120a5 100644 --- a/mods/ssinput/code/keybindings/living.dm +++ b/mods/ssinput/code/keybindings/living.dm @@ -18,6 +18,16 @@ L.lay_down() return TRUE +/datum/keybinding/mob/face_direction + hotkey_keys = list("]") + name = "face_direction" + full_name = "Face Direction" + description = "Block dir" + +/datum/keybinding/mob/face_direction/down(client/user) + var/mob/living/L = user.mob + L.set_face_dir() + return TRUE /datum/keybinding/living/resist hotkey_keys = list("B") diff --git a/mods/utility_items/_utility_items.dme b/mods/utility_items/_utility_items.dme index e16f9dc2d440e..7d7e1d016ed6f 100644 --- a/mods/utility_items/_utility_items.dme +++ b/mods/utility_items/_utility_items.dme @@ -16,11 +16,16 @@ #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" + #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..5d71054169c5c --- /dev/null +++ b/mods/utility_items/code/advanced_landing.dm @@ -0,0 +1,300 @@ +/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.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, + ) + +/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() + + 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 + if(!(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/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) + 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.shuttle_type.set_destination(landmark) + +/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 diff --git a/mods/utility_items/code/chemistry.dm b/mods/utility_items/code/chemistry.dm new file mode 100644 index 0000000000000..d84631af5512c --- /dev/null +++ b/mods/utility_items/code/chemistry.dm @@ -0,0 +1,42 @@ +/singleton/reaction/goldalchemy + name = "Gold" + result = null + required_reagents = list(/datum/reagent/frostoil = 5, /datum/reagent/gold = 20) + catalysts = list(/datum/reagent/coolant=1) + result_amount = 1 + mix_message = "The solution solidifies into a golden mass." + +/singleton/reaction/goldalchemy/on_reaction(datum/reagents/holder, created_volume, reaction_flags) + ..() + new /obj/item/stack/material/gold(get_turf(holder.my_atom), created_volume) + +/singleton/reaction/silveralchemy + name = "Silver" + result = null + required_reagents = list(/datum/reagent/frostoil = 5, /datum/reagent/silver = 20) + result_amount = 1 + mix_message = "The solution solidifies into a silver mass." + +/singleton/reaction/silveralchemy/on_reaction(datum/reagents/holder, created_volume, reaction_flags) + ..() + new /obj/item/stack/material/silver(get_turf(holder.my_atom), created_volume) + + + +/singleton/reaction/kompot + name = "Kompot" + result = /datum/reagent/drink/kompot + required_reagents = list(/datum/reagent/water = 2, /datum/reagent/drink/juice/berry = 1, /datum/reagent/drink/juice/apple = 1, /datum/reagent/drink/juice/pear = 1) + result_amount = 5 + mix_message = "The mixture turns a soft orange, bubbling faintly" + +//REAGENTS// + +/datum/reagent/drink/kompot + name = "Kompot" + description = "A traditional Eastern European beverage once used to preserve fruit in the 1980s." + taste_description = "refreshuingly sweet and fruity" + color = "#ed9415" + + glass_name = "Kompot" + glass_desc = "Traditional Terran drink. Grandma would be proud." 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/jobs.dm b/mods/utility_items/code/jobs.dm new file mode 100644 index 0000000000000..ed28fc998083c --- /dev/null +++ b/mods/utility_items/code/jobs.dm @@ -0,0 +1,2 @@ +/datum/job + var/late_joinable = TRUE diff --git a/mods/utility_items/icons/alphacolors.dmi b/mods/utility_items/icons/alphacolors.dmi new file mode 100644 index 0000000000000..cbff37c5177e6 Binary files /dev/null and b/mods/utility_items/icons/alphacolors.dmi differ 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/images/science.png b/nano/images/science.png index 6dda3a2bbb1f6..fba97b86d983d 100644 Binary files a/nano/images/science.png and b/nano/images/science.png differ diff --git a/nano/templates/mods/disease_splicer.tmpl b/nano/templates/mods/disease_splicer.tmpl new file mode 100644 index 0000000000000..4a1701a0fc007 --- /dev/null +++ b/nano/templates/mods/disease_splicer.tmpl @@ -0,0 +1,125 @@ +
    +
    + {{:helper.link('Close', 'gear', {'close' : 1}, null, 'fixedLeft')}} +
    +
    + +{{if data.busy}} +
    The Splicer is currently busy.
    +
    +
    {{:data.busy}}
    +
    +

    + Thank you for your patience! +

    +{{else}} +
    +

    Virus Dish

    +
    +
    + {{:helper.link('Eject Dish', 'eject', { 'eject' : 1 }, data.dish_inserted ? null : 'disabled')}} +
    + +
    +
    + Growth Density: +
    +
    + {{:helper.displayBar(data.growth, 0, 100, (data.growth >= 50) ? 'good' : data.growth >= 25 ? 'average' : 'bad', data.growth + '%' )}} +
    +
    + +
    +
    + {{if !data.info}} +
    + Symptoms: +
    + {{/if}} +
    + {{if data.info}} + {{:data.info}} + {{else}} + {{for data.effects}} +
    +
    + ({{:value.stage}}) {{:value.name}} + {{if value.badness > 1}} + Dangerous + {{/if}} +
    +
    + {{/for}} + {{/if}} +
    +
    + {{if data.affected_species && !data.info}} +
    +
    + Affected Species: +
    +
    + {{:data.affected_species}} +
    +
    + {{/if}} +
    + {{if data.effects}} +
    + CAUTION: Reverse engineering will destroy the viral sample. +
    +
    +
    + Reverse Engineering: +
    +
    + {{for data.effects}} + {{:helper.link(value.stage, 'transferthick-e-w', { 'grab' : value.reference })}} + {{/for}} +
    +
    + {{:helper.link('Species', 'transferthick-e-w', { 'affected_species' : 1 })}} +
    +
    + {{/if}} + +
    +

    Storage

    +
    + +
    +
    + Memory Buffer: +
    +
    + {{if data.buffer}} + {{:data.buffer.name}} ({{:data.buffer.stage}}) + {{else}} + {{if data.species_buffer}} + {{:data.species_buffer}} + {{else}} + Empty + {{/if}} + {{/if}} +
    +
    + {{:helper.link('Save To Disk', 'disk', { 'disk' : 1 }, (data.buffer || data.species_buffer) ? null : 'disabled')}} + {{if data.species_buffer}} + {{:helper.link('Splice Species', 'pencil', { 'splice' : -1 }, (data.species_buffer && !data.info) ? null : 'disabled')}} + {{else data.buffer}} + {{:helper.link('Splice #1', 'pencil', { 'splice' : 1 }, data.buffer.stage > 1 ? 'disabled' : null)}} + {{:helper.link('Splice #2', 'pencil', { 'splice' : 2 }, data.buffer.stage > 2 ? 'disabled' : null)}} + {{:helper.link('Splice #3', 'pencil', { 'splice' : 3 }, data.buffer.stage > 3 ? 'disabled' : null)}} + {{:helper.link('Splice #4', 'pencil', { 'splice' : 4 }, data.buffer.stage > 4 ? 'disabled' : null)}} + {{/if}} +{{/if}} + + + + + + + + + + diff --git a/nano/templates/mods/dish_incubator.tmpl b/nano/templates/mods/dish_incubator.tmpl new file mode 100644 index 0000000000000..ae887e6986e67 --- /dev/null +++ b/nano/templates/mods/dish_incubator.tmpl @@ -0,0 +1,123 @@ +
    +
    + {{:helper.link('Close', 'gear', {'close' : '1'}, null, 'fixedLeft')}} +
    +
    + +
    +

    Environmental Conditions

    +
    +
    +
    + Power: +
    +
    + {{:helper.link('On', 'power', { 'power' : 1 }, !data.dish_inserted ? 'disabled' : data.on ? 'selected' : null)}}{{:helper.link('Off', 'close', { 'power' : 1 }, data.on ? null : 'selected')}} +
    +
    +
    + {{:helper.link('Add Radiation', 'radiation', {'rad' : 1})}} + {{:helper.link('Flush System', 'trash', {'flush' : 1}, data.system_in_use ? null : 'disabled')}} +
    + +
    +
    +
    + Virus Food: +
    +
    + {{:helper.displayBar(data.food_supply, 0, 100, 'good', data.food_supply)}} +
    +
    +
    +
    + Radiation Level: +
    +
    + {{:helper.displayBar(data.radiation, 0, 100, (data.radiation >= 50) ? 'bad' : (data.growth >= 25) ? 'average' : 'good')}} +
    + {{:helper.formatNumber(data.radiation * 10000)}} µSv +
    +
    +
    +
    + Toxicity: +
    +
    + {{:helper.displayBar(data.toxins, 0, 100, (data.toxins >= 50) ? 'bad' : (data.toxins >= 25) ? 'average' : 'good', data.toxins + '%')}} +
    +
    +
    + +
    +

    Chemicals

    +
    +
    + {{:helper.link('Eject Chemicals', 'eject', { 'ejectchem' : 1 }, data.chemicals_inserted ? null : 'disabled')}} + {{:helper.link('Breed Virus', 'circle-arrow-s', { 'virus' : 1 }, data.can_breed_virus ? null : 'disabled')}} +
    + +{{if data.chemicals_inserted}} +
    +
    + Volume: +
    +
    + {{:helper.displayBar(data.chemical_volume, 0, data.max_chemical_volume, 'good', data.chemical_volume + ' / ' + data.max_chemical_volume)}} +
    +
    +
    +
    + Breeding Environment: +
    +
    + + {{:!data.dish_inserted ? 'N/A' : data.can_breed_virus ? 'Suitable' : 'No hemolytic samples detected'}} + + {{if data.blood_already_infected}} +
    + CAUTION: Viral infection detected in blood sample. + {{/if}} +
    +
    +{{else}} +
    + No chemicals inserted. +
    +{{/if}} + +
    +

    Virus Dish

    +
    +
    + {{:helper.link('Eject Dish', 'eject', {'ejectdish' : 1}, data.dish_inserted ? null : 'disabled')}} +
    + +{{if data.dish_inserted}} + {{if data.virus}} +
    +
    + Growth Density: +
    +
    + {{:helper.displayBar(data.growth, 0, 100, (data.growth >= 50) ? 'good' : (data.growth >= 25) ? 'average' : 'bad', data.growth + '%' )}} +
    +
    +
    +
    + Infection Rate: +
    +
    + {{:data.analysed ? data.infection_rate : "Unknown"}} +
    +
    + {{else}} +
    + No virus detected. +
    + {{/if}} +{{else}} +
    + No dish loaded. +
    +{{/if}} diff --git a/nano/templates/mods/isolation_centrifuge.tmpl b/nano/templates/mods/isolation_centrifuge.tmpl new file mode 100644 index 0000000000000..4ff0272df02b8 --- /dev/null +++ b/nano/templates/mods/isolation_centrifuge.tmpl @@ -0,0 +1,81 @@ +
    + {{:helper.link('Close', 'gear', {'close' : 1}, null, 'fixedLeft')}} + {{:helper.link('Print', 'print', { 'print' : 1 }, data.antibodies || data.pathogens ? null : 'disabled', 'fixedLeft')}} +
    + +{{if data.busy}} +
    The Centrifuge is currently busy.
    +
    +
    {{:data.busy}}
    +
    +

    + Thank you for your patience! +

    +{{else}} +
    +

    {{:data.is_antibody_sample ? 'Antibody Sample' : 'Blood Sample'}}

    +
    +
    + {{:helper.link('Eject Vial', 'eject', { 'action' : 'sample' }, data.sample_inserted ? null : 'disabled')}} +
    + {{if data.sample_inserted}} + {{if data.antibodies || data.pathogens}} +
    + {{if data.antibodies}} +
    +
    + Antibodies: +
    +
    + {{:data.antibodies}} +
    +
    + {{/if}} + {{if data.pathogens}} +
    +
    + Pathogens: +
    +
    + {{for data.pathogens}} +
    + {{:value.name}} ({{:value.spread_type}}) +
    + {{/for}} +
    +
    + {{/if}} +
    + {{else}} +
    + No antibodies or viral strains detected. +
    + {{/if}} + {{else}} +
    + No vial detected. +
    + {{/if}} + {{if data.antibodies && !data.is_antibody_sample}} +
    +
    + Isolate Antibodies: +
    +
    + {{:helper.link(data.antibodies, 'pencil', { 'action' : 'antibody' })}} +
    +
    + {{/if}} + {{if data.pathogens}} +
    +
    + Isolate Strain: +
    +
    + {{for data.pathogens}} + {{:helper.link(value.name, 'pencil', { 'isolate' : value.reference })}} + {{/for}} +
    +
    + {{/if}} +{{/if}} diff --git a/nano/templates/mods/pathogenic_isolator.tmpl b/nano/templates/mods/pathogenic_isolator.tmpl new file mode 100644 index 0000000000000..69411d858fc3e --- /dev/null +++ b/nano/templates/mods/pathogenic_isolator.tmpl @@ -0,0 +1,107 @@ +
    +

    Menu

    +
    +
    + {{if !data.isolating}} + {{:helper.link('Home', 'home', {'home' : 1}, data.state == 'home' ? 'disabled' : null, 'fixedLeft')}} + {{:helper.link('List', 'note', {'list' : 1}, data.state == 'list' ? 'disabled' : null, 'fixedLeft')}} + {{:helper.link('Pathogen', 'folder-open', {'entry' : 1}, data.state == 'entry' ? 'disabled' : null, 'fixedLeft')}} + {{/if}} +
    + {{:helper.link('Close', 'gear', {'close' : 1}, null, 'fixedLeft')}} + {{:helper.link('Print', 'print', { 'print' : 1 }, data.can_print ? null : 'disabled', 'fixedLeft')}} +
    + +{{if data.isolating}} +
    The Isolator is currently busy.
    +
    +
    Isolating pathogens...
    +
    +

    + Thank you for your patience! +

    +{{else}} + {{if data.state =="home"}} +
    +

    Blood Sample

    +
    +
    + {{:helper.link('Eject Syringe', 'eject', { 'eject' : 1 }, data.syringe_inserted ? null : 'disabled')}} +
    + + {{if data.syringe_inserted}} +
    + Pathogens: + {{if data.pathogen_pool}} + {{for data.pathogen_pool}} +
    + {{:index + 1}}. #{{:value.unique_id}} {{:value.is_in_database ? "(Analysed)" : ""}}
    + {{:value.name}}: {{:value.dna}} +
    + {{/for}} + {{else}} + No pathogens detected. + {{/if}} +
    + {{else}} +
    + No syringe loaded. +
    + {{/if}} + {{if data.pathogen_pool}} +
    +
    + Isolate Pathogens: +
    +
    + {{for data.pathogen_pool}} + {{:helper.link('#' + value.unique_id, 'pencil', { 'isolate' : value.reference }, null, 'fixedLeft')}} + {{/for}} +
    +
    +
    +
    + Database Lookup: +
    +
    + {{for data.pathogen_pool}} + {{if value.is_in_database}} + {{:helper.link('#' + value.unique_id, 'info', { 'entry' : 1, 'view' : value.record }, null, 'fixedLeft')}} + {{/if}} + {{/for}} +
    +
    + {{/if}} + {{else}} + {{if data.state == "list"}} +
    +

    View Database

    +
    +
    + {{if data.database}} + {{for data.database}} +
    +
    {{:value.name}}
    + {{:helper.link('Details', 'circle-arrow-s', { 'entry' : 1, 'view' : value.record }, null, 'fixedLeft')}} +
    + {{/for}} + {{else}} + The viral database is empty. + {{/if}} +
    + {{else}} + {{if data.state == "entry"}} + {{if data.entry}} +
    +

    {{:data.entry.name}}

    +
    +
    + {{:data.entry.description}} +
    + {{else}} + No virus selected. + {{/if}} + {{/if}} + {{/if}} + {{/if}} +{{/if}} diff --git a/nano/templates/rdconsole.tmpl b/nano/templates/rdconsole.tmpl index 0714f889b864f..77f4df16a3d07 100644 --- a/nano/templates/rdconsole.tmpl +++ b/nano/templates/rdconsole.tmpl @@ -755,6 +755,7 @@ .sciTechTreeIcon.icon-eva { background-position: -96px -384px; } .sciTechTreeIcon.icon-mechloader { background-position: -128px -384px; } .sciTechTreeIcon.icon-mechlight { background-position: -160px -384px; } +.sciTechTreeIcon.icon-jetpack { background-position: -192px -384px; } .sciMenuButton { width: 300px; diff --git a/nano/templates/shuttle_control_console_exploration.tmpl b/nano/templates/shuttle_control_console_exploration.tmpl index f54a084ade565..8a1a6c09aed58 100644 --- a/nano/templates/shuttle_control_console_exploration.tmpl +++ b/nano/templates/shuttle_control_console_exploration.tmpl @@ -77,6 +77,9 @@ {{:data.destination_name}}
    {{:helper.link('Choose Destination', 'arrowreturn-1-s', {'pick' : '1'}, data.can_pick ? null : 'disabled' , null)}} + {{if data.skilled_enough}} + {{:helper.link('Advanced Landing', 'arrowreturn-1-s', {'advancedpick' : '1'}, data.can_pick ? null : 'disabled' , null)}} + {{/if}}
    {{if data.fuel_usage}} @@ -104,4 +107,4 @@ {{:helper.link('Force Launch', 'alert', {'force' : '1'}, data.can_force ? null : 'disabled' , data.can_force ? 'redButton' : null)}} - \ No newline at end of file + diff --git a/nano/templates/supply.tmpl b/nano/templates/supply.tmpl index 87bb56ce3422f..30982c0b1c576 100644 --- a/nano/templates/supply.tmpl +++ b/nano/templates/supply.tmpl @@ -5,7 +5,8 @@ #}} {{##def.common_request_header: ID - Requested item + Time + Requested item Requested by Reason Cost @@ -14,6 +15,7 @@ {{##def.supply_request_item: {{:value.id}} + {{:value.time}} {{:value.object}} {{:value.orderer}} {{:value.reason || 'No reason provided.'}} @@ -86,7 +88,7 @@ {{for data.point_breakdown}}
    - {{:value.desc}}: + {{:value.desc}}:
    {{:value.points}} {{:data.currency_short}} @@ -131,7 +133,7 @@ {{if data.is_NTOS}}
    - Notifications are: + Notifications are:
    {{:helper.link((data.notifications_enabled ? 'Enabled' : 'Disabled'), null, {'toggle_notifications': 1})}} @@ -159,6 +161,7 @@ {{#def.supply_request_item}} {{:helper.link('Cancel', 'cancel', {'cancel_order' : value.id})}} + {{:helper.link('Pending', 'arrow_up', {'order_back_to_pending' : value.id})}} {{:helper.link('Print', 'print', {'print_receipt' : value.id, 'list_id' : value.list_id}, data.can_print ? null : 'disabled')}} {{/for}} diff --git a/packs/event_2022jul30/documents.dm b/packs/event_2022jul30/documents.dm index 40f5fe7e93589..68409cc96bcb9 100644 --- a/packs/event_2022jul30/documents.dm +++ b/packs/event_2022jul30/documents.dm @@ -19,11 +19,11 @@ "} -/obj/item/folder/envelope/lauletter1 +/obj/item/folder/envelope/preset/lauletter1 desc = "A thick envelope. The Expeditionary Corps crest is stamped in the corner, along with 'DO NOT DISSEMINATE.'" -/obj/item/folder/envelope/lauletter1/Initialize() +/obj/item/folder/envelope/preset/lauletter1/Initialize() . = ..() new /obj/item/paper/lauletter1 (src) diff --git a/packs/event_2024jul20/documents.dm b/packs/event_2024jul20/documents.dm index 3bca2f6835731..38672c17e2096 100644 --- a/packs/event_2024jul20/documents.dm +++ b/packs/event_2024jul20/documents.dm @@ -19,11 +19,11 @@ "} -/obj/item/folder/envelope/ndaorder +/obj/item/folder/envelope/preset/ndaorder desc = "A thick envelope. The Expeditionary Corps crest is stamped in the corner, along with 'DO NOT DISSEMINATE. FOR BRIDGE EYES ONLY.'" -/obj/item/folder/envelope/ndaorder/Initialize() +/obj/item/folder/envelope/preset/ndaorder/Initialize() . = ..() new /obj/item/paper/ndaorder (src) @@ -53,11 +53,11 @@ "} -/obj/item/folder/envelope/cmoorder +/obj/item/folder/envelope/preset/cmoorder desc = "A thick envelope. The Expeditionary Corps crest is stamped in the corner, along with 'DISSEMINATE AS NECESSARY. FOR CMO EYES.'" -/obj/item/folder/envelope/cmoorder/Initialize() +/obj/item/folder/envelope/preset/cmoorder/Initialize() . = ..() new /obj/item/paper/cmoorder (src) @@ -87,11 +87,11 @@ "} -/obj/item/folder/envelope/cosorder +/obj/item/folder/envelope/preset/cosorder desc = "A thick envelope. The Expeditionary Corps crest is stamped in the corner, along with 'DISSEMINATE AS NECESSARY. FOR COS EYES.'" -/obj/item/folder/envelope/cosorder/Initialize() +/obj/item/folder/envelope/preset/cosorder/Initialize() . = ..() new /obj/item/paper/cosorder (src) @@ -119,11 +119,11 @@ "} -/obj/item/folder/envelope/ceorder +/obj/item/folder/envelope/preset/ceorder desc = "A thick envelope. The Expeditionary Corps crest is stamped in the corner, along with 'DISSEMINATE AS NECESSARY. FOR CE EYES.'" -/obj/item/folder/envelope/ceorder/Initialize() +/obj/item/folder/envelope/preset/ceorder/Initialize() . = ..() new /obj/item/paper/ceorder (src) @@ -151,11 +151,11 @@ "} -/obj/item/folder/envelope/exploorder +/obj/item/folder/envelope/preset/exploorder desc = "A thick envelope. The Expeditionary Corps crest is stamped in the corner, along with 'DISSEMINATE AS NECESSARY. FOR CSO/PATHFINDER EYES.'" -/obj/item/folder/envelope/exploorder/Initialize() +/obj/item/folder/envelope/preset/exploorder/Initialize() . = ..() new /obj/item/paper/exploorder (src) @@ -183,11 +183,11 @@ "} -/obj/item/folder/envelope/dcorder +/obj/item/folder/envelope/preset/dcorder desc = "A thick envelope. The Expeditionary Corps crest is stamped in the corner, along with 'DISSEMINATE AS NECESSARY. FOR DC/XO EYES.'" -/obj/item/folder/envelope/dcorder/Initialize() +/obj/item/folder/envelope/preset/dcorder/Initialize() . = ..() new /obj/item/paper/dcorder (src) @@ -214,11 +214,11 @@ "} -/obj/item/folder/envelope/csorder +/obj/item/folder/envelope/preset/csorder desc = "A thick envelope. The Expeditionary Corps crest is stamped in the corner, along with 'DISSEMINATE AS NECESSARY. FOR CS/XO EYES.'" -/obj/item/folder/envelope/csorder/Initialize() +/obj/item/folder/envelope/preset/csorder/Initialize() . = ..() new /obj/item/paper/csorder (src) @@ -243,11 +243,12 @@ "} -/obj/item/folder/envelope/clorder +/obj/item/folder/envelope/preset/clorder desc = "A thick envelope. The Expeditionary Corps Organisation crest is stamped in the corner, along with 'DO NOT DISSEMINATE. FOR CL EYES ONLY.'" + seal_stamp = "\improper Expeditionary Corps Organisation rubber stamp" -/obj/item/folder/envelope/clorder/Initialize() +/obj/item/folder/envelope/preset/clorder/Initialize() . = ..() new /obj/item/paper/clorder (src) @@ -274,11 +275,12 @@ "} -/obj/item/folder/envelope/cmdorder +/obj/item/folder/envelope/preset/cmdorder desc = "A thick envelope. The Sol Central Government crest is stamped in the corner, along with 'DO NOT DISSEMINATE. FOR SCGR/CO EYES ONLY.'" + seal_stamp = "\improper Bureau of Emergency Operations rubber stamp" -/obj/item/folder/envelope/cmdorder/Initialize() +/obj/item/folder/envelope/preset/cmdorder/Initialize() . = ..() new /obj/item/paper/cmdorder (src) diff --git a/packs/factions/fa/_pack.dm b/packs/factions/fa/_pack.dm index a27ad0f365df2..6ad74174e52c0 100644 --- a/packs/factions/fa/_pack.dm +++ b/packs/factions/fa/_pack.dm @@ -1,5 +1,6 @@ #include "badges.dm" #include "clothing.dm" +#include "faction.dm" #include "misc.dm" #include "outfits.dm" #include "tweaks.dm" diff --git a/packs/factions/fa/faction.dm b/packs/factions/fa/faction.dm new file mode 100644 index 0000000000000..92aec0178b554 --- /dev/null +++ b/packs/factions/fa/faction.dm @@ -0,0 +1,50 @@ +/datum/mil_branch/auf + name = "Alliance United Flotillas" + name_short = "AUF" + email_domain = "flot.freeiolaus.int" + assistant_job = null + min_skill = list( // 5 points + SKILL_HAULING = SKILL_BASIC, // 1 point + SKILL_WEAPONS = SKILL_BASIC, // 2 points + SKILL_EVA = SKILL_TRAINED // 2 point + ) + + rank_types = list( + /datum/mil_rank/auf/ga, + /datum/mil_rank/auf/wa, + /datum/mil_rank/auf/sa + ) + + spawn_rank_types = list( + /datum/mil_rank/auf/ga, + /datum/mil_rank/auf/wa, + /datum/mil_rank/auf/sa + ) + +/datum/mil_branch/auf/New() + rank_types = subtypesof(/datum/mil_rank/auf) + ..() + +/datum/mil_rank/auf/ga + name = "Guardsman of the Frontier Alliance" + name_short = "GdMn" + accessory = list( + /obj/item/clothing/accessory/fa_badge/guardsman + ) + sort_order = 10 + +/datum/mil_rank/auf/wa + name = "Warden of the Frontier Alliance" + name_short = "Wrd" + accessory = list( + /obj/item/clothing/accessory/fa_badge/warden + ) + sort_order = 20 + +/datum/mil_rank/auf/sa + name = "Star Marshal of the Frontier Alliance" + name_short = "Mrshl" + accessory = list( + /obj/item/clothing/accessory/fa_badge/marshal + ) + sort_order = 30 \ No newline at end of file diff --git a/packs/factions/iccgn/faction.dm b/packs/factions/iccgn/faction.dm index 1922d19454dbb..2d935ff01a3d2 100644 --- a/packs/factions/iccgn/faction.dm +++ b/packs/factions/iccgn/faction.dm @@ -63,7 +63,8 @@ name = "Eleve Sailor" name_short = "Elv" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or1 + /obj/item/clothing/accessory/iccgn_rank/or1, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 10 @@ -72,7 +73,8 @@ name = "Sailor" name_short = "Slr" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or3 + /obj/item/clothing/accessory/iccgn_rank/or3, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 30 @@ -81,7 +83,8 @@ name = "Bosman" name_short = "Bsn" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or4 + /obj/item/clothing/accessory/iccgn_rank/or4, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 40 @@ -90,7 +93,8 @@ name = "Starszy Bosman" name_short = "SBsn" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or5 + /obj/item/clothing/accessory/iccgn_rank/or5, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 50 @@ -99,7 +103,8 @@ name = "Sierzant" name_short = "Szt" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or6 + /obj/item/clothing/accessory/iccgn_rank/or6, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 60 @@ -108,7 +113,8 @@ name = "Starshyna" name_short = "Strs" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or7 + /obj/item/clothing/accessory/iccgn_rank/or7, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 70 @@ -117,7 +123,8 @@ name = "Adjutant" name_short = "Adj" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or8 + /obj/item/clothing/accessory/iccgn_rank/or8, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 80 @@ -126,7 +133,8 @@ name = "Major" name_short = "Mjr" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or9 + /obj/item/clothing/accessory/iccgn_rank/or9, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 90 @@ -135,7 +143,8 @@ name = "Major of the Confederation Navy" name_short = "MjN" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/or9_alt + /obj/item/clothing/accessory/iccgn_rank/or9_alt, + /obj/item/clothing/accessory/iccgn_badge/enlisted ) sort_order = 100 @@ -144,7 +153,8 @@ name = "Michman" name_short = "Mch" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of1 + /obj/item/clothing/accessory/iccgn_rank/of1, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 110 @@ -153,7 +163,8 @@ name = "Sous-Leytenant" name_short = "SLyt" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of2 + /obj/item/clothing/accessory/iccgn_rank/of2, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 120 @@ -162,7 +173,8 @@ name = "Leytenant" name_short = "Lyt" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of3 + /obj/item/clothing/accessory/iccgn_rank/of3, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 130 @@ -171,7 +183,8 @@ name = "Sub-Komandor" name_short = "SKdr" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of4 + /obj/item/clothing/accessory/iccgn_rank/of4, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 140 @@ -180,7 +193,8 @@ name = "Komandor" name_short = "Kdr" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of5 + /obj/item/clothing/accessory/iccgn_rank/of5, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 150 @@ -189,7 +203,8 @@ name = "Kapitan" name_short = "Kpt" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of6 + /obj/item/clothing/accessory/iccgn_rank/of6, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 160 @@ -198,7 +213,8 @@ name = "Starshy Kapitan" name_short = "SKpt" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of7 + /obj/item/clothing/accessory/iccgn_rank/of7, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 170 @@ -207,7 +223,8 @@ name = "Vice-Admiral" name_short = "VAdm" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of8 + /obj/item/clothing/accessory/iccgn_rank/of8, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 180 @@ -216,7 +233,8 @@ name = "Admiral" name_short = "Adm" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of9 + /obj/item/clothing/accessory/iccgn_rank/of9, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 190 @@ -225,6 +243,7 @@ name = "Marshal of the Confederation Navy" name_short = "Mshl" accessory = list( - /obj/item/clothing/accessory/iccgn_rank/of9_alt + /obj/item/clothing/accessory/iccgn_rank/of9_alt, + /obj/item/clothing/accessory/iccgn_badge/officer ) sort_order = 200 diff --git a/packs/infinity/icons/mob/screen/facedir.dmi b/packs/infinity/icons/mob/screen/facedir.dmi new file mode 100644 index 0000000000000..44a9eb14ab05d Binary files /dev/null and b/packs/infinity/icons/mob/screen/facedir.dmi differ diff --git a/packs/infinity/sound/misc/foundation_alarm.ogg b/packs/infinity/sound/misc/foundation_alarm.ogg new file mode 100644 index 0000000000000..117d865bf97e9 Binary files /dev/null and b/packs/infinity/sound/misc/foundation_alarm.ogg differ diff --git a/packs/infinity/sound/misc/foundation_restore.ogg b/packs/infinity/sound/misc/foundation_restore.ogg new file mode 100644 index 0000000000000..efb8b5d86ed48 Binary files /dev/null and b/packs/infinity/sound/misc/foundation_restore.ogg differ diff --git a/packs/legion/_globals.dm b/packs/legion/_globals.dm new file mode 100644 index 0000000000000..4440c8c0af28d --- /dev/null +++ b/packs/legion/_globals.dm @@ -0,0 +1,5 @@ +GLOBAL_VAR_CONST(legion_warp_sound, 'packs/legion/sounds/legion_arrive.ogg') + +GLOBAL_LIST_INIT(legion_voices_sounds, list(\ + 'packs/legion/sounds/legion_voices1.ogg'\ +)) diff --git a/packs/legion/_pack.dm b/packs/legion/_pack.dm index 858b6c6b0f950..bfd0a1ed4e4ee 100644 --- a/packs/legion/_pack.dm +++ b/packs/legion/_pack.dm @@ -1,4 +1,5 @@ -#include "hivebot.dm" -#include "mob.dm" -#include "structure.dm" +#include "_globals.dm" +#include "legion_beacon.dm" +#include "legion_hivebot.dm" +#include "legion_mob.dm" #include "legion_narrate.dm" diff --git a/packs/legion/hivebot.dmi b/packs/legion/hivebot.dmi deleted file mode 100644 index 00c68c2d7ff6e..0000000000000 Binary files a/packs/legion/hivebot.dmi and /dev/null differ diff --git a/packs/legion/icons/beacon.dmi b/packs/legion/icons/beacon.dmi new file mode 100644 index 0000000000000..25a24a612f271 Binary files /dev/null and b/packs/legion/icons/beacon.dmi differ diff --git a/packs/legion/structure.dm b/packs/legion/legion_beacon.dm similarity index 97% rename from packs/legion/structure.dm rename to packs/legion/legion_beacon.dm index 41315df3b0a67..66eb852b6a822 100644 --- a/packs/legion/structure.dm +++ b/packs/legion/legion_beacon.dm @@ -1,6 +1,6 @@ /obj/structure/legion abstract_type = /obj/structure/legion - icon = 'packs/legion/legion.dmi' + icon = 'packs/legion/icons/beacon.dmi' /obj/structure/legion/beacon @@ -33,7 +33,7 @@ var/broadcast_rate = 30 SECONDS /// Integer. Percentage change of a legion message broadcast per tick. - var/broadcast_change = 5 + var/broadcast_chance = 5 /// Integer. `world.time` of the last legion broadcast. var/last_broadcast_time = 0 @@ -93,7 +93,7 @@ return spawn_legion() - if (world.time >= last_broadcast_time + broadcast_rate && rand(1, 100) <= broadcast_change) + if (world.time >= last_broadcast_time + broadcast_rate && rand(1, 100) <= broadcast_chance) last_broadcast_time = world.time show_legion_messages(get_z(src)) @@ -116,11 +116,13 @@ /obj/structure/legion/beacon/on_update_icon() + ClearOverlays() switch (beacon_state) if (BEACON_STATE_ON) icon_state = "beacon_active" if (BEACON_STATE_OFF) icon_state = "beacon" + AddOverlays(emissive_appearance(icon, "[icon_state]_emissive", src)) /obj/structure/legion/beacon/on_death() @@ -240,7 +242,7 @@ if (!target) target = get_turf(src) new /obj/explosion(target) - playsound(src, 'sound/effects/EMPulse.ogg', 25, TRUE) + playsound(src, GLOB.legion_warp_sound, 25, TRUE) /* Hivebot Variant */ diff --git a/packs/legion/hivebot.dm b/packs/legion/legion_hivebot.dm similarity index 98% rename from packs/legion/hivebot.dm rename to packs/legion/legion_hivebot.dm index 08c496952af62..eeb11f3e9c4d7 100644 --- a/packs/legion/hivebot.dm +++ b/packs/legion/legion_hivebot.dm @@ -91,7 +91,7 @@ // Random legion hivebot spawner /obj/random/legion/hivebot abstract_type = /obj/random/legion/hivebot - icon = 'packs/legion/hivebot.dmi' + icon = 'icons/mob/simple_animal/hivebot.dmi' icon_state = "spawner" diff --git a/packs/legion/mob.dm b/packs/legion/legion_mob.dm similarity index 96% rename from packs/legion/mob.dm rename to packs/legion/legion_mob.dm index 47a3d432f90ca..a88eba8989ed2 100644 --- a/packs/legion/mob.dm +++ b/packs/legion/legion_mob.dm @@ -19,7 +19,7 @@ if (!mapload) new /obj/explosion(loc) - playsound(src, 'sound/effects/EMPulse.ogg', 25, TRUE) + playsound(src, GLOB.legion_warp_sound, 25, TRUE) if (linked_beacon) visible_message(SPAN_WARNING("\The [linked_beacon] warps \a [src] in!")) else diff --git a/packs/legion/legion_narrate.dm b/packs/legion/legion_narrate.dm index 82ee7a24c32b0..1c247efd0759c 100644 --- a/packs/legion/legion_narrate.dm +++ b/packs/legion/legion_narrate.dm @@ -13,7 +13,9 @@ GLOBAL_LIST_INIT(legion_last_words_generic, list(\ "I don't want to die!",\ "No, get away!",\ "I give up. Just do it already.",\ - "I'm so scared..."\ + "I'm so scared...",\ + "Help me!",\ + "It's so hot!",\ )) @@ -81,12 +83,14 @@ GLOBAL_LIST_EMPTY(legion_last_words_player) message = pick(GLOB.legion_narrations) var/count = 0 + var/sound_to_play = pick(GLOB.legion_voices_sounds) for (var/mob/player in GLOB.player_list) if (!(get_z(player) in connected_z_levels)) continue if (!player.isSynthetic() && !isobserver(player)) continue to_chat(player, SPAN_LEGION(message)) + sound_to(player, sound_to_play) count++ log_debug("Displayed legion message to [count] mob\s across [length(connected_z_levels)] z-level\s.") diff --git a/packs/legion/sounds/legion_arrive.ogg b/packs/legion/sounds/legion_arrive.ogg new file mode 100644 index 0000000000000..0d368ee1dc422 Binary files /dev/null and b/packs/legion/sounds/legion_arrive.ogg differ diff --git a/packs/legion/sounds/legion_voices1.ogg b/packs/legion/sounds/legion_voices1.ogg new file mode 100644 index 0000000000000..c511a1212f46b Binary files /dev/null and b/packs/legion/sounds/legion_voices1.ogg differ diff --git a/sound/effects/woodcutting.ogg b/sound/effects/woodcutting.ogg new file mode 100644 index 0000000000000..ef4883ba7e3d5 Binary files /dev/null and b/sound/effects/woodcutting.ogg differ diff --git a/sound/machines/airlockdone.ogg b/sound/machines/airlockdone.ogg new file mode 100644 index 0000000000000..eef291a2d375b Binary files /dev/null and b/sound/machines/airlockdone.ogg differ diff --git a/sound/machines/airlockin.ogg b/sound/machines/airlockin.ogg new file mode 100644 index 0000000000000..66a78128d9f92 Binary files /dev/null and b/sound/machines/airlockin.ogg differ diff --git a/sound/machines/airlockout.ogg b/sound/machines/airlockout.ogg new file mode 100644 index 0000000000000..d4f03f446f00e Binary files /dev/null and b/sound/machines/airlockout.ogg differ diff --git a/test/check-paths.sh b/test/check-paths.sh index e2e61d73926fb..5d18713d1f41b 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -34,7 +34,7 @@ exactly 2 "/datum text paths" '"/datum' exactly 2 "/mob text paths" '"/mob' exactly 10 "/obj text paths" '"/obj' exactly 8 "/turf text paths" '"/turf' -exactly 115 "to_world uses" '\sto_world\(' +exactly 117 "to_world uses" '\sto_world\(' exactly 0 "globals with leading /" '^/var' -P exactly 0 "globals without global sugar" '^var/(?!global/)' -P exactly 0 "apparent paths with trailing /" '\w/[,\)\n]' -P @@ -45,7 +45,7 @@ exactly 2 "<< uses" '(?> uses" '(?)>>(?!>)' -P exactly 0 "incorrect indentations" '^( {4,})' -P exactly 25 "text2path uses" 'text2path' -exactly 4 "update_icon() override" '/update_icon\((.*)\)' -P +exactly 5 "update_icon() override" '/update_icon\((.*)\)' -P exactly 4 "goto use" 'goto ' exactly 1 "NOOP match" 'NOOP' exactly 332 "spawn uses" '^\s*spawn\s*\(\s*(-\s*)?\d*\s*\)' -P @@ -56,7 +56,7 @@ exactly 0 "emagged = 0/1" 'emagged\s*=\s*\d' -P exactly 0 "simulated = 0/1" 'simulated\s*=\s*\d' -P exactly 2 "var/ in proc arguments" '(^/[^/].+/.+?\(.*?)var/' -P exactly 0 "tmp/ vars" 'var.*/tmp/' -P -exactly 7 "uses of .len" '\.len\b' -P +exactly 15 "uses of .len" '\.len\b' -P exactly 15 "uses of examine()" '[.|\s]examine\(' -P # If this fails it's likely because you used '/atom/proc/examine(mob)' instead of '/proc/examinate(mob, atom)' - Exception: An examine()-proc may call other examine()-procs exactly 13 "direct modifications of overlays list" '\boverlays((\s*[|^=+&-])|(\.(Cut)|(Add)|(Copy)|(Remove)|(Remove)))' -P exactly 0 "new/list list instantiations" 'new\s*/list' -P diff --git a/tracy.dll b/tracy.dll new file mode 100644 index 0000000000000..7c11dff70829f Binary files /dev/null and b/tracy.dll differ diff --git a/tracy.so b/tracy.so new file mode 100644 index 0000000000000..f9c8845b866e6 Binary files /dev/null and b/tracy.so differ