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;
}
}