-
Notifications
You must be signed in to change notification settings - Fork 149
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
base: master
Are you sure you want to change the base?
[Tweak] Blob Things #963
Conversation
WalkthroughВ данном пулл-реквесте внесены значительные изменения в систему блобов, включая добавление и удаление классов и компонентов, а также изменения в их методах и свойствах. Основные изменения касаются управления блобами, их взаимодействия и обновления логики, связанной с захватом, хранением и улучшением блобов. Также произошло реорганизация пространств имен для улучшения структуры кода. В результате, новые функции и улучшения были добавлены, в то время как некоторые устаревшие элементы были удалены. Changes
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? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this 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" указывает на незавершенную реализацию. Рекомендуется:
- Добавить XML-документацию с описанием допустимых значений
- Заменить значение по умолчанию на более подходящее
+ /// <summary> + /// Идентификатор локализации для отображения информации об улучшении. + /// </summary> [DataField] public LocId Locale = "error";
1-11
: Рекомендуется добавить валидацию данныхКомпонент не содержит проверок входных данных. Рекомендуется добавить:
- Валидацию при установке значений
- Обработку ошибок для некорректных значений
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
могут потребовать балансировки в будущем. Рекомендуется:
- Добавить проверку на отрицательные значения
- Вынести значения в конфигурационный файл
[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
требуют пояснения их назначения и влияния на игровой процесс. Рекомендуется:
- Добавить XML-документацию
- Добавить проверку валидности прототипов при инициализации
Предлагаемые изменения:
[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
и очков блоба. Рекомендуется:
- Добавить блокировки для критических секций
- Использовать атомарные операции для изменения числовых значений
- Документировать требования к потокобезопасности
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
⛔ 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, планируется полная перебалансировка числовых значений в будущем.
Рекомендуется:
- Вынести значение 0.2 в константу уровня конфигурации
- Добавить комментарий, объясняющий логику выбора данного значения
44-45
:
Подтвердите изменение урона от 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
:
Необходимо пересмотреть коэффициенты урона для 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 может существенно повлиять на баланс игры и производительность. Рекомендуется:
- Проверить влияние на производительность при большом количестве узлов
- Убедиться, что это изменение соответствует планируемому ребалансу
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 требуют проверки баланса относительно других типов блоба.
Рекомендую:
- Добавить комментарии к каждому типу блоба, объясняющие их роль и стоимость
- Рассмотреть создание отдельного конфигурационного файла для значений баланса
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 урона
При этом добавлены новые стратегические элементы:
- Система улучшений блобов
- Хранилище ресурсов
- Улучшенные защитные структуры
Рекомендуется:
- Создать отдельный файл конфигурации для балансных значений
- Добавить систему тестирования баланса
- Документировать причины изменения каждого значения
if (!TryComp<BlobObserverComponent>(args.Mind.OwnedEntity, out var blobObserverComponent) | ||
|| !HasComp<BlobCoreComponent>(blobObserverComponent.Core)) | ||
{ | ||
args.Cancelled = true; | ||
return; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Потенциальная ошибка 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.
if (!TryComp<BlobObserverComponent>(args.Mind.OwnedEntity, out var blobObserverComponent) | ||
|| !TryComp<BlobCoreComponent>(blobObserverComponent.Core, out var blobCoreComponent)) | ||
{ | ||
args.Progress = 0; | ||
return; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Потенциальная ошибка 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.
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))); | ||
} |
There was a problem hiding this comment.
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
foreach (var keyValuePair in ent.Comp.HealthOfPulse.DamageDict) | ||
{ | ||
healCore.DamageDict.Add(keyValuePair.Key, keyValuePair.Value * 2); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Возможное исключение при добавлении дублирующихся ключей в 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.
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; | |
} | |
} |
_popup.PopupEntity(Loc.GetString("blob-get-resource", ("point", points)), | ||
uid, | ||
blobCoreComponent.Observer.Value, | ||
PopupType.LargeGreen); | ||
|
||
_blobCoreSystem.ChangeBlobPoint(blobTileComponent.Core.Value, points); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо исправить порядок операций и добавить обработку ошибок!
Текущая реализация имеет несколько проблем:
- Уведомление показывается до фактического изменения очков
- Отсутствует проверка успешности операции
- Нет обработки ошибок
Предлагаемые изменения:
- _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);
+ }
- 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Несоответствие между названием и механикой BlobReflective
Обнаружено противоречие:
- Комментарий указывает на защиту против лазеров
- Название подразумевает отражение
- Коэффициент теплового урона (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.
- 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, |
There was a problem hiding this comment.
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
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 = Превращает выбраного нормального блоба в турель, которая стреляет по врагам своими мелкими спорами, расходуя очки. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Рекомендации по улучшению описаний действий
- Исправьте орфографические ошибки:
- "выбраного" → "выбранного"
- "преспешников" → "приспешников"
- Уточните описания для большей ясности:
-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 = Превращает выбранного нормального блоба в турель, которая стреляет по врагам мелкими спорами, расходуя очки.
- Рекомендуется добавить информацию о радиусе действия турели и стоимости выстрелов.
📝 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.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Существенное изменение баланса ядра блоба
Снижение порога урона с 400 до 250 делает ядро более уязвимым, что потребует более тщательной защиты. Добавление нового действия ActionCreateBlobStorage
и обновленные затраты ресурсов вносят дополнительный уровень стратегического планирования.
Рекомендуется проверить, не является ли снижение прочности ядра слишком сильным ослаблением.
Also applies to: 136-147
There was a problem hiding this 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
📒 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
There was a problem hiding this 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
📒 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
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
базовичок |
There was a problem hiding this 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
: Улучшите обработку целевого объектаТекущая логика проверки целевого объекта и ближайшей клетки блоба может быть упрощена:
- Объедините проверки валидности локации
- Добавьте ранний возврат при отсутствии 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
📒 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 для удаления) кажутся произвольными. Необходимо убедиться, что эти значения сбалансированы и соответствуют игровому дизайну.
Рекомендуется:
- Проверить влияние на общий баланс игры
- Рассмотреть возможность вынесения значений в конфигурационные файлы
- Добавить комментарии, объясняющие выбор конкретных значений
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
: Пересмотр баланса стоимости и добавление хранилища
Внесены существенные изменения в экономику блоба:
- Добавлен новый тип тайла
storage
со стоимостью 50 очков - Скорректирована стоимость других тайлов
- Добавлено новое действие
ActionCreateBlobStorage
Рекомендуется протестировать новый баланс стоимости для предотвращения возможных эксплойтов.
336-367
: Анализ механики усиленного блоба
Новый тип StrongBlobTile
добавляет интересную защитную механику:
- Герметичность (компонент Airtight)
- Повышенная прочность (150)
- Возможность улучшения до отражающего типа
Механика хорошо продумана и предоставляет тактические возможности для защиты от атмосферных угроз.
368-405
: Существенное изменение баланса отражающего блоба
Изменения в механике отражения:
- Вероятность отражения снижена с 90% до 50%
- Разброс увеличен с 20 до 40
Рекомендуется проверить, не является ли снижение вероятности отражения слишком сильным ослаблением, особенно учитывая высокую стоимость улучшения.
110-110
: Глобальный пересмотр прочности структур блоба
Значительные изменения в прочности структур:
- Ядро усилено (500 ↑)
- Фабрика ослаблена (80 ↓)
- Ресурсный тайл ослаблен (80 ↓)
- Узел ослаблен (100 ↓)
Необходимо тщательное тестирование нового баланса, особенно:
- Выживаемость производственных структур
- Эффективность защиты ядра
- Общий темп развития блоба
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
корректно рассчитывает локальные координаты и отправляет сеть-событие о нападении на нужной дистанции. Это важная часть боевой механики блоба. Все выглядит хорошо.
[DataField] | ||
public FixedPoint2 AddTotalStorage = 100; | ||
|
||
[DataField] | ||
public FixedPoint2 DeleteOnRemove = 60; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Необходима валидация значений хранилища
Текущая реализация не имеет проверок на отрицательные значения или другие ограничения. Рекомендуется:
- Добавить атрибуты для определения допустимых диапазонов значений
- Реализовать валидацию при установке значений
Пример улучшения:
[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.
[Dependency] private readonly EntityLookupSystem _lookup = default!; | ||
[Dependency] private readonly BlobTileSystem _blobTileSystem = default!; | ||
//[Dependency] private readonly GridFixtureSystem _gridFixture = default!; |
There was a problem hiding this comment.
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) должны быть полностью удалены, так как они не используются.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Анализ механики хранилища блоба
Новый тип тайла StorageBlobTile
имеет несколько потенциальных проблем:
- Прочность 80 единиц кажется низкой для критически важной структуры
- В описании отсутствует конкретная информация о максимальной ёмкости хранилища
- Нет указания на штраф при уничтожении хранилища
Рекомендации:
- Увеличить прочность до уровня узла (100)
- Дополнить описание деталями о ёмкости и штрафах
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
BlobStrong: корректность комментариев и фактических коэффициентов
Подпись говорит, что блоб "сильный против ближнего боя," однако Heat = 2.00 может означать заметную слабость к теплу при столкновении с огнём или лазерами. Возможно, нуждаются в балансировке, чтобы соответствовать описанию "weak against lasers" и не стать слишком уязвимым к стандартным огнемётам или оружию с тепловым уроном.
Данный ПР в очередной раз меняет некоторую логику блоба, реорганизует положение компонентов и добавляет новый контент, в том числе и Хранилище Блоба.
Основные изменения:
Баланс:
TODO:
🆑 Roudenn
Summary by CodeRabbit
Новые функции
Исправления
Изменения в интерфейсе