Start implementing EPD test suites
[xboard.git] / common.h
1 /*
2  * common.h -- Common definitions for X and Windows NT versions of XBoard
3  *
4  * Copyright 1991 by Digital Equipment Corporation, Maynard,
5  * Massachusetts.
6  *
7  * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
8  * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc.
9  *
10  * Enhancements Copyright 2005 Alessandro Scotti
11  *
12  * The following terms apply to Digital Equipment Corporation's copyright
13  * interest in XBoard:
14  * ------------------------------------------------------------------------
15  * All Rights Reserved
16  *
17  * Permission to use, copy, modify, and distribute this software and its
18  * documentation for any purpose and without fee is hereby granted,
19  * provided that the above copyright notice appear in all copies and that
20  * both that copyright notice and this permission notice appear in
21  * supporting documentation, and that the name of Digital not be
22  * used in advertising or publicity pertaining to distribution of the
23  * software without specific, written prior permission.
24  *
25  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
26  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
27  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
28  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
29  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
30  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
31  * SOFTWARE.
32  * ------------------------------------------------------------------------
33  *
34  * The following terms apply to the enhanced version of XBoard
35  * distributed by the Free Software Foundation:
36  * ------------------------------------------------------------------------
37  *
38  * GNU XBoard is free software: you can redistribute it and/or modify
39  * it under the terms of the GNU General Public License as published by
40  * the Free Software Foundation, either version 3 of the License, or (at
41  * your option) any later version.
42  *
43  * GNU XBoard is distributed in the hope that it will be useful, but
44  * WITHOUT ANY WARRANTY; without even the implied warranty of
45  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
46  * General Public License for more details.
47  *
48  * You should have received a copy of the GNU General Public License
49  * along with this program. If not, see http://www.gnu.org/licenses/.  *
50  *
51  *------------------------------------------------------------------------
52  ** See the file ChangeLog for a revision history.  */
53
54 #ifndef XB_COMMON
55 #define XB_COMMON
56
57
58 /* Begin compatibility grunge  */
59
60 #if defined(__STDC__) || defined(WIN32) || defined(_amigados)
61 #define P(args) args
62 typedef void *VOIDSTAR;
63 #else
64 #define P(args)         ()
65 typedef char *VOIDSTAR;
66 #endif
67
68 #ifdef WIN32
69 typedef char Boolean;
70 typedef char *String;
71 #define popen _popen
72 #define pclose _pclose
73
74 #else
75 #ifdef _amigados        /*  It is important, that these types have  */
76 typedef int Boolean;    /*  a length of 4 bytes each, as we are     */
77 typedef char *String;   /*  using ReadArgs() for argument parsing.  */
78 #ifdef _DCC
79 FILE *popen(const char *, const char *);
80 int pclose(FILE *);
81 #endif
82
83 #else
84 #ifdef X11
85 #include <X11/Intrinsic.h>
86 #else
87 typedef char Boolean;
88 typedef char *String;
89 #define True 1
90 #define False 0
91 #endif
92 #endif
93 #endif
94
95
96 #ifndef TRUE
97 #define TRUE 1
98 #define FALSE 0
99 #endif
100
101 #define UNKNOWN -1 /* [HGM] nps */
102
103 #if !HAVE_RANDOM
104 # if HAVE_RAND48
105 #  define srandom srand48
106 #  define random lrand48
107 # else /* not HAVE_RAND48 */
108 #  define srandom srand
109 #  define random rand
110 # endif /* not HAVE_RAND48 */
111 #endif /* !HAVE_RANDOM */
112
113 /* End compatibility grunge */
114
115 /* unsigned int 64 for engine nodes work and display */
116 #ifdef WIN32
117        /* I don't know the name for this type of other compiler
118         * If it not work, just modify here
119         * This is for MS Visual Studio
120         */
121        #ifdef _MSC_VER
122                #define u64 unsigned __int64
123                #define s64 signed __int64
124                #define u64Display "%I64u"
125                #define s64Display "%I64d"
126                #define u64Const(c) (c ## UI64)
127                #define s64Const(c) (c ## I64)
128        #else
129                /* place holder
130                 * or dummy types for other compiler
131                 * [HGM] seems that -mno-cygwin comple needs %I64?
132                 */
133                #define u64 unsigned long long
134                #define s64 signed long long
135                #ifdef USE_I64
136                   #define u64Display "%I64u"
137                   #define s64Display "%I64d"
138                #else
139                   #define u64Display "%llu"
140                   #define s64Display "%lld"
141                #endif
142                #define u64Const(c) (c ## ULL)
143                #define s64Const(c) (c ## LL)
144        #endif
145 #else
146        /* GNU gcc */
147        #define u64 unsigned long long
148        #define s64 signed long long
149        #define u64Display "%llu"
150        #define s64Display "%lld"
151        #define u64Const(c) (c ## ull)
152        #define s64Const(c) (c ## ll)
153 #endif
154
155 #define PROTOVER                2       /* engine protocol version */
156
157 // [HGM] license: Messages that engines must print to satisfy their license requirements for patented variants
158 #define GOTHIC "Gothic Chess (see www.GothicChess.com) is licensed under U.S. Patent #6,481,716 by Ed Trice"
159 #define FALCON "Falcon Chess (see www.chessvariants.com) is licensed under U.S. Patent #5,690,334 by George W. Duke"
160
161 /* [HGM] Some notes about board sizes:
162    In games that allow piece drops, the holdings are considered part of the
163    board, in the leftmost and rightmost two files. This way they are
164    automatically part of the game-history states, and enjoy all display
165    functions (including drag-drop and click-click moves to the regular part
166    of the board). The drawback of this is that the internal numbering of
167    files starts at 2 for the a-file if holdings are displayed. To ensure
168    consistency, this shifted numbering system is used _everywhere_ in the
169    code, and conversion to the 'normal' system only takes place when the
170    file number is converted to or from ASCII (by redefining the character
171    constant 'a'). This works because Winboard only communicates with the
172    outside world in ASCII. In a similar way, the different rank numbering
173    systems (starting at rank 0 or 1) are implemented by redefining '1'.
174 */
175 #define BOARD_RANKS             17            /* [HGM] for in declarations  */
176 #define BOARD_FILES             16             /* [HGM] for in declarations  */
177 #define BOARD_HEIGHT (gameInfo.boardHeight)    /* [HGM] made user adjustable */
178 #define BOARD_WIDTH  (gameInfo.boardWidth + 2*gameInfo.holdingsWidth)
179 #define BOARD_LEFT   (gameInfo.holdingsWidth)  /* [HGM] play-board edges     */
180 #define BOARD_RGHT   (gameInfo.boardWidth + gameInfo.holdingsWidth)
181 #define CASTLING     (BOARD_RANKS-1)           /* [HGM] hide in upper rank   */
182 #define VIRGIN       (BOARD_RANKS-2)           /* [HGM] pieces not moved     */
183 #define TOUCHED_W    CASTLING][(BOARD_FILES-6) /* [HGM] in upper rank        */
184 #define TOUCHED_B    CASTLING][(BOARD_FILES-5) /* [HGM] in upper rank        */
185 #define EP_RANK      CASTLING][(BOARD_FILES-4) /* [HGM] in upper rank        */
186 #define EP_FILE      CASTLING][(BOARD_FILES-3) /* [HGM] in upper rank        */
187 #define EP_STATUS    CASTLING][(BOARD_FILES-2) /* [HGM] in upper rank        */
188 #define HOLDINGS_SET CASTLING][(BOARD_FILES-1) /* [HGM] in upper-right corner*/
189 #define ONE          ('1'-(BOARD_HEIGHT==10)-appData.rankOffset)  /* [HGM] foremost board rank  */
190 #define AAA          ('a'-BOARD_LEFT)          /* [HGM] leftmost board file  */
191 #define VIRGIN_W                 1             /* [HGM] flags in Board[VIRGIN][X] */
192 #define VIRGIN_B                 2
193 #define DROP_RANK               -3
194 #define MAX_MOVES               1000
195 #define MSG_SIZ                 512
196 #define DIALOG_SIZE             256
197 #define STAR_MATCH_N            16
198 #define MOVE_LEN                32
199 #define TIME_CONTROL            "5"     /* in minutes */
200 #define TIME_DELAY_QUOTE        "1.0"   /* seconds between moves */
201 #define TIME_DELAY              ((float) 1.0)
202 #define MOVES_PER_SESSION       40      /* moves per TIME_CONTROL */
203 #define TIME_INCREMENT          -1      /* if >= 0, MOVES_PER_SESSION unused */
204 #define WhiteOnMove(move)       (((move) % 2) == 0)
205 #define ICS_HOST                "chessclub.com"
206 #define ICS_PORT                "5000"
207 #define ICS_COMM_PORT           ""
208 #define FIRST_HOST              "localhost"
209 #define SECOND_HOST             "localhost"
210 #define TELNET_PROGRAM          "telnet"
211 #define DEF_BITMAP_DIR          BITMAPDIR
212 #define MATCH_MODE              "False"
213 #define INIT_STRING             "new\nrandom\n"
214 #define WHITE_STRING            "white\ngo\n"
215 #define BLACK_STRING            "black\ngo\n"
216 #define COMPUTER_STRING         "computer\n"
217 #define REUSE_CHESS_PROGRAMS    1
218 #define WHITE_PIECE_COLOR       "#FFFFCC"
219 #define BLACK_PIECE_COLOR       "#202020"
220 #define LIGHT_SQUARE_COLOR      "#C8C365"
221 #define DARK_SQUARE_COLOR       "#77A26D"
222 #define JAIL_SQUARE_COLOR       "#808080"
223 #define HIGHLIGHT_SQUARE_COLOR  "#FFFF00"
224 #define PREMOVE_HIGHLIGHT_COLOR "#FF0000"
225 #define LOWTIMEWARNING_COLOR    "#FF0000"
226 #define BELLCHAR                '\007'
227 #define NULLCHAR                '\000'
228 #define FEATURE_TIMEOUT         10000 /*ms*/
229
230 #define CLOCK_FONT 0
231 #define MESSAGE_FONT 1
232 #define COORD_FONT 2
233 #define CONSOLE_FONT 3
234 #define COMMENT_FONT 4
235 #define EDITTAGS_FONT 5
236 #define MOVEHISTORY_FONT 6
237 #define GAMELIST_FONT 7
238 #define NUM_FONTS 8
239
240 /* Default to no flashing (the "usual" XBoard behavior) */
241 #define FLASH_COUNT     0               /* Number of times to flash */
242 #define FLASH_RATE      5               /* Flashes per second */
243
244 /* Default delay per character (in msec) while sending login script */
245 #define MS_LOGIN_DELAY  0
246
247 /* [AS] Support for background textures */
248 #define BACK_TEXTURE_MODE_DISABLED      0
249 #define BACK_TEXTURE_MODE_PLAIN         1
250 #define BACK_TEXTURE_MODE_FULL_RANDOM   2
251
252 /* Zippy defaults */
253 #define ZIPPY_TALK FALSE
254 #define ZIPPY_PLAY FALSE
255 #define ZIPPY_LINES "yow.lines"
256 #define ZIPPY_PINHEAD ""
257 #define ZIPPY_PASSWORD ""
258 #define ZIPPY_PASSWORD2 ""
259 #define ZIPPY_WRONG_PASSWORD ""
260 #define ZIPPY_ACCEPT_ONLY ""
261 #define ZIPPY_USE_I TRUE
262 #define ZIPPY_BUGHOUSE 0
263 #define ZIPPY_NOPLAY_CRAFTY FALSE
264 #define ZIPPY_GAME_END "gameend\n"
265 #define ZIPPY_GAME_START ""
266 #define ZIPPY_ADJOURN FALSE
267 #define ZIPPY_ABORT FALSE
268 #define ZIPPY_VARIANTS "normal,fischerandom,crazyhouse,losers,suicide,3checks,twokings,bughouse,shatranj"
269 #define ZIPPY_MAX_GAMES 0
270 #define ZIPPY_REPLAY_TIMEOUT 120
271
272 typedef VOIDSTAR ProcRef;
273 #define NoProc ((ProcRef) 0)
274 typedef VOIDSTAR InputSourceRef;
275
276 typedef void (*DelayedEventCallback) P((void));
277
278 typedef enum { Press, Release } ClickType;
279
280 typedef enum {
281     BeginningOfGame, MachinePlaysWhite, MachinePlaysBlack,
282     AnalyzeMode, AnalyzeFile, TwoMachinesPlay,
283     EditGame, PlayFromGameFile, EndOfGame, EditPosition, Training,
284     IcsIdle, IcsPlayingWhite, IcsPlayingBlack, IcsObserving,
285     IcsExamining
286   } GameMode;
287
288 typedef enum {
289     /* [HGM] the order here is crucial for Crazyhouse & Shogi: */
290     /* only the first N pieces can go into the holdings, and   */
291     /* promotions in those variants shift P-W to U-S           */
292     WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen,
293     WhiteFerz, WhiteAlfil, WhiteAngel, WhiteMarshall, WhiteWazir, WhiteMan,
294     WhiteCannon, WhiteNightrider, WhiteCardinal, WhiteDragon, WhiteGrasshopper,
295     WhiteSilver, WhiteFalcon, WhiteLance, WhiteCobra, WhiteUnicorn, WhiteLion,
296     WhiteWolf, WhiteOx, WhiteBoar, WhiteHelmet, WhiteViking,
297     WhiteTokin, WhiteClaw, WhitePCardinal, WhitePDragon, WhiteCat,
298     WhitePSword, WhiteMonarch, WhiteMother, WhiteNothing, WhitePRook, WhitePDagger,
299     WhiteDolphin, WhiteStag, WhiteHorned, WhiteEagle, WhiteSword,
300     WhiteCrown, WhiteHCrown, WhiteHorse, WhiteDrunk, WhitePBishop,
301     WhiteP1, WhiteP2, WhiteP3, WhiteP4, WhiteP5, 
302     WhiteKing,
303     BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen,
304     BlackFerz, BlackAlfil, BlackAngel, BlackMarshall, BlackWazir, BlackMan,
305     BlackCannon, BlackNightrider, BlackCardinal, BlackDragon, BlackGrasshopper,
306     BlackSilver, BlackFalcon, BlackLance, BlackCobra, BlackUnicorn, BlackLion,
307     BlackWolf, BlackOx, BlackBoar, BlackHelmet, BlackViking,
308     BlackTokin, BlackClaw, BlackPCardinal, BlackPDragon, BlackCat,
309     BlackPSword, BlackMonarch, BlackMother, BlackNothing, BlackPRook, BlackPDagger,
310     BlackDolphin, BlackStag, BlackHorned, BlackEagle, BlackSword,
311     BlackCrown, BlackHCrown, BlackHorse, BlackDrunk, BlackPBishop,
312     BlackP1, BlackP2, BlackP3, BlackP4, BlackP5,
313     BlackKing,
314     EmptySquare, DarkSquare,
315     NoRights, // [HGM] gamestate: for castling rights hidden in board[CASTLING]
316     ClearBoard, WhitePlay, BlackPlay, PromotePiece, DemotePiece /*for use on EditPosition menus*/
317   } ChessSquare;
318
319 /* [HGM] some macros that can be used as prefixes to convert piece types */
320 #define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int)
321 #define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int)
322 #define PROMOTED       (int)WhiteDragon - (int)WhiteRook + (int)
323 #define DEMOTED        (int)WhiteRook - (int)WhiteDragon + (int)
324 #define SHOGI          (int)EmptySquare + (int)
325 #define CHUPROMOTED    ((int)WhitePDragon - (int)WhiteDragon)*(gameInfo.variant == VariantChu) + PROMOTED
326 #define CHUDEMOTED     ((int)WhiteDragon - (int)WhitePDragon)*(gameInfo.variant == VariantChu) + DEMOTED
327 #define IS_SHOGI(V)    ((V) == VariantShogi || (V) == VariantChu)
328 #define IS_LION(V)     ((V) == WhiteLion || (V) == BlackLion)
329
330
331 typedef ChessSquare Board[BOARD_RANKS][BOARD_FILES];
332
333 typedef enum {
334     EndOfFile = 0,
335     WhiteKingSideCastle, WhiteQueenSideCastle,
336     WhiteKingSideCastleWild, WhiteQueenSideCastleWild,
337     WhiteHSideCastleFR, WhiteASideCastleFR,
338     BlackKingSideCastle, BlackQueenSideCastle,
339     BlackKingSideCastleWild, BlackQueenSideCastleWild,
340     BlackHSideCastleFR, BlackASideCastleFR,
341     WhitePromotion, WhiteNonPromotion,
342     BlackPromotion, BlackNonPromotion,
343     WhiteCapturesEnPassant, BlackCapturesEnPassant,
344     WhiteDrop, BlackDrop, FirstLeg,
345     NormalMove, AmbiguousMove, IllegalMove, ImpossibleMove,
346     WhiteWins, BlackWins, GameIsDrawn, GameUnfinished,
347     GNUChessGame, XBoardGame, MoveNumberOne, Open, Close, Nothing,
348     Comment, PositionDiagram, ElapsedTime, PGNTag, NAG
349   } ChessMove;
350
351 typedef enum {
352     ColorShout, ColorSShout, ColorChannel1, ColorChannel, ColorKibitz,
353     ColorTell, ColorChallenge, ColorRequest, ColorSeek, ColorNormal,
354     ColorNone, NColorClasses
355 } ColorClass;
356
357 typedef enum {
358     SoundMove, SoundBell, SoundRoar, SoundAlarm, SoundIcsWin, SoundIcsLoss,
359     SoundIcsDraw, SoundIcsUnfinished, NSoundClasses
360 } SoundClass;
361
362 /* Names for chess variants, not necessarily supported */
363 typedef enum {
364     VariantNormal,       /* Normal chess */
365     VariantLoadable,     /* "loadgame" command allowed (not really a variant)*/
366     VariantWildCastle,   /* Shuffle chess where king can castle from d file */
367     VariantNoCastle,     /* Shuffle chess with no castling at all */
368     VariantFischeRandom, /* FischeRandom */
369     VariantBughouse,     /* Bughouse, ICC/FICS rules */
370     VariantCrazyhouse,   /* Crazyhouse, ICC/FICS rules */
371     VariantLosers,       /* Try to lose all pieces or get mated (ICC wild 17)*/
372     VariantSuicide,      /* Try to lose all pieces incl. king (FICS) */
373     VariantGiveaway,     /* Try to have no legal moves left (ICC wild 26) */
374     VariantTwoKings,     /* Weird ICC wild 9 */
375     VariantKriegspiel,   /* Kriegspiel; pawns can capture invisible pieces */
376     VariantAtomic,       /* Capturing piece explodes (ICC wild 27) */
377     Variant3Check,       /* Win by giving check 3 times (ICC wild 25) */
378     VariantShatranj,     /* Unsupported (ICC wild 28) */
379     Variant29,           /* Temporary name for possible future ICC wild 29 */
380     Variant30,           /* Temporary name for possible future ICC wild 30 */
381     Variant31,           /* Temporary name for possible future ICC wild 31 */
382     Variant32,           /* Temporary name for possible future ICC wild 32 */
383     Variant33,           /* Temporary name for possible future ICC wild 33 */
384     Variant34,           /* Temporary name for possible future ICC wild 34 */
385     Variant35,           /* Temporary name for possible future ICC wild 35 */
386     Variant36,           /* Temporary name for possible future ICC wild 36 */
387     VariantShogi,        /* [HGM] added variants */
388     VariantChu,
389     VariantCourier,
390     VariantGothic,
391     VariantCapablanca,
392     VariantKnightmate,
393     VariantFairy,
394     VariantCylinder,
395     VariantFalcon,
396     VariantCapaRandom,
397     VariantBerolina,
398     VariantJanus,
399     VariantSuper,
400     VariantGreat,
401     VariantTwilight,
402     VariantMakruk,
403     VariantSChess,
404     VariantGrand,
405     VariantSpartan,
406     VariantXiangqi,
407     VariantASEAN,
408     VariantLion,
409     VariantChuChess,
410     VariantUnknown       /* Catchall for other unknown variants */
411 } VariantClass;
412
413 #define VARIANT_NAMES { \
414   "normal", \
415   "normal", \
416   "wildcastle", \
417   "nocastle", \
418   "fischerandom", \
419   "bughouse", \
420   "crazyhouse", \
421   "losers", \
422   "suicide", \
423   "giveaway", \
424   "twokings", \
425   "kriegspiel", \
426   "atomic", \
427   "3check", \
428   "shatranj", \
429   "wild29", \
430   "wild30", \
431   "wild31", \
432   "wild32", \
433   "wild33", \
434   "wild34", \
435   "wild35", \
436   "wild36", \
437   "shogi", \
438   "chu", \
439   "courier", \
440   "gothic", \
441   "capablanca", \
442   "knightmate", \
443   "fairy", \
444   "cylinder", \
445   "falcon",\
446   "caparandom",\
447   "berolina",\
448   "janus",\
449   "super",\
450   "great",\
451   "twilight",\
452   "makruk",\
453   "seirawan",\
454   "grand",\
455   "spartan",\
456   "xiangqi", \
457   "asean",\
458   "lion",\
459   "elven",\
460   "unknown" \
461 }
462
463 #define ENGINES 2
464
465 typedef struct {
466     char *language;
467 #if !defined(_amigados)
468     char *whitePieceColor;
469     char *blackPieceColor;
470     char *lightSquareColor;
471     char *darkSquareColor;
472     char *jailSquareColor;
473     char *highlightSquareColor;
474     char *premoveHighlightColor;
475     char *dialogColor;
476     char *buttonColor;
477 #else
478     int whitePieceColor;
479     int blackPieceColor;
480     int lightSquareColor;
481     int darkSquareColor;
482     int jailSquareColor;
483     int highlightSquareColor;
484     int premoveHighlightColor;
485 #endif
486     int movesPerSession;
487     float timeIncrement;
488     char *engInitString[ENGINES];
489     char *computerString[ENGINES];
490     char *chessProgram[ENGINES];
491     char *directory[ENGINES];
492     char *pgnName[ENGINES];
493     Boolean firstPlaysBlack;
494     Boolean noChessProgram;
495     char *positionDir;
496     char *host[ENGINES];
497     char *themeNames;
498     char *pieceDirectory;
499     char *border;
500     char *soundDirectory;
501     char *remoteShell;
502     char *remoteUser;
503     float timeDelay;
504     char *timeControl;
505     Boolean trueColors;
506     Boolean icsActive;
507     Boolean autoBox;
508     char *icsHost;
509     char *icsPort;
510     char *icsCommPort;  /* if set, use serial port instead of tcp host/port */
511     char *icsLogon;     /* Hack to permit variable logon scripts. */
512     char *icsHelper;
513     Boolean icsInputBox;
514     Boolean useTelnet;
515     Boolean seekGraph;
516     Boolean autoRefresh;
517     char *telnetProgram;
518     char *gateway;
519     char *loadGameFile;
520     int loadGameIndex;      /* game # within file */
521     char *saveGameFile;
522     char *autoInstall;
523     Boolean autoSaveGames;
524     Boolean onlyOwn;        /* [HGM] suppress auto-saving of observed games */
525     char *loadPositionFile;
526     int loadPositionIndex;  /* position # within file */
527     char *savePositionFile;
528     Boolean fischerCastling;/* [HGM] fischer: allow Fischr castling in any variant */
529     Boolean matchMode;
530     int matchGames;
531     Boolean epd;
532     Boolean monoMode;
533     Boolean debugMode;
534     Boolean clockMode;
535     char *boardSize;
536     char *logoDir;
537     int logoSize;
538     Boolean Iconic;
539     char *searchTime;
540     int searchDepth;
541     Boolean showCoords;
542     char *clockFont;
543     char *messageFont; /* WinBoard only */
544     char *coordFont;
545     char *font; /* xboard only */
546     char *tagsFont;
547     char *commentFont;
548     char *historyFont;
549     char *gameListFont;
550     char *icsFont;
551     Boolean ringBellAfterMoves;
552     Boolean autoCallFlag;
553     Boolean flipView;
554     Boolean autoFlipView;
555     char *cmailGameName; /* xboard only */
556     Boolean headers;
557     Boolean alwaysPromoteToQueen;
558     Boolean oldSaveStyle;
559     Boolean oneClick;
560     Boolean quietPlay;
561     Boolean showThinking;
562     Boolean ponderNextMove;
563     Boolean periodicUpdates;
564     Boolean autoObserve;
565     Boolean autoCreateLogon;
566     Boolean autoComment;
567     Boolean getMoveList;
568     Boolean testLegality;
569     Boolean topLevel;      /* xboard, top-level auxiliary windows */
570     Boolean titleInWindow; /* xboard only */
571     Boolean localLineEditing; /* WinBoard only */
572     Boolean zippyTalk;
573     Boolean zippyPlay;
574     int flashCount; /* Number of times to flash (xboard only) */
575     int flashRate; /* Flashes per second (xboard only)  */
576     int msLoginDelay;  /* Delay per character (in msec) while sending
577                           ICS logon script (xboard only) */
578     Boolean colorize;   /* If True, use the following colors to color text */
579     /* Strings for colors, as "fg, bg, bold" (strings used in xboard only) */
580     char *colorShout;    // [HGM] IMPORTANT: order must conform to ColorClass definition
581     char *colorSShout;
582     char *colorChannel1;
583     char *colorChannel;
584     char *colorKibitz;
585     char *colorTell;
586     char *colorChallenge;
587     char *colorRequest;
588     char *colorSeek;
589     char *colorNormal;
590     char *soundProgram; /* sound-playing program */
591     char *soundShout;     // [HGM] IMPORTANT: order must be as in ColorClass
592     char *soundSShout;
593     char *soundChannel1;
594     char *soundChannel;
595     char *soundKibitz;
596     char *soundTell;
597     char *soundChallenge;
598     char *soundRequest;
599     char *soundSeek;
600     char *soundMove;     // [HGM] IMPORTANT: order must be as in SoundClass
601     char *soundBell;
602     char *soundRoar;
603     char *soundIcsAlarm;
604     char *soundIcsWin;
605     char *soundIcsLoss;
606     char *soundIcsDraw;
607     char *soundIcsUnfinished;
608     Boolean disguise;        /* [HGM] Promoted Pawns look like pieces in bughouse */
609     Boolean reuse[ENGINES];
610     Boolean animateDragging; /* If True, animate mouse dragging of pieces */
611     Boolean animate;    /* If True, animate non-mouse moves */
612     int animSpeed;      /* Delay in milliseconds between animation frames */
613     Boolean popupMoveErrors;
614     Boolean popupExitMessage;
615     int showJail;
616     Boolean highlightLastMove;
617     Boolean highlightDragging;
618     Boolean blindfold;          /* if true, no pieces are drawn */
619     Boolean premove;            /* true if premove feature enabled */
620     Boolean premoveWhite;       /* true if premoving White first move  */
621     char *premoveWhiteText;     /* text of White premove 1 */
622     Boolean premoveBlack;       /* true if premoving Black first move */
623     char *premoveBlackText;     /* text of Black premove 1 */
624     Boolean icsAlarm;           /* true if sounding alarm at a certain time */
625     int icsAlarmTime;           /* time to sound alarm, in milliseconds */
626     Boolean autoRaiseBoard;
627     int fontSizeTolerance; /* xboard only */
628     char *initialMode;
629     char *variant;
630     char *chatBoxes;
631     int protocolVersion[ENGINES];
632     Boolean showButtonBar;
633     Boolean icsEngineAnalyze;
634     Boolean variations;         /* [HGM] enable variation-tree walking */
635     Boolean autoExtend;         /* [HGM] enable playing move(s) of right-clicked PV in analysis mode */
636
637     /* [AS] New properties (down to the "ZIPPY" part) */
638     Boolean scoreIsAbsolute[ENGINES];  /* If true, engine score is always from white side */
639     Boolean saveExtendedInfoInPGN; /* If true, saved PGN games contain extended info */
640     Boolean hideThinkingFromHuman; /* If true, program thinking is generated but not displayed in human/computer matches */
641     Boolean useBitmaps;
642     Boolean useFont;
643     Boolean useBorder;
644     char * liteBackTextureFile; /* Name of texture bitmap for lite squares */
645     char * darkBackTextureFile; /* Name of texture bitmap for dark squares */
646     int liteBackTextureMode;
647     int darkBackTextureMode;
648     char * renderPiecesWithFont; /* Name of font for rendering chess pieces */
649     char * fontToPieceTable; /* Map to translate font character to chess pieces */
650     char * inscriptions;         /* text (kanji) to write on top of a piece     */
651     int fontBackColorWhite;
652     int fontForeColorWhite;
653     int fontBackColorBlack;
654     int fontForeColorBlack;
655     int fontPieceSize; /* Size of font relative to square (percentage) */
656     int overrideLineGap; /* If >= 0 overrides the lineGap value of the board size properties */
657     int adjudicateLossThreshold; /* Adjudicate a two-machine game if both engines agree the score is below this for 6 plies */
658     int delayBeforeQuit;
659     int delayAfterQuit;
660     char * nameOfDebugFile;
661     char * pgnEventHeader;
662     int defaultFrcPosition;
663     char * gameListTags;
664     Boolean saveOutOfBookInfo;
665     Boolean showEvalInMoveHistory;
666     int evalHistColorWhite;
667     int evalHistColorBlack;
668     Boolean highlightMoveWithArrow;
669     Boolean tourney;
670     char * tourneyOptions;
671     int highlightArrowColor;
672     Boolean useStickyWindows;
673     Boolean bgObserve;   /* [HGM] bughouse */
674     Boolean dualBoard;   /* [HGM] dual     */
675     Boolean viewer;
676     char * viewerOptions;
677     int adjudicateDrawMoves;
678     Boolean autoDisplayComment;
679     Boolean autoDisplayTags;
680     Boolean pseudo[ENGINES]; /* [HGM] pseudo-engines */
681     Boolean isUCI[ENGINES];
682     Boolean hasOwnBookUCI[ENGINES];
683     char * adapterCommand;
684     char * ucciAdapter;
685     char * polyglotDir;
686     Boolean usePolyglotBook;
687     Boolean defNoBook;
688     char * polyglotBook;
689     int bookDepth;
690     int bookStrength;
691     int defaultHashSize;
692     int defaultCacheSizeEGTB;
693     char * defaultPathEGTB;
694     int defaultMatchGames;
695
696     /* [HGM] Board size */
697     int NrFiles;
698     int NrRanks;
699     int rankOffset;
700     int holdingsSize;
701     int matchPause;
702     char * pieceToCharTable;
703     char * pieceNickNames;
704     char * colorNickNames;
705     Boolean allWhite;
706     Boolean upsideDown;
707     Boolean alphaRank;
708     Boolean testClaims;
709     Boolean checkMates;
710     Boolean materialDraws;
711     Boolean trivialDraws;
712     int ruleMoves;
713     int drawRepeats;
714
715 #if ZIPPY
716     char *zippyLines;
717     char *zippyPinhead;
718     char *zippyPassword;
719     char *zippyPassword2;
720     char *zippyWrongPassword;
721     char *zippyAcceptOnly;
722     int zippyUseI;
723     int zippyBughouse;
724     int zippyNoplayCrafty;
725     char *zippyGameEnd;
726     char *zippyGameStart;
727     int zippyAdjourn;
728     int zippyAbort;
729     char *zippyVariants;
730     int zippyMaxGames;
731     int zippyReplayTimeout; /*seconds*/
732     int zippyShortGame; /* [HGM] aborter   */
733 #endif
734     Boolean lowTimeWarning; /* [HGM] low time */
735     Boolean quitNext;
736     char *lowTimeWarningColor;
737
738     char *serverFileName;
739     char *serverMovesName;
740     char *finger;
741     Boolean suppressLoadMoves;
742     int serverPause;
743     int timeOdds[ENGINES];
744     int drawDepth[ENGINES];
745     int timeOddsMode;
746     int accumulateTC[ENGINES];
747     int NPS[ENGINES];
748     Boolean autoKibitz;
749     int engineComments;
750     int eloThreshold1;  /* [HGM] select   */
751     int eloThreshold2;
752     int dateThreshold;
753     int searchMode;
754     int stretch;
755     int minPieces;
756     int maxPieces;
757     Boolean ignoreColors;
758     Boolean findMirror;
759     char *userName;
760     int rewindIndex;    /* [HGM] autoinc   */
761     int sameColorGames; /* [HGM] alternate */
762     int smpCores;       /* [HGM] SMP       */
763     char *egtFormats;
764     int niceEngines;    /* [HGM] nice      */
765     char *logo[ENGINES];/* [HGM] logo      */
766     char *pairingEngine;/* [HGM] pairing   */
767     Boolean autoLogo;
768     Boolean fixedSize;
769     Boolean noGUI;      /* [HGM] fast: suppress all display updates */
770     char *engOptions[ENGINES]; /* [HGM] options   */
771     char *fenOverride[ENGINES];
772     char *features[ENGINES];
773     char *featureDefaults;
774     char *sysOpen;
775     Boolean keepAlive;  /* [HGM] alive     */
776     Boolean forceIllegal;/*[HGM] illegal   */
777     Boolean noJoin;     /* [HGM] join      */
778     char *wrapContSeq; /* continuation sequence when xboard wraps text */
779     Boolean useInternalWrap; /* use internal wrapping -- noJoin usurps this if set */
780     Boolean pasteSelection; /* paste X selection instead of clipboard */
781     int nrVariations;   /* [HGM] multivar  */
782     int zoom;           /* [HGM] evalGraph */
783     int evalThreshold;  /* [HGM] evalGraph */
784     Boolean dropMenu;   /* [HGM] pv        */
785     Boolean markers;    /* [HGM] markers   */
786     Boolean autoCopyPV;
787     Boolean pieceMenu;
788     Boolean sweepSelect;
789     Boolean monoMouse;
790     Boolean whitePOV;
791     Boolean scoreWhite;
792     Boolean pvSAN[ENGINES];
793
794     int recentEngines;
795     char *recentEngineList;
796     char *tourneyFile;
797     char *defName;
798     char *processes;
799     char *results;
800     char *participants;
801     char *afterGame;
802     char *afterTourney;
803     int tourneyType;
804     int tourneyCycles;
805     int seedBase;
806     Boolean roundSync;
807     Boolean cycleSync;
808     Boolean numberTag;
809 } AppData, *AppDataPtr;
810
811 /*  PGN tags (for showing in the game list) */
812 #define LPUSERGLT_SIZE      64
813
814 #define GLT_EVENT           'e'
815 #define GLT_SITE            's'
816 #define GLT_DATE            'd'
817 #define GLT_ROUND           'o'
818 #define GLT_PLAYERS         'p'     /* I.e. white "-" black */
819 #define GLT_RESULT          'r'
820 #define GLT_WHITE_ELO       'w'
821 #define GLT_BLACK_ELO       'b'
822 #define GLT_TIME_CONTROL    't'
823 #define GLT_VARIANT         'v'
824 #define GLT_OUT_OF_BOOK     'a'
825 #define GLT_RESULT_COMMENT  'c'     /* [HGM] rescom */
826
827 #define GLT_DEFAULT_TAGS    "eprd"  /* Event, players, result, date */
828
829 #define GLT_ALL_TAGS        "esdoprwbtvac"
830
831 #define PGN_OUT_OF_BOOK     "Annotator"
832
833 extern AppData appData;
834
835 typedef struct {
836     /* PGN 7-tag info */
837     char *event;
838     char *site;
839     char *date;
840     char *round;
841     char *white;
842     char *black;
843     ChessMove result;
844     /* Additional info */
845     char *fen;          /* NULL or FEN for starting position; input only */
846     char *resultDetails;
847     char *timeControl;
848     char *extraTags;    /* NULL or "[Tag \"Value\"]\n", etc. */
849     int whiteRating;    /* -1 if unknown */
850     int blackRating;    /* -1 if unknown */
851     VariantClass variant;
852     char *variantName;
853     char *outOfBook;    /* [AS] Move and score when engine went out of book */
854     int boardWidth;     /* [HGM] adjustable board size */
855     int boardHeight;
856 /* [HGM] For Shogi and Crazyhouse: */
857     int holdingsSize;  /* number of different piece types in holdings       */
858     int holdingsWidth; /* number of files left and right of board, 0 or 2   */
859 } GameInfo;
860
861 /* [AS] Search stats from chessprogram, for the played move */
862 // [HGM] moved here from backend.h because it occurs in declarations of front-end functions
863 typedef struct {
864     int score;  /* Centipawns */
865     int depth;  /* Plies */
866     int time;   /* Milliseconds */
867 } ChessProgramStats_Move;
868
869 /* [AS] Layout management */
870 typedef struct {
871     Boolean visible;
872     int x;
873     int y;
874     int width;
875     int height;
876 } WindowPlacement;
877
878 extern WindowPlacement wpEngineOutput;
879 extern WindowPlacement wpEvalGraph;
880 extern WindowPlacement wpMoveHistory;
881 extern WindowPlacement wpGameList;
882 extern WindowPlacement wpTags;
883 extern WindowPlacement wpTextMenu;
884
885 #define MAXENGINES 2000
886
887 // [HGM] chat
888 #define MAX_CHAT 5
889 extern int chatCount;
890 extern char chatPartner[MAX_CHAT][MSG_SIZ];
891
892 // Some prototypes of routines so general they should be available everywhere
893 /* If status == 0, we are exiting with a benign message, not an error */
894 void DisplayFatalError P((String message, int error, int status));
895 void DisplayError P((String message, int error));
896
897 // [HGM] generally useful macros; there are way too many memory leaks...
898 #define FREE(x) if(x) free(x)
899 #define ASSIGN(x, y) if(x) free(x); x = strdup(y)
900
901 // [HGM] for now we use the kludge to redefine all the unstructured options by their array counterpart
902 //       in due time we would have to make the actual substitutions all through the source
903
904 #define firstInitString       engInitString[0]
905 #define secondInitString      engInitString[1]
906 #define firstComputerString   computerString[0]
907 #define secondComputerString  computerString[1]
908 #define firstChessProgram     chessProgram[0]
909 #define secondChessProgram    chessProgram[1]
910 #define firstDirectory        directory[0]
911 #define secondDirectory       directory[1]
912 #define firstProtocolVersion  protocolVersion[0]
913 #define secondProtocolVersion protocolVersion[1]
914 #define firstScoreIsAbsolute  scoreIsAbsolute[0]
915 #define secondScoreIsAbsolute scoreIsAbsolute[1]
916 #define firstHasOwnBookUCI    hasOwnBookUCI[0]
917 #define secondHasOwnBookUCI   hasOwnBookUCI[1]
918 #define firstTimeOdds         timeOdds[0]
919 #define secondTimeOdds        timeOdds[1]
920 #define firstAccumulateTC     accumulateTC[0]
921 #define secondAccumulateTC    accumulateTC[1]
922 #define firstHost    host[0]
923 #define secondHost   host[1]
924 #define reuseFirst   reuse[0]
925 #define reuseSecond  reuse[1]
926 #define firstIsUCI   isUCI[0]
927 #define secondIsUCI  isUCI[1]
928 #define firstNPS     NPS[0]
929 #define secondNPS    NPS[1]
930 #define firstLogo    logo[0]
931 #define secondLogo   logo[1]
932 #define fenOverride1 fenOverride[0]
933 #define fenOverride2 fenOverride[1]
934 #define firstOptions      engOptions[0]
935 #define secondOptions     engOptions[1]
936
937 #endif