private void SetupBattle(
            IEnumerable <int> localPlayerFruitonIds,
            IEnumerable <Position> localPlayerPositions,
            IEnumerable <int> opponentFruitonIds,
            IEnumerable <Position> opponentPositions,
            Player localPlayer,
            Player opponent
            )
        {
            IEnumerable <GameObject> localTeam    = ClientFruitonFactory.CreateClientFruitonTeam(localPlayerFruitonIds, battleViewer.Board);
            IEnumerable <GameObject> opponentTeam = ClientFruitonFactory.CreateClientFruitonTeam(opponentFruitonIds, battleViewer.Board);

            battleViewer.InitializeTeam(localTeam, localPlayer, true, localPlayerPositions.ToArray());
            battleViewer.InitializeTeam(opponentTeam, opponent, false, opponentPositions.ToArray());

            // Remove fruitons from factory and use fruitons from given state instead
            foreach (GameObject o in battleViewer.FruitonsGrid)
            {
                ClientFruiton clientFruiton;
                if (o != null &&
                    (clientFruiton = o.GetComponent <ClientFruiton>()) != null)
                {
                    KFruiton kernelFruiton = clientFruiton.KernelFruiton;
                    KFruiton realFruiton   = Kernel.currentState.field.get(kernelFruiton.position).fruiton;
                    clientFruiton.KernelFruiton = realFruiton;
                }
            }

            BattleReady();
            if (!IsLocalPlayerFirst)
            {
                battleViewer.FlipFruitons();
            }
        }
        public void ProcessMessage(GameReady gameReadyMessage)
        {
            battleViewer.DisableCancelFindButton();
            var kernelPlayer1 = new Player(0);
            var kernelPlayer2 = new Player(1);

            LocalPlayer  = new LocalPlayer(battleViewer, kernelPlayer1, this, gameManager.UserName);
            OnlinePlayer = new OnlinePlayer(kernelPlayer2, this, gameReadyMessage.Opponent.Login);
            ((OnlinePlayer)OnlinePlayer).OnEnable();
            IEnumerable <GameObject> opponentTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameReadyMessage.OpponentTeam.FruitonIDs, battleViewer.Board);
            IEnumerable <GameObject> currentTeam  = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);

            // The opponent team is obtained from the server with the correctly set positions.
            battleViewer.InitializeTeam(opponentTeam, kernelPlayer2, kernelPlayer2.id == 0, gameReadyMessage.OpponentTeam.Positions.ToArray());

            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(gameReadyMessage.MapId, battleViewer.GameMode);

            var fruitons = new haxe.root.Array <object>();

            foreach (var fruiton in currentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in opponentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            IsLocalPlayerFirst = gameReadyMessage.StartsFirst;
            Player player1;
            Player player2;

            // If the local player begins, the game will be started with kernelPlayer1 as first argument.
            if (IsLocalPlayerFirst)
            {
                battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, GameManager.Instance.CurrentFruitonTeam.Positions.ToArray());
                player1 = kernelPlayer1;
                player2 = kernelPlayer2;
            }
            // If the online opponent begins, we need to flip the positions to the opposite side because we do not receive
            // the new positions from the server. The first argument has to be the online opponent = kernelPlayer2.
            else
            {
                var width            = GameState.WIDTH;
                var height           = GameState.HEIGHT;
                var flippedPositions = BattleHelper.FlipCoordinates(GameManager.Instance.CurrentFruitonTeam.Positions, width, height);
                battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, flippedPositions.ToArray());
                player1 = kernelPlayer2;
                player2 = kernelPlayer1;
                battleViewer.DisableEndTurnButton();
            }
            Kernel = new Kernel(player1, player2, fruitons, kernelSettings, false, false);

            SendReadyMessage();
            battleViewer.InitializePlayersInfo();
            BattleReady();
        }
