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

87 lines
3.1 KiB
C#
Raw Normal View History

2025-10-30 23:31:29 -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-30 23:31:29 -04:00
using Continentis.MainGame.Card;
using Continentis.MainGame.Character;
using DG.Tweening;
using SLSFramework.General;
using UnityEngine;
using Random = UnityEngine.Random;
namespace Continentis.MainGame.Commands
{
public class Cmd_UsePowerCards : CommandBase
{
2026-03-20 11:56:50 -04:00
private readonly bool isPlayer;
2025-10-30 23:31:29 -04:00
private readonly DeckSubmodule deck;
private readonly List<CardInstance> cardsToUse;
private readonly float interval;
2026-03-20 11:56:50 -04:00
private const float SingleCardAnimationDuration = 0.5f;
2025-10-30 23:31:29 -04:00
public Cmd_UsePowerCards(bool isPlayer, DeckSubmodule deck, List<CardInstance> cards, float interval)
{
this.isPlayer = isPlayer;
this.deck = deck;
this.cardsToUse = cards;
this.interval = interval;
}
2026-03-20 11:56:50 -04:00
protected override async UniTask ExecuteAsync(CommandContext outerContext)
2025-10-30 23:31:29 -04:00
{
2026-03-20 11:56:50 -04:00
if (cardsToUse == null || cardsToUse.Count == 0) return;
2025-10-30 23:31:29 -04:00
if (interval <= 0f)
{
2026-03-20 11:56:50 -04:00
await UniTask.WhenAll(cardsToUse.Select(card => UsePowerCardAsync(card)));
2025-10-30 23:31:29 -04:00
}
else
{
2026-03-20 11:56:50 -04:00
var tasks = new UniTask[cardsToUse.Count];
for (int i = 0; i < cardsToUse.Count; i++)
{
CardInstance captured = cardsToUse[i];
tasks[i] = UsePowerCardWithDelayAsync(captured, i * interval);
}
await UniTask.WhenAll(tasks);
2025-10-30 23:31:29 -04:00
}
}
2026-03-20 11:56:50 -04:00
private async UniTask UsePowerCardWithDelayAsync(CardInstance card, float delay)
{
if (delay > 0f)
await UniTask.Delay(TimeSpan.FromSeconds(delay));
await UsePowerCardAsync(card);
}
private async UniTask UsePowerCardAsync(CardInstance card)
{
if (isPlayer)
await PlayerUsePowerAsync(card);
else
await NpcUsePowerAsync(card);
}
private async UniTask PlayerUsePowerAsync(CardInstance card)
2025-10-30 23:31:29 -04:00
{
deck.TransferCard(deck.Pile(card.cardLocation.pileName), deck.GravePile, card);
card.handCardView.TransferCardView(CombatUIManager.Instance.combatMainPage.gravePile);
2026-03-20 11:56:50 -04:00
2025-10-30 23:31:29 -04:00
RectTransform cardTransform = card.handCardView.cardTransform;
2025-11-15 12:17:34 -05:00
Vector2 userViewPosition = card.user.characterView.hudContainer.GetComponent<RectTransform>().position;
2025-10-30 23:31:29 -04:00
2026-03-20 11:56:50 -04:00
cardTransform.DOMove(userViewPosition, SingleCardAnimationDuration).SetEase(Ease.Linear).Play();
cardTransform.DOScale(Vector3.zero, SingleCardAnimationDuration).SetEase(Ease.Linear)
.OnComplete(() => cardTransform.anchoredPosition = Vector2.zero).Play();
await UniTask.Delay(TimeSpan.FromSeconds(SingleCardAnimationDuration));
2025-10-30 23:31:29 -04:00
}
2026-03-20 11:56:50 -04:00
private async UniTask NpcUsePowerAsync(CardInstance card)
2025-10-30 23:31:29 -04:00
{
deck.TransferCard(deck.Pile(card.cardLocation.pileName), deck.GravePile, card);
2026-03-20 11:56:50 -04:00
await UniTask.Delay(TimeSpan.FromSeconds(SingleCardAnimationDuration));
2025-10-30 23:31:29 -04:00
}
}
}