From 8cddc4ce78514a2b7874743fc8b11b90f39bb86a Mon Sep 17 00:00:00 2001 From: Daniela Date: Sun, 7 Jul 2024 10:12:06 -0300 Subject: [PATCH] Makes Card Hand sprite change dynamically --- Content.Client/Content.Client.csproj | 1 - .../Cards/Deck/CardDeckSystem.cs | 12 +- .../Cards/Hand/CardHandSystem.cs | 110 ++++++++++++++++++ .../Cards/Hand/CardHandComponent.cs | 11 ++ 4 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs diff --git a/Content.Client/Content.Client.csproj b/Content.Client/Content.Client.csproj index 14cad1847ecb5e..956f2fd0351a98 100644 --- a/Content.Client/Content.Client.csproj +++ b/Content.Client/Content.Client.csproj @@ -25,7 +25,6 @@ - diff --git a/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs b/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs index ebf50180fa0a03..f9f4bcd35df795 100644 --- a/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs +++ b/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs @@ -58,11 +58,6 @@ public override void Update(float frameTime) } - private void OnComponentStartupEvent(EntityUid uid, CardDeckComponent comp, ComponentStartup args) - { - - UpdateSprite(uid, comp); - } // This is executed only if there are no available layers to work with private static void SetupSpriteLayers(EntityUid _, CardDeckComponent comp, SpriteComponent sprite, int layersQuantity) @@ -169,6 +164,12 @@ private void OnAppearanceChanged(EntityUid uid, CardDeckComponent comp, Appearan { UpdateSprite(uid, comp); } + private void OnComponentStartupEvent(EntityUid uid, CardDeckComponent comp, ComponentStartup args) + { + + UpdateSprite(uid, comp); + } + private void OnStackStart(CardStackInitiatedEvent args) { @@ -178,4 +179,5 @@ private void OnStackStart(CardStackInitiatedEvent args) UpdateSprite(entity, comp); } + } diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs b/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs new file mode 100644 index 00000000000000..25a4890937bb00 --- /dev/null +++ b/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs @@ -0,0 +1,110 @@ +using System.Linq; +using System.Numerics; +using Content.Shared._EstacaoPirata.Cards.Deck; +using Content.Shared._EstacaoPirata.Cards.Hand; +using Content.Shared._EstacaoPirata.Cards.Stack; +using Robust.Client.GameObjects; + +namespace Content.Client._EstacaoPirata.Cards.Hand; + +/// +/// This handles... +/// +public sealed class CardHandSystem : EntitySystem +{ + /// + public override void Initialize() + { + SubscribeLocalEvent(OnComponentStartupEvent); + SubscribeNetworkEvent(OnStackStart); + SubscribeNetworkEvent(OnStackUpdate); + } + + private void UpdateSprite(EntityUid uid, CardHandComponent comp) + { + if (!TryComp(uid, out SpriteComponent? sprite)) + return; + + if (!TryComp(uid, out CardStackComponent? cardStack)) + return; + + var cardCount = Math.Min(cardStack.Cards.Count, comp.CardLimit); + + //inserts Missing Layers + if (sprite.AllLayers.Count() < cardCount) + { + if (!sprite.TryGetLayer(0, out var firstLayer)) + return; + for (var i = sprite.AllLayers.Count(); i < cardCount; i++) + { + sprite.AddLayer(firstLayer.State, i); + } + } + //Removes extra layers + else if (sprite.AllLayers.Count() > cardCount) + { + for (var i = cardCount; i < sprite.AllLayers.Count(); i++) + { + sprite.RemoveLayer(i); + } + } + + var j = 0; + var intervalAngle = comp.Angle / (cardCount-1); + var intervalSize = comp.XOffset / (cardCount - 1); + foreach (var card in cardStack.Cards) + { + if (!TryGetCardLayer(card, out var layer) || layer == null) + return; + + var angle = (-(comp.Angle/2)) + j * intervalAngle; + var x = (-(comp.XOffset / 2)) + j * intervalSize; + var y = -(x * x) + 0.10f; + + sprite.LayerSetVisible(0, true); + sprite.LayerSetTexture(j, layer.Texture); + sprite.LayerSetState(j, layer.State); + sprite.LayerSetRotation(j, Angle.FromDegrees(-angle)); + sprite.LayerSetOffset(j, new Vector2(x, y)); + sprite.LayerSetScale(j, new Vector2(comp.Scale, comp.Scale)); + j++; + } + } + + private bool TryGetCardLayer(EntityUid card, out SpriteComponent.Layer? layer) + { + layer = null; + if (!TryComp(card, out SpriteComponent? cardSprite)) + return false; + + if (!cardSprite.TryGetLayer(0, out var l)) + return false; + + layer = l; + 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) + { + + UpdateSprite(uid, comp); + } + + +} diff --git a/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs index d13be28356b62b..668f4a1e80d3e7 100644 --- a/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs +++ b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs @@ -8,6 +8,17 @@ namespace Content.Shared._EstacaoPirata.Cards.Hand; [RegisterComponent] public sealed partial class CardHandComponent : Component { + [DataField("angle")] + public float Angle = 120f; + + [DataField("xOffset")] + public float XOffset = 0.5f; + + [DataField("scale")] + public float Scale = 1; + + [DataField("limit")] + public int CardLimit = 10; }