--expandArc: evaluate
let sideToMove = position.sideToMove_1
let nonSideToMove = opposite(sideToMove)
let middleGamePhase = getGamePhase(position)
let occupancy = getOccupancy(position)
let pawns: array[PieceColor.White .. PieceColor.Black, Bitboard] = [
getBitboard(position, Pawn, White), getBitboard(position, Pawn, Black)]
let rooks: array[PieceColor.White .. PieceColor.Black, Bitboard] = [
getBitboard(position, Rook, White), getBitboard(position, Rook, Black)]
let kingZones: array[PieceColor.White .. PieceColor.Black, Bitboard] = [
getKingZoneMask(White, toSquare(getBitboard(position, King, White))),
getKingZoneMask(Black, toSquare(getBitboard(position, King, Black)))]
let allPawns = pawns[White] or pawns[Black]
let endGamePhase = 24 - middleGamePhase
let scaledMiddleGame = middleGamePhase / 24
let scaledEndGame = endGamePhase / 24
var middleGameScores: array[PieceColor.White .. PieceColor.Black, Score] = [0, 0]
var endGameScores: array[PieceColor.White .. PieceColor.Black, Score] = [0, 0]
var kingAttackers: array[PieceColor.White .. PieceColor.Black, int] = [0, 0]
block :tmp:
var sq
var bits = occupancy
block :tmp_1:
while bits != 0:
sq = toSquare(bits)
let piece = getPiece(position, sq)
let enemyColor = opposite(piece.color)
let attacks = getAttackingMoves(position, sq)
kingAttackers[enemyColor] +=
countSquares(attacks and kingZones[enemyColor])
let mobilityMoves = countSquares(getMobility(position, sq))
middleGameScores[piece.color] +=
MIDDLEGAME_VALUE_TABLES[piece.color][piece.kind][sq]
endGameScores[piece.color] +=
ENDGAME_VALUE_TABLES[piece.color][piece.kind][sq]
let scores = getMobilityBonus(piece.kind, mobilityMoves)
middleGameScores[piece.color] += scores.mg
endGameScores[piece.color] += scores.eg
bits = bits and bits - 1
block :tmp_2:
var color_1
mixin inc
var res = 0
block :tmp_3:
while res <= 1:
var
:tmpD
:tmpD_1
color_1 = chckRange(res, White, None)
let side = if color_1 == Black:
:tmpD = -1.0
:tmpD else:
:tmpD_1 = 1.0
:tmpD_1
let bishopPair = countSquares(getBitboard(position, Bishop, color_1)) == 2
if bishopPair:
middleGameScores[color_1] += 62
endGameScores[color_1] += 147
let attacked = clamp(kingAttackers[color_1], 0, 8)
middleGameScores[color_1] += KING_ZONE_ATTACKS_MIDDLEGAME_BONUS[attacked]
endGameScores[color_1] += KING_ZONE_ATTACKS_ENDGAME_BONUS[attacked]
let strongPawns = countSquares((forwardLeftRelativeTo(pawns[color_1],
color_1) or
forwardRightRelativeTo(pawns[color_1], color_1)) and
pawns[color_1])
middleGameScores[color_1] +=
22 * chckRange(strongPawns, -2147483648'i32, 2147483647'i32)
endGameScores[color_1] +=
24 * chckRange(strongPawns, -2147483648'i32, 2147483647'i32)
block :tmp_4:
var pawn
var :tmp_5
:tmp_5 = pawns[color_1]
var bits_1 = :tmp_5
block :tmp_6:
while bits_1 != 0:
var
:tmpD_2
:tmpD_3
pawn = toSquare(bits_1)
let square = if color_1 == Black:
:tmpD_2 = flip(pawn)
:tmpD_2 else:
:tmpD_3 = pawn
:tmpD_3
if (getPassedPawnMask(color_1, pawn) and pawns[opposite(color_1)]) ==_2 0:
middleGameScores[color_1] +=
PASSED_PAWN_MIDDLEGAME_TABLES[color_1][pawn]
endGameScores[color_1] += PASSED_PAWN_ENDGAME_TABLES[color_1][pawn]
if (pawns[color_1] and getIsolatedPawnMask(fileFromSquare(pawn))) ==_2 0:
middleGameScores[color_1] +=
ISOLATED_PAWN_MIDDLEGAME_TABLES[color_1][pawn]
endGameScores[color_1] += ISOLATED_PAWN_ENDGAME_TABLES[color_1][
pawn]
bits_1 = bits_1 and bits_1 - 1
block :tmp_7:
var file
mixin inc
var res_1 = 0
block :tmp_8:
while res_1 <= 7:
file = T(res_1)
let fileMask = getFileMask(file)
let friendlyPawnsOnFile = pawns[color_1] and fileMask
if countSquares(fileMask and allPawns) == 0:
block :tmp_9:
var rook
var :tmp_10
:tmp_10 = rooks[color_1] and fileMask
var bits_2 = :tmp_10
block :tmp_11:
while bits_2 != 0:
rook = toSquare(bits_2)
middleGameScores[color_1] += 81
endGameScores[color_1] += 26
bits_2 = bits_2 and bits_2 - 1
if friendlyPawnsOnFile ==_2 0 and
countSquares(fileMask and pawns[opposite(color_1)]) == 1:
block :tmp_12:
var rook_1
var :tmp_13
:tmp_13 = rooks[color_1] and fileMask
var bits_3 = :tmp_13
block :tmp_14:
while bits_3 != 0:
rook_1 = toSquare(bits_3)
middleGameScores[color_1] += 32
endGameScores[color_1] += 23
bits_3 = bits_3 and bits_3 - 1
inc(res_1, 1)
inc(res, 1)
let middleGameScore = middleGameScores[sideToMove] -
middleGameScores[nonSideToMove]
let endGameScore = endGameScores[sideToMove] - endGameScores[nonSideToMove]
result = chckRange((middleGameScore * middleGamePhase +
endGameScore * endGamePhase) div
24, -2147483648'i32, 2147483647'i32)
result += 10'i32
-- end of expandArc ------------------------