- assert(promotion >= KNIGHT && promotion <= QUEEN);
-
- // Insert promoted piece instead of pawn
- clear_bit(&(byTypeBB[PAWN]), to);
- set_bit(&(byTypeBB[promotion]), to);
- board[to] = piece_of_color_and_type(us, promotion);
-
- // Update material key
- st->materialKey ^= zobMaterial[us][PAWN][pieceCount[us][PAWN]];
- st->materialKey ^= zobMaterial[us][promotion][pieceCount[us][promotion]+1];
-
- // Update piece counts
- pieceCount[us][PAWN]--;
- pieceCount[us][promotion]++;
-
- // Update piece lists, move the last pawn at index[to] position
- // and shrink the list. Add a new promotion piece to the list.
- Square lastPawnSquare = pieceList[us][PAWN][pieceCount[us][PAWN]];
- index[lastPawnSquare] = index[to];
- pieceList[us][PAWN][index[lastPawnSquare]] = lastPawnSquare;
- pieceList[us][PAWN][pieceCount[us][PAWN]] = SQ_NONE;
- index[to] = pieceCount[us][promotion] - 1;
- pieceList[us][promotion][index[to]] = to;
-
- // Partially revert hash keys update
- key ^= zobrist[us][PAWN][to] ^ zobrist[us][promotion][to];
- st->pawnKey ^= zobrist[us][PAWN][to];
-
- // Partially revert and update incremental scores
- st->mgValue -= pst<MidGame>(us, PAWN, to);
- st->mgValue += pst<MidGame>(us, promotion, to);
- st->egValue -= pst<EndGame>(us, PAWN, to);
- st->egValue += pst<EndGame>(us, promotion, to);
-
- // Update material
- st->npMaterial[us] += piece_value_midgame(promotion);
- }