|
@@ -310,24 +310,34 @@ pub fn generate_legal_moves_old(game: &mut Game, side: Side) -> Vec<Move> {
|
|
moves.into_iter().filter(check_legality).collect::<Vec<Move>>()
|
|
moves.into_iter().filter(check_legality).collect::<Vec<Move>>()
|
|
}
|
|
}
|
|
|
|
|
|
-fn generate_all_slides(origin: Bitboard) -> Bitboard {
|
|
|
|
- let mut result = populate_files(origin) | populate_rows(origin);
|
|
|
|
-
|
|
|
|
- let mut ne = origin;
|
|
|
|
- let mut se = origin;
|
|
|
|
- let mut nw = origin;
|
|
|
|
- let mut sw = origin;
|
|
|
|
- for _ in 1..7 {
|
|
|
|
- result |= ne;
|
|
|
|
- result |= se;
|
|
|
|
- result |= nw;
|
|
|
|
- result |= sw;
|
|
|
|
- ne = northeast_one(ne);
|
|
|
|
- se = southeast_one(se);
|
|
|
|
- nw = northwest_one(nw);
|
|
|
|
- sw = southwest_one(sw);
|
|
|
|
- }
|
|
|
|
- return result;
|
|
|
|
|
|
+fn possibly_pinned_pieces(king: Bitboard, friends: Bitboard, enemies: Bitboard) -> Bitboard {
|
|
|
|
+ let check_ray = |ray_func: fn(Bitboard) -> Bitboard| -> Bitboard {
|
|
|
|
+ let mut pos = king;
|
|
|
|
+ let mut ray = king;
|
|
|
|
+ let mut one_friend = false;
|
|
|
|
+ for _ in 0..7 {
|
|
|
|
+ pos = ray_func(pos);
|
|
|
|
+ if pos & friends != 0 && !one_friend {
|
|
|
|
+ one_friend = true;
|
|
|
|
+ } else if pos & friends != 0 && one_friend {
|
|
|
|
+ return 0;
|
|
|
|
+ } else if pos & enemies != 0 && one_friend {
|
|
|
|
+ return ray;
|
|
|
|
+ }
|
|
|
|
+ ray |= pos;
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ return
|
|
|
|
+ check_ray(north_one)
|
|
|
|
+ | check_ray(south_one)
|
|
|
|
+ | check_ray(east_one)
|
|
|
|
+ | check_ray(west_one)
|
|
|
|
+ | check_ray(northeast_one)
|
|
|
|
+ | check_ray(northwest_one)
|
|
|
|
+ | check_ray(southeast_one)
|
|
|
|
+ | check_ray(southwest_one);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -341,7 +351,7 @@ pub fn generate_legal_moves(game: &mut Game, side: Side, captures_only: bool) ->
|
|
|
|
|
|
let check = is_check(game, side);
|
|
let check = is_check(game, side);
|
|
let king = game.kings(side);
|
|
let king = game.kings(side);
|
|
- let possible_pins = generate_all_slides(king);
|
|
|
|
|
|
+ let possible_pins = possibly_pinned_pieces(king, game.get_all_side(side), game.get_all_side(!side));
|
|
|
|
|
|
let check_legality = |m: &Move| {
|
|
let check_legality = |m: &Move| {
|
|
if !check {
|
|
if !check {
|
|
@@ -352,6 +362,11 @@ pub fn generate_legal_moves(game: &mut Game, side: Side, captures_only: bool) ->
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
+ Move::Promotion { mov, promote_to: _, captured: _ } => {
|
|
|
|
+ if from_square(mov.from) & possible_pins == 0 {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
_ => {}
|
|
_ => {}
|
|
}
|
|
}
|
|
}
|
|
}
|