4 * Main header file for GNU Shogi.
6 * ----------------------------------------------------------------------
7 * Copyright (c) 1993, 1994, 1995 Matthias Mutz
8 * Copyright (c) 1999 Michael Vanier and the Free Software Foundation
9 * Copyright (c) 2008, 2013, 2014 Yann Dirson and the Free Software Foundation
11 * GNU SHOGI is based on GNU CHESS
13 * Copyright (c) 1988, 1989, 1990 John Stanback
14 * Copyright (c) 1992 Free Software Foundation
16 * This file is part of GNU SHOGI.
18 * GNU Shogi is free software; you can redistribute it and/or modify it
19 * under the terms of the GNU General Public License as published by the
20 * Free Software Foundation; either version 3 of the License,
21 * or (at your option) any later version.
23 * GNU Shogi is distributed in the hope that it will be useful, but WITHOUT
24 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
25 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
28 * You should have received a copy of the GNU General Public License along
29 * with GNU Shogi; see the file COPYING. If not, see
30 * <http://www.gnu.org/licenses/>.
31 * ----------------------------------------------------------------------
35 /* Hack for anal-retentive ANSI-compliance if desired: */
38 /* FIXME: this file needs to be reorganized in some rational manner. */
43 #include "config.h" /* Portability #defines. */
45 #include "opts.h" /* Various option-setting #defines. */
60 extern display_t display_type;
62 #define XSHOGI (display_type == DISPLAY_X)
65 /* Miscellaneous globals. */
67 extern short hard_time_limit; /* If you exceed time limit, you lose. */
68 extern short nolist; /* Don't list game after exit. */
69 extern short xboard; /* Use XBoard instead of xShogi protocol */
73 * Options for various compilers/OSs.
77 * type small_short must cover -128 .. 127. In case of trouble,
78 * try commenting out "signed". If this doesn't help, use short.
81 #define small_short signed char
82 #define small_ushort unsigned char
85 typedef small_ushort UBYTE;
87 typedef unsigned short USHORT;
89 typedef unsigned int UINT;
91 typedef unsigned long ULONG;
94 #if !defined(HAVE_MEMCPY) && !defined(HAVE_BCOPY)
95 # define array_copy(src, dst, len) \
98 char *psrc = (char *)src, *pdst = (char *)dst; \
99 for (i = len; i; pdst[--i] = psrc[i]); \
101 # define array_zero(dst, len) \
104 char *pdst = (char *)dst; \
105 for (i = len; i; pdst[--i] = 0); \
107 #elif !defined(HAVE_MEMCPY) /* BSD and derivatives */
108 # define array_copy(src, dst, len) bcopy(src, dst, len)
109 # define array_zero(dst, len) bzero(dst, len)
110 #else /* System V and derivatives */
111 # define array_copy(src, dst, len) memcpy(dst, src, len)
112 # define array_zero(dst, len) memset(dst, 0, len)
122 * Standard header files.
131 #include <sys/param.h>
132 #include <sys/types.h>
134 # include <windows.h>
136 typedef small_short BYTE;
137 # include <sys/times.h>
138 # include <sys/ioctl.h>
141 #if TIME_WITH_SYS_TIME
142 # include <sys/time.h>
146 # include <sys/time.h>
155 extern char *binbookfile;
158 extern char *bookfile;
162 extern void movealgbr(short m, char *s);
170 #define MAX_CAPTURED 19
171 #define NO_PTYPE_PIECES 11
174 #define NO_CAMP_ROWS 1
177 #define MAX_CAPTURED 19
178 #define NO_PTYPE_PIECES 15
181 #define NO_CAMP_ROWS 3
183 #define NO_SQUARES (NO_COLS*NO_ROWS)
185 #define ROW_NAME(n) ( xboard ? '1' + n : ('a' + NO_ROWS - 1 - n) )
186 #define COL_NAME(n) ( xboard ? 'a' + n : ('1' + NO_COLS - 1 - n) )
187 #define ROW_NUM(c) ( xboard ? c - '1' : ('a' + NO_ROWS - 1 - c) )
188 #define COL_NUM(c) ( xboard ? c - 'a' : ('1' + NO_COLS - 1 - c) )
191 #if defined HASHFILE || defined CACHE
192 # define PTBLBDSIZE (NO_SQUARES + NO_PIECES)
197 #define SCORE_LIMIT 12000
199 /* masks into upper 16 bits of attacks array */
200 /* observe order of relative piece values */
201 #define CNT_MASK 0x000000FF
202 #define ctlP 0x00200000
203 #define ctlPp 0x00100000
204 #define ctlL 0x00080000
205 #define ctlN 0x00040000
206 #define ctlLp 0x00020000
207 #define ctlNp 0x00010000
208 #define ctlS 0x00008000
209 #define ctlSp 0x00004000
210 #define ctlG 0x00002000
211 #define ctlB 0x00001000
212 #define ctlBp 0x00000800
213 #define ctlR 0x00000400
214 #define ctlRp 0x00000200
215 #define ctlK 0x00000100
217 /* attack functions */
218 #define Pattack(c, u) (attack[c][u] > ctlP)
219 #define Anyattack(c, u) (attack[c][u] != 0)
221 /* hashtable flags */
222 #define truescore 0x0001
223 #define lowerbound 0x0002
224 #define upperbound 0x0004
225 #define kingcastle 0x0008
226 #define queencastle 0x0010
227 #define evalflag 0x0020
230 #define BlackKing PieceList[black][0]
231 #define WhiteKing PieceList[white][0]
232 #define OwnKing PieceList[c1][0]
233 #define EnemyKing PieceList[c2][0]
236 /* board properties */
237 #define InBlackCamp(sq) ((sq) < (NO_COLS * NO_CAMP_ROWS))
238 #define InWhiteCamp(sq) ((sq) >= (NO_COLS * (NO_ROWS - NO_CAMP_ROWS)))
239 #define InPromotionZone(side, sq) \
240 (((side) == black) ? InWhiteCamp(sq) : InBlackCamp(sq))
244 #define OPENING_HINT 0x141d /* P7g-7f (20->29) */
260 /* piece code defines */
268 /* start of pieces that can be dropped at any square */
284 /* piece mask defines */
289 T_KNIGHT = 1<<knight,
291 /* start of pieces that can be dropped at any square */
292 T_SILVER = 1<<silver,
294 T_BISHOP = 1<<bishop,
298 T_PLANCE = 1<<plance,
299 T_PKNIGHT = 1<<pknight,
301 T_PSILVER = 1<<psilver,
302 T_PBISHOP = 1<<pbishop,
306 ,T_LANCE = 1<<king+1,
336 #define pmask 0x000f /* 15 */
337 #define promote 0x0010 /* 16 */
338 #define dropmask 0x0020 /* 32 */
339 #define exact 0x0040 /* 64 */
340 #define tesuji 0x0080 /* 128 */
341 #define check 0x0100 /* 256 */
342 #define capture 0x0200 /* 512 */
343 #define draw 0x0400 /* 1024 */
344 #define stupid 0x0800 /* 2048 */
345 #define questionable 0x1000 /* 4096 */
346 #define kingattack 0x2000 /* 8192 */
347 #define book 0x4000 /* 16384 */
349 /* move quality flags */
350 #define goodmove tesuji
351 #define badmove stupid
353 #define difficult questionable
358 #define pxx (" PLNSGBRPLNSBRK ")
359 #define qxx (" plnsgbrplnsbrk ")
361 #define pxx (" PSGBRPSBRK ")
362 #define qxx (" psgbrpsbrk ")
365 /***************** Table limits ********************************************/
368 * ttblsz must be a power of 2. Setting ttblsz 0 removes the transposition
374 #elif defined SMALL_MEMORY
375 # if defined SAVE_SSCORE
376 # define vttblsz (1 << 12)
378 # if defined EXTRA_2MB
379 # define vttblsz (1 << 12)
381 # define vttblsz (1 << 10)
385 # define vttblsz (100001)
388 #if defined SMALL_MEMORY
389 # define MINTTABLE (0)
391 # define MINTTABLE (8000) /* min ttable size -1 */
394 #define ttblsz vttblsz
396 #if defined SMALL_MEMORY
397 # if !defined SAVE_SSCORE
398 # define TREE 1500 /* max number of tree entries */
400 # define TREE 2500 /* max number of tree entries */
403 # define TREE 4000 /* max number of tree entries */
406 #define MAXDEPTH 40 /* max depth a search can be carried */
407 #define MINDEPTH 2 /* min search depth =1 (no hint), >1 hint */
408 #define MAXMOVES 300 /* max number of half moves in a game */
409 #define CPSIZE 241 /* size of lang file max */
411 #if defined SMALL_MEMORY
412 # if defined SAVE_SSCORE
413 # define ETABLE (1 << 10) /* static eval cache */
415 # if defined EXTRA_2MB
416 # define ETABLE (1 << 10) /* static eval cache */
418 # define ETABLE (1 << 8) /* static eval cache */
422 # define ETABLE (10001) /* static eval cache */
425 /***************** tuning paramaters *******************/
427 #if defined VERY_SLOW_CPU
428 # define MINRESPONSETIME 300
429 #elif defined SLOW_CPU
430 # define MINRESPONSETIME 200
432 # define MINRESPONSETIME 100 /* 1 s */
437 #define CHKDEPTH 1 /* always look forward CHKDEPTH
438 * half-moves if in check */
440 #if defined SLOW_CPU || defined VERY_SLOW_CPU
441 # define DEPTHBEYOND 7 /* Max to go beyond Sdepth */
443 # define DEPTHBEYOND 11 /* Max to go beyond Sdepth */
446 #define HASHDEPTH 4 /* depth above which to use HashFile */
447 #define HASHMOVELIMIT 40 /* Use HashFile only for this many moves */
448 #define PTVALUE 0 /* material value below which pawn threats at
450 #define ZDEPTH 3 /* depth beyond which to check
451 * ZDELTA for extra time */
452 #define ZDELTA 10 /* score delta per ply to cause
453 * extra time to be given */
456 /* about 1/2 second worth of nodes for your machine */
457 #if defined VERY_SLOW_CPU
458 /* check the time every ZNODES positions */
459 # define ZNODES (flag.tsume ? 20 : 50)
460 #elif defined SLOW_CPU
461 # define ZNODES (flag.tsume ? 40 : 100)
463 # define ZNODES (flag.tsume ? 400 : 1000)
466 #define MAXTCCOUNTX 10 /* max number of time clicks
467 * per search to complete ply */
468 #define MAXTCCOUNTR 4 /* max number of time clicks
469 * per search extensions*/
470 #define SCORESPLIM 8 /* Score space doesn't apply after this stage */
471 #define SDEPTHLIM (Sdepth + 1)
472 #define HISTORYLIM 4096 /* Max value of history killer */
475 # if defined SMALL_MEMORY
476 # define HISTORY_MASK 0x8000 /* mask to MSB of history index */
477 # define HISTORY_SIZE 0x10000 /* size of history table */
479 # define HISTORY_MASK (1 << 15) /* mask to MSB of history index */
480 # define HISTORY_SIZE (1 << 16) /* size of history table */
483 /* smaller history table, but dangerous because of collisions */
484 # define HISTORY_MASK 0x3fff /* mask to significant bits
485 * of history index */
486 # if defined SMALL_MEMORY
487 # define HISTORY_SIZE 0x4000 /* size of history table */
489 # define HISTORY_SIZE (1 << 14) /* size of history table */
493 #define sizeof_history (sizeof(unsigned short) * (size_t)HISTORY_SIZE)
496 /* Map from.to (8bit.8bit) to from.to (0.7bit.8bit) */
497 # define khmove(mv) (mv & 0x7fff)
498 # define hmove(mv) ((mv & 0x7fff) ^ 0x5555)
500 /* Map from.to (8bit.8bit) to from.to (00.7bit.7bit) */
501 /* Swap bits of ToSquare in case of promotions, hoping that
502 no catastrophic collision occurs. */
503 # define khmove(mv) (((mv & 0x7f00) >> 1) | \
504 ((mv & 0x0080) ? ((mv & 0x007f) ^ 0x007f) : (mv & 0x007f)))
505 # define hmove(mv) (khmove(mv) ^ 0x2aaa)
508 /* mask color to 15th bit */
510 # define hindex(c, mv) ((c ? HISTORY_MASK : 0) | hmove(mv))
512 /* for white, swap bits, hoping that no catastrophic collision occurs. */
513 # define hindex(c, mv) (c ? ((~hmove(mv)) & HISTORY_MASK) : hmove(mv))
516 #define EWNDW 10 /* Eval window to force position scoring at depth
517 * greater than (Sdepth + 2) */
518 #define WAWNDW 90 /* alpha window when computer black */
519 #define WBWNDW 90 /* beta window when computer black */
520 #define BAWNDW 90 /* alpha window when computer white */
521 #define BBWNDW 90 /* beta window when computer white */
522 #define BXWNDW 90 /* window to force position scoring at lower */
523 #define WXWNDW 90 /* window to force position scoring at lower */
525 #define DITHER 5 /* max amount random can alter a pos value */
526 #define LBONUS 1 /* points per stage value of L increases */
527 #define BBONUS 2 /* points per stage value of B increases */
528 #define RBONUS 2 /* points per stage value of R increases */
530 #define QUESTIONABLE (valueK) /* Penalty for questionable moves. */
536 #define STUPID (valueR << 1) /* Penalty for stupid moves. */
538 #define KINGPOSLIMIT (-1) /* King positional scoring limit */
539 #define KINGSAFETY 32
540 #define MAXrehash (7)
542 /******* parameters for Opening Book ****************/
544 #define BOOKSIZE 8000 /* Number of unique position/move
545 * combinations allowed */
546 #define BOOKMAXPLY 40 /* Max plys to keep in book database */
547 #define BOOKFAIL (BOOKMAXPLY / 2) /* if no book move found for BOOKFAIL
548 * turns stop using book */
549 #define BOOKPOCKET 64
550 #define BOOKRAND 1000 /* used to select an opening move
552 #define BOOKENDPCT 950 /* 5 % chance a BOOKEND will stop the book */
553 #define DONTUSE -32760 /* flag move as don't use */
554 #define ILLEGAL_TRAPPED -32761 /* flag move as illegal:
555 * no move from this square */
556 #define ILLEGAL_DOUBLED -32762 /* flag move as illegal:
557 * two pawns on one column */
558 #define ILLEGAL_MATE -32763 /* flag move as illegal:
559 * pawn drop with mate */
561 /*****************************************************/
565 unsigned long key, bd;
570 unsigned long hashbd;
572 unsigned char depth; /* unsigned char saves some space */
579 unsigned char bd[PTBLBDSIZE];
580 #endif /* HASHTEST */
583 #if defined HASHFILE || defined CACHE
586 unsigned long ehashbd;
588 #if !defined SAVE_SSCORE
589 short sscore[NO_SQUARES];
594 unsigned char bd[PTBLBDSIZE];
595 #endif /* CACHETEST */
599 extern short use_etable;
600 typedef struct etable etable_field[ETABLE];
601 extern etable_field *etab[2];
605 * CHECKME! Is this valid?
607 * persistent transposition table. By default, the size is (1 << vfilesz).
608 * If you change the size, be sure to run gnushogi -c [vfilesz]
609 * before anything else.
614 #if defined SMALL_MEMORY
622 unsigned char bd[PTBLBDSIZE];
623 unsigned char f, t, flags, depth, sh, sl;
626 #endif /* HASHFILE */
632 short score, reply, width;
634 unsigned short flags;
640 unsigned short gmove; /* this move */
641 short score; /* score after this move */
642 short depth; /* search depth this move */
643 long time; /* search time this move */
644 short fpiece; /* moved or dropped piece */
645 short piece; /* piece captured */
646 short color; /* color */
647 short flags; /* move flags capture, promote, castle */
648 short Game50; /* flag for repetition */
649 long nodes; /* nodes searched for this move */
650 unsigned long hashkey, hashbd; /* board key before this move */
654 struct TimeControlRec
663 short mate; /* the game is over */
664 short post; /* show principle variation */
665 short quit; /* quit/exit */
666 short regularstart; /* did the game start from standard
668 short reverse; /* reverse board display */
669 short bothsides; /* computer plays both sides */
670 short hash; /* enable/disable transposition table */
671 short force; /* enter moves */
672 short analyze; /* search during move entry */
673 short easy; /* disable thinking on opponents time */
674 short beep; /* enable/disable beep */
675 short timeout; /* time to make a move */
676 short musttimeout; /* time to make a move */
677 short back; /* time to make a move */
678 short rcptr; /* enable/disable recapture heuristics */
679 short rv; /* reverse video */
680 short stars; /* add stars to uxdsp screen */
681 short coords; /* add coords to visual screen */
683 short material; /* draw on lack of material */
684 short illegal; /* illegal position */
685 short onemove; /* timing is onemove */
686 short gamein; /* timing is gamein */
687 short tsume; /* first consider checks */
690 extern FILE *debugfile;
693 #define EVALFILE "/tmp/EVAL"
696 extern FILE *debug_eval_file;
697 extern short debug_moves;
701 extern short use_history;
702 extern unsigned short *history;
707 extern char ColorStr[2][10];
709 extern char mvstr[4][6];
710 extern int mycnt1, mycnt2;
712 extern struct leaf rootnode;
713 extern struct leaf *Tree;
714 extern struct leaf *root;
715 extern char savefile[], listfile[];
716 extern short TrPnt[];
717 extern small_short board[], color[];
718 extern const small_short sweep[NO_PIECES];
719 extern const int typeMask[NO_PIECES];
720 extern small_short PieceList[2][NO_SQUARES], PawnCnt[2][NO_COLS];
721 extern small_short Captured[2][NO_PIECES];
724 # define ClearCaptured() \
726 short piece, color; \
727 for (color = black; color <= white; color++) \
728 for (piece = 0; piece < NO_PIECES; piece++) \
729 Captured[color][piece] = 0; \
732 # define ClearCaptured() \
733 memset((char *)Captured, 0, (unsigned long)sizeof(Captured))
734 #endif /* HAVE_MEMSET */
736 extern small_short Mvboard[];
738 #if !defined SAVE_SVALUE
739 extern short svalue[NO_SQUARES];
742 extern short pscore[2]; /* eval.c */
743 extern int EADD; /* eval.c */
744 extern int EGET; /* eval.c */
745 extern struct flags flag;
746 extern short opponent, computer, INCscore;
747 extern short WAwindow, BAwindow, WBwindow, BBwindow;
748 extern short dither, player;
749 extern short xwndw, contempt;
750 extern long ResponseTime, ExtraTime, TCleft,
751 MaxResponseTime, et, et0, time0, ft;
754 #ifdef INTERRUPT_TEST
755 extern long itime0, it;
758 extern long reminus, replus;
759 extern long GenCnt, NodeCnt, ETnodes, EvalNodes, HashAdd, HashCnt,
760 HashCol, THashCol, FHashCnt, FHashAdd;
761 extern short HashDepth, HashMoveLimit;
762 extern struct GameRec *GameList;
763 extern short GameCnt, Game50;
764 extern short Sdepth, MaxSearchDepth;
766 extern struct TimeControlRec TimeControl;
768 extern short TCflag, TCmoves, TCminutes, TCseconds, OperatorTime;
769 extern int timecomp[MINGAMEIN], timeopp[MINGAMEIN];
770 extern int compptr, oppptr;
771 extern short XCmore, XCmoves[], XCminutes[], XCseconds[], XC;
772 extern const short otherside[];
773 extern const small_short Stboard[];
774 extern const small_short Stcolor[];
775 extern unsigned short hint;
777 extern short stage, stage2;
779 #define in_opening_stage (!flag.tsume && (stage < 33))
780 #define in_middlegame_stage (!flag.tsume && (stage >= 33) && (stage <= 66))
781 #define in_endgame_stage (flag.tsume || (stage > 66))
783 extern short ahead, hash;
784 extern short balance[2];
785 extern small_short ChkFlag[], CptrFlag[], TesujiFlag[];
786 extern short Pscore[], Tscore[];
787 extern /*unsigned*/ short rehash; /* -1 is used as a flag --tpm */
788 extern unsigned int ttbllimit;
789 extern unsigned int TTadd;
790 extern unsigned int ttblsize;
791 extern short mtl[], hung[];
792 extern small_short Pindex[];
793 extern small_short PieceCnt[];
794 extern short FROMsquare, TOsquare;
795 extern small_short HasPiece[2][NO_PIECES];
796 extern const short kingP[];
797 extern unsigned short killr0[], killr1[];
798 extern unsigned short killr2[], killr3[];
799 extern unsigned short PrVar[MAXDEPTH];
800 extern unsigned short PV, SwagHt, Swag0, Swag1, Swag2, Swag3, Swag4, sidebit;
801 extern short mtl[2], pmtl[2], hung[2];
802 extern const small_short relative_value[];
803 extern const long control[];
804 extern small_short diagonal(short delta);
805 extern const small_short promoted[NO_PIECES], unpromoted[NO_PIECES];
806 extern const small_short is_promoted[NO_PIECES];
808 typedef unsigned char next_array[NO_SQUARES][NO_SQUARES];
809 typedef small_short distdata_array[NO_SQUARES][NO_SQUARES];
811 extern const small_short inunmap[NO_SQUARES];
813 extern const small_short nunmap[(NO_COLS + 2)*(NO_ROWS + 4)];
815 extern const small_short nunmap[(NO_COLS + 2)*(NO_ROWS + 2)];
818 #if defined SAVE_NEXTPOS
819 extern const small_short direc[NO_PTYPE_PIECES][8];
820 extern short first_direction(short ptyp, short *d, short sq);
821 extern short next_direction(short ptyp, short *d, short sq);
822 extern short next_position(short ptyp, short *d, short sq, short u);
824 extern short use_nextpos;
825 extern next_array *nextpos[NO_PTYPE_PIECES];
826 extern next_array *nextdir[NO_PTYPE_PIECES];
829 extern value_array *value;
830 extern fscore_array *fscore;
832 #ifndef SAVE_DISTDATA
833 extern short use_distdata;
834 extern distdata_array *distdata;
837 #ifndef SAVE_PTYPE_DISTDATA
838 extern short use_ptype_distdata;
839 extern distdata_array *ptype_distdata[NO_PTYPE_PIECES];
842 extern const small_short ptype[2][NO_PIECES];
844 extern long filesz, hashmask, hashbase;
845 extern FILE *hashfile;
846 extern unsigned int starttime;
849 typedef small_short Mpiece_array[2][NO_SQUARES];
850 extern Mpiece_array *Mpiece[NO_PIECES];
851 extern short ADVNCM[NO_PIECES];
853 #define computed_distance(a, b) \
854 ((abs(column(a) - column(b)) > abs(row(a) - row(b))) \
855 ? abs(column(a) - column(b)) : abs(row(a) - row(b)))
857 extern short distance(short a, short b);
858 extern short ptype_distance(short ptyp, short f, short t);
859 extern short piece_distance(short side, short piece, short f, short t);
866 #define STATIC_ROOK 'S'
867 #define RANGING_ROOK 'R'
869 extern char GameType[2];
870 void ShowGameType(void);
872 extern unsigned short bookmaxply;
873 extern unsigned int bookcount;
874 extern unsigned int booksize;
875 extern unsigned long hashkey, hashbd;
877 typedef struct hashval hashcode_array[2][NO_PIECES][NO_SQUARES];
878 typedef struct hashval drop_hashcode_array[2][NO_PIECES][NO_SQUARES];
880 extern hashcode_array *hashcode;
881 extern drop_hashcode_array *drop_hashcode;
883 #ifdef QUIETBACKGROUND
884 extern short background;
885 #endif /* QUIETBACKGROUND */
888 extern short use_ttable;
889 extern struct hashentry *ttable[2];
893 * hashbd contains a 32 bit "signature" of the board position. hashkey
894 * contains a 16 bit code used to address the hash table. When a move is
895 * made, XOR'ing the hashcode of moved piece on the from and to squares with
896 * the hashbd and hashkey values keeps things current.
899 #define UpdateHashbd(side, piece, f, t) \
903 hashbd ^= (*hashcode)[side][piece][f].bd; \
904 hashkey ^= (*hashcode)[side][piece][f].key; \
909 hashbd ^= (*hashcode)[side][piece][t].bd; \
910 hashkey ^= (*hashcode)[side][piece][t].key; \
914 #define UpdateDropHashbd(side, piece, count) \
916 hashbd ^= (*drop_hashcode)[side][piece][count].bd; \
917 hashkey ^= (*drop_hashcode)[side][piece][count].key; \
921 extern short rpthash[2][256];
924 extern char* DRAW_REPETITION;
925 extern char *DRAW_MAXMOVES;
926 extern char *DRAW_JUSTDRAW;
928 #define row(a) ((a) / NO_COLS)
929 #define column(a) ((a) % NO_COLS)
930 #define locn(a, b) (((a) * NO_COLS) + b)
932 /* init external functions */
933 extern void InitConst(char *lang); /* init.c */
934 extern int Initialize_data(void); /* init.c */
935 extern void Free_data(void); /* init.c */
936 extern int Lock_data(void); /* init.c */
937 extern void Unlock_data(void); /* init.c */
938 extern void Initialize_dist(void); /* init.c */
939 extern void Initialize_eval(void); /* eval.c */
940 extern void NewGame(void);
941 extern void GetOpenings(void);
942 extern int OpeningBook(unsigned short *hint);
943 extern int AllocateTT(int size); /* init-common.c */
947 REMOVE_PIECE = 1, ADD_PIECE
948 } UpdatePieceList_mode;
951 UpdatePieceList(short side, short sq, UpdatePieceList_mode iop);
955 FOREGROUND_MODE = 1, BACKGROUND_MODE
959 SelectMove(short side, SelectMove_mode iop);
967 unsigned short *bstline,
971 void PutInEETable(short side, int score);
972 int CheckEETable(short side);
973 int ProbeEETable(short side, short *score);
978 ProbeTTable(short side,
986 PutInTTable(short side,
993 extern void ZeroTTable(void);
994 extern void ZeroRPT(void);
995 extern void Initialize_ttable(void);
996 extern unsigned int urand(void);
999 extern void gsrand(unsigned int);
1002 ProbeFTable(short side,
1010 PutInFTable(short side,
1019 # endif /* HASHFILE */
1022 #if !defined SAVE_NEXTPOS
1023 extern void Initialize_moves(void);
1026 extern short generate_move_flags;
1028 extern void MoveList(short side, short ply,
1029 short in_check, short blockable);
1030 extern void CaptureList(short side, short ply,
1031 short in_check, short blockable);
1033 /* from attacks.c */
1035 SqAttacked(short square, short side, short *blockable);
1038 MakeMove(short side,
1047 UnmakeMove(short side,
1055 InitializeStats(void);
1058 evaluate(short side,
1066 extern short ScorePosition(short side);
1067 extern void ExaminePosition(short side);
1068 extern short ScorePatternDistance(short side);
1069 extern void DetermineStage(short side);
1070 extern void UpdateWeights(short side);
1071 extern int InitMain(void);
1072 extern void ExitMain(void);
1073 extern void Initialize(void);
1074 extern int InputCommand(char *command, int root);
1075 extern void ExitShogi(void);
1076 extern void ClearScreen(void);
1077 extern void SetTimeControl(void);
1078 extern void SelectLevel(char *sx);
1081 UpdateDisplay(short f,
1088 COMPUTE_AND_INIT_MODE = 1, COMPUTE_MODE
1089 #ifdef INTERRUPT_TEST
1090 , INIT_INTERRUPT_MODE, COMPUTE_INTERRUPT_MODE
1094 extern void SetResponseTime(short side);
1095 extern void CheckForTimeout(int score, int globalscore,
1096 int Jscore, int zwndw);
1097 extern void ShowSidetoMove(void);
1098 extern void ShowResponseTime(void);
1099 extern void ShowPatternCount(short side, short n);
1100 extern void SearchStartStuff(short side);
1101 extern void ShowDepth(char ch);
1102 extern void TerminateSearch(int);
1103 extern void ShowResults(short score, unsigned short *bstline, char ch);
1104 extern void SetupBoard(void);
1105 extern void algbr(short f, short t, short flag);
1106 extern void OutputMove(void);
1107 extern void ShowCurrentMove(short pnt, short f, short t);
1108 extern void ListGame(void);
1109 extern void ShowMessage(char *s, ...);
1110 extern void ClearScreen(void);
1111 extern void DoDebug(void);
1112 extern void DoTable(short table[NO_SQUARES]);
1113 extern void ShowPostnValues(void);
1114 extern void ChangeXwindow(void);
1115 extern void SetContempt(void);
1116 extern void ChangeHashDepth(void);
1117 extern void ChangeBetaWindow(void);
1118 extern void GiveHint(void);
1119 extern void ShowPrompt(void);
1120 extern void EditBoard(void);
1121 extern void help(void);
1122 extern void ChangeSearchDepth(void);
1123 extern void skip(void);
1124 extern void skipb(void);
1125 extern void EnPassant(short xside, short f, short t, short iop);
1126 extern void ShowNodeCnt(long NodeCnt);
1127 extern void ShowLine(unsigned short *bstline);
1128 extern int pick(short p1, short p2);
1129 extern short repetition(void);
1130 extern void TimeCalc(void);
1131 extern void ElapsedTime(ElapsedTime_mode iop);
1134 DropPossible(short piece, short side, short sq); /* genmoves.c */
1137 IsCheckmate(short side, short in_check,
1138 short blockable); /* genmoves.c */
1143 VERIFY_AND_MAKE_MODE, VERIFY_AND_TRY_MODE, UNMAKE_MODE
1146 extern int VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv);
1147 extern unsigned short TTage;
1148 extern short movesLeft, currentMove;
1150 /* display driver framework */
1154 void (*ChangeAlphaWindow)(void);
1155 void (*ChangeBetaWindow)(void);
1156 void (*ChangeHashDepth)(void);
1157 void (*ChangeSearchDepth)(char *sx);
1158 void (*ChangeXwindow)(void);
1159 void (*ClearScreen)(void);
1160 void (*DoDebug)(void);
1161 void (*DoTable)(short table[NO_SQUARES]);
1162 void (*EditBoard)(void);
1163 void (*ExitShogi)(void);
1164 void (*GiveHint)(void);
1165 void (*Initialize)(void);
1166 void (*ShowNodeCnt)(long NodeCnt);
1167 void (*OutputMove)(void);
1168 void (*PollForInput)(void);
1169 void (*SetContempt)(void);
1170 void (*SearchStartStuff)(short side);
1171 void (*SelectLevel)(char *sx);
1172 void (*ShowCurrentMove)(short pnt, short f, short t);
1173 void (*ShowDepth)(char ch);
1174 void (*ShowGameType)(void);
1175 void (*ShowLine)(unsigned short *bstline);
1176 void (*ShowMessage)(char *s, ...);
1177 void (*AlwaysShowMessage)(const char *format, ...);
1178 void (*Printf)(const char *format, ...);
1179 void (*doRequestInputString)(const char* fmt, char* buffer);
1180 int (*GetString)(char* sx);
1181 void (*SetupBoard)(void);
1182 void (*ShowPatternCount)(short side, short n);
1183 void (*ShowPostnValue)(short sq);
1184 void (*ShowPostnValues)(void);
1185 void (*ShowPrompt)(void);
1186 void (*ShowResponseTime)(void);
1187 void (*ShowResults)(short score, unsigned short *bstline, char ch);
1188 void (*ShowSidetoMove)(void);
1189 void (*ShowStage)(void);
1190 void (*TerminateSearch)(int sig);
1191 void (*UpdateClocks)(void);
1192 void (*UpdateDisplay)(short f, short t, short redraw, short isspec);
1196 extern struct display *dsp;
1198 extern struct display raw_display;
1199 extern struct display curses_display;
1201 #endif /* _GNUSHOGI_H_ */