Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Tweak] Blob Things #963

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open

[Tweak] Blob Things #963

wants to merge 14 commits into from

Conversation

Roudenn
Copy link
Collaborator

@Roudenn Roudenn commented Nov 30, 2024

Данный ПР в очередной раз меняет некоторую логику блоба, реорганизует положение компонентов и добавляет новый контент, в том числе и Хранилище Блоба.

Основные изменения:

  • Изменена логика атаки блобом тайлов, теперь идёт проверка на наличие вообще любых твёрдых прикрученных объектов на тайле (удобно и приятно тыкается, никаких ломаний мостиков)
  • Количество ресурсов у ядра теперь ограничено (изначально 500), для расширения необходимо строить хранилища блоба.
  • Хранилище блоба - новый тип тайлов, который позволяет хранить с собой больше очков. При уничтожении отнимает у блоба очки.
  • Оптимизирован некоторый код под прототипы и компоненты
  • Почищен код и перенесены файлы по папочкам

Баланс:

  • Укреплённые и Отражающие плитки теперь гораздо более специализированы к своим типам урона - Укреплённая плитка отлично обороняет от пуль и ближних атак, а Отражающая плитка гораздо более устойчива к лазерам и не так устойчива к пулям.

TODO:

  • ЗАРЕБАЛАНСИТЬ ВСЕ ЦИФРЫ К ЧЕРТЯМ АААААААААААААА
  • Написать чейнджлоги

🆑 Roudenn

  • tweak: Укреплённые и Отражающие плитки блоба теперь гораздо более прочны для своих предпочтительных видов урона.
  • add: Добавлен новый вид клеток блоба - Хранилище, который позволяет хранить блобу больше очков.
  • fix: Установка клеток блоба стала более плавной и приятной, также блоб теперь не может расти под закреплёнными твёрдыми структурами.

Summary by CodeRabbit

  • Новые функции

    • Добавлена возможность создания хранилища и турели для блоба.
    • Расширены возможности трансформации блоб-тайлов.
    • Улучшена система управления ресурсами блоба.
  • Исправления

    • Оптимизирована система повреждений для блоб-сущностей.
    • Уточнены механики захвата и распространения блоба.
  • Изменения в интерфейсе

    • Добавлены новые оповещения о состоянии ядра блоба.
    • Обновлены локализации для улучшения понимания игровых механик.

Copy link
Contributor

coderabbitai bot commented Nov 30, 2024

Walkthrough

В данном пулл-реквесте внесены значительные изменения в систему блобов, включая добавление и удаление классов и компонентов, а также изменения в их методах и свойствах. Основные изменения касаются управления блобами, их взаимодействия и обновления логики, связанной с захватом, хранением и улучшением блобов. Также произошло реорганизация пространств имен для улучшения структуры кода. В результате, новые функции и улучшения были добавлены, в то время как некоторые устаревшие элементы были удалены.

Changes

Файл Изменения
Content.Client/Backmen/Blob/BlobTileSystem.cs Обновлен метод TryUpgrade для обработки более сложного типа сущности: Entity<BlobTileComponent, BlobUpgradeableTileComponent>.
Content.Server/Backmen/Blob/BlobTileSystem.cs Удален класс BlobTileSystem и связанные методы, ответственные за управление блобами.
Content.Server/Backmen/Blob/Components/BlobFactoryComponent.cs Удален класс BlobFactoryComponent, который управлял созданием блобов.
Content.Server/Backmen/Blob/Systems/BlobCarrierSystem.cs Изменено пространство имен на Content.Server.Backmen.Blob.Systems.
Content.Server/Backmen/Blob/Systems/BlobCoreActionSystem.cs Изменено пространство имен на Content.Server.Backmen.Blob.Systems и обновлена логика обработки взаимодействий.
Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs Удалены методы, связанные с захватом блобов, изменены модификаторы доступа для некоторых методов.
Content.Server/Backmen/Blob/Systems/BlobFactorySystem.cs Обновлены запросы сущностей и логика инициализации.
Content.Server/Backmen/Blob/Systems/BlobMobSystem.cs Изменено пространство имен на Content.Server.Backmen.Blob.Systems, без изменений в логике.
Content.Server/Backmen/Blob/Systems/BlobNodeSystem.cs Обновлено пространство имен, добавлены проверки для новых компонентов.
Content.Server/Backmen/Blob/Systems/BlobObserverMover.cs Изменено пространство имен и логика обработки движения.
Content.Server/Backmen/Blob/Systems/BlobObserverSystem.cs Изменено пространство имен, обновлены проверки в методах.
Content.Server/Backmen/Blob/Systems/BlobResourceSystem.cs Обновлено пространство имен и логика отображения всплывающих окон.
Content.Server/Backmen/Blob/Systems/BlobStorageSystem.cs Новый класс для управления хранилищем блобов.
Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs Новый класс для управления взаимодействиями с плитками блобов.
Content.Server/Backmen/Blob/Systems/BlobbernautSystem.cs Изменено пространство имен без изменений в логике.
Content.Server/Backmen/Blob/Systems/ZombieBlobSystem.cs Изменено пространство имен, улучшена логика инициализации.
Content.Server/Backmen/GameTicking/Rules/Components/BlobRuleComponent.cs Обновлены директивы using, без изменений в логике.
Content.Server/Backmen/Objectives/Systems/BlobCaptureObjectiveSystem.cs Новый класс для управления целями захвата блобов.
Content.Server/Body/Components/RespiratorComponent.cs Обновлен атрибут доступа для HasImmunity.
Content.Shared/Backmen/Blob/BlobTypedStorage.cs Удалены неиспользуемые свойства.
Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs Добавлены новые свойства для управления хранилищем.
Content.Shared/Backmen/Blob/Components/BlobFactoryComponent.cs Новый компонент для управления блобами.
Content.Shared/Backmen/Blob/Components/BlobNodeComponent.cs Удалены публичные поля BlobStorage и BlobTurret.
Content.Shared/Backmen/Blob/Components/BlobObserverComponent.cs Изменен атрибут AutoGenerateComponentState.
Content.Shared/Backmen/Blob/Components/BlobResourceComponent.cs Изменено пространство имен и атрибуты.
Content.Shared/Backmen/Blob/Components/BlobStorageComponent.cs Новый компонент для управления хранилищем блобов.
Content.Shared/Backmen/Blob/Components/BlobTileComponent.cs Добавлено новое поле PulseHealCost, изменены значения урона.
Content.Shared/Backmen/Blob/Components/BlobUpgradeableTileComponent.cs Новый компонент для улучшения плиток блобов.
Content.Shared/Backmen/Blob/SharedBlobTileSystem.cs Добавлен новый запрос сущностей и обновлены методы.
Resources/Locale/ru-RU/backmen/blob/blob.ftl Обновлены строки локализации для улучшения понимания.
Resources/Prototypes/_Backmen/Actions/blob.yml Добавлены новые параметры и сущности для действий блобов.
Resources/Prototypes/_Backmen/Damage/modifier_sets.yml Изменены множители урона и добавлены новые наборы модификаторов.
Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml Обновлены типы плиток блобов и их параметры.
Resources/Textures/Backmen/Interface/Actions/blob.rsi/meta.json Добавлено новое состояние для текстуры интерфейса.
Resources/Textures/Backmen/Mobs/Aliens/Blob/blob.rsi/meta.json Добавлено новое состояние для блобов.
Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs Обновлен метод OnDestruction для добавления параметра user.
Content.Server/Backmen/GameTicking/Rules/BlobRuleSystem.cs Добавлена новая константа BlobIssuer для идентификации целей, выданных блобом.
Resources/Locale/en-US/blob/blob.ftl Обновлены строки локализации для улучшения обратной связи о состоянии блоба.

Poem

В норке блобов, где весело жить,
Изменения новые, как светлый миг.
Плитки блобов теперь могут расти,
С хранилищами в дружбе, как в сказке, идти!
Пусть блобы в игре будут ярче,
С новыми силами, в радости, в паре! 🐇✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions bot added S: Untriaged Changes: Sprites Should be reviewed or fixed by people who are knowledgeable with spriting or visual design. Changes: Localization Can be reviewed or fixed by people who are knowledgeable with translation size/XL labels Nov 30, 2024
Copy link
Contributor

github-actions bot commented Nov 30, 2024

RSI Diff Bot; head commit 9166f16 merging into 75e69b7
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/Backmen/Interface/Actions/blob.rsi

State Old New Status
blobStorage Added

Resources/Textures/Backmen/Mobs/Aliens/Blob/blob.rsi

State Old New Status
blob_storage_overlay Added

Edit: diff updated after 9166f16

@Roudenn Roudenn marked this pull request as ready for review November 30, 2024 11:46
@Roudenn Roudenn requested a review from Rxup as a code owner November 30, 2024 11:46
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 16

🧹 Outside diff range and nitpick comments (41)
Content.Server/Backmen/Objectives/Systems/BlobCaptureObjectiveSystem.cs (2)

62-64: Избыточная инициализация args.Progress

В строке 63 переменная args.Progress инициализируется значением 0, но сразу после этого её значение может быть переопределено в последующих условиях. Инициализация может быть избыточной и её можно удалить для улучшения читаемости.

Примените следующий код для исправления:

-var target = component.Target;
-args.Progress = 0;
+var target = component.Target;

13-20: Добавьте комментарии XML для методов

Рекомендуется добавить XML-документацию для методов класса, таких как Initialize(), чтобы улучшить понимание кода и облегчить поддержку.

Content.Server/Backmen/Blob/Systems/BlobCoreActionSystem.cs (2)

Line range hint 176-199: Удалите закомментированный нерабочий код или исправьте его.

В данном блоке кода присутствует комментарий: "Этот код не работает. Если вы можете отладить это, пожалуйста, сделайте и исправьте его." Не рекомендуется оставлять нерабочий закомментированный код в кодовой базе. Рекомендуется либо удалить этот код, либо отладить и привести его в рабочее состояние.

Хотите, чтобы я помог с отладкой и исправлением этого кода или создал новую задачу на GitHub для отслеживания этой проблемы?


Line range hint 203-205: Избегайте использования магических чисел.

В строке 203 используется магическое число 2.5f при расчете стоимости. Рекомендуется заменить это значение на именованную константу, чтобы улучшить читаемость и легкость поддержки кода.

Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs (2)

267-274: Удалите закомментированный код или добавьте объяснение.

В методе ChangeBlobEntChem присутствуют закомментированные строки кода, например:

//_damageable.SetDamageModifierSetId(uid, "ExplosiveLatticeBlob");

Если этот код больше не нужен, рекомендуется его удалить для улучшения читаемости. Если он оставлен намеренно для будущего использования, добавьте комментарий с пояснением.


359-366: Уменьшите дублирование кода в блоке switch.

В случаях BlobTileType.Storage и BlobTileType.Turret выполняются схожие действия:

case BlobTileType.Storage:
    node.Value.Comp.BlobStorage = tile;
    Dirty(node.Value);
    break;
case BlobTileType.Turret:
    node.Value.Comp.BlobTurret = tile;
    Dirty(node.Value);
    break;

Рассмотрите возможность объединить эти случаи для сокращения дублирования кода.

Пример:

case BlobTileType.Storage:
    node.Value.Comp.BlobStorage = tile;
    break;
case BlobTileType.Turret:
    node.Value.Comp.BlobTurret = tile;
    break;
default:
    return;
}
Dirty(node.Value);
Content.Shared/Backmen/Blob/Components/BlobResourceComponent.cs (1)

3-3: Перенос компонента в общее пространство имен выглядит обоснованным

Перемещение компонента из Server в Shared пространство имен логично, так как это позволяет использовать его как на сервере, так и на клиенте. Это улучшает архитектуру системы блобов.

Content.Shared/Backmen/Blob/Components/BlobUpgradeableTileComponent.cs (2)

9-10: Требуется документация для поля Locale

Значение по умолчанию "error" указывает на незавершенную реализацию. Рекомендуется:

  1. Добавить XML-документацию с описанием допустимых значений
  2. Заменить значение по умолчанию на более подходящее
+    /// <summary>
+    /// Идентификатор локализации для отображения информации об улучшении.
+    /// </summary>
     [DataField]
     public LocId Locale = "error";

1-11: Рекомендуется добавить валидацию данных

Компонент не содержит проверок входных данных. Рекомендуется добавить:

  1. Валидацию при установке значений
  2. Обработку ошибок для некорректных значений
 public sealed partial class BlobUpgradeableTileComponent : Component
 {
     private BlobTileType _transformTo = BlobTileType.Invalid;
     private LocId _locale = "error";

     [DataField]
-    public BlobTileType TransformTo = BlobTileType.Invalid;
+    public BlobTileType TransformTo
+    {
+        get => _transformTo;
+        set
+        {
+            if (value == BlobTileType.Invalid)
+                throw new ArgumentException("TransformTo не может быть Invalid");
+            _transformTo = value;
+        }
+    }

     [DataField]
-    public LocId Locale = "error";
+    public LocId Locale
+    {
+        get => _locale;
+        set
+        {
+            if (string.IsNullOrEmpty(value))
+                throw new ArgumentException("Locale не может быть пустым");
+            _locale = value;
+        }
+    }
 }
Content.Shared/Backmen/Blob/Components/BlobStorageComponent.cs (2)

5-6: Добавьте документацию для компонента

Рекомендуется добавить XML-документацию для описания назначения компонента и его роли в системе блобов. Это улучшит понимание кода другими разработчиками.

 [RegisterComponent]
+/// <summary>
+/// Компонент для хранения ресурсов блоба.
+/// Позволяет увеличить общее хранилище и штрафует при уничтожении.
+/// </summary>
 public sealed partial class BlobStorageComponent : Component

8-12: Рекомендуется добавить валидацию значений

Жёстко заданные значения 100 и 50 могут потребовать балансировки в будущем. Рекомендуется:

  1. Добавить проверку на отрицательные значения
  2. Вынести значения в конфигурационный файл
     [DataField]
+    [DataField("addTotalStorage")]
+    [ViewVariables(VVAccess.ReadWrite)]
     public FixedPoint2 AddTotalStorage = 100;

     [DataField]
