No functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
*/
char token;
+ int hmc, fmn;
std::istringstream ss(fen);
Rank rank = RANK_8;
File file = FILE_A;
}
// 5. Halfmove clock
- int hmc;
if (ss >> hmc)
st->rule50 = hmc;
// 6. Fullmove number
- int fmn;
if (ss >> fmn)
startPosPlyCounter = (fmn - 1) * 2 + int(sideToMove == BLACK);
}
+/// Position::do_setup_move() makes a permanent move on the board.
+/// It should be used when setting up a position on board.
+/// You can't undo the move.
+
+void Position::do_setup_move(Move m, StateInfo& newSt) {
+
+ do_move(m, newSt);
+
+ // Reset "game ply" in case we made a non-reversible move.
+ // "game ply" is used for repetition detection.
+ if (st->rule50 == 0)
+ st->gamePly = 0;
+
+ // Update the number of plies played from the starting position
+ startPosPlyCounter++;
+}
+
/// Position::do_move() makes a move, and saves all information necessary
/// to a StateInfo object. The move is assumed to be legal.
/// Pseudo-legal moves should be filtered out before this function is called.
}
-/// Position::reset_game_ply() simply sets gamePly to 0. It is used from the
-/// UCI interface code, whenever a non-reversible move is made in a
-/// 'position fen <fen> moves m1 m2 ...' command. This makes it possible
-/// for the program to handle games of arbitrary length, as long as the GUI
-/// handles draws by the 50 move rule correctly.
-
-void Position::reset_game_ply() {
-
- st->gamePly = 0;
-}
-
-void Position::inc_startpos_ply_counter() {
-
- startPosPlyCounter++;
-}
-
/// Position::put_piece() puts a piece on the given square of the board,
/// updating the board array, pieces list, bitboards, and piece counts.
// Doing and undoing moves
void detach();
+ void do_setup_move(Move m, StateInfo& St);
void do_move(Move m, StateInfo& st);
void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck);
void undo_move(Move m);
// Check if side to move could be mated in one
bool has_mate_threat();
- // Number of plies since the last non-reversible move
- int rule_50_counter() const;
-
+ // Number of plies from starting position
int startpos_ply_counter() const;
// Other properties of the position
// Current thread ID searching on the position
int thread() const;
- // Reset the gamePly variable to 0
- void reset_game_ply();
- void inc_startpos_ply_counter();
int64_t nodes_searched() const;
void set_nodes_searched(int64_t n);
&& pawn_is_passed(c, move_to(m));
}
-inline int Position::rule_50_counter() const {
- return st->rule50;
-}
-
inline int Position::startpos_ply_counter() const {
return startPosPlyCounter;
}
while (up >> token)
{
move = move_from_uci(pos, token);
- pos.do_move(move, st);
- if (pos.rule_50_counter() == 0)
- pos.reset_game_ply();
-
- pos.inc_startpos_ply_counter(); //FIXME: make from_fen to support this and rule50
+ pos.do_setup_move(move, st);
}
// Our StateInfo st is about going out of scope so copy
// its content inside pos before it disappears.