public void Initialize()
        {
            uiHandler      = GetComponent <UIHandler>();
            gameManager    = GetComponent <GameManager>();
            scenarioLoader = GetComponent <ScenarioLoader>();

            outcomeVisualizer = new OutcomeVisualizer(GetComponent <PathVisualizer>());
            outcomeExecutor   = new OutcomeExecutor(this);
            outcomeAnimator   = new OutcomeAnimator(this, uiHandler);

            selectionReachableHexes = new HashSet <HexEntry>();
            enemyReachableHexes     = new List <HexEntry>();

            UpdateUnitList();

            uiHandler.SlideCameraToHexAvg(UnitsByPlayer[gameManager.ActivePlayer].Select(x => x.Position).ToList());

            turnsOfPlay = 0;
            scenarioLoader.SetTurnsRemainingText(Config.turnsBeforePlayer1Wins - turnsOfPlay + 1);

            gameManager.AITryAITurn();

            if (gameManager.NetEnemyTurn())   // Netcode
            {
                uiHandler.NotYourTurn();
            }
        }
        public void EndTurn()
        {
            if (playbackAnimation != null)
            {
                RevertBoardState(CreateBoardState(new List <Outcome>()));
                return;
            }

            UnitSelected = null; // Clear selection

            gameManager.NetTrySendMoves(boardStateHistory);

            foreach (IUnitController unit in _unitsByPlayer[gameManager.ActivePlayer])
            {
                unit.TurnEndUpkeep();
            }

            PlayerType previousPlayer = gameManager.playerDirectory[gameManager.ActivePlayer];

            switch (gameManager.ActivePlayer)
            {
            case 1:
                gameManager.ActivePlayer = 2;
                break;

            case 2:
                gameManager.ActivePlayer = 1;
                break;
            }

            /*
             * foreach(IUnitController unit in unitsByUniqueID) {
             *  if (unit.PlayerOwner == gameManager.ActivePlayer) {
             *      unit.SpriteManager.MovePointDisplay(true);
             *  }
             *  else {
             *      unit.SpriteManager.MovePointDisplay(false);
             *  }
             * }*/

            if (gameManager.NetEnemyTurn())   // If it's an online enemy's turn, show the panel
            {
                uiHandler.NotYourTurn();
            }

            uiHandler.SlideCameraToHexAvg(UnitsByPlayer[gameManager.ActivePlayer].Select(x => x.Position).ToList());

            foreach (IUnitController unit in _unitsByPlayer[gameManager.ActivePlayer])
            {
                unit.TurnStartUpkeep();
            }

            if (previousPlayer == PlayerType.Local)
            {
                uiHandler.TurnButtonDisplay(gameManager.ActivePlayer);                         // Only update after local turns

                if (gameManager.playerDirectory[gameManager.ActivePlayer] == PlayerType.Local) // If previous and current player were local, save boardstatehistory as storedenemymoves
                {
                    storedEnemyPremoveState = boardStateHistory[0];
                    storedEnemyMoves        = new List <Outcome>();
                    foreach (BoardState boardState in boardStateHistory)
                    {
                        storedEnemyMoves = storedEnemyMoves.Concat(boardState.movesSincePrevState).ToList();
                    }
                }

                boardStateHistory = new List <BoardState>();                   // Clear undos -- turn end button is commitment!
                boardStateHistory.Add(CreateBoardState(new List <Outcome>())); // Prepare next player's potential undo (after upkeep)

                if (gameManager.playerDirectory[gameManager.ActivePlayer] != PlayerType.Local)
                {
                    storedEnemyMoves        = new List <Outcome>(); // For new nonlocal moves, clear enemy move cache
                    storedEnemyPremoveState = boardStateHistory[0];
                }
            }
            else
            {
                boardStateHistory = new List <BoardState>();                   // Clear undos -- turn end button is commitment!
                boardStateHistory.Add(CreateBoardState(new List <Outcome>())); // Prepare next player's potential undo (after upkeep)
            }

            if (gameManager.ActivePlayer == 1)
            {
                turnsOfPlay++;
                scenarioLoader.SetTurnsRemainingText(Config.turnsBeforePlayer1Wins - turnsOfPlay + 1);
            }
            if (UnitsByPlayer[1].Count == 0)
            {
                uiHandler.DisplayVictory(2);
            }
            if (UnitsByPlayer[2].Count == 0)
            {
                uiHandler.DisplayVictory(1);
            }
            else if (turnsOfPlay > Config.turnsBeforePlayer1Wins)
            {
                uiHandler.DisplayVictory(1);
            }
            else
            {
                gameManager.AITryAITurn();
            }
        }