reworked moveflag system
This commit is contained in:
parent
951a8bbec6
commit
1f61dc35f8
32 changed files with 3784 additions and 40 deletions
|
|
@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
40
src/move.rs
40
src/move.rs
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue