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