Exemple #1
0
        public void LoadPlayerStates(NetPlayerInfo playerState, NetPlayerInfo opponentState)
        {
            var players = new Dictionary <NetPlayerInfo, PlayerInfo>();

            players.Add(playerState, playerInfo);
            players.Add(opponentState, opponentInfo);
            foreach (var player in players)
            {
                player.Value.netId = player.Key.netId;

                foreach (var stat in player.Key.stats)
                {
                    var playerStat = player.Value.stats[stat.statId];
                    var oldValue   = playerStat.effectiveValue;
                    playerStat.originalValue = stat.originalValue;
                    playerStat.baseValue     = stat.baseValue;
                    playerStat.minValue      = stat.minValue;
                    playerStat.maxValue      = stat.maxValue;
                    playerStat.modifiers     = new List <Modifier>();
                    foreach (var netModifier in stat.modifiers)
                    {
                        var modifier = new Modifier(netModifier.value, netModifier.duration);
                        playerStat.modifiers.Add(modifier);
                    }
                    if (playerStat.onValueChanged != null)
                    {
                        playerStat.onValueChanged(oldValue, playerStat.effectiveValue);
                    }
                }

                foreach (var zone in player.Key.staticZones)
                {
                    // Remove obsolete entries.
                    var obsoleteCards = new List <RuntimeCard>(player.Value.zones[zone.zoneId].cards.Count);
                    foreach (var card in player.Value.zones[zone.zoneId].cards)
                    {
                        if (System.Array.FindIndex(zone.cards, x => x.instanceId == card.instanceId) == -1)
                        {
                            obsoleteCards.Add(card);
                        }
                    }
                    foreach (var card in obsoleteCards)
                    {
                        player.Value.zones[zone.zoneId].RemoveCard(card);
                    }

                    // Add new entries.
                    foreach (var card in zone.cards)
                    {
                        var runtimeCard = player.Value.zones[zone.zoneId].cards.Find(x => x.instanceId == card.instanceId);
                        if (runtimeCard == null)
                        {
                            runtimeCard             = CreateRuntimeCard();
                            runtimeCard.cardId      = card.cardId;
                            runtimeCard.instanceId  = card.instanceId;
                            runtimeCard.ownerPlayer = player.Value;
                            player.Value.zones[zone.zoneId].AddCard(runtimeCard);
                        }
                    }

                    player.Value.zones[zone.zoneId].numCards = zone.numCards;
                }

                foreach (var zone in player.Key.dynamicZones)
                {
                    // Remove obsolete entries.
                    var obsoleteCards = new List <RuntimeCard>(player.Value.zones[zone.zoneId].cards.Count);
                    foreach (var card in player.Value.zones[zone.zoneId].cards)
                    {
                        if (System.Array.FindIndex(zone.cards, x => x.instanceId == card.instanceId) == -1)
                        {
                            obsoleteCards.Add(card);
                        }
                    }
                    foreach (var card in obsoleteCards)
                    {
                        player.Value.zones[zone.zoneId].RemoveCard(card);
                    }

                    foreach (var card in zone.cards)
                    {
                        var runtimeCard = player.Value.zones[zone.zoneId].cards.Find(x => x.instanceId == card.instanceId);
                        if (runtimeCard != null)
                        {
                            foreach (var stat in card.stats)
                            {
                                runtimeCard.stats[stat.statId].originalValue = stat.originalValue;
                                runtimeCard.stats[stat.statId].baseValue     = stat.baseValue;
                                runtimeCard.stats[stat.statId].minValue      = stat.minValue;
                                runtimeCard.stats[stat.statId].maxValue      = stat.maxValue;
                                runtimeCard.stats[stat.statId].modifiers     = new List <Modifier>();
                                foreach (var netModifier in stat.modifiers)
                                {
                                    var modifier = new Modifier(netModifier.value, netModifier.duration);
                                    runtimeCard.stats[stat.statId].modifiers.Add(modifier);
                                }
                            }
                            runtimeCard.keywords.Clear();
                            foreach (var keyword in card.keywords)
                            {
                                runtimeCard.AddKeyword(keyword.keywordId, keyword.valueId);
                            }
                        }
                        else
                        {
                            runtimeCard             = CreateRuntimeCard();
                            runtimeCard.cardId      = card.cardId;
                            runtimeCard.instanceId  = card.instanceId;
                            runtimeCard.ownerPlayer = player.Value;
                            foreach (var stat in card.stats)
                            {
                                var runtimeStat = NetworkingUtils.GetRuntimeStat(stat);
                                runtimeCard.stats[stat.statId] = runtimeStat;
                                var libraryCard = GameManager.Instance.config.GetCard(card.cardId);
                                var statName    = libraryCard.stats.Find(x => x.statId == stat.statId).name;
                                runtimeCard.namedStats[statName] = runtimeStat;
                            }
                            foreach (var keyword in card.keywords)
                            {
                                runtimeCard.AddKeyword(keyword.keywordId, keyword.valueId);
                            }
                            player.Value.zones[zone.zoneId].AddCard(runtimeCard);
                            effectSolver.SetDestroyConditions(runtimeCard);
                            effectSolver.SetTriggers(runtimeCard);
                        }
                    }

                    player.Value.zones[zone.zoneId].numCards = zone.numCards;
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Starts the multiplayer game. This is automatically called when the appropriate number of players
        /// have joined a room.
        /// </summary>
        public virtual void StartGame()
        {
            Logger.Log("Game has started.");

            // Start with turn 1.
            currentTurn = 1;

            var players = gameState.players;

            // Create an array with all the player nicknames.
            var playerNicknames = new List <string>(players.Count);

            foreach (var player in players)
            {
                playerNicknames.Add(player.nickname);
            }

            // Set the current player and opponents.
            gameState.currentPlayer   = players[currentPlayerIndex];
            gameState.currentOpponent = players.Find(x => x != gameState.currentPlayer);

            var rngSeed = System.Environment.TickCount;

            effectSolver = new EffectSolver(gameState, rngSeed);

            foreach (var player in players)
            {
                effectSolver.SetTriggers(player);
                foreach (var zone in player.zones)
                {
                    foreach (var card in zone.Value.cards)
                    {
                        effectSolver.SetDestroyConditions(card);
                        effectSolver.SetTriggers(card);
                    }
                }
            }

            // Execute the game start actions.
            foreach (var action in GameManager.Instance.config.properties.gameStartActions)
            {
                ExecuteGameAction(action);
            }

            // Send a StartGame message to all the connected players.
            for (var i = 0; i < players.Count; i++)
            {
                var player = players[i];
                var msg    = new StartGameMessage();
                msg.recipientNetId = player.netId;
                msg.playerIndex    = i;
                msg.turnDuration   = turnDuration;
                msg.nicknames      = playerNicknames.ToArray();
                msg.player         = GetPlayerNetworkState(player);
                msg.opponent       = GetOpponentNetworkState(players.Find(x => x != player));
                msg.rngSeed        = rngSeed;
                SafeSendToClient(player, NetworkProtocol.StartGame, msg);
            }

            // Start running the turn sequence coroutine.
            turnCoroutine = StartCoroutine(RunTurn());
        }