Ejemplo n.º 1
0
    protected virtual void OnMoveCard(NetworkMessage netMsg)
    {
        var msg = netMsg.ReadMessage <MoveCardMessage>();

        if (msg != null)
        {
            // Only the current player can summon cards.
            if (netMsg.conn.connectionId != server.gameState.currentPlayer.connectionId)
            {
                return;
            }

            var player          = server.gameState.players.Find(x => x.netId == msg.playerNetId);
            var originZone      = player.zones[msg.originZoneId];
            var destinationZone = player.zones[msg.destinationZoneId];

            var card = originZone.cards.Find(x => x.instanceId == msg.cardInstanceId);
            if (card != null)
            {
                var gameConfig  = GameManager.Instance.config;
                var libraryCard = gameConfig.GetCard(card.cardId);
                var cost        = libraryCard.costs.Find(x => x is PayResourceCost);
                if (cost != null)
                {
                    var payResourceCost = cost as PayResourceCost;
                    player.stats[payResourceCost.statId].baseValue -= payResourceCost.value;
                }

                var cardMovedMsg = new CardMovedMessage();
                cardMovedMsg.playerNetId       = msg.playerNetId;
                cardMovedMsg.card              = NetworkingUtils.GetNetCard(card);
                cardMovedMsg.originZoneId      = originZone.zoneId;
                cardMovedMsg.destinationZoneId = destinationZone.zoneId;
                cardMovedMsg.targetInfo        = msg.targetInfo;
                server.SafeSendToClient(server.gameState.currentOpponent, NetworkProtocol.CardMoved, cardMovedMsg);

                server.effectSolver.MoveCard(player.netId, card, originZone.name, destinationZone.name, new List <int>(msg.targetInfo));
            }
        }
    }
Ejemplo n.º 2
0
    public override void OnCardMoved(CardMovedMessage msg)
    {
        base.OnCardMoved(msg);

        var gameConfig  = GameManager.Instance.config;
        var libraryCard = gameConfig.GetCard(msg.card.cardId);
        var cardType    = gameConfig.cardTypes.Find(x => x.id == libraryCard.cardTypeId);

        var randomIndex = UnityEngine.Random.Range(0, opponentHandCards.Count);
        var randomCard  = opponentHandCards[randomIndex];

        opponentHandCards.Remove(randomCard);
        Destroy(randomCard);
        RearrangeOpponentHand();
        gameUI.SetOpponentHandCards(opponentHandCards.Count);

        if (cardType.name == "Creature")
        {
            var opponentBoard = opponentInfo.namedZones["Board"];
            effectSolver.SetDestroyConditions(opponentBoard.cards[opponentBoard.cards.Count - 1]);
            effectSolver.SetTriggers(opponentBoard.cards[opponentBoard.cards.Count - 1]);
            var boardCreature = Instantiate(boardCreaturePrefab);
            boardCreature.tag = "OpponentOwned";
            boardCreature.GetComponent <BoardCreature>().PopulateWithInfo(opponentBoard.cards[opponentBoard.cards.Count - 1]);
            boardCreature.transform.parent = GameObject.Find("OpponentBoard").transform;
            opponentBoardCards.Add(boardCreature.GetComponent <BoardCreature>());
            RearrangeTopBoard(() =>
            {
                opponentHandZone.numCards -= 1;

                var cost = libraryCard.costs.Find(x => x is PayResourceCost);
                if (cost != null)
                {
                    var payResourceCost         = cost as PayResourceCost;
                    opponentManaStat.baseValue -= payResourceCost.value;
                }

                if (msg.targetInfo != null && msg.targetInfo.Length >= 2)
                {
                    var targetingArrow = Instantiate(opponentTargetingArrowPrefab).GetComponent <OpponentTargetingArrow>();
                    targetingArrow.Begin(boardCreature.transform.position);
                    var playerCard   = playerInfo.zones[msg.targetInfo[0]].cards.Find(x => x.instanceId == msg.targetInfo[1]);
                    var opponentCard = opponentInfo.zones[msg.targetInfo[0]].cards.Find(x => x.instanceId == msg.targetInfo[1]);
                    if (playerCard != null)
                    {
                        var playerBoardCard = playerBoardCards.Find(x => x.card.instanceId == playerCard.instanceId);
                        targetingArrow.SetTarget(playerBoardCard.gameObject);
                    }
                    else if (opponentCard != null)
                    {
                        var opponentBoardCard = opponentBoardCards.Find(x => x.card.instanceId == opponentCard.instanceId);
                        targetingArrow.SetTarget(opponentBoardCard.gameObject);
                    }

                    effectSolver.MoveCard(opponentInfo.netId, opponentBoard.cards[opponentBoard.cards.Count - 1], "Hand", "Board", new List <int>(msg.targetInfo));

                    StartCoroutine(RemoveOpponentTargetingArrow(targetingArrow));
                }
                else
                {
                    effectSolver.MoveCard(opponentInfo.netId, opponentBoard.cards[opponentBoard.cards.Count - 1], "Hand", "Board", new List <int>(msg.targetInfo));
                }
            });
        }
        else if (cardType.name == "Spell")
        {
            var opponentBoard = opponentInfo.namedZones["Board"];
            effectSolver.SetDestroyConditions(opponentBoard.cards[opponentBoard.cards.Count - 1]);
            effectSolver.SetTriggers(opponentBoard.cards[opponentBoard.cards.Count - 1]);
            var spellCard = Instantiate(spellCardViewPrefab);
            spellCard.transform.position = GameObject.Find("OpponentSpellsPivot").transform.position;
            spellCard.GetComponent <SpellCardView>().PopulateWithInfo(opponentBoard.cards[opponentBoard.cards.Count - 1]);
            spellCard.GetComponent <SpellCardView>().SetHighlightingEnabled(false);

            currentSpellCard = spellCard.GetComponent <SpellCardView>();

            var cost = libraryCard.costs.Find(x => x is PayResourceCost);
            if (cost != null)
            {
                var payResourceCost = cost as PayResourceCost;
                opponentManaStat.baseValue -= payResourceCost.value;
            }

            if (msg.targetInfo != null && msg.targetInfo.Length >= 2)
            {
                var targetingArrow = Instantiate(opponentTargetingArrowPrefab).GetComponent <OpponentTargetingArrow>();
                targetingArrow.Begin(spellCard.transform.position);
                var playerCard   = playerInfo.zones[msg.targetInfo[0]].cards.Find(x => x.instanceId == msg.targetInfo[1]);
                var opponentCard = opponentInfo.zones[msg.targetInfo[0]].cards.Find(x => x.instanceId == msg.targetInfo[1]);
                if (playerCard != null)
                {
                    var playerBoardCard = playerBoardCards.Find(x => x.card.instanceId == playerCard.instanceId);
                    targetingArrow.SetTarget(playerBoardCard.gameObject);
                }
                else if (opponentCard != null)
                {
                    var opponentBoardCard = opponentBoardCards.Find(x => x.card.instanceId == opponentCard.instanceId);
                    targetingArrow.SetTarget(opponentBoardCard.gameObject);
                }

                effectSolver.MoveCard(opponentInfo.netId, opponentBoard.cards[opponentBoard.cards.Count - 1], "Hand", "Board", new List <int>(msg.targetInfo));

                StartCoroutine(RemoveOpponentTargetingArrow(targetingArrow));
            }
            else
            {
                effectSolver.MoveCard(opponentInfo.netId, opponentBoard.cards[opponentBoard.cards.Count - 1], "Hand", "Board", new List <int>(msg.targetInfo));
            }
        }
    }