Beispiel #3
0
        public AIBattle(BattleViewer battleViewer, AIType aiType)
            : base(battleViewer)
        {
            int[] aiTeamIDs;

            var kernelPlayer1 = new Player(0);
            var kernelPlayer2 = new Player(1);

            HumanPlayer = new LocalPlayer(battleViewer, kernelPlayer1, this, GameManager.Instance.UserName);
            AiPlayer    = CreateAI(aiType, battleViewer, kernelPlayer2, this, out aiTeamIDs);

            IEnumerable <GameObject> humanTeam;
            IEnumerable <Position>   coords;
            IEnumerable <Position>   flippedCoords;
            IEnumerable <GameObject> aiTeam = ClientFruitonFactory.CreateClientFruitonTeam(aiTeamIDs, battleViewer.Board);

            if (aiType == AIType.Tutorial)
            {
                int[] humanTeamIDs = { 2, 5, 15, 14, 12, 17, 21, 21, 30, 25 };
                humanTeam = ClientFruitonFactory.CreateClientFruitonTeam(humanTeamIDs, battleViewer.Board);
                coords    = Tutorial.CreatePositionsForArtificialTeam(humanTeam.Select(gameObject =>
                                                                                       gameObject.GetComponent <ClientFruiton>().KernelFruiton));
            }
            else
            {
                humanTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);
                coords    = gameManager.CurrentFruitonTeam.Positions;
            }
            battleViewer.InitializeTeam(humanTeam, kernelPlayer1, kernelPlayer1.id == 0, coords.ToArray());
            flippedCoords = BattleHelper.FlipCoordinates(coords, GameState.WIDTH, GameState.HEIGHT);
            battleViewer.InitializeTeam(aiTeam, kernelPlayer2, kernelPlayer2.id == 0, flippedCoords.ToArray());

            var fruitons = new Array <object>();

            foreach (var fruiton in humanTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in aiTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }

            Array <int>  maps           = GameManager.Instance.FruitonDatabase.getMapsIds();
            int          rndMapId       = maps[Random.Range(0, maps.length)];
            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(rndMapId, battleViewer.GameMode);

            bool infiniteTurnTime = battleViewer.battleType == BattleType.TutorialBattle;

            Kernel = new Kernel(kernelPlayer1, kernelPlayer2, fruitons, kernelSettings, false, infiniteTurnTime);
            BattleReady();
        }
        public OfflineBattle(BattleViewer battleViewer) : base(battleViewer)
        {
            var    kernelPlayer1 = new Player(0);
            var    kernelPlayer2 = new Player(1);
            string login         = GameManager.Instance.UserName;

            Player1 = new LocalPlayer(battleViewer, kernelPlayer1, this, "Player 1");
            Player2 = new LocalPlayer(battleViewer, kernelPlayer2, this, "Player 2");

            IEnumerable <GameObject> currentTeam  = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.CurrentFruitonTeam.FruitonIDs, battleViewer.Board);
            IEnumerable <GameObject> opponentTeam = ClientFruitonFactory.CreateClientFruitonTeam(gameManager.OfflineOpponentTeam.FruitonIDs, battleViewer.Board);

            RepeatedField <Position> coords = gameManager.CurrentFruitonTeam.Positions;

            battleViewer.InitializeTeam(currentTeam, kernelPlayer1, kernelPlayer1.id == 0, coords.ToArray());
            RepeatedField <Position> flippedCoords = BattleHelper.FlipCoordinates(coords, GameState.WIDTH, GameState.HEIGHT);

            battleViewer.InitializeTeam(opponentTeam, kernelPlayer2, kernelPlayer2.id == 0, flippedCoords.ToArray());

            var fruitons = new Array <object>();

            foreach (var fruiton in currentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }
            foreach (var fruiton in opponentTeam)
            {
                fruitons.push(fruiton.GetComponent <ClientFruiton>().KernelFruiton);
            }

            Array <int>  maps           = GameManager.Instance.FruitonDatabase.getMapsIds();
            int          rndMapId       = maps[Random.Range(0, maps.length)];
            GameSettings kernelSettings = GameSettingsFactory.CreateGameSettings(rndMapId, battleViewer.GameMode);

            Kernel = new Kernel(kernelPlayer1, kernelPlayer2, fruitons, kernelSettings, false, false);
            BattleReady();
        }
Beispiel #5
0
    /// <summary>
    /// Loads last saved player's data from local cache and server, sets up fruiton database.
    /// </summary>
    private void Initialize()
    {
        FruitonDatabase = new FruitonDatabase(KernelUtils.LoadTextResource(FRUITON_DB_FILE));
        AllFruitons     = ClientFruitonFactory.CreateAllKernelFruitons();

        if (IsInTrial)
        {
            AvailableFruitons = AllPlayableFruitons.Select(fruiton => fruiton.dbId).ToList();
            FruitonTeamList   = new FruitonTeamList();
            loggedPlayerInfo  = new LoggedPlayerInfo();
        }
        else
        {
            PlayerOptions = Serializer.LoadPlayerSettings();
            Serializer.DeserializeFruitonTeams();
            AvailableFruitons = Serializer.LoadAvailableFruitons();
        }

        if (IsOnline)
        {
            PlayerHelper.GetAllFruitonTeams(MergeTeamLists, Debug.Log);
            PlayerHelper.GetAvailableFruitons((list) => Debug.Log("Available fruitons loaded from server."), Debug.Log);
        }
    }