+    [DataField("deleteOnRemove")]
+    [ViewVariables(VVAccess.ReadWrite)]
     public FixedPoint2 DeleteOnRemove = 50;
+
+    protected override void Initialize()
+    {
+        base.Initialize();
+        DebugTools.Assert(AddTotalStorage >= 0, "AddTotalStorage не может быть отрицательным");
+        DebugTools.Assert(DeleteOnRemove >= 0, "DeleteOnRemove не может быть отрицательным");
+    }
Content.Shared/Backmen/Blob/Components/BlobFactoryComponent.cs (2)

8-19: Необходимо добавить документацию для конфигурационных значений

Магические числа MaxPods = 3 и AccumulateToSpawn = 4 требуют пояснения их назначения и влияния на игровой процесс. Рекомендуется:

  1. Добавить XML-документацию
  2. Добавить проверку валидности прототипов при инициализации

Предлагаемые изменения:

 [DataField]
+/// <summary>
+/// Максимальное количество подов, которое может быть создано фабрикой.
+/// </summary>
 public int MaxPods = 3;

 [DataField]
+/// <summary>
+/// Количество единиц, необходимое для создания нового пода.
+/// </summary>
 public int AccumulateToSpawn = 4;

33-33: Рекомендуется расширить событие дополнительной информацией

Событие ProduceBlobbernautEvent не содержит никакой дополнительной информации. Рекомендуется добавить метаданные о создании блоббернаута.

Предлагаемые изменения:

-public sealed class ProduceBlobbernautEvent : EntityEventArgs;
+public sealed class ProduceBlobbernautEvent : EntityEventArgs
+{
+    public readonly EntityUid Factory;
+    public readonly int ResourceCost;
+
+    public ProduceBlobbernautEvent(EntityUid factory, int resourceCost)
+    {
+        Factory = factory;
+        ResourceCost = resourceCost;
+    }
+}
Content.Server/Backmen/Blob/Systems/BlobStorageSystem.cs (3)

1-9: Добавьте документацию для класса

Рекомендуется добавить XML-документацию для публичного класса BlobStorageSystem, описывающую его назначение и ответственности.

+/// <summary>
+/// Система, управляющая хранилищем блоба и его взаимодействием с другими компонентами.
+/// </summary>
 public sealed class BlobStorageSystem : EntitySystem

10-18: Рекомендуется вынести названия событий в константы

Для улучшения поддерживаемости кода и избежания магических строк, рекомендуется определить константы для названий событий.

+private const string BlobTransformEvent = "BlobTransformTileEvent";
+private const string DestructionEvent = "DestructionEventArgs";
+private const string TerminatingEvent = "EntityTerminatingEvent";

6-39: Рассмотрите добавление механизмов синхронизации

Система может быть доступна из разных потоков, что может привести к состоянию гонки при изменении MaxStorageAmount и очков блоба. Рекомендуется:

  1. Добавить блокировки для критических секций
  2. Использовать атомарные операции для изменения числовых значений
  3. Документировать требования к потокобезопасности
Content.Shared/Backmen/Blob/SharedBlobTileSystem.cs (1)

26-43: Рекомендуется улучшить читаемость проверок

Логика проверок стала более надёжной, но можно улучшить читаемость кода, выделив проверки в отдельные методы.

Предлагаемые изменения:

private void AddUpgradeVerb(EntityUid uid, BlobUpgradeableTileComponent comp, GetVerbsEvent<AlternativeVerb> args)
{
-    if (!ObserverQuery.TryGetComponent(args.User, out var ghostBlobComponent) ||
-        !TileQuery.TryGetComponent(uid, out var component) ||
-        TransformQuery.TryGetComponent(uid, out var transformComponent) && !transformComponent.Anchored ||
-        ghostBlobComponent.Core == null ||
-        component.Core == null ||
-        !CoreQuery.HasComponent(ghostBlobComponent.Core.Value))
-        return;
+    if (!ValidateUpgradeComponents(uid, args.User, out var ghostBlobComponent, out var component))
+        return;
+
+    if (!ValidateTransform(uid))
+        return;
+
+    if (!ValidateCores(ghostBlobComponent, component))
+        return;

    var verbName = Loc.GetString(comp.Locale);
    // ... rest of the method
}

+private bool ValidateUpgradeComponents(EntityUid uid, EntityUid user,
+    out BlobObserverComponent ghostBlobComponent,
+    out BlobTileComponent component)
+{
+    return ObserverQuery.TryGetComponent(user, out ghostBlobComponent) &&
+           TileQuery.TryGetComponent(uid, out component);
+}
+
+private bool ValidateTransform(EntityUid uid)
+{
+    return !TransformQuery.TryGetComponent(uid, out var transform) || transform.Anchored;
+}
+
+private bool ValidateCores(BlobObserverComponent observer, BlobTileComponent tile)
+{
+    return observer.Core != null &&
+           tile.Core != null &&
+           CoreQuery.HasComponent(observer.Core.Value);
+}
Content.Server/Backmen/Blob/Systems/BlobObserverMover.cs (4)

Line range hint 14-27: Рефакторинг дублирования кода в конструкторах

Предлагаю вынести общую логику инициализации в отдельный приватный метод для уменьшения дублирования кода.

Пример реализации:

+private void Initialize(BlobObserverSystem observerSystem, SharedTransformSystem transform, EntityManager entityManager)
+{
+    _observerSystem = observerSystem;
+    _transform = transform;
+    _entityManager = entityManager;
+}

 public BlobObserverMover(...) : base(maxTime, cancellation)
 {
-    _observerSystem = observerSystem;
-    _transform = transform;
-    _entityManager = entityManager;
+    Initialize(observerSystem, transform, entityManager);
 }

 public BlobObserverMover(...) : base(maxTime, stopwatch, cancellation)
 {
-    _observerSystem = observerSystem;
-    _transform = transform;
-    _entityManager = entityManager;
+    Initialize(observerSystem, transform, entityManager);
 }

Line range hint 17-17: Удалить закомментированный код

Закомментированный код, связанный с ActionBlockerSystem, следует удалить, если он больше не используется. Если этот код может понадобиться в будущем, лучше сохранить его в системе контроля версий.

Also applies to: 24-24, 35-35


Line range hint 44-93: Рефакторинг метода Process для улучшения читаемости

Метод содержит множество вложенных условий и различных ответственностей. Предлагаю разделить логику на отдельные методы:

  • Валидация состояния наблюдателя
  • Расчет новой позиции
  • Обновление координат

Пример реализации:

 protected override async Task<object?> Process()
 {
     try
     {
-        if (Observer.Comp.Core == null)
-        {
-            return default;
-        }
+        if (!ValidateObserver())
+            return default;
 
-        var newPos = _transform.ToMapCoordinates(NewPosition);
-        var (nearestEntityUid, nearestDistance) = _observerSystem.CalculateNearestBlobTileDistance(newPos);
+        var (nearestEntityUid, nearestDistance) = CalculateNearestBlob();
 
         if (nearestEntityUid == null)
             return default;
 
-        if (nearestDistance > 5f)
-        {
-            if (_entityManager.Deleted(Observer.Comp.Core.Value) ||
-                !_entityManager.TryGetComponent<TransformComponent>(Observer.Comp.Core.Value, out var xform))
-            {
-                _entityManager.QueueDeleteEntity(Observer);
-                return default;
-            }
-            _transform.SetCoordinates(Observer, xform.Coordinates);
-            return default;
-        }
+        return await UpdateObserverPosition(nearestEntityUid.Value, nearestDistance);
     }
     finally
     {
         Observer.Comp.IsProcessingMoveEvent = false;
     }
 }

+private bool ValidateObserver()
+{
+    return Observer.Comp?.Core != null;
+}

+private (EntityUid?, float) CalculateNearestBlob()
+{
+    var newPos = _transform.ToMapCoordinates(NewPosition);
+    return _observerSystem.CalculateNearestBlobTileDistance(newPos);
+}

+private async Task<object?> UpdateObserverPosition(EntityUid nearestEntity, float distance)
+{
+    if (distance > 5f)
+        return await HandleFarDistance();
+    
+    if (distance > 3f)
+        return await HandleMediumDistance(nearestEntity);
+        
+    return default;
+}

Line range hint 44-93: Добавить проверку на null для Observer.Comp

Необходимо добавить защитную проверку на null для Observer.Comp во всех местах использования, чтобы избежать потенциальных NullReferenceException.

Пример реализации:

 protected override async Task<object?> Process()
 {
     try
     {
+        if (Observer.Comp == null)
+            return default;
+            
         if (Observer.Comp.Core == null)
         {
             return default;
         }
         // ... остальной код
     }
     finally
     {
+        if (Observer.Comp != null)
             Observer.Comp.IsProcessingMoveEvent = false;
     }
 }
Content.Shared/Backmen/Blob/Components/BlobObserverComponent.cs (1)

Line range hint 58-98: Улучшение гибкости механики трансформации

Замена булевого флага RequireNode на настраиваемые радиусы поиска (NodeSearchRadius и TileSearchRadius) значительно улучшает гибкость механики. Документация понятная и полная.

Рекомендуется добавить валидацию значений радиуса, чтобы предотвратить возможные проблемы с производительностью при больших значениях.

Content.Server/Backmen/Blob/Systems/BlobMobSystem.cs (3)

Line range hint 26-36: Рекомендуется группировка подписок на события

Предлагаю сгруппировать подписки на события по функциональности для улучшения читаемости кода:

 public override void Initialize()
 {
     base.Initialize();

-    SubscribeLocalEvent<BlobMobComponent, BlobMobGetPulseEvent>(OnPulsed);
+    // Blob core events
+    SubscribeLocalEvent<BlobMobComponent, BlobMobGetPulseEvent>(OnPulsed);
 
+    // Speech related events
     SubscribeLocalEvent<BlobSpeakComponent, DetermineEntityLanguagesEvent>(OnLanguageApply);
     SubscribeLocalEvent<BlobSpeakComponent, ComponentStartup>(OnSpokeAdd);
     SubscribeLocalEvent<BlobSpeakComponent, ComponentShutdown>(OnSpokeRemove);
     SubscribeLocalEvent<BlobSpeakComponent, TransformSpeakerNameEvent>(OnSpokeName);
     SubscribeLocalEvent<BlobSpeakComponent, SpeakAttemptEvent>(OnSpokeCan, after: new []{ typeof(SpeechSystem) });
+    
+    // Radio communication events
     SubscribeLocalEvent<BlobSpeakComponent, EntitySpokeEvent>(OnSpoke, before: new []{ typeof(RadioSystem), typeof(HeadsetSystem) });
     SubscribeLocalEvent<BlobSpeakComponent, RadioReceiveEvent>(OnIntrinsicReceive);
 }

Line range hint 38-52: Рекомендуется добавить дополнительную обработку ошибок

В методах обработки радио сообщений следует добавить проверки на null и валидацию входных данных:

 private void OnIntrinsicReceive(Entity<BlobSpeakComponent> ent, ref RadioReceiveEvent args)
 {
+    if (args.ChatMsg == null)
+        return;
+        
     if (TryComp(ent, out ActorComponent? actor) && args.Channel.ID == ent.Comp.Channel)
     {
         _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel);
     }
 }

 private void OnSpoke(Entity<BlobSpeakComponent> ent, ref EntitySpokeEvent args)
 {
-    if(args.Channel == null)
+    if (args.Channel == null || string.IsNullOrEmpty(args.Message))
         return;
     _radioSystem.SendRadioMessage(ent, args.Message, ent.Comp.Channel, ent, language: args.Language);
 }

Line range hint 54-77: Рекомендуется вынести строковые константы

Для улучшения поддерживаемости кода рекомендуется вынести строковые идентификаторы в константы:

+private const string DefaultBlobLanguage = "blob";
+
 private void OnLanguageApply(Entity<BlobSpeakComponent> ent, ref DetermineEntityLanguagesEvent args)
 {
     if(ent.Comp.LifeStage is
        ComponentLifeStage.Removing
        or ComponentLifeStage.Stopping
        or ComponentLifeStage.Stopped)
         return;

     args.SpokenLanguages.Clear();
-    args.SpokenLanguages.Add(ent.Comp.Language);
-    args.UnderstoodLanguages.Add(ent.Comp.Language);
+    args.SpokenLanguages.Add(DefaultBlobLanguage);
+    args.UnderstoodLanguages.Add(DefaultBlobLanguage);
 }
Content.Shared/Backmen/Blob/BlobTypedStorage.cs (1)

31-32: Удалите закомментированный код

Вместо комментирования кода, его следует полностью удалить, так как система контроля версий сохраняет историю изменений. Закомментированный код ухудшает читаемость и может вводить в заблуждение других разработчиков.

-    /*[DataField]
-    public virtual T Turret { get; set; }*/
Content.Server/Backmen/Blob/Systems/BlobCarrierSystem.cs (5)

Line range hint 19-39: Проверьте порядок подписки на события

Рекомендуется сгруппировать подписки на события по их функциональному назначению для улучшения читаемости кода. Например, отдельно события состояния, языка и разума.

public override void Initialize()
{
    base.Initialize();

    // Состояние и трансформация
    SubscribeLocalEvent<BlobCarrierComponent, MobStateChangedEvent>(OnMobStateChanged);
    SubscribeLocalEvent<BlobCarrierComponent, TransformToBlobActionEvent>(OnTransformToBlobChanged);

    // Инициализация и язык
    SubscribeLocalEvent<BlobCarrierComponent, MapInitEvent>(OnStartup);
    SubscribeLocalEvent<BlobCarrierComponent, DetermineEntityLanguagesEvent>(OnApplyLang);
    SubscribeLocalEvent<BlobCarrierComponent, ComponentRemove>(OnRemove);

    // Управление разумом
    SubscribeLocalEvent<BlobCarrierComponent, MindAddedMessage>(OnMindAdded);
    SubscribeLocalEvent<BlobCarrierComponent, MindRemovedMessage>(OnMindRemove);
}

Line range hint 41-57: Рассмотрите возможность добавления документации для констант

Константы ActionTransformToBlob и BlobLang играют важную роль в системе, рекомендуется добавить XML-документацию для объяснения их назначения.

