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

64 lines
2.4 KiB
C#
Raw Normal View History

2025-10-03 00:02:43 -04:00
using System;
using System.Collections.Generic;
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 UniRx;
using UnityEngine;
using Random = UnityEngine.Random;
namespace Continentis.MainGame.Commands
{
public class Cmd_ReshuffleDeck : CommandBase
{
private readonly DeckSubmodule deck;
private readonly float interval;
private readonly float singleCardAnimationDuration = 0.5f; // 单张卡牌的动画时长
public Cmd_ReshuffleDeck(DeckSubmodule deck, float interval)
{
this.deck = deck;
this.interval = interval;
}
2025-10-23 00:49:44 -04:00
protected override IObservable<Unit> OnExecute(CommandContext outerContext)
2025-10-03 00:02:43 -04:00
{
var cardStream = deck.DiscardPile.ToObservable();
var timerStream = Observable.Interval(TimeSpan.FromSeconds(interval));
return timerStream
.Zip(cardStream, (_, card) => card)
.Select(card => MoveCardToDrawPile(card))
.Merge()
.Last()
.Do(_ => deck.DrawPile.Shuffle())
.AsUnitObservable();
}
private IObservable<Unit> MoveCardToDrawPile(CardInstance card)
{
deck.TransferCard(deck.DiscardPile, deck.DrawPile, card);
card.cardLogic.eventSubmodule.onDiscard.Invoke();
2025-10-23 00:49:44 -04:00
card.handCardView.TransferCardView(CombatUIManager.Instance.combatMainPage.drawPile);
2025-10-03 00:02:43 -04:00
Vector3 deltaMove = Vector3.zero - card.handCardView.cardTransform.localPosition;
Vector3 randomLift = new Vector3(Random.Range(-200f, 200f), Random.Range(200f, 600f), 0);
card.handCardView.cardOrb.gameObject.SetActive(true);
card.handCardView.cardTransform.DOBlendableLocalMoveBy(deltaMove, singleCardAnimationDuration)
.OnComplete(() =>
{
card.handCardView.cardOrb.gameObject.SetActive(false);
}).Play();
card.handCardView.cardTransform.DOBlendableLocalMoveBy(randomLift, singleCardAnimationDuration * 0.5f).SetLoops(2, LoopType.Yoyo).Play();
card.handCardView.cardTransform.DOScale(Vector3.zero, singleCardAnimationDuration).Play();
return Observable.Timer(TimeSpan.FromSeconds(singleCardAnimationDuration)).AsUnitObservable();
}
}
}