/// <summary> /// Decrements or increments the parameter score, in regard to the pieces position on the board. /// Method should be used for pawns. /// </summary> private static void AddPawnScores(Board.Board board, int colour, ref int score) { var pceType = colour == (int)Colour.WHITE ? (int)Piece.wP : (int)Piece.bP; for (var i = 0; i < board.PceNum[pceType]; ++i) { var sq = board.PList[pceType, i]; Debug.Assert(Validators.SqOnBoard(sq)); var sq64 = Conversion.getSq120ToSq64(sq); var value = colour == (int)Colour.WHITE ? Evaluate.pawnTable[sq64] : -Evaluate.pawnTable[Data.mirror64Table[sq64]]; score += value; // If pawn we need to consider whether it's isolated and on what rank. if (colour == (int)Colour.WHITE) { if ((EvalBitMask.GetIsolatedMask(sq64) & board.Pawns[(int)Colour.WHITE]) == 0) { score += Evaluate.PAWN_ISOLATED_VAL; } if ((EvalBitMask.GetWhitePassedMask(sq64) & board.Pawns[(int)Colour.BLACK]) == 0) { var rank = Conversion.getRanksBrd(sq); Debug.Assert(Validators.FileOrRankValid(rank)); score += Evaluate.PAWN_PASSED_VAL[rank]; } } else { if ((EvalBitMask.GetIsolatedMask(sq64) & board.Pawns[(int)Colour.BLACK]) == 0) { score -= Evaluate.PAWN_ISOLATED_VAL; } if ((EvalBitMask.GetBlackPassedMask(sq64) & board.Pawns[(int)Colour.WHITE]) == 0) { var rank = Conversion.getRanksBrd(sq); Debug.Assert(Validators.FileOrRankValid(rank)); score -= Evaluate.PAWN_PASSED_VAL[7 - rank]; } } } }