+/// <summary>
+/// Прототип действия для трансформации в блоба
+/// </summary>
[ValidatePrototypeId<EntityPrototype>]
private const string ActionTransformToBlob = "ActionTransformToBlob";

+/// <summary>
+/// Идентификатор языка блобов
+/// </summary>
[ValidatePrototypeId<LanguagePrototype>]
private const string BlobLang = "Blob";

Line range hint 95-124: Проверьте обработку ошибок в методе TransformToBlob

В методе отсутствует явная обработка ошибок при создании блоба и его компонентов. Рекомендуется добавить логирование и обработку исключительных ситуаций.

protected override void TransformToBlob(Entity<BlobCarrierComponent> ent)
{
    var xform = Transform(ent);
    if (!HasComp<MapGridComponent>(xform.GridUid))
    {
+        Log.Warning($"Попытка трансформации в блоба на невалидной сетке: {ent}");
        return;
    }

    try
    {
        if (_mind.TryGetMind(ent, out _, out var mind) && mind.UserId != null)
        {
            var core = Spawn(ent.Comp.CoreBlobPrototype, xform.Coordinates);
            if (core == default)
            {
+                Log.Error($"Не удалось создать ядро блоба для: {ent}");
                return;
            }
            // ... остальной код ...
        }
+    }
+    catch (Exception e)
+    {
+        Log.Error($"Ошибка при трансформации в блоба: {e}");
+    }
}

Line range hint 71-93: Проверьте закомментированный код

В методе OnStartup присутствует закомментированная строка кода. Рекомендуется либо удалить её, либо добавить комментарий, объясняющий причину сохранения.

-//EnsureComp<BlobSpeakComponent>(uid).OverrideName = false;
+// TODO: Решить вопрос с переопределением имени в BlobSpeakComponent
+// EnsureComp<BlobSpeakComponent>(uid).OverrideName = false;

Line range hint 59-69: Оптимизируйте обработку состояния разума

Рекомендуется использовать событийную модель для отслеживания состояния разума вместо прямого изменения флага.

private void OnMindAdded(EntityUid uid, BlobCarrierComponent component, MindAddedMessage args)
{
-    component.HasMind = true;
+    SetMindState(uid, component, true);
}

private void OnMindRemove(EntityUid uid, BlobCarrierComponent component, MindRemovedMessage args)
{
-    component.HasMind = false;
+    SetMindState(uid, component, false);
}

+private void SetMindState(EntityUid uid, BlobCarrierComponent component, bool hasMind)
+{
+    if (component.HasMind == hasMind)
+        return;
+        
+    component.HasMind = hasMind;
+    Dirty(component);
+}
Content.Server/Backmen/Blob/Systems/BlobFactorySystem.cs (3)

45-48: Предлагаю улучшить обработку null-значений

Рекомендуется объединить проверки в одно выражение для улучшения читаемости:

-if (!_tile.TryComp(uid, out var blobTileComponent) || blobTileComponent.Core == null)
-    return;
-
-if (!_core.TryComp(blobTileComponent.Core, out var blobCoreComponent))
-    return;
+if (!_tile.TryComp(uid, out var blobTileComponent) || 
+    blobTileComponent.Core is not {} core ||
+    !_core.TryComp(core, out var blobCoreComponent))
+    return;

134-151: Оптимизация порядка проверок

Текущий порядок проверок оптимален - сначала проверяется простое условие SpawnedCount, затем более сложные проверки компонентов. Однако, переменная core объявляется, но используется только через несколько строк. Рекомендуется объявлять переменные ближе к месту их использования.

-var core = blobTileComponent.Core.Value;
-var xform = Transform(uid);
+var xform = Transform(uid);
+var core = blobTileComponent.Core.Value;

Line range hint 104-119: Необходимо унифицировать форматирование

В методе FillSmokeGas наблюдается непоследовательное форматирование при добавлении растворов. Рекомендуется привести к единому стилю:

-blobGas.AddSolution(new Solution(Phlogiston, FixedPoint2.New(30))
-{
-    Temperature = 1000
-},
-    _prototypeManager);
+blobGas.AddSolution(
+    new Solution(Phlogiston, FixedPoint2.New(30))
+    {
+        Temperature = 1000
+    },
+    _prototypeManager
+);
Content.Server/Backmen/Blob/Systems/BlobNodeSystem.cs (1)

Line range hint 105-109: Рассмотрите кэширование результата запроса!

Использование _tileQuery более консистентно, но при частом вызове OnDestruction может влиять на производительность. Рекомендуется рассмотреть кэширование результата запроса, если компонент не меняется часто.

 private void OnDestruction(EntityUid uid, BlobNodeComponent component, DestructionEventArgs args)
 {
-    if (!_tileQuery.TryGetComponent(uid, out var tileComp) ||
+    // Кэшируем результат при создании компонента
+    if (component.CachedTileComponent == null && !_tileQuery.TryGetComponent(uid, out component.CachedTileComponent))
+        return;
+    
+    var tileComp = component.CachedTileComponent;
+    if (tileComp.BlobTileType != BlobTileType.Node ||
         tileComp.BlobTileType != BlobTileType.Node ||
         tileComp.Core == null)
         return;
Content.Server/Backmen/Blob/Systems/ZombieBlobSystem.cs (5)

Line range hint 38-47: Оптимизация инъекции зависимостей

Рекомендуется группировать зависимости по их функциональному назначению для улучшения читаемости кода. Также некоторые зависимости (например, _trigger и _inventory) используются только в одном методе, что может указывать на нарушение принципа единой ответственности.


Line range hint 49-58: Вынести конфигурацию газовой смеси

Рекомендуется вынести параметры газовой смеси в конфигурационный файл для упрощения балансировки и тестирования. Текущая реализация с жестко закодированными значениями усложняет поддержку и модификацию параметров.

-    private readonly GasMixture _normalAtmos;
-    public ZombieBlobSystem()
-    {
-        _normalAtmos = new GasMixture(Atmospherics.CellVolume)
-        {
-            Temperature = Atmospherics.T20C
-        };
-        _normalAtmos.AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard);
-        _normalAtmos.AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard);
-        _normalAtmos.MarkImmutable();
-    }
+    [Dependency] private readonly IConfigurationManager _cfg = default!;
+    private GasMixture _normalAtmos;
+    
+    public override void Initialize()
+    {
+        base.Initialize();
+        InitializeAtmosphere();
+    }
+    
+    private void InitializeAtmosphere()
+    {
+        var volume = _cfg.GetCVar("blob.atmosphere.volume") ?? Atmospherics.CellVolume;
+        var temperature = _cfg.GetCVar("blob.atmosphere.temperature") ?? Atmospherics.T20C;
+        
+        _normalAtmos = new GasMixture(volume)
+        {
+            Temperature = temperature
+        };
+        _normalAtmos.AdjustMoles(Gas.Oxygen, _cfg.GetCVar("blob.atmosphere.oxygen") ?? Atmospherics.OxygenMolesStandard);
+        _normalAtmos.AdjustMoles(Gas.Nitrogen, _cfg.GetCVar("blob.atmosphere.nitrogen") ?? Atmospherics.NitrogenMolesStandard);
+        _normalAtmos.MarkImmutable();
+    }

Line range hint 108-169: Рефакторинг метода OnStartup

Метод OnStartup выполняет слишком много операций и нарушает принцип единой ответственности. Рекомендуется разделить логику на отдельные методы:

-    private void OnStartup(EntityUid uid, ZombieBlobComponent component, ComponentStartup args)
+    private void OnStartup(EntityUid uid, ZombieBlobComponent component, ComponentStartup args)
+    {
+        InitializeInventory(uid);
+        InitializeComponents(uid, component);
+        InitializeFactions(uid, component);
+        InitializeTemperature(uid, component);
+        InitializeFixtures(uid, component);
+        InitializeMind(uid, component);
+    }
+
+    private void InitializeInventory(EntityUid uid)
     {
         _ui.CloseUis(uid);
         _inventory.TryUnequip(uid, "underpants", true, true);
         _inventory.TryUnequip(uid, "neck", true, true);
         _inventory.TryUnequip(uid, "mask", true, true);
         _inventory.TryUnequip(uid, "eyes", true, true);
         _inventory.TryUnequip(uid, "ears", true, true);
+    }

Также необходимо удалить закомментированный код, который создает визуальный шум:

-        /*
-        if (!_roleSystem.MindHasRole<BlobRoleComponent>(mindComp.Mind.Value))
-        {
-            _roleSystem.MindAddRole(mindComp.Mind.Value, new BlobRoleComponent
-            {
-                PrototypeId = "Blob"
-            });
-        }
-*/

Line range hint 89-107: Улучшение документации и констант

Метод ReplaceFixtures требует более подробной документации. Также рекомендуется вынести битовые маски в именованные константы:

-    private const int ClimbingCollisionGroup = (int) (CollisionGroup.BlobImpassable);
+    /// <summary>
+    /// Определяет группы коллизий для блоба
+    /// </summary>
+    private static class BlobCollisionGroups
+    {
+        /// <summary>
+        /// Маска для обнаружения столкновений при карабкании
+        /// </summary>
+        public const int Climbing = (int) (CollisionGroup.BlobImpassable);
+        
+        /// <summary>
+        /// Маска для отключения коллизий
+        /// </summary>
+        public const int Disabled = ~Climbing;
+    }

Также необходимо добавить документацию к методу:

+    /// <summary>
+    /// Заменяет текущие физические фикстуры на версии, не позволяющие карабкаться,
+    /// чтобы можно было определить окончание карабкания
+    /// </summary>
+    /// <param name="uid">Идентификатор сущности</param>
+    /// <param name="climbingComp">Компонент карабкания</param>
+    /// <param name="fixturesComp">Компонент фикстур</param>
     private void ReplaceFixtures(EntityUid uid, ZombieBlobComponent climbingComp, FixturesComponent fixturesComp)

Line range hint 171-241: Добавить обработку ошибок

В методе OnShutdown отсутствует обработка потенциальных ошибок при удалении компонентов и сущностей. Рекомендуется добавить try-catch блоки и логирование:

     private void OnShutdown(EntityUid uid, ZombieBlobComponent component, ComponentShutdown args)
     {
         if (TerminatingOrDeleted(uid))
             return;
 
+        try {
             _ui.CloseUis(uid);
             RemComp<BlobSpeakComponent>(uid);
             RemComp<BlobMobComponent>(uid);
             // ... остальной код
+        } catch (Exception e) {
+            Log.Error($"Ошибка при очистке компонентов блоба {uid}: {e}");
+        }
 
+        try {
             _trigger.Trigger(component.BlobPodUid);
             QueueDel(component.BlobPodUid);
+        } catch (Exception e) {
+            Log.Error($"Ошибка при удалении blob pod {component.BlobPodUid}: {e}");
+        }
     }
Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml (1)

Line range hint 378-391: Корректировка баланса отражающего блоба

Внесены существенные изменения в механику отражения:

  • Снижение вероятности отражения с 0.6 до 0.5 делает защиту менее надёжной
  • Увеличение разброса с 20 до 40 может сделать отражение более опасным для союзников

Рекомендуется добавить визуальный индикатор зоны разброса отражения для лучшего понимания игроками.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 5bb99f9 and 69a990e.

⛔ Files ignored due to path filters (2)
  • Resources/Textures/Backmen/Interface/Actions/blob.rsi/blobStorage.png is excluded by !**/*.png
  • Resources/Textures/Backmen/Mobs/Aliens/Blob/blob.rsi/blob_storage_overlay.png is excluded by !**/*.png
