예제 #1
0
    public void ReShuffle(int[] unShuffleData, Action onFinished)
    {
        var shuffleAnimationWaiter = new FinishableGroupWaiter(onFinished);
        var reShuffledCards        = new CardController[unShuffleData.Length];

        for (int i = 0, iMax = unShuffleData.Length; i < iMax; ++i)
        {
            CardController lastCard = reShuffledCards[i] = _Cards[unShuffleData[i]];

            lastCard.ViewFSM.SetTextVisibility(true);

            AnimateShuffle(lastCard, i);

            shuffleAnimationWaiter.AddFinishable(lastCard.Holder);
        }

        if (_shuffleAnimationCamera != null && _shuffleAnimationOriginPoint != null)
        {
            shuffleAnimationWaiter.AddFinishable(
                _shuffleAnimationCamera.AddPositionPingPongTween(_shuffleAnimationCamera.transform.position + Vector3.up * _CardAnimationData.CameraShuffleTweenUpAmount)
                .SetDuration(_CardAnimationData.DeckShuffleExplosionDuration));
        }

        _Cards.Clear();
        _Cards.AddRange(reShuffledCards);
        shuffleAnimationWaiter.Ready = true;

        if (CardFlipAudio != null)
        {
            CardFlipAudio.PlayOneShot(_cardShuffleClip);
            StartCoroutine(PlayCardRuffleClip());
        }
    }
    private void SetCardStates(Action onFinished = null)
    {
        FinishableGroupWaiter cardStateTransitionWaiter = null;

        if (onFinished != null)
        {
            cardStateTransitionWaiter = new FinishableGroupWaiter(onFinished);
        }
        for (int i = 0, iMax = Hand.ReadOnlyCards.Count; i < iMax; ++i)
        {
            TweenHolder transitionTweenHolder;
            if (_selectedCardIndexes.Contains(i))
            {
                transitionTweenHolder = Hand.ReadOnlyCards[i].ViewFSM.SetAnimState(CardController.CardViewFSM.AnimState.SELECTED);
            }
            else if (_allowedCardIndexes.Contains(i) && _selectedCardIndexes.IsEmpty())
            {
                transitionTweenHolder = Hand.ReadOnlyCards[i].ViewFSM.SetAnimState(CardController.CardViewFSM.AnimState.ABLE_TO_BE_SELECTED);
            }
            else
            {
                transitionTweenHolder = Hand.ReadOnlyCards[i].ViewFSM.SetAnimState(CardController.CardViewFSM.AnimState.VISIBLE);
            }
            cardStateTransitionWaiter.IfIsNotNullThen(c => c.AddFinishable(transitionTweenHolder));
        }
        _submitCardsButton.SetActive(_allowedCardIndexes.Count <= 0 || (!Hand.ReadOnlyCards.Exists(c => c.Button.IsBeingDragged) &&
                                                                        (_MainGameModtroller.OptionalPlayRule || !_selectedCardIndexes.IsEmpty())));
        cardStateTransitionWaiter.IfIsNotNullThen(c => c.Ready = true);
    }
예제 #3
0
    public void SetCardsAnimStates(CardController.CardViewFSM.AnimState newState, Action onFinished)
    {
        _cardsAnimState = newState;
        var animGroupWaiter = new FinishableGroupWaiter(onFinished);

        for (int i = 0, iMax = _Cards.Count; i < iMax; ++i)
        {
            animGroupWaiter.AddFinishable(_Cards[i].ViewFSM.SetAnimState(newState));
        }
        animGroupWaiter.Ready = true;
    }
예제 #4
0
    private IEnumerator RefillInternal(CardHolder otherHolder, int numCardsToFill, Action onFinished)
    {
        var deckRefillTweenWaiter = new FinishableGroupWaiter(onFinished);

        for (int i = 0; i < numCardsToFill; ++i)
        {
            TweenHolder refillTween;
            MoveCard(ReadOnlyCards.LastIndex(), otherHolder, out refillTween, true, 0);
            deckRefillTweenWaiter.AddFinishable(refillTween);
            refillTween.SetDuration(_CardAnimationData.DeckFillDurationPerCard);
            yield return(new WaitForSeconds(_CardAnimationData.DeckRefillDelayPerCard));
        }
        deckRefillTweenWaiter.Ready = true;
    }
