Rev 96 | Rev 169 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 96 | Rev 154 | ||
---|---|---|---|
Line 20... | Line 20... | ||
20 | 20 | ||
21 | #include <algorithm> |
21 | #include <algorithm> |
22 | #include <cassert> |
22 | #include <cassert> |
23 | 23 | ||
24 | #include "bitboard.h" |
24 | #include "bitboard.h" |
25 | #include "bitcount.h" |
- | |
26 | #include "endgame.h" |
25 | #include "endgame.h" |
27 | #include "movegen.h" |
26 | #include "movegen.h" |
28 | 27 | ||
29 | using std::string; |
28 | using std::string; |
30 | 29 | ||
Line 98... | Line 97... | ||
98 | std::transform(sides[c].begin(), sides[c].end(), sides[c].begin(), tolower); |
97 | std::transform(sides[c].begin(), sides[c].end(), sides[c].begin(), tolower); |
99 | 98 | ||
100 | string fen = sides[0] + char(8 - sides[0].length() + '0') + "/8/8/8/8/8/8/" |
99 | string fen = sides[0] + char(8 - sides[0].length() + '0') + "/8/8/8/8/8/8/" |
101 | + sides[1] + char(8 - sides[1].length() + '0') + " w - - 0 10"; |
100 | + sides[1] + char(8 - sides[1].length() + '0') + " w - - 0 10"; |
102 | 101 | ||
- | 102 | StateInfo st; |
|
103 | return Position(fen, |
103 | return Position().set(fen, false, &st, nullptr).material_key(); |
104 | } |
104 | } |
105 | 105 | ||
106 | } // namespace |
106 | } // namespace |
107 | 107 | ||
108 | 108 | ||
Line 257... | Line 257... | ||
257 | && rank_of(wksq) >= RANK_4 |
257 | && rank_of(wksq) >= RANK_4 |
258 | && distance(wksq, psq) > 2 + (pos.side_to_move() == strongSide)) |
258 | && distance(wksq, psq) > 2 + (pos.side_to_move() == strongSide)) |
259 | result = Value(80) - 8 * distance(wksq, psq); |
259 | result = Value(80) - 8 * distance(wksq, psq); |
260 | 260 | ||
261 | else |
261 | else |
262 | result = Value(200) - 8 * ( distance(wksq, psq + |
262 | result = Value(200) - 8 * ( distance(wksq, psq + SOUTH) |
263 | - distance(bksq, psq + |
263 | - distance(bksq, psq + SOUTH) |
264 | - distance(psq, queeningSq)); |
264 | - distance(psq, queeningSq)); |
265 | 265 | ||
266 | return strongSide == pos.side_to_move() ? result : -result; |
266 | return strongSide == pos.side_to_move() ? result : -result; |
267 | } |
267 | } |
268 | 268 | ||
Line 494... | Line 494... | ||
494 | return SCALE_FACTOR_DRAW; |
494 | return SCALE_FACTOR_DRAW; |
495 | 495 | ||
496 | // If the defending king blocks the pawn and the attacking king is too far |
496 | // If the defending king blocks the pawn and the attacking king is too far |
497 | // away, it's a draw. |
497 | // away, it's a draw. |
498 | if ( r <= RANK_5 |
498 | if ( r <= RANK_5 |
499 | && bksq == wpsq + |
499 | && bksq == wpsq + NORTH |
500 | && distance(wksq, wpsq) - tempo >= 2 |
500 | && distance(wksq, wpsq) - tempo >= 2 |
501 | && distance(wksq, brsq) - tempo >= 2) |
501 | && distance(wksq, brsq) - tempo >= 2) |
502 | return SCALE_FACTOR_DRAW; |
502 | return SCALE_FACTOR_DRAW; |
503 | 503 | ||
504 | // Pawn on the 7th rank supported by the rook from behind usually wins if the |
504 | // Pawn on the 7th rank supported by the rook from behind usually wins if the |
Line 515... | Line 515... | ||
515 | // Similar to the above, but with the pawn further back |
515 | // Similar to the above, but with the pawn further back |
516 | if ( f != FILE_A |
516 | if ( f != FILE_A |
517 | && file_of(wrsq) == f |
517 | && file_of(wrsq) == f |
518 | && wrsq < wpsq |
518 | && wrsq < wpsq |
519 | && (distance(wksq, queeningSq) < distance(bksq, queeningSq) - 2 + tempo) |
519 | && (distance(wksq, queeningSq) < distance(bksq, queeningSq) - 2 + tempo) |
520 | && (distance(wksq, wpsq + |
520 | && (distance(wksq, wpsq + NORTH) < distance(bksq, wpsq + NORTH) - 2 + tempo) |
521 | && ( distance(bksq, wrsq) + tempo >= 3 |
521 | && ( distance(bksq, wrsq) + tempo >= 3 |
522 | || ( distance(wksq, queeningSq) < distance(bksq, wrsq) + tempo |
522 | || ( distance(wksq, queeningSq) < distance(bksq, wrsq) + tempo |
523 | && (distance(wksq, wpsq + |
523 | && (distance(wksq, wpsq + NORTH) < distance(bksq, wrsq) + tempo)))) |
524 | return ScaleFactor( SCALE_FACTOR_MAX |
524 | return ScaleFactor( SCALE_FACTOR_MAX |
525 | - 8 * distance(wpsq, queeningSq) |
525 | - 8 * distance(wpsq, queeningSq) |
526 | - 2 * distance(wksq, queeningSq)); |
526 | - 2 * distance(wksq, queeningSq)); |
527 | 527 | ||
528 | // If the pawn is not far advanced and the defending king is somewhere in |
528 | // If the pawn is not far advanced and the defending king is somewhere in |