blob: 1c659867a6fefd272e3f12aec32e834c952b527b [file] [log] [blame]
#ifndef GLOBALS_H
#define GLOBALS_H
#include "utils.h"
#include "interface.h"
#include "structs.h"
#include "consts.h"
//########################################################
// Function prototypes.
//########################################################
//========================================================
// Generate a list of moves that 'player'
// can make in the given position. (excluding safe moves).
//
// The moves are places in the movelist array.
// Returns the number of moves that were placed in movelist.
//========================================================
s32bit move_generator (Move movelist[MAXMOVES], s32bit player);
s32bit move_generator_stage1 (Move movelist[MAXMOVES], s32bit player);
s32bit move_generator_stage2 (Move movelist[MAXMOVES],
s32bit start, s32bit player);
//=================================================================
// Move ordering uses a simple evaluation function as well as
// a value associated with each position.
// The first two function set these values in a dynamic way.
// The 'set_position_values' function does it statically.
//=================================================================
#ifdef DYNAMIC_POSITION_VALUES
void init_move_value ();
s32bit set_move_value (Move movelist, s32bit player);
void unset_move_value (Move movelist, s32bit player);
#else
void set_position_values ();
#endif
//========================================================
// Toggle a move, if a move hasn't been played then play it, if
// it has then undo it.
//========================================================
void toggle_move (Move move, s32bit player);
//========================================================
// Give score of move relative to current position.
//========================================================
//s32bit score_move(Move move, s32bit player);
void
score_and_get_first(Move movelist[MAXMOVES], s32bit num_moves,
s32bit player, Move first);
//========================================================
// Use the value of movelist[i].info to sort the moves in
// descending order.
//========================================================
void sort_moves(Move movelist[MAXMOVES], s32bit start, s32bit num_moves);
void
update_safe(s32bit player, s32bit row);
void
update_real(s32bit player, s32bit row);
void init_less_static_tables();
void init_static_tables();
// make the bitboard consistent with the info past into this function.
void init__board(s32bit num_rows, s32bit num_cols, s32bit board[30][30]);
void initialize_tables();
//########################################################
// Functions for interacting with the hashtable.
//========================================================
// Store the current search value into the hashtable if there
// is a position available.
//========================================================
void hashstore (s32bit value, s32bit alpha, s32bit beta,
u32bit nodes, s32bit depth_remaining,
Move best, s32bit player);
//========================================================
// Check the hashtable to see if we have already seen the current
// position before.
//========================================================
s32bit hashlookup (s32bit *value, s32bit *alpha, s32bit *beta,
s32bit depth_remaining,
Move *force_first, s32bit player);
//########################################################
// Functions for information display or sanity checks.
//========================================================
// Functions which varify pieces of information.
//========================================================
void check_board();
void check_board_info();
void check_hash_code_sanity();
//========================================================
// Functions which print various pieces of information in a
// readable format.
//========================================================
void print_board(s32bit player);
void print_board_info();
void print_bitboard(s32bit player);
void print_hashkey(Hash_Key key);
void print_u64bit(u64bit val);
void print_hashentry(s32bit index);
//########################################################
// Global variables.
//########################################################
extern u64bit g_num_nodes;
// two bitboard arrays [0] is horizontals, [1] is verticals.
extern u32bit g_board[2][32];
// number of rows and cols in the board.
// [0] is the num of rows, [1] is the num of cols.
extern s32bit g_board_size[2];
// keep track of simple info such as real and safe moves.
extern Basic_Info g_info[2][32];
extern Basic_Info g_info_totals[2];
extern s32bit g_empty_squares;
// zobrist value for each position on the board.
extern s32bit g_zobrist[32][32];
// Transposition table.
extern Hash_Entry *g_trans_table;
// Current boards hash key and code (flipped in various ways).
extern Hash_Key g_norm_hashkey;
extern Hash_Key g_flipV_hashkey;
extern Hash_Key g_flipH_hashkey;
extern Hash_Key g_flipVH_hashkey;
extern s32bit g_first_move[2][32][32];
extern s32bit g_move_number[128];
//########################################################
// Tables of precalculated information.
//
// Calling initialize_board should initialize the information in
// all these tables.
//########################################################
//========================================================
// Declare the table we use for updating our hashkey after each move.
//========================================================
extern KeyInfo g_keyinfo[2][32][32];
//========================================================
// Declare the table we use in countmoves.
//========================================================
#ifdef COUNTMOVES_TABLE
extern s32bit move_table16[65536];
#endif
//========================================================
// Declare the table we use in countbits32.
//========================================================
#if defined COUNTBITS16
extern s32bit countbits16[65536];
#if defined COUNTBITS8
#error "Both COUNTBITS8 and COUNTBITS16 are defined."
#endif
#elif defined COUNTBITS8
extern s32bit countbits8[256];
#else
#error "Neither COUNTBITS8 or COUNTBITS16 are defined."
#endif
//========================================================
// Declare the table we use in lastbit32.
//========================================================
#if defined LASTBIT16
extern s32bit lastbit16[65536];
#if defined LASTBIT8
#error "Both LASTBIT8 and LASTBIT16 are defined."
#endif
#elif defined LASTBIT8
extern s32bit lastbit8[256];
#else
#error "Neither LASTBIT8 and LASTBIT16 are defined."
#endif
#endif //ifndef GLOBALS_H