using Content.Client.PDA; using Content.Shared._Sunrise.PDA; using Content.Shared.PDA; using Robust.Client.GameObjects; using PdaVisualLayers = Content.Client.PDA.PdaVisualizerSystem.PdaVisualLayers; namespace Content.Client._Sunrise.PDA; /// /// Система для обработки переключения между статичным и анимированным состояниями PDA /// в зависимости от наличия ID карты. /// Конфигурация задаётся через компонент в прототипах. /// // VisualizerSystem автоматически подписывается на AppearanceChangeEvent и предоставляет // готовые зависимости (AppearanceSystem, SpriteSystem) public sealed class PdaAnimationVisualsSystem : VisualizerSystem { protected override void OnAppearanceChange(EntityUid uid, PdaAnimationVisualsComponent comp, ref AppearanceChangeEvent args) { if (args.Sprite == null) return; if (!AppearanceSystem.TryGetData(uid, PdaVisuals.IdCardInserted, out var isCardInserted, args.Component)) return; var sprite = new Entity(uid, args.Sprite); if (isCardInserted) { ApplyAnimatedState(sprite, comp); return; } ApplyStaticState(sprite, comp); } /// /// Применяет анимированное состояние PDA с включённой анимацией. /// private void ApplyAnimatedState(Entity sprite, PdaAnimationVisualsComponent comp) { SpriteSystem.LayerSetRsiState(sprite.AsNullable(), PdaVisualLayers.Base, comp.AnimatedState); SpriteSystem.LayerSetAutoAnimated(sprite.AsNullable(), PdaVisualLayers.Base, true); SpriteSystem.LayerSetRsiState(sprite.AsNullable(), PdaVisualLayers.IdLight, comp.IdInsertedLayerState); SpriteSystem.LayerSetVisible(sprite.AsNullable(), PdaVisualLayers.IdLight, true); } /// /// Применяет статичное состояние PDA. Если StaticState не указан, /// использует первый кадр анимации с остановленной анимацией. /// private void ApplyStaticState(Entity sprite, PdaAnimationVisualsComponent comp) { ApplyStaticBaseState(sprite, comp); SpriteSystem.LayerSetVisible(sprite.AsNullable(), PdaVisualLayers.IdLight, false); } /// /// Применяет статичный base state. Если StaticState указан - использует его, /// иначе использует первый кадр AnimatedState с остановленной анимацией. /// private void ApplyStaticBaseState(Entity sprite, PdaAnimationVisualsComponent comp) { var stateName = GetStaticStateName(comp); SpriteSystem.LayerSetRsiState(sprite.AsNullable(), PdaVisualLayers.Base, stateName); SpriteSystem.LayerSetAutoAnimated(sprite.AsNullable(), PdaVisualLayers.Base, false); } /// /// Возвращает имя state для статичного отображения. /// Если StaticState не указан, возвращает AnimatedState для использования первого кадра. /// private static string GetStaticStateName(PdaAnimationVisualsComponent comp) { return comp.StaticState ?? comp.AnimatedState; } }