worked on premove bug
[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 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 _COMMON
55 #define _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 #include <X11/Intrinsic.h>
85 #endif
86 #endif
87
88
89 #ifndef TRUE
90 #define TRUE 1
91 #define FALSE 0
92 #endif
93
94 #define UNKNOWN -1 /* [HGM] nps */
95
96 #if !HAVE_RANDOM
97 # if HAVE_RAND48
98 #  define srandom srand48
99 #  define random lrand48
100 # else /* not HAVE_RAND48 */
101 #  define srandom srand
102 #  define random rand
103 # endif /* not HAVE_RAND48 */
104 #endif /* !HAVE_RANDOM */
105
106 /* End compatibility grunge */
107
108 #define PROTOVER                2       /* engine protocol version */
109
110 // [HGM] license: Messages that engines must print to satisfy their license requirements for patented variants
111 #define GOTHIC "Gothic Chess (see www.GothicChess.com) is licensed under U.S. Patent #6,481,716 by Ed Trice"
112 #define NOFALCON "Falcon Chess (see www.chessvariants.com) is licensed under U.S. Patent #5,690,334 by George W. Duke"
113
114 /* [HGM] Some notes about board sizes:
115    In games that allow piece drops, the holdings are considered part of the
116    board, in the leftmost and rightmost two files. This way they are
117    automatically part of the game-history states, and enjoy all display
118    functions (including drag-drop and click-click moves to the regular part
119    of the board). The drawback of this is that the internal numbering of
120    files starts at 2 for the a-file if holdings are displayed. To ensure
121    consistency, this shifted numbering system is used _everywhere_ in the
122    code, and conversion to the 'normal' system only takes place when the
123    file number is converted to or from ASCII (by redefining the character
124    constant 'a'). This works because Winboard only communicates with the
125    outside world in ASCII. In a similar way, the different rank numbering
126    systems (starting at rank 0 or 1) are implemented by redefining '1'.
127 */
128 #define BOARD_SIZE              16            /* [HGM] for in declarations */
129 #define BOARD_HEIGHT (gameInfo.boardHeight)   // [HGM] made user adjustable 
130 #define BOARD_WIDTH  (gameInfo.boardWidth + 2*gameInfo.holdingsWidth)   
131 #define BOARD_LEFT   (gameInfo.holdingsWidth) // [HGM] play-board edges     
132 #define BOARD_RGHT   (gameInfo.boardWidth + gameInfo.holdingsWidth)
133 #define ONE          ('1'-(BOARD_HEIGHT>9))   // [HGM] foremost board rank  
134 #define AAA          ('a'-BOARD_LEFT)         // [HGM] leftmost board file  
135 #define DROP_RANK               -3
136 #define MAX_MOVES               1000
137 #define MSG_SIZ                 512
138 #define DIALOG_SIZE             256
139 #define STAR_MATCH_N            16
140 #define MOVE_LEN                32
141 #define TIME_CONTROL            "5"     /* in minutes */
142 #define TIME_DELAY_QUOTE        "1.0"   /* seconds between moves */
143 #define TIME_DELAY              ((float) 1.0)
144 #define MOVES_PER_SESSION       40      /* moves per TIME_CONTROL */
145 #define TIME_INCREMENT          -1      /* if >= 0, MOVES_PER_SESSION unused */
146 #define WhiteOnMove(move)       (((move) % 2) == 0)
147 #define ICS_HOST                "chessclub.com"
148 #define ICS_PORT                "5000"
149 #define ICS_COMM_PORT           ""
150 #define FIRST_HOST              "localhost"
151 #define SECOND_HOST             "localhost"
152 #define TELNET_PROGRAM          "telnet"
153 #define DEF_BITMAP_DIR          "/usr/share/games/xboard/bitmaps.xchess" /* AP: shouldn't be hardcoded directory, but better than nothing at the moment */
154 #define MATCH_MODE              "False"
155 #define INIT_STRING             "new\nrandom\n"
156 #define WHITE_STRING            "white\ngo\n"
157 #define BLACK_STRING            "black\ngo\n"
158 #define COMPUTER_STRING         "computer\n"
159 #define REUSE_CHESS_PROGRAMS    1
160 #define WHITE_PIECE_COLOR       "#FFFFCC"
161 #define BLACK_PIECE_COLOR       "#202020"
162 #define LIGHT_SQUARE_COLOR      "#C8C365"
163 #define DARK_SQUARE_COLOR       "#77A26D"
164 #define JAIL_SQUARE_COLOR       "#808080"
165 #define HIGHLIGHT_SQUARE_COLOR  "#FFFF00"
166 #define PREMOVE_HIGHLIGHT_COLOR "#FF0000"
167 #define BELLCHAR                '\007'
168 #define NULLCHAR                '\000'
169 #define FEATURE_TIMEOUT         10000 /*ms*/
170
171 /* Zippy defaults */
172 #define ZIPPY_TALK FALSE
173 #define ZIPPY_PLAY FALSE
174 #define ZIPPY_LINES "yow.lines"
175 #define ZIPPY_PINHEAD ""
176 #define ZIPPY_PASSWORD ""
177 #define ZIPPY_PASSWORD2 ""
178 #define ZIPPY_WRONG_PASSWORD ""
179 #define ZIPPY_ACCEPT_ONLY ""
180 #define ZIPPY_USE_I TRUE
181 #define ZIPPY_BUGHOUSE 0
182 #define ZIPPY_NOPLAY_CRAFTY FALSE
183 #define ZIPPY_GAME_END "gameend\n"
184 #define ZIPPY_GAME_START ""
185 #define ZIPPY_ADJOURN FALSE
186 #define ZIPPY_ABORT FALSE
187 #define ZIPPY_VARIANTS "normal,fischerandom,crazyhouse,losers,suicide,3checks,twokings,bughouse,shatranj"
188 #define ZIPPY_MAX_GAMES 0
189 #define ZIPPY_REPLAY_TIMEOUT 120
190
191 typedef enum {
192     BeginningOfGame, MachinePlaysWhite, MachinePlaysBlack,
193     AnalyzeMode, AnalyzeFile, TwoMachinesPlay,
194     EditGame, PlayFromGameFile, EndOfGame, EditPosition, Training,
195     IcsIdle, IcsPlayingWhite, IcsPlayingBlack, IcsObserving,
196     IcsExamining
197   } GameMode;
198
199 typedef enum {
200     /* [HGM] the order here is crucial for Crazyhouse & Shogi: */
201     /* only the first N pieces can go into the holdings, and   */
202     /* promotions in those variants shift P-W to U-S           */
203     WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, 
204     WhiteFerz, WhiteAlfil, WhiteAngel, WhiteMarshall, WhiteWazir, WhiteMan, 
205     WhiteCannon, WhiteNightrider, WhiteCardinal, WhiteDragon, WhiteGrasshopper,
206     WhiteSilver, WhiteFalcon, WhiteLance, WhiteCobra, WhiteUnicorn, WhiteKing,
207     BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen,
208     BlackFerz, BlackAlfil, BlackAngel, BlackMarshall, BlackWazir, BlackMan, 
209     BlackCannon, BlackNightrider, BlackCardinal, BlackDragon, BlackGrasshopper,
210     BlackSilver, BlackFalcon, BlackLance, BlackCobra, BlackUnicorn, BlackKing,
211     EmptySquare, 
212     ClearBoard, WhitePlay, BlackPlay, PromotePiece, DemotePiece /*for use on EditPosition menus*/
213   } ChessSquare;
214
215 /* [HGM] some macros that can be used as prefixes to convert piece types */
216 #define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int)
217 #define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int)
218 #define PROMOTED       (int)WhiteDragon - (int)WhiteRook + (int)
219 #define DEMOTED        (int)WhiteRook - (int)WhiteDragon + (int)
220 #define SHOGI          (int)EmptySquare + (int)
221
222
223 typedef ChessSquare Board[BOARD_SIZE][BOARD_SIZE];
224
225 typedef enum {
226     WhiteKingSideCastle = 1, WhiteQueenSideCastle,
227     WhiteKingSideCastleWild, WhiteQueenSideCastleWild,
228     WhiteHSideCastleFR, WhiteASideCastleFR, 
229     BlackKingSideCastle, BlackQueenSideCastle,
230     BlackKingSideCastleWild, BlackQueenSideCastleWild,
231     BlackHSideCastleFR, BlackASideCastleFR, 
232     WhitePromotionKnight, WhitePromotionBishop,
233     WhitePromotionRook, WhitePromotionQueen, WhitePromotionKing,
234     WhitePromotionChancellor, WhitePromotionArchbishop, WhitePromotionCentaur,
235     BlackPromotionKnight, BlackPromotionBishop,
236     BlackPromotionRook, BlackPromotionQueen, BlackPromotionKing,
237     BlackPromotionChancellor, BlackPromotionArchbishop, BlackPromotionCentaur,
238     WhiteCapturesEnPassant, BlackCapturesEnPassant,
239     WhiteDrop, BlackDrop, 
240     NormalMove, AmbiguousMove, IllegalMove, ImpossibleMove,
241     WhiteWins, BlackWins, GameIsDrawn, GameUnfinished,
242     GNUChessGame, XBoardGame, MoveNumberOne, 
243     Comment, PositionDiagram, ElapsedTime, PGNTag, NAG
244   } ChessMove;
245
246 typedef enum {
247     ColorShout, ColorSShout, ColorChannel1, ColorChannel, ColorKibitz,
248     ColorTell, ColorChallenge, ColorRequest, ColorSeek, ColorNormal,
249     ColorNone, NColorClasses
250 } ColorClass;
251
252 typedef enum {
253     SoundMove, SoundBell, SoundAlarm, SoundIcsWin, SoundIcsLoss,
254     SoundIcsDraw, SoundIcsUnfinished, NSoundClasses
255 } SoundClass;
256
257 /* Names for chess variants, not necessarily supported */
258 typedef enum {
259     VariantNormal,       /* Normal chess */
260     VariantLoadable,     /* "loadgame" command allowed (not really a variant)*/
261     VariantWildCastle,   /* Shuffle chess where king can castle from d file */
262     VariantNoCastle,     /* Shuffle chess with no castling at all */
263     VariantFischeRandom, /* FischeRandom */
264     VariantBughouse,     /* Bughouse, ICC/FICS rules */
265     VariantCrazyhouse,   /* Crazyhouse, ICC/FICS rules */
266     VariantLosers,       /* Try to lose all pieces or get mated (ICC wild 17)*/
267     VariantSuicide,      /* Try to lose all pieces incl. king (FICS) */
268     VariantGiveaway,     /* Try to have no legal moves left (ICC wild 26) */
269     VariantTwoKings,     /* Weird ICC wild 9 */
270     VariantKriegspiel,   /* Kriegspiel; pawns can capture invisible pieces */
271     VariantAtomic,       /* Capturing piece explodes (ICC wild 27) */
272     Variant3Check,       /* Win by giving check 3 times (ICC wild 25) */
273     VariantShatranj,     /* Unsupported (ICC wild 28) */
274     Variant29,           /* Temporary name for possible future ICC wild 29 */
275     Variant30,           /* Temporary name for possible future ICC wild 30 */
276     Variant31,           /* Temporary name for possible future ICC wild 31 */
277     Variant32,           /* Temporary name for possible future ICC wild 32 */
278     Variant33,           /* Temporary name for possible future ICC wild 33 */
279     Variant34,           /* Temporary name for possible future ICC wild 34 */
280     Variant35,           /* Temporary name for possible future ICC wild 35 */
281     Variant36,           /* Temporary name for possible future ICC wild 36 */
282     VariantShogi,        /* [HGM] added variants */
283     VariantXiangqi,
284     VariantCourier,
285     VariantGothic,
286     VariantCapablanca,
287     VariantKnightmate,
288     VariantFairy,        
289     VariantCylinder,
290     VariantFalcon,
291     VariantCapaRandom,
292     VariantBerolina,
293     VariantJanus,
294     VariantSuper,
295     VariantGreat,
296     VariantTwilight,
297     VariantUnknown       /* Catchall for other unknown variants */
298 } VariantClass;
299
300 #define VARIANT_NAMES { \
301   "normal", \
302   "normal", \
303   "wildcastle", \
304   "nocastle", \
305   "fischerandom", \
306   "bughouse", \
307   "crazyhouse", \
308   "losers", \
309   "suicide", \
310   "giveaway", \
311   "twokings", \
312   "kriegspiel", \
313   "atomic", \
314   "3check", \
315   "shatranj", \
316   "wild29", \
317   "wild30", \
318   "wild31", \
319   "wild32", \
320   "wild33", \
321   "wild34", \
322   "wild35", \
323   "wild36", \
324   "shogi", \
325   "xiangqi", \
326   "courier", \
327   "gothic", \
328   "capablanca", \
329   "knightmate", \
330   "fairy", \
331   "cylinder", \
332   "falcon",\
333   "caparandom",\
334   "berolina",\
335   "janus",\
336   "super",\
337   "great",\
338   "twilight",\
339   "unknown" \
340 }
341
342 typedef struct {
343 #if !defined(_amigados)
344     char *whitePieceColor;
345     char *blackPieceColor;
346     char *lightSquareColor;
347     char *darkSquareColor;
348     char *jailSquareColor;
349     char *highlightSquareColor;
350     char *premoveHighlightColor;
351 #else
352     int whitePieceColor;
353     int blackPieceColor;
354     int lightSquareColor;
355     int darkSquareColor;
356     int jailSquareColor;
357     int highlightSquareColor;
358     int premoveHighlightColor;
359 #endif
360     int movesPerSession;
361     int timeIncrement;
362     char *initString;
363     char *secondInitString;
364     char *firstComputerString;
365     char *secondComputerString;
366     char *firstChessProgram;
367     char *secondChessProgram;
368     char *firstDirectory;
369     char *secondDirectory;
370     Boolean firstPlaysBlack;
371     Boolean noChessProgram;
372     char *firstHost;
373     char *secondHost;
374     char *bitmapDirectory;
375     char *remoteShell;
376     char *remoteUser;
377     float timeDelay;
378     char *timeControl;
379     Boolean icsActive;
380     char *icsHost;
381     char *icsPort;
382     char *icsCommPort;  /* if set, use serial port instead of tcp host/port */
383     char *icsLogon;     /* Hack to permit variable logon scripts. */
384     char *icsHelper;
385     Boolean icsInputBox;
386     Boolean useTelnet;
387     char *telnetProgram;
388     char *gateway;
389     char *loadGameFile;
390     int loadGameIndex;      /* game # within file */
391     char *saveGameFile;
392     Boolean autoSaveGames;
393     char *loadPositionFile;
394     int loadPositionIndex;  /* position # within file */
395     char *savePositionFile;
396     Boolean matchMode;
397     int matchGames;
398     Boolean monoMode;
399     Boolean debugMode;
400     Boolean clockMode;
401     char *boardSize;
402     Boolean Iconic;
403     char *searchTime;
404     int searchDepth;
405     Boolean showCoords;
406     char *clockFont;
407     char *messageFont; /* WinBoard only */
408     char *coordFont;
409     char *font; /* xboard only: all other fonts */
410     char *tagsFont; /* WinBoard only */
411     char *commentFont; /* WinBoard only */
412     char *icsFont; /* WinBoard only */
413     Boolean ringBellAfterMoves;
414     Boolean autoCallFlag;
415     Boolean flipView;
416     Boolean autoFlipView;
417     char *cmailGameName; /* xboard only */
418     Boolean alwaysPromoteToQueen;
419     Boolean oldSaveStyle;
420     Boolean quietPlay;
421     Boolean showThinking;
422     Boolean ponderNextMove;
423     Boolean periodicUpdates;
424     Boolean autoObserve;
425     Boolean autoComment;
426     Boolean getMoveList;
427     Boolean testLegality;
428     int borderXoffset; /* xboard only */
429     int borderYoffset; /* xboard only */
430     Boolean titleInWindow; /* xboard only */
431     Boolean localLineEditing; /* WinBoard only */
432     Boolean zippyTalk;
433     Boolean zippyPlay;
434     int flashCount; /* Number of times to flash (xboard only) */
435     int flashRate; /* Flashes per second (xboard only)  */
436     char *pixmapDirectory; /* Path to XPM/XIM files to use (xboard only) */
437     int msLoginDelay;  /* Delay per character (in msec) while sending
438                           ICS logon script (xboard only) */
439     Boolean colorize;   /* If True, use the following colors to color text */
440     /* Strings for colors, as "fg, bg, bold" (strings used in xboard only) */
441     char *colorShout;
442     char *colorSShout;
443     char *colorChannel1;
444     char *colorChannel;
445     char *colorKibitz;
446     char *colorTell;
447     char *colorChallenge;
448     char *colorRequest;
449     char *colorSeek;
450     char *colorNormal;
451     char *soundProgram; /* sound-playing program */
452     char *soundShout;
453     char *soundSShout;
454     char *soundChannel1;
455     char *soundChannel;
456     char *soundKibitz;
457     char *soundTell;
458     char *soundChallenge;
459     char *soundRequest;
460     char *soundSeek;
461     char *soundMove;
462     char *soundIcsWin;
463     char *soundIcsLoss;
464     char *soundIcsDraw;
465     char *soundIcsUnfinished;
466     char *soundIcsAlarm;
467     Boolean reuseFirst;
468     Boolean reuseSecond;
469     Boolean animateDragging; /* If True, animate mouse dragging of pieces */
470     Boolean animate;    /* If True, animate non-mouse moves */
471     int animSpeed;      /* Delay in milliseconds between animation frames */
472     Boolean popupMoveErrors;
473     Boolean popupExitMessage;
474     int showJail;
475     Boolean highlightLastMove;
476     Boolean highlightDragging;
477     Boolean blindfold;          /* if true, no pieces are drawn */
478     Boolean premove;            /* true if premove feature enabled */ 
479     Boolean premoveWhite;       /* true if premoving White first move  */ 
480     char *premoveWhiteText;     /* text of White premove 1 */ 
481     Boolean premoveBlack;       /* true if premoving Black first move */ 
482     char *premoveBlackText;     /* text of Black premove 1 */ 
483     Boolean icsAlarm;           /* true if sounding alarm at a certain time */  
484     int icsAlarmTime;           /* time to sound alarm, in milliseconds */
485     Boolean autoRaiseBoard;
486     int fontSizeTolerance; /* xboard only */
487     char *initialMode;
488     char *variant;
489     int firstProtocolVersion;
490     int secondProtocolVersion;
491     Boolean showButtonBar;
492     Boolean icsEngineAnalyze; 
493
494     /* [AS] New properties (down to the "ZIPPY" part) */
495     Boolean firstScoreIsAbsolute;  /* If true, engine score is always from white side */
496     Boolean secondScoreIsAbsolute; /* If true, engine score is always from white side */
497     Boolean saveExtendedInfoInPGN; /* If true, saved PGN games contain extended info */
498     Boolean hideThinkingFromHuman; /* If true, program thinking is generated but not displayed in human/computer matches */
499     char * liteBackTextureFile; /* Name of texture bitmap for lite squares */
500     char * darkBackTextureFile; /* Name of texture bitmap for dark squares */
501     int liteBackTextureMode;
502     int darkBackTextureMode;
503     char * renderPiecesWithFont; /* Name of font for rendering chess pieces */
504     char * fontToPieceTable; /* Map to translate font character to chess pieces */
505     int fontBackColorWhite;
506     int fontForeColorWhite;
507     int fontBackColorBlack;
508     int fontForeColorBlack;
509     int fontPieceSize; /* Size of font relative to square (percentage) */
510     int overrideLineGap; /* If >= 0 overrides the lineGap value of the board size properties */
511     int adjudicateLossThreshold; /* Adjudicate a two-machine game if both engines agree the score is below this for 6 plies */
512     int delayBeforeQuit;
513     int delayAfterQuit;
514     char * nameOfDebugFile;
515     char * pgnEventHeader;
516     int defaultFrcPosition;
517     char * gameListTags;
518     Boolean saveOutOfBookInfo;
519     Boolean showEvalInMoveHistory;
520     int evalHistColorWhite;
521     int evalHistColorBlack;
522     Boolean highlightMoveWithArrow;
523     int highlightArrowColor;
524     Boolean useStickyWindows;
525     int adjudicateDrawMoves;
526     Boolean autoDisplayComment;
527     Boolean autoDisplayTags;
528     Boolean firstIsUCI;
529     Boolean secondIsUCI;
530     Boolean firstHasOwnBookUCI;
531     Boolean secondHasOwnBookUCI;
532     char * polyglotDir;
533     Boolean usePolyglotBook;
534     char * polyglotBook;
535     int defaultHashSize;
536     int defaultCacheSizeEGTB;
537     char * defaultPathEGTB;
538
539     /* [HGM] Board size */
540     int NrFiles;
541     int NrRanks;
542     int holdingsSize;
543     int matchPause;
544     char * pieceToCharTable;
545     Boolean allWhite;
546     Boolean upsideDown;
547     Boolean alphaRank;
548     Boolean testClaims;
549     Boolean checkMates;
550     Boolean materialDraws;
551     Boolean trivialDraws;
552     int ruleMoves;
553     int drawRepeats;
554
555 #if ZIPPY
556     char *zippyLines;
557     char *zippyPinhead;
558     char *zippyPassword;
559     char *zippyPassword2;
560     char *zippyWrongPassword;
561     char *zippyAcceptOnly;
562     int zippyUseI;
563     int zippyBughouse;
564     int zippyNoplayCrafty;
565     char *zippyGameEnd;
566     char *zippyGameStart;
567     int zippyAdjourn;
568     int zippyAbort;
569     char *zippyVariants;
570     int zippyMaxGames;
571     int zippyReplayTimeout; /*seconds*/
572     int zippyShortGame; /* [HGM] aborter   */
573 #endif
574     Boolean lowTimeWarning; /* [HGM] low time */
575     char *lowTimeWarningColor;
576
577     char *serverMovesName;
578     Boolean suppressLoadMoves;
579     int serverPause;
580     int firstTimeOdds;
581     int secondTimeOdds;
582     int timeOddsMode;
583     int firstAccumulateTC;
584     int secondAccumulateTC;
585     int firstNPS;
586     int secondNPS;
587     Boolean autoKibitz;
588     int engineComments;
589     char *userName;
590     int rewindIndex;    /* [HGM] autoinc   */
591     int sameColorGames; /* [HGM] alternate */
592     int smpCores;       /* [HGM] SMP       */
593     char *egtFormats;
594     int niceEngines;    /* [HGM] nice      */
595     char *firstLogo;    /* [HGM] logo      */
596     char *secondLogo;
597     Boolean autoLogo;
598     Boolean noGUI;      /* [HGM] fast: suppress all display updates */
599     char *firstOptions; /* [HGM] options   */
600     char *secondOptions;
601     char *fenOverride1;
602     char *fenOverride2;
603     Boolean keepAlive;  /* [HGM] alive     */
604 } AppData, *AppDataPtr;
605
606 /* [AS] PGN tags (for showing in the game list) */
607 #define GLT_EVENT           'e'
608 #define GLT_SITE            's'
609 #define GLT_DATE            'd'
610 #define GLT_ROUND           'o'
611 #define GLT_PLAYERS         'p'     /* I.e. white "-" black */
612 #define GLT_RESULT          'r'
613 #define GLT_WHITE_ELO       'w'
614 #define GLT_BLACK_ELO       'b'
615 #define GLT_TIME_CONTROL    't'
616 #define GLT_VARIANT         'v'
617 #define GLT_OUT_OF_BOOK     'a'
618 #define GLT_RESULT_COMMENT  'c'     /* [HGM] rescom */
619
620 #define GLT_DEFAULT_TAGS    "eprd"  /* Event, players, result, date */
621
622 #define GLT_ALL_TAGS        "esdoprwbtvac"
623
624 #define PGN_OUT_OF_BOOK     "Annotator"
625
626 extern AppData appData;
627
628 typedef struct {
629     /* PGN 7-tag info */
630     char *event;
631     char *site;
632     char *date;
633     char *round;
634     char *white;
635     char *black;
636     ChessMove result;
637     /* Additional info */
638     char *fen;          /* NULL or FEN for starting position; input only */
639     char *resultDetails;
640     char *timeControl;
641     char *extraTags;    /* NULL or "[Tag \"Value\"]\n", etc. */
642     int whiteRating;    /* -1 if unknown */
643     int blackRating;    /* -1 if unknown */
644     VariantClass variant;
645     char *outOfBook;    /* [AS] Move and score when engine went out of book */
646     int boardWidth;     /* [HGM] adjustable board size */
647     int boardHeight;
648 /* [HGM] For Shogi and Crazyhouse: */
649     int holdingsSize;  /* number of different piece types in holdings       */
650     int holdingsWidth; /* number of files left and right of board, 0 or 2   */
651 } GameInfo;
652
653 // [HGM] chat   
654 #define MAX_CHAT 3
655 extern int chatCount;
656 extern char chatPartner[MAX_CHAT][MSG_SIZ];
657
658
659 #endif
660