use crate::types::{Color, Square};
pub const FE_HAND_END: usize = 90;
pub const FE_OLD_END: usize = 1548;
pub const F_KING: usize = 1548;
pub const E_KING: usize = 1629;
pub const PIECE_INPUTS: usize = E_KING;
use super::bona_piece::BonaPiece;
#[allow(non_camel_case_types)]
pub type BonaPieceHalfKA_hm = BonaPiece;
#[inline]
pub fn pack_bonapiece(bp: BonaPieceHalfKA_hm, hm_mirror: bool) -> usize {
let mut pp = bp.value() as usize;
if hm_mirror && pp >= FE_HAND_END {
let rel = pp - FE_HAND_END;
let piece_index = rel / 81;
let sq = rel % 81;
let file = sq / 9;
let rank = sq % 9;
let mirrored_file = 8 - file;
let mirrored_sq = mirrored_file * 9 + rank;
pp = FE_HAND_END + piece_index * 81 + mirrored_sq;
}
if pp >= E_KING {
pp -= 81;
}
pp }
#[inline]
pub fn king_bucket(ksq: Square, perspective: Color) -> usize {
let sq = if perspective == Color::Black {
ksq
} else {
ksq.inverse()
};
let file = sq.file() as usize; let rank = sq.rank() as usize;
let file_m = if file >= 5 { 8 - file } else { file };
file_m * 9 + rank
}
#[inline]
pub fn is_hm_mirror(ksq: Square, perspective: Color) -> bool {
let sq = if perspective == Color::Black {
ksq
} else {
ksq.inverse()
};
sq.file() as usize >= 5
}
#[inline]
pub fn halfka_index(kb: usize, packed_bp: usize) -> usize {
kb * PIECE_INPUTS + packed_bp
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::{File, Rank};
#[test]
fn test_constants() {
assert_eq!(FE_HAND_END, 90);
assert_eq!(FE_OLD_END, 1548);
assert_eq!(F_KING, 1548);
assert_eq!(E_KING, 1629);
assert_eq!(PIECE_INPUTS, 1629);
}
#[test]
fn test_king_bucket_black_perspective() {
let sq_59 = Square::new(File::File5, Rank::Rank9);
assert_eq!(king_bucket(sq_59, Color::Black), 44);
let sq_19 = Square::new(File::File1, Rank::Rank9);
assert_eq!(king_bucket(sq_19, Color::Black), 8);
let sq_99 = Square::new(File::File9, Rank::Rank9);
assert_eq!(king_bucket(sq_99, Color::Black), 8);
let sq_69 = Square::new(File::File6, Rank::Rank9);
assert_eq!(king_bucket(sq_69, Color::Black), 35);
let sq_51 = Square::new(File::File5, Rank::Rank1);
assert_eq!(king_bucket(sq_51, Color::Black), 36);
let sq_11 = Square::new(File::File1, Rank::Rank1);
assert_eq!(king_bucket(sq_11, Color::Black), 0);
}
#[test]
fn test_is_hm_mirror() {
assert!(!is_hm_mirror(Square::new(File::File1, Rank::Rank1), Color::Black));
assert!(!is_hm_mirror(Square::new(File::File5, Rank::Rank9), Color::Black));
assert!(is_hm_mirror(Square::new(File::File6, Rank::Rank1), Color::Black));
assert!(is_hm_mirror(Square::new(File::File9, Rank::Rank9), Color::Black));
}
#[test]
fn test_pack_bonapiece_hand_no_mirror() {
let bp = BonaPiece::new(50); assert_eq!(pack_bonapiece(bp, true), 50);
assert_eq!(pack_bonapiece(bp, false), 50);
}
#[test]
fn test_pack_bonapiece_board_mirror() {
let sq = 0;
let bp = BonaPiece::new((90 + sq) as u16);
assert_eq!(pack_bonapiece(bp, false), 90 + sq);
assert_eq!(pack_bonapiece(bp, true), 90 + 72);
let sq = 9;
let bp = BonaPiece::new((90 + sq) as u16);
assert_eq!(pack_bonapiece(bp, false), 90 + sq);
assert_eq!(pack_bonapiece(bp, true), 90 + 63);
let sq = 40;
let bp = BonaPiece::new((90 + sq) as u16);
assert_eq!(pack_bonapiece(bp, true), 90 + 40);
}
#[test]
fn test_pack_bonapiece_enemy_king() {
let bp = BonaPiece::new(E_KING as u16);
assert_eq!(pack_bonapiece(bp, false), E_KING - 81);
}
#[test]
fn test_halfka_index() {
assert_eq!(halfka_index(0, 0), 0);
assert_eq!(halfka_index(1, 0), PIECE_INPUTS);
assert_eq!(halfka_index(44, 0), 44 * PIECE_INPUTS);
}
}