assert(pos.is_ok());
assert(move_is_ok(m));
+ Square from, to;
+ PieceType pt;
+
+ from = move_from(m);
+ to = move_to(m);
+ pt = type_of_piece(pos.piece_on(move_from(m)));
+
std::string san = "";
if (m == MOVE_NONE)
return "(none)";
else if (m == MOVE_NULL)
return "(null)";
- else if (move_is_long_castle(m))
+ else if (move_is_long_castle(m) || (int(to - from) == -2 && pt == KING))
san = "O-O-O";
- else if (move_is_short_castle(m))
+ else if (move_is_short_castle(m) || (int(to - from) == 2 && pt == KING))
san = "O-O";
else
{
- Piece pc = pos.piece_on(move_from(m));
- if (type_of_piece(pc) != PAWN)
+ if (pt != PAWN)
{
- san += piece_type_to_char(type_of_piece(pc), true);
- Square from = move_from(m);
+ san += piece_type_to_char(pt, true);
switch (move_ambiguity(pos, m)) {
case AMBIGUITY_NONE:
break;
}
if (pos.move_is_capture(m))
{
- if (type_of_piece(pc) == PAWN)
+ if (pt == PAWN)
san += file_to_char(square_file(move_from(m)));
san += "x";
}
// Is the move check? We don't use pos.move_is_check(m) here, because
// Position::move_is_check doesn't detect all checks (not castling moves,
// promotions and en passant captures).
- UndoInfo u;
+ StateInfo st;
Position p(pos);
- p.do_move(m, u);
+ p.do_move(m, st);
if (p.is_check())
san += p.is_mate()? "#" : "+";
const std::string line_to_san(const Position& pos, Move line[], int startColumn, bool breakLines) {
- UndoInfo u;
+ StateInfo st;
std::stringstream s;
std::string moveStr;
size_t length = 0;
s << moveStr << ' ';
if (line[i] == MOVE_NULL)
- p.do_null_move(u);
+ p.do_null_move(st);
else
- p.do_move(line[i], u);
+ p.do_move(line[i], st);
}
return s.str();
}