public async Task <IEnumerable <Position> > GetDeadPositions(Fuego fuego)
        {
            var action = FuegoAction.ThatReturnsGtpResponse(() =>
            {
                // Set the player's strength
                if (_lastMaxGames != fuego.MaxGames)
                {
                    SendCommand("uct_param_player max_games " + fuego.MaxGames);
                    _lastMaxGames = fuego.MaxGames;
                }
                var result = SendCommand("final_status_list dead");
                return(result);
            });

            EnqueueAction(action);
            var response = await action.GetGtpResponseAsync();

            var positions = response.Text.Split(new[] { ' ', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            var mark      = new List <Position>();

            foreach (string position in positions)
            {
                mark.Add(Position.FromIgsCoordinates(position));
            }
            return(mark);
        }
        public async Task <IEnumerable <Position> > GetIsolatedDeadPositions(Fuego fuego, GameController gameController)
        {
            var action = FuegoAction.ThatReturnsGtpResponse(() =>
            {
                var information = new AiGameInformation(gameController.Info, StoneColor.Black,
                                                        gameController.Players.Black, gameController.GameTree);
                TrueInitialize(information);
                FixHistory(information);
                // Set the player's strength
                if (_lastMaxGames != fuego.MaxGames)
                {
                    SendCommand("uct_param_player max_games " + fuego.MaxGames);
                    _lastMaxGames = fuego.MaxGames;
                }
                var result = SendCommand("final_status_list dead");
                return(result);
            });

            EnqueueAction(action);
            var response = await action.GetGtpResponseAsync();

            var positions = response.Text.Split(new[] { ' ', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            var mark      = new List <Position>();

            foreach (string position in positions)
            {
                mark.Add(Position.FromIgsCoordinates(position));
            }
            return(mark);
        }
        public AIDecision RequestMove(Fuego fuego, AiGameInformation gameInformation)
        {
            var action = FuegoAction.ThatReturnsAiDecision(() => TrueRequestMove(fuego, gameInformation));

            EnqueueAction(action);
            return(action.GetAiDecisionResult());
        }
        /// <summary>
        /// Called once, at the start of omegaGo, just after Fuego registration, this creates the Fuego engine and associates it
        /// with this instance. That may take a long time so it's put in the Fuego queue as its first item. Called from the UI thread.
        /// </summary>
        public void AppWideInitialization()
        {
            var init = new FuegoAction(() =>
            {
                _engine = AISystems.FuegoBuilder.CreateEngine(0);
            });

            EnqueueAction(init);
        }
        public void MovePerformed(AiGameInformation aiGameInformation)
        {
            var action = new FuegoAction(() =>
            {
                FixHistory(aiGameInformation);
            });

            EnqueueAction(action);
        }
        /// <summary>
        /// Schedules the initialization of Fuego for a game.
        /// </summary>
        public void Initialize(AiGameInformation gameInformation)
        {
            var init = new FuegoAction(() =>
            {
                TrueInitialize(gameInformation);
            });

            EnqueueAction(init);
        }
        public AIDecision GetIsolatedHint(Fuego fuego, AiGameInformation gameInformation)
        {
            var action = FuegoAction.ThatReturnsAiDecision(() =>
            {
                TrueInitialize(gameInformation);
                return(TrueRequestMove(fuego, gameInformation));
            });

            EnqueueAction(action);
            return(action.GetAiDecisionResult());
        }
        public AIDecision GetHint(Fuego fuego, AiGameInformation gameInformation)
        {
            var action = FuegoAction.ThatReturnsAiDecision(() =>
            {
                var result = TrueRequestMove(fuego, gameInformation);
                UndoOneMove();
                return(result);
            });

            EnqueueAction(action);
            return(action.GetAiDecisionResult());
        }
 /// <summary>
 /// Schedules a block of code to run on a different thread when possible. Only code passed to this method
 /// may call <see cref="IGtpEngine.SendCommand(string)"/>, no other code may do that. This prevents Fuego from being
 /// called from multiple threads at the same time. Never add actions to the queue directly, always use this method.
 /// </summary>
 /// <param name="action">The action.</param>
 private void EnqueueAction(FuegoAction action)
 {
     _queue.Enqueue(action);
     ExecuteQueueIfNotRunning();
 }
        public void MoveUndone()
        {
            var action = new FuegoAction(UndoOneMove);

            EnqueueAction(action);
        }