use crate::types::{Color, Square};
pub const F_KING: usize = 1548;
pub const E_KING: usize = 1629;
pub const PIECE_INPUTS: usize = 1548 + 81 * 2;
#[inline]
pub fn king_bonapiece(sq_index: usize, is_friend: bool) -> BonaPiece {
let base = if is_friend { F_KING } else { E_KING };
BonaPiece::new((base + sq_index) as u16)
}
use super::bona_piece::BonaPiece;
pub type BonaPieceHalfKA = BonaPiece;
#[inline]
pub fn king_index(ksq: Square, perspective: Color) -> usize {
if perspective == Color::Black {
ksq.index()
} else {
ksq.inverse().index()
}
}
#[inline]
pub fn halfka_index(king_idx: usize, bp_value: usize) -> usize {
king_idx * PIECE_INPUTS + bp_value
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::{File, Rank};
#[test]
fn test_constants() {
assert_eq!(F_KING, 1548);
assert_eq!(E_KING, 1629);
assert_eq!(PIECE_INPUTS, 1710);
}
#[test]
fn test_king_index_black_perspective() {
let sq_59 = Square::new(File::File5, Rank::Rank9);
assert_eq!(king_index(sq_59, Color::Black), sq_59.index());
}
#[test]
fn test_king_index_white_perspective() {
let sq_59 = Square::new(File::File5, Rank::Rank9);
let sq_51 = sq_59.inverse();
assert_eq!(king_index(sq_59, Color::White), sq_51.index());
}
#[test]
fn test_halfka_index() {
assert_eq!(halfka_index(0, 0), 0);
assert_eq!(halfka_index(1, 0), PIECE_INPUTS);
assert_eq!(halfka_index(80, 0), 80 * PIECE_INPUTS);
}
}