static void square_clear(board_t * board, int square, int piece) { int pos, piece_12, colour; int sq, size; ASSERT(board!=NULL); ASSERT(square_is_ok(square)); ASSERT(piece_is_ok(piece)); // init pos = board->pos[square]; ASSERT(pos>=0); colour = piece_colour(piece); piece_12 = piece_to_12(piece); // square ASSERT(board->square[square]==piece); board->square[square] = Empty; ASSERT(board->pos[square]==pos); board->pos[square] = -1; // not needed // piece list ASSERT(board->variant==Horde?board->list_size[colour]>=1:board->list_size[colour]>=2); size = --board->list_size[colour]; ASSERT(pos<=size); if (pos != size) { sq = board->list[colour][size]; ASSERT(square_is_ok(sq)); ASSERT(sq!=square); ASSERT(board->pos[sq]==size); board->pos[sq] = pos; ASSERT(board->list[colour][pos]==square); board->list[colour][pos] = sq; } board->list[colour][size] = SquareNone; // material ASSERT(board->number[piece_12]>=1); board->number[piece_12]--; // hash key board->key ^= random_64(RandomPiece+piece_12*64+square_to_64(square)); }
static void square_set(board_t * board, int square, int piece, int pos) { int piece_12, colour; int sq, size; ASSERT(board!=NULL); ASSERT(square_is_ok(square)); ASSERT(piece_is_ok(piece)); ASSERT(pos>=0); // init colour = piece_colour(piece); piece_12 = piece_to_12(piece); // square ASSERT(board->square[square]==Empty); board->square[square] = piece; ASSERT(board->pos[square]==-1); board->pos[square] = pos; // piece list size = board->list_size[colour]++; ASSERT(board->list[colour][size]==SquareNone); ASSERT(pos<=size); if (pos != size) { sq = board->list[colour][pos]; ASSERT(square_is_ok(sq)); ASSERT(sq!=square); ASSERT(board->pos[sq]==pos); board->pos[sq] = size; ASSERT(board->list[colour][size]==SquareNone); board->list[colour][size] = sq; } board->list[colour][pos] = square; // material ASSERT(board->number[piece_12]<=8); board->number[piece_12]++; // hash key board->key ^= random_64(RandomPiece+piece_12*64+square_to_64(square)); }
static void square_move(board_t * board, int from, int to, int piece) { int colour, pos; int piece_index; ASSERT(board!=NULL); ASSERT(square_is_ok(from)); ASSERT(square_is_ok(to)); ASSERT(piece_is_ok(piece)); // init colour = piece_colour(piece); pos = board->pos[from]; ASSERT(pos>=0); // from ASSERT(board->square[from]==piece); board->square[from] = Empty; ASSERT(board->pos[from]==pos); board->pos[from] = -1; // not needed // to ASSERT(board->square[to]==Empty); board->square[to] = piece; ASSERT(board->pos[to]==-1); board->pos[to] = pos; // piece list ASSERT(board->list[colour][pos]==from); board->list[colour][pos] = to; // hash key piece_index = RandomPiece + piece_to_12(piece) * 64; board->key ^= random_64(piece_index+square_to_64(from)) ^ random_64(piece_index+square_to_64(to)); }
void board_init_list(board_t * board) { int sq_64, sq, piece; int colour, pos; ASSERT(board!=NULL); // init for (sq_64 = 0; sq_64 < 64; sq_64++) { sq = square_from_64(sq_64); board->pos[sq] = -1; } for (piece = 0; piece < 12; piece++) board->number[piece] = 0; // white piece list colour = White; pos = 0; for (sq_64 = 0; sq_64 < 64; sq_64++) { sq = square_from_64(sq_64); piece = board->square[sq]; ASSERT(pos>=0&&pos<=16); if (colour_equal(piece,colour) && piece_is_king(piece)) { board->pos[sq] = (sint8)pos; board->list[colour][pos] = (uint8)sq; pos++; board->number[piece_to_12(piece)]++; } } ASSERT(pos==1); for (sq_64 = 0; sq_64 < 64; sq_64++) { sq = square_from_64(sq_64); piece = board->square[sq]; ASSERT(pos>=0&&pos<=16); if (colour_equal(piece,colour) && !piece_is_king(piece)) { board->pos[sq] = (sint8)pos; board->list[colour][pos] = (uint8)sq; pos++; board->number[piece_to_12(piece)]++; } } ASSERT(pos>=1&&pos<=16); board->list[colour][pos] = SquareNone; board->list_size[colour] = (sint8)pos; // black piece list colour = Black; pos = 0; for (sq_64 = 0; sq_64 < 64; sq_64++) { sq = square_from_64(sq_64); piece = board->square[sq]; ASSERT(pos>=0&&pos<=16); if (colour_equal(piece,colour) && piece_is_king(piece)) { board->pos[sq] = (sint8)pos; board->list[colour][pos] = (uint8)sq; pos++; board->number[piece_to_12(piece)]++; } } ASSERT(pos==1); for (sq_64 = 0; sq_64 < 64; sq_64++) { sq = square_from_64(sq_64); piece = board->square[sq]; ASSERT(pos>=1&&pos<=16); if (colour_equal(piece,colour) && !piece_is_king(piece)) { board->pos[sq] = (sint8)pos; board->list[colour][pos] = (uint8)sq; pos++; board->number[piece_to_12(piece)]++; } } ASSERT(pos>=1&&pos<=16); board->list[colour][pos] = SquareNone; board->list_size[colour] = (sint8)pos; // hash key board->key = hash_key(board); }
int piece_to_char(int piece) { ASSERT(piece_is_ok(piece)); return PieceString[piece_to_12(piece)]; }