diff --git a/Cargo.lock b/Cargo.lock index 1d38eab..7721839 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,7 +7,6 @@ name = "Mouse" version = "0.1.0" dependencies = [ "criterion", - "getset", "iai", "perft_fixtures", ] @@ -179,18 +178,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "getset" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "half" version = "2.7.0" @@ -300,28 +287,6 @@ dependencies = [ "plotters-backend", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.101" diff --git a/Cargo.toml b/Cargo.toml index c69b352..4c6a455 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,9 +6,6 @@ edition = "2024" [lib] name = "mouse" -[dependencies] -getset = "0.1.6" - [build] rustflags = ["-C", "target-cpu=native"] diff --git a/src/backend/movegen/check_decider.rs b/src/backend/movegen/check_decider.rs index 1d9af05..3aaf1e1 100644 --- a/src/backend/movegen/check_decider.rs +++ b/src/backend/movegen/check_decider.rs @@ -7,9 +7,9 @@ use crate::backend::state::piece::{ALL_PIECES, Piece, Side}; use crate::backend::state::square::Square; pub fn is_in_check_on_square(game_state: &State, color: Side, king_square: Square) -> bool { - let friendly_bb = game_state.bb_manager().get_all_pieces_bb_off(color); + let friendly_bb = game_state.bb_manager.get_all_pieces_bb_off(color); let enemy_bb = game_state - .bb_manager() + .bb_manager .get_all_pieces_bb_off(color.opposite()); // Iterate over all pieces. Let`s assume we are checking for knights. @@ -24,7 +24,7 @@ pub fn is_in_check_on_square(game_state: &State, color: Side, king_square: Squar ); // Get the bitboard that marks where enemy knights are standing. - let enemy_piece_bitboard = game_state.bb_manager().get_piece_bb(piece_type) & enemy_bb; + let enemy_piece_bitboard = game_state.bb_manager.get_piece_bb(piece_type) & enemy_bb; // Check if at least one of the places we could move to contains an enemy knight. let resulting_bitboard = attack_bitboard & enemy_piece_bitboard; @@ -72,8 +72,8 @@ pub fn is_in_check(game_state: &State, color: Side) -> bool { /// Returns the square where the king of the respective side is located. fn get_kings_square(game_state: &State, color: Side) -> Square { - let king_bitboard = game_state.bb_manager().get_piece_bb(Piece::King); - let side_bb = game_state.bb_manager().get_all_pieces_bb_off(color); + let king_bitboard = game_state.bb_manager.get_piece_bb(Piece::King); + let side_bb = game_state.bb_manager.get_all_pieces_bb_off(color); let mut bb = king_bitboard & side_bb; bb.next().unwrap() } diff --git a/src/backend/movegen/moove.rs b/src/backend/movegen/moove.rs index 7e3537b..0206c4f 100644 --- a/src/backend/movegen/moove.rs +++ b/src/backend/movegen/moove.rs @@ -1,7 +1,6 @@ use crate::backend::state::piece::Piece; use crate::backend::state::piece::Piece::{Bishop, Knight, Queen, Rook}; use crate::backend::state::square::Square; -use getset::{CloneGetters, Setters}; use std::fmt::{Display, Formatter}; #[derive(Copy, Clone)] @@ -30,14 +29,11 @@ impl CastleType { /// /// Alternatively, each Move could store a bitboard, with one bit set where we currently are and one where we are going to. /// To "make" this move we then would only need to xor it with the bitboard for the piece. -#[derive(Copy, Clone, Debug, CloneGetters, Setters, Ord, Eq, PartialEq, PartialOrd)] +#[derive(Copy, Clone, Debug, Ord, Eq, PartialEq, PartialOrd)] pub struct Moove { - #[getset(get_clone = "pub", set = "pub")] - from: Square, - #[getset(get_clone = "pub", set = "pub")] - to: Square, - #[getset(get_clone = "pub", set = "pub")] - promotion_type: Option, + pub from: Square, + pub to: Square, + pub promotion_type: Option, } impl Moove { diff --git a/src/backend/movegen/move_gen.rs b/src/backend/movegen/move_gen.rs index 06faa84..4083481 100644 --- a/src/backend/movegen/move_gen.rs +++ b/src/backend/movegen/move_gen.rs @@ -23,15 +23,15 @@ use crate::backend::state::square::Square; /// * A `Vec` containing all the computed pseudo legal moves for the current player's /// pieces. pub fn get_pseudo_legal_moves(game_state: &State) -> Vec { - let bitboard_manager = game_state.bb_manager(); + let bitboard_manager = &game_state.bb_manager; // Bitboard containing all pieces of the active color. These block moves. - let friendly_pieces_bb = bitboard_manager.get_all_pieces_bb_off(game_state.active_color()); + let friendly_pieces_bb = bitboard_manager.get_all_pieces_bb_off(game_state.active_color); // Bitboard containing all pieces of the opponent color. These are relevant for sliders and pawn captures. let enemy_pieces_bb = - bitboard_manager.get_all_pieces_bb_off(game_state.active_color().opposite()); + bitboard_manager.get_all_pieces_bb_off(game_state.active_color.opposite()); let mut all_pseudo_legal_moves = Vec::new(); - let active_color = game_state.active_color(); + let active_color = game_state.active_color; // Move gen for king and knight (excluding castles) for trivial_type in TRIVIAL_PIECES { diff --git a/src/backend/movegen/move_gen_king_util.rs b/src/backend/movegen/move_gen_king_util.rs index 562d02a..f102170 100644 --- a/src/backend/movegen/move_gen_king_util.rs +++ b/src/backend/movegen/move_gen_king_util.rs @@ -27,11 +27,11 @@ pub fn gen_castles( game_state: &State, combined_bb: BitBoard, ) { - let irreversible_data = game_state.irreversible_data(); + let irreversible_data = &game_state.irreversible_data; for castle_type in CastleType::get_all_types() { let (castling_rights, squares_the_king_moves_through, between_king_rook_bb, moove) = - get_needed_constants(irreversible_data, &castle_type, game_state.active_color()); + get_needed_constants(irreversible_data, &castle_type, game_state.active_color); gen_castle( all_pseudo_legal_moves, @@ -62,7 +62,7 @@ fn gen_castle( // are we moving through checks? for square in squares_the_king_moves_through.iter() { // if so -> stop - if is_in_check_on_square(game_state, game_state.active_color(), *square) { + if is_in_check_on_square(game_state, game_state.active_color, *square) { return; } } diff --git a/src/backend/movegen/move_gen_pawn_util.rs b/src/backend/movegen/move_gen_pawn_util.rs index 1d1f1d0..c74d876 100644 --- a/src/backend/movegen/move_gen_pawn_util.rs +++ b/src/backend/movegen/move_gen_pawn_util.rs @@ -87,7 +87,7 @@ pub fn get_double_pawn_push_moves( pub fn create_pawn_capture_mask(game_state: &State, enemy_pieces_bitboard: BitBoard) -> BitBoard { // Capture pawn moves let mut pawn_capture_mask = enemy_pieces_bitboard; - match game_state.irreversible_data().en_passant_square() { + match game_state.irreversible_data.en_passant_square { None => {} Some(ep_square) => { pawn_capture_mask.fill_square(ep_square); @@ -103,14 +103,14 @@ pub fn promotion_logic(moves: &mut Vec) { } for index in (0..moves.len()).rev() { let moove = moves[index]; - if moove.to().is_on_promotion_rank() { + if moove.to.is_on_promotion_rank() { for piece_type in PROMOTABLE_PIECES { if piece_type == Queen { - moves[index].set_promotion_type(Some(Queen)); + moves[index].promotion_type = Some(Queen); continue; } let mut moove = moove; - moove.set_promotion_type(Some(piece_type)); + moove.promotion_type = Some(piece_type); moves.push(moove); } } diff --git a/src/backend/perft.rs b/src/backend/perft.rs index 767892c..9af79cd 100644 --- a/src/backend/perft.rs +++ b/src/backend/perft.rs @@ -17,7 +17,7 @@ pub fn perft(state: &State, depth: u8) -> u64 { for chess_move in moves { let next_state = state.make_move(chess_move); // If we are in check after making the move -> skip. - if is_in_check(&next_state, next_state.active_color().opposite()) { + if is_in_check(&next_state, next_state.active_color.opposite()) { continue; } diff --git a/src/backend/state/game/fen_parser.rs b/src/backend/state/game/fen_parser.rs index 1a46049..473f610 100644 --- a/src/backend/state/game/fen_parser.rs +++ b/src/backend/state/game/fen_parser.rs @@ -45,7 +45,7 @@ pub fn parse_fen( fn parse_en_passant(irreversible_data: &mut IrreversibleData, en_passant_file_string: &str) { if en_passant_file_string == "-" { - irreversible_data.set_en_passant_square(None); + irreversible_data.en_passant_square = None; return; } @@ -53,37 +53,37 @@ fn parse_en_passant(irreversible_data: &mut IrreversibleData, en_passant_file_st for char in en_passant_file_string.chars() { match char { 'a'..='h' => { - en_passant_square.set_file(char.to_digit(36).unwrap() as i8 - 10); + en_passant_square.file = char.to_digit(36).unwrap() as i8 - 10; } '3' | '6' => { - en_passant_square.set_rank(char.to_digit(10).unwrap() as i8 - 1); + en_passant_square.rank = char.to_digit(10).unwrap() as i8 - 1; } _ => panic!("Invalid character in FEN string"), } } - irreversible_data.set_en_passant_square(Some(en_passant_square)); + irreversible_data.en_passant_square = Some(en_passant_square); } fn parse_castling_rights(irreversible_data: &mut IrreversibleData, castling_rights_string: &str) { for char in castling_rights_string.chars() { match char { '-' => { - irreversible_data.set_white_long_castle_rights(false); - irreversible_data.set_white_short_castle_rights(false); - irreversible_data.set_black_long_castle_rights(false); - irreversible_data.set_black_short_castle_rights(false); + irreversible_data.white_long_castle_rights = false; + irreversible_data.white_short_castle_rights = false; + irreversible_data.black_long_castle_rights = false; + irreversible_data.black_short_castle_rights = false; } 'K' => { - irreversible_data.set_white_short_castle_rights(true); + irreversible_data.white_short_castle_rights = true; } 'k' => { - irreversible_data.set_black_short_castle_rights(true); + irreversible_data.black_short_castle_rights = true; } 'Q' => { - irreversible_data.set_white_long_castle_rights(true); + irreversible_data.white_long_castle_rights = true; } 'q' => { - irreversible_data.set_black_long_castle_rights(true); + irreversible_data.black_long_castle_rights = true; } _ => panic!("Invalid character in FEN string"), } diff --git a/src/backend/state/game/irreversible_data.rs b/src/backend/state/game/irreversible_data.rs index e04503c..185ae22 100644 --- a/src/backend/state/game/irreversible_data.rs +++ b/src/backend/state/game/irreversible_data.rs @@ -1,24 +1,17 @@ use crate::backend::movegen::moove::CastleType; use crate::backend::state::piece::{Piece, Side}; use crate::backend::state::square::Square; -use getset::{CloneGetters, Setters}; /// The `IrreversibleData` struct stores data that is irreversible. /// For example, this remembers what kind of piece was captured for `unmake_move()`. -#[derive(CloneGetters, Setters, Debug, Clone)] +#[derive(Debug, Clone)] pub struct IrreversibleData { - #[getset(get_clone = "pub", set = "pub")] - captured_piece: Option, - #[getset(get_clone = "pub", set = "pub")] - en_passant_square: Option, - #[getset(get_clone = "pub", set = "pub")] - white_long_castle_rights: bool, - #[getset(get_clone = "pub", set = "pub")] - white_short_castle_rights: bool, - #[getset(get_clone = "pub", set = "pub")] - black_long_castle_rights: bool, - #[getset(get_clone = "pub", set = "pub")] - black_short_castle_rights: bool, + pub captured_piece: Option, + pub en_passant_square: Option, + pub white_long_castle_rights: bool, + pub white_short_castle_rights: bool, + pub black_long_castle_rights: bool, + pub black_short_castle_rights: bool, } impl IrreversibleData { diff --git a/src/backend/state/game/state.rs b/src/backend/state/game/state.rs index ee9d1f0..9fed26e 100644 --- a/src/backend/state/game/state.rs +++ b/src/backend/state/game/state.rs @@ -6,23 +6,18 @@ use crate::backend::state::game::irreversible_data::IrreversibleData; use crate::backend::state::piece::Piece::{King, Pawn, Rook}; use crate::backend::state::piece::{Piece, Side}; use crate::backend::state::square::{A1, A8, D1, D8, F1, F8, H1, H8, Square}; -use getset::{CloneGetters, Getters, MutGetters}; const ROOK_SWAP_WHITE_LONG_CASTLE_BB: BitBoard = BitBoard::new_from_squares(&[A1, D1]); const ROOK_SWAP_WHITE_SHORT_CASTLE_BB: BitBoard = BitBoard::new_from_squares(&[H1, F1]); const ROOK_SWAP_BLACK_LONG_CASTLE_BB: BitBoard = BitBoard::new_from_squares(&[A8, D8]); const ROOK_SWAP_BLACK_SHORT_CASTLE_BB: BitBoard = BitBoard::new_from_squares(&[H8, F8]); -#[derive(Debug, Getters, MutGetters, CloneGetters, Clone)] +#[derive(Debug, Clone)] pub struct State { - #[getset(get = "pub")] - bb_manager: BBManager, - #[getset(get = "pub")] - irreversible_data: IrreversibleData, - #[getset(get_clone = "pub")] - active_color: Side, - #[getset(get = "pub")] - half_move_clock: u16, + pub bb_manager: BBManager, + pub irreversible_data: IrreversibleData, + pub active_color: Side, + pub half_move_clock: u16, } impl State { @@ -70,10 +65,10 @@ impl State { let mut next_ir_data = IrreversibleData::new_from_previous_state(&self.irreversible_data); // Get the type of moved piece. - let moved_piece = self.bb_manager.get_piece_at_square(moove.from()).unwrap(); + let moved_piece = self.bb_manager.get_piece_at_square(moove.from).unwrap(); // Usually the square something was captured on (if something was captured at all) is the square we moved to... - let mut capture_square = moove.to(); + let mut capture_square = moove.to; if moved_piece == Pawn { // ... unless this is an en passant capture, we then need to update the capture square. next_state.make_move_ep_capture(moove, &mut capture_square); @@ -88,26 +83,26 @@ impl State { let mut moved_piece_bitboard = next_state.bb_manager.get_piece_bb_mut(moved_piece); // Clear the square that the piece was moved from. - moved_piece_bitboard.clear_square(moove.from()); + moved_piece_bitboard.clear_square(moove.from); // Update the moved piece bb if it was a pawn promotion - match moove.promotion_type() { + match moove.promotion_type { None => {} Some(promotion_type) => { moved_piece_bitboard = next_state.bb_manager.get_piece_bb_mut(promotion_type); } } // Fill the square it moved to. - moved_piece_bitboard.fill_square(moove.to()); + moved_piece_bitboard.fill_square(moove.to); next_state .bb_manager .get_all_pieces_bb_off_mut(self.active_color) - .fill_square(moove.to()); + .fill_square(moove.to); next_state .bb_manager .get_all_pieces_bb_off_mut(self.active_color) - .clear_square(moove.from()); + .clear_square(moove.from); // Some special king handling if moved_piece == King { @@ -117,7 +112,7 @@ impl State { next_state.make_move_castling_rights_on_rook_move_or_capture( &mut next_ir_data, moved_piece, - moove.from(), + moove.from, self.active_color, ); @@ -128,15 +123,15 @@ impl State { } fn make_move_ep_capture(&mut self, moove: Moove, capture_square: &mut Square) { - let ep_square = self.irreversible_data.en_passant_square(); + let ep_square = self.irreversible_data.en_passant_square; // if an en passant square exists if let Some(ep_square) = ep_square // and if we moved to the ep_square - && ep_square == moove.to() + && ep_square == moove.to { // update the captured square to the ep_square - offset - *capture_square = moove.to().back_by_one(self.active_color); + *capture_square = moove.to.back_by_one(self.active_color); } } @@ -150,7 +145,7 @@ impl State { // Clear the square on the captured piece's bitboard if it exists. if let Some(captured_piece) = captured_piece { // Store the captured piece type in the irreversible data. - irreversible_data.set_captured_piece(Some(captured_piece)); + irreversible_data.captured_piece = Some(captured_piece); // Remove the captured piece from its bitboard. let captured_piece_bitboard = self.bb_manager.get_piece_bb_mut(captured_piece); captured_piece_bitboard.clear_square(capture_square); @@ -175,9 +170,9 @@ impl State { ) { if moove.is_double_pawn_push() { // the pawn starting square and one forward - let ep_square = moove.to().back_by_one(self.active_color); + let ep_square = moove.to.back_by_one(self.active_color); - irreversible_data.set_en_passant_square(Some(ep_square)); + irreversible_data.en_passant_square = Some(ep_square); } } diff --git a/src/backend/state/square.rs b/src/backend/state/square.rs index 069ee9d..ee2f354 100644 --- a/src/backend/state/square.rs +++ b/src/backend/state/square.rs @@ -1,5 +1,4 @@ use crate::backend::state::piece::Side; -use getset::Setters; use std::fmt::{Display, Formatter}; pub const A1: Square = Square::new(0, 0); @@ -25,12 +24,10 @@ pub const H8: Square = Square::new(7, 7); /// /// To make it easier to memorize: file => the letter part, rank => the number part /// or put differently: file => vertical / x part, rank => horizontal / y part -#[derive(Copy, Clone, Debug, Setters, Ord, Eq, PartialEq, PartialOrd)] +#[derive(Copy, Clone, Debug, Ord, Eq, PartialEq, PartialOrd)] pub struct Square { - #[getset(set = "pub")] - file: i8, - #[getset(set = "pub")] - rank: i8, + pub file: i8, + pub rank: i8, } impl Square { diff --git a/src/main.rs b/src/main.rs index b73125e..295a553 100644 --- a/src/main.rs +++ b/src/main.rs @@ -53,7 +53,7 @@ pub fn root_debug_perft(root_state: &mut State, depth: u8) -> u64 { for chess_move in moves { let state = root_state.make_move(chess_move); // If we are in check after making the move -> skip. - if is_in_check(&state, state.active_color().opposite()) { + if is_in_check(&state, state.active_color.opposite()) { // game_state.unmake_move(chess_move); continue; }