using System; using System.Collections.Generic; using Continentis.MainGame.Card; using Continentis.MainGame.Character; using DG.Tweening; using SLSFramework.General; 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; } protected override IObservable OnExecute(CommandContext outerContext) { 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 MoveCardToDrawPile(CardInstance card) { deck.TransferCard(deck.DiscardPile, deck.DrawPile, card); //card.cardLogic.eventSubmodule.onInitiativeDiscard.Invoke(); card.handCardView.TransferCardView(CombatUIManager.Instance.combatMainPage.drawPile); 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(); } } }