reworked moveflag system

This commit is contained in:
Moritz Eigenauer 2025-11-12 18:09:51 +01:00
parent 951a8bbec6
commit 1f61dc35f8
32 changed files with 3784 additions and 40 deletions

View file

@ -319,9 +319,9 @@ impl Board {
let flag = mv.value() & MOVE_FLAG_MASK;
// promo must come first because of double usage of the flag bits
if flag == MOVE_FLAG_NO_PROMO {
if flag & MOVE_FLAG_CAPTURE > 0 {
} else { //
} else { // No capture
}
}

View file

@ -10,33 +10,33 @@ pub const MOVE_FROM_MASK: u16 = 0b0000_0000_0011_1111;
pub const MOVE_TO_MASK: u16 = 0b0000_1111_1100_0000;
// BIT 12 - 15: FLAGS (4 bits)
// 1. 0 no capture, 1 capture
pub const MOVE_FLAG_MASK: u16 = 0b1111_0000_0000_0000;
pub const MOVE_FLAG_QUIET: u16 = 0b0000_0000_0000_0000;
pub const MOVE_FLAG_CAPTURE: u16 = 0b0001_0000_0000_0000;
pub const MOVE_FLAG_EN_PASSANT: u16 = 0b0010_0000_0000_0000;
pub const MOVE_FLAG_EN_PASSANT: u16 = 0b0011_0000_0000_0000;
pub const MOVE_FLAG_WK_CASTLE: u16 = 0b0011_0000_0000_0000;
pub const MOVE_FLAG_WQ_CASTLE: u16 = 0b0100_0000_0000_0000;
pub const MOVE_FLAG_BK_CASTLE: u16 = 0b0101_0000_0000_0000;
pub const MOVE_FLAG_BQ_CASTLE: u16 = 0b0110_0000_0000_0000;
// 0111 is free
// Castle flags
pub const MOVE_MASK_CASTLE: u16 = 0b1100_0000_0000_0000;
pub const MOVE_FLAG_CASTLE_TRUE: u16 = 0b0100_0000_0000_0000;
pub const MOVE_FLAG_WK_CASTLE: u16 = 0b0100_0000_0000_0000;
pub const MOVE_FLAG_WQ_CASTLE: u16 = 0b0101_0000_0000_0000;
pub const MOVE_FLAG_BK_CASTLE: u16 = 0b0110_0000_0000_0000;
pub const MOVE_FLAG_BQ_CASTLE: u16 = 0b0111_0000_0000_0000;
// Promotion flags (use the 1xxx bits)
// We combine capture flag with promotion type
pub const MOVE_FLAG_PROMO: u16 = 0b1000_0000_0000_0000;
pub const MOVE_FLAG_NO_PROMO: u16 = 0b0000_0000_0000_0000;
pub const MOVE_FLAG_PROMO_N: u16 = 0b1000_0000_0000_0000;
pub const MOVE_FLAG_PROMO_B: u16 = 0b1001_0000_0000_0000;
pub const MOVE_FLAG_PROMO_R: u16 = 0b1010_0000_0000_0000;
pub const MOVE_FLAG_PROMO_Q: u16 = 0b1011_0000_0000_0000;
pub const MOVE_FLAG_PROMO_CAP_N: u16 = 0b1100_0000_0000_0000;
pub const MOVE_FLAG_PROMO_CAP_B: u16 = 0b1101_0000_0000_0000;
pub const MOVE_FLAG_PROMO_CAP_R: u16 = 0b1110_0000_0000_0000;
pub const MOVE_FLAG_PROMO_CAP_Q: u16 = 0b1111_0000_0000_0000;
pub const MOVE_FLAG_PROMO_B: u16 = 0b1010_0000_0000_0000;
pub const MOVE_FLAG_PROMO_R: u16 = 0b1100_0000_0000_0000;
pub const MOVE_FLAG_PROMO_Q: u16 = 0b1110_0000_0000_0000;
pub const MOVE_FLAG_PROMO_N_CAP: u16 = 0b1001_0000_0000_0000;
pub const MOVE_FLAG_PROMO_B_CAP: u16 = 0b1011_0000_0000_0000;
pub const MOVE_FLAG_PROMO_R_CAP: u16 = 0b1101_0000_0000_0000;
pub const MOVE_FLAG_PROMO_Q_CAP: u16 = 0b1111_0000_0000_0000;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct Move(u16);
@ -88,10 +88,10 @@ impl Move {
// Check if it's any promotion type (1xxx)
if (flags & 0b1000_0000_0000_0000) != 0 {
let promo_char = match flags {
MOVE_FLAG_PROMO_N | MOVE_FLAG_PROMO_CAP_N => 'n',
MOVE_FLAG_PROMO_B | MOVE_FLAG_PROMO_CAP_B => 'b',
MOVE_FLAG_PROMO_R | MOVE_FLAG_PROMO_CAP_R => 'r',
MOVE_FLAG_PROMO_Q | MOVE_FLAG_PROMO_CAP_Q => 'q',
MOVE_FLAG_PROMO_N | MOVE_FLAG_PROMO_N_CAP => 'n',
MOVE_FLAG_PROMO_B | MOVE_FLAG_PROMO_B_CAP => 'b',
MOVE_FLAG_PROMO_R | MOVE_FLAG_PROMO_R_CAP => 'r',
MOVE_FLAG_PROMO_Q | MOVE_FLAG_PROMO_Q_CAP => 'q',
_ => '?', // Should not happen
};
format!("{}{}{}", from_str, to_str, promo_char)

View file

@ -98,10 +98,10 @@ pub fn generate_pawn_moves(board: &Board, list: &mut MoveList) {
while promotion_targets_a_side_capture > 0 {
let to = SQUARES[promotion_targets_a_side_capture.trailing_zeros() as usize];
let from = to - 7;
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_Q));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_R));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_B));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_N));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_N_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_B_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_R_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_Q_CAP));
promotion_targets_a_side_capture &= promotion_targets_a_side_capture - 1;
}
@ -111,10 +111,10 @@ pub fn generate_pawn_moves(board: &Board, list: &mut MoveList) {
while promotion_targets_h_side_capture > 0 {
let to = SQUARES[promotion_targets_h_side_capture.trailing_zeros() as usize];
let from = to - 9;
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_Q));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_R));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_B));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_N));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_N_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_B_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_R_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_Q_CAP));
promotion_targets_h_side_capture &= promotion_targets_h_side_capture - 1;
}
@ -207,10 +207,10 @@ pub fn generate_pawn_moves(board: &Board, list: &mut MoveList) {
while promotion_targets_a_side_capture > 0 {
let to = SQUARES[promotion_targets_a_side_capture.trailing_zeros() as usize];
let from = to + 9;
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_Q));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_R));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_B));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_N));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_N_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_B_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_R_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_Q_CAP));
promotion_targets_a_side_capture &= promotion_targets_a_side_capture - 1;
}
@ -219,10 +219,10 @@ pub fn generate_pawn_moves(board: &Board, list: &mut MoveList) {
while promotion_targets_h_side_capture > 0 {
let to = SQUARES[promotion_targets_h_side_capture.trailing_zeros() as usize];
let from = to + 7;
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_Q));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_R));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_B));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_CAP_N));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_N_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_B_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_R_CAP));
list.push(Move::new(from, to, MOVE_FLAG_PROMO_Q_CAP));
promotion_targets_h_side_capture &= promotion_targets_h_side_capture - 1;
}