📒 Files selected for processing (35)
  • Content.Client/Backmen/Blob/BlobTileSystem.cs (1 hunks)
  • Content.Server/Backmen/Blob/BlobTileSystem.cs (0 hunks)
  • Content.Server/Backmen/Blob/Components/BlobFactoryComponent.cs (0 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobCarrierSystem.cs (1 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobCoreActionSystem.cs (3 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs (15 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobFactorySystem.cs (6 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobMobSystem.cs (1 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobNodeSystem.cs (2 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobObserverMover.cs (1 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobObserverSystem.cs (3 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobResourceSystem.cs (2 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobStorageSystem.cs (1 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs (1 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobbernautSystem.cs (1 hunks)
  • Content.Server/Backmen/Blob/Systems/ZombieBlobSystem.cs (2 hunks)
  • Content.Server/Backmen/GameTicking/Rules/Components/BlobRuleComponent.cs (1 hunks)
  • Content.Server/Backmen/Objectives/Systems/BlobCaptureObjectiveSystem.cs (1 hunks)
  • Content.Server/Body/Components/RespiratorComponent.cs (1 hunks)
  • Content.Shared/Backmen/Blob/BlobTypedStorage.cs (4 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs (4 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobFactoryComponent.cs (1 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobNodeComponent.cs (0 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobObserverComponent.cs (3 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobResourceComponent.cs (1 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobStorageComponent.cs (1 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobTileComponent.cs (3 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobUpgradeableTileComponent.cs (1 hunks)
  • Content.Shared/Backmen/Blob/SharedBlobTileSystem.cs (1 hunks)
  • Resources/Locale/ru-RU/backmen/blob/blob.ftl (2 hunks)
  • Resources/Prototypes/_Backmen/Actions/blob.yml (3 hunks)
  • Resources/Prototypes/_Backmen/Damage/modifier_sets.yml (2 hunks)
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml (9 hunks)
  • Resources/Textures/Backmen/Interface/Actions/blob.rsi/meta.json (1 hunks)
  • Resources/Textures/Backmen/Mobs/Aliens/Blob/blob.rsi/meta.json (1 hunks)
💤 Files with no reviewable changes (3)
  • Content.Shared/Backmen/Blob/Components/BlobNodeComponent.cs
  • Content.Server/Backmen/Blob/Components/BlobFactoryComponent.cs
  • Content.Server/Backmen/Blob/BlobTileSystem.cs
✅ Files skipped from review due to trivial changes (3)
  • Content.Server/Body/Components/RespiratorComponent.cs
  • Content.Server/Backmen/GameTicking/Rules/Components/BlobRuleComponent.cs
  • Content.Server/Backmen/Blob/Systems/BlobbernautSystem.cs
🔇 Additional comments (47)
Content.Server/Backmen/Objectives/Systems/BlobCaptureObjectiveSystem.cs (2)

65-69: Проверьте логику установки прогресса, когда target равен 0

В случае, когда component.Target равен 0, прогресс устанавливается в 1f. Убедитесь, что такое поведение соответствует ожидаемому, так как это может означать, что цель уже достигнута или отсутствует.

Проверьте бизнес-логику, чтобы убедиться, что установка прогресса в 1f при нулевой цели корректна.


10-11: Проверьте правильность использования [Dependency] и инициализации полей

Убедитесь, что поля _stationSystem и _metaDataSystem корректно инициализируются через систему зависимостей. Если эти поля должны быть обязательно установлены, использование default! приемлемо, но рекомендуется проверить, что система зависимостей правильно настроена.

Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs (1)

108-109: Проверьте логику проверки args.Handled

В методе OnPulsed выполнение прекращается, если args.Handled имеет значение false. Возможно, логичнее было бы продолжить обработку, когда args.Handled равно false, и прекратить, если оно true. Пожалуйста, убедитесь, что логика условия соответствует ожидаемому поведению.

Content.Server/Backmen/Blob/Systems/BlobCoreActionSystem.cs (2)

31-31: Изменение пространства имен улучшает организацию кода.

Перемещение класса в пространство имен Content.Server.Backmen.Blob.Systems способствует лучшей структурированности и поддерживаемости кода.


Line range hint 288-292: Проверьте корректность передачи параметров в метод OnInteract.

В методе OnInteractTarget вызывается OnInteract(ent, ent, ev);, где оба параметра ent одинаковы. Убедитесь, что передача одного и того же объекта в качестве observer и observerComponent является преднамеренной и не приведет к непредвиденным ошибкам.

Content.Server/Backmen/Blob/Systems/BlobObserverSystem.cs (3)

23-23: Обновление пространства имен соответствует структуре проекта

Перемещение класса в Content.Server.Backmen.Blob.Systems улучшает организацию кода и соответствует принятой структуре.


207-210: Добавлена проверка ресурсов перед сменой химиката

Проверка возможности использования способности TryUseAbility перед изменением химиката предотвращает некорректное использование без достаточных ресурсов.


310-313: Улучшена валидация узла перед разделением ядра

Добавлены дополнительные проверки на наличие компонентов BlobNodeComponent и BlobTileComponent, а также проверка типа плитки на Core. Это предотвращает попытки разделения ядра на некорректных или неподходящих узлах.

Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs (1)

Line range hint 84-94: Проверьте изменение модификатора доступа класса KillBlobCore.

Класс KillBlobCore изменен с public на private, что может вызвать проблемы, если другие части системы ссылаются на него. Убедитесь, что этот класс не используется вне данного файла.

Пожалуйста, выполните следующий скрипт, чтобы проверить наличие внешних ссылок на KillBlobCore:

✅ Verification successful

Изменение модификатора доступа класса KillBlobCore безопасно

Класс KillBlobCore используется только внутри файла BlobCoreSystem.cs в методах CreateKillBlobCoreJob и через очередь задач _killCoreJobQueue. Поиск по кодовой базе не выявил использования этого класса в других файлах. Изменение модификатора доступа с public на private является безопасным рефакторингом, который правильно отражает область видимости класса.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск использования класса `KillBlobCore` вне текущего файла.

rg 'KillBlobCore' --glob '!Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs'

Length of output: 81


Script:

#!/bin/bash
# Поиск всех файлов, содержащих упоминание BlobCore для более широкого контекста
rg -l "BlobCore" --type cs

# Поиск конкретных упоминаний KillBlobCore в файле BlobCoreSystem.cs
rg "KillBlobCore" "Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs" -A 2 -B 2

Length of output: 2106

Content.Shared/Backmen/Blob/Components/BlobResourceComponent.cs (1)

8-9: Проверьте необходимость удаления ViewVariables

Удаление атрибута ViewVariables может усложнить процесс балансировки, так как значение PointsPerPulsed больше нельзя будет изменять во время выполнения. Учитывая, что в целях PR упоминается предстоящая "полная ребалансировка всех числовых значений", возможно, стоит сохранить возможность настройки этого параметра через VV.

-    [DataField]
+    [ViewVariables(VVAccess.ReadWrite)]
+    [DataField]
     public FixedPoint2 PointsPerPulsed = 3;
Content.Shared/Backmen/Blob/Components/BlobUpgradeableTileComponent.cs (1)

3-5: LGTM: Структура компонента соответствует стандартам

Компонент правильно зарегистрирован и следует конвенциям именования.

Content.Shared/Backmen/Blob/Components/BlobStorageComponent.cs (1)

1-13: Проверьте использование компонента в системе

Компонент выглядит корректным, но нужно убедиться, что он правильно интегрирован с другими системами блобов.

✅ Verification successful

Компонент корректно интегрирован в систему блобов

Компонент BlobStorageComponent правильно используется в BlobStorageSystem.cs, где он:

  • Обрабатывает события трансформации блоба (BlobTransformTileEvent)
  • Корректно взаимодействует с BlobTileComponent
  • Имеет обработку событий уничтожения

Система полностью поддерживает заявленную функциональность компонента по управлению хранилищем.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск использования компонента в системах
ast-grep --pattern 'class $_ : ISystem
{
  $$$
  BlobStorageComponent $$$
  $$$
}'

# Поиск тестов для компонента
rg -l "BlobStorageComponent" -g "*Test*.cs"

Length of output: 84


Script:

#!/bin/bash
# Поиск использования BlobStorageComponent в системах с более широким паттерном
rg "BlobStorageComponent" -A 5 -B 5

# Поиск файлов с "Blob" в названии для анализа связанных систем
fd "Blob.*\.cs$"

Length of output: 7308

Resources/Textures/Backmen/Interface/Actions/blob.rsi/meta.json (1)

42-44: Корректное добавление состояния для нового функционала хранилища блоба

Добавление нового состояния "blobStorage" соответствует заявленным изменениям в PR и следует установленным соглашениям об именовании.

Давайте проверим наличие соответствующего файла текстуры:

✅ Verification successful

Состояние "blobStorage" корректно добавлено и подкреплено текстурой

Проверка подтвердила наличие файла текстуры blobStorage.png в соответствующей директории RSI, что полностью соответствует добавленному состоянию в meta.json.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Проверка наличия файла текстуры для нового состояния blobStorage

# Поиск файла текстуры в директории RSI
fd -e png "blobStorage" "Resources/Textures/Backmen/Interface/Actions/blob.rsi"

Length of output: 147

Content.Shared/Backmen/Blob/Components/BlobFactoryComponent.cs (2)

5-7: Корректное объявление компонента!

Правильное использование модификаторов sealed и partial для компонента. Это соответствует лучшим практикам Space Station 14.


20-31: Рекомендуется улучшить обработку nullable ссылок

Поле Blobbernaut помечено как default!, что может привести к NullReferenceException. Рекомендуется добавить проверки на null при использовании.

Давайте проверим использование этого поля в других файлах:

Content.Client/Backmen/Blob/BlobTileSystem.cs (1)

10-10: Проверьте пустую реализацию метода

Пустая реализация метода TryUpgrade на стороне клиента может быть намеренной, но стоит убедиться, что это действительно ожидаемое поведение. Если это сделано специально для предотвращения апгрейдов на клиентской стороне, рекомендуется добавить поясняющий комментарий.

Предлагаю добавить комментарий, объясняющий причину пустой реализации:

+    /// <summary>
+    /// Пустая реализация на стороне клиента, так как улучшение блоба происходит только на сервере.
+    /// </summary>
     protected override void TryUpgrade(Entity<BlobTileComponent, BlobUpgradeableTileComponent> target, Entity<BlobCoreComponent> core, EntityUid observer) { }

Давайте проверим, что логика улучшения действительно реализована на серверной стороне:

✅ Verification successful

Пустая реализация метода корректна

Пустая реализация TryUpgrade на клиентской стороне полностью оправдана, так как:

  • В базовом классе SharedBlobTileSystem метод объявлен как абстрактный
  • Серверная реализация в Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs содержит логику трансформации блоба через событие BlobTransformTileActionEvent
  • Клиентская часть не должна выполнять никаких действий при апгрейде, так как это серверная логика

Рекомендация по документации остаётся актуальной:

+    /// <summary>
+    /// Пустая реализация на стороне клиента, так как улучшение блоба происходит только на сервере.
+    /// </summary>
     protected override void TryUpgrade(Entity<BlobTileComponent, BlobUpgradeableTileComponent> target, Entity<BlobCoreComponent> core, EntityUid observer) { }
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск серверной реализации метода TryUpgrade

# Проверяем наличие серверной реализации
ast-grep --pattern 'class SharedBlobTileSystem {
  $$$
  protected virtual void TryUpgrade($$$) {
    $$$
  }
  $$$
}'

# Ищем связанные компоненты
rg "BlobUpgradeableTileComponent" -A 5

Length of output: 120


Script:

#!/bin/bash
# Поиск всех файлов, связанных с BlobTileSystem
rg "class.*BlobTileSystem" --type cs

# Поиск реализаций TryUpgrade в серверном коде
rg "TryUpgrade.*BlobTile.*Component.*core.*observer" --type cs

# Поиск определения компонента BlobUpgradeableTileComponent
fd "BlobUpgradeableTileComponent.cs" --type f --exec cat {}

Length of output: 1385


Script:

#!/bin/bash
# Поиск реализации TryUpgrade на сервере с контекстом
rg "protected override void TryUpgrade.*BlobTile.*Component.*core.*observer" -A 10 Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs

# Поиск использования метода TryUpgrade
rg "TryUpgrade\(" --type cs -A 3

Length of output: 2384

Content.Shared/Backmen/Blob/Components/BlobTileComponent.cs (2)

19-21: Проверьте балансировку значения PulseHealCost

Новое поле PulseHealCost со значением 0.2 может потребовать дополнительного тестирования для подтверждения баланса. Согласно целям PR, планируется полная перебалансировка числовых значений в будущем.

Рекомендуется:

  1. Вынести значение 0.2 в константу уровня конфигурации
  2. Добавить комментарий, объясняющий логику выбора данного значения

44-45: ⚠️ Potential issue

Подтвердите изменение урона от Heat

Уменьшение урона с 24 до 12 существенно влияет на механику игры. Комментарий указывает, что это оставляет обычный тайл с 1 HP до уничтожения.

Запустим проверку других мест, где может использоваться это значение:

Content.Server/Backmen/Blob/Systems/BlobResourceSystem.cs (1)

5-5: Правильное изменение пространства имен!

Перемещение в подпространство Systems улучшает организацию кода и соответствует стандартным практикам C#.

Content.Shared/Backmen/Blob/SharedBlobTileSystem.cs (2)

11-11: Правильное добавление EntityQuery!

Добавление специализированного TileQuery улучшит производительность при частых проверках компонентов BlobTile. Инициализация выполнена корректно.

Also applies to: 21-21


24-24: Проверьте реализации в дочерних классах!

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

✅ Verification successful

Изменение сигнатуры метода TryUpgrade корректно обработано

Проверка показала, что все дочерние классы (BlobTileSystem в Server и Client) уже реализуют обновленную сигнатуру метода с обоими компонентами (BlobTileComponent, BlobUpgradeableTileComponent). Изменения применены корректно во всей кодовой базе.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Find all implementations of TryUpgrade
ast-grep --pattern 'class $_ : SharedBlobTileSystem {
  $$$
  protected override void TryUpgrade($$$) {
    $$$
  }
  $$$
}'

Length of output: 126


Script:

#!/bin/bash
# Search for files containing SharedBlobTileSystem
fd ".*\.cs$" | xargs rg "SharedBlobTileSystem" -l

# Then search for TryUpgrade implementations
fd ".*\.cs$" | xargs rg "protected override void TryUpgrade" -B 2 -A 5

Length of output: 1776

Resources/Prototypes/_Backmen/Damage/modifier_sets.yml (3)

104-109: Сбалансированные коэффициенты для BlobMob

Коэффициенты урона выглядят хорошо сбалансированными. Значение 0.50 для физического урона и 1.50 для теплового обеспечивает разумную устойчивость моба.


112-118: Хорошо определена специализация BlobStrong

Коэффициенты создают четкую специализацию: сильная защита против физического урона (0.20) и уязвимость к тепловому (2.00). Это соответствует целям изменений и создает интересный геймплей.


80-83: ⚠️ Potential issue

Необходимо пересмотреть коэффициенты урона для BaseBlob

Значительное увеличение коэффициентов урона может сделать базовых блобов слишком уязвимыми. Особенно критичен коэффициент теплового урона (3.00), который делает их чрезвычайно слабыми против энергетического оружия.

Рекомендуется:

  coefficients:
-   Heat: 3.00
+   Heat: 2.00
Content.Server/Backmen/Blob/Systems/BlobObserverMover.cs (1)

9-9: Корректное изменение пространства имен!

Перемещение класса в пространство имен Systems улучшает организацию кода и соответствует архитектурным принципам.

Content.Shared/Backmen/Blob/Components/BlobObserverComponent.cs (2)

99-103: Проверить последствия упрощения классов событий

Упрощение классов событий улучшает читаемость кода, но необходимо убедиться, что не была потеряна важная функциональность.

✅ Verification successful

Let me analyze the results of these commands to determine if the simplification is safe or if there are any patterns we should be aware of.


Упрощение классов событий безопасно

Анализ показывает, что:

  • Все события используются в системе BlobObserverSystem как простые сигналы без дополнительных данных
  • Упрощение соответствует общему паттерну в кодовой базе, где большинство ActionEvent классов являются простыми маркерами без дополнительных полей
  • Все обработчики событий в BlobObserverSystem получают необходимые данные из компонентов, а не из самих событий
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for any custom logic in previous versions of these event classes
git log -S "BlobCreateBlobbernautActionEvent" --full-history -- "Content.Shared/Backmen/Blob/Components/*.cs"
git log -S "BlobSplitCoreActionEvent" --full-history -- "Content.Shared/Backmen/Blob/Components/*.cs"
git log -S "BlobSwapCoreActionEvent" --full-history -- "Content.Shared/Backmen/Blob/Components/*.cs"
git log -S "BlobToCoreActionEvent" --full-history -- "Content.Shared/Backmen/Blob/Components/*.cs"
git log -S "BlobSwapChemActionEvent" --full-history -- "Content.Shared/Backmen/Blob/Components/*.cs"

Length of output: 0


Script:

#!/bin/bash
# Let's try to find these event classes in the current codebase
rg -A 5 "class Blob(Create|Split|Swap|To).*ActionEvent" --type cs

# Also check for any usage of these events
rg "Blob(Create|Split|Swap|To).*ActionEvent" --type cs

# Check if there are any similar event classes that might provide insight into expected structure
rg "class.*ActionEvent\s*:\s*(WorldTarget|Instant)ActionEvent" --type cs

Length of output: 12924


Line range hint 14-31: Необходимо провести очистку кода

В компоненте присутствует закомментированный код, который следует удалить, если он больше не используется. Также рекомендуется проверить необходимость синхронизации поля IsProcessingMoveEvent.

✅ Verification successful

Поле IsProcessingMoveEvent не требует сетевой синхронизации

Поле IsProcessingMoveEvent используется только на серверной стороне в системах BlobObserverSystem и BlobObserverMover для контроля состояния обработки событий перемещения. Так как это внутреннее серверное состояние, синхронизация через сеть не требуется.

Рекомендации:

  • Удалить закомментированный код ([AutoNetworkedField] и блок с CanMove)
  • Оставить поле IsProcessingMoveEvent без атрибута [AutoNetworkedField], так как оно используется только на сервере
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if IsProcessingMoveEvent is used in network sync context
rg "IsProcessingMoveEvent.*[Nn]etwork" -A 3

Length of output: 45


Script:

#!/bin/bash
# Let's check for any usage of IsProcessingMoveEvent
rg "IsProcessingMoveEvent" -A 3

# Also check if there are any network-related handlers or methods involving this field
ast-grep --pattern 'public sealed partial class BlobObserverComponent {
  $$$
  public $_ Handle$_($$$) {
    $$$
    IsProcessingMoveEvent
    $$$
  }
  $$$
}'

Length of output: 1489

Content.Server/Backmen/Blob/Systems/BlobMobSystem.cs (2)

16-24: Структура класса и пространства имен соответствует лучшим практикам!

Перемещение класса в пространство имен Systems улучшает организацию кода и соответствует принципам разделения ответственности.


Line range hint 89-117: Необходима проверка корректности удаления каналов

Рекомендуется добавить проверку существования канала перед его удалением:

 private void OnSpokeRemove(Entity<BlobSpeakComponent> ent, ref ComponentShutdown args)
 {
     if(TerminatingOrDeleted(ent))
         return;

     _language.UpdateEntityLanguages(ent.Owner);
     var radio = EnsureComp<ActiveRadioComponent>(ent);
+    if (radio.Channels.Contains(ent.Comp.Channel))
     radio.Channels.Remove(ent.Comp.Channel);
 }
Resources/Prototypes/_Backmen/Actions/blob.yml (4)

13-13: Добавление радиуса поиска узлов выглядит правильным!

Значение nodeSearchRadius соответствует другим подобным действиям, что обеспечивает согласованность механики.


30-33: Явное определение параметров улучшает читаемость конфигурации!

Хорошая практика - явно определять все параметры вместо использования значений по умолчанию. Это упрощает поддержку кода и уменьшает вероятность ошибок при изменении значений по умолчанию.


64-64: Требуется проверка влияния увеличенного радиуса поиска!

Увеличение tileSearchRadius до 4.5 может существенно повлиять на баланс игры и производительность. Рекомендуется:

  1. Проверить влияние на производительность при большом количестве узлов
  2. Убедиться, что это изменение соответствует планируемому ребалансу

35-47: Новый тип действия для хранилища блоба соответствует целям PR!

Реализация ActionCreateBlobStorage корректно следует установленным паттернам других действий блоба. Однако рекомендуется добавить документацию о механике потери очков при уничтожении хранилища.

✅ Verification successful

Механика потери очков при уничтожении хранилища реализована корректно!

В коде присутствует полная реализация механики хранилища блоба:

  • Стоимость создания хранилища (50 очков) указана в BlobCoreComponent
  • Система BlobStorageSystem обрабатывает уничтожение хранилища через события DestructionEventArgs и EntityTerminatingEvent
  • В локализации blob.ftl есть описание механики хранилища для игроков

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка наличия документации о механике хранилища
rg -l "blob.*storage" --type md

Length of output: 33


Script:

#!/bin/bash
# Поиск всех файлов с расширением .md в репозитории
fd -e md

# Поиск любых упоминаний о хранилище блоба в исходном коде
rg -i "blob.*storage" -A 2 -B 2

Length of output: 16654

Resources/Textures/Backmen/Mobs/Aliens/Blob/blob.rsi/meta.json (1)

255-273: Корректное добавление состояния анимации для хранилища блоба

Новое состояние blob_storage_overlay корректно добавлено и соответствует общей структуре файла. Временные интервалы анимации (0.2с) соответствуют другим важным состояниям блоба (например, как у ядра), что логично для элемента хранения ресурсов.

Рекомендация: убедитесь, что соответствующие спрайты для этого состояния присутствуют в .rsi директории.

✅ Verification successful

Спрайт для состояния blob_storage_overlay найден

Файл спрайта blob_storage_overlay.png присутствует в директории .rsi, что подтверждает корректность добавления графических ресурсов для нового состояния хранилища блоба.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Проверка наличия файлов спрайтов для нового состояния

# Поиск файлов состояния blob_storage_overlay в директории .rsi
fd "blob_storage_overlay" "Resources/Textures/Backmen/Mobs/Aliens/Blob/blob.rsi"

Length of output: 156


Script:

#!/bin/bash
# Check if the sprite file exists and verify its frame count matches the delays array
identify -format "%n\n" "Resources/Textures/Backmen/Mobs/Aliens/Blob/blob.rsi/blob_storage_overlay.png"

Length of output: 202

Content.Server/Backmen/Blob/Systems/BlobCarrierSystem.cs (1)

17-17: Подтверждаю изменение пространства имен

Перемещение класса в подпространство Systems соответствует лучшим практикам организации кода и улучшает структуру проекта.

Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs (3)

33-34: Проверьте значение MaxStorageAmount на баланс

Новое ограничение ресурсов блоба в 200 единиц требует проверки на соответствие игровому балансу. Убедитесь, что это значение не делает игру слишком сложной или слишком простой.

Рекомендую добавить комментарий к полю, объясняющий причину выбора именно этого значения:

[ViewVariables]
+ /// <summary>
+ /// Максимальное количество ресурсов, которое может хранить ядро блоба.
+ /// Значение 200 выбрано для баланса между ростом и ограничением расширения.
+ /// </summary>
public FixedPoint2 MaxStorageAmount = 200;

52-53: Проверьте радиус расширения блоба

Значение TilesRadiusLimit в 9 единиц является критическим параметром для игрового процесса и требует тщательного тестирования.

Предлагаю добавить документацию к этому параметру:

[DataField]
+ /// <summary>
+ /// Максимальный радиус расширения блоба в тайлах.
+ /// Ограничивает зону контроля одного ядра.
+ /// </summary>
public float TilesRadiusLimit = 9f;

155-155: Проверьте стоимость и баланс новых типов блоба

Добавление Storage типа со стоимостью 50 и активация Turret типа со стоимостью 75 требуют проверки баланса относительно других типов блоба.

Рекомендую:

  1. Добавить комментарии к каждому типу блоба, объясняющие их роль и стоимость
  2. Рассмотреть создание отдельного конфигурационного файла для значений баланса

Also applies to: 184-184

✅ Verification successful

Let me gather more information about the blob types and their costs to better understand the balance.


Стоимость новых типов блоба соответствует общему балансу системы

Анализ стоимости всех типов блоба показывает, что новые типы имеют сбалансированную стоимость относительно существующих:

  • Storage (50) соответствует стоимости Node (50)
  • Turret (75) находится между Factory (80) и Resource (60)

Существующая иерархия стоимости логична:

  • Базовые типы: Normal (6), Strong/Reflective (15)
  • Средние типы: Node/Storage (50), Resource (60)
  • Продвинутые типы: Turret (75), Factory (80)

Рекомендации по документированию остаются актуальными, но сами значения стоимости сбалансированы корректно.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск использования новых типов блоба в коде для проверки их интеграции

# Проверяем использование Storage типа
rg "BlobTileType\.Storage" -A 3

# Проверяем использование Turret типа
rg "BlobTileType\.Turret" -A 3

Length of output: 5151


Script:

#!/bin/bash
# Поиск всех типов блоба и их стоимости
rg "BlobTileType\." Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs -A 1

# Поиск дополнительных свойств и механик для разных типов блоба
ast-grep --pattern 'class BlobTileComponent {
  $$$
}'

# Поиск комментариев или документации о балансе
rg -i "blob.*balance|cost" -A 2

Length of output: 1020

Content.Server/Backmen/Blob/Systems/BlobFactorySystem.cs (2)

17-18: Оптимизация запросов сущностей!

Использование EntityQuery вместо повторяющихся TryComp является хорошей практикой оптимизации в ECS системах. Это позволяет избежать повторного поиска компонентов и улучшает производительность.

Also applies to: 28-29


Line range hint 1-161: Проверьте баланс химических эффектов

Система содержит различные химические эффекты с разными свойствами. Рекомендуется проверить их баланс в игре, особенно:

  • Урон от BlazingOil (температура 1000)
  • Количество реагентов (30 единиц)
  • Эффекты ElectromagneticWeb (комбинация трёх металлов)
✅ Verification successful

Let me gather more information about the chemical effects and damage values to better assess the balance.


Let me try one more search to find damage and chemical configurations in the blob system specifically.


Химические эффекты блоба сбалансированы и соответствуют игровой механике

На основе анализа кодовой базы можно сделать следующие выводы:

  • Температура 1000 для BlazingOil и ExplosiveLattice согласуется с их боевым назначением
  • Количество реагентов (30 единиц) является стандартным для всех типов, кроме ElectromagneticWeb (3x10 единиц)
  • Урон от всех эффектов масштабируется на 0.8 для блоббернаутов, что обеспечивает баланс
  • Специальные эффекты (взрывы, ЭМИ) имеют ограниченный радиус действия и вероятность срабатывания

Система демонстрирует продуманный баланс между различными химическими типами блоба.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других мест использования этих химических эффектов для сравнения значений
rg -A 2 "Temperature = 1000" --type cs
rg -A 2 "FixedPoint2\.New\(30\)" --type cs

Length of output: 4173


Script:

#!/bin/bash
# Search for damage-related configurations and chemical effects
ast-grep --pattern 'DamageDict.Add($_, $_)'

# Look for other chemical solutions with temperature modifications
rg "Temperature = \d+" --type cs -A 2

# Find other chemical quantity configurations
rg "Solution\([^,]+, FixedPoint2\.New\(\d+\)" --type cs

Length of output: 142


Script:

#!/bin/bash
# Search for blob-related damage configurations
rg "ChemDamageDict|blobbernautDamage|DamageDict" --type cs -A 3 Content.Server/Backmen/Blob/

# Look for other blob chemical configurations
rg "BlobChemType|CurrentChem" --type cs -A 3 Content.Server/Backmen/Blob/

Length of output: 15782

Content.Server/Backmen/Blob/Systems/BlobNodeSystem.cs (2)

15-15: Правильная реорганизация пространства имен!

Перемещение системных классов в отдельное пространство имен Systems улучшает организацию кода и соответствует лучшим практикам.


93-100: Проверьте инициализацию новых компонентов!

Добавление поддержки BlobStorage и BlobTurret реализовано корректно, но необходимо убедиться, что эти компоненты правильно инициализируются при создании BlobNode.

✅ Verification successful

Инициализация компонентов реализована корректно

Проверка показала, что компоненты BlobStorage и BlobTurret:

  • Корректно объявлены как nullable поля в BlobNodeComponent
  • Правильно инициализируются через BlobCoreSystem при создании
  • Имеют корректную обработку в системах BlobStorageSystem и BlobTileSystem
  • Содержат необходимые проверки на null и валидацию перед использованием
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск инициализации компонентов BlobStorage и BlobTurret
ast-grep --pattern 'BlobNodeComponent {
  $$$
  BlobStorage = $_;
  $$$
}'

ast-grep --pattern 'BlobNodeComponent {
  $$$
  BlobTurret = $_;
  $$$
}'

Length of output: 76


Script:

#!/bin/bash
# Поиск файлов с определением BlobNodeComponent
fd "BlobNodeComponent" --type f

# Поиск использования BlobStorage и BlobTurret
rg "BlobStorage|BlobTurret" -A 3 -B 3

Length of output: 10102

Resources/Locale/ru-RU/backmen/blob/blob.ftl (1)

6-6: Проверьте согласованность терминологии

Изменение с "узла" на "клетку" должно быть согласовано во всей кодовой базе для поддержания единообразия терминологии.

✅ Verification successful

Based on the search results, I can generate the final response as there's enough evidence to verify the terminology consistency. The search shows that in the blob-related files, both terms "узел" (node) and "клетка/тайл" (tile) are used consistently in their respective contexts:

Терминология используется корректно

Изменение с "узла" на "клетку" в данном контексте правильное, так как в коде последовательно используются:

  • "узел/узлы" (node) для обозначения специальных точек блоба (ядро и узлы)
  • "клетка/тайл" (tile) для обозначения обычных занятых блобом участков
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check terminology consistency across localization files
rg -g '*.ftl' "узл|клетк|тайл" Resources/Locale/ru-RU/

Length of output: 10825

Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml (4)

42-49: Улучшение механики развития базового блоба

Добавление возможности улучшения до Strong варианта и увеличение порога урона с 25 до 40 существенно усиливает базовые блобы. Это изменение может сделать начальную фазу игры более стабильной.


334-367: Реализация улучшенного защитного блоба

Новый тип StrongBlobTile хорошо продуман с точки зрения защитных механик:

  • Герметичность защищает от газовых атак
  • Возможность улучшения до Reflective добавляет глубину геймплея
  • Специальный набор модификаторов урона через damageModifierSet: BlobStrong
✅ Verification successful

Подтверждение корректности реализации StrongBlobTile

Реализация полностью соответствует заявленному описанию:

  • Набор модификаторов урона BlobStrong корректно настроен для защитной роли:
    • Высокая устойчивость к физическому урону (0.2x для ударного, режущего и колющего)
    • Уязвимость к тепловому урону (2.0x) как баланс
  • Герметичность и возможность улучшения до Reflective дополняют защитную специализацию
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка конфигурации модификаторов урона
rg "BlobStrong" | grep -A 5 "damageModifierSet"

Length of output: 268


Script:

#!/bin/bash
# Проверяем конфигурацию модификаторов урона для BlobStrong
cat Resources/Prototypes/_Backmen/Damage/modifier_sets.yml

Length of output: 2661


200-200: Ослабление фабрики блобов

Уменьшение порога урона с 120 до 80 делает фабрики значительно более уязвимыми. Это может затруднить производство блоббернаутов и поддержание армии блоб-подов.


Line range hint 1-391: Общий анализ изменений баланса

Наблюдается существенное снижение устойчивости всех структур блоба:

  • Ядро: -150 урона
  • Фабрика: -40 урона
  • Узел: -50 урона
  • Ресурсный блоб: -10 урона

При этом добавлены новые стратегические элементы:

  • Система улучшений блобов
  • Хранилище ресурсов
  • Улучшенные защитные структуры

Рекомендуется:

  1. Создать отдельный файл конфигурации для балансных значений
  2. Добавить систему тестирования баланса
  3. Документировать причины изменения каждого значения

Comment on lines +30 to +35
if (!TryComp<BlobObserverComponent>(args.Mind.OwnedEntity, out var blobObserverComponent)
|| !HasComp<BlobCoreComponent>(blobObserverComponent.Core))
{
args.Cancelled = true;
return;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Потенциальная ошибка NullReferenceException при обращении к blobObserverComponent.Core

В строках 30-31 свойство blobObserverComponent.Core может быть null, что приведёт к исключению NullReferenceException при вызове HasComp<BlobCoreComponent>(blobObserverComponent.Core). Рекомендуется добавить проверку на null перед использованием blobObserverComponent.Core.

Примените следующий код для исправления:

if (blobObserverComponent.Core == null || !HasComp<BlobCoreComponent>(blobObserverComponent.Core))
{
    args.Cancelled = true;
    return;
}

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +55 to +60
if (!TryComp<BlobObserverComponent>(args.Mind.OwnedEntity, out var blobObserverComponent)
|| !TryComp<BlobCoreComponent>(blobObserverComponent.Core, out var blobCoreComponent))
{
args.Progress = 0;
return;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Потенциальная ошибка NullReferenceException при обращении к blobObserverComponent.Core

В строках 55-56 свойство blobObserverComponent.Core может быть null, что приведёт к исключению NullReferenceException при вызове TryComp<BlobCoreComponent>(blobObserverComponent.Core, out var blobCoreComponent). Рекомендуется добавить проверку на null перед использованием blobObserverComponent.Core.

Примените следующий код для исправления:

if (blobObserverComponent.Core == null || !TryComp<BlobCoreComponent>(blobObserverComponent.Core, out var blobCoreComponent))
{
    args.Progress = 0;
    return;
}

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +47 to +51
private void OnBlobCaptureInfo(EntityUid uid, BlobCaptureConditionComponent component, ref ObjectiveAfterAssignEvent args)
{
_metaDataSystem.SetEntityName(uid,Loc.GetString("objective-condition-blob-capture-title"));
_metaDataSystem.SetEntityDescription(uid,Loc.GetString("objective-condition-blob-capture-description", ("count", component.Target)));
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Отсутствуют ключи локализации для условий цели блоба

Ключи локализации "objective-condition-blob-capture-title" и "objective-condition-blob-capture-description" не найдены в файлах локализации. Их необходимо добавить в соответствующий файл локализации (например, в Resources/Locale/ru-RU/ss14-ru/prototypes/objectives/blobObjectives.ftl).

🔗 Analysis chain

Проверьте наличие локализованных строк

Убедитесь, что ключи локализации "objective-condition-blob-capture-title" и "objective-condition-blob-capture-description" существуют в ресурсах локализации. Отсутствие этих ключей может привести к проблемам с отображением текста.

Выполните следующий скрипт для проверки наличия локализованных строк:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск ключей локализации в ресурсах.

# Тест: Ищет ключи в файлах локализации.
grep -rnw 'Resources/Localization/' -e 'objective-condition-blob-capture-title'
grep -rnw 'Resources/Localization/' -e 'objective-condition-blob-capture-description'

Length of output: 275


Script:

#!/bin/bash
# Поиск файлов локализации в репозитории
fd -e yml -e yaml

# Поиск ключей локализации в найденных файлах
rg "objective-condition-blob-capture-title|objective-condition-blob-capture-description"

Length of output: 106328


Script:

#!/bin/bash
# Поиск файлов локализации в директории Resources/Locale
fd -e ftl

# Поиск ключей локализации в найденных файлах
rg "objective-condition-blob-capture-title|objective-condition-blob-capture-description"

Length of output: 130679

Comment on lines +190 to +194
foreach (var keyValuePair in ent.Comp.HealthOfPulse.DamageDict)
{
healCore.DamageDict.Add(keyValuePair.Key, keyValuePair.Value * 2);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Возможное исключение при добавлении дублирующихся ключей в DamageDict

В методе HealTile при добавлении элементов в healCore.DamageDict существует риск возникновения исключения ArgumentException, если ключ уже присутствует в словаре. Рекомендуется использовать присваивание для обновления значений:

- healCore.DamageDict.Add(keyValuePair.Key, keyValuePair.Value * 2);
+ healCore.DamageDict[keyValuePair.Key] = keyValuePair.Value * 2;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
foreach (var keyValuePair in ent.Comp.HealthOfPulse.DamageDict)
{
healCore.DamageDict.Add(keyValuePair.Key, keyValuePair.Value * 2);
}
}
foreach (var keyValuePair in ent.Comp.HealthOfPulse.DamageDict)
{
healCore.DamageDict[keyValuePair.Key] = keyValuePair.Value * 2;
}
}

Comment on lines +41 to +46
_popup.PopupEntity(Loc.GetString("blob-get-resource", ("point", points)),
uid,
blobCoreComponent.Observer.Value,
PopupType.LargeGreen);

_blobCoreSystem.ChangeBlobPoint(blobTileComponent.Core.Value, points);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Необходимо исправить порядок операций и добавить обработку ошибок!

Текущая реализация имеет несколько проблем:

  1. Уведомление показывается до фактического изменения очков
  2. Отсутствует проверка успешности операции
  3. Нет обработки ошибок

Предлагаемые изменения:

-        _popup.PopupEntity(Loc.GetString("blob-get-resource", ("point", points)),
-            uid,
-            blobCoreComponent.Observer.Value,
-            PopupType.LargeGreen);
-
-        _blobCoreSystem.ChangeBlobPoint(blobTileComponent.Core.Value, points);
+        if (_blobCoreSystem.ChangeBlobPoint(blobTileComponent.Core.Value, points))
+        {
+            _popup.PopupEntity(Loc.GetString("blob-get-resource", ("point", points)),
+                uid,
+                blobCoreComponent.Observer.Value,
+                PopupType.LargeGreen);
+        }
+        else
+        {
+            _popup.PopupEntity(Loc.GetString("blob-get-resource-failed"),
+                uid,
+                blobCoreComponent.Observer.Value,
+                PopupType.Error);
+        }

Comment on lines 119 to 125
- type: damageModifierSet
id: BlobReflective # Defence against lasers, but weak against melee damage.
coefficients:
Blunt: 1.00 # Weak for melee damages
Slash: 1.10
Piercing: 1.00
Heat: 1.10 # Good against heat
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

Несоответствие между названием и механикой BlobReflective

Обнаружено противоречие:

  1. Комментарий указывает на защиту против лазеров
  2. Название подразумевает отражение
  3. Коэффициент теплового урона (1.10) показывает уязвимость

Предлагаемые изменения:

  id: BlobReflective
  coefficients:
    Blunt: 1.00
    Slash: 1.10
    Piercing: 1.00
-   Heat: 1.10 # Good against heat
+   Heat: 0.50 # Actually good against heat/lasers
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- type: damageModifierSet
id: BlobReflective # Defence against lasers, but weak against melee damage.
coefficients:
Blunt: 1.00 # Weak for melee damages
Slash: 1.10
Piercing: 1.00
Heat: 1.10 # Good against heat
- type: damageModifierSet
id: BlobReflective # Defence against lasers, but weak against melee damage.
coefficients:
Blunt: 1.00 # Weak for melee damages
Slash: 1.10
Piercing: 1.00
Heat: 0.50 # Actually good against heat/lasers

BlobTileType.Storage => Storage,
BlobTileType.Turret => Turret,
*/
//BlobTileType.Turret => Turret,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Let me analyze the findings. I can see that there are still several references to the Turret functionality across the codebase, including commented-out code, active code, and localization strings. Let me generate the final response in Russian:

Необходимо полностью удалить неиспользуемую функциональность Turret

Найдены остаточные ссылки на функциональность Turret, которые требуют очистки:

  • В Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs: Удалить логику, связанную с BlobTurret
  • В Content.Server/Backmen/Blob/Systems/BlobNodeSystem.cs: Удалить обработку BlobTurret
  • В Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs: Удалить case для BlobTileType.Turret
  • В Content.Shared/Backmen/Blob/Components/BlobNodeComponent.cs: Удалить поле BlobTurret
  • В Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs: Удалить все упоминания Turret
  • В Resources/Locale/ru-RU/backmen/blob/blob.ftl: Удалить локализационные строки для turret
🔗 Analysis chain

Проверьте влияние удаления Turret на другие части кодовой базы

Удаление функциональности Turret может повлиять на другие части системы. Необходимо убедиться, что все зависимые компоненты обновлены соответствующим образом.

Also applies to: 82-84, 107-107

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Search for any remaining references to BlobTileType.Turret

# Search for Turret references in code
rg "BlobTileType\.Turret" 

# Search for any remaining Turret-related blob code
rg -i "blobturret|turretblob|blob.*turret|turret.*blob"

Length of output: 2832

Comment on lines +60 to +65
blob-create-factory-action-name = Создать блоб фабрику (40)
blob-create-factory-action-desc = Превращает выбраного нормального блоба в фабрику, которая способна производить различных преспешников блоба, если рядом есть узел или ядро.
blob-create-storage-action-name = Создать блоб хранилище (50)
blob-create-storage-action-desc = Превращает выбраного нормального блоба в хранилище, которое расширяет максимальное количество ресурсов которое может иметь блоб.
blob-create-turret-action-name = Создать блоб турель (75)
blob-create-turret-action-desc = Превращает выбраного нормального блоба в турель, которая стреляет по врагам своими мелкими спорами, расходуя очки.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Рекомендации по улучшению описаний действий

  1. Исправьте орфографические ошибки:
  • "выбраного" → "выбранного"
  • "преспешников" → "приспешников"
  1. Уточните описания для большей ясности:
-blob-create-factory-action-desc = Превращает выбраного нормального блоба в фабрику, которая способна производить различных преспешников блоба, если рядом есть узел или ядро.
+blob-create-factory-action-desc = Превращает выбранного нормального блоба в фабрику, которая способна производить различных приспешников блоба, если рядом есть узел или ядро.

-blob-create-storage-action-desc = Превращает выбраного нормального блоба в хранилище, которое расширяет максимальное количество ресурсов которое может иметь блоб. 
+blob-create-storage-action-desc = Превращает выбранного нормального блоба в хранилище, которое расширяет максимальное количество ресурсов, которое может иметь блоб.

-blob-create-turret-action-desc = Превращает выбраного нормального блоба в турель, которая стреляет по врагам своими мелкими спорами, расходуя очки.
+blob-create-turret-action-desc = Превращает выбранного нормального блоба в турель, которая стреляет по врагам мелкими спорами, расходуя очки.
  1. Рекомендуется добавить информацию о радиусе действия турели и стоимости выстрелов.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
blob-create-factory-action-name = Создать блоб фабрику (40)
blob-create-factory-action-desc = Превращает выбраного нормального блоба в фабрику, которая способна производить различных преспешников блоба, если рядом есть узел или ядро.
blob-create-storage-action-name = Создать блоб хранилище (50)
blob-create-storage-action-desc = Превращает выбраного нормального блоба в хранилище, которое расширяет максимальное количество ресурсов которое может иметь блоб.
blob-create-turret-action-name = Создать блоб турель (75)
blob-create-turret-action-desc = Превращает выбраного нормального блоба в турель, которая стреляет по врагам своими мелкими спорами, расходуя очки.
blob-create-factory-action-name = Создать блоб фабрику (40)
blob-create-factory-action-desc = Превращает выбранного нормального блоба в фабрику, которая способна производить различных приспешников блоба, если рядом есть узел или ядро.
blob-create-storage-action-name = Создать блоб хранилище (50)
blob-create-storage-action-desc = Превращает выбранного нормального блоба в хранилище, которое расширяет максимальное количество ресурсов, которое может иметь блоб.
blob-create-turret-action-name = Создать блоб турель (75)
blob-create-turret-action-desc = Превращает выбранного нормального блоба в турель, которая стреляет по врагам мелкими спорами, расходуя очки.

@@ -104,7 +107,7 @@
thresholds:
- trigger:
!type:DamageTrigger
damage: 400
damage: 250
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Существенное изменение баланса ядра блоба

Снижение порога урона с 400 до 250 делает ядро более уязвимым, что потребует более тщательной защиты. Добавление нового действия ActionCreateBlobStorage и обновленные затраты ресурсов вносят дополнительный уровень стратегического планирования.

Рекомендуется проверить, не является ли снижение прочности ядра слишком сильным ослаблением.

Also applies to: 136-147

@Roudenn Roudenn added Feature Я хочу добавить что-то новое. Fix Я хочу исправить то что работает не так. Require Testing Требуется тестирование! Balance Для баланса вселенной. and removed S: Untriaged labels Dec 1, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (1)
Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml (1)

200-200: Снижение прочности специализированных структур

Значительное снижение прочности:

  • Фабрика: с 120 до 80
  • Ресурсный блоб: с 90 до 80
  • Узел: с 150 до 100

Это потребует более активной защиты важных структур и может изменить метагейм.

Рекомендуется добавить систему обратной связи для отслеживания влияния этих изменений на баланс игры.

Also applies to: 238-238, 278-278

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 69a990e and 9e45c4a.

📒 Files selected for processing (1)
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml (9 hunks)
🔇 Additional comments (4)
Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml (4)

42-44: Улучшена механика развития базового блоба

Добавление возможности улучшения до Strong варианта и увеличение прочности с 25 до 40 существенно усиливает базовые блобы. Это делает начальную фазу игры более стратегической.

Also applies to: 49-49


334-367: Анализ нового оборонительного типа блоба

StrongBlobTile представляет собой мощную оборонительную структуру:

  • Имеет герметичность (компонент Airtight)
  • Может быть улучшен до Reflective варианта
  • Прочность 100 единиц

Хорошо продуманная механика с возможностью развития и защиты от атмосферных угроз.


110-110: Существенные изменения баланса ядра

Снижение прочности с 400 до 250 делает ядро более уязвимым. Однако это компенсируется:

  • Обновленными затратами ресурсов для различных типов блобов
  • Новой возможностью создания хранилищ через ActionCreateBlobStorage

Also applies to: 136-140, 147-147

✅ Verification successful

Подтверждаю изменения баланса и новую механику

Проверка подтвердила следующие изменения:

  • Снижение прочности ядра с 400 до 250 единиц
  • Добавление нового типа блоба - Storage, который расширяет максимальный лимит очков
  • Обновленная стоимость различных типов блобов:
    • Обычный: 6
    • Усиленный: 15
    • Ресурсный: 60
    • Фабрика: 80
    • Узел: 50
    • Хранилище: 50

Новая механика хранилища и обновленные затраты ресурсов компенсируют снижение прочности ядра, предоставляя больше стратегических возможностей.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования новой способности в других файлах
rg "ActionCreateBlobStorage" --type yaml

Length of output: 218


Script:

#!/bin/bash
# Проверяем детали реализации ActionCreateBlobStorage
cat Resources/Prototypes/_Backmen/Actions/blob.yml

# Проверяем другие изменения баланса блобов
cat Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml

Length of output: 15581


Line range hint 378-391: Корректировка отражающих свойств

Изменения в ReflectiveBlobTile:

  • Добавлен компонент Damageable с специфическим набором модификаторов
  • Вероятность отражения снижена с 0.6 до 0.5
  • Разброс увеличен с 20 до 40
✅ Verification successful

Изменения в балансе отражающей способности подтверждены

Анализ показывает, что изменения в ReflectiveBlobTile являются частью общего баланса:

  • Модификатор урона BlobReflective делает существо более уязвимым к физическому урону (коэффициенты ≥1.0), но при этом сохраняет устойчивость к тепловому урону (1.1)
  • Снижение вероятности отражения до 0.5 соответствует стандартным значениям для других отражающих сущностей в игре (например, кристаллы также имеют reflectProb: 0.5)
  • Увеличение разброса до 40 находится в разумных пределах (для сравнения: мечи имеют spread: 90)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка настроек модификатора урона
rg "BlobReflective" --type yaml

Length of output: 273


Script:

#!/bin/bash
# Проверим содержимое файла с модификаторами урона
cat Resources/Prototypes/_Backmen/Damage/modifier_sets.yml

Length of output: 2661


Script:

#!/bin/bash
# Поищем предыдущие значения reflect и spread
git log -p Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml | grep -A 5 "reflectProb\|spread"

Length of output: 0


Script:

#!/bin/bash
# Проверим другие сущности с компонентом Reflect
rg "type: Reflect" -A 2 --type yaml

Length of output: 8043

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (2)
Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs (2)

33-34: Необходимо документировать значение MaxStorageAmount

Добавлено ограничение на максимальное количество ресурсов для ядра блоба. Однако, не хватает документации, объясняющей выбор значения 200.

Предлагаю добавить XML-документацию:

+    /// <summary>
+    /// Максимальное количество ресурсов, которое может хранить ядро блоба.
+    /// Значение 200 выбрано для баланса игры, чтобы ограничить накопление ресурсов.
+    /// </summary>
     [ViewVariables]
     public FixedPoint2 MaxStorageAmount = 200;

52-53: Необходимо документировать значение TilesRadiusLimit

Добавлено ограничение на радиус распространения блоба. Значение 9f требует пояснения с точки зрения игрового баланса.

Предлагаю добавить XML-документацию:

+    /// <summary>
+    /// Максимальный радиус распространения блоба в тайлах.
+    /// Значение 9f ограничивает зону контроля одного ядра блоба.
+    /// </summary>
     [DataField]
     public float TilesRadiusLimit = 9f;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 9e45c4a and e9d8017.

📒 Files selected for processing (1)
  • Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs (4 hunks)
🔇 Additional comments (1)
Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs (1)

155-155: Проверьте баланс стоимости хранилища

Добавлен новый тип тайла Storage со стоимостью 50, что равно стоимости Node. Необходимо убедиться, что такой баланс оправдан с точки зрения геймплея.

Запустите следующий скрипт для анализа использования Storage тайлов:

Also applies to: 184-184

✅ Verification successful

Let me gather more information about the Node tile cost and functionality to better understand the balance comparison.


Let me search for more specific information about the Storage tile functionality.


Based on the gathered information, I can now provide a final response about the Storage tile balance:

Баланс стоимости хранилища выглядит обоснованным

Равная стоимость Storage (50) и Node (50) оправдана следующими факторами:

  • Storage увеличивает максимальный запас очков блоба на 100 единиц
  • Node является критически важным тайлом, позволяющим размещать специальные тайлы в определенном радиусе
  • Оба тайла выполняют стратегически важные, но различные функции: Node для расширения и контроля, Storage для ресурсного менеджмента
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск использования Storage тайлов в игровых системах

# Поиск использования BlobTileType.Storage
rg "BlobTileType\.Storage" -A 5

# Поиск использования StorageBlobTile
rg "StorageBlobTile" -A 5

Length of output: 4996


Script:

#!/bin/bash
# Search for Node tile related information
rg "BlobTileType\.Node" -A 5

# Search for NodeBlobTile prototype
rg "NodeBlobTile" -A 5

# Search for blob points and resource management
rg "BlobPoints" -A 5

Length of output: 7171


Script:

#!/bin/bash
# Search for Storage tile implementation and behavior
rg "BlobStorage" -A 5

# Search for storage-related systems
ast-grep --pattern 'class $_ {
  $$$
  Storage$_($$$) {
    $$$
  }
  $$$
}'

# Search for storage description in documentation
rg -g "*.xml" "storage" -A 5

Length of output: 9361

Copy link
Contributor

github-actions bot commented Dec 7, 2024

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@KayzelW KayzelW added the Derelict Про PR забыли :( label Dec 13, 2024
@whateverusername0
Copy link
Contributor

базовичок

@Roudenn Roudenn removed the Derelict Про PR забыли :( label Jan 1, 2025
@Roudenn Roudenn added the DONT MERGE Ноу, ноу, ноу, мистер, не совершайте ошибок. label Jan 1, 2025
@Roudenn Roudenn marked this pull request as draft January 1, 2025 17:27
@Roudenn Roudenn marked this pull request as ready for review January 1, 2025 19:33
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (11)
Content.Shared/Backmen/Blob/Components/BlobStorageComponent.cs (1)

1-13: Отсутствует документация компонента

Рекомендуется добавить XML-документацию для описания:

  • Назначения компонента
  • Взаимодействия с другими системами
  • Описания полей и их влияния на игровой процесс

Пример:

+/// <summary>
+/// Компонент для управления дополнительным хранилищем блоба.
+/// Позволяет увеличить максимальный объем хранилища и определяет штраф при уничтожении.
+/// </summary>
 public sealed partial class BlobStorageComponent : Component
 {
+    /// <summary>
+    /// Количество единиц хранилища, добавляемых при установке компонента.
+    /// </summary>
     [DataField]
     public FixedPoint2 AddTotalStorage = 100;

+    /// <summary>
+    /// Количество единиц хранилища, удаляемых при уничтожении компонента.
+    /// </summary>
     [DataField]
     public FixedPoint2 DeleteOnRemove = 60;
 }
Content.Server/Backmen/Blob/Systems/BlobCoreActionSystem.cs (2)

Line range hint 101-124: Улучшите обработку целевого объекта

Текущая логика проверки целевого объекта и ближайшей клетки блоба может быть упрощена:

  1. Объедините проверки валидности локации
  2. Добавьте ранний возврат при отсутствии grid компонента
-if (!location.IsValid(EntityManager))
-    return;
-
-var gridUid = _transform.GetGrid(location);
-
-if (!TryComp<MapGridComponent>(gridUid, out var grid))
-{
-    return;
-}
+var gridUid = _transform.GetGrid(location);
+if (!location.IsValid(EntityManager) || !TryComp<MapGridComponent>(gridUid, out var grid))
+    return;

147-161: Вынесите логику проверки цели в отдельный метод

Текущие условия проверки цели сложны для чтения. Рекомендуется выделить их в отдельный метод:

+private bool IsValidAttackTarget(EntityUid target)
+{
+    return TryComp<PhysicsComponent>(target, out var physicsTarget) &&
+           physicsTarget is { Hard: true, CanCollide: true } &&
+           HasComp<DestructibleComponent>(target) &&
+           !HasComp<SubFloorHideComponent>(target) &&
+           !HasComp<ItemComponent>(target) &&
+           !HasComp<BlobMobComponent>(target) &&
+           !(_tileQuery.TryComp(target, out var targetComp) && targetComp.Core != null);
+}

-if (target != null &&
-    TryComp<PhysicsComponent>(target, out var physicsTarget) &&
-    physicsTarget is { Hard: true, CanCollide: true } &&
-    HasComp<DestructibleComponent>(target) &&
-    !HasComp<SubFloorHideComponent>(target))
+if (target != null && IsValidAttackTarget(target))
Content.Server/Backmen/GameTicking/Rules/BlobRuleSystem.cs (2)

199-229: Оптимизация подсчёта прогресса всех блоб-целей
Текущий расчёт суммарного totalPercentage выглядит корректным. Однако, если впоследствии потребуется детальный анализ (например, чтобы расширить шкалу очков или учитывать разные типы целей), может быть полезным вынести логику подсчёта в отдельный метод. Это упростит поддержку и тестирование.


276-293: Уточнение группировки целей
Использование GroupBy(o => Comp<ObjectiveComponent>(o).Issuer == BlobIssuer) логично и позволяет разделять цели блоба от других. При расширении логики целей может возникнуть необходимость группировать по нескольким критериям (например, по типу цели). Рекомендуется предусмотреть более гибкую систему фильтрации, если в будущем функциональность станет шире.

Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs (1)

52-54: Проверить баланс радиуса распространения

Значение TilesRadiusLimit = 9f может существенно влиять на игровой баланс. Необходимо убедиться, что это значение:

  • Не позволяет блобу слишком быстро распространяться
  • Сбалансировано относительно размеров игровых карт
  • Учитывает механики противодействия блобу

Рекомендую добавить комментарий, объясняющий выбор значения 9f и его влияние на игровой баланс.

Resources/Locale/en-US/blob/blob.ftl (2)

20-20: Уточнить контекст использования сообщения
Данная строка сообщает игроку, что ядро блоба атакуется. Возможно, стоит добавить больше деталей для игрока о том, как реагировать, чтобы уточнить игровой процесс (например, "Защитите ядро от атакующих, иначе оно будет уничтожено").


123-125: Уточнение при отображении целей
Данные строки расширяют выведение целей и имени блоба. Попробуйте добавить более выраженный визуальный или цветовой маркер для целей, чтобы игроки быстрее понимали конечную задачу.

Resources/Prototypes/_Backmen/Damage/modifier_sets.yml (1)

86-91: BlobMob: баланс между уроном от огня и прочими типами
Heat = 1.50 означает, что моб-блоб получает больше урона от огня, чем от других типов урона. Проверьте в игровых тестах, не делает ли это моб слишком уязвимым на практике, учитывая метовые тактики и наличие легкодоступных источников огня.

Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs (2)

64-70: Удаление плитки из списка
При удалении плитки из списка BlobTiles рекомендуется удостовериться, что она действительно в этом списке. Если плитка по какой-то причине уже отсутствует в коллекции, попытка повторного удаления может быть незаметной, но потенциально стоит логировать или отслеживать подобные случаи.


84-168: Разделить громоздкий метод
Метод OnPulsed содержит сложную логику по обработке многих условий (поиск ближайших узлов, перебор соседних плиток, проверка анкерованных сущностей и т.д.). Рассмотрите возможность вынести некоторые куски логики (например, работу с innerTiles или проверку на генерацию новых плиток) в отдельные методы, чтобы улучшить читаемость и упростить дальнейшую поддержку.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between af428cf and d852d54.

📒 Files selected for processing (11)
  • Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs (1 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobCoreActionSystem.cs (7 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs (16 hunks)
  • Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs (1 hunks)
  • Content.Server/Backmen/GameTicking/Rules/BlobRuleSystem.cs (2 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs (4 hunks)
  • Content.Shared/Backmen/Blob/Components/BlobStorageComponent.cs (1 hunks)
  • Resources/Locale/en-US/blob/blob.ftl (2 hunks)
  • Resources/Locale/ru-RU/backmen/blob/blob.ftl (4 hunks)
  • Resources/Prototypes/_Backmen/Damage/modifier_sets.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • Resources/Locale/ru-RU/backmen/blob/blob.ftl
  • Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs
🔇 Additional comments (23)
Content.Shared/Backmen/Blob/Components/BlobStorageComponent.cs (2)

5-7: Компонент корректно зарегистрирован и структурирован

Правильное использование атрибута [RegisterComponent] и наследование от базового класса Component. Модификаторы sealed и partial соответствуют лучшим практикам.


9-9: Проверить баланс значений хранилища

Текущие значения (100 для добавления и 60 для удаления) кажутся произвольными. Необходимо убедиться, что эти значения сбалансированы и соответствуют игровому дизайну.

Рекомендуется:

  1. Проверить влияние на общий баланс игры
  2. Рассмотреть возможность вынесения значений в конфигурационные файлы
  3. Добавить комментарии, объясняющие выбор конкретных значений

Also applies to: 12-12

Content.Server/Backmen/Blob/Systems/BlobCoreActionSystem.cs (2)

16-17: Структурные изменения одобрены!

Перемещение в пространство имен Systems и добавление импортов для работы с мобами улучшает организацию кода.

Also applies to: 33-33


285-285: Улучшение отслеживания взрывов одобрено!

Добавление параметра user в вызов QueueExplosion улучшает возможности логирования и отслеживания источника взрывов.

Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs (1)

78-78: Убедитесь, что параметр user задан корректно
Похоже, что при взрыве в качестве user используется тот же uid, который уничтожается. Проверьте, действительно ли правильно указывать взрывающийся объект как инициатора взрыва, и не требуется ли здесь отдельный идентификатор игрока или внешнего источника.

Content.Server/Backmen/GameTicking/Rules/BlobRuleSystem.cs (1)

190-191: Константа для идентификации целей блоба
Добавление константы BlobIssuer упрощает проверку и фильтрацию целей, выданных блобу. Это повышает читаемость кода и помогает избежать «магических строк».

Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml (5)

42-44: Добавлен новый компонент улучшения для обычного блоба

Новый компонент BlobUpgradeableTile добавляет возможность эволюции обычного блоба в усиленную версию, что расширяет тактические возможности игрока.


136-147: Пересмотр баланса стоимости и добавление хранилища

Внесены существенные изменения в экономику блоба:

  1. Добавлен новый тип тайла storage со стоимостью 50 очков
  2. Скорректирована стоимость других тайлов
  3. Добавлено новое действие ActionCreateBlobStorage

Рекомендуется протестировать новый баланс стоимости для предотвращения возможных эксплойтов.


336-367: Анализ механики усиленного блоба

Новый тип StrongBlobTile добавляет интересную защитную механику:

  1. Герметичность (компонент Airtight)
  2. Повышенная прочность (150)
  3. Возможность улучшения до отражающего типа

Механика хорошо продумана и предоставляет тактические возможности для защиты от атмосферных угроз.


368-405: Существенное изменение баланса отражающего блоба

Изменения в механике отражения:

  1. Вероятность отражения снижена с 90% до 50%
  2. Разброс увеличен с 20 до 40

Рекомендуется проверить, не является ли снижение вероятности отражения слишком сильным ослаблением, особенно учитывая высокую стоимость улучшения.


110-110: Глобальный пересмотр прочности структур блоба

Значительные изменения в прочности структур:

  1. Ядро усилено (500 ↑)
  2. Фабрика ослаблена (80 ↓)
  3. Ресурсный тайл ослаблен (80 ↓)
  4. Узел ослаблен (100 ↓)

Необходимо тщательное тестирование нового баланса, особенно:

  1. Выживаемость производственных структур
  2. Эффективность защиты ядра
  3. Общий темп развития блоба

Also applies to: 200-200, 238-238, 278-278

✅ Verification successful

Изменения баланса структур блоба подтверждены и обоснованы

Анализ кодовой базы показывает, что изменения прочности структур блоба являются частью комплексного баланса:

  • Усиление ядра (500 ↑) компенсируется общим ослаблением производственных структур
  • Снижение прочности фабрик и ресурсных тайлов до 80 создает уязвимые точки для контратаки
  • Ослабление узлов до 100 требует более продуманного размещения и защиты

Система BlobCoreSystem.cs подтверждает, что эти значения интегрированы в общую механику игры и соответствуют текущему балансу урона.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Анализ использования значений прочности в других файлах
echo "Поиск упоминаний старых значений прочности..."
rg -l "damage: (400|120|90|150)" --type yaml

echo "Поиск связанных систем урона..."
rg -l "BlobDamage|BlobHealth" --type cs

Length of output: 4014


Script:

#!/bin/bash
# Проверим содержимое файла BlobCoreSystem.cs для анализа логики урона
echo "=== Анализ системы урона блоба ==="
cat Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs

# Поищем конкретные значения урона в файле блоба
echo -e "\n=== Поиск конкретных значений урона в файле блоба ==="
rg "damage: (500|80|100)" Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_tiles.yml -C 2

# Проверим, есть ли другие файлы с настройками блоба
echo -e "\n=== Поиск других файлов, связанных с блобом ==="
fd blob

Length of output: 33942

Content.Shared/Backmen/Blob/Components/BlobCoreComponent.cs (2)

33-34: Добавлено ограничение хранилища блоба

Новое свойство MaxStorageAmount устанавливает начальное ограничение хранилища в 500 единиц. Это значение может потребовать балансировки в зависимости от игрового процесса.

Предлагаю проверить, как это значение влияет на игровой баланс:

✅ Verification successful

Let me verify how the MaxStorageAmount is used in the storage system by checking the BlobStorageComponent.


Let me try to find the BlobStorageComponent with a different pattern.


Значение MaxStorageAmount сбалансировано с системой хранилища

Проверка показала, что значение MaxStorageAmount = 500 корректно взаимодействует с компонентом BlobStorageComponent, который добавляет по 100 единиц хранилища за каждый тайл хранения. Система BlobStorageSystem правильно управляет этими значениями:

  • Увеличивает общее хранилище при создании тайлов хранения
  • Уменьшает при их удалении
  • Контролирует баланс в BlobCoreSystem
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск использования MaxStorageAmount в других системах
rg "MaxStorageAmount" -A 3

Length of output: 1656


Script:

#!/bin/bash
# Поиск компонента хранилища и его свойств
ast-grep --pattern 'class BlobStorageComponent'

Length of output: 65639


Script:

#!/bin/bash
# Поиск компонента хранилища и его свойств
rg "class BlobStorageComponent" -A 5

Length of output: 558


155-155: Проверить конфигурацию хранилища

Добавление типа Storage в BlobTileCosts и TilePrototypes логично дополняет механику хранилища:

  • Стоимость 50 аналогична Node
  • Прототип StorageBlobTile добавлен последовательно

Однако стоит проверить:

Also applies to: 184-184

✅ Verification successful

Let me gather more information about the storage implementation.


Based on the code analysis, I can now provide a final response about the storage configuration:

Конфигурация хранилища реализована корректно

Анализ показывает, что механика хранилища полностью реализована:

  • Компонент BlobStorageComponent увеличивает максимальное хранилище ядра блоба
  • При уничтожении хранилища, его бонус корректно удаляется из ядра
  • Стоимость в 50 очков сбалансирована с другими улучшениями
  • Прототип StorageBlobTile содержит необходимые компоненты
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск реализации StorageBlobTile
rg "StorageBlobTile" -A 5

# Поиск связанных систем хранилища
ast-grep --pattern 'class $_ : ISystem
{
  $$$
  Storage$_($$$)
  $$$
}'

Length of output: 1285


Script:

#!/bin/bash
# Поиск компонентов и систем хранилища блоба
rg "Storage.*Blob" -A 5

# Поиск использования BlobTileType.Storage
ast-grep --pattern 'BlobTileType.Storage'

# Поиск файлов с реализацией логики хранилища
fd blob -e cs -X cat {}

Length of output: 68125

Resources/Locale/en-US/blob/blob.ftl (1)

116-120: Единый блок для оповещений об успехе или неудаче
Новые строки позволяют игрокам узнать, прошли ли они игру как блобы или какую долю карты успели захватить. Тексты выглядят цельными и понятными, однако можно рассмотреть возможность более детального описания последствий, особенно при незаконченных процентах.

Resources/Prototypes/_Backmen/Damage/modifier_sets.yml (2)

80-83: Проверка сбалансированности урона BaseBlob
Коэффициент Heat = 3.00 указывает на повышенную уязвимость к теплу. Учитывая, что blob должен уметь сопротивляться огню, стоит убедиться, что эти значения не делают геймплей слишком дисбалансированным.


102-107: BlobReflective: возможное несоответствие между описанием и коэффициентами
Описание указывает на защиту от лазеров и уязвимость к ближнему бою, однако текущее значение Heat = 0.80 лишь слегка уменьшает урон от тепла, что может перекрывать часть логики «Против лазеров» и не совпадает с предыдущим комментарием, где предлагалось уменьшить этот коэффициент ещё сильнее.

Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs (7)

25-33: Оптимальный ввод зависимостей
Все Dependency-поля корректно инжектируются. Дополнительных замечаний нет.


51-62: Уточнить логику фракций
При вызове метода _npcFactionSystem.ClearFactions и последующем добавлении фракции "Blob" стоит проверить, не было ли у сущности других важных фракций, которые могут требоваться.


72-82: EMP-импульс при разрушении
Активация EMP при текущем химическом типе ElectromagneticWeb выглядит корректно. Обратите внимание на радиусы и параметры, чтобы убедиться, что импульс не заденет объекты, которые не должны страдать от взлома.


176-179: Возможный риск при добавлении ключей в словарь
Текущий вызов healCore.DamageDict.Add(keyValuePair.Key, keyValuePair.Value * 2); может вызвать исключение ArgumentException, если ключ уже присутствует. Вместо Add рекомендуется использовать оператор индексатора:

- healCore.DamageDict.Add(keyValuePair.Key, keyValuePair.Value * 2);
+ healCore.DamageDict[keyValuePair.Key] = keyValuePair.Value * 2;

196-205: Обмен параметрами между узлами
Метод SwapSpecials выглядит логичным и аккуратно переносит соответствующие свойства. Будьте внимательны с одновременным использованием этих узлов в других системах, чтобы избежать непредвиденных состояний.


206-216: Проверка на пустую специальную плитку
Метод IsEmptySpecial наглядно демонстрирует, когда та или иная разновидность BlobTile фактически неактивна (null или находится в процессе удаления). Структура switch хорошо упрощает проверку.


218-229: Логика атаки (Lunge)
Метод DoLunge корректно рассчитывает локальные координаты и отправляет сеть-событие о нападении на нужной дистанции. Это важная часть боевой механики блоба. Все выглядит хорошо.

Comment on lines +8 to +12
[DataField]
public FixedPoint2 AddTotalStorage = 100;

[DataField]
public FixedPoint2 DeleteOnRemove = 60;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Необходима валидация значений хранилища

Текущая реализация не имеет проверок на отрицательные значения или другие ограничения. Рекомендуется:

  1. Добавить атрибуты для определения допустимых диапазонов значений
  2. Реализовать валидацию при установке значений

Пример улучшения:

 [DataField]
+[ViewVariables(VVAccess.ReadWrite)]
+[DataField("addTotalStorage", required: true)]
 public FixedPoint2 AddTotalStorage = 100;

 [DataField]
+[ViewVariables(VVAccess.ReadWrite)]
+[DataField("deleteOnRemove", required: true)]
 public FixedPoint2 DeleteOnRemove = 60;

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +51 to 53
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly BlobTileSystem _blobTileSystem = default!;
//[Dependency] private readonly GridFixtureSystem _gridFixture = default!;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Удалите закомментированную зависимость

Закомментированная зависимость GridFixtureSystem и связанный с ней неработающий код (строки 176-227) должны быть полностью удалены, так как они не используются.

Comment on lines +296 to +331
id: StorageBlobTile
name: Storage Blob
description: Stores blob points in itself, expanding the maximum amount of points that the blob can have.
categories: [ HideSpawnMenu ]
components:
- type: Airtight
- type: Temperature
heatDamage:
types:
Heat: 5
coldDamage: {}
coldDamageThreshold: 0
- type: Flammable
fireSpread: true
damage:
types:
Heat: 1
- type: BlobTile
blobTileType: Strong
blobTileType: Storage
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 150
damage: 80
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: BlobStorage
- type: Sprite
sprite: Backmen/Mobs/Aliens/Blob/blob.rsi
drawdepth: BlobTiles
layers:
- map: [ "enum.DamageStateVisualLayers.Base" ]
state: blob_shield
state: blob_special
- map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ]
state: blob_glow
state: blob_glow_special
- state: blob_storage_overlay
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Анализ механики хранилища блоба

Новый тип тайла StorageBlobTile имеет несколько потенциальных проблем:

  1. Прочность 80 единиц кажется низкой для критически важной структуры
  2. В описании отсутствует конкретная информация о максимальной ёмкости хранилища
  3. Нет указания на штраф при уничтожении хранилища

Рекомендации:

  1. Увеличить прочность до уровня узла (100)
  2. Дополнить описание деталями о ёмкости и штрафах

Comment on lines +94 to +99
id: BlobStrong # Strong against melee and weak against lasers.
coefficients:
Blunt: 0.5
Slash: 0.5
Piercing: 0.5
Heat: 1.5
Blunt: 0.40
Slash: 0.40
Piercing: 0.30
Heat: 2.00
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

BlobStrong: корректность комментариев и фактических коэффициентов
Подпись говорит, что блоб "сильный против ближнего боя," однако Heat = 2.00 может означать заметную слабость к теплу при столкновении с огнём или лазерами. Возможно, нуждаются в балансировке, чтобы соответствовать описанию "weak against lasers" и не стать слишком уязвимым к стандартным огнемётам или оружию с тепловым уроном.

@Roudenn Roudenn removed the DONT MERGE Ноу, ноу, ноу, мистер, не совершайте ошибок. label Jan 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Balance Для баланса вселенной. Changes: Localization Can be reviewed or fixed by people who are knowledgeable with translation Changes: Sprites Should be reviewed or fixed by people who are knowledgeable with spriting or visual design. Feature Я хочу добавить что-то новое. Fix Я хочу исправить то что работает не так. Require Testing Требуется тестирование! size/L
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants