6
2025-08-05 10:00:54 +03:00

168 lines
5.5 KiB
C#

using System.Linq;
using System.Numerics;
using Content.Shared._EstacaoPirata.Cards.Hand;
using Content.Shared._EstacaoPirata.Cards.Stack;
using Robust.Client.GameObjects;
namespace Content.Client._EstacaoPirata.Cards.Hand;
/// <summary>
/// This handles...
/// </summary>
public sealed class CardHandSystem : EntitySystem
{
private readonly Dictionary<Entity<CardHandComponent>, int> _notInit = [];
[Dependency] private readonly CardSpriteSystem _cardSpriteSystem = default!;
/// <inheritdoc/>
public override void Initialize()
{
SubscribeLocalEvent<CardHandComponent, ComponentStartup>(OnComponentStartupEvent);
SubscribeNetworkEvent<CardStackInitiatedEvent>(OnStackStart);
SubscribeNetworkEvent<CardStackQuantityChangeEvent>(OnStackUpdate);
SubscribeNetworkEvent<CardStackReorderedEvent>(OnStackReorder);
SubscribeNetworkEvent<CardStackFlippedEvent>(OnStackFlip);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
foreach (var (ent, value) in _notInit)
{
if (value >= 5)
{
_notInit.Remove(ent);
continue;
}
_notInit[ent] = value + 1;
if (!TryComp(ent.Owner, out CardStackComponent? stack) || stack.Cards.Count <= 0)
continue;
// If cards were correctly initialized, we update the sprite
UpdateSprite(ent.Owner, ent.Comp);
_notInit.Remove(ent);
}
}
private bool TryGetCardLayer(EntityUid card, out SpriteComponent.Layer? layer)
{
layer = null;
if (!TryComp(card, out SpriteComponent? cardSprite)
|| !cardSprite.TryGetLayer(0, out var l))
return false;
layer = l;
return true;
}
private void UpdateSprite(EntityUid uid, CardHandComponent comp)
{
if (!TryComp(uid, out SpriteComponent? sprite)
|| !TryComp(uid, out CardStackComponent? cardStack))
return;
// Prevents error appearing at spawnMenu
if (cardStack.Cards.Count <= 0 || !TryGetCardLayer(cardStack.Cards.Last(), out var cardlayer) ||
cardlayer == null)
{
_notInit[(uid, comp)] = 0;
return;
}
_cardSpriteSystem.TryAdjustLayerQuantity((uid, sprite, cardStack), comp.CardLimit);
var cardCount = Math.Min(cardStack.Cards.Count, comp.CardLimit);
// Frontier: zero/one card case
if (cardCount <= 0)
{
// Placeholder - we need to have a valid sprite.
sprite.LayerSetVisible(0, true);
sprite.LayerSetState(0, "singlecard_down_black");
sprite.LayerSetOffset(0, new Vector2(0f, 0f));
sprite.LayerSetScale(0, new Vector2(1f, 1f));
}
else if (cardCount == 1)
{
_cardSpriteSystem.TryHandleLayerConfiguration(
(uid, sprite, cardStack),
cardCount,
(sprt, cardIndex, layerIndex) =>
{
sprt.Comp.LayerSetRotation(layerIndex, Angle.FromDegrees(0));
sprt.Comp.LayerSetOffset(layerIndex, new Vector2(0, 0.10f));
sprt.Comp.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale));
return true;
}
);
}
else
{
var intervalAngle = comp.Angle / (cardCount - 1);
var intervalSize = comp.XOffset / (cardCount - 1);
_cardSpriteSystem.TryHandleLayerConfiguration(
(uid, sprite, cardStack),
cardCount,
(sprt, cardIndex, layerIndex) =>
{
var angle = (-(comp.Angle / 2)) + cardIndex * intervalAngle;
var x = (-(comp.XOffset / 2)) + cardIndex * intervalSize;
var y = -(x * x) + 0.10f;
sprt.Comp.LayerSetRotation(layerIndex, Angle.FromDegrees(-angle));
sprt.Comp.LayerSetOffset(layerIndex, new Vector2(x, y));
sprt.Comp.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale));
return true;
}
);
}
}
private void OnStackUpdate(CardStackQuantityChangeEvent args)
{
if (!TryComp(GetEntity(args.Stack), out CardHandComponent? comp))
return;
UpdateSprite(GetEntity(args.Stack), comp);
}
private void OnStackStart(CardStackInitiatedEvent args)
{
var entity = GetEntity(args.CardStack);
if (!TryComp(entity, out CardHandComponent? comp))
return;
UpdateSprite(entity, comp);
}
private void OnComponentStartupEvent(EntityUid uid, CardHandComponent comp, ComponentStartup args)
{
if (!TryComp(uid, out CardStackComponent? stack))
{
_notInit[(uid, comp)] = 0;
return;
}
if (stack.Cards.Count <= 0)
_notInit[(uid, comp)] = 0;
UpdateSprite(uid, comp);
}
// Frontier
private void OnStackReorder(CardStackReorderedEvent args)
{
if (!TryComp(GetEntity(args.Stack), out CardHandComponent? comp))
return;
UpdateSprite(GetEntity(args.Stack), comp);
}
private void OnStackFlip(CardStackFlippedEvent args)
{
var entity = GetEntity(args.CardStack);
if (!TryComp(entity, out CardHandComponent? comp))
return;
UpdateSprite(entity, comp);
}
}