/* * FILE: gnushogi.h * * Main header file for GNU Shogi. * * ---------------------------------------------------------------------- * Copyright (c) 1993, 1994, 1995 Matthias Mutz * Copyright (c) 1999 Michael Vanier and the Free Software Foundation * Copyright (c) 2008, 2013, 2014 Yann Dirson and the Free Software Foundation * * GNU SHOGI is based on GNU CHESS * * Copyright (c) 1988, 1989, 1990 John Stanback * Copyright (c) 1992 Free Software Foundation * * This file is part of GNU SHOGI. * * GNU Shogi is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 3 of the License, * or (at your option) any later version. * * GNU Shogi is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with GNU Shogi; see the file COPYING. If not, see * . * ---------------------------------------------------------------------- * */ /* Hack for anal-retentive ANSI-compliance if desired: */ #define inline /* FIXME: this file needs to be reorganized in some rational manner. */ #ifndef _GNUSHOGI_H_ #define _GNUSHOGI_H_ #include "config.h" /* Portability #defines. */ #include "debug.h" #include "opts.h" /* Various option-setting #defines. */ /* * Display options. */ typedef enum { DISPLAY_RAW, #ifdef HAVE_LIBCURSES DISPLAY_CURSES, #endif DISPLAY_X } display_t; extern display_t display_type; #define XSHOGI (display_type == DISPLAY_X) #define NOT_CURSES ((display_type == DISPLAY_X) \ || (display_type == DISPLAY_RAW)) /* Miscellaneous globals. */ extern short hard_time_limit; /* If you exceed time limit, you lose. */ extern short barebones; /* Don't print of stats for x interface. */ extern short nolist; /* Don't list game after exit. */ /* * Options for various compilers/OSs. */ /* * type small_short must cover -128 .. 127. In case of trouble, * try commenting out "signed". If this doesn't help, use short. */ #define small_short signed char #define small_ushort unsigned char typedef small_ushort UBYTE; typedef short SHORT; typedef unsigned short USHORT; typedef int INT; typedef unsigned int UINT; typedef long LONG; typedef unsigned long ULONG; #if !defined(HAVE_MEMCPY) && !defined(HAVE_BCOPY) # define array_copy(src, dst, len) \ { \ long i; \ char *psrc = (char *)src, *pdst = (char *)dst; \ for (i = len; i; pdst[--i] = psrc[i]); \ } # define array_zero(dst, len) \ { \ long i; \ char *pdst = (char *)dst; \ for (i = len; i; pdst[--i] = 0); \ } #elif !defined(HAVE_MEMCPY) /* BSD and derivatives */ # define array_copy(src, dst, len) bcopy(src, dst, len) # define array_zero(dst, len) bzero(dst, len) #else /* System V and derivatives */ # define array_copy(src, dst, len) memcpy(dst, src, len) # define array_zero(dst, len) memset(dst, 0, len) #endif #ifndef __GNUC__ # define inline #endif /* * Standard header files. */ #include #include #include #include #include #include #include #ifdef WIN32 # include #else typedef small_short BYTE; # include # include #endif #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #define RWA_ACC "r+" #define WA_ACC "w+" #ifdef BINBOOK extern char *binbookfile; #endif extern char *bookfile; extern short ahead; extern char *xwin; extern char *Lang; extern void movealgbr(short m, char *s); #define SEEK_SET 0 #define SEEK_END 2 #ifdef MINISHOGI #define NO_PIECES 11 #define MAX_CAPTURED 19 #define NO_PTYPE_PIECES 11 #define NO_COLS 5 #define NO_ROWS 5 #else #define NO_PIECES 15 #define MAX_CAPTURED 19 #define NO_PTYPE_PIECES 15 #define NO_COLS 9 #define NO_ROWS 9 #endif #define NO_SQUARES (NO_COLS*NO_ROWS) #define ROW_NAME(n) ('a' + NO_ROWS - 1 - n) #define COL_NAME(n) ('1' + NO_COLS - 1 - n) #define ROW_NUM(c) ('a' + NO_ROWS - 1 - c) #define COL_NUM(c) ('1' + NO_COLS - 1 - c) #if defined HASHFILE || defined CACHE # define PTBLBDSIZE (NO_SQUARES + NO_PIECES) #endif #include "eval.h" #define SCORE_LIMIT 12000 /* masks into upper 16 bits of attacks array */ /* observe order of relative piece values */ #define CNT_MASK 0x000000FF #define ctlP 0x00200000 #define ctlPp 0x00100000 #define ctlL 0x00080000 #define ctlN 0x00040000 #define ctlLp 0x00020000 #define ctlNp 0x00010000 #define ctlS 0x00008000 #define ctlSp 0x00004000 #define ctlG 0x00002000 #define ctlB 0x00001000 #define ctlBp 0x00000800 #define ctlR 0x00000400 #define ctlRp 0x00000200 #define ctlK 0x00000100 /* attack functions */ #define Pattack(c, u) (attack[c][u] > ctlP) #define Anyattack(c, u) (attack[c][u] != 0) /* hashtable flags */ #define truescore 0x0001 #define lowerbound 0x0002 #define upperbound 0x0004 #define kingcastle 0x0008 #define queencastle 0x0010 #define evalflag 0x0020 /* King positions */ #define BlackKing PieceList[black][0] #define WhiteKing PieceList[white][0] #define OwnKing PieceList[c1][0] #define EnemyKing PieceList[c2][0] /* board properties */ #ifndef MINISHOGI #define InBlackCamp(sq) ((sq) < 27) #define InWhiteCamp(sq) ((sq) > 53) #else #define InBlackCamp(sq) ((sq) < 5) #define InWhiteCamp(sq) ((sq) > 19) #endif #define InPromotionZone(side, sq) \ (((side) == black) ? InWhiteCamp(sq) : InBlackCamp(sq)) /* constants */ /* FIXME ? */ #define OPENING_HINT 0x141d /* P7g-7f (20->29) */ /* truth values */ #ifndef false #define false 0 #endif #ifndef true #define true 1 #endif /* colors */ #define black 0 #define white 1 #define neutral 2 /* piece code defines */ enum { no_piece = 0, pawn, #ifndef MINISHOGI lance, knight, #endif /* start of pieces that can be dropped at any square */ silver, gold, bishop, rook, ppawn, #ifndef MINISHOGI plance, pknight, #endif psilver, pbishop, prook, king }; /* move types */ enum { ptype_no_piece = 0, ptype_pawn = 0, #ifndef MINISHOGI ptype_lance, ptype_knight, #endif ptype_silver, ptype_gold, ptype_bishop, ptype_rook, ptype_pbishop, ptype_prook, ptype_king, ptype_wpawn, #ifndef MINISHOGI ptype_wlance, ptype_wknight, #endif ptype_wsilver, ptype_wgold }; /* node flags */ #define pmask 0x000f /* 15 */ #define promote 0x0010 /* 16 */ #define dropmask 0x0020 /* 32 */ #define exact 0x0040 /* 64 */ #define tesuji 0x0080 /* 128 */ #define check 0x0100 /* 256 */ #define capture 0x0200 /* 512 */ #define draw 0x0400 /* 1024 */ #define stupid 0x0800 /* 2048 */ #define questionable 0x1000 /* 4096 */ #define kingattack 0x2000 /* 8192 */ #define book 0x4000 /* 16384 */ /* move quality flags */ #define goodmove tesuji #define badmove stupid #ifdef EASY_OPENINGS #define difficult questionable #endif /* move symbols */ #ifndef MINISHOGI #define pxx (" PLNSGBRPLNSBRK ") #define qxx (" plnsgbrplnsbrk ") #define rxx ("ihgfedcba") #define cxx ("987654321") #else #define pxx (" PSGBRPSBRK ") #define qxx (" psgbrpsbrk ") #define rxx ("edcba") #define cxx ("54321") #endif /***************** Table limits ********************************************/ /* * ttblsz must be a power of 2. Setting ttblsz 0 removes the transposition * tables. */ #if defined NOTTABLE # define vttblsz 0 #elif defined SMALL_MEMORY # if defined SAVE_SSCORE # define vttblsz (1 << 12) # else # if defined EXTRA_2MB # define vttblsz (1 << 12) # else # define vttblsz (1 << 10) # endif # endif #else # define vttblsz (100001) #endif #if defined SMALL_MEMORY # define MINTTABLE (0) #else # define MINTTABLE (8000) /* min ttable size -1 */ #endif #define ttblsz vttblsz #if defined SMALL_MEMORY # if !defined SAVE_SSCORE # define TREE 1500 /* max number of tree entries */ # else # define TREE 2500 /* max number of tree entries */ # endif #else # define TREE 4000 /* max number of tree entries */ #endif #define MAXDEPTH 40 /* max depth a search can be carried */ #define MINDEPTH 2 /* min search depth =1 (no hint), >1 hint */ #define MAXMOVES 300 /* max number of half moves in a game */ #define CPSIZE 241 /* size of lang file max */ #if defined SMALL_MEMORY # if defined SAVE_SSCORE # define ETABLE (1 << 10) /* static eval cache */ # else # if defined EXTRA_2MB # define ETABLE (1 << 10) /* static eval cache */ # else # define ETABLE (1 << 8) /* static eval cache */ # endif # endif #else # define ETABLE (10001) /* static eval cache */ #endif /***************** tuning paramaters *******************/ #if defined VERY_SLOW_CPU # define MINRESPONSETIME 300 #elif defined SLOW_CPU # define MINRESPONSETIME 200 #else # define MINRESPONSETIME 100 /* 1 s */ #endif #define MINGAMEIN 4 #define MINMOVES 15 #define CHKDEPTH 1 /* always look forward CHKDEPTH * half-moves if in check */ #if defined SLOW_CPU || defined VERY_SLOW_CPU # define DEPTHBEYOND 7 /* Max to go beyond Sdepth */ #else # define DEPTHBEYOND 11 /* Max to go beyond Sdepth */ #endif #define HASHDEPTH 4 /* depth above which to use HashFile */ #define HASHMOVELIMIT 40 /* Use HashFile only for this many moves */ #define PTVALUE 0 /* material value below which pawn threats at * 5 & 3 are used */ #define ZDEPTH 3 /* depth beyond which to check * ZDELTA for extra time */ #define ZDELTA 10 /* score delta per ply to cause * extra time to be given */ #define BESTDELTA 90 /* about 1/2 second worth of nodes for your machine */ #if defined VERY_SLOW_CPU /* check the time every ZNODES positions */ # define ZNODES (flag.tsume ? 20 : 50) #elif defined SLOW_CPU # define ZNODES (flag.tsume ? 40 : 100) #else # define ZNODES (flag.tsume ? 400 : 1000) #endif #define MAXTCCOUNTX 10 /* max number of time clicks * per search to complete ply */ #define MAXTCCOUNTR 4 /* max number of time clicks * per search extensions*/ #define SCORESPLIM 8 /* Score space doesn't apply after this stage */ #define SDEPTHLIM (Sdepth + 1) #define HISTORYLIM 4096 /* Max value of history killer */ #ifdef EXACTHISTORY # if defined SMALL_MEMORY # define HISTORY_MASK 0x8000 /* mask to MSB of history index */ # define HISTORY_SIZE 0x10000 /* size of history table */ # else # define HISTORY_MASK (1 << 15) /* mask to MSB of history index */ # define HISTORY_SIZE (1 << 16) /* size of history table */ # endif #else /* smaller history table, but dangerous because of collisions */ # define HISTORY_MASK 0x3fff /* mask to significant bits * of history index */ # if defined SMALL_MEMORY # define HISTORY_SIZE 0x4000 /* size of history table */ # else # define HISTORY_SIZE (1 << 14) /* size of history table */ # endif #endif #define sizeof_history (sizeof(unsigned short) * (size_t)HISTORY_SIZE) #ifdef EXACTHISTORY /* Map from.to (8bit.8bit) to from.to (0.7bit.8bit) */ # define khmove(mv) (mv & 0x7fff) # define hmove(mv) ((mv & 0x7fff) ^ 0x5555) #else /* Map from.to (8bit.8bit) to from.to (00.7bit.7bit) */ /* Swap bits of ToSquare in case of promotions, hoping that no catastrophic collision occurs. */ # define khmove(mv) (((mv & 0x7f00) >> 1) | \ ((mv & 0x0080) ? ((mv & 0x007f) ^ 0x007f) : (mv & 0x007f))) # define hmove(mv) (khmove(mv) ^ 0x2aaa) #endif /* mask color to 15th bit */ #ifdef EXACTHISTORY # define hindex(c, mv) ((c ? HISTORY_MASK : 0) | hmove(mv)) #else /* for white, swap bits, hoping that no catastrophic collision occurs. */ # define hindex(c, mv) (c ? ((~hmove(mv)) & HISTORY_MASK) : hmove(mv)) #endif #define EWNDW 10 /* Eval window to force position scoring at depth * greater than (Sdepth + 2) */ #define WAWNDW 90 /* alpha window when computer black */ #define WBWNDW 90 /* beta window when computer black */ #define BAWNDW 90 /* alpha window when computer white */ #define BBWNDW 90 /* beta window when computer white */ #define BXWNDW 90 /* window to force position scoring at lower */ #define WXWNDW 90 /* window to force position scoring at lower */ #define DITHER 5 /* max amount random can alter a pos value */ #define LBONUS 1 /* points per stage value of L increases */ #define BBONUS 2 /* points per stage value of B increases */ #define RBONUS 2 /* points per stage value of R increases */ #define QUESTIONABLE (valueK) /* Penalty for questionable moves. */ #if defined STUPID # undef STUPID #endif #define STUPID (valueR << 1) /* Penalty for stupid moves. */ #define KINGPOSLIMIT (-1) /* King positional scoring limit */ #define KINGSAFETY 32 #define MAXrehash (7) /******* parameters for Opening Book ****************/ #define BOOKSIZE 8000 /* Number of unique position/move * combinations allowed */ #define BOOKMAXPLY 40 /* Max plys to keep in book database */ #define BOOKFAIL (BOOKMAXPLY / 2) /* if no book move found for BOOKFAIL * turns stop using book */ #define BOOKPOCKET 64 #define BOOKRAND 1000 /* used to select an opening move * from a list */ #define BOOKENDPCT 950 /* 5 % chance a BOOKEND will stop the book */ #define DONTUSE -32760 /* flag move as don't use */ #define ILLEGAL_TRAPPED -32761 /* flag move as illegal: * no move from this square */ #define ILLEGAL_DOUBLED -32762 /* flag move as illegal: * two pawns on one column */ #define ILLEGAL_MATE -32763 /* flag move as illegal: * pawn drop with mate */ /*****************************************************/ struct hashval { unsigned long key, bd; }; struct hashentry { unsigned long hashbd; unsigned short mv; unsigned char depth; /* unsigned char saves some space */ unsigned char flags; #ifdef notdef unsigned short age; #endif short score; #ifdef HASHTEST unsigned char bd[PTBLBDSIZE]; #endif /* HASHTEST */ }; #if defined HASHFILE || defined CACHE struct etable { unsigned long ehashbd; short escore[2]; #if !defined SAVE_SSCORE short sscore[NO_SQUARES]; #endif short score; small_short hung[2]; #ifdef CACHETEST unsigned char bd[PTBLBDSIZE]; #endif /* CACHETEST */ }; #if defined CACHE extern short use_etable; typedef struct etable etable_field[ETABLE]; extern etable_field *etab[2]; #endif /* * CHECKME! Is this valid? * * persistent transposition table. By default, the size is (1 << vfilesz). * If you change the size, be sure to run gnushogi -c [vfilesz] * before anything else. */ #define frehash 6 #if defined SMALL_MEMORY # define vfilesz 10 #else # define vfilesz 14 #endif struct fileentry { unsigned char bd[PTBLBDSIZE]; unsigned char f, t, flags, depth, sh, sl; }; #endif /* HASHFILE */ struct leaf { small_ushort f, t; short score, reply, width; short INCscore; unsigned short flags; }; struct GameRec { unsigned short gmove; /* this move */ short score; /* score after this move */ short depth; /* search depth this move */ long time; /* search time this move */ short fpiece; /* moved or dropped piece */ short piece; /* piece captured */ short color; /* color */ short flags; /* move flags capture, promote, castle */ short Game50; /* flag for repetition */ long nodes; /* nodes searched for this move */ unsigned long hashkey, hashbd; /* board key before this move */ }; struct TimeControlRec { short moves[2]; long clock[2]; }; struct flags { short mate; /* the game is over */ short post; /* show principle variation */ short quit; /* quit/exit */ short regularstart; /* did the game start from standard * initial board ? */ short reverse; /* reverse board display */ short bothsides; /* computer plays both sides */ short hash; /* enable/disable transposition table */ short force; /* enter moves */ short easy; /* disable thinking on opponents time */ short beep; /* enable/disable beep */ short timeout; /* time to make a move */ short musttimeout; /* time to make a move */ short back; /* time to make a move */ short rcptr; /* enable/disable recapture heuristics */ short rv; /* reverse video */ short stars; /* add stars to uxdsp screen */ short coords; /* add coords to visual screen */ short shade; short material; /* draw on lack of material */ short illegal; /* illegal position */ short onemove; /* timing is onemove */ short gamein; /* timing is gamein */ short tsume; /* first consider checks */ }; extern FILE *debugfile; #ifndef EVALFILE #define EVALFILE "/tmp/EVAL" #endif extern FILE *debug_eval_file; extern short debug_moves; #ifdef HISTORY extern short use_history; extern unsigned short *history; #endif extern long znodes; extern char ColorStr[2][10]; extern char mvstr[4][6]; extern unsigned short MV[MAXDEPTH]; extern int MSCORE; extern int mycnt1, mycnt2; extern short ahead; extern struct leaf rootnode; extern struct leaf *Tree; extern struct leaf *root; extern char savefile[], listfile[]; extern short TrPnt[]; extern small_short board[], color[]; extern const small_short sweep[NO_PIECES]; extern small_short PieceList[2][NO_SQUARES], PawnCnt[2][NO_COLS]; extern small_short Captured[2][NO_PIECES]; #ifndef HAVE_MEMSET # define ClearCaptured() \ { \ short piece, color; \ for (color = black; color <= white; color++) \ for (piece = 0; piece < NO_PIECES; piece++) \ Captured[color][piece] = 0; \ } #else # define ClearCaptured() \ memset((char *)Captured, 0, (unsigned long)sizeof(Captured)) #endif /* HAVE_MEMSET */ extern small_short Mvboard[]; #if !defined SAVE_SVALUE extern short svalue[NO_SQUARES]; #endif extern short pscore[2]; /* eval.c */ extern int EADD; /* eval.c */ extern int EGET; /* eval.c */ extern struct flags flag; extern short opponent, computer, INCscore; extern short WAwindow, BAwindow, WBwindow, BBwindow; extern short dither, player; extern short xwndw, contempt; extern long ResponseTime, ExtraTime, TCleft, MaxResponseTime, et, et0, time0, ft; extern int TCcount; #ifdef INTERRUPT_TEST extern long itime0, it; #endif extern long reminus, replus; extern long GenCnt, NodeCnt, ETnodes, EvalNodes, HashAdd, HashCnt, HashCol, THashCol, FHashCnt, FHashAdd; extern short HashDepth, HashMoveLimit; extern struct GameRec *GameList; extern short GameCnt, Game50; extern short Sdepth, MaxSearchDepth; extern int Book; extern struct TimeControlRec TimeControl; extern int TCadd; extern short TCflag, TCmoves, TCminutes, TCseconds, OperatorTime; extern int timecomp[MINGAMEIN], timeopp[MINGAMEIN]; extern int compptr, oppptr; extern short XCmore, XCmoves[], XCminutes[], XCseconds[], XC; extern const short otherside[]; extern const small_short Stboard[]; extern const small_short Stcolor[]; extern unsigned short hint; extern short TOflag; extern short stage, stage2; #define in_opening_stage (!flag.tsume && (stage < 33)) #define in_middlegame_stage (!flag.tsume && (stage >= 33) && (stage <= 66)) #define in_endgame_stage (flag.tsume || (stage > 66)) extern short ahead, hash; extern short balance[2]; extern small_short ChkFlag[], CptrFlag[], TesujiFlag[]; extern short Pscore[], Tscore[]; extern /*unsigned*/ short rehash; /* -1 is used as a flag --tpm */ extern unsigned int ttbllimit; extern unsigned int TTadd; extern unsigned int ttblsize; extern short mtl[], hung[]; extern small_short Pindex[]; extern small_short PieceCnt[]; extern short FROMsquare, TOsquare; extern small_short HasPiece[2][NO_PIECES]; extern const short kingP[]; extern unsigned short killr0[], killr1[]; extern unsigned short killr2[], killr3[]; extern unsigned short PrVar[MAXDEPTH]; extern unsigned short PV, SwagHt, Swag0, Swag1, Swag2, Swag3, Swag4, sidebit; extern short mtl[2], pmtl[2], hung[2]; extern const small_short relative_value[]; extern const long control[]; extern small_short diagonal(short delta); extern const small_short promoted[NO_PIECES], unpromoted[NO_PIECES]; extern const small_short is_promoted[NO_PIECES]; typedef unsigned char next_array[NO_SQUARES][NO_SQUARES]; typedef small_short distdata_array[NO_SQUARES][NO_SQUARES]; extern const small_short inunmap[NO_SQUARES]; #ifndef MINISHOGI extern const small_short nunmap[(NO_COLS + 2)*(NO_ROWS + 4)]; #else extern const small_short nunmap[(NO_COLS + 2)*(NO_ROWS + 2)]; #endif #if defined SAVE_NEXTPOS extern const small_short direc[NO_PTYPE_PIECES][8]; extern short first_direction(short ptyp, short *d, short sq); extern short next_direction(short ptyp, short *d, short sq); extern short next_position(short ptyp, short *d, short sq, short u); #else extern short use_nextpos; extern next_array *nextpos[NO_PTYPE_PIECES]; extern next_array *nextdir[NO_PTYPE_PIECES]; #endif extern value_array *value; extern fscore_array *fscore; #ifndef SAVE_DISTDATA extern short use_distdata; extern distdata_array *distdata; #endif #ifndef SAVE_PTYPE_DISTDATA extern short use_ptype_distdata; extern distdata_array *ptype_distdata[NO_PTYPE_PIECES]; #endif extern const small_short ptype[2][NO_PIECES]; extern long filesz, hashmask, hashbase; extern FILE *hashfile; extern unsigned int starttime; /* eval.c */ typedef small_short Mpiece_array[2][NO_SQUARES]; extern Mpiece_array *Mpiece[NO_PIECES]; extern short ADVNCM[NO_PIECES]; #define computed_distance(a, b) \ ((abs(column(a) - column(b)) > abs(row(a) - row(b))) \ ? abs(column(a) - column(b)) : abs(row(a) - row(b))) extern short distance(short a, short b); extern short ptype_distance(short ptyp, short f, short t); extern short piece_distance(short side, short piece, short f, short t); #if defined UNKNOWN # undef UNKNOWN #endif #define UNKNOWN 'U' #define STATIC_ROOK 'S' #define RANGING_ROOK 'R' extern char GameType[2]; void ShowGameType(void); extern unsigned short bookmaxply; extern unsigned int bookcount; extern unsigned int booksize; extern unsigned long hashkey, hashbd; typedef struct hashval hashcode_array[2][NO_PIECES][NO_SQUARES]; typedef struct hashval drop_hashcode_array[2][NO_PIECES][NO_SQUARES]; extern hashcode_array *hashcode; extern drop_hashcode_array *drop_hashcode; #ifdef QUIETBACKGROUND extern short background; #endif /* QUIETBACKGROUND */ #if ttblsz extern short use_ttable; extern struct hashentry *ttable[2]; #endif /* * hashbd contains a 32 bit "signature" of the board position. hashkey * contains a 16 bit code used to address the hash table. When a move is * made, XOR'ing the hashcode of moved piece on the from and to squares with * the hashbd and hashkey values keeps things current. */ #define UpdateHashbd(side, piece, f, t) \ { \ if ((f) >= 0) \ { \ hashbd ^= (*hashcode)[side][piece][f].bd; \ hashkey ^= (*hashcode)[side][piece][f].key; \ } \ \ if ((t) >= 0) \ { \ hashbd ^= (*hashcode)[side][piece][t].bd; \ hashkey ^= (*hashcode)[side][piece][t].key; \ } \ } #define UpdateDropHashbd(side, piece, count) \ { \ hashbd ^= (*drop_hashcode)[side][piece][count].bd; \ hashkey ^= (*drop_hashcode)[side][piece][count].key; \ } extern short rpthash[2][256]; extern char *DRAW; extern char* DRAW_REPETITION; extern char *DRAW_MAXMOVES; extern char *DRAW_JUSTDRAW; #define row(a) ((a) / NO_COLS) #define column(a) ((a) % NO_COLS) #define locn(a, b) (((a) * NO_COLS) + b) /* init external functions */ extern void InitConst(char *lang); /* init.c */ extern int Initialize_data(void); /* init.c */ extern void Free_data(void); /* init.c */ extern int Lock_data(void); /* init.c */ extern void Unlock_data(void); /* init.c */ extern void Initialize_dist(void); /* init.c */ extern void Initialize_eval(void); /* eval.c */ extern void NewGame(void); extern int parse(FILE * fd, unsigned short *mv, short side, char *opening); extern void GetOpenings(void); extern int OpeningBook(unsigned short *hint, short side); typedef enum { REMOVE_PIECE = 1, ADD_PIECE } UpdatePieceList_mode; extern void UpdatePieceList(short side, short sq, UpdatePieceList_mode iop); typedef enum { FOREGROUND_MODE = 1, BACKGROUND_MODE } SelectMove_mode; extern void SelectMove(short side, SelectMove_mode iop); extern int search(short side, short ply, short depth, short alpha, short beta, unsigned short *bstline, short *rpt); #ifdef CACHE void PutInEETable(short side, int score); int CheckEETable(short side); int ProbeEETable(short side, short *score); #endif #if ttblsz extern int ProbeTTable(short side, short depth, short ply, short *alpha, short *beta, short *score); extern int PutInTTable(short side, short score, short depth, short ply, short alpha, short beta, unsigned short mv); extern void ZeroTTable(void); extern void ZeroRPT(void); extern void Initialize_ttable(void); extern unsigned int urand(void); # ifdef HASHFILE extern void gsrand(unsigned int); extern int ProbeFTable(short side, short depth, short ply, short *alpha, short *beta, short *score); extern void PutInFTable(short side, short score, short depth, short ply, short alpha, short beta, unsigned short f, unsigned short t); # endif /* HASHFILE */ #endif /* ttblsz */ #if !defined SAVE_NEXTPOS extern void Initialize_moves(void); #endif extern short generate_move_flags; extern void MoveList(short side, short ply, short in_check, short blockable); extern void CaptureList(short side, short ply, short in_check, short blockable); /* from attacks.c */ extern int SqAttacked(short square, short side, short *blockable); extern void MakeMove(short side, struct leaf *node, short *tempb, short *tempc, short *tempsf, short *tempst, short *INCscore); extern void UnmakeMove(short side, struct leaf *node, short *tempb, short *tempc, short *tempsf, short *tempst); extern void InitializeStats(void); extern int evaluate(short side, short ply, short alpha, short beta, short INCscore, short *InChk, short *blockable); extern short ScorePosition(short side); extern void ExaminePosition(short side); extern short ScorePatternDistance(short side); extern void DetermineStage(short side); extern void UpdateWeights(short side); extern int InitMain(void); extern void ExitMain(void); extern void Initialize(void); extern void InputCommand(char *command); extern void ExitShogi(void); extern void ClearScreen(void); extern void SetTimeControl(void); extern void SelectLevel(char *sx); extern void UpdateDisplay(short f, short t, short flag, short iscastle); typedef enum { COMPUTE_AND_INIT_MODE = 1, COMPUTE_MODE #ifdef INTERRUPT_TEST , INIT_INTERRUPT_MODE, COMPUTE_INTERRUPT_MODE #endif } ElapsedTime_mode; extern void SetResponseTime(short side); extern void CheckForTimeout(int score, int globalscore, int Jscore, int zwndw); extern void ShowSidetoMove(void); extern void ShowResponseTime(void); extern void ShowPatternCount(short side, short n); extern void SearchStartStuff(short side); extern void ShowDepth(char ch); extern void TerminateSearch(int); extern void ShowResults(short score, unsigned short *bstline, char ch); extern void SetupBoard(void); extern void algbr(short f, short t, short flag); extern void OutputMove(void); extern void ShowCurrentMove(short pnt, short f, short t); extern void ListGame(void); extern void ShowMessage(char *s); extern void ClearScreen(void); extern void DoDebug(void); extern void DoTable(short table[NO_SQUARES]); extern void ShowPostnValues(void); extern void ChangeXwindow(void); extern void SetContempt(void); extern void ChangeHashDepth(void); extern void ChangeBetaWindow(void); extern void GiveHint(void); extern void ShowPrompt(void); extern void EditBoard(void); extern void help(void); extern void ChangeSearchDepth(void); extern void skip(void); extern void skipb(void); extern void EnPassant(short xside, short f, short t, short iop); extern void ShowNodeCnt(long NodeCnt); extern void ShowLine(unsigned short *bstline); extern int pick(short p1, short p2); extern short repetition(void); extern void TimeCalc(void); extern void ElapsedTime(ElapsedTime_mode iop); extern short DropPossible(short piece, short side, short sq); /* genmoves.c */ extern short IsCheckmate(short side, short in_check, short blockable); /* genmoves.c */ typedef enum { VERIFY_AND_MAKE_MODE, VERIFY_AND_TRY_MODE, UNMAKE_MODE } VerifyMove_mode; extern int VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv); extern unsigned short TTage; #include "dspwrappers.h" /* Display functions. */ #endif /* _GNUSHOGI_H_ */