changes by H.G. Muller; version 4.3.4
[xboard.git] / common.h
1 /*\r
2  * common.h -- Common definitions for X and Windows NT versions of XBoard\r
3  * $Id: common.h,v 2.1 2003/10/27 19:21:00 mann Exp $\r
4  *\r
5  * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts.\r
6  * Enhancements Copyright 1992-95 Free Software Foundation, Inc.\r
7  *\r
8  * The following terms apply to Digital Equipment Corporation's copyright\r
9  * interest in XBoard:\r
10  * ------------------------------------------------------------------------\r
11  * All Rights Reserved\r
12  *\r
13  * Permission to use, copy, modify, and distribute this software and its\r
14  * documentation for any purpose and without fee is hereby granted,\r
15  * provided that the above copyright notice appear in all copies and that\r
16  * both that copyright notice and this permission notice appear in\r
17  * supporting documentation, and that the name of Digital not be\r
18  * used in advertising or publicity pertaining to distribution of the\r
19  * software without specific, written prior permission.\r
20  *\r
21  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING\r
22  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL\r
23  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR\r
24  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\r
25  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\r
26  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\r
27  * SOFTWARE.\r
28  * ------------------------------------------------------------------------\r
29  *\r
30  * The following terms apply to the enhanced version of XBoard distributed\r
31  * by the Free Software Foundation:\r
32  * ------------------------------------------------------------------------\r
33  * This program is free software; you can redistribute it and/or modify\r
34  * it under the terms of the GNU General Public License as published by\r
35  * the Free Software Foundation; either version 2 of the License, or\r
36  * (at your option) any later version.\r
37  *\r
38  * This program is distributed in the hope that it will be useful,\r
39  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
40  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
41  * GNU General Public License for more details.\r
42  *\r
43  * You should have received a copy of the GNU General Public License\r
44  * along with this program; if not, write to the Free Software\r
45  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
46  * ------------------------------------------------------------------------\r
47  */\r
48 \r
49 #ifndef _COMMON\r
50 #define _COMMON\r
51 \r
52 \r
53 /* Begin compatibility grunge  */\r
54 \r
55 #if defined(__STDC__) || defined(WIN32) || defined(_amigados)\r
56 #define P(args) args\r
57 typedef void *VOIDSTAR;\r
58 #else\r
59 #define P(args)         ()\r
60 typedef char *VOIDSTAR;\r
61 #endif\r
62 \r
63 #ifdef WIN32\r
64 typedef char Boolean;\r
65 typedef char *String;\r
66 #define popen _popen\r
67 #define pclose _pclose\r
68 \r
69 #else\r
70 #ifdef _amigados        /*  It is important, that these types have  */\r
71 typedef int Boolean;    /*  a length of 4 bytes each, as we are     */\r
72 typedef char *String;   /*  using ReadArgs() for argument parsing.  */\r
73 #ifdef _DCC\r
74 FILE *popen(const char *, const char *);\r
75 int pclose(FILE *);\r
76 #endif\r
77 \r
78 #else\r
79 #include <X11/Intrinsic.h>\r
80 #endif\r
81 #endif\r
82 \r
83 \r
84 #ifndef TRUE\r
85 #define TRUE 1\r
86 #define FALSE 0\r
87 #endif\r
88 \r
89 #if !HAVE_RANDOM\r
90 # if HAVE_RAND48\r
91 #  define srandom srand48\r
92 #  define random lrand48\r
93 # else /* not HAVE_RAND48 */\r
94 #  define srandom srand\r
95 #  define random rand\r
96 # endif /* not HAVE_RAND48 */\r
97 #endif /* !HAVE_RANDOM */\r
98 \r
99 /* End compatibility grunge */\r
100 \r
101 #define PROTOVER                2       /* engine protocol version */\r
102 \r
103 /* [HGM] Some notes about board sizes:\r
104    In games that allow piece drops, the holdings are considered part of the\r
105    board, in the leftmost and rightmost two files. This way they are\r
106    automatically part of the game-history states, and enjoy all display\r
107    functions (including drag-drop and click-click moves to the regular part\r
108    of the board). The drawback of this is that the internal numbering of\r
109    files starts at 2 for the a-file if holdings are displayed. To ensure\r
110    consistency, this shifted numbering system is used _everywhere_ in the\r
111    code, and conversion to the 'normal' system only takes place when the\r
112    file number is converted to or from ASCII (by redefining the character\r
113    constant 'a'). This works because Winboard only communicates with the\r
114    outside world in ASCII. In a similar way, the different rank numbering\r
115    systems (starting at rank 0 or 1) are implemented by redefining '1'.\r
116 */\r
117 #define BOARD_SIZE              16            /* [HGM] for in declarations */\r
118 #define BOARD_HEIGHT (gameInfo.boardHeight)   // [HGM] made user adjustable \r
119 #define BOARD_WIDTH  (gameInfo.boardWidth + 2*gameInfo.holdingsWidth)   \r
120 #define BOARD_LEFT   (gameInfo.holdingsWidth) // [HGM] play-board edges     \r
121 #define BOARD_RGHT   (gameInfo.boardWidth + gameInfo.holdingsWidth)\r
122 #define ONE          ('1'-(BOARD_HEIGHT>9))   // [HGM] foremost board rank  \r
123 #define AAA          ('a'-BOARD_LEFT)         // [HGM] leftmost board file  \r
124 #define DROP_RANK               -3\r
125 #define MAX_MOVES               1000\r
126 #define MSG_SIZ                 512\r
127 #define DIALOG_SIZE             256\r
128 #define STAR_MATCH_N            16\r
129 #define MOVE_LEN                32\r
130 #define TIME_CONTROL            "5"     /* in minutes */\r
131 #define TIME_DELAY_QUOTE        "1.0"   /* seconds between moves */\r
132 #define TIME_DELAY              ((float) 1.0)\r
133 #define MOVES_PER_SESSION       40      /* moves per TIME_CONTROL */\r
134 #define TIME_INCREMENT          -1      /* if >= 0, MOVES_PER_SESSION unused */\r
135 #define WhiteOnMove(move)       (((move) % 2) == 0)\r
136 #define ICS_HOST                "chessclub.com"\r
137 #define ICS_PORT                "5000"\r
138 #define ICS_COMM_PORT           ""\r
139 #define FIRST_HOST              "localhost"\r
140 #define SECOND_HOST             "localhost"\r
141 #define TELNET_PROGRAM          "telnet"\r
142 #define MATCH_MODE              "False"\r
143 #define INIT_STRING             "new\nrandom\n"\r
144 #define WHITE_STRING            "white\ngo\n"\r
145 #define BLACK_STRING            "black\ngo\n"\r
146 #define COMPUTER_STRING         "computer\n"\r
147 #define REUSE_CHESS_PROGRAMS    1\r
148 #define WHITE_PIECE_COLOR       "#FFFFCC"\r
149 #define BLACK_PIECE_COLOR       "#202020"\r
150 #define LIGHT_SQUARE_COLOR      "#C8C365"\r
151 #define DARK_SQUARE_COLOR       "#77A26D"\r
152 #define JAIL_SQUARE_COLOR       "#808080"\r
153 #define HIGHLIGHT_SQUARE_COLOR  "#FFFF00"\r
154 #define PREMOVE_HIGHLIGHT_COLOR "#FF0000"\r
155 #define BELLCHAR                '\007'\r
156 #define NULLCHAR                '\000'\r
157 #define FEATURE_TIMEOUT         10000 /*ms*/\r
158 \r
159 /* Zippy defaults */\r
160 #define ZIPPY_TALK FALSE\r
161 #define ZIPPY_PLAY FALSE\r
162 #define ZIPPY_LINES "yow.lines"\r
163 #define ZIPPY_PINHEAD ""\r
164 #define ZIPPY_PASSWORD ""\r
165 #define ZIPPY_PASSWORD2 ""\r
166 #define ZIPPY_WRONG_PASSWORD ""\r
167 #define ZIPPY_ACCEPT_ONLY ""\r
168 #define ZIPPY_USE_I TRUE\r
169 #define ZIPPY_BUGHOUSE 0\r
170 #define ZIPPY_NOPLAY_CRAFTY FALSE\r
171 #define ZIPPY_GAME_END "gameend\n"\r
172 #define ZIPPY_GAME_START ""\r
173 #define ZIPPY_ADJOURN FALSE\r
174 #define ZIPPY_ABORT FALSE\r
175 #define ZIPPY_VARIANTS "normal"\r
176 #define ZIPPY_MAX_GAMES 0\r
177 #define ZIPPY_REPLAY_TIMEOUT 120\r
178 \r
179 typedef enum {\r
180     BeginningOfGame, MachinePlaysWhite, MachinePlaysBlack,\r
181     AnalyzeMode, AnalyzeFile, TwoMachinesPlay,\r
182     EditGame, PlayFromGameFile, EndOfGame, EditPosition, Training,\r
183     IcsIdle, IcsPlayingWhite, IcsPlayingBlack, IcsObserving,\r
184     IcsExamining\r
185   } GameMode;\r
186 \r
187 typedef enum {\r
188     WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, \r
189 #ifdef FAIRY\r
190     /* [HGM] the order here is crucial for Crazyhouse & Shogi: */\r
191     /* only the first N pieces can go into the holdings, and   */\r
192     /* promotions in those variants shift P-W to E-M           */\r
193     WhiteFerz, WhiteWazir, WhiteAlfil, WhiteNightrider, WhiteCardinal,\r
194     WhiteMarshall, WhiteGrasshopper, WhiteCannon, WhiteMan, WhiteUnicorn,\r
195 #endif\r
196     WhiteKing, BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen, \r
197 #ifdef FAIRY\r
198     BlackFerz, BlackWazir, BlackAlfil, BlackNightrider, BlackCardinal,\r
199     BlackMarshall, BlackGrasshopper, BlackCannon, BlackMan, BlackUnicorn,\r
200 #endif\r
201     BlackKing,\r
202     EmptySquare, \r
203     ClearBoard, WhitePlay, BlackPlay /*for use on EditPosition menus*/\r
204   } ChessSquare;\r
205 \r
206 /* [HGM] some macros that can be used as prefixes to convert piece types */\r
207 #define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int)\r
208 #define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int)\r
209 #define PROMOTED       (int)WhiteAlfil - (int)WhitePawn + (int)\r
210 #define DEMOTED        (int)WhitePawn - (int)WhiteAlfil + (int)\r
211 #define SHOGI          (int)EmptySquare + (int)\r
212 \r
213 \r
214 typedef ChessSquare Board[BOARD_SIZE][BOARD_SIZE];\r
215 \r
216 typedef enum {\r
217     WhiteKingSideCastle = 1, WhiteQueenSideCastle,\r
218     WhiteKingSideCastleWild, WhiteQueenSideCastleWild,\r
219     WhiteHSideCastleFR, WhiteASideCastleFR, \r
220     BlackKingSideCastle, BlackQueenSideCastle,\r
221     BlackKingSideCastleWild, BlackQueenSideCastleWild,\r
222     BlackHSideCastleFR, BlackASideCastleFR, \r
223     WhitePromotionKnight, WhitePromotionBishop,\r
224     WhitePromotionRook, WhitePromotionQueen, WhitePromotionKing,\r
225 #ifdef FAIRY\r
226     WhitePromotionChancellor, WhitePromotionArchbishop,\r
227 #endif\r
228     BlackPromotionKnight, BlackPromotionBishop,\r
229     BlackPromotionRook, BlackPromotionQueen, BlackPromotionKing,\r
230 #ifdef FAIRY\r
231     BlackPromotionChancellor, BlackPromotionArchbishop,\r
232 #endif\r
233     WhiteCapturesEnPassant, BlackCapturesEnPassant,\r
234     WhiteDrop, BlackDrop, \r
235     NormalMove, AmbiguousMove, IllegalMove, ImpossibleMove,\r
236     WhiteWins, BlackWins, GameIsDrawn, GameUnfinished,\r
237     GNUChessGame, XBoardGame, MoveNumberOne, \r
238     Comment, PositionDiagram, ElapsedTime, PGNTag, NAG\r
239   } ChessMove;\r
240 \r
241 typedef enum {\r
242     ColorShout, ColorSShout, ColorChannel1, ColorChannel, ColorKibitz,\r
243     ColorTell, ColorChallenge, ColorRequest, ColorSeek, ColorNormal,\r
244     ColorNone, NColorClasses\r
245 } ColorClass;\r
246 \r
247 typedef enum {\r
248     SoundMove, SoundBell, SoundAlarm, SoundIcsWin, SoundIcsLoss,\r
249     SoundIcsDraw, SoundIcsUnfinished, NSoundClasses\r
250 } SoundClass;\r
251 \r
252 /* Names for chess variants, not necessarily supported */\r
253 typedef enum {\r
254     VariantNormal,       /* Normal chess */\r
255     VariantLoadable,     /* "loadgame" command allowed (not really a variant)*/\r
256     VariantWildCastle,   /* Shuffle chess where king can castle from d file */\r
257     VariantNoCastle,     /* Shuffle chess with no castling at all */\r
258     VariantFischeRandom, /* FischeRandom */\r
259     VariantBughouse,     /* Bughouse, ICC/FICS rules */\r
260     VariantCrazyhouse,   /* Crazyhouse, ICC/FICS rules */\r
261     VariantLosers,       /* Try to lose all pieces or get mated (ICC wild 17)*/\r
262     VariantSuicide,      /* Try to lose all pieces incl. king (FICS) */\r
263     VariantGiveaway,     /* Try to have no legal moves left (ICC wild 26) */\r
264     VariantTwoKings,     /* Weird ICC wild 9 */\r
265     VariantKriegspiel,   /* Kriegspiel; pawns can capture invisible pieces */\r
266     VariantAtomic,       /* Capturing piece explodes (ICC wild 27) */\r
267     Variant3Check,       /* Win by giving check 3 times (ICC wild 25) */\r
268     VariantShatranj,     /* Unsupported (ICC wild 28) */\r
269     Variant29,           /* Temporary name for possible future ICC wild 29 */\r
270     Variant30,           /* Temporary name for possible future ICC wild 30 */\r
271     Variant31,           /* Temporary name for possible future ICC wild 31 */\r
272     Variant32,           /* Temporary name for possible future ICC wild 32 */\r
273     Variant33,           /* Temporary name for possible future ICC wild 33 */\r
274     Variant34,           /* Temporary name for possible future ICC wild 34 */\r
275     Variant35,           /* Temporary name for possible future ICC wild 35 */\r
276     Variant36,           /* Temporary name for possible future ICC wild 36 */\r
277     VariantShogi,        /* [HGM] added variants */\r
278     VariantXiangqi,\r
279     VariantCourier,\r
280     VariantGothic,\r
281     VariantCapablanca,\r
282     VariantKnightmate,\r
283     VariantFairy,        \r
284     VariantShowgi,\r
285     VariantUnknown       /* Catchall for other unknown variants */\r
286 } VariantClass;\r
287 \r
288 #define VARIANT_NAMES { \\r
289   "normal", \\r
290   "normal", \\r
291   "wildcastle", \\r
292   "nocastle", \\r
293   "fischerandom", \\r
294   "bughouse", \\r
295   "crazyhouse", \\r
296   "losers", \\r
297   "suicide", \\r
298   "giveaway", \\r
299   "twokings", \\r
300   "kriegspiel", \\r
301   "atomic", \\r
302   "3check", \\r
303   "shatranj", \\r
304   "wild29", \\r
305   "wild30", \\r
306   "wild31", \\r
307   "wild32", \\r
308   "wild33", \\r
309   "wild34", \\r
310   "wild35", \\r
311   "wild36", \\r
312   "shogi", \\r
313   "xiangqi", \\r
314   "courier", \\r
315   "gothic", \\r
316   "capablanca", \\r
317   "knightmate", \\r
318   "fairy", \\r
319   "showgi", \\r
320   "unknown" \\r
321 }\r
322 \r
323 typedef struct {\r
324 #if !defined(_amigados)\r
325     char *whitePieceColor;\r
326     char *blackPieceColor;\r
327     char *lightSquareColor;\r
328     char *darkSquareColor;\r
329     char *jailSquareColor;\r
330     char *highlightSquareColor;\r
331     char *premoveHighlightColor;\r
332 #else\r
333     int whitePieceColor;\r
334     int blackPieceColor;\r
335     int lightSquareColor;\r
336     int darkSquareColor;\r
337     int jailSquareColor;\r
338     int highlightSquareColor;\r
339     int premoveHighlightColor;\r
340 #endif\r
341     int movesPerSession;\r
342     int timeIncrement;\r
343     char *initString;\r
344     char *secondInitString;\r
345     char *firstComputerString;\r
346     char *secondComputerString;\r
347     char *firstChessProgram;\r
348     char *secondChessProgram;\r
349     char *firstDirectory;\r
350     char *secondDirectory;\r
351     Boolean firstPlaysBlack;\r
352     Boolean noChessProgram;\r
353     char *firstHost;\r
354     char *secondHost;\r
355     char *bitmapDirectory;\r
356     char *remoteShell;\r
357     char *remoteUser;\r
358     float timeDelay;\r
359     char *timeControl;\r
360     Boolean icsActive;\r
361     char *icsHost;\r
362     char *icsPort;\r
363     char *icsCommPort;  /* if set, use serial port instead of tcp host/port */\r
364     char *icsLogon;     /* Hack to permit variable logon scripts. */\r
365     char *icsHelper;\r
366     Boolean icsInputBox;\r
367     Boolean useTelnet;\r
368     char *telnetProgram;\r
369     char *gateway;\r
370     char *loadGameFile;\r
371     int loadGameIndex;      /* game # within file */\r
372     char *saveGameFile;\r
373     Boolean autoSaveGames;\r
374     char *loadPositionFile;\r
375     int loadPositionIndex;  /* position # within file */\r
376     char *savePositionFile;\r
377     Boolean matchMode;\r
378     int matchGames;\r
379     Boolean monoMode;\r
380     Boolean debugMode;\r
381     Boolean clockMode;\r
382     char *boardSize;\r
383     Boolean Iconic;\r
384     char *searchTime;\r
385     int searchDepth;\r
386     Boolean showCoords;\r
387     char *clockFont;\r
388     char *messageFont; /* WinBoard only */\r
389     char *coordFont;\r
390     char *font; /* xboard only: all other fonts */\r
391     char *tagsFont; /* WinBoard only */\r
392     char *commentFont; /* WinBoard only */\r
393     char *icsFont; /* WinBoard only */\r
394     Boolean ringBellAfterMoves;\r
395     Boolean autoCallFlag;\r
396     Boolean flipView;\r
397     Boolean autoFlipView;\r
398     char *cmailGameName; /* xboard only */\r
399     Boolean alwaysPromoteToQueen;\r
400     Boolean oldSaveStyle;\r
401     Boolean quietPlay;\r
402     Boolean showThinking;\r
403     Boolean ponderNextMove;\r
404     Boolean periodicUpdates;\r
405     Boolean autoObserve;\r
406     Boolean autoComment;\r
407     Boolean getMoveList;\r
408     Boolean testLegality;\r
409     int borderXoffset; /* xboard only */\r
410     int borderYoffset; /* xboard only */\r
411     Boolean titleInWindow; /* xboard only */\r
412     Boolean localLineEditing; /* WinBoard only */\r
413     Boolean zippyTalk;\r
414     Boolean zippyPlay;\r
415     int flashCount; /* Number of times to flash (xboard only) */\r
416     int flashRate; /* Flashes per second (xboard only)  */\r
417     char *pixmapDirectory; /* Path to XPM/XIM files to use (xboard only) */\r
418     int msLoginDelay;  /* Delay per character (in msec) while sending\r
419                           ICS logon script (xboard only) */\r
420     Boolean colorize;   /* If True, use the following colors to color text */\r
421     /* Strings for colors, as "fg, bg, bold" (strings used in xboard only) */\r
422     char *colorShout;\r
423     char *colorSShout;\r
424     char *colorChannel1;\r
425     char *colorChannel;\r
426     char *colorKibitz;\r
427     char *colorTell;\r
428     char *colorChallenge;\r
429     char *colorRequest;\r
430     char *colorSeek;\r
431     char *colorNormal;\r
432     char *soundProgram; /* sound-playing program */\r
433     char *soundShout;\r
434     char *soundSShout;\r
435     char *soundChannel1;\r
436     char *soundChannel;\r
437     char *soundKibitz;\r
438     char *soundTell;\r
439     char *soundChallenge;\r
440     char *soundRequest;\r
441     char *soundSeek;\r
442     char *soundMove;\r
443     char *soundIcsWin;\r
444     char *soundIcsLoss;\r
445     char *soundIcsDraw;\r
446     char *soundIcsUnfinished;\r
447     char *soundIcsAlarm;\r
448     Boolean reuseFirst;\r
449     Boolean reuseSecond;\r
450     Boolean animateDragging; /* If True, animate mouse dragging of pieces */\r
451     Boolean animate;    /* If True, animate non-mouse moves */\r
452     int animSpeed;      /* Delay in milliseconds between animation frames */\r
453     Boolean popupMoveErrors;\r
454     Boolean popupExitMessage;\r
455     int showJail;\r
456     Boolean highlightLastMove;\r
457     Boolean highlightDragging;\r
458     Boolean blindfold;          /* if true, no pieces are drawn */\r
459     Boolean premove;            /* true if premove feature enabled */ \r
460     Boolean premoveWhite;       /* true if premoving White first move  */ \r
461     char *premoveWhiteText;     /* text of White premove 1 */ \r
462     Boolean premoveBlack;       /* true if premoving Black first move */ \r
463     char *premoveBlackText;     /* text of Black premove 1 */ \r
464     Boolean icsAlarm;           /* true if sounding alarm at a certain time */  \r
465     int icsAlarmTime;           /* time to sound alarm, in milliseconds */\r
466     Boolean autoRaiseBoard;\r
467     int fontSizeTolerance; /* xboard only */\r
468     char *initialMode;\r
469     char *variant;\r
470     int firstProtocolVersion;\r
471     int secondProtocolVersion;\r
472     Boolean showButtonBar;\r
473 \r
474     /* [AS] New properties (down to the "ZIPPY" part) */\r
475     Boolean firstScoreIsAbsolute;  /* If true, engine score is always from white side */\r
476     Boolean secondScoreIsAbsolute; /* If true, engine score is always from white side */\r
477     Boolean saveExtendedInfoInPGN; /* If true, saved PGN games contain extended info */\r
478     Boolean hideThinkingFromHuman; /* If true, program thinking is generated but not displayed in human/computer matches */\r
479     char * liteBackTextureFile; /* Name of texture bitmap for lite squares */\r
480     char * darkBackTextureFile; /* Name of texture bitmap for dark squares */\r
481     int liteBackTextureMode;\r
482     int darkBackTextureMode;\r
483     char * renderPiecesWithFont; /* Name of font for rendering chess pieces */\r
484     char * fontToPieceTable; /* Map to translate font character to chess pieces */\r
485     int fontBackColorWhite;\r
486     int fontForeColorWhite;\r
487     int fontBackColorBlack;\r
488     int fontForeColorBlack;\r
489     int fontPieceSize; /* Size of font relative to square (percentage) */\r
490     int overrideLineGap; /* If >= 0 overrides the lineGap value of the board size properties */\r
491     int adjudicateLossThreshold; /* Adjudicate a two-machine game if both engines agree the score is below this for 6 plies */\r
492     int delayBeforeQuit;\r
493     int delayAfterQuit;\r
494     char * nameOfDebugFile;\r
495     char * pgnEventHeader;\r
496     int defaultFrcPosition;\r
497     char * gameListTags;\r
498     Boolean saveOutOfBookInfo;\r
499     Boolean showEvalInMoveHistory;\r
500     int evalHistColorWhite;\r
501     int evalHistColorBlack;\r
502     Boolean highlightMoveWithArrow;\r
503     int highlightArrowColor;\r
504     Boolean useStickyWindows;\r
505     int adjudicateDrawMoves;\r
506     Boolean autoDisplayComment;\r
507     Boolean autoDisplayTags;\r
508     Boolean firstIsUCI;\r
509     Boolean secondIsUCI;\r
510     Boolean firstHasOwnBookUCI;\r
511     Boolean secondHasOwnBookUCI;\r
512     char * polyglotDir;\r
513     Boolean usePolyglotBook;\r
514     char * polyglotBook;\r
515     int defaultHashSize;\r
516     int defaultCacheSizeEGTB;\r
517     char * defaultPathEGTB;\r
518 \r
519     /* [HGM] Board size */\r
520     int NrFiles;\r
521     int NrRanks;\r
522     int holdingsSize;\r
523     int matchPause;\r
524     Boolean alphaRank;\r
525     Boolean testClaims;\r
526     Boolean checkMates;\r
527     Boolean materialDraws;\r
528     Boolean trivialDraws;\r
529     int ruleMoves;\r
530     int drawRepeats;\r
531     char * pieceToCharTable;\r
532 \r
533 #if ZIPPY\r
534     char *zippyLines;\r
535     char *zippyPinhead;\r
536     char *zippyPassword;\r
537     char *zippyPassword2;\r
538     char *zippyWrongPassword;\r
539     char *zippyAcceptOnly;\r
540     int zippyUseI;\r
541     int zippyBughouse;\r
542     int zippyNoplayCrafty;\r
543     char *zippyGameEnd;\r
544     char *zippyGameStart;\r
545     int zippyAdjourn;\r
546     int zippyAbort;\r
547     char *zippyVariants;\r
548     int zippyMaxGames;\r
549     int zippyReplayTimeout; /*seconds*/\r
550 #endif\r
551 } AppData, *AppDataPtr;\r
552 \r
553 /* [AS] PGN tags (for showing in the game list) */\r
554 #define GLT_EVENT           'e'\r
555 #define GLT_SITE            's'\r
556 #define GLT_DATE            'd'\r
557 #define GLT_ROUND           'o'\r
558 #define GLT_PLAYERS         'p'     /* I.e. white "-" black */\r
559 #define GLT_RESULT          'r'\r
560 #define GLT_WHITE_ELO       'w'\r
561 #define GLT_BLACK_ELO       'b'\r
562 #define GLT_TIME_CONTROL    't'\r
563 #define GLT_VARIANT         'v'\r
564 #define GLT_OUT_OF_BOOK     'a'\r
565 \r
566 #define GLT_DEFAULT_TAGS    "eprd"  /* Event, players, result, date */\r
567 \r
568 #define GLT_ALL_TAGS        "esdoprwbtva"\r
569 \r
570 #define PGN_OUT_OF_BOOK     "Annotator"\r
571 \r
572 extern AppData appData;\r
573 \r
574 typedef struct {\r
575     /* PGN 7-tag info */\r
576     char *event;\r
577     char *site;\r
578     char *date;\r
579     char *round;\r
580     char *white;\r
581     char *black;\r
582     ChessMove result;\r
583     /* Additional info */\r
584     char *fen;          /* NULL or FEN for starting position; input only */\r
585     char *resultDetails;\r
586     char *timeControl;\r
587     char *extraTags;    /* NULL or "[Tag \"Value\"]\n", etc. */\r
588     int whiteRating;    /* -1 if unknown */\r
589     int blackRating;    /* -1 if unknown */\r
590     VariantClass variant;\r
591     char *outOfBook;    /* [AS] Move and score when engine went out of book */\r
592     int boardWidth;     /* [HGM] adjustable board size */\r
593     int boardHeight;\r
594 /* [HGM] For Shogi and Crazyhouse: */\r
595     int holdingsSize;  /* number of different piece types in holdings       */\r
596     int holdingsWidth; /* number of files left and right of board, 0 or 2   */\r
597 } GameInfo;\r
598 \r
599 \r
600 #endif\r
601 \r
602 /* extern int holdingsWidth;  \r
603 extern int holdingsHeight; \r
604 /*extern int holdings[(int) EmptySquare];*/\r