public override void OnEndTurn(EndTurnMessage msg)
    {
        base.OnEndTurn(msg);

        if (msg.isRecipientTheActivePlayer)
        {
            gameUI.SetEndTurnButtonEnabled(false);

            foreach (var card in playerBoardCards)
            {
                card.OnEndTurn();
            }

            if (currentCreature != null)
            {
                playerBoardCards.Remove(currentCreature);
                RearrangeBottomBoard();

                playerInfo.namedZones["Hand"].AddCard(currentCreature.card);
                playerInfo.namedZones["Board"].RemoveCard(currentCreature.card);

                Destroy(currentCreature.gameObject);
                currentCreature = null;
            }

            if (currentSpellCard != null)
            {
                Destroy(currentSpellCard.GetComponent <BoardSpell>());
                currentSpellCard = null;
                RearrangeHand();
            }
        }

        gameUI.StopCountdown();
    }
 public override void OnCardUnselected(BoardCreature creature)
 {
     if (selectedCard == creature)
     {
         Destroy(target);
         selectedCard = null;
     }
 }
 public override void OnCardUnselected(BoardCreature creature)
 {
     if (selectedCard != null && selectedCard == creature)
     {
         Destroy(target);
         selectedCard        = null;
         validTargetSelected = false;
         targetInfo.Clear();
     }
 }
    public void End(BoardCreature creature)
    {
        if (!startedDrag)
        {
            return;
        }

        startedDrag = false;

        creature.ResolveCombat();
        Destroy(gameObject);
    }
 public override void OnCardSelected(BoardCreature creature)
 {
     if (targetType == EffectTarget.AnyPlayerOrCreature ||
         targetType == EffectTarget.TargetCard ||
         (targetType == EffectTarget.PlayerOrPlayerCreature && creature.tag == "PlayerOwned") ||
         (targetType == EffectTarget.OpponentOrOpponentCreature && creature.tag == "OpponentOwned") ||
         (targetType == EffectTarget.PlayerCard && creature.tag == "PlayerOwned") ||
         (targetType == EffectTarget.OpponentCard && creature.tag == "OpponentOwned"))
     {
         var opponentHasProvoke = OpponentBoardContainsProvokingCreatures();
         if (!opponentHasProvoke || (opponentHasProvoke && creature.card.HasKeyword("Provoke")))
         {
             selectedCard   = creature;
             selectedPlayer = null;
             CreateTarget(creature.transform.position);
         }
     }
 }
 public override void OnCardSelected(BoardCreature creature)
 {
     if (targetType == EffectTarget.AnyPlayerOrCreature ||
         targetType == EffectTarget.TargetCard ||
         (targetType == EffectTarget.PlayerOrPlayerCreature && creature.tag == "PlayerOwned") ||
         (targetType == EffectTarget.OpponentOrOpponentCreature && creature.tag == "OpponentOwned") ||
         (targetType == EffectTarget.PlayerCard && creature.tag == "PlayerOwned") ||
         (targetType == EffectTarget.OpponentCard && creature.tag == "OpponentOwned"))
     {
         var conditionsFullfilled = true;
         var cardTarget           = effectTarget as CardTargetBase;
         foreach (var condition in cardTarget.conditions)
         {
             if (!condition.IsTrue(creature.card))
             {
                 conditionsFullfilled = false;
                 break;
             }
         }
         if (conditionsFullfilled)
         {
             validTargetSelected = true;
             selectedCard        = creature;
             selectedPlayer      = null;
             targetInfo.Clear();
             targetInfo.Add(2);
             targetInfo.Add(creature.card.instanceId);
             CreateTarget(creature.transform.position);
         }
         else
         {
             validTargetSelected = false;
         }
     }
     else
     {
         validTargetSelected = false;
     }
 }
    public void PlayCard(CardView card)
    {
        if (card.CanBePlayed(this))
        {
            gameUI.endTurnButton.SetEnabled(false);

            var gameConfig  = GameManager.Instance.config;
            var libraryCard = gameConfig.GetCard(card.card.cardId);
            var cardType    = gameConfig.cardTypes.Find(x => x.id == libraryCard.cardTypeId);
            if (cardType.name == "Creature")
            {
                var boardCreature = Instantiate(boardCreaturePrefab);

                var board = GameObject.Find("PlayerBoard");
                boardCreature.tag = "PlayerOwned";
                boardCreature.transform.parent   = board.transform;
                boardCreature.transform.position = new Vector2(1.9f * playerBoardCards.Count, 0);
                boardCreature.GetComponent <BoardCreature>().ownerPlayer = this;
                boardCreature.GetComponent <BoardCreature>().PopulateWithInfo(card.card);

                playerHandCards.Remove(card);
                RearrangeHand();
                playerBoardCards.Add(boardCreature.GetComponent <BoardCreature>());

                Destroy(card.gameObject);

                currentCreature = boardCreature.GetComponent <BoardCreature>();

                RearrangeBottomBoard(() =>
                {
                    var triggeredAbilities             = libraryCard.abilities.FindAll(x => x is TriggeredAbility);
                    TriggeredAbility targetableAbility = null;
                    foreach (var ability in triggeredAbilities)
                    {
                        var triggeredAbility = ability as TriggeredAbility;
                        var trigger          = triggeredAbility.trigger as OnCardEnteredZoneTrigger;
                        if (trigger != null && trigger.zoneId == boardZone.zoneId && triggeredAbility.target is IUserTarget)
                        {
                            targetableAbility = triggeredAbility;
                            break;
                        }
                    }

                    // Preemptively move the card so that the effect solver can properly check the availability of targets
                    // by also taking into account this card (that is trying to be played).
                    playerInfo.namedZones["Hand"].RemoveCard(card.card);
                    playerInfo.namedZones["Board"].AddCard(card.card);

                    if (targetableAbility != null && effectSolver.AreTargetsAvailable(targetableAbility.effect, card.card, targetableAbility.target))
                    {
                        var targetingArrow = Instantiate(spellTargetingArrowPrefab).GetComponent <SpellTargetingArrow>();
                        boardCreature.GetComponent <BoardCreature>().abilitiesTargetingArrow = targetingArrow;
                        targetingArrow.effectTarget      = targetableAbility.target;
                        targetingArrow.targetType        = targetableAbility.target.GetTarget();
                        targetingArrow.onTargetSelected += () =>
                        {
                            PlayCreatureCard(card.card, targetingArrow.targetInfo);
                            effectSolver.MoveCard(netId, card.card, "Hand", "Board", targetingArrow.targetInfo);
                            currentCreature = null;
                            gameUI.endTurnButton.SetEnabled(true);
                        };
                        targetingArrow.Begin(boardCreature.transform.localPosition);
                    }
                    else
                    {
                        PlayCreatureCard(card.card);
                        effectSolver.MoveCard(netId, card.card, "Hand", "Board");
                        currentCreature = null;
                        gameUI.endTurnButton.SetEnabled(true);
                    }
                    boardCreature.GetComponent <BoardCreature>().fightTargetingArrowPrefab = fightTargetingArrowPrefab;
                });
            }
            else if (cardType.name == "Spell")
            {
                var spellsPivot = GameObject.Find("PlayerSpellsPivot");
                var sequence    = DOTween.Sequence();
                sequence.Append(card.transform.DOMove(spellsPivot.transform.position, 0.5f));
                sequence.Insert(0, card.transform.DORotate(Vector3.zero, 0.2f));
                sequence.Play().OnComplete(() =>
                {
                    card.GetComponent <SortingGroup>().sortingLayerName = "BoardCards";
                    card.GetComponent <SortingGroup>().sortingOrder     = 1000;

                    var boardSpell = card.gameObject.AddComponent <BoardSpell>();

                    var triggeredAbilities             = libraryCard.abilities.FindAll(x => x is TriggeredAbility);
                    TriggeredAbility targetableAbility = null;
                    foreach (var ability in triggeredAbilities)
                    {
                        var triggeredAbility = ability as TriggeredAbility;
                        var trigger          = triggeredAbility.trigger as OnCardEnteredZoneTrigger;
                        if (trigger != null && trigger.zoneId == boardZone.zoneId && triggeredAbility.target is IUserTarget)
                        {
                            targetableAbility = triggeredAbility;
                            break;
                        }
                    }

                    currentSpellCard = card;

                    if (targetableAbility != null && effectSolver.AreTargetsAvailable(targetableAbility.effect, card.card, targetableAbility.target))
                    {
                        var targetingArrow               = Instantiate(spellTargetingArrowPrefab).GetComponent <SpellTargetingArrow>();
                        boardSpell.targetingArrow        = targetingArrow;
                        targetingArrow.effectTarget      = targetableAbility.target;
                        targetingArrow.targetType        = targetableAbility.target.GetTarget();
                        targetingArrow.onTargetSelected += () =>
                        {
                            PlaySpellCard(card.card, targetingArrow.targetInfo);
                            effectSolver.MoveCard(netId, card.card, "Hand", "Board", targetingArrow.targetInfo);
                            currentSpellCard = null;
                            gameUI.endTurnButton.SetEnabled(true);
                        };
                        targetingArrow.Begin(boardSpell.transform.localPosition);
                    }
                    else
                    {
                        PlaySpellCard(card.card);
                        effectSolver.MoveCard(netId, card.card, "Hand", "Board");
                        currentSpellCard = null;
                        gameUI.endTurnButton.SetEnabled(true);
                    }
                });
            }
        }
        else
        {
            card.GetComponent <HandCard>().ResetToInitialPosition();
        }
    }
 public virtual void OnCardUnselected(BoardCreature creature)
 {
 }