-
- // Penalize rooks which are trapped inside a king. Penalize more if
- // king has lost right to castle
- if (mob > 6 || ei.pi->file_is_half_open(us, f))
- return;
-
- Square ksq = p.king_square(us);
-
- if ( square_file(ksq) >= FILE_E
- && square_file(s) > square_file(ksq)
- && (relative_rank(us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s)))
- {
- // Is there a half-open file between the king and the edge of the board?
- if (!ei.pi->has_open_file_to_right(us, square_file(ksq)))
- ei.mgValue -= p.can_castle(us)? Sign[us] * ((TrappedRookPenalty - mob * 16) / 2)
- : Sign[us] * (TrappedRookPenalty - mob * 16);
- }
- else if ( square_file(ksq) <= FILE_D
- && square_file(s) < square_file(ksq)
- && (relative_rank(us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s)))
- {
- // Is there a half-open file between the king and the edge of the board?
- if (!ei.pi->has_open_file_to_left(us, square_file(ksq)))
- ei.mgValue -= p.can_castle(us)? Sign[us] * ((TrappedRookPenalty - mob * 16) / 2)
- : Sign[us] * (TrappedRookPenalty - mob * 16);
- }
- }
-
-
- // evaluate_queen() assigns bonuses and penalties to a queen of a given
- // color on a given square.
-
- void evaluate_queen(const Position &p, Square s, Color us, EvalInfo &ei) {
-
- Bitboard b = p.piece_attacks<QUEEN>(s);
- ei.attackedBy[us][QUEEN] |= b;
-
- // King attack and mobility
- evaluate_common(p, b, us, ei, QueenAttackWeight, MidgameQueenMobilityBonus,
- EndgameQueenMobilityBonus);
-
- // Queen on 7th rank
- Color them = opposite_color(us);
-
- if ( relative_rank(us, s) == RANK_7
- && relative_rank(us, p.king_square(them)) == RANK_8)
- {
- ei.mgValue += Sign[us] * MidgameQueenOn7thBonus;
- ei.egValue += Sign[us] * EndgameQueenOn7thBonus;
- }