Files
Continentis/Assets/Scripts/MainGame/Commands/Cmd_DiscardCards.cs

83 lines
3.2 KiB
C#
Raw Normal View History

2025-10-03 00:02:43 -04:00
using System;
using System.Collections.Generic;
using System.Linq;
2026-03-20 11:56:50 -04:00
using Cysharp.Threading.Tasks;
2025-10-03 00:02:43 -04:00
using Continentis.MainGame.Card;
using Continentis.MainGame.Character;
using DG.Tweening;
2025-10-23 00:49:44 -04:00
using SLSFramework.General;
2025-10-03 00:02:43 -04:00
using UnityEngine;
using Random = UnityEngine.Random;
namespace Continentis.MainGame.Commands
{
public class Cmd_DiscardCards : CommandBase
{
private readonly DeckSubmodule deck;
private readonly List<CardInstance> cardsToDiscard;
2025-10-31 10:02:30 -04:00
private readonly bool isInitiative;
2026-03-20 11:56:50 -04:00
private float interval;
private const float SingleCardAnimationDuration = 0.5f;
2025-10-31 10:02:30 -04:00
public Cmd_DiscardCards(DeckSubmodule deck, List<CardInstance> cards, bool isInitiative, float interval)
2025-10-03 00:02:43 -04:00
{
this.deck = deck;
this.cardsToDiscard = cards;
2025-10-31 10:02:30 -04:00
this.isInitiative = isInitiative;
2025-10-03 00:02:43 -04:00
this.interval = interval;
}
2026-03-20 11:56:50 -04:00
protected override async UniTask ExecuteAsync(CommandContext outerContext)
2025-10-03 00:02:43 -04:00
{
2026-03-20 11:56:50 -04:00
if (cardsToDiscard == null || cardsToDiscard.Count == 0) return;
2025-10-03 00:02:43 -04:00
if (interval <= 0f)
{
2026-03-20 11:56:50 -04:00
await UniTask.WhenAll(cardsToDiscard.Select(card => DiscardCardAsync(card)));
2025-10-03 00:02:43 -04:00
}
else
{
2026-03-20 11:56:50 -04:00
var tasks = new UniTask[cardsToDiscard.Count];
for (int i = 0; i < cardsToDiscard.Count; i++)
{
CardInstance captured = cardsToDiscard[i];
tasks[i] = DiscardCardWithDelayAsync(captured, i * interval);
}
await UniTask.WhenAll(tasks);
2025-10-03 00:02:43 -04:00
}
}
2026-03-20 11:56:50 -04:00
private async UniTask DiscardCardWithDelayAsync(CardInstance card, float delay)
2025-10-03 00:02:43 -04:00
{
2026-03-20 11:56:50 -04:00
if (delay > 0f)
await UniTask.Delay(TimeSpan.FromSeconds(delay));
await DiscardCardAsync(card);
}
private async UniTask DiscardCardAsync(CardInstance card)
{
if (isInitiative && card.eventSubmodule.onInitiativeDiscard.GetChecks().Any())
2025-10-31 10:02:30 -04:00
{
2026-03-20 11:56:50 -04:00
CommandQueueManager.Instance.AddCommand(Cmd.Do(() =>
card.eventSubmodule.onInitiativeDiscard.GetEffects().ForEach(effect => effect.Invoke())));
return;
2025-10-31 10:02:30 -04:00
}
2026-03-20 11:56:50 -04:00
2025-10-31 10:02:30 -04:00
deck.TransferCard(deck.Pile(card.cardLocation.pileName), deck.DiscardPile, card);
2025-10-23 00:49:44 -04:00
card.handCardView.TransferCardView(CombatUIManager.Instance.combatMainPage.discardPile);
2026-03-20 11:56:50 -04:00
2025-10-03 00:02:43 -04:00
RectTransform cardTransform = card.handCardView.cardTransform;
2026-03-20 11:56:50 -04:00
Vector3 deltaMove = Vector3.zero - cardTransform.localPosition;
Vector3 randomLift = new Vector3(Random.Range(-200f, 200f), Random.Range(200f, 600f), 0f);
2025-10-03 00:02:43 -04:00
2026-03-20 11:56:50 -04:00
cardTransform.DOBlendableLocalMoveBy(deltaMove, SingleCardAnimationDuration).Play();
cardTransform.DOBlendableLocalMoveBy(randomLift, SingleCardAnimationDuration * 0.5f)
.SetLoops(2, LoopType.Yoyo).Play();
cardTransform.DOLocalRotate(new Vector3(0f, 0f, 720f), SingleCardAnimationDuration, RotateMode.FastBeyond360).Play();
cardTransform.DOScale(Vector3.zero, SingleCardAnimationDuration).SetEase(Ease.Linear).Play();
2025-10-03 00:02:43 -04:00
2026-03-20 11:56:50 -04:00
await UniTask.Delay(TimeSpan.FromSeconds(SingleCardAnimationDuration));
}
2025-10-03 00:02:43 -04:00
}
}