|
@@ -158,27 +158,33 @@ fn castling_rights(game: &Game, side: Side) -> PosValue {
|
|
|
|
|
|
fn king_safety(game: &Game, side: Side) -> PosValue {
|
|
fn king_safety(game: &Game, side: Side) -> PosValue {
|
|
let king = game.get_piece(KING, side);
|
|
let king = game.get_piece(KING, side);
|
|
- let area = north_one(king)
|
|
|
|
- | south_one(king)
|
|
|
|
- | northeast_one(king)
|
|
|
|
- | northwest_one(king)
|
|
|
|
- | southwest_one(king)
|
|
|
|
- | southeast_one(king);
|
|
|
|
|
|
+ let king_leftright = west_one(king) | king | east_one(king);
|
|
|
|
+ let area = north_one(king_leftright) | king_leftright | south_one(king_leftright);
|
|
|
|
|
|
let guards = game.get_all_side(side) & area;
|
|
let guards = game.get_all_side(side) & area;
|
|
let attackers = game.get_all_side(!side) & area;
|
|
let attackers = game.get_all_side(!side) & area;
|
|
|
|
|
|
- let backrow = if king & (ROW_1 | ROW_8) != 0 { 50 } else { 0 };
|
|
|
|
|
|
+ let backrow = if king & ((ROW_1 | ROW_8) & !(FILE_D | FILE_E)) != 0 { 20 } else { 0 };
|
|
|
|
+ let pawn_shield_mask = north_one(king_leftright) | north_one(north_one(king_leftright));
|
|
|
|
+ let pawn_shield = ((pawn_shield_mask & game.pawns(side)).count_ones() * 8) as PosValue;
|
|
|
|
|
|
- let kneighbors = guards.count_ones() as PosValue * 8 - attackers.count_ones() as PosValue * 15;
|
|
|
|
|
|
+ let kneighbors = guards.count_ones() as PosValue * 3 - attackers.count_ones() as PosValue * 12;
|
|
|
|
|
|
let enemies = game.get_all_side(!side);
|
|
let enemies = game.get_all_side(!side);
|
|
|
|
|
|
- let row_opponents = enemies & (populate_rows(king));
|
|
|
|
- let dang_row_opponents = row_opponents & (ROW_1 | ROW_2 | ROW_7 | ROW_8);
|
|
|
|
- let danger_value = (dang_row_opponents.count_ones() * 50) as PosValue;
|
|
|
|
|
|
+ if king != 0 {
|
|
|
|
+ let diag_rays = generate_sliding_destinations(king, 0, king, false, true);
|
|
|
|
+ let straight_rays = generate_sliding_destinations(0, 0, king, true, false);
|
|
|
|
|
|
- return kneighbors + danger_value + backrow;
|
|
|
|
|
|
+ let bishops_in_rays = diag_rays & game.bishops(!side);
|
|
|
|
+ let rooks_in_rays = straight_rays & game.rooks(!side);
|
|
|
|
+ let queens_in_rays = (straight_rays | diag_rays) & game.queens(!side);
|
|
|
|
+ let possible_pin_score = (bishops_in_rays | rooks_in_rays | queens_in_rays).count_ones() as PosValue * -4;
|
|
|
|
+ return kneighbors + possible_pin_score + backrow + pawn_shield;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ return kneighbors + backrow + pawn_shield;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
fn king_there(game: &Game, side: Side) -> PosValue {
|
|
fn king_there(game: &Game, side: Side) -> PosValue {
|