changes from H.G. Muller; version 4.3.13
[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,fischerandom,crazyhouse,losers,suicide,3checks,twokings,bughouse,shatranj"\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     /* [HGM] the order here is crucial for Crazyhouse & Shogi: */\r
189     /* only the first N pieces can go into the holdings, and   */\r
190     /* promotions in those variants shift P-W to U-S           */\r
191     WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, \r
192     WhiteFerz, WhiteAlfil, WhiteAngel, WhiteMarshall, WhiteWazir, WhiteMan, \r
193     WhiteCannon, WhiteNightrider, WhiteCardinal, WhiteDragon, WhiteGrasshopper,\r
194     WhiteSilver, WhiteFalcon, WhiteLance, WhiteCobra, WhiteUnicorn, WhiteKing,\r
195     BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen,\r
196     BlackFerz, BlackAlfil, BlackAngel, BlackMarshall, BlackWazir, BlackMan, \r
197     BlackCannon, BlackNightrider, BlackCardinal, BlackDragon, BlackGrasshopper,\r
198     BlackSilver, BlackFalcon, BlackLance, BlackCobra, BlackUnicorn, BlackKing,\r
199     EmptySquare, \r
200     ClearBoard, WhitePlay, BlackPlay, PromotePiece, DemotePiece /*for use on EditPosition menus*/\r
201   } ChessSquare;\r
202 \r
203 /* [HGM] some macros that can be used as prefixes to convert piece types */\r
204 #define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int)\r
205 #define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int)\r
206 #define PROMOTED       (int)WhiteDragon - (int)WhiteRook + (int)\r
207 #define DEMOTED        (int)WhiteRook - (int)WhiteDragon + (int)\r
208 #define SHOGI          (int)EmptySquare + (int)\r
209 \r
210 \r
211 typedef ChessSquare Board[BOARD_SIZE][BOARD_SIZE];\r
212 \r
213 typedef enum {\r
214     WhiteKingSideCastle = 1, WhiteQueenSideCastle,\r
215     WhiteKingSideCastleWild, WhiteQueenSideCastleWild,\r
216     WhiteHSideCastleFR, WhiteASideCastleFR, \r
217     BlackKingSideCastle, BlackQueenSideCastle,\r
218     BlackKingSideCastleWild, BlackQueenSideCastleWild,\r
219     BlackHSideCastleFR, BlackASideCastleFR, \r
220     WhitePromotionKnight, WhitePromotionBishop,\r
221     WhitePromotionRook, WhitePromotionQueen, WhitePromotionKing,\r
222     WhitePromotionChancellor, WhitePromotionArchbishop,\r
223     BlackPromotionKnight, BlackPromotionBishop,\r
224     BlackPromotionRook, BlackPromotionQueen, BlackPromotionKing,\r
225     BlackPromotionChancellor, BlackPromotionArchbishop,\r
226     WhiteCapturesEnPassant, BlackCapturesEnPassant,\r
227     WhiteDrop, BlackDrop, \r
228     NormalMove, AmbiguousMove, IllegalMove, ImpossibleMove,\r
229     WhiteWins, BlackWins, GameIsDrawn, GameUnfinished,\r
230     GNUChessGame, XBoardGame, MoveNumberOne, \r
231     Comment, PositionDiagram, ElapsedTime, PGNTag, NAG\r
232   } ChessMove;\r
233 \r
234 typedef enum {\r
235     ColorShout, ColorSShout, ColorChannel1, ColorChannel, ColorKibitz,\r
236     ColorTell, ColorChallenge, ColorRequest, ColorSeek, ColorNormal,\r
237     ColorNone, NColorClasses\r
238 } ColorClass;\r
239 \r
240 typedef enum {\r
241     SoundMove, SoundBell, SoundAlarm, SoundIcsWin, SoundIcsLoss,\r
242     SoundIcsDraw, SoundIcsUnfinished, NSoundClasses\r
243 } SoundClass;\r
244 \r
245 /* Names for chess variants, not necessarily supported */\r
246 typedef enum {\r
247     VariantNormal,       /* Normal chess */\r
248     VariantLoadable,     /* "loadgame" command allowed (not really a variant)*/\r
249     VariantWildCastle,   /* Shuffle chess where king can castle from d file */\r
250     VariantNoCastle,     /* Shuffle chess with no castling at all */\r
251     VariantFischeRandom, /* FischeRandom */\r
252     VariantBughouse,     /* Bughouse, ICC/FICS rules */\r
253     VariantCrazyhouse,   /* Crazyhouse, ICC/FICS rules */\r
254     VariantLosers,       /* Try to lose all pieces or get mated (ICC wild 17)*/\r
255     VariantSuicide,      /* Try to lose all pieces incl. king (FICS) */\r
256     VariantGiveaway,     /* Try to have no legal moves left (ICC wild 26) */\r
257     VariantTwoKings,     /* Weird ICC wild 9 */\r
258     VariantKriegspiel,   /* Kriegspiel; pawns can capture invisible pieces */\r
259     VariantAtomic,       /* Capturing piece explodes (ICC wild 27) */\r
260     Variant3Check,       /* Win by giving check 3 times (ICC wild 25) */\r
261     VariantShatranj,     /* Unsupported (ICC wild 28) */\r
262     Variant29,           /* Temporary name for possible future ICC wild 29 */\r
263     Variant30,           /* Temporary name for possible future ICC wild 30 */\r
264     Variant31,           /* Temporary name for possible future ICC wild 31 */\r
265     Variant32,           /* Temporary name for possible future ICC wild 32 */\r
266     Variant33,           /* Temporary name for possible future ICC wild 33 */\r
267     Variant34,           /* Temporary name for possible future ICC wild 34 */\r
268     Variant35,           /* Temporary name for possible future ICC wild 35 */\r
269     Variant36,           /* Temporary name for possible future ICC wild 36 */\r
270     VariantShogi,        /* [HGM] added variants */\r
271     VariantXiangqi,\r
272     VariantCourier,\r
273     VariantGothic,\r
274     VariantCapablanca,\r
275     VariantKnightmate,\r
276     VariantFairy,        \r
277     VariantCylinder,\r
278     VariantFalcon,\r
279     VariantUnknown       /* Catchall for other unknown variants */\r
280 } VariantClass;\r
281 \r
282 #define VARIANT_NAMES { \\r
283   "normal", \\r
284   "normal", \\r
285   "wildcastle", \\r
286   "nocastle", \\r
287   "fischerandom", \\r
288   "bughouse", \\r
289   "crazyhouse", \\r
290   "losers", \\r
291   "suicide", \\r
292   "giveaway", \\r
293   "twokings", \\r
294   "kriegspiel", \\r
295   "atomic", \\r
296   "3check", \\r
297   "shatranj", \\r
298   "wild29", \\r
299   "wild30", \\r
300   "wild31", \\r
301   "wild32", \\r
302   "wild33", \\r
303   "wild34", \\r
304   "wild35", \\r
305   "wild36", \\r
306   "shogi", \\r
307   "xiangqi", \\r
308   "courier", \\r
309   "gothic", \\r
310   "capablanca", \\r
311   "knightmate", \\r
312   "fairy", \\r
313   "cylinder", \\r
314   "falcon",\\r
315   "unknown" \\r
316 }\r
317 \r
318 typedef struct {\r
319 #if !defined(_amigados)\r
320     char *whitePieceColor;\r
321     char *blackPieceColor;\r
322     char *lightSquareColor;\r
323     char *darkSquareColor;\r
324     char *jailSquareColor;\r
325     char *highlightSquareColor;\r
326     char *premoveHighlightColor;\r
327 #else\r
328     int whitePieceColor;\r
329     int blackPieceColor;\r
330     int lightSquareColor;\r
331     int darkSquareColor;\r
332     int jailSquareColor;\r
333     int highlightSquareColor;\r
334     int premoveHighlightColor;\r
335 #endif\r
336     int movesPerSession;\r
337     int timeIncrement;\r
338     char *initString;\r
339     char *secondInitString;\r
340     char *firstComputerString;\r
341     char *secondComputerString;\r
342     char *firstChessProgram;\r
343     char *secondChessProgram;\r
344     char *firstDirectory;\r
345     char *secondDirectory;\r
346     Boolean firstPlaysBlack;\r
347     Boolean noChessProgram;\r
348     char *firstHost;\r
349     char *secondHost;\r
350     char *bitmapDirectory;\r
351     char *remoteShell;\r
352     char *remoteUser;\r
353     float timeDelay;\r
354     char *timeControl;\r
355     Boolean icsActive;\r
356     char *icsHost;\r
357     char *icsPort;\r
358     char *icsCommPort;  /* if set, use serial port instead of tcp host/port */\r
359     char *icsLogon;     /* Hack to permit variable logon scripts. */\r
360     char *icsHelper;\r
361     Boolean icsInputBox;\r
362     Boolean useTelnet;\r
363     char *telnetProgram;\r
364     char *gateway;\r
365     char *loadGameFile;\r
366     int loadGameIndex;      /* game # within file */\r
367     char *saveGameFile;\r
368     Boolean autoSaveGames;\r
369     char *loadPositionFile;\r
370     int loadPositionIndex;  /* position # within file */\r
371     char *savePositionFile;\r
372     Boolean matchMode;\r
373     int matchGames;\r
374     Boolean monoMode;\r
375     Boolean debugMode;\r
376     Boolean clockMode;\r
377     char *boardSize;\r
378     Boolean Iconic;\r
379     char *searchTime;\r
380     int searchDepth;\r
381     Boolean showCoords;\r
382     char *clockFont;\r
383     char *messageFont; /* WinBoard only */\r
384     char *coordFont;\r
385     char *font; /* xboard only: all other fonts */\r
386     char *tagsFont; /* WinBoard only */\r
387     char *commentFont; /* WinBoard only */\r
388     char *icsFont; /* WinBoard only */\r
389     Boolean ringBellAfterMoves;\r
390     Boolean autoCallFlag;\r
391     Boolean flipView;\r
392     Boolean autoFlipView;\r
393     char *cmailGameName; /* xboard only */\r
394     Boolean alwaysPromoteToQueen;\r
395     Boolean oldSaveStyle;\r
396     Boolean quietPlay;\r
397     Boolean showThinking;\r
398     Boolean ponderNextMove;\r
399     Boolean periodicUpdates;\r
400     Boolean autoObserve;\r
401     Boolean autoComment;\r
402     Boolean getMoveList;\r
403     Boolean testLegality;\r
404     int borderXoffset; /* xboard only */\r
405     int borderYoffset; /* xboard only */\r
406     Boolean titleInWindow; /* xboard only */\r
407     Boolean localLineEditing; /* WinBoard only */\r
408     Boolean zippyTalk;\r
409     Boolean zippyPlay;\r
410     int flashCount; /* Number of times to flash (xboard only) */\r
411     int flashRate; /* Flashes per second (xboard only)  */\r
412     char *pixmapDirectory; /* Path to XPM/XIM files to use (xboard only) */\r
413     int msLoginDelay;  /* Delay per character (in msec) while sending\r
414                           ICS logon script (xboard only) */\r
415     Boolean colorize;   /* If True, use the following colors to color text */\r
416     /* Strings for colors, as "fg, bg, bold" (strings used in xboard only) */\r
417     char *colorShout;\r
418     char *colorSShout;\r
419     char *colorChannel1;\r
420     char *colorChannel;\r
421     char *colorKibitz;\r
422     char *colorTell;\r
423     char *colorChallenge;\r
424     char *colorRequest;\r
425     char *colorSeek;\r
426     char *colorNormal;\r
427     char *soundProgram; /* sound-playing program */\r
428     char *soundShout;\r
429     char *soundSShout;\r
430     char *soundChannel1;\r
431     char *soundChannel;\r
432     char *soundKibitz;\r
433     char *soundTell;\r
434     char *soundChallenge;\r
435     char *soundRequest;\r
436     char *soundSeek;\r
437     char *soundMove;\r
438     char *soundIcsWin;\r
439     char *soundIcsLoss;\r
440     char *soundIcsDraw;\r
441     char *soundIcsUnfinished;\r
442     char *soundIcsAlarm;\r
443     Boolean reuseFirst;\r
444     Boolean reuseSecond;\r
445     Boolean animateDragging; /* If True, animate mouse dragging of pieces */\r
446     Boolean animate;    /* If True, animate non-mouse moves */\r
447     int animSpeed;      /* Delay in milliseconds between animation frames */\r
448     Boolean popupMoveErrors;\r
449     Boolean popupExitMessage;\r
450     int showJail;\r
451     Boolean highlightLastMove;\r
452     Boolean highlightDragging;\r
453     Boolean blindfold;          /* if true, no pieces are drawn */\r
454     Boolean premove;            /* true if premove feature enabled */ \r
455     Boolean premoveWhite;       /* true if premoving White first move  */ \r
456     char *premoveWhiteText;     /* text of White premove 1 */ \r
457     Boolean premoveBlack;       /* true if premoving Black first move */ \r
458     char *premoveBlackText;     /* text of Black premove 1 */ \r
459     Boolean icsAlarm;           /* true if sounding alarm at a certain time */  \r
460     int icsAlarmTime;           /* time to sound alarm, in milliseconds */\r
461     Boolean autoRaiseBoard;\r
462     int fontSizeTolerance; /* xboard only */\r
463     char *initialMode;\r
464     char *variant;\r
465     int firstProtocolVersion;\r
466     int secondProtocolVersion;\r
467     Boolean showButtonBar;\r
468 \r
469     /* [AS] New properties (down to the "ZIPPY" part) */\r
470     Boolean firstScoreIsAbsolute;  /* If true, engine score is always from white side */\r
471     Boolean secondScoreIsAbsolute; /* If true, engine score is always from white side */\r
472     Boolean saveExtendedInfoInPGN; /* If true, saved PGN games contain extended info */\r
473     Boolean hideThinkingFromHuman; /* If true, program thinking is generated but not displayed in human/computer matches */\r
474     char * liteBackTextureFile; /* Name of texture bitmap for lite squares */\r
475     char * darkBackTextureFile; /* Name of texture bitmap for dark squares */\r
476     int liteBackTextureMode;\r
477     int darkBackTextureMode;\r
478     char * renderPiecesWithFont; /* Name of font for rendering chess pieces */\r
479     char * fontToPieceTable; /* Map to translate font character to chess pieces */\r
480     int fontBackColorWhite;\r
481     int fontForeColorWhite;\r
482     int fontBackColorBlack;\r
483     int fontForeColorBlack;\r
484     int fontPieceSize; /* Size of font relative to square (percentage) */\r
485     int overrideLineGap; /* If >= 0 overrides the lineGap value of the board size properties */\r
486     int adjudicateLossThreshold; /* Adjudicate a two-machine game if both engines agree the score is below this for 6 plies */\r
487     int delayBeforeQuit;\r
488     int delayAfterQuit;\r
489     char * nameOfDebugFile;\r
490     char * pgnEventHeader;\r
491     int defaultFrcPosition;\r
492     char * gameListTags;\r
493     Boolean saveOutOfBookInfo;\r
494     Boolean showEvalInMoveHistory;\r
495     int evalHistColorWhite;\r
496     int evalHistColorBlack;\r
497     Boolean highlightMoveWithArrow;\r
498     int highlightArrowColor;\r
499     Boolean useStickyWindows;\r
500     int adjudicateDrawMoves;\r
501     Boolean autoDisplayComment;\r
502     Boolean autoDisplayTags;\r
503     Boolean firstIsUCI;\r
504     Boolean secondIsUCI;\r
505     Boolean firstHasOwnBookUCI;\r
506     Boolean secondHasOwnBookUCI;\r
507     char * polyglotDir;\r
508     Boolean usePolyglotBook;\r
509     char * polyglotBook;\r
510     int defaultHashSize;\r
511     int defaultCacheSizeEGTB;\r
512     char * defaultPathEGTB;\r
513 \r
514     /* [HGM] Board size */\r
515     int NrFiles;\r
516     int NrRanks;\r
517     int holdingsSize;\r
518     int matchPause;\r
519     char * pieceToCharTable;\r
520     Boolean allWhite;\r
521     Boolean upsideDown;\r
522     Boolean alphaRank;\r
523     Boolean testClaims;\r
524     Boolean checkMates;\r
525     Boolean materialDraws;\r
526     Boolean trivialDraws;\r
527     int ruleMoves;\r
528     int drawRepeats;\r
529 \r
530 #if ZIPPY\r
531     char *zippyLines;\r
532     char *zippyPinhead;\r
533     char *zippyPassword;\r
534     char *zippyPassword2;\r
535     char *zippyWrongPassword;\r
536     char *zippyAcceptOnly;\r
537     int zippyUseI;\r
538     int zippyBughouse;\r
539     int zippyNoplayCrafty;\r
540     char *zippyGameEnd;\r
541     char *zippyGameStart;\r
542     int zippyAdjourn;\r
543     int zippyAbort;\r
544     char *zippyVariants;\r
545     int zippyMaxGames;\r
546     int zippyReplayTimeout; /*seconds*/\r
547 #endif\r
548 \r
549     char *serverMovesName;\r
550     Boolean suppressLoadMoves;\r
551     int serverPause;\r
552     int firstTimeOdds;\r
553     int secondTimeOdds;\r
554     int timeOddsMode;\r
555     int firstAccumulateTC;\r
556     int secondAccumulateTC;\r
557 } AppData, *AppDataPtr;\r
558 \r
559 /* [AS] PGN tags (for showing in the game list) */\r
560 #define GLT_EVENT           'e'\r
561 #define GLT_SITE            's'\r
562 #define GLT_DATE            'd'\r
563 #define GLT_ROUND           'o'\r
564 #define GLT_PLAYERS         'p'     /* I.e. white "-" black */\r
565 #define GLT_RESULT          'r'\r
566 #define GLT_WHITE_ELO       'w'\r
567 #define GLT_BLACK_ELO       'b'\r
568 #define GLT_TIME_CONTROL    't'\r
569 #define GLT_VARIANT         'v'\r
570 #define GLT_OUT_OF_BOOK     'a'\r
571 \r
572 #define GLT_DEFAULT_TAGS    "eprd"  /* Event, players, result, date */\r
573 \r
574 #define GLT_ALL_TAGS        "esdoprwbtva"\r
575 \r
576 #define PGN_OUT_OF_BOOK     "Annotator"\r
577 \r
578 extern AppData appData;\r
579 \r
580 typedef struct {\r
581     /* PGN 7-tag info */\r
582     char *event;\r
583     char *site;\r
584     char *date;\r
585     char *round;\r
586     char *white;\r
587     char *black;\r
588     ChessMove result;\r
589     /* Additional info */\r
590     char *fen;          /* NULL or FEN for starting position; input only */\r
591     char *resultDetails;\r
592     char *timeControl;\r
593     char *extraTags;    /* NULL or "[Tag \"Value\"]\n", etc. */\r
594     int whiteRating;    /* -1 if unknown */\r
595     int blackRating;    /* -1 if unknown */\r
596     VariantClass variant;\r
597     char *outOfBook;    /* [AS] Move and score when engine went out of book */\r
598     int boardWidth;     /* [HGM] adjustable board size */\r
599     int boardHeight;\r
600 /* [HGM] For Shogi and Crazyhouse: */\r
601     int holdingsSize;  /* number of different piece types in holdings       */\r
602     int holdingsWidth; /* number of files left and right of board, 0 or 2   */\r
603 } GameInfo;\r
604 \r
605 \r
606 #endif\r
607 \r