// check whether all moves end up in wins for the opponent // if we are here, all captures are losing static int check_loss(int *pcs, long64 idx0, ubyte *table, bitboard occ, int *p) { int sq; long64 idx, idx2; bitboard bb; int best = LOSS_IN_ONE; int k = *pcs++; if (k == 0) { // white king bb = WhiteKingMoves; while (bb) { sq = FirstOne(bb); idx2 = MakeMove0(idx0, sq); int v = win_loss[table[idx2]]; if (!v) return 0; if (v < best) best = v; ClearFirst(bb); } } else { // otherwise k == 1, i.e. black king bb = BlackKingMoves; while (bb) { sq = FirstOne(bb); idx2 = MakeMove1(idx0, sq); int v = win_loss[table[idx2]]; if (!v) return 0; if (v < best) best = v; ClearFirst(bb); } } while ((k = *pcs++) >= 0) { bb = PieceMoves(p[k], pt[k], occ); idx = idx0 & ~mask[k]; while (bb) { sq = FirstOne(bb); idx2 = MakeMove2(idx, k, sq); int v = win_loss[table[idx2]]; if (!v) return 0; if (v < best) best = v; ClearFirst(bb); } } return best; }
// captures should be taken care of already int check_mate_pieces(int *pcs, long64 idx0, ubyte *table, bitboard occ, int *p) { int sq; long64 idx, idx2; bitboard bb; do { int k = *pcs; bb = PieceMoves(p[k], pt[k], occ); idx = idx0 & ~mask[k]; while (bb) { sq = FirstOne(bb); idx2 = MakeMove(idx, k, sq); if (table[idx2] < WDL_ILLEGAL) return 0; ClearFirst(bb); } } while (*(++pcs) >= 0); return 1; }
static int check_mate(int *pcs, long64 idx0, ubyte *table, bitboard occ, int *p) { int sq; long64 idx, idx2; bitboard bb; int k = *pcs++; if (k == 0) { // white king bb = WhiteKingMoves; while (bb) { sq = FirstOne(bb); idx2 = MakeMove0(idx0, sq); if (table[idx2] != ILLEGAL) return 0; ClearFirst(bb); } } else { // otherwise k == 1, i.e. black king bb = BlackKingMoves; while (bb) { sq = FirstOne(bb); idx2 = MakeMove1(idx0, sq); if (table[idx2] != ILLEGAL) return 0; ClearFirst(bb); } } while ((k = *pcs++) >= 0) { bb = PieceMoves(p[k], pt[k], occ); idx = idx0 & ~mask[k]; while (bb) { sq = FirstOne(bb); idx2 = MakeMove2(idx, k, sq); if (table[idx2] != ILLEGAL) return 0; ClearFirst(bb); } } return 1; }