From 1f97e396d0fe87f3f5dae51dffb95e133bc98b68 Mon Sep 17 00:00:00 2001
From: Daniel <77834935+Orvex07@users.noreply.github.com>
Date: Thu, 15 Jan 2026 22:23:40 +0100
Subject: [PATCH] =?UTF-8?q?Fix:=20=D0=94=D0=B2=D0=BE=D0=B9=D0=BD=D1=8B?=
=?UTF-8?q?=D0=B5/=D0=A2=D1=80=D0=BE=D0=B9=D0=BD=D1=8B=D0=B5=20=D1=88?=
=?UTF-8?q?=D0=BB=D1=8E=D0=B7=D1=8B=20(#3719)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../SunriseMultiTileAirtightComponent.cs | 22 ++
.../Doors/SunriseMultiTileAirtightSystem.cs | 173 ++++++++++++++++
.../ui/spray-painter-multitile-airlocks.ftl | 33 +++
.../ui/spray-painter-multitile-airlocks.ftl | 33 +++
.../engineer-painter/engineer-painter.ftl | 12 --
.../_strings/ui/spray-painter-window.ftl | 13 ++
.../ru-RU/spray-painter/spray-painter.ftl | 194 ++++++++++++++++++
.../Prototypes/Paintables/categories.yml | 4 +
.../Doors/Airlocks/Glass/airlocks.yml | 63 ++++++
.../Doors/Airlocks/airtight_blocker.yml | 8 +
.../Paintables/airlock_multitile_groups.yml | 37 ++++
11 files changed, 580 insertions(+), 12 deletions(-)
create mode 100644 Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightComponent.cs
create mode 100644 Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightSystem.cs
create mode 100644 Resources/Locale/en-US/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl
create mode 100644 Resources/Locale/ru-RU/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl
delete mode 100644 Resources/Locale/ru-RU/_strings/engineer-painter/engineer-painter.ftl
create mode 100644 Resources/Locale/ru-RU/spray-painter/spray-painter.ftl
create mode 100644 Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/airtight_blocker.yml
create mode 100644 Resources/Prototypes/_Sunrise/Paintables/airlock_multitile_groups.yml
diff --git a/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightComponent.cs b/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightComponent.cs
new file mode 100644
index 0000000000..c40eb29a77
--- /dev/null
+++ b/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightComponent.cs
@@ -0,0 +1,22 @@
+namespace Content.Server._Sunrise.Doors.Components;
+
+///
+/// Сейчас используется только под двойные, тройные шлюзы
+/// Спавнит блокеры по боковым частям относительно главного тайла
+///
+[RegisterComponent]
+public sealed partial class SunriseMultiTileAirtightComponent : Component
+{
+ ///
+ /// Список оффсетов в локальных координатах двери, на каких тайлах должны появиться блокеры
+ /// Оффсет задает относительно главной точки двери
+ ///
+ [DataField(required: true)]
+ public List ExtraTiles = new();
+
+ ///
+ /// Cписок заспавненных блокеров, используется системой для обновления airtight
+ ///
+ public List Blockers = new();
+}
+
diff --git a/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightSystem.cs b/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightSystem.cs
new file mode 100644
index 0000000000..319371206d
--- /dev/null
+++ b/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightSystem.cs
@@ -0,0 +1,173 @@
+using System.Numerics;
+using Content.Server._Sunrise.Doors.Components;
+using Content.Server.Atmos.Components;
+using Content.Server.Atmos.EntitySystems;
+using Content.Shared.Doors;
+using Content.Shared.Doors.Components;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Server.GameObjects;
+
+namespace Content.Server._Sunrise.Doors.Systems;
+
+///
+/// Нужна чтобы мультитайловые двойные или тройные шлюзы нормально не пропускали газы
+/// Спавнит блокеры на соседних тайлах и регулирует когда блокеры не пропускают газ, когда пропускают. В зависимости от состояния шлюза
+///
+public sealed class SunriseMultiTileAirtightSystem : EntitySystem
+{
+ private const string BlockerPrototype = "SunriseMultiTileAirtightBlocker";
+
+ [Dependency] private readonly AirtightSystem _airtight = default!;
+ [Dependency] private readonly TransformSystem _transform = default!;
+
+ private EntityQuery _airtightQuery;
+ private EntityQuery _doorQuery;
+ private EntityQuery _gridQuery;
+ private EntityQuery _xformQuery;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ _airtightQuery = GetEntityQuery();
+ _doorQuery = GetEntityQuery();
+ _gridQuery = GetEntityQuery();
+ _xformQuery = GetEntityQuery();
+
+ SubscribeLocalEvent(OnMapInit);
+ SubscribeLocalEvent(OnShutdown);
+
+ SubscribeLocalEvent(OnAirtightChanged);
+ SubscribeLocalEvent(OnDoorStateChanged);
+ SubscribeLocalEvent(OnAnchorChanged);
+ SubscribeLocalEvent(OnReAnchor);
+ SubscribeLocalEvent(OnMoved);
+ }
+
+ private void OnMapInit(Entity ent, ref MapInitEvent args)
+ {
+ RefreshGeometry(ent);
+ RefreshAirblock(ent);
+ }
+
+ private void OnShutdown(Entity ent, ref ComponentShutdown args)
+ {
+ DeleteBlockers(ent);
+ }
+
+ private void OnDoorStateChanged(Entity ent, ref DoorStateChangedEvent args)
+ {
+ RefreshAirblock(ent);
+ }
+
+ private void OnAirtightChanged(Entity ent, ref AirtightChanged args)
+ {
+ if (!args.AirBlockedChanged)
+ return;
+
+ RefreshAirblock(ent);
+ }
+
+ private void OnAnchorChanged(Entity ent, ref AnchorStateChangedEvent args)
+ {
+ RefreshGeometry(ent);
+ RefreshAirblock(ent);
+ }
+
+ private void OnReAnchor(Entity ent, ref ReAnchorEvent args)
+ {
+ RefreshGeometry(ent);
+ RefreshAirblock(ent);
+ }
+
+ private void OnMoved(Entity ent, ref MoveEvent args)
+ {
+ RefreshGeometry(ent);
+ RefreshAirblock(ent);
+ }
+
+ ///
+ /// Пересоздает блокеры на дополнительных тайлах
+ /// ExtraTiles задаются в локальных координатах двери, поэтому оффсет надо повернуть по направлению двери
+ /// После поворота округяем сразу до целых тайлов, потому что поворот идет через float
+ ///
+ private void RefreshGeometry(Entity ent)
+ {
+ DeleteBlockers(ent);
+
+ if (!_xformQuery.TryGetComponent(ent.Owner, out var xform))
+ return;
+
+ if (!xform.Anchored || xform.GridUid is not { } gridUid || !_gridQuery.TryGetComponent(gridUid, out var grid))
+ return;
+
+ var baseTile = _transform.GetGridTilePositionOrDefault((ent, xform), grid);
+ var rotation = xform.LocalRotation.RoundToCardinalAngle();
+
+ foreach (var local in ent.Comp.ExtraTiles)
+ {
+ var rotated = rotation.RotateVec(new Vector2(local.X, local.Y));
+ var offset = new Vector2i((int)MathF.Round(rotated.X), (int)MathF.Round(rotated.Y));
+ var tile = baseTile + offset;
+
+ var coords = GetTileCenter(gridUid, grid, tile);
+ var blocker = Spawn(BlockerPrototype, coords);
+ var blockerXform = _xformQuery.GetComponent(blocker);
+
+ // Обязательно анкорим на грид и конкретный тайл, ибо airtight будет не на том месте будет и будет адское шоу
+ if (!_transform.AnchorEntity((blocker, blockerXform), (gridUid, grid), tile))
+ {
+ Del(blocker);
+ continue;
+ }
+
+ ent.Comp.Blockers.Add(blocker);
+ }
+ }
+
+ ///
+ /// Синхронизирует Airtight.AirBlocked у всех блокеров у двери
+ /// Если у двери есть AirtightComponent то берем его AirBlocked
+ ///
+ private void RefreshAirblock(Entity ent)
+ {
+ bool blocked;
+
+ if (_airtightQuery.TryGetComponent(ent.Owner, out var doorAirtight))
+ blocked = doorAirtight.AirBlocked;
+ else
+ {
+ if (!_doorQuery.TryGetComponent(ent.Owner, out var door))
+ return;
+
+ blocked = door.State is DoorState.Closed or DoorState.Welded;
+ }
+
+ foreach (var blocker in ent.Comp.Blockers)
+ {
+ if (!_airtightQuery.TryGetComponent(blocker, out var airtight))
+ continue;
+
+ _airtight.SetAirblocked((blocker, airtight), blocked);
+ }
+ }
+
+ private void DeleteBlockers(Entity ent)
+ {
+ foreach (var blocker in ent.Comp.Blockers)
+ {
+ if (!Deleted(blocker))
+ Del(blocker);
+ }
+
+ ent.Comp.Blockers.Clear();
+ }
+
+ private static EntityCoordinates GetTileCenter(EntityUid gridUid, MapGridComponent grid, Vector2i tile)
+ {
+ // +0.5f чтобы получить центр тайла, а то берет то правый угол, то левый
+ var pos = new Vector2(tile.X + 0.5f, tile.Y + 0.5f) * grid.TileSize;
+ return new EntityCoordinates(gridUid, pos);
+ }
+}
diff --git a/Resources/Locale/en-US/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl b/Resources/Locale/en-US/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl
new file mode 100644
index 0000000000..c94c849da5
--- /dev/null
+++ b/Resources/Locale/en-US/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl
@@ -0,0 +1,33 @@
+# Groups
+spray-painter-tab-group-airlockdoubleglass = Double
+spray-painter-tab-group-airlocktripleglass = Triple
+
+# Double glass airlocks
+spray-painter-style-airlockdoubleglass-atmospherics = Atmospherics
+spray-painter-style-airlockdoubleglass-basic = Basic
+spray-painter-style-airlockdoubleglass-cargo = Cargo
+spray-painter-style-airlockdoubleglass-chemistry = Chemistry
+spray-painter-style-airlockdoubleglass-command = Command
+spray-painter-style-airlockdoubleglass-engineering = Engineering
+spray-painter-style-airlockdoubleglass-maintenance = Maintenance
+spray-painter-style-airlockdoubleglass-medical = Medical
+spray-painter-style-airlockdoubleglass-salvage = Salvage
+spray-painter-style-airlockdoubleglass-science = Science
+spray-painter-style-airlockdoubleglass-security = Security
+spray-painter-style-airlockdoubleglass-virology = Virology
+spray-painter-style-airlockdoubleglass-centralcommand = Central Command
+
+# Triple glass airlocks
+spray-painter-style-airlocktripleglass-atmospherics = Atmospherics
+spray-painter-style-airlocktripleglass-basic = Basic
+spray-painter-style-airlocktripleglass-cargo = Cargo
+spray-painter-style-airlocktripleglass-chemistry = Chemistry
+spray-painter-style-airlocktripleglass-command = Command
+spray-painter-style-airlocktripleglass-engineering = Engineering
+spray-painter-style-airlocktripleglass-maintenance = Maintenance
+spray-painter-style-airlocktripleglass-medical = Medical
+spray-painter-style-airlocktripleglass-salvage = Salvage
+spray-painter-style-airlocktripleglass-science = Science
+spray-painter-style-airlocktripleglass-security = Security
+spray-painter-style-airlocktripleglass-virology = Virology
+spray-painter-style-airlocktripleglass-centralcommand = Central Command
diff --git a/Resources/Locale/ru-RU/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl b/Resources/Locale/ru-RU/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl
new file mode 100644
index 0000000000..cdfc669200
--- /dev/null
+++ b/Resources/Locale/ru-RU/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl
@@ -0,0 +1,33 @@
+# Группы
+spray-painter-tab-group-airlockdoubleglass = Двойной
+spray-painter-tab-group-airlocktripleglass = Тройной
+
+# Двойные стеклянные шлюзы
+spray-painter-style-airlockdoubleglass-atmospherics = Атмосферика
+spray-painter-style-airlockdoubleglass-basic = Обычный
+spray-painter-style-airlockdoubleglass-cargo = Снабжение
+spray-painter-style-airlockdoubleglass-chemistry = Химия
+spray-painter-style-airlockdoubleglass-command = Командный
+spray-painter-style-airlockdoubleglass-engineering = Инженерный
+spray-painter-style-airlockdoubleglass-maintenance = Технический
+spray-painter-style-airlockdoubleglass-medical = Медицинский
+spray-painter-style-airlockdoubleglass-salvage = Утилизация
+spray-painter-style-airlockdoubleglass-science = Научный
+spray-painter-style-airlockdoubleglass-security = Служба безопасности
+spray-painter-style-airlockdoubleglass-virology = Вирусология
+spray-painter-style-airlockdoubleglass-centralcommand = Центральное командование
+
+# Тройные стеклянные шлюзы
+spray-painter-style-airlocktripleglass-atmospherics = Атмосферика
+spray-painter-style-airlocktripleglass-basic = Обычный
+spray-painter-style-airlocktripleglass-cargo = Снабжение
+spray-painter-style-airlocktripleglass-chemistry = Химия
+spray-painter-style-airlocktripleglass-command = Командный
+spray-painter-style-airlocktripleglass-engineering = Инженерный
+spray-painter-style-airlocktripleglass-maintenance = Технический
+spray-painter-style-airlocktripleglass-medical = Медицинский
+spray-painter-style-airlocktripleglass-salvage = Утилизация
+spray-painter-style-airlocktripleglass-science = Научный
+spray-painter-style-airlocktripleglass-security = Служба безопасности
+spray-painter-style-airlocktripleglass-virology = Вирусология
+spray-painter-style-airlocktripleglass-centralcommand = Центральное командование
diff --git a/Resources/Locale/ru-RU/_strings/engineer-painter/engineer-painter.ftl b/Resources/Locale/ru-RU/_strings/engineer-painter/engineer-painter.ftl
deleted file mode 100644
index b9c98fb10b..0000000000
--- a/Resources/Locale/ru-RU/_strings/engineer-painter/engineer-painter.ftl
+++ /dev/null
@@ -1,12 +0,0 @@
-spray-painter-window-title = Краскопульт
-spray-painter-style-not-available = Невозможно применить выбранный стиль к данному типу шлюза
-spray-painter-selected-style = Выбранный стиль:
-spray-painter-selected-color = Выбранный цвет:
-spray-painter-color-red = красный
-spray-painter-color-yellow = жёлтый
-spray-painter-color-brown = коричневый
-spray-painter-color-green = зелёный
-spray-painter-color-cyan = голубой
-spray-painter-color-blue = синий
-spray-painter-color-white = белый
-spray-painter-color-black = чёрный
diff --git a/Resources/Locale/ru-RU/_strings/ui/spray-painter-window.ftl b/Resources/Locale/ru-RU/_strings/ui/spray-painter-window.ftl
index efee9d1753..b3b5f00cac 100644
--- a/Resources/Locale/ru-RU/_strings/ui/spray-painter-window.ftl
+++ b/Resources/Locale/ru-RU/_strings/ui/spray-painter-window.ftl
@@ -1 +1,14 @@
pipe-painter-no-color-selected = (Цвет не выбран)
+
+pipe-painter-color-red = красный
+pipe-painter-color-yellow = жёлтый
+pipe-painter-color-brown = коричневый
+pipe-painter-color-green = зелёный
+pipe-painter-color-cyan = голубой
+pipe-painter-color-blue = синий
+pipe-painter-color-white = белый
+pipe-painter-color-black = чёрный
+pipe-painter-color-waste = отходы
+pipe-painter-color-distro = дистра
+pipe-painter-color-air = воздух
+pipe-painter-color-mix = смесь
diff --git a/Resources/Locale/ru-RU/spray-painter/spray-painter.ftl b/Resources/Locale/ru-RU/spray-painter/spray-painter.ftl
new file mode 100644
index 0000000000..1417d9532c
--- /dev/null
+++ b/Resources/Locale/ru-RU/spray-painter/spray-painter.ftl
@@ -0,0 +1,194 @@
+# Components
+spray-painter-ammo-on-examine = Вмещает {$charges} зарядов.
+spray-painter-ammo-after-interact-full = Краскопульт полностью заправлен!
+spray-painter-ammo-after-interact-refilled = Вы заправляете краскопульт.
+
+spray-painter-interact-no-charges = Недостаточно краски.
+spray-painter-interact-nothing-to-remove = Нечего удалять!
+
+spray-painter-on-examined-painted-message = Похоже, объект был недавно окрашен.
+spray-painter-style-not-available = Невозможно применить выбранный стиль к этому объекту.
+
+spray-painter-verb-toggle-decals = Переключить рисование декалей
+
+spray-painter-item-status-label = Декали: {$mode}
+spray-painter-item-status-add = [color=green]Добавить[/color]
+spray-painter-item-status-remove = [color=red]Удалить[/color]
+spray-painter-item-status-off = [color=gray]Выкл.[/color]
+
+# UI
+spray-painter-window-title = Краскопульт
+
+spray-painter-selected-style = Выбранный стиль:
+
+spray-painter-selected-decals = Выбранная декаль:
+spray-painter-use-custom-color = Использовать свой цвет
+spray-painter-use-snap-to-tile = Привязать к тайлу
+
+spray-painter-angle-rotation = Поворот:
+spray-painter-angle-rotation-90-sub = -90°
+spray-painter-angle-rotation-reset = 0°
+spray-painter-angle-rotation-90-add = +90°
+
+spray-painter-selected-color = Выбранный цвет:
+spray-painter-color-red = красный
+spray-painter-color-yellow = жёлтый
+spray-painter-color-brown = коричневый
+spray-painter-color-green = зелёный
+spray-painter-color-cyan = голубой
+spray-painter-color-blue = синий
+spray-painter-color-white = белый
+spray-painter-color-black = чёрный
+
+# Categories (tabs)
+spray-painter-tab-category-airlocks = Шлюзы
+spray-painter-tab-category-canisters = Канистры
+spray-painter-tab-category-crates = Ящики
+spray-painter-tab-category-lockers = Шкафчики
+spray-painter-tab-category-pipes = Трубы
+spray-painter-tab-category-decals = Декали
+
+spray-painter-tab-group-airlockstandard = Стандартный
+spray-painter-tab-group-airlockglass = Стеклянный
+
+spray-painter-tab-group-cratesteel = Сталь
+spray-painter-tab-group-crateplastic = Пластик
+spray-painter-tab-group-cratesecure = Защищённый
+
+spray-painter-tab-group-closet = Незапертый
+spray-painter-tab-group-locker = Запертый
+spray-painter-tab-group-wallcloset = Незапертый (настенный)
+spray-painter-tab-group-walllocker = Запертый (настенный)
+
+# Airlocks
+spray-painter-style-airlockstandard-atmospherics = Атмосферика
+spray-painter-style-airlockstandard-basic = Обычный
+spray-painter-style-airlockstandard-cargo = Снабжение
+spray-painter-style-airlockstandard-chemistry = Химия
+spray-painter-style-airlockstandard-command = Командный
+spray-painter-style-airlockstandard-engineering = Инженерный
+spray-painter-style-airlockstandard-freezer = Морозильник
+spray-painter-style-airlockstandard-hydroponics = Гидропоника
+spray-painter-style-airlockstandard-maintenance = Технический
+spray-painter-style-airlockstandard-medical = Медицинский
+spray-painter-style-airlockstandard-salvage = Утилизация
+spray-painter-style-airlockstandard-science = Научный
+spray-painter-style-airlockstandard-security = Служба безопасности
+spray-painter-style-airlockstandard-virology = Вирусология
+
+spray-painter-style-airlockglass-atmospherics = Атмосферика
+spray-painter-style-airlockglass-basic = Обычный
+spray-painter-style-airlockglass-cargo = Снабжение
+spray-painter-style-airlockglass-chemistry = Химия
+spray-painter-style-airlockglass-command = Командный
+spray-painter-style-airlockglass-engineering = Инженерный
+spray-painter-style-airlockglass-hydroponics = Гидропоника
+spray-painter-style-airlockglass-maintenance = Технический
+spray-painter-style-airlockglass-medical = Медицинский
+spray-painter-style-airlockglass-salvage = Утилизация
+spray-painter-style-airlockglass-science = Научный
+spray-painter-style-airlockglass-security = Служба безопасности
+spray-painter-style-airlockglass-virology = Вирусология
+
+# Lockers
+spray-painter-style-locker-atmospherics = Атмосферика
+spray-painter-style-locker-basic = Обычный
+spray-painter-style-locker-botanist = Ботаник
+spray-painter-style-locker-brigmedic = Бригмедик
+spray-painter-style-locker-captain = Капитана
+spray-painter-style-locker-ce = Старшего Инженера
+spray-painter-style-locker-chemical = Химия
+spray-painter-style-locker-clown = Клоун
+spray-painter-style-locker-cmo = Главный врач
+spray-painter-style-locker-doctor = Врача
+spray-painter-style-locker-electrical = Электрика
+spray-painter-style-locker-engineer = Инженер
+spray-painter-style-locker-evac = Ремонт эвакуации
+spray-painter-style-locker-hop = Глава персонала
+spray-painter-style-locker-hos = Глава службы безопасности
+spray-painter-style-locker-medicine = Медицинский
+spray-painter-style-locker-mime = Мим
+spray-painter-style-locker-paramedic = Парамедик
+spray-painter-style-locker-quartermaster = Квартирмейстер
+spray-painter-style-locker-rd = Научный руководитель
+spray-painter-style-locker-representative = Представитель
+spray-painter-style-locker-salvage = Утилизация
+spray-painter-style-locker-scientist = Учёный
+spray-painter-style-locker-security = Служба безопасности
+spray-painter-style-locker-welding = Инструменты
+
+spray-painter-style-closet-basic = Обычный
+spray-painter-style-closet-biohazard = Биологическая опасность
+spray-painter-style-closet-biohazard-science = Биологическая опасность (наука)
+spray-painter-style-closet-biohazard-virology = Биологическая опасность (вирусология)
+spray-painter-style-closet-biohazard-security = Биологическая опасность (служба безопасности)
+spray-painter-style-closet-biohazard-janitor = Биологическая опасность (уборщик)
+spray-painter-style-closet-bomb = Сапёрный Набор
+spray-painter-style-closet-bomb-janitor = Сапёрный Набор
+spray-painter-style-closet-chef = Шеф-повар
+spray-painter-style-closet-fire = Пожарная безопасность
+spray-painter-style-closet-janitor = Уборщик
+spray-painter-style-closet-legal = Юрист
+spray-painter-style-closet-nitrogen = Интерналы (азот)
+spray-painter-style-closet-oxygen = Интерналы (кислород)
+spray-painter-style-closet-radiation = Радиационный костюм
+spray-painter-style-closet-tool = Инструменты
+
+spray-painter-style-wallcloset-atmospherics = Атмосферика
+spray-painter-style-wallcloset-basic = Обычный
+spray-painter-style-wallcloset-black = Чёрный
+spray-painter-style-wallcloset-blue = Синий
+spray-painter-style-wallcloset-fire = Пожарная безопасность
+spray-painter-style-wallcloset-green = Зелёный
+spray-painter-style-wallcloset-grey = Серый
+spray-painter-style-wallcloset-mixed = Смешанный
+spray-painter-style-wallcloset-nitrogen = Интерналы (азот)
+spray-painter-style-wallcloset-orange = Оранжевый
+spray-painter-style-wallcloset-oxygen = Интерналы (кислород)
+spray-painter-style-wallcloset-pink = Розовый
+spray-painter-style-wallcloset-white = Белый
+spray-painter-style-wallcloset-yellow = Жёлтый
+
+spray-painter-style-walllocker-evac = Ремонт эвакуации
+spray-painter-style-walllocker-medical = Медицинский
+
+# Crates
+spray-painter-style-cratesteel-basic = Обычный
+spray-painter-style-cratesteel-electrical = Электрика
+spray-painter-style-cratesteel-engineering = Инженерный
+spray-painter-style-cratesteel-radiation = Радиация
+spray-painter-style-cratesteel-science = Научный
+spray-painter-style-cratesteel-surgery = Хирургия
+
+spray-painter-style-crateplastic-basic = Обычный
+spray-painter-style-crateplastic-chemistry = Химия
+spray-painter-style-crateplastic-command = Командный
+spray-painter-style-crateplastic-hydroponics = Гидропоника
+spray-painter-style-crateplastic-medical = Медицинский
+spray-painter-style-crateplastic-oxygen = Кислород
+
+spray-painter-style-cratesecure-basic = Обычный
+spray-painter-style-cratesecure-chemistry = Химия
+spray-painter-style-cratesecure-command = Командный
+spray-painter-style-cratesecure-engineering = Инженерный
+spray-painter-style-cratesecure-hydroponics = Гидропоника
+spray-painter-style-cratesecure-medical = Медицинский
+spray-painter-style-cratesecure-plasma = Плазма
+spray-painter-style-cratesecure-private = Личный
+spray-painter-style-cratesecure-science = Научный
+spray-painter-style-cratesecure-secgear = Снаряжение СБ
+spray-painter-style-cratesecure-weapon = Оружие
+
+# Canisters
+spray-painter-style-canisters-air = Воздух
+spray-painter-style-canisters-ammonia = Аммиак
+spray-painter-style-canisters-carbon-dioxide = Углекислый газ
+spray-painter-style-canisters-frezon = Фрезон
+spray-painter-style-canisters-nitrogen = Азот
+spray-painter-style-canisters-nitrous-oxide = Закись азота
+spray-painter-style-canisters-oxygen = Кислород
+spray-painter-style-canisters-plasma = Плазма
+spray-painter-style-canisters-storage = Хранилище
+spray-painter-style-canisters-tritium = Тритий
+spray-painter-style-canisters-water-vapor = Водяной пар
+
diff --git a/Resources/Prototypes/Paintables/categories.yml b/Resources/Prototypes/Paintables/categories.yml
index 75998c31ba..64a71b028d 100644
--- a/Resources/Prototypes/Paintables/categories.yml
+++ b/Resources/Prototypes/Paintables/categories.yml
@@ -3,6 +3,10 @@
groups:
- AirlockStandard
- AirlockGlass
+ # Sunrise - start
+ - AirlockDoubleGlass
+ - AirlockTripleGlass
+ # Sunrise - end
- type: paintableGroupCategory
id: Canisters
diff --git a/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/Glass/airlocks.yml b/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/Glass/airlocks.yml
index 8905325aae..9a8259f29d 100644
--- a/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/Glass/airlocks.yml
+++ b/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/Glass/airlocks.yml
@@ -21,6 +21,8 @@
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_glass_airlock.rsi
snapCardinals: false
offset: 0.5,0
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: Fixtures
fixtures:
fix1:
@@ -34,6 +36,9 @@
- GlassAirlockLayer
- type: Transform
noRot: false
+ - type: SunriseMultiTileAirtight
+ extraTiles:
+ - 1,0
- type: entity
id: TripleGlassAirlock
@@ -50,6 +55,8 @@
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_glass.rsi
snapCardinals: false
offset: 0,0
+ - type: Paintable
+ group: AirlockTripleGlass
- type: Fixtures
fixtures:
fix1:
@@ -63,6 +70,10 @@
- GlassAirlockLayer
- type: Transform
noRot: false
+ - type: SunriseMultiTileAirtight
+ extraTiles:
+ - -1,0
+ - 1,0
# == Double airlocks == #
@@ -73,6 +84,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_basic.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockAtmospherics
@@ -81,6 +94,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_atmospherics.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockCargo
@@ -89,6 +104,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_cargo.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockChemistry
@@ -97,6 +114,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_chemistry.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockCommand
@@ -105,6 +124,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_command.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockCentralCommand
@@ -113,6 +134,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_centcomm.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockEngineering
@@ -121,6 +144,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_engineering.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockMaint
@@ -129,6 +154,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_maint.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockMedical
@@ -137,6 +164,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_medical.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockScience
@@ -145,6 +174,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_science.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockSecurity
@@ -153,6 +184,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_security.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockVirology
@@ -161,6 +194,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_virology.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockSalvage
@@ -169,6 +204,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_salvage.rsi
+ - type: Paintable
+ group: AirlockDoubleGlass
# == Triple airlocks ==
@@ -179,6 +216,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_basic.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockAtmospherics
@@ -187,6 +226,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_atmospherics.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockCargo
@@ -195,6 +236,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_cargo.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockCentralCommand
@@ -203,6 +246,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_centcomm.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockChemistry
@@ -211,6 +256,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_chemistry.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockCommand
@@ -219,6 +266,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_command.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockEngineering
@@ -227,6 +276,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_engineering.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockMaint
@@ -235,6 +286,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_maint.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockMedical
@@ -243,6 +296,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_medical.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockSalvage
@@ -251,6 +306,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_salvage.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockScience
@@ -259,6 +316,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_science.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockSecurity
@@ -267,6 +326,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_security.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockVirology
@@ -275,3 +336,5 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_virology.rsi
+ - type: Paintable
+ group: AirlockTripleGlass
diff --git a/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/airtight_blocker.yml b/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/airtight_blocker.yml
new file mode 100644
index 0000000000..789acd2b5c
--- /dev/null
+++ b/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/airtight_blocker.yml
@@ -0,0 +1,8 @@
+- type: entity
+ id: SunriseMultiTileAirtightBlocker
+ name: airtight blocker
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Airtight
+ airBlocked: false
+ noAirWhenFullyAirBlocked: false
diff --git a/Resources/Prototypes/_Sunrise/Paintables/airlock_multitile_groups.yml b/Resources/Prototypes/_Sunrise/Paintables/airlock_multitile_groups.yml
new file mode 100644
index 0000000000..d39c37d329
--- /dev/null
+++ b/Resources/Prototypes/_Sunrise/Paintables/airlock_multitile_groups.yml
@@ -0,0 +1,37 @@
+- type: paintableGroup
+ id: AirlockDoubleGlass
+ time: 6
+ cost: 6
+ defaultStyle: basic
+ styles:
+ atmospherics: DoubleGlassAirlockAtmospherics
+ basic: DoubleGlassAirlockBasic
+ cargo: DoubleGlassAirlockCargo
+ chemistry: DoubleGlassAirlockChemistry
+ command: DoubleGlassAirlockCommand
+ engineering: DoubleGlassAirlockEngineering
+ maintenance: DoubleGlassAirlockMaint
+ medical: DoubleGlassAirlockMedical
+ salvage: DoubleGlassAirlockSalvage
+ science: DoubleGlassAirlockScience
+ security: DoubleGlassAirlockSecurity
+ virology: DoubleGlassAirlockVirology
+
+- type: paintableGroup
+ id: AirlockTripleGlass
+ time: 9
+ cost: 9
+ defaultStyle: basic
+ styles:
+ atmospherics: TripleGlassAirlockAtmospherics
+ basic: TripleGlassAirlockBasic
+ cargo: TripleGlassAirlockCargo
+ chemistry: TripleGlassAirlockChemistry
+ command: TripleGlassAirlockCommand
+ engineering: TripleGlassAirlockEngineering
+ maintenance: TripleGlassAirlockMaint
+ medical: TripleGlassAirlockMedical
+ salvage: TripleGlassAirlockSalvage
+ science: TripleGlassAirlockScience
+ security: TripleGlassAirlockSecurity
+ virology: TripleGlassAirlockVirology