64 lines
2.4 KiB
C#
64 lines
2.4 KiB
C#
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<Unit> 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<Unit> MoveCardToDrawPile(CardInstance card)
|
|
{
|
|
deck.TransferCard(deck.DiscardPile, deck.DrawPile, card);
|
|
card.cardLogic.eventSubmodule.onDiscard.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();
|
|
}
|
|
|
|
}
|
|
} |