home /
fornax /
fornax-v4-0 /
src /
moving /
oracle.cpp
oracle.cpp
//
// oracle.cpp
// fornax3
//
// Created by Anders on 04/10/2021.
//
#include "oracle.hpp"
#include "parsing.hpp"
bits64* oracle_king_attacks;
bits64* oracle_knight_attacks;
bits64* oracle_sliding_attacks;
bits64* oracle_king_pawn_shield;
static void oracle_generate_king_attacks(void) {
oracle_king_attacks = (bits64*) calloc(64, sizeof(bits64));
for (int i = 0; i < 64; ++i) {
bits64 a = BITS_FROM_SQUARE(i);
oracle_king_attacks[i] =
a >> 8 | a << 8
| ((a << 9 | a >> 7 | a << 1 ) & ~BB_FILE_A)
| ((a >> 9 | a << 7 | a >> 1 ) & ~BB_FILE_H);
}
}
static void oracle_generate_knight_attacks(void) {
oracle_knight_attacks = (bits64*) calloc(64, sizeof(bits64));
for (int i = 0; i < 64; ++i) {
bits64 a = BITS_FROM_SQUARE(i);
oracle_knight_attacks[i] =
((a << 17 | a >> 15) & ~BB_FILE_A)
| ((a >> 17 | a << 15) & ~BB_FILE_H)
| ((a << 10 | a >> 6) & ~(BB_FILE_A | BB_FILE_B))
| ((a >> 10 | a << 6) & ~(BB_FILE_H | BB_FILE_G));
}
}
static void oracle_generate_king_pawn_shield_area(void) {
oracle_king_pawn_shield = (bits64*) calloc(64, sizeof(bits64));
for (int i = 0; i < 16; ++i) {
bits64 a = BITS_FROM_SQUARE(i);
oracle_king_pawn_shield[i] = a << 16 | a << 8 | ((a << 9 | a << 1 ) & ~BB_FILE_A) | ((a << 7 | a >> 1 ) & ~BB_FILE_H);
}
for (int i = 8; i < 32; ++i) {
bits64 a = BITS_FROM_SQUARE(i);
oracle_king_pawn_shield[i] = a << 8 | ((a << 9 | a << 1 ) & ~BB_FILE_A) | ((a << 7 | a >> 1 ) & ~BB_FILE_H);
}
for (int i = 32; i < 40; ++i) {
bits64 a = BITS_FROM_SQUARE(i);
oracle_king_pawn_shield[i] = a >> 8 | ((a >> 7 | a << 1 ) & ~BB_FILE_A) | ((a >> 9 | a >> 1 ) & ~BB_FILE_H);
}
for (int i = 40; i < 64; ++i) {
bits64 a = BITS_FROM_SQUARE(i);
oracle_king_pawn_shield[i] = a >> 16 | a >> 8 | ((a >> 7 | a << 1 ) & ~BB_FILE_A) | ((a >> 9 | a >> 1 ) & ~BB_FILE_H);
}
}
static void oracle_generate_sliding_attacks(void) {
oracle_sliding_attacks = (bits64*) calloc(64 * 8, sizeof(bits64));
for (int i = 0; i < 64; ++i) {
bits64 a = BITS_FROM_SQUARE(i);
oracle_sliding_attacks[i * 8 + N] = bits_koggestone_occluded_fill<N>(a, BB_MAX) & ~a;
oracle_sliding_attacks[i * 8 + E] = bits_koggestone_occluded_fill<E>(a, BB_MAX) & ~a;
oracle_sliding_attacks[i * 8 + S] = bits_koggestone_occluded_fill<S>(a, BB_MAX) & ~a;
oracle_sliding_attacks[i * 8 + W] = bits_koggestone_occluded_fill<W>(a, BB_MAX) & ~a;
oracle_sliding_attacks[i * 8 + NE] = bits_koggestone_occluded_fill<NE>(a, BB_MAX) & ~a;
oracle_sliding_attacks[i * 8 + SE] = bits_koggestone_occluded_fill<SE>(a, BB_MAX) & ~a;
oracle_sliding_attacks[i * 8 + SW] = bits_koggestone_occluded_fill<SW>(a, BB_MAX) & ~a;
oracle_sliding_attacks[i * 8 + NW] = bits_koggestone_occluded_fill<NW>(a, BB_MAX) & ~a;
}
}
void oracle_destroy(void) {
free(oracle_king_attacks);
free(oracle_knight_attacks);
free(oracle_king_pawn_shield);
free(oracle_sliding_attacks);
}
void oracle_init(void) {
oracle_generate_king_attacks();
oracle_generate_knight_attacks();
oracle_generate_king_pawn_shield_area();
oracle_generate_sliding_attacks();
}