void cEval::ScoreKing(POS *p, int sd) { const int startSq[2] = { E1, E8 }; const int qCastle[2] = { B1, B8 }; const int kCastle[2] = { G1, G8 }; U64 bbKingFile, bbNextFile; int result = 0; int sq = KingSq(p, sd); // Normalize king square for pawn shield evaluation, // to discourage shuffling the king between g1 and h1. if (SqBb(sq) & bbKSCastle[sd]) sq = kCastle[sd]; if (SqBb(sq) & bbQSCastle[sd]) sq = qCastle[sd]; // Evaluate shielding and storming pawns on each file. bbKingFile = BB.FillNorthSq(sq) | BB.FillSouthSq(sq); result += ScoreKingFile(p, sd, bbKingFile); bbNextFile = ShiftEast(bbKingFile); if (bbNextFile) result += ScoreKingFile(p, sd, bbNextFile); bbNextFile = ShiftWest(bbKingFile); if (bbNextFile) result += ScoreKingFile(p, sd, bbNextFile); mg[sd][F_PAWNS] += result; mg[sd][F_PAWNS] += ScoreChains(p, sd); }
void sEvaluator::SinglePawnScore(sPosition *p, int side) { int sq, flagIsOpen, flagIsWeak; int oppo = Opp(side); U64 flagIsPhalanx, flagPhalanx2, flagIsDoubled, bbFrontSpan; U64 bbPieces = bbPc(p, side, P); U64 bbOwnPawns = bbPieces; while (bbPieces) { sq = PopFirstBit(&bbPieces); // gather information about a pawn that is evaluated bbFrontSpan = GetFrontSpan(SqBb(sq), side ); flagIsDoubled = bbFrontSpan & bbOwnPawns; flagIsOpen = !( bbFrontSpan & bbPc(p, oppo, P) ); flagIsPhalanx = ShiftEast(SqBb(sq) ) & bbOwnPawns; flagPhalanx2 = ShiftWest(SqBb(sq) ) & bbOwnPawns; flagIsWeak = !( bbPawnSupport[side][sq] & bbOwnPawns ); if (flagIsDoubled) { pawnScoreMg[side] += doubledPawn[MG][File(sq)]; pawnScoreEg[side] += doubledPawn[EG][File(sq)]; } if (flagIsPhalanx) { pawnScoreMg[side] += Data.pawnProperty[PHALANX][MG][side][sq]; //pawnScoreEg[side] += Data.phalanxEg[side][sq]; } if (flagIsOpen) { U64 bbObstacles = bbPassedMask[side][sq] & bbPc(p, oppo, P); // passed pawn (some more eval will be done in ScoreP() in eval_pieces.c) if (!bbObstacles) { if (flagIsDoubled) AddPasserScore(CANDIDATE,side,sq); // back doubled passer is scored like candidate, else AddPasserScore(PASSED,side,sq); // only frontmost passer gets full credit } // candidate passer if (flagIsPhalanx || flagPhalanx2) { // test lower bonus when !flagIsWeak if (PopCntSparse(bbObstacles) == 1) AddPasserScore(CANDIDATE,side,sq); } } if (flagIsWeak) { if (!(bbAdjacentMask[File(sq)] & bbOwnPawns)) { // isolated AddPawnProperty(ISOLATED,side,sq); if (flagIsOpen) pawnScoreMg[side] += pawnIsolatedOnOpen; } else { // backward AddPawnProperty(BACKWARD,side,sq); if (flagIsOpen) pawnScoreMg[side] += pawnBackwardOnOpen; } } } }