fuckulated movegenerator into a good coregenerator

Need to test all edge cases for new position after move (castle/en passant/promotion).
En passant crashes, likely easy fix.
castle/promotion new position untested.

Yoda: A feature branch absolutely necessary was.
Me: With that Truth I agree.
This commit is contained in:
2021-11-15 19:36:19 +01:00
parent 96c342b3d4
commit bf520b6c71
4 changed files with 56 additions and 15 deletions

View File

@@ -63,7 +63,7 @@ enum {
#define SET_BLACK(p) ((p) |= MASK_COLOR) #define SET_BLACK(p) ((p) |= MASK_COLOR)
#define SET_COLOR(p, c) (!(c)? SET_WHITE(p): SET_BLACK(p)) #define SET_COLOR(p, c) (!(c)? SET_WHITE(p): SET_BLACK(p))
/* square_t bits structure : ffffrrrr /* square_t bits structure : rrrrffff
* ffff: file * ffff: file
* rrrr: rank * rrrr: rank
*/ */

View File

@@ -137,6 +137,7 @@ static move_t *move_add(pos_t *pos, piece_t piece, square_t from,
square_t to) square_t to)
{ {
board_t *board = pos->board; board_t *board = pos->board;
pos_t *newpos;
move_t *move; move_t *move;
# ifdef DEBUG_MOVE # ifdef DEBUG_MOVE
@@ -167,9 +168,31 @@ static move_t *move_add(pos_t *pos, piece_t piece, square_t from,
move->to = to; move->to = to;
move->taken = board[to].piece; move->taken = board[to].piece;
move->flags = M_NORMAL; move->flags = M_NORMAL;
if (move->taken)
move->flags |= M_CAPTURE;
move->newpos = pos_dup(pos); move->newpos = pos_dup(pos);
newpos = move->newpos;
SET_COLOR(newpos->turn, IS_BLACK(newpos->turn) ? WHITE : BLACK);
newpos->turn = OPPONENT(newpos->turn);
if (move->taken) {
move->flags |= M_CAPTURE;
/* remove taken piece from new position piece list
* this does not apply for en passant
*/
piece_del(&newpos->board[to].s_piece->list);
/* remove occupied bitboard */
newpos->occupied[OPPONENT(COLOR(piece))] ^= SQ88_2_BB(to);
}
/* always make "to" the piece square in new position */
newpos->board[to] = newpos->board[from];
/* fix dest square */
newpos->board[to].s_piece->square = to;
/* replace old occupied bitboard by new one */
newpos->occupied[VCOLOR(piece)] ^= SQ88_2_BB(from);
newpos->occupied[VCOLOR(piece)] |= SQ88_2_BB(to);
/* always make "from" square empty */
newpos->board[from].piece = 0;
newpos->board[from].s_piece = NULL;
# ifdef DEBUG_MOVE # ifdef DEBUG_MOVE
log_i(3, "added move from %c%c to %c%c\n", log_i(3, "added move from %c%c to %c%c\n",
FILE2C(GET_F(move->from)), RANK2C(GET_R(move->from)), FILE2C(GET_F(move->from)), RANK2C(GET_R(move->from)),
@@ -230,12 +253,19 @@ static move_t *move_pawn_add(pos_t *pos, piece_t piece, square_t from,
if ((move = move_add(pos, piece, from, to))) { if ((move = move_add(pos, piece, from, to))) {
move->flags |= M_PROMOTION; move->flags |= M_PROMOTION;
move->promotion = promote | color; move->promotion = promote | color;
/* fix piece on board and piece list */
newpos = move->newpos; newpos = move->newpos;
newpos->board[to].piece = promote|color;
newpos->board[to].s_piece->piece = piece|color;
newpos->board[to].s_piece->value = piece_details[PIECE(piece)].value;
//piece_del(&newpos->board[from].s_piece); //piece_del(&newpos->board[from].s_piece);
} }
} }
} else { } else {
move = move_add(pos, piece, from, to); move = move_add(pos, piece, from, to);
newpos = move->newpos;
} }
return move; return move;
} }
@@ -319,11 +349,18 @@ int pseudo_moves_pawn(pos_t *pos, piece_list_t *ppiece, bool doit)
sq_file); sq_file);
# endif # endif
if (sq_file == ep_file - 1 || sq_file == ep_file + 1) { if (sq_file == ep_file - 1 || sq_file == ep_file + 1) {
square_t taken = board[SQUARE(ep_file, rank5)].piece; square_t t_square = SQUARE(ep_file, rank5); /* taken pawn square */
piece_t taken = board[t_square].piece;
move = move_pawn_add(pos, piece | color , square, pos->en_passant, rank7); move = move_pawn_add(pos, piece | color , square, pos->en_passant, rank7);
count++; count++;
move->flags |= M_EN_PASSANT | M_CAPTURE; move->flags |= M_EN_PASSANT | M_CAPTURE;
move->taken = taken; move->taken = taken;
/* remove taken pawn from board */
piece_del(&move->newpos->board[t_square].s_piece->list);
move->newpos->board[t_square].piece = 0;
move->newpos->board[t_square].s_piece = NULL;
count++; count++;
} }
@@ -359,6 +396,7 @@ int pseudo_moves_castle(pos_t *pos)
struct can_castle *can_castle; struct can_castle *can_castle;
bitboard_t controlled; bitboard_t controlled;
bitboard_t occupied = pos->occupied[WHITE] | pos->occupied[BLACK]; bitboard_t occupied = pos->occupied[WHITE] | pos->occupied[BLACK];
pos_t *newpos;
# ifdef DEBUG_MOVE # ifdef DEBUG_MOVE
log_f(2, "pos:%p turn:%s\n", log_f(2, "pos:%p turn:%s\n",
@@ -391,7 +429,14 @@ int pseudo_moves_castle(pos_t *pos)
move = move_add(pos, board[SQUARE(4, rank1)].piece, move = move_add(pos, board[SQUARE(4, rank1)].piece,
SQUARE(4, rank1), SQUARE(6, rank1)); SQUARE(4, rank1), SQUARE(6, rank1));
if (move) { if (move) {
newpos = move->newpos;
move->flags |= M_CASTLE_K; move->flags |= M_CASTLE_K;
/* move King rook to column F */
newpos->board[SQUARE(5, rank1)] = newpos->board[SQUARE(7, rank1)];
SET_F(newpos->board[SQUARE(5, rank1)].s_piece->square, 5);
newpos->board[SQUARE(7, rank1)].piece = 0;
newpos->board[SQUARE(7, rank1)].s_piece = NULL;
count++; count++;
} }
} }
@@ -410,6 +455,12 @@ next:
SQUARE(4, rank1), SQUARE(2, rank1)); SQUARE(4, rank1), SQUARE(2, rank1));
if (move) { if (move) {
move->flags |= M_CASTLE_Q; move->flags |= M_CASTLE_Q;
/* move King rook to column F */
newpos->board[SQUARE(3, rank1)] = newpos->board[SQUARE(0, rank1)];
SET_F(newpos->board[SQUARE(3, rank1)].s_piece->square, 3);
newpos->board[SQUARE(0, rank1)].piece = 0;
newpos->board[SQUARE(0, rank1)].s_piece = NULL;
count++; count++;
} }
} }

View File

@@ -60,15 +60,6 @@ void piece_pool_stats()
pool_stats(pieces_pool); pool_stats(pieces_pool);
} }
static eval_t pieces_values[] = {
[PAWN] = PAWN_VALUE,
[KNIGHT] = KNIGHT_VALUE,
[BISHOP] = BISHOP_VALUE,
[ROOK] = ROOK_VALUE,
[QUEEN] = QUEEN_VALUE,
[KING] = KING_VALUE
};
piece_list_t *piece_add(pos_t *pos, piece_t piece, square_t square) piece_list_t *piece_add(pos_t *pos, piece_t piece, square_t square)
{ {
piece_list_t *new; piece_list_t *new;
@@ -85,7 +76,7 @@ piece_list_t *piece_add(pos_t *pos, piece_t piece, square_t square)
new->piece = piece; new->piece = piece;
new->square = square; new->square = square;
new->castle = 0; new->castle = 0;
new-> value = pieces_values[PIECE(piece)]; new-> value = piece_details[PIECE(piece)].value;
} }
return new; return new;

View File

@@ -203,7 +203,6 @@ pos_t *pos_dup(pos_t *pos)
} }
} }
} }
return new; return new;
} }