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);
}
Exemple #2
0
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;
		}
	}
  }
}