static int atak(lua_State *L) { int piece, square, colour; U64 *ret = NULL; U64 *occupancy = NULL; /* Get function arguments */ piece = luaL_checkinteger(L, 1); if (piece < PAWN || piece > KING) return luaL_argerror(L, 1, "invalid piece"); square = luaL_checkinteger(L, 2); if (square < 0 || square > 63) return luaL_argerror(L, 2, "invalid square"); if (!lua_isnoneornil(L, 3)) { colour = luaL_checkinteger(L, 3); if (colour < WHITE || colour > BLACK) return luaL_argerror(L, 3, "invalid colour"); } else colour = NOCOLOUR; if (!lua_isnoneornil(L, 4)) occupancy = luaL_checkudata(L, 4, BITBOARD_T); ret = (U64 *)lua_newuserdata(L, sizeof(U64)); luaL_getmetatable(L, BITBOARD_T); lua_setmetatable(L, -2); switch (piece) { case PAWN: if (colour == NOCOLOUR) return luaL_argerror(L, 3, "invalid colour"); *ret = PAWN_ATTACKS[colour - 1][square]; break; case KNIGHT: *ret = KNIGHT_ATTACKS[square]; break; case KING: *ret = KING_ATTACKS[square]; break; case BISHOP: case ROOK: case QUEEN: if (occupancy == NULL) return luaL_argerror(L, 4, "invalid occupancy"); switch (piece) { case BISHOP: *ret = Bmagic(square, *occupancy); break; case ROOK: *ret = Rmagic(square, *occupancy); break; case QUEEN: *ret = Qmagic(square, *occupancy); break; } break; } return 1; }
Score EvaluateQueens(uint64_t bb, Phase phase, uint64_t safeDestinations, uint64_t occupancy) { Score ret = 0; while (bb) { uint32_t idx = Extract(bb); uint32_t mobility = PopCount(Qmagic(idx, occupancy) & safeDestinations); ret += ScalePhase(QUEEN_MOBILITY[0][mobility] * MOBILITY_MULTIPLIERS[0], QUEEN_MOBILITY[1][mobility] * MOBILITY_MULTIPLIERS[1], phase); if (COLOR == BLACK) { idx = FLIP[idx]; } ret += ScalePhase(QUEEN_PCSQ[0][idx], QUEEN_PCSQ[1][idx], phase); } return ret; }