Slip in 10 more piece types
[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 monoMode;
532     Boolean debugMode;
533     Boolean clockMode;
534     char *boardSize;
535     char *logoDir;
536     int logoSize;
537     Boolean Iconic;
538     char *searchTime;
539     int searchDepth;
540     Boolean showCoords;
541     char *clockFont;
542     char *messageFont; /* WinBoard only */
543     char *coordFont;
544     char *font; /* xboard only */
545     char *tagsFont;
546     char *commentFont;
547     char *historyFont;
548     char *gameListFont;
549     char *icsFont;
550     Boolean ringBellAfterMoves;
551     Boolean autoCallFlag;
552     Boolean flipView;
553     Boolean autoFlipView;
554     char *cmailGameName; /* xboard only */
555     Boolean headers;
556     Boolean alwaysPromoteToQueen;
557     Boolean oldSaveStyle;
558     Boolean oneClick;
559     Boolean quietPlay;
560     Boolean showThinking;
561     Boolean ponderNextMove;
562     Boolean periodicUpdates;
563     Boolean autoObserve;
564     Boolean autoCreateLogon;
565     Boolean autoComment;
566     Boolean getMoveList;
567     Boolean testLegality;
568     Boolean topLevel;      /* xboard, top-level auxiliary windows */
569     Boolean titleInWindow; /* xboard only */
570     Boolean localLineEditing; /* WinBoard only */
571     Boolean zippyTalk;
572     Boolean zippyPlay;
573     int flashCount; /* Number of times to flash (xboard only) */
574     int flashRate; /* Flashes per second (xboard only)  */
575     int msLoginDelay;  /* Delay per character (in msec) while sending
576                           ICS logon script (xboard only) */
577     Boolean colorize;   /* If True, use the following colors to color text */
578     /* Strings for colors, as "fg, bg, bold" (strings used in xboard only) */
579     char *colorShout;    // [HGM] IMPORTANT: order must conform to ColorClass definition
580     char *colorSShout;
581     char *colorChannel1;
582     char *colorChannel;
583     char *colorKibitz;
584     char *colorTell;
585     char *colorChallenge;
586     char *colorRequest;
587     char *colorSeek;
588     char *colorNormal;
589     char *soundProgram; /* sound-playing program */
590     char *soundShout;     // [HGM] IMPORTANT: order must be as in ColorClass
591     char *soundSShout;
592     char *soundChannel1;
593     char *soundChannel;
594     char *soundKibitz;
595     char *soundTell;
596     char *soundChallenge;
597     char *soundRequest;
598     char *soundSeek;
599     char *soundMove;     // [HGM] IMPORTANT: order must be as in SoundClass
600     char *soundBell;
601     char *soundRoar;
602     char *soundIcsAlarm;
603     char *soundIcsWin;
604     char *soundIcsLoss;
605     char *soundIcsDraw;
606     char *soundIcsUnfinished;
607     Boolean disguise;        /* [HGM] Promoted Pawns look like pieces in bughouse */
608     Boolean reuse[ENGINES];
609     Boolean animateDragging; /* If True, animate mouse dragging of pieces */
610     Boolean animate;    /* If True, animate non-mouse moves */
611     int animSpeed;      /* Delay in milliseconds between animation frames */
612     Boolean popupMoveErrors;
613     Boolean popupExitMessage;
614     int showJail;
615     Boolean highlightLastMove;
616     Boolean highlightDragging;
617     Boolean blindfold;          /* if true, no pieces are drawn */
618     Boolean premove;            /* true if premove feature enabled */
619     Boolean premoveWhite;       /* true if premoving White first move  */
620     char *premoveWhiteText;     /* text of White premove 1 */
621     Boolean premoveBlack;       /* true if premoving Black first move */
622     char *premoveBlackText;     /* text of Black premove 1 */
623     Boolean icsAlarm;           /* true if sounding alarm at a certain time */
624     int icsAlarmTime;           /* time to sound alarm, in milliseconds */
625     Boolean autoRaiseBoard;
626     int fontSizeTolerance; /* xboard only */
627     char *initialMode;
628     char *variant;
629     char *chatBoxes;
630     int protocolVersion[ENGINES];
631     Boolean showButtonBar;
632     Boolean icsEngineAnalyze;
633     Boolean variations;         /* [HGM] enable variation-tree walking */
634     Boolean autoExtend;         /* [HGM] enable playing move(s) of right-clicked PV in analysis mode */
635
636     /* [AS] New properties (down to the "ZIPPY" part) */
637     Boolean scoreIsAbsolute[ENGINES];  /* If true, engine score is always from white side */
638     Boolean saveExtendedInfoInPGN; /* If true, saved PGN games contain extended info */
639     Boolean hideThinkingFromHuman; /* If true, program thinking is generated but not displayed in human/computer matches */
640     Boolean useBitmaps;
641     Boolean useFont;
642     Boolean useBorder;
643     char * liteBackTextureFile; /* Name of texture bitmap for lite squares */
644     char * darkBackTextureFile; /* Name of texture bitmap for dark squares */
645     int liteBackTextureMode;
646     int darkBackTextureMode;
647     char * renderPiecesWithFont; /* Name of font for rendering chess pieces */
648     char * fontToPieceTable; /* Map to translate font character to chess pieces */
649     char * inscriptions;         /* text (kanji) to write on top of a piece     */
650     int fontBackColorWhite;
651     int fontForeColorWhite;
652     int fontBackColorBlack;
653     int fontForeColorBlack;
654     int fontPieceSize; /* Size of font relative to square (percentage) */
655     int overrideLineGap; /* If >= 0 overrides the lineGap value of the board size properties */
656     int adjudicateLossThreshold; /* Adjudicate a two-machine game if both engines agree the score is below this for 6 plies */
657     int delayBeforeQuit;
658     int delayAfterQuit;
659     char * nameOfDebugFile;
660     char * pgnEventHeader;
661     int defaultFrcPosition;
662     char * gameListTags;
663     Boolean saveOutOfBookInfo;
664     Boolean showEvalInMoveHistory;
665     int evalHistColorWhite;
666     int evalHistColorBlack;
667     Boolean highlightMoveWithArrow;
668     Boolean tourney;
669     char * tourneyOptions;
670     int highlightArrowColor;
671     Boolean useStickyWindows;
672     Boolean bgObserve;   /* [HGM] bughouse */
673     Boolean dualBoard;   /* [HGM] dual     */
674     Boolean viewer;
675     char * viewerOptions;
676     int adjudicateDrawMoves;
677     Boolean autoDisplayComment;
678     Boolean autoDisplayTags;
679     Boolean pseudo[ENGINES]; /* [HGM] pseudo-engines */
680     Boolean isUCI[ENGINES];
681     Boolean hasOwnBookUCI[ENGINES];
682     char * adapterCommand;
683     char * ucciAdapter;
684     char * polyglotDir;
685     Boolean usePolyglotBook;
686     Boolean defNoBook;
687     char * polyglotBook;
688     int bookDepth;
689     int bookStrength;
690     int defaultHashSize;
691     int defaultCacheSizeEGTB;
692     char * defaultPathEGTB;
693     int defaultMatchGames;
694
695     /* [HGM] Board size */
696     int NrFiles;
697     int NrRanks;
698     int rankOffset;
699     int holdingsSize;
700     int matchPause;
701     char * pieceToCharTable;
702     char * pieceNickNames;
703     char * colorNickNames;
704     Boolean allWhite;
705     Boolean upsideDown;
706     Boolean alphaRank;
707     Boolean testClaims;
708     Boolean checkMates;
709     Boolean materialDraws;
710     Boolean trivialDraws;
711     int ruleMoves;
712     int drawRepeats;
713
714 #if ZIPPY
715     char *zippyLines;
716     char *zippyPinhead;
717     char *zippyPassword;
718     char *zippyPassword2;
719     char *zippyWrongPassword;
720     char *zippyAcceptOnly;
721     int zippyUseI;
722     int zippyBughouse;
723     int zippyNoplayCrafty;
724     char *zippyGameEnd;
725     char *zippyGameStart;
726     int zippyAdjourn;
727     int zippyAbort;
728     char *zippyVariants;
729     int zippyMaxGames;
730     int zippyReplayTimeout; /*seconds*/
731     int zippyShortGame; /* [HGM] aborter   */
732 #endif
733     Boolean lowTimeWarning; /* [HGM] low time */
734     Boolean quitNext;
735     char *lowTimeWarningColor;
736
737     char *serverFileName;
738     char *serverMovesName;
739     char *finger;
740     Boolean suppressLoadMoves;
741     int serverPause;
742     int timeOdds[ENGINES];
743     int drawDepth[ENGINES];
744     int timeOddsMode;
745     int accumulateTC[ENGINES];
746     int NPS[ENGINES];
747     Boolean autoKibitz;
748     int engineComments;
749     int eloThreshold1;  /* [HGM] select   */
750     int eloThreshold2;
751     int dateThreshold;
752     int searchMode;
753     int stretch;
754     int minPieces;
755     int maxPieces;
756     Boolean ignoreColors;
757     Boolean findMirror;
758     char *userName;
759     int rewindIndex;    /* [HGM] autoinc   */
760     int sameColorGames; /* [HGM] alternate */
761     int smpCores;       /* [HGM] SMP       */
762     char *egtFormats;
763     int niceEngines;    /* [HGM] nice      */
764     char *logo[ENGINES];/* [HGM] logo      */
765     char *pairingEngine;/* [HGM] pairing   */
766     Boolean autoLogo;
767     Boolean fixedSize;
768     Boolean noGUI;      /* [HGM] fast: suppress all display updates */
769     char *engOptions[ENGINES]; /* [HGM] options   */
770     char *fenOverride[ENGINES];
771     char *features[ENGINES];
772     char *featureDefaults;
773     char *sysOpen;
774     Boolean keepAlive;  /* [HGM] alive     */
775     Boolean forceIllegal;/*[HGM] illegal   */
776     Boolean noJoin;     /* [HGM] join      */
777     char *wrapContSeq; /* continuation sequence when xboard wraps text */
778     Boolean useInternalWrap; /* use internal wrapping -- noJoin usurps this if set */
779     Boolean pasteSelection; /* paste X selection instead of clipboard */
780     int nrVariations;   /* [HGM] multivar  */
781     int zoom;           /* [HGM] evalGraph */
782     int evalThreshold;  /* [HGM] evalGraph */
783     Boolean dropMenu;   /* [HGM] pv        */
784     Boolean markers;    /* [HGM] markers   */
785     Boolean autoCopyPV;
786     Boolean pieceMenu;
787     Boolean sweepSelect;
788     Boolean monoMouse;
789     Boolean whitePOV;
790     Boolean scoreWhite;
791     Boolean pvSAN[ENGINES];
792
793     int recentEngines;
794     char *recentEngineList;
795     char *tourneyFile;
796     char *defName;
797     char *processes;
798     char *results;
799     char *participants;
800     char *afterGame;
801     char *afterTourney;
802     int tourneyType;
803     int tourneyCycles;
804     int seedBase;
805     Boolean roundSync;
806     Boolean cycleSync;
807     Boolean numberTag;
808 } AppData, *AppDataPtr;
809
810 /*  PGN tags (for showing in the game list) */
811 #define LPUSERGLT_SIZE      64
812
813 #define GLT_EVENT           'e'
814 #define GLT_SITE            's'
815 #define GLT_DATE            'd'
816 #define GLT_ROUND           'o'
817 #define GLT_PLAYERS         'p'     /* I.e. white "-" black */
818 #define GLT_RESULT          'r'
819 #define GLT_WHITE_ELO       'w'
820 #define GLT_BLACK_ELO       'b'
821 #define GLT_TIME_CONTROL    't'
822 #define GLT_VARIANT         'v'
823 #define GLT_OUT_OF_BOOK     'a'
824 #define GLT_RESULT_COMMENT  'c'     /* [HGM] rescom */
825
826 #define GLT_DEFAULT_TAGS    "eprd"  /* Event, players, result, date */
827
828 #define GLT_ALL_TAGS        "esdoprwbtvac"
829
830 #define PGN_OUT_OF_BOOK     "Annotator"
831
832 extern AppData appData;
833
834 typedef struct {
835     /* PGN 7-tag info */
836     char *event;
837     char *site;
838     char *date;
839     char *round;
840     char *white;
841     char *black;
842     ChessMove result;
843     /* Additional info */
844     char *fen;          /* NULL or FEN for starting position; input only */
845     char *resultDetails;
846     char *timeControl;
847     char *extraTags;    /* NULL or "[Tag \"Value\"]\n", etc. */
848     int whiteRating;    /* -1 if unknown */
849     int blackRating;    /* -1 if unknown */
850     VariantClass variant;
851     char *variantName;
852     char *outOfBook;    /* [AS] Move and score when engine went out of book */
853     int boardWidth;     /* [HGM] adjustable board size */
854     int boardHeight;
855 /* [HGM] For Shogi and Crazyhouse: */
856     int holdingsSize;  /* number of different piece types in holdings       */
857     int holdingsWidth; /* number of files left and right of board, 0 or 2   */
858 } GameInfo;
859
860 /* [AS] Search stats from chessprogram, for the played move */
861 // [HGM] moved here from backend.h because it occurs in declarations of front-end functions
862 typedef struct {
863     int score;  /* Centipawns */
864     int depth;  /* Plies */
865     int time;   /* Milliseconds */
866 } ChessProgramStats_Move;
867
868 /* [AS] Layout management */
869 typedef struct {
870     Boolean visible;
871     int x;
872     int y;
873     int width;
874     int height;
875 } WindowPlacement;
876
877 extern WindowPlacement wpEngineOutput;
878 extern WindowPlacement wpEvalGraph;
879 extern WindowPlacement wpMoveHistory;
880 extern WindowPlacement wpGameList;
881 extern WindowPlacement wpTags;
882 extern WindowPlacement wpTextMenu;
883
884 #define MAXENGINES 2000
885
886 // [HGM] chat
887 #define MAX_CHAT 5
888 extern int chatCount;
889 extern char chatPartner[MAX_CHAT][MSG_SIZ];
890
891 // Some prototypes of routines so general they should be available everywhere
892 /* If status == 0, we are exiting with a benign message, not an error */
893 void DisplayFatalError P((String message, int error, int status));
894 void DisplayError P((String message, int error));
895
896 // [HGM] generally useful macros; there are way too many memory leaks...
897 #define FREE(x) if(x) free(x)
898 #define ASSIGN(x, y) if(x) free(x); x = strdup(y)
899
900 // [HGM] for now we use the kludge to redefine all the unstructured options by their array counterpart
901 //       in due time we would have to make the actual substitutions all through the source
902
903 #define firstInitString       engInitString[0]
904 #define secondInitString      engInitString[1]
905 #define firstComputerString   computerString[0]
906 #define secondComputerString  computerString[1]
907 #define firstChessProgram     chessProgram[0]
908 #define secondChessProgram    chessProgram[1]
909 #define firstDirectory        directory[0]
910 #define secondDirectory       directory[1]
911 #define firstProtocolVersion  protocolVersion[0]
912 #define secondProtocolVersion protocolVersion[1]
913 #define firstScoreIsAbsolute  scoreIsAbsolute[0]
914 #define secondScoreIsAbsolute scoreIsAbsolute[1]
915 #define firstHasOwnBookUCI    hasOwnBookUCI[0]
916 #define secondHasOwnBookUCI   hasOwnBookUCI[1]
917 #define firstTimeOdds         timeOdds[0]
918 #define secondTimeOdds        timeOdds[1]
919 #define firstAccumulateTC     accumulateTC[0]
920 #define secondAccumulateTC    accumulateTC[1]
921 #define firstHost    host[0]
922 #define secondHost   host[1]
923 #define reuseFirst   reuse[0]
924 #define reuseSecond  reuse[1]
925 #define firstIsUCI   isUCI[0]
926 #define secondIsUCI  isUCI[1]
927 #define firstNPS     NPS[0]
928 #define secondNPS    NPS[1]
929 #define firstLogo    logo[0]
930 #define secondLogo   logo[1]
931 #define fenOverride1 fenOverride[0]
932 #define fenOverride2 fenOverride[1]
933 #define firstOptions      engOptions[0]
934 #define secondOptions     engOptions[1]
935
936 #endif