예제 #1
0
파일: attack.c 프로젝트: alip/luachess
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;
}
예제 #2
0
파일: eval.cpp 프로젝트: enlighter/giraffe
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;
}