using Content.Client._Sunrise.BloodCult;
using Content.Shared._Sunrise.Abilities.Milira;
using Content.Shared._Sunrise.Mood;
using Robust.Client.GameObjects;
using Robust.Shared.Utility;
namespace Content.Client._Sunrise.Mood;
///
/// Обрабатывает отображение эффектов настроения на сущностях с компонентом настроения.
///
public sealed class MoodVisualizerSystem : VisualizerSystem
{
[Dependency] private readonly SpriteSystem _spriteSystem = default!;
[Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnComponentInit);
SubscribeLocalEvent(OnShutdown);
}
private void OnShutdown(Entity ent, ref ComponentShutdown args)
{
if (!TryComp(ent.Owner, out var sprite))
return;
if (_spriteSystem.LayerMapTryGet((ent.Owner, sprite), MoodVisualLayers.Mood, out var layer, false))
_spriteSystem.RemoveLayer((ent.Owner, sprite), layer);
}
private void OnComponentInit(Entity ent, ref ComponentInit args)
{
if (!TryComp(ent.Owner, out var sprite))
return;
_spriteSystem.LayerMapReserve((ent.Owner, sprite), MoodVisualLayers.Mood);
_spriteSystem.LayerSetVisible((ent.Owner, sprite), MoodVisualLayers.Mood, false);
sprite.LayerSetShader(MoodVisualLayers.Mood, "unshaded");
if (ent.Comp.Sprite != null)
_spriteSystem.LayerSetSprite((ent.Owner, sprite), MoodVisualLayers.Mood, ent.Comp.Sprite);
if (TryComp(ent.Owner, out var appearance))
UpdateAppearance(ent, sprite, appearance);
}
protected override void OnAppearanceChange(EntityUid uid, MoodVisualsComponent component, ref AppearanceChangeEvent args)
{
if (args.Sprite != null)
UpdateAppearance((uid, component), args.Sprite, args.Component);
}
private bool ShouldHideMoodVisuals(Entity ent)
{
return HasComp(ent) && HasComp(ent);
}
private void UpdateAppearance(Entity ent, SpriteComponent sprite, AppearanceComponent appearance)
{
if (!_spriteSystem.LayerMapTryGet((ent, sprite), MoodVisualLayers.Mood, out var index, false))
return;
if (ShouldHideMoodVisuals(ent))
{
_spriteSystem.LayerSetVisible((ent, sprite), index, false);
return;
}
if (!_appearanceSystem.TryGetData(ent.Owner, MoodVisuals.CurrentMoodThreshold, out var moodThreshold, appearance))
{
_spriteSystem.LayerSetVisible((ent.Owner, sprite), index, false);
return;
}
// Проверяем, есть ли состояние спрайта для этого порога настроения
if (!ent.Comp.MoodStates.TryGetValue(moodThreshold, out var state))
{
_spriteSystem.LayerSetVisible((ent.Owner, sprite), index, false);
return;
}
// Показываем слой спрайта и устанавливаем состояние
_spriteSystem.LayerSetVisible((ent.Owner, sprite), index, true);
_spriteSystem.LayerSetRsiState((ent.Owner, sprite), index, state);
}
}
public enum MoodVisualLayers : byte
{
Mood
}