// position() is called when engine receives the "position" UCI command. // The function sets up the position described in the given FEN string ("fen") // or the starting position ("startpos") and then makes the moves given in the // following move list ("moves"). public static void position(Position pos, istringstream @is) { Move m; string token; string fen; @is >> token; if (token == "startpos") { fen = ((char)StartFEN).ToString(); @is >> token; // Consume "moves" token if any } else if (token == "fen") { while (@is >> token && token != "moves") { fen += token + " "; } } else { return; } pos.set(fen, GlobalMembersUcioption.Options["UCI_Chess960"], GlobalMembersThread.Threads.main()); #if StateStackPtr_ConditionalDefinition1 SetupStates = std.auto_ptr <Stack <StateInfo> >(new Stack <StateInfo>()); #elif StateStackPtr_ConditionalDefinition2 SetupStates = std.auto_ptr <Stack <StateInfo> >(new Stack <StateInfo>()); #else SetupStates = Search.StateStackPtr(new Stack <StateInfo>()); #endif // Parse move list (if any) while (@is >> token && (m = GlobalMembersUci.to_move(pos, token)) != Move.MOVE_NONE) { SetupStates.push(new StateInfo()); pos.do_move(m, SetupStates.top()); } }
// go() is called when engine receives the "go" UCI command. The function sets // the thinking time and other parameters from the input string, then starts // the search. public static void go(Position pos, istringstream @is) { Search.LimitsType limits = new Search.LimitsType(); string token; while (@is >> token) { if (token == "searchmoves") { while (@is >> token) { limits.searchmoves.Add(GlobalMembersUci.to_move(pos, token)); } } else if (token == "wtime") { @is >> limits.time[(int)Color.WHITE]; } else if (token == "btime") { @is >> limits.time[(int)Color.BLACK]; } else if (token == "winc") { @is >> limits.inc[(int)Color.WHITE]; } else if (token == "binc") { @is >> limits.inc[(int)Color.BLACK]; } else if (token == "movestogo") { @is >> limits.movestogo; } else if (token == "depth") { @is >> limits.depth; } else if (token == "nodes") { @is >> limits.nodes; } else if (token == "movetime") { @is >> limits.movetime; } else if (token == "mate") { @is >> limits.mate; } else if (token == "infinite") { limits.infinite = true; } else if (token == "ponder") { limits.ponder = true; } } GlobalMembersThread.Threads.start_thinking(pos, limits, SetupStates); }