예제 #5
0
 private IEnumerator RefillWithInternal(CardHolder otherHolder, int numCardsToLeave, Action onFinished)
 {
     if (numCardsToLeave < otherHolder.ReadOnlyCards.Count)
     {
         var deckRefillTweenWaiter = new FinishableGroupWaiter(onFinished);
         while (otherHolder.ReadOnlyCards.Count > numCardsToLeave)
         {
             TweenHolder refillTween;
             otherHolder.MoveCard(0, this, out refillTween, true);
             deckRefillTweenWaiter.AddFinishable(refillTween);
             refillTween.SetDuration(_CardAnimationData.DeckFillDurationPerCard);
             yield return(new WaitForSeconds(_CardAnimationData.DeckRefillDelayPerCard));
         }
         deckRefillTweenWaiter.Ready = true;
     }
     else
     {
         onFinished();
     }
 }
예제 #6
0
    public void Shuffle(out int[] unShuffleData, Action onFinished)
    {
        var cardsToShuffleFrom = new List <CardController>(_Cards);
        var cardsToShuffleTo   = new List <CardController>(_Cards.Count);

        unShuffleData = new int[_Cards.Count];
        var shuffleAnimationWaiter = new FinishableGroupWaiter(onFinished);

        for (int i = 0; cardsToShuffleFrom.Count > 0; ++i)
        {
            int index = Mathf.RoundToInt(UnityEngine.Random.value * (cardsToShuffleFrom.Count - 1));
            cardsToShuffleTo.Add(cardsToShuffleFrom[index]);
            cardsToShuffleFrom.RemoveAt(index);
            unShuffleData[i] = _Cards.IndexOf(cardsToShuffleTo.Last());

            CardController lastCard = cardsToShuffleTo.Last();

            lastCard.ViewFSM.SetTextVisibility(true);

            AnimateShuffle(lastCard, i);

            shuffleAnimationWaiter.AddFinishable(lastCard.Holder);
        }

        if (ShuffleAnimationCamera != null && _shuffleAnimationOriginPoint != null)
        {
            shuffleAnimationWaiter.AddFinishable(
                _shuffleAnimationCamera.AddPositionPingPongTween(_shuffleAnimationCamera.transform.position + Vector3.up * _CardAnimationData.CameraShuffleTweenUpAmount)
                .SetDuration(_CardAnimationData.DeckShuffleExplosionDuration));
        }

        _Cards.Clear();
        _Cards.AddRange(cardsToShuffleTo);
        shuffleAnimationWaiter.Ready = true;

        if (CardFlipAudio != null)
        {
            CardFlipAudio.PlayOneShot(_cardShuffleClip);
            StartCoroutine(PlayCardRuffleClip());
        }
    }
        public IEnumerator RedoPlayerTurn(Action onFinished)
        {
            TurnCommandBundle bundle = _redoStack.Pop();
            var animationWaiter      = new FinishableGroupWaiter(onFinished);

            for (LinkedListNode <Command> node = bundle.First; node != null; node = node.Next)
            {
                if (node.Value is IFinishable)
                {
                    bool isTweenedCommand = node.Value is TweenedCommand;
                    if (isTweenedCommand)
                    {
                        node.Value.Redo();
                    }
                    else
                    {
                        yield return(new WaitUntil(() => animationWaiter.NumFinishableToWaitFor <= 0));
                    }
                    animationWaiter.AddFinishable((IFinishable)node.Value);
                    if (isTweenedCommand)
                    {
                        yield return(new WaitForSeconds(_cardAnimationData.UndoTurnDelay));
                    }
                    else
                    {
                        bool finished = false;
                        ((IFinishable)node.Value).AddToOnFinished(() => finished = true);
                        node.Value.Redo();
                        yield return(new WaitUntil(() => finished == true));
                    }
                }
                else
                {
                    node.Value.Redo();
                }
            }
            _undoStack.Push(bundle);
            animationWaiter.Ready = true;
        }