int pvStack[MAXPLY*MAXPLY/2];
int nrRanks, nrFiles, specials, pinCodes, maxDrop, moveSP, pawn, lanceMask, *pvPtr = pvStack, boardEnd, perpLoses, searchNr;
+int frontier, killZone, impasse, frontierPenalty, killPenalty;
int rawInts[21*22], pieceValues[96], pieceCode[96];
signed char rawChar[32*22], steps[512];
unsigned char rawByte[102*22], firstDir[64], rawBulk[98], handSlot[97], promoCode[96], aVal[64], vVal[64], rawLocation[96+23], handBulk[96];
// board
ClearBoard();
boardEnd = specials = 22*nrRanks;
+ frontier = (nrRanks < 7 ? 22 : nrRanks == 7 ? 2*22 : 3*22);
+ killZone = boardEnd - (nrRanks > 6 ? frontier + 2*22 : 0);
+ impasse = boardEnd - (nrRanks > 6 ? 3*22 : 2*22);
+ frontierPenalty = (nrRanks > 7 ? 2 : 1);
+ killPenalty = (nrRanks > 7 ? 8 : 2);
for(i=0; i<COLOR; i++) PST[i] = pstData;
spoiler[7*22+4] = 10;
spoiler[7*22+7] = 2;
PST[WHITE+4] = PST[BLACK+4] = kingPST+11; // Queens
+ frontier = 2*22; killZone = 3*22; impasse = boardEnd;
} else {
pawnBulk[WHITE] = (nrRanks == 7 ? 1 : 2); // board file considered full when total reaches 2
}
score += ((board[k+22] == WHITE) + (board[k+22+1] == WHITE) + (board[k+22-1] == WHITE))*2;
score -= !board[k+22] + !board[k+22+1] + !board[k+22-1];
score -= ((board[k+44] == BLACK) + (board[k+44+1] == BLACK) + (board[k+44-1] == BLACK))*5;
+ if(k >= killZone) score -= 100;
k = location[WHITE+31];
score -= ((board[k-22] == BLACK) + (board[k-22+1] == BLACK) + (board[k-22-1] == BLACK))*2;
score += !board[k-22] + !board[k-22+1] + !board[k-22-1];
score += ((board[k-44] == WHITE) + (board[k-44+1] == WHITE) + (board[k-44-1] == WHITE))*5;
+ if(k < boardEnd - killZone) score += 100;
score *= 20;
score += rightsScore[rights];
return stm == WHITE ? score : -score;
m->safety = SAFE(r+1) + SAFE(r-1) + SAFE(r+22) + SAFE(r+21) + SAFE(r+23) + SAFE(r-21) + SAFE(r-22) + SAFE(r-23);
# define ESC(X) (board[X] & stm || attacks[X] == c)
m->escape = 8 - (ESC(r+1) + ESC(r-1) + ESC(r+22) + ESC(r+21) + ESC(r+23) + ESC(r-21) + ESC(r-22) + ESC(r-23));
-
+ if(stm == WHITE) r = boardEnd - 1 - r;
+ m->safety += (r >= 1*22) + frontierPenalty*(r >= frontier) + killPenalty*(r >= killZone) - 5*(r >= impasse);
m->unsorted = m->firstMove; m->drops = moveSP;
return 0;
}