From 1397d61d2238ffc9238d0569030047f0d944e503 Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Thu, 21 Mar 2024 07:01:51 +0100 Subject: [PATCH] move_{do,undo}: FIX forgotten king[] update, add few bug_on() --- src/move-do.c | 30 ++++++++++++++++++++++++------ src/move-do.h | 6 ++++-- src/move-gen.c | 2 +- src/move.h | 4 ++-- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/move-do.c b/src/move-do.c index e8d7478..79f708f 100644 --- a/src/move-do.c +++ b/src/move-do.c @@ -17,10 +17,12 @@ #include "brlib.h" #include "likely.h" +#include "bug.h" #include "chessdefs.h" #include "move.h" #include "position.h" +#include "move-do.h" /** * move_do() - do move. @@ -40,7 +42,7 @@ * * @return: pos. */ -pos_t *move_do(pos_t *pos, move_t move, state_t *state) +pos_t *move_do(pos_t *pos, const move_t move, state_t *state) { //# ifdef DEBUG_MOVE_DO // move_print(move, M_PR_NL | M_PR_LONG); @@ -50,6 +52,8 @@ pos_t *move_do(pos_t *pos, move_t move, state_t *state) color_t us = pos->turn, them = OPPONENT(us); square_t from = move_from(move), to = move_to(move); piece_t piece = pos->board[from]; + piece_type_t ptype = PIECE(piece); + color_t pcolor = COLOR(piece); piece_t new_piece = piece; ++pos->clock_50; @@ -57,12 +61,17 @@ pos_t *move_do(pos_t *pos, move_t move, state_t *state) pos->en_passant = SQUARE_NONE; pos->turn = them; - if (is_promotion(move)) + bug_on(pcolor != us); + + if (is_promotion(move)) { + bug_on(sq_rank(to) != sq_rel_rank(RANK_8, us)); new_piece = MAKE_PIECE(move_promoted(move), us); + } if (is_capture(move)) { pos->clock_50 = 0; pos->captured = pos->board[to]; /* save capture info */ + bug_on(pos->board[to] == EMPTY || COLOR(pos->captured) != them); pos_clr_sq(pos, to); /* clear square */ } else if (is_castle(move)) { /* handle rook move */ square_t rookfrom, rookto; @@ -76,7 +85,7 @@ pos_t *move_do(pos_t *pos, move_t move, state_t *state) pos_set_sq(pos, rookto, pos->board[rookfrom]); pos_clr_sq(pos, rookfrom); pos->castle = clr_castle(pos->castle, us); - } else if (PIECE(piece) == PAWN) { /* pawn non capture or e.p. */ + } else if (ptype == PAWN) { /* pawn non capture or e.p. */ pos->clock_50 = 0; if (is_dpush(move)) /* if pawn double push, set e.p. */ pos->en_passant = pawn_push_up(from, us); @@ -89,6 +98,9 @@ pos_t *move_do(pos_t *pos, move_t move, state_t *state) pos_clr_sq(pos, from); /* always clear "from" and set "to" */ pos_set_sq(pos, to, new_piece); + if (ptype == KING) + pos->king[us] = to; + /* update castling flags * As we always consider flags are valid, we : * - adjust our flags if relative from is "E1", "A1", H1" @@ -96,7 +108,8 @@ pos_t *move_do(pos_t *pos, move_t move, state_t *state) */ if (can_castle(pos->castle, us)) { /* do we save time with this test ? */ square_t rel_e1 = sq_rel(E1, us); - square_t rel_a1 = sq_rel(A1, us); square_t rel_h1 = sq_rel(H1, us); + square_t rel_a1 = sq_rel(A1, us); + square_t rel_h1 = sq_rel(H1, us); if (from == rel_e1) pos->castle = clr_castle(pos->castle, us); else if (from == rel_a1) @@ -105,7 +118,8 @@ pos_t *move_do(pos_t *pos, move_t move, state_t *state) pos->castle = clr_oo(pos->castle, us); } if (can_castle(pos->castle, them)) { /* do we save time with this test ? */ - square_t rel_a8 = sq_rel(A8, us); square_t rel_h8 = sq_rel(H8, us); + square_t rel_a8 = sq_rel(A8, us); + square_t rel_h8 = sq_rel(H8, us); if (to == rel_a8) pos->castle = clr_ooo(pos->castle, them); else if (to == rel_h8) @@ -142,7 +156,6 @@ pos_t *move_undo(pos_t *pos, const move_t move, const state_t *state) square_t from = move_from(move), to = move_to(move); piece_t piece = pos->board[to]; - pos->state = *state; /* restore irreversible changes */ if (is_promotion(move)) piece = MAKE_PIECE(PAWN, us); @@ -150,6 +163,9 @@ pos_t *move_undo(pos_t *pos, const move_t move, const state_t *state) pos_clr_sq(pos, to); /* always clear "to" and set "from" */ pos_set_sq(pos, from, piece); + if (PIECE(piece) == KING) + pos->king[us] = from; + if (is_capture(move)) { pos_set_sq(pos, to, pos->captured); /* restore captured piece */ } else if (is_castle(move)) { /* make reverse rook move */ @@ -168,5 +184,7 @@ pos_t *move_undo(pos_t *pos, const move_t move, const state_t *state) pos_set_sq(pos, grabbed, MAKE_PIECE(PAWN, them)); } + pos->state = *state; /* restore irreversible changes */ + pos->turn = us; return pos; } diff --git a/src/move-do.h b/src/move-do.h index 4a6b34a..019a01f 100644 --- a/src/move-do.h +++ b/src/move-do.h @@ -14,7 +14,9 @@ #ifndef MOVE_DO_H #define MOVE_DO_H -//extern pos_t *move_do(pos_t *pos, move_t *move); -//extern void move_undo(pos_t *pos, move_t *move); +#include "position.h" + +pos_t *move_do(pos_t *pos, const move_t move, state_t *state); +pos_t *move_undo(pos_t *pos, const move_t move, const state_t *state); #endif /* MOVE_DO_H */ diff --git a/src/move-gen.c b/src/move-gen.c index 9c53b9a..6c3fc85 100644 --- a/src/move-gen.c +++ b/src/move-gen.c @@ -109,7 +109,7 @@ bool pseudo_is_legal(const pos_t *pos, const move_t move) * @start is set to next non-checked move in pseudo-legal list. * Position pseudo-legal moves must be already calculated before calling this function. * - * @return: move, or -1 if no move. + * @return: move, or MOVE_NONE if no move. */ move_t pos_next_legal(const pos_t *pos, int *start) { diff --git a/src/move.h b/src/move.h index 19fbb66..fb15d6a 100644 --- a/src/move.h +++ b/src/move.h @@ -35,8 +35,8 @@ typedef s32 move_t; /* special move_t values */ -#define MOVE_NONE (-1) -#define MOVE_NULL (0) /* hack: from = to = A1 */ +#define MOVE_NONE ((move_t) -1) +#define MOVE_NULL ((move_t) 0) /* hack: from = to = A1 */ enum { M_OFF_FROM = 0,