# Generated by using Rcpp::compileAttributes() -> do not edit by hand
# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393

#' Human Crafted Evaluation
HCE <- function(positions) {
    .Call(`_Rchess_HCE`, positions)
}

#' Given a FEN (position) determines if its whites turn
isWhiteTurn <- function(positions) {
    .Call(`_Rchess_isWhiteTurn`, positions)
}

#' Check if current side to move is in check
isCheck <- function(positions) {
    .Call(`_Rchess_isCheck`, positions)
}

#' Check if the current position is a quiet position (no piece is attacked)
isQuiet <- function(positions) {
    .Call(`_Rchess_isQuiet`, positions)
}

#' Check if position is terminal
#'
#' Checks if the position is a terminal position, meaning if the game ended
#' by mate, stale mate or the 50 modes rule. Three-Fold repetition is NOT
#' checked, therefore a seperate game history is required which the board
#' does NOT track.
#'
isTerminal <- function(positions) {
    .Call(`_Rchess_isTerminal`, positions)
}

#' Check if checkmate is possible by material on the board
#'
#' Checks if there is sufficient mating material on the board, meaning if it
#' possible for any side to deliver a check mate. More specifically, it
#' checks if the pieces on the board are KK, KNK or KBK.
#'
isInsufficient <- function(positions) {
    .Call(`_Rchess_isInsufficient`, positions)
}

#' Specialized version of `read_cyclic.cpp` taylored to work in conjunction with
#' `gmlm_chess()` as data generator to provide random draws from a FEN data set
#' with scores filtered to be in in the range `score_min` to `score_max`.
#'
data.gen <- function(file, sample_size, score_min = -5.0, score_max = +5.0, quiet = FALSE, draw = TRUE, min_ply_count = 10L, white_only = TRUE) {
    .Call(`_Rchess_data_gen`, file, sample_size, score_min, score_max, quiet, draw, min_ply_count, white_only)
}

#' Human Crafted Evaluation
eval.psqt <- function(positions, psqt, pawn_structure = FALSE, eval_rooks = FALSE, eval_king = FALSE) {
    .Call(`_Rchess_eval_psqt`, positions, psqt, pawn_structure, eval_rooks, eval_king)
}

#' Convert a legal FEN string to a 3D binary (integer with 0-1 entries) array
fen2int <- function(boards) {
    .Call(`_Rchess_fen2int`, boards)
}

#' Reads lines from a text file with recycling.
#'
read.cyclic <- function(file, nrows = 1000L, skip = 100L, start = 1L, line_len = 64L) {
    .Call(`_Rchess_read_cyclic`, file, nrows, skip, start, line_len)
}

#' Samples a legal move from a given position
sample.move <- function(pos) {
    .Call(`_Rchess_sample_move`, pos)
}

#' Samples a random FEN (position) by applying `ply` random moves to the start
#' position.
#'
#' @param nr number of positions to sample
#' @param min_depth minimum number of random ply's to generate random positions
#' @param max_depth maximum number of random ply's to generate random positions
sample.fen <- function(nr, min_depth = 4L, max_depth = 20L) {
    .Call(`_Rchess_sample_fen`, nr, min_depth, max_depth)
}

#' Converts a FEN string to a Board (position) or return the current internal state
board <- function(fen = "") {
    .Call(`_Rchess_board`, fen)
}

print.board <- function(fen = "") {
    invisible(.Call(`_Rchess_print_board`, fen))
}

print.moves <- function(fen = "") {
    invisible(.Call(`_Rchess_print_moves`, fen))
}

print.bitboards <- function(fen = "") {
    invisible(.Call(`_Rchess_print_bitboards`, fen))
}

position <- function(pos, moves, san = FALSE) {
    .Call(`_Rchess_position`, pos, moves, san)
}

perft <- function(depth = 6L) {
    invisible(.Call(`_Rchess_perft`, depth))
}

go <- function(depth = 6L) {
    .Call(`_Rchess_go`, depth)
}

ucinewgame <- function() {
    invisible(.Call(`_Rchess_ucinewgame`))
}

.onLoad <- function(libname, pkgname) {
    invisible(.Call(`_Rchess_onLoad`, libname, pkgname))
}

.onUnload <- function(libpath) {
    invisible(.Call(`_Rchess_onUnload`, libpath))
}

