I have been undecided upon how to fashion the evaluation. I did not want to merely repeat what was done in RomiChess. I wanted to underpin it with a concept that did not rely on arbitrary rules of thumb like bonusing a knight just because it is in the center. I wanted something that the rest of the eval could be crafted around to support and strengthen the foundational concept. For example I don't want to write pawn push code just for the sake of pushing pawns. I really do not have the words to convey my thinking but I think that the following code and sample game might make it more clear.
I remembered something that David Bronstein once wrote in one of his books. Paraphrased, 'The key to making strong moves is to not put pieces on squares in which they can be advantageously attacked in one turn'. In the following code only second move mobility is counted for non attacked squares. If the first move's to-square is attacked the second move mobility from that square is not counted. Once there is a SEE function I will modify that to use the SEE function. The code is just the basic idea and nothing more. It is the foundation that I want to build upon.
Code: Select all
void InitSearch(Thread* t) {
u64 bb, cc, b, a, pieces, allPieces;
u32 sq;
s32 i, col, cenCol, row, cenRow;
SplitBB blocks;
allPieces = piece[WHITE] | piece[BLACK];
for (i = A1; i <= H8; i++) {
col = i & 7;
row = i >> 3;
cenCol = col < 4 ? col : 7 - col;
cenRow = row < 4 ? row : 7 - row;
// white pawns
wpPST[i] = 0;
// black pawns
bpPST[i] = 0;
// white knights
wnPST[i] = 0;
bb = knightMoves[i] & ~piece[WHITE];
while (bb) {
_BitScanForward64(&sq, bb);
bb ^= one << sq;
if (!AtkByBlack(t, one << sq)) {
cc = knightMoves[sq] & ~piece[WHITE];
while (cc) {
_BitScanForward64(&sq, cc);
cc ^= one << sq;
wnPST[i] += (1 - AtkByBlack(t, one << sq));
}
}
}
// black knights
bnPST[i] = 0;
bb = knightMoves[i] & ~piece[BLACK];
while (bb) {
_BitScanForward64(&sq, bb);
bb ^= one << sq;
if (!AtkByWhite(t, one << sq)) {
cc = knightMoves[sq] & ~piece[BLACK];
while (cc) {
_BitScanForward64(&sq, cc);
cc ^= one << sq;
bnPST[i] += (1 - AtkByWhite(t, one << sq));
}
}
}
// bishops
blocks.bb = allPieces & b7e[i];
blocks.bb = ((blocks.l32 >> 8) | blocks.h32);
bb = bss[i][blocks.r1][0]
& bss[i][blocks.r2][1]
& bss[i][blocks.r3][2];
// white bishops
wbPST[i] = 0;
b = bb & ~piece[WHITE];
while (b) {
_BitScanForward64(&sq, b);
b ^= one << sq;
if (!AtkByBlack(t, one << sq)) {
blocks.bb = allPieces & b7e[sq];
blocks.bb = ((blocks.l32 >> 8) | blocks.h32);
cc = bss[sq][blocks.r1][0]
& bss[sq][blocks.r2][1]
& bss[sq][blocks.r3][2]
& ~piece[WHITE];
while (cc) {
_BitScanForward64(&sq, cc);
cc ^= one << sq;
wbPST[i] += (1 - AtkByBlack(t, one << sq));
}
}
}
// black bishops
bbPST[i] = 0;
b = bb & ~piece[BLACK];
while (b) {
_BitScanForward64(&sq, b);
b ^= one << sq;
if (!AtkByWhite(t, one << sq)) {
blocks.bb = allPieces & b7e[sq];
blocks.bb = ((blocks.l32 >> 8) | blocks.h32);
cc = bss[sq][blocks.r1][0]
& bss[sq][blocks.r2][1]
& bss[sq][blocks.r3][2]
& ~piece[BLACK];
while (cc) {
_BitScanForward64(&sq, cc);
cc ^= one << sq;
bbPST[i] += (1 - AtkByWhite(t, one << sq));
}
}
}
// rooks
blocks.bb = allPieces & rob[i];
bb = qss[i][(blocks.bb >> (i & 56)) & 127][0]
& qss[i][blocks.r2][1]
& qss[i][blocks.r3][2]
& qss[i][blocks.r4][3]
& qss[i][blocks.r5][4]
& qss[i][blocks.r6][5]
& qss[i][blocks.r7][6]
& rob[i];
// white rooks
wrPST[i] = 0;
b = bb & ~piece[WHITE];
while (b) {
_BitScanForward64(&sq, b);
b ^= one << sq;
if (!AtkByBlack(t, one << sq)) {
blocks.bb = allPieces & rob[sq];
cc = qss[sq][(blocks.bb >> (i & 56)) & 127][0]
& qss[sq][blocks.r2][1]
& qss[sq][blocks.r3][2]
& qss[sq][blocks.r4][3]
& qss[sq][blocks.r5][4]
& qss[sq][blocks.r6][5]
& qss[sq][blocks.r7][6]
& rob[sq]
& ~piece[WHITE];
while (cc) {
_BitScanForward64(&sq, cc);
cc ^= one << sq;
wrPST[i] += (1 - AtkByBlack(t, one << sq));
}
}
}
// black rooks
brPST[i] = 0;
b = bb & ~piece[BLACK];
while (b) {
_BitScanForward64(&sq, b);
b ^= one << sq;
if (!AtkByWhite(t, one << sq)) {
blocks.bb = allPieces & rob[sq];
cc = qss[sq][(blocks.bb >> (i & 56)) & 127][0]
& qss[sq][blocks.r2][1]
& qss[sq][blocks.r3][2]
& qss[sq][blocks.r4][3]
& qss[sq][blocks.r5][4]
& qss[sq][blocks.r6][5]
& qss[sq][blocks.r7][6]
& rob[sq]
& ~piece[BLACK];
while (cc) {
_BitScanForward64(&sq, cc);
cc ^= one << sq;
brPST[i] += (1 - AtkByWhite(t, one << sq));
}
}
}
// queens
blocks.bb = allPieces & rob[i];
bb = qss[i][(blocks.bb >> (i & 56)) & 127][0]
& qss[i][blocks.r2][1]
& qss[i][blocks.r3][2]
& qss[i][blocks.r4][3]
& qss[i][blocks.r5][4]
& qss[i][blocks.r6][5]
& qss[i][blocks.r7][6];
// white queens
wqPST[i] = 0;
b = bb & ~piece[WHITE];
while (b) {
_BitScanForward64(&sq, b);
b ^= one << sq;
if (!AtkByBlack(t, one << sq)) {
blocks.bb = allPieces & (rob[sq] | bob[sq]);
cc = qss[sq][(blocks.bb >> (i & 56)) & 127][0]
& qss[sq][blocks.r2][1]
& qss[sq][blocks.r3][2]
& qss[sq][blocks.r4][3]
& qss[sq][blocks.r5][4]
& qss[sq][blocks.r6][5]
& qss[sq][blocks.r7][6]
& ~piece[WHITE];
while (cc) {
_BitScanForward64(&sq, cc);
cc ^= one << sq;
wqPST[i] += (1 - AtkByBlack(t, one << sq));
}
}
}
// black queens
bqPST[i] = 0;
b = bb & ~piece[BLACK];
while (b) {
_BitScanForward64(&sq, b);
b ^= one << sq;
if (!AtkByWhite(t, one << sq)) {
blocks.bb = allPieces & (rob[sq] | bob[sq]);
cc = qss[sq][(blocks.bb >> (i & 56)) & 127][0]
& qss[sq][blocks.r2][1]
& qss[sq][blocks.r3][2]
& qss[sq][blocks.r4][3]
& qss[sq][blocks.r5][4]
& qss[sq][blocks.r6][5]
& qss[sq][blocks.r7][6]
& ~piece[BLACK];
while (cc) {
_BitScanForward64(&sq, cc);
cc ^= one << sq;
bqPST[i] += (1 - AtkByWhite(t, one << sq));
}
}
}
// white king
wkPST[i] = ((2000 - mat[BLACK]) / 200) * cenCol * cenRow;
// black king
bkPST[i] = ((2000 - mat[WHITE]) / 200) * cenCol * cenRow;
}
pos[WHITE] = 0;
pos[BLACK] = 0;
mat[WHITE] = 0;
mat[BLACK] = 0;
pieces = piece[WHITE];
while (pieces) {
_BitScanForward64(&sq, pieces);
pieces ^= one << sq;
mat[WHITE] += value[board[sq]];
pos[WHITE] += pcePST[board[sq]][sq];
}
pieces = piece[BLACK];
while (pieces) {
_BitScanForward64(&sq, pieces);
pieces ^= one << sq;
mat[BLACK] += value[board[sq]];
pos[BLACK] += pcePST[board[sq]][sq];
}
}
[pgn][Event "Computer chess game"]
[Site "DESKTOP-HFVHK2B"]
[Date "2021.05.13"]
[Round "?"]
[White "Bricabrac"]
[Black "Bricabrac"]
[Result "1/2-1/2"]
[BlackElo "2000"]
[ECO "A00"]
[Opening "Van Kruij's Opening"]
[Time "13:02:35"]
[WhiteElo "2000"]
[TimeControl "0+30"]
[Termination "normal"]
[PlyCount "153"]
[WhiteType "program"]
[BlackType "program"]
1. e3 {(e2e3 d7d5 d1f3 d8d6 f1e2 c8d7 b1c3 g8f6) 0.00/8 29} d5 {(d7d5 d1h5
d8d6 b1c3 g8f6 h5g5 h7h6 f1b5) -0.74/8 29} 2. c4 {(c2c4 d8d6 c4d5 d6d5 d1a4
b8d7 a4c4 d5c6) -0.03/8 29} e6 {(e7e6 d1a4 c7c6 c4d5 e6d5 e3e4 d8d6 e4d5)
+0.29/8 29} 3. b3 {(b2b3 g8e7 c1b2 a7a5 b1c3 d5c4 f1c4 a8a7) -0.25/8 29} a6
{(a7a6 c1b2 a8a7 f1e2 g8e7 b1c3 d5c4 b3c4) +0.27/8 29} 4. Bb2 {(c1b2 g8e7
f1e2 d5c4 b3c4 h7h6 b1c3 h8h7) -0.29/8 29} dxc4 {(d5c4 f1c4 g8e7 b1c3 h7h6
c3e2 h8h7) +0.07/7 29} 5. bxc4 {(b3c4 d8g5 f2f4 g5f5 b2e5 e8d8 f1e2)
-0.30/7 29} a5 {(a6a5 b1c3 c8d7 a1c1 a8a6 c4c5 a6c6 c3e2) +0.09/8 29} 6. d4
{(d2d4 g8e7 c4c5 c8d7 b1c3 d7c6 g1e2) -0.09/7 29} b6 {(b7b6 g1e2 a8a6 b1c3
f8e7 a1c1 c8b7 c1c2) -0.15/8 29} 7. Nc3 {(b1c3 c8b7 a1c1 h7h5 g1e2 h8h6
c1c2 f8e7) +0.23/8 29} Bb7 {(c8b7 h2h3 f8d6 a1c1 e8f8 g1e2 d6e7) -0.24/7
29} 8. h3 {(h2h3 g8e7 h1h2 b8c6 g1e2 f7f5 a1c1) +0.04/7 29} Ne7 {(g8e7 g1e2
h7h5 e2f4 h5h4 c3e2 h8h6) +0.05/7 29} 9. Rb1 {(a1b1 c7c5 b2c1 c5d4 e3d4
b8c6 c1e3) +0.30/7 29} Nf5 {(e7f5 g1e2 f8e7 b1c1 f5d6 c4c5 d6f5) -0.15/7
29} 10. Nf3 {(g1f3 f8e7 b1c1 b8c6 c3e2 e8g8 c1c2) -0.10/7 29} Nc6 {(b8c6
c3e2 f5e7 b1c1 h7h5 c1c3 h8h6) +0.01/7 29} 11. Bc1 {(b2c1 h7h5 b1b2 h8h7
c3e2 f5e7 a2a3) +0.07/7 29} h5 {(h7h5 d1b3 h8h6 b1b2 h5h4 b3c2 f5e7)
-0.15/7 29} 12. a3 {(a2a3 f7f6 d1c2 f5e7 b1b2 e6e5 d4e5) +0.14/7 29} f6
{(f7f6 d1c2 g7g6 f1d3 h8h6 d4d5 e6d5) -0.25/7 29} 13. Qa4 {(d1a4 f8b4 a4c2
b4c3 c2c3 e8f8 c3c2) +0.35/7 29} Bb4 {(f8b4 a3b4 a5b4 a4c2 b4c3 d4d5 c6e7)
-0.43/7 29} 14. axb4 {(a3b4 a5b4 a4c2 b4c3 d4d5 c6e7 d5e6) +0.31/7 29} axb4
{(a5b4 a4c2 b4c3 d4d5 c6e7 d5e6 d8d6) -0.35/7 29} 15. Qc2 {(a4c2 b4c3 c2c3
a8a2 c1b2 d8e7 c3c2) +0.34/7 29} bxc3 {(b4c3 d4d5 c6e7 d5e6 d8d6 b1b3 d6e6)
+0.09/7 29} 16. Ng1 {(f3g1 d8e7 c2c3 a8a2 c4c5 e7d8 g1e2) -0.10/7 29} Na5
{(c6a5 c2c3 f5d6 c4c5 b6c5 d4c5 d6f5) +0.16/7 30} 17. Qxc3 {(c2c3 g7g5 g1e2
d8e7 c4c5 b6c5 d4c5) -0.03/7 29} Qe7 {(d8e7 b1b2 g7g6 c3c2 e7g7 c4c5 b6c5)
-0.21/7 29} 18. Qc2 {(c3c2 f5d6 f2f3 b7a6 c4c5 a6f1 e1f1) +0.10/7 29} Kd8
{(e8d8 g1e2 e7e8 c4c5 b6c5 c1d2 f5d6) -0.02/7 29} 19. Ne2 {(g1e2 g7g5 c4c5
b6c5 d4c5 b7c6 c1b2) +0.05/7 29} Nh4 {(f5h4 h1g1 b7c6 c1d2 h4f5 d2b4 f5d6)
+0.07/7 29} 20. Rg1 {(h1g1 b7c6 e3e4 f6f5 f2f3 f5e4 f3e4) +0.06/7 29} Bc6
{(b7c6 e3e4 a5b7 e2c3 b7d6 c1b2 h4g6) -0.04/7 30} 21. c5 {(c4c5 b6c5 d4c5
h4f5 b1a1 d8c8 a1a3) 0.00/7 29} bxc5 {(b6c5 d4c5 d8e8 c2c3 e7d8 b1a1 a5b7)
-0.19/7 29} 22. dxc5 {(d4c5 a5b7 b1b4 h4f5 e3e4 f5h6 b4d4) +0.13/7 29} Nb7
{(a5b7 c2c4 a8a4 c4c3 d8c8 g2g3 h4f3) -0.43/7 29} 23. Qc4 {(c2c4 h4f5 e3e4
f5h6 e2d4 d8d7 d4c6 d7c6) +0.71/8 29} f5 {(f6f5 b1b4 h4g6 e2d4 d8d7 d4c6
d7c6) -0.56/7 29} 24. Nd4 {(e2d4 c6e4 d4e6 d8d7 c5c6 e4c6 e6g7 e7g7)
+0.99/8 29} Be4 {(c6e4 d4e6 d8c8 b1b2 c7c6 b2b4 h8h6 c4b3) -0.31/8 29} 25.
Nxe6+ {(d4e6 d8c8 b1b5 c7c6 b5b4 h8h6 c4b3) +0.22/7 29} Kc8 {(d8c8 b1b2
h8h6 f2f3 e7e6 f3e4 e6c4 f1c4 b7c5) -0.30/9 29} 26. Rb4 {(b1b4 h8h6 e6d4
e7c5 c4c5 b7c5 c1b2) +0.32/7 29} Rh6 {(h8h6 e6f4 e7c5 c1b2 c5c4 f1c4 g7g5)
-0.17/7 29} 27. Nf4 {(e6f4 e7c5 c1b2 c5c4 f1c4 g7g5 b2g7) +0.17/7 29} Qxc5
{(e7c5 c4c5 b7c5 c1b2 h6h7 f4e2 c5d7) -0.06/7 29} 28. Qxc5 {(c4c5 b7c5 c1b2
g7g5 b2g7 h6h7 g7d4) +0.02/7 29} Nxc5 {(b7c5 c1b2 g7g5 b4c4 g5f4 c4c5 f4e3
f2e3) -0.35/8 29} 29. Bb2 {(c1b2 g7g5 b2g7 h6h7 g7f6 g5f4 f6h4 f4e3)
+0.12/8 29} g5 {(g7g5 b4c4 g5f4 c4c5 h6g6 e3f4 h4g2 f1g2) -0.23/8 29} 30.
Rc4 {(b4c4 h6b6 b2c1 g5f4 c4c5 b6g6 e3f4 h4g2) +0.20/8 29} Rb6 {(h6b6 c4c5
b6b2 f4e2 b2b6 f2f4 g5f4 e3f4) +0.62/8 29} 31. Rxc5 {(c4c5 b6b2 f4e2 a8a1
e2c1 b2b6 f2f4 g5f4) -0.43/8 30} Rxb2 {(b6b2 f4e2 a8a1 e2c1 e4c2 e1d2 c2b3
d2e1) +0.16/8 30} 32. Ne2 {(f4e2 a8a1 e2c1 c8b7 f2f3 b7b6 c5c4 e4d5)
-0.65/8 29} Ra1+ {(a8a1 e2c1 c7c6 c5c3 e4d5 f2f3 b2b6 f1c4) +1.26/8 29} 33.
Nc1 {(e2c1 c8d7 c5c4 e4d5 c4c3 b2b6 e1d1 g5g4 c3c5) -1.51/9 29} Kd7 {(c8d7
c5c4 e4d5 c4c3 b2b6 e1d2 d7d6 c1d3) +0.77/8 29} 34. Rc4 {(c5c4 b2b8 e1d1
a1a8 f1e2 e4b7 c4d4 d7e6) -1.33/8 29} Bd5 {(e4d5 c4c3 b2b8 f2f3 a1a8 f1c4
c7c6 c4d5) +1.71/8 29} 35. Rc3 {(c4c3 d7d6 f1c4 d5g2 c4e2 b2b8 e2h5 a1a8)
-1.59/8 29} Rb8 {(b2b8 c3c2 a1a8 c2d2 d7c6 f2f4 g5f4 e3f4) +1.49/8 29} 36.
Kd1 {(e1d1 d7c8 f1d3 c8b7 d3f1 d5f7 f1c4 f7g6) -0.93/8 29} c6 {(c7c6 c3d3
d7e6 f2f4 g5f4 e3f4 h4g6 g2g3) +0.98/8 29} 37. Bd3 {(f1d3 d7e6 d3c4 h4g6
c4d5 c6d5 g2g4 f5g4) -0.97/8 29} Ke7 {(d7e7 g2g3 h4f3 g1f1 e7e6 d3e2 g5g4
h3g4) +0.83/8 29} 38. f3 {(f2f3 e7d6 d3c4 d5c4 c3c4 a1a7 f3f4 g5f4) -0.87/8
29} Kd6 {(e7d6 d3c4 h4g6 c4d5 c6d5 c3c2 a1a7 c2a2) +0.75/8 29} 39. e4
{(e3e4 d5e6 d3c2 f5e4 c2e4 a1a6 g2g4 h5g4) -1.02/8 29} fxe4 {(f5e4 f3e4
d5f7 d3e2 a1a4 c3d3 d6e5 d3d7) +0.97/8 29} 40. fxe4 {(f3e4 d5e6 d3e2 g5g4
c3d3 d6c5 h3g4 h5g4) -1.12/8 29} Bb3+ {(d5b3 d1e1 b3f7 d3e2 b8b1 e1d1 a1a7
c3c2) +0.98/8 29} 41. Kd2 {(d1d2 b3e6 d3e2 g5g4 e4e5 d6d5 e2c4 d5e5 c4e6)
-0.91/9 29} Ng6 {(h4g6 g1f1 b3e6 f1f6 g6f8 c3b3 b8e8 b3b7) +0.96/8 29} 42.
g4 {(g2g4 h5h4 g1f1 b3e6 f1f6 g6f8 c3b3 b8e8) -0.75/8 29} h4 {(h5h4 g1f1
b3e6 f1f6 g6e5 c3b3 e5f3 d2c2) +0.81/8 30} 43. Rf1 {(g1f1 b3e6 d3c4 e6c4
f1f6 d6e5 f6g6 c4b5) -0.90/8 29} Be6 {(b3e6 d3c4 e6c4 f1f6 c4e6 f6g6 a1a4
c3e3) +0.66/8 29} 44. Bc4 {(d3c4 e6c4 f1f6 c4e6 f6g6 a1a4 c3e3 a4a5)
-0.62/8 29} Nf4 {(g6f4 e4e5 d6e7 c4e6 e7e6 c3c6 e6e5 c6c3) +0.51/8 29} 45.
e5+ {(e4e5 d6e7 c4e6 e7e6 c3c6 e6d5 c6c3 d5e5) -0.93/8 29} Kd7 {(d6d7 c1d3
a1a5 d3f4 g5f4 c3d3 d7e7 f1f4 a5e5 d3e3) +0.69/10 29} 46. Bxe6+ {(c4e6 f4e6
c3b3 b8e8 b3b7 d7c8 b7f7 e8g8) -0.59/8 29} Kxe6 {(d7e6 c3c6 e6d5 c6c3 b8b2
c3c2 b2b8 c2a2 a1a2) +0.61/9 29} 47. Rxc6+ {(c3c6 e6d5 c6c3 b8b2 d2d1 d5e5
f1e1 e5d4 e1e3) -0.92/9 29} Kd5 {(e6d5 c6c3 b8b2 c3c2 b2b7 c2c3 b7b2 d2d1
d5e5 c3e3) +0.73/10 30} 48. Rc3 {(c6c3 b8b2 c3c2 b2b7 c2c3 b7b2 d2d1 d5e5
c3e3) -0.68/9 29} Rb2+ {(b8b2 d2e3 f4g2 e3f3 a1a7 c1e2 d5e5 f3g2) +0.92/8
29} 49. Rc2 {(c3c2 b2c2 d2c2 a1a3 f1e1 f4h3 e5e6 a3a8 e6e7 a8e8) -0.81/10
29} Rxc2+ {(b2c2 d2c2 f4h3 f1d1 d5e6 c1d3 a1a2 c2c3 a2a7) +0.88/9 29} 50.
Kxc2 {(d2c2 a1a3 f1e1 f4h3 e5e6 a3a8 e6e7 a8e8 e1e3 e8c8) -1.19/10 29} Nxh3
{(f4h3 f1f5 a1a4 c1e2 a4g4 e2c3 d5c4 f5f3 g4g2 c2c1) +1.11/10 29} 51. Rd1+
{(f1d1 d5e6 c1d3 a1d1 c2d1 h3f4 d1d2 f4d3 d2d3 e6e5) -1.15/10 29} Ke4
{(d5e4 e5e6 a1a8 d1f1 h3f4 e6e7 a8e8 c1b3 e4e5 f1e1 e5d5) +1.16/11 30} 52.
e6 {(e5e6 a1a8 e6e7 a8e8 c1b3 e4f3 d1d7 e8c8 c2d3 f3g4) -0.98/10 29} Ra8
{(a1a8 e6e7 a8e8 c1a2 e4f3 d1d7 e8c8 c2d2 f3g4 d7b7) +0.94/10 29} 53. e7
{(e6e7 a8e8 d1f1 h3f4 c1b3 e4e5 f1e1 e5d6 c2c3 e8e7) -0.98/10 29} Rc8+
{(a8c8 c2b3 c8e8 b3c4 e4f3 d1d7 h3f2 c4d4 f3f4 d7b7) +0.80/10 29} 54. Kb3
{(c2b3 c8b8 b3c4 b8e8 c1d3 h3f4 d1e1 e4f3 d3f4 f3f4 e1e6) -0.42/11 29} Rb8+
{(c8b8 b3c4 b8e8 c1d3 h3f4 d1e1 e4f3 d3f4 f3f4 e1e6) +0.45/10 30} 55. Kc4
{(b3c4 b8e8 d1f1 h3f4 c4c5 f4g6 c5d6 e4e3 f1f7 e3d4 c1b3) -0.21/11 29} Re8
{(b8e8 c1d3 h3f4 d1e1 e4f3 d3f4 f3f4 c4d4 f4g4 e1e6) +0.41/10 29} 56. Re1+
{(d1e1 e4f3 c4d5 f3f2 c1d3 f2f3 d3e5 f3f2 e1h1 h3f4) +0.22/10 29} Kf3
{(e4f3 c4c5 f3f2 e1e5 h3f4 c5d6 f4g6 c1d3 f2f3 e5e6 g6f4) -0.53/11 29} 57.
Kd5 {(c4d5 f3f2 e1e5 h3f4 d5d6 f4g6 c1d3 f2f3 e5e6 g6h8) +0.83/10 29} Nf2
{(h3f2 d5d6 h4h3 d6d7 e8e7 d7e7 h3h2 c1d3 h2h1q e1h1) -0.17/10 29} 58. Kd6
{(d5d6 h4h3 d6d7 e8e7 d7e7 h3h2 c1d3 h2h1q e1h1 f2h1) +0.13/10 29} h3
{(h4h3 d6d7 e8e7 d7e7 h3h2 c1d3 h2h1q e1h1 f2h1 d3e5) -0.20/10 29} 59. Kd7
{(d6d7 e8a8 c1d3 h3h2 d3f2 f3f2 e1b1 a8a7 d7d6 a7a6) +0.18/10 30} Ra8
{(e8a8 e7e8q a8e8 d7e8 h3h2 c1d3 h2h1q e1h1 f2h1 d3e5) -0.03/10 29} 60.
e8=R {(e7e8r a8e8 d7e8 h3h2 c1d3 h2h1q e1h1 f2h1 d3e5) -0.01/9 29} Rxe8
{(a8e8 e1e8 h3h2 e8f8 f3g4 c1d3 f2d3 f8h8 d3e5) -0.22/9 29} 61. Rxe8 {(e1e8
h3h2 e8h8 h2h1q h8h1 f2h1 d7e6 f3g4 e6e5 g4f3) -0.68/10 29} h2 {(h3h2 e8h8
h2h1q h8h1 f2h1 d7e6 f3g4 e6e5 g4f3 c1b3) +0.36/10 29} 62. Re1 {(e8e1 h2h1q
e1h1 f2h1 d7d6 f3g4 d6e5 g4f3 c1b3 f3e3) -0.46/10 29} h1=R {(h2h1r e1h1
f2h1 d7e6 f3e4 e6f6 e4f4 c1d3 f4g4 f6e5) +0.35/10 29} 63. Rxh1 {(e1h1 f2h1
d7e6 h1g3 c1b3 f3g4 e6e5 g3e2 b3a5 e2c3) -0.62/10 29} Nxh1 {(f2h1 d7e6 f3g4
e6e5 g4f3 c1b3 h1f2 b3d4 f3e3 e5d5 f2e4) +0.35/11 29} 64. Ke6 {(d7e6 f3g4
c1d3 h1g3 e6e5 g4f3 d3e1 f3e3 e1c2 e3d3 c2b4 d3e3) -0.56/12 29} Kxg4 {(f3g4
c1d3 h1g3 e6e5 g4f3 d3b2 g3f1 b2c4 g5g4 e5f5 g4g3 f5e5 f1e3) +0.51/13 29}
65. Nd3 {(c1d3 h1g3 e6e5 g4f3 d3b2 f3e3 b2c4 e3d3 c4d6 d3c3 d6f7 g5g4)
-0.50/12 29} Ng3 {(h1g3 e6f6 g3f1 f6e5 f1d2 d3b4 g4f3 b4d5 g5g4 e5d4 f3e2
d5c3 e2f3) +0.49/13 29} 66. Kf6 {(e6f6 g3e2 f6e5 g4f3 e5f5 e2d4 f5g5 f3e4
d3c5 e4d5 c5d7 d5e4) -0.50/12 29} Nh5+ {(g3h5 f6e5 h5g3 d3e1 g3f1 e1d3 f1d2
d3c5 g4f3 c5e6 g5g4 e5d4 d2e4) +0.60/13 29} 67. Ke5 {(f6e5 h5f4 d3f2 g4f3
f2e4 f4g6 e5f5 g6e7 f5e5 g5g4 e4d6 f3e3 d6c4 e3d3) -0.49/14 29} Ng3 {(h5g3
d3e1 g3f1 e1d3 f1d2 d3b4 g4f3 b4d5 d2c4 e5d4 c4d2 d4e5 d2c4) +0.46/13 29}
68. Nb2 {(d3b2 g4f3 b2c4 g5g4 c4d2 f3e3 d2c4 e3f3 c4b6 f3e3 b6c4 e3d3 e5d5)
-0.50/13 29} Kf3 {(g4f3 b2d3 f3e3 d3b4 e3f3 b4c2 g3e2 c2e1 f3e3 e1c2 e3d3
c2b4 d3e3) +0.54/13 29} 69. Nd3 {(b2d3 f3e3 d3e1 e3e2 e1c2 e2d3 c2e1 d3e3
e1c2 e3d3 c2d4 g3e4) -0.53/12 29} g4 {(g5g4 d3e1 f3f2 e1d3 f2e3 d3b4 g3f1
b4d5 e3d3 d5b4 d3e3 b4d5) +0.55/12 29} 70. Ne1+ {(d3e1 f3e2 e1g2 g3f1 g2f4
e2e3 f4d5 e3d3 d5b4 d3c4 b4d5 f1d2) -0.57/12 29} Ke2 {(f3e2 e1g2 g3h1 e5f4
g4g3 g2e3 e2f2 e3d1 f2e2 d1c3 e2d3 c3e4 g3g2 e4c5) +0.69/14 29} 71. Ng2
{(e1g2 g3h1 e5e4 g4g3 g2e3 h1f2 e4d4 e2f3 e3f5 f2g4 f5h4 f3f4 h4g6)
-0.73/13 29} Kf2 {(e2f2 g2f4 f2f3 f4g6 f3e3 g6f4 g3e4 f4d5 e3d3 d5b4 d3e3
b4d5 e3d3) +0.64/13 29} 72. Nf4 {(g2f4 g3h1 f4d3 f2f1 d3f4 g4g3 f4d5 g3g2
d5e3 f1f2 e3g2 f2g2 e5e4) -2.36/13 29} Nh1 {(g3h1 e5d4 g4g3 f4d3 f2f1 d3e5
g3g2 e5f3 h1f2 d4d5 g2g1q f3g1) +2.31/12 29} 73. Nd3+ {(f4d3 f2f1 d3f4 g4g3
f4d5 g3g2 d5e3 f1f2 e3g2 f2g2 e5e4 g2f2) -2.45/12 29} Kf1 {(f2f1 d3f4 g4g3
f4d5 g3g2 d5e3 f1f2 e3g2 f2g2 e5e4 g2f2 e4d4) +2.47/12 29} 74. Kd5 {(e5d5
g4g3 d3e5 g3g2 e5f3 f1f2 d5e4 h1g3 e4f4 g3e2 f4e4 g2g1q) -2.54/12 29} g3
{(g4g3 d3f4 h1f2 d5d4 g3g2 f4g2 f1g2 d4e3 g2g3 e3d4 g3f4 d4d5) +2.80/12 29}
75. Nf4 {(d3f4 h1f2 d5d4 g3g2 f4g2 f1g2 d4d5 g2f3 d5d4 f3f4 d4d5 f2e4)
-2.97/12 29} Nf2 {(h1f2 d5d4 g3g2 f4g2 f1g2 d4c4 g2f3 c4d5 f3f4 d5d4 f2g4
d4d5 g4e3) +2.95/13 29} 76. Kd4 {(d5d4 g3g2 f4g2 f1g2 d4c4 g2f3 c4d5 f3f4
d5d4 f2g4 d4d5 g4e5) -2.94/12 30} g2 {(g3g2 f4g2 f1g2 d4c4 g2f3 c4d5 f3e3
d5e5 e3d3 e5d5 f2g4 d5d6 d3d4) +3.35/13 29} 77. Nxg2 {(f4g2 f1g2 d4c4 g2f3
c4d5 f3e3 d5e5 e3d3 e5d5 f2g4 d5d6) -3.11/11 30 Insufficient material}
1/2-1/2
[/pgn]