updated copyright for 2016
[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 TOUCHED_W    CASTLING][(BOARD_FILES-6) /* [HGM] in upper rank        */
185 #define TOUCHED_B    CASTLING][(BOARD_FILES-5) /* [HGM] in upper rank        */
186 #define EP_RANK      CASTLING][(BOARD_FILES-4) /* [HGM] in upper rank        */
187 #define EP_FILE      CASTLING][(BOARD_FILES-3) /* [HGM] in upper rank        */
188 #define EP_STATUS    CASTLING][(BOARD_FILES-2) /* [HGM] in upper rank        */
189 #define HOLDINGS_SET CASTLING][(BOARD_FILES-1) /* [HGM] in upper-right corner*/
190 #define ONE          ('1'-(BOARD_HEIGHT==10)-appData.rankOffset)  /* [HGM] foremost board rank  */
191 #define AAA          ('a'-BOARD_LEFT)          /* [HGM] leftmost board file  */
192 #define VIRGIN_W                 1             /* [HGM] flags in Board[VIRGIN][X] */
193 #define VIRGIN_B                 2
194 #define DROP_RANK               -3
195 #define MAX_MOVES               1000
196 #define MSG_SIZ                 512
197 #define DIALOG_SIZE             256
198 #define STAR_MATCH_N            16
199 #define MOVE_LEN                32
200 #define TIME_CONTROL            "5"     /* in minutes */
201 #define TIME_DELAY_QUOTE        "1.0"   /* seconds between moves */
202 #define TIME_DELAY              ((float) 1.0)
203 #define MOVES_PER_SESSION       40      /* moves per TIME_CONTROL */
204 #define TIME_INCREMENT          -1      /* if >= 0, MOVES_PER_SESSION unused */
205 #define WhiteOnMove(move)       (((move) % 2) == 0)
206 #define ICS_HOST                "chessclub.com"
207 #define ICS_PORT                "5000"
208 #define ICS_COMM_PORT           ""
209 #define FIRST_HOST              "localhost"
210 #define SECOND_HOST             "localhost"
211 #define TELNET_PROGRAM          "telnet"
212 #define DEF_BITMAP_DIR          BITMAPDIR
213 #define MATCH_MODE              "False"
214 #define INIT_STRING             "new\nrandom\n"
215 #define WHITE_STRING            "white\ngo\n"
216 #define BLACK_STRING            "black\ngo\n"
217 #define COMPUTER_STRING         "computer\n"
218 #define REUSE_CHESS_PROGRAMS    1
219 #define WHITE_PIECE_COLOR       "#FFFFCC"
220 #define BLACK_PIECE_COLOR       "#202020"
221 #define LIGHT_SQUARE_COLOR      "#C8C365"
222 #define DARK_SQUARE_COLOR       "#77A26D"
223 #define JAIL_SQUARE_COLOR       "#808080"
224 #define HIGHLIGHT_SQUARE_COLOR  "#FFFF00"
225 #define PREMOVE_HIGHLIGHT_COLOR "#FF0000"
226 #define LOWTIMEWARNING_COLOR    "#FF0000"
227 #define BELLCHAR                '\007'
228 #define NULLCHAR                '\000'
229 #define FEATURE_TIMEOUT         10000 /*ms*/
230
231 #define CLOCK_FONT 0
232 #define MESSAGE_FONT 1
233 #define COORD_FONT 2
234 #define CONSOLE_FONT 3
235 #define COMMENT_FONT 4
236 #define EDITTAGS_FONT 5
237 #define MOVEHISTORY_FONT 6
238 #define GAMELIST_FONT 7
239 #define NUM_FONTS 8
240
241 /* Default to no flashing (the "usual" XBoard behavior) */
242 #define FLASH_COUNT     0               /* Number of times to flash */
243 #define FLASH_RATE      5               /* Flashes per second */
244
245 /* Default delay per character (in msec) while sending login script */
246 #define MS_LOGIN_DELAY  0
247
248 /* [AS] Support for background textures */
249 #define BACK_TEXTURE_MODE_DISABLED      0
250 #define BACK_TEXTURE_MODE_PLAIN         1
251 #define BACK_TEXTURE_MODE_FULL_RANDOM   2
252
253 /* Zippy defaults */
254 #define ZIPPY_TALK FALSE
255 #define ZIPPY_PLAY FALSE
256 #define ZIPPY_LINES "yow.lines"
257 #define ZIPPY_PINHEAD ""
258 #define ZIPPY_PASSWORD ""
259 #define ZIPPY_PASSWORD2 ""
260 #define ZIPPY_WRONG_PASSWORD ""
261 #define ZIPPY_ACCEPT_ONLY ""
262 #define ZIPPY_USE_I TRUE
263 #define ZIPPY_BUGHOUSE 0
264 #define ZIPPY_NOPLAY_CRAFTY FALSE
265 #define ZIPPY_GAME_END "gameend\n"
266 #define ZIPPY_GAME_START ""
267 #define ZIPPY_ADJOURN FALSE
268 #define ZIPPY_ABORT FALSE
269 #define ZIPPY_VARIANTS "normal,fischerandom,crazyhouse,losers,suicide,3checks,twokings,bughouse,shatranj"
270 #define ZIPPY_MAX_GAMES 0
271 #define ZIPPY_REPLAY_TIMEOUT 120
272
273 typedef VOIDSTAR ProcRef;
274 #define NoProc ((ProcRef) 0)
275 typedef VOIDSTAR InputSourceRef;
276
277 typedef void (*DelayedEventCallback) P((void));
278
279 typedef enum { Press, Release } ClickType;
280
281 typedef enum {
282     BeginningOfGame, MachinePlaysWhite, MachinePlaysBlack,
283     AnalyzeMode, AnalyzeFile, TwoMachinesPlay,
284     EditGame, PlayFromGameFile, EndOfGame, EditPosition, Training,
285     IcsIdle, IcsPlayingWhite, IcsPlayingBlack, IcsObserving,
286     IcsExamining
287   } GameMode;
288
289 typedef enum {
290     /* [HGM] the order here is crucial for Crazyhouse & Shogi: */
291     /* only the first N pieces can go into the holdings, and   */
292     /* promotions in those variants shift P-W to U-S           */
293     WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen,
294     WhiteFerz, WhiteAlfil, WhiteAngel, WhiteMarshall, WhiteWazir, WhiteMan,
295     WhiteCannon, WhiteNightrider, WhiteCardinal, WhiteDragon, WhiteGrasshopper,
296     WhiteSilver, WhiteFalcon, WhiteLance, WhiteCobra, WhiteUnicorn, WhiteLion,
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, WhiteKing,
301     BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen,
302     BlackFerz, BlackAlfil, BlackAngel, BlackMarshall, BlackWazir, BlackMan,
303     BlackCannon, BlackNightrider, BlackCardinal, BlackDragon, BlackGrasshopper,
304     BlackSilver, BlackFalcon, BlackLance, BlackCobra, BlackUnicorn, BlackLion,
305     BlackTokin, BlackClaw, BlackPCardinal, BlackPDragon, BlackCat,
306     BlackPSword, BlackMonarch, BlackMother, BlackNothing, BlackPRook, BlackPDagger,
307     BlackDolphin, BlackStag, BlackHorned, BlackEagle, BlackSword,
308     BlackCrown, BlackHCrown, BlackHorse, BlackDrunk, BlackPBishop, BlackKing,
309     EmptySquare, DarkSquare,
310     NoRights, // [HGM] gamestate: for castling rights hidden in board[CASTLING]
311     ClearBoard, WhitePlay, BlackPlay, PromotePiece, DemotePiece /*for use on EditPosition menus*/
312   } ChessSquare;
313
314 /* [HGM] some macros that can be used as prefixes to convert piece types */
315 #define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int)
316 #define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int)
317 #define PROMOTED       (int)WhiteDragon - (int)WhiteRook + (int)
318 #define DEMOTED        (int)WhiteRook - (int)WhiteDragon + (int)
319 #define SHOGI          (int)EmptySquare + (int)
320 #define CHUPROMOTED    ((int)WhitePDragon - (int)WhiteDragon)*(gameInfo.variant == VariantChu) + PROMOTED
321 #define CHUDEMOTED     ((int)WhiteDragon - (int)WhitePDragon)*(gameInfo.variant == VariantChu) + DEMOTED
322 #define IS_SHOGI(V)    ((V) == VariantShogi || (V) == VariantChu)
323 #define IS_LION(V)     ((V) == WhiteLion || (V) == BlackLion)
324
325
326 typedef ChessSquare Board[BOARD_RANKS][BOARD_FILES];
327
328 typedef enum {
329     EndOfFile = 0,
330     WhiteKingSideCastle, WhiteQueenSideCastle,
331     WhiteKingSideCastleWild, WhiteQueenSideCastleWild,
332     WhiteHSideCastleFR, WhiteASideCastleFR,
333     BlackKingSideCastle, BlackQueenSideCastle,
334     BlackKingSideCastleWild, BlackQueenSideCastleWild,
335     BlackHSideCastleFR, BlackASideCastleFR,
336     WhitePromotion, WhiteNonPromotion,
337     BlackPromotion, BlackNonPromotion,
338     WhiteCapturesEnPassant, BlackCapturesEnPassant,
339     WhiteDrop, BlackDrop, FirstLeg,
340     NormalMove, AmbiguousMove, IllegalMove, ImpossibleMove,
341     WhiteWins, BlackWins, GameIsDrawn, GameUnfinished,
342     GNUChessGame, XBoardGame, MoveNumberOne, Open, Close, Nothing,
343     Comment, PositionDiagram, ElapsedTime, PGNTag, NAG
344   } ChessMove;
345
346 typedef enum {
347     ColorShout, ColorSShout, ColorChannel1, ColorChannel, ColorKibitz,
348     ColorTell, ColorChallenge, ColorRequest, ColorSeek, ColorNormal,
349     ColorNone, NColorClasses
350 } ColorClass;
351
352 typedef enum {
353     SoundMove, SoundBell, SoundRoar, SoundAlarm, SoundIcsWin, SoundIcsLoss,
354     SoundIcsDraw, SoundIcsUnfinished, NSoundClasses
355 } SoundClass;
356
357 /* Names for chess variants, not necessarily supported */
358 typedef enum {
359     VariantNormal,       /* Normal chess */
360     VariantLoadable,     /* "loadgame" command allowed (not really a variant)*/
361     VariantWildCastle,   /* Shuffle chess where king can castle from d file */
362     VariantNoCastle,     /* Shuffle chess with no castling at all */
363     VariantFischeRandom, /* FischeRandom */
364     VariantBughouse,     /* Bughouse, ICC/FICS rules */
365     VariantCrazyhouse,   /* Crazyhouse, ICC/FICS rules */
366     VariantLosers,       /* Try to lose all pieces or get mated (ICC wild 17)*/
367     VariantSuicide,      /* Try to lose all pieces incl. king (FICS) */
368     VariantGiveaway,     /* Try to have no legal moves left (ICC wild 26) */
369     VariantTwoKings,     /* Weird ICC wild 9 */
370     VariantKriegspiel,   /* Kriegspiel; pawns can capture invisible pieces */
371     VariantAtomic,       /* Capturing piece explodes (ICC wild 27) */
372     Variant3Check,       /* Win by giving check 3 times (ICC wild 25) */
373     VariantShatranj,     /* Unsupported (ICC wild 28) */
374     Variant29,           /* Temporary name for possible future ICC wild 29 */
375     Variant30,           /* Temporary name for possible future ICC wild 30 */
376     Variant31,           /* Temporary name for possible future ICC wild 31 */
377     Variant32,           /* Temporary name for possible future ICC wild 32 */
378     Variant33,           /* Temporary name for possible future ICC wild 33 */
379     Variant34,           /* Temporary name for possible future ICC wild 34 */
380     Variant35,           /* Temporary name for possible future ICC wild 35 */
381     Variant36,           /* Temporary name for possible future ICC wild 36 */
382     VariantShogi,        /* [HGM] added variants */
383     VariantChu,
384     VariantCourier,
385     VariantGothic,
386     VariantCapablanca,
387     VariantKnightmate,
388     VariantFairy,
389     VariantCylinder,
390     VariantFalcon,
391     VariantCapaRandom,
392     VariantBerolina,
393     VariantJanus,
394     VariantSuper,
395     VariantGreat,
396     VariantTwilight,
397     VariantMakruk,
398     VariantSChess,
399     VariantGrand,
400     VariantSpartan,
401     VariantXiangqi,
402     VariantASEAN,
403     VariantLion,
404     VariantChuChess,
405     VariantUnknown       /* Catchall for other unknown variants */
406 } VariantClass;
407
408 #define VARIANT_NAMES { \
409   "normal", \
410   "normal", \
411   "wildcastle", \
412   "nocastle", \
413   "fischerandom", \
414   "bughouse", \
415   "crazyhouse", \
416   "losers", \
417   "suicide", \
418   "giveaway", \
419   "twokings", \
420   "kriegspiel", \
421   "atomic", \
422   "3check", \
423   "shatranj", \
424   "wild29", \
425   "wild30", \
426   "wild31", \
427   "wild32", \
428   "wild33", \
429   "wild34", \
430   "wild35", \
431   "wild36", \
432   "shogi", \
433   "chu", \
434   "courier", \
435   "gothic", \
436   "capablanca", \
437   "knightmate", \
438   "fairy", \
439   "cylinder", \
440   "falcon",\
441   "caparandom",\
442   "berolina",\
443   "janus",\
444   "super",\
445   "great",\
446   "twilight",\
447   "makruk",\
448   "seirawan",\
449   "grand",\
450   "spartan",\
451   "xiangqi", \
452   "asean",\
453   "lion",\
454   "elven",\
455   "unknown" \
456 }
457
458 #define ENGINES 2
459
460 typedef struct {
461     char *language;
462 #if !defined(_amigados)
463     char *whitePieceColor;
464     char *blackPieceColor;
465     char *lightSquareColor;
466     char *darkSquareColor;
467     char *jailSquareColor;
468     char *highlightSquareColor;
469     char *premoveHighlightColor;
470     char *dialogColor;
471     char *buttonColor;
472 #else
473     int whitePieceColor;
474     int blackPieceColor;
475     int lightSquareColor;
476     int darkSquareColor;
477     int jailSquareColor;
478     int highlightSquareColor;
479     int premoveHighlightColor;
480 #endif
481     int movesPerSession;
482     float timeIncrement;
483     char *engInitString[ENGINES];
484     char *computerString[ENGINES];
485     char *chessProgram[ENGINES];
486     char *directory[ENGINES];
487     char *pgnName[ENGINES];
488     Boolean firstPlaysBlack;
489     Boolean noChessProgram;
490     char *positionDir;
491     char *host[ENGINES];
492     char *themeNames;
493     char *pieceDirectory;
494     char *border;
495     char *soundDirectory;
496     char *remoteShell;
497     char *remoteUser;
498     float timeDelay;
499     char *timeControl;
500     Boolean trueColors;
501     Boolean icsActive;
502     Boolean autoBox;
503     char *icsHost;
504     char *icsPort;
505     char *icsCommPort;  /* if set, use serial port instead of tcp host/port */
506     char *icsLogon;     /* Hack to permit variable logon scripts. */
507     char *icsHelper;
508     Boolean icsInputBox;
509     Boolean useTelnet;
510     Boolean seekGraph;
511     Boolean autoRefresh;
512     char *telnetProgram;
513     char *gateway;
514     char *loadGameFile;
515     int loadGameIndex;      /* game # within file */
516     char *saveGameFile;
517     char *autoInstall;
518     Boolean autoSaveGames;
519     Boolean onlyOwn;        /* [HGM] suppress auto-saving of observed games */
520     char *loadPositionFile;
521     int loadPositionIndex;  /* position # within file */
522     char *savePositionFile;
523     Boolean fischerCastling;/* [HGM] fischer: allow Fischr castling in any variant */
524     Boolean matchMode;
525     int matchGames;
526     Boolean monoMode;
527     Boolean debugMode;
528     Boolean clockMode;
529     char *boardSize;
530     char *logoDir;
531     int logoSize;
532     Boolean Iconic;
533     char *searchTime;
534     int searchDepth;
535     Boolean showCoords;
536     char *clockFont;
537     char *messageFont; /* WinBoard only */
538     char *coordFont;
539     char *font; /* xboard only */
540     char *tagsFont;
541     char *commentFont;
542     char *historyFont;
543     char *gameListFont;
544     char *icsFont;
545     Boolean ringBellAfterMoves;
546     Boolean autoCallFlag;
547     Boolean flipView;
548     Boolean autoFlipView;
549     char *cmailGameName; /* xboard only */
550     Boolean headers;
551     Boolean alwaysPromoteToQueen;
552     Boolean oldSaveStyle;
553     Boolean oneClick;
554     Boolean quietPlay;
555     Boolean showThinking;
556     Boolean ponderNextMove;
557     Boolean periodicUpdates;
558     Boolean autoObserve;
559     Boolean autoCreateLogon;
560     Boolean autoComment;
561     Boolean getMoveList;
562     Boolean testLegality;
563     Boolean topLevel;      /* xboard, top-level auxiliary windows */
564     Boolean titleInWindow; /* xboard only */
565     Boolean localLineEditing; /* WinBoard only */
566     Boolean zippyTalk;
567     Boolean zippyPlay;
568     int flashCount; /* Number of times to flash (xboard only) */
569     int flashRate; /* Flashes per second (xboard only)  */
570     int msLoginDelay;  /* Delay per character (in msec) while sending
571                           ICS logon script (xboard only) */
572     Boolean colorize;   /* If True, use the following colors to color text */
573     /* Strings for colors, as "fg, bg, bold" (strings used in xboard only) */
574     char *colorShout;    // [HGM] IMPORTANT: order must conform to ColorClass definition
575     char *colorSShout;
576     char *colorChannel1;
577     char *colorChannel;
578     char *colorKibitz;
579     char *colorTell;
580     char *colorChallenge;
581     char *colorRequest;
582     char *colorSeek;
583     char *colorNormal;
584     char *soundProgram; /* sound-playing program */
585     char *soundShout;     // [HGM] IMPORTANT: order must be as in ColorClass
586     char *soundSShout;
587     char *soundChannel1;
588     char *soundChannel;
589     char *soundKibitz;
590     char *soundTell;
591     char *soundChallenge;
592     char *soundRequest;
593     char *soundSeek;
594     char *soundMove;     // [HGM] IMPORTANT: order must be as in SoundClass
595     char *soundBell;
596     char *soundRoar;
597     char *soundIcsAlarm;
598     char *soundIcsWin;
599     char *soundIcsLoss;
600     char *soundIcsDraw;
601     char *soundIcsUnfinished;
602     Boolean disguise;        /* [HGM] Promoted Pawns look like pieces in bughouse */
603     Boolean reuse[ENGINES];
604     Boolean animateDragging; /* If True, animate mouse dragging of pieces */
605     Boolean animate;    /* If True, animate non-mouse moves */
606     int animSpeed;      /* Delay in milliseconds between animation frames */
607     Boolean popupMoveErrors;
608     Boolean popupExitMessage;
609     int showJail;
610     Boolean highlightLastMove;
611     Boolean highlightDragging;
612     Boolean blindfold;          /* if true, no pieces are drawn */
613     Boolean premove;            /* true if premove feature enabled */
614     Boolean premoveWhite;       /* true if premoving White first move  */
615     char *premoveWhiteText;     /* text of White premove 1 */
616     Boolean premoveBlack;       /* true if premoving Black first move */
617     char *premoveBlackText;     /* text of Black premove 1 */
618     Boolean icsAlarm;           /* true if sounding alarm at a certain time */
619     int icsAlarmTime;           /* time to sound alarm, in milliseconds */
620     Boolean autoRaiseBoard;
621     int fontSizeTolerance; /* xboard only */
622     char *initialMode;
623     char *variant;
624     char *chatBoxes;
625     int protocolVersion[ENGINES];
626     Boolean showButtonBar;
627     Boolean icsEngineAnalyze;
628     Boolean variations;         /* [HGM] enable variation-tree walking */
629     Boolean autoExtend;         /* [HGM] enable playing move(s) of right-clicked PV in analysis mode */
630
631     /* [AS] New properties (down to the "ZIPPY" part) */
632     Boolean scoreIsAbsolute[ENGINES];  /* If true, engine score is always from white side */
633     Boolean saveExtendedInfoInPGN; /* If true, saved PGN games contain extended info */
634     Boolean hideThinkingFromHuman; /* If true, program thinking is generated but not displayed in human/computer matches */
635     Boolean useBitmaps;
636     Boolean useFont;
637     Boolean useBorder;
638     char * liteBackTextureFile; /* Name of texture bitmap for lite squares */
639     char * darkBackTextureFile; /* Name of texture bitmap for dark squares */
640     int liteBackTextureMode;
641     int darkBackTextureMode;
642     char * renderPiecesWithFont; /* Name of font for rendering chess pieces */
643     char * fontToPieceTable; /* Map to translate font character to chess pieces */
644     char * inscriptions;         /* text (kanji) to write on top of a piece     */
645     int fontBackColorWhite;
646     int fontForeColorWhite;
647     int fontBackColorBlack;
648     int fontForeColorBlack;
649     int fontPieceSize; /* Size of font relative to square (percentage) */
650     int overrideLineGap; /* If >= 0 overrides the lineGap value of the board size properties */
651     int adjudicateLossThreshold; /* Adjudicate a two-machine game if both engines agree the score is below this for 6 plies */
652     int delayBeforeQuit;
653     int delayAfterQuit;
654     char * nameOfDebugFile;
655     char * pgnEventHeader;
656     int defaultFrcPosition;
657     char * gameListTags;
658     Boolean saveOutOfBookInfo;
659     Boolean showEvalInMoveHistory;
660     int evalHistColorWhite;
661     int evalHistColorBlack;
662     Boolean highlightMoveWithArrow;
663     Boolean tourney;
664     char * tourneyOptions;
665     int highlightArrowColor;
666     Boolean useStickyWindows;
667     Boolean bgObserve;   /* [HGM] bughouse */
668     Boolean dualBoard;   /* [HGM] dual     */
669     Boolean viewer;
670     char * viewerOptions;
671     int adjudicateDrawMoves;
672     Boolean autoDisplayComment;
673     Boolean autoDisplayTags;
674     Boolean pseudo[ENGINES]; /* [HGM] pseudo-engines */
675     Boolean isUCI[ENGINES];
676     Boolean hasOwnBookUCI[ENGINES];
677     char * adapterCommand;
678     char * ucciAdapter;
679     char * polyglotDir;
680     Boolean usePolyglotBook;
681     Boolean defNoBook;
682     char * polyglotBook;
683     int bookDepth;
684     int bookStrength;
685     int defaultHashSize;
686     int defaultCacheSizeEGTB;
687     char * defaultPathEGTB;
688     int defaultMatchGames;
689
690     /* [HGM] Board size */
691     int NrFiles;
692     int NrRanks;
693     int rankOffset;
694     int holdingsSize;
695     int matchPause;
696     char * pieceToCharTable;
697     char * pieceNickNames;
698     char * colorNickNames;
699     Boolean allWhite;
700     Boolean upsideDown;
701     Boolean alphaRank;
702     Boolean testClaims;
703     Boolean checkMates;
704     Boolean materialDraws;
705     Boolean trivialDraws;
706     int ruleMoves;
707     int drawRepeats;
708
709 #if ZIPPY
710     char *zippyLines;
711     char *zippyPinhead;
712     char *zippyPassword;
713     char *zippyPassword2;
714     char *zippyWrongPassword;
715     char *zippyAcceptOnly;
716     int zippyUseI;
717     int zippyBughouse;
718     int zippyNoplayCrafty;
719     char *zippyGameEnd;
720     char *zippyGameStart;
721     int zippyAdjourn;
722     int zippyAbort;
723     char *zippyVariants;
724     int zippyMaxGames;
725     int zippyReplayTimeout; /*seconds*/
726     int zippyShortGame; /* [HGM] aborter   */
727 #endif
728     Boolean lowTimeWarning; /* [HGM] low time */
729     Boolean quitNext;
730     char *lowTimeWarningColor;
731
732     char *serverFileName;
733     char *serverMovesName;
734     char *finger;
735     Boolean suppressLoadMoves;
736     int serverPause;
737     int timeOdds[ENGINES];
738     int drawDepth[ENGINES];
739     int timeOddsMode;
740     int accumulateTC[ENGINES];
741     int NPS[ENGINES];
742     Boolean autoKibitz;
743     int engineComments;
744     int eloThreshold1;  /* [HGM] select   */
745     int eloThreshold2;
746     int dateThreshold;
747     int searchMode;
748     int stretch;
749     int minPieces;
750     int maxPieces;
751     Boolean ignoreColors;
752     Boolean findMirror;
753     char *userName;
754     int rewindIndex;    /* [HGM] autoinc   */
755     int sameColorGames; /* [HGM] alternate */
756     int smpCores;       /* [HGM] SMP       */
757     char *egtFormats;
758     int niceEngines;    /* [HGM] nice      */
759     char *logo[ENGINES];/* [HGM] logo      */
760     char *pairingEngine;/* [HGM] pairing   */
761     Boolean autoLogo;
762     Boolean fixedSize;
763     Boolean noGUI;      /* [HGM] fast: suppress all display updates */
764     char *engOptions[ENGINES]; /* [HGM] options   */
765     char *fenOverride[ENGINES];
766     char *features[ENGINES];
767     char *featureDefaults;
768     char *sysOpen;
769     Boolean keepAlive;  /* [HGM] alive     */
770     Boolean forceIllegal;/*[HGM] illegal   */
771     Boolean noJoin;     /* [HGM] join      */
772     char *wrapContSeq; /* continuation sequence when xboard wraps text */
773     Boolean useInternalWrap; /* use internal wrapping -- noJoin usurps this if set */
774     Boolean pasteSelection; /* paste X selection instead of clipboard */
775     int nrVariations;   /* [HGM] multivar  */
776     int zoom;           /* [HGM] evalGraph */
777     int evalThreshold;  /* [HGM] evalGraph */
778     Boolean dropMenu;   /* [HGM] pv        */
779     Boolean markers;    /* [HGM] markers   */
780     Boolean autoCopyPV;
781     Boolean pieceMenu;
782     Boolean sweepSelect;
783     Boolean monoMouse;
784     Boolean whitePOV;
785     Boolean scoreWhite;
786     Boolean pvSAN[ENGINES];
787
788     int recentEngines;
789     char *recentEngineList;
790     char *tourneyFile;
791     char *defName;
792     char *processes;
793     char *results;
794     char *participants;
795     char *afterGame;
796     char *afterTourney;
797     int tourneyType;
798     int tourneyCycles;
799     int seedBase;
800     Boolean roundSync;
801     Boolean cycleSync;
802     Boolean numberTag;
803 } AppData, *AppDataPtr;
804
805 /*  PGN tags (for showing in the game list) */
806 #define LPUSERGLT_SIZE      64
807
808 #define GLT_EVENT           'e'
809 #define GLT_SITE            's'
810 #define GLT_DATE            'd'
811 #define GLT_ROUND           'o'
812 #define GLT_PLAYERS         'p'     /* I.e. white "-" black */
813 #define GLT_RESULT          'r'
814 #define GLT_WHITE_ELO       'w'
815 #define GLT_BLACK_ELO       'b'
816 #define GLT_TIME_CONTROL    't'
817 #define GLT_VARIANT         'v'
818 #define GLT_OUT_OF_BOOK     'a'
819 #define GLT_RESULT_COMMENT  'c'     /* [HGM] rescom */
820
821 #define GLT_DEFAULT_TAGS    "eprd"  /* Event, players, result, date */
822
823 #define GLT_ALL_TAGS        "esdoprwbtvac"
824
825 #define PGN_OUT_OF_BOOK     "Annotator"
826
827 extern AppData appData;
828
829 typedef struct {
830     /* PGN 7-tag info */
831     char *event;
832     char *site;
833     char *date;
834     char *round;
835     char *white;
836     char *black;
837     ChessMove result;
838     /* Additional info */
839     char *fen;          /* NULL or FEN for starting position; input only */
840     char *resultDetails;
841     char *timeControl;
842     char *extraTags;    /* NULL or "[Tag \"Value\"]\n", etc. */
843     int whiteRating;    /* -1 if unknown */
844     int blackRating;    /* -1 if unknown */
845     VariantClass variant;
846     char *variantName;
847     char *outOfBook;    /* [AS] Move and score when engine went out of book */
848     int boardWidth;     /* [HGM] adjustable board size */
849     int boardHeight;
850 /* [HGM] For Shogi and Crazyhouse: */
851     int holdingsSize;  /* number of different piece types in holdings       */
852     int holdingsWidth; /* number of files left and right of board, 0 or 2   */
853 } GameInfo;
854
855 /* [AS] Search stats from chessprogram, for the played move */
856 // [HGM] moved here from backend.h because it occurs in declarations of front-end functions
857 typedef struct {
858     int score;  /* Centipawns */
859     int depth;  /* Plies */
860     int time;   /* Milliseconds */
861 } ChessProgramStats_Move;
862
863 /* [AS] Layout management */
864 typedef struct {
865     Boolean visible;
866     int x;
867     int y;
868     int width;
869     int height;
870 } WindowPlacement;
871
872 extern WindowPlacement wpEngineOutput;
873 extern WindowPlacement wpEvalGraph;
874 extern WindowPlacement wpMoveHistory;
875 extern WindowPlacement wpGameList;
876 extern WindowPlacement wpTags;
877 extern WindowPlacement wpTextMenu;
878
879 #define MAXENGINES 2000
880
881 // [HGM] chat
882 #define MAX_CHAT 5
883 extern int chatCount;
884 extern char chatPartner[MAX_CHAT][MSG_SIZ];
885
886 // Some prototypes of routines so general they should be available everywhere
887 /* If status == 0, we are exiting with a benign message, not an error */
888 void DisplayFatalError P((String message, int error, int status));
889 void DisplayError P((String message, int error));
890
891 // [HGM] generally useful macros; there are way too many memory leaks...
892 #define FREE(x) if(x) free(x)
893 #define ASSIGN(x, y) if(x) free(x); x = strdup(y)
894
895 // [HGM] for now we use the kludge to redefine all the unstructured options by their array counterpart
896 //       in due time we would have to make the actual substitutions all through the source
897
898 #define firstInitString       engInitString[0]
899 #define secondInitString      engInitString[1]
900 #define firstComputerString   computerString[0]
901 #define secondComputerString  computerString[1]
902 #define firstChessProgram     chessProgram[0]
903 #define secondChessProgram    chessProgram[1]
904 #define firstDirectory        directory[0]
905 #define secondDirectory       directory[1]
906 #define firstProtocolVersion  protocolVersion[0]
907 #define secondProtocolVersion protocolVersion[1]
908 #define firstScoreIsAbsolute  scoreIsAbsolute[0]
909 #define secondScoreIsAbsolute scoreIsAbsolute[1]
910 #define firstHasOwnBookUCI    hasOwnBookUCI[0]
911 #define secondHasOwnBookUCI   hasOwnBookUCI[1]
912 #define firstTimeOdds         timeOdds[0]
913 #define secondTimeOdds        timeOdds[1]
914 #define firstAccumulateTC     accumulateTC[0]
915 #define secondAccumulateTC    accumulateTC[1]
916 #define firstHost    host[0]
917 #define secondHost   host[1]
918 #define reuseFirst   reuse[0]
919 #define reuseSecond  reuse[1]
920 #define firstIsUCI   isUCI[0]
921 #define secondIsUCI  isUCI[1]
922 #define firstNPS     NPS[0]
923 #define secondNPS    NPS[1]
924 #define firstLogo    logo[0]
925 #define secondLogo   logo[1]
926 #define fenOverride1 fenOverride[0]
927 #define fenOverride2 fenOverride[1]
928 #define firstOptions      engOptions[0]
929 #define secondOptions     engOptions[1]
930
931 #endif