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