2 * common.h -- Common definitions for X and Windows NT versions of XBoard
4 * Copyright 1991 by Digital Equipment Corporation, Maynard,
7 * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
8 * 2007, 2008, 2009 Free Software Foundation, Inc.
10 * Enhancements Copyright 2005 Alessandro Scotti
12 * The following terms apply to Digital Equipment Corporation's copyright
14 * ------------------------------------------------------------------------
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.
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
32 * ------------------------------------------------------------------------
34 * The following terms apply to the enhanced version of XBoard
35 * distributed by the Free Software Foundation:
36 * ------------------------------------------------------------------------
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.
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.
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/. *
51 *------------------------------------------------------------------------
52 ** See the file ChangeLog for a revision history. */
58 /* Begin compatibility grunge */
60 #if defined(__STDC__) || defined(WIN32) || defined(_amigados)
62 typedef void *VOIDSTAR;
65 typedef char *VOIDSTAR;
72 #define pclose _pclose
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. */
79 FILE *popen(const char *, const char *);
84 #include <X11/Intrinsic.h>
94 #define UNKNOWN -1 /* [HGM] nps */
98 # define srandom srand48
99 # define random lrand48
100 # else /* not HAVE_RAND48 */
101 # define srandom srand
103 # endif /* not HAVE_RAND48 */
104 #endif /* !HAVE_RANDOM */
106 /* End compatibility grunge */
108 #define PROTOVER 2 /* engine protocol version */
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"
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'.
128 #define BOARD_RANKS 11 /* [HGM] for in declarations */
129 #define BOARD_FILES 16 /* [HGM] for in declarations */
130 #define BOARD_HEIGHT (gameInfo.boardHeight) /* [HGM] made user adjustable */
131 #define BOARD_WIDTH (gameInfo.boardWidth + 2*gameInfo.holdingsWidth)
132 #define BOARD_LEFT (gameInfo.holdingsWidth) /* [HGM] play-board edges */
133 #define BOARD_RGHT (gameInfo.boardWidth + gameInfo.holdingsWidth)
134 #define CASTLING (BOARD_RANKS-1) /* [HGM] hide in upper rank */
135 #define EP_STATUS CASTLING][(BOARD_FILES-2) /* [HGM] in upper rank */
136 #define HOLDINGS_SET CASTLING][(BOARD_FILES-1) /* [HGM] in upper-right corner*/
137 #define ONE ('1'-(BOARD_HEIGHT>9)) /* [HGM] foremost board rank */
138 #define AAA ('a'-BOARD_LEFT) /* [HGM] leftmost board file */
140 #define MAX_MOVES 1000
142 #define DIALOG_SIZE 256
143 #define STAR_MATCH_N 16
145 #define TIME_CONTROL "5" /* in minutes */
146 #define TIME_DELAY_QUOTE "1.0" /* seconds between moves */
147 #define TIME_DELAY ((float) 1.0)
148 #define MOVES_PER_SESSION 40 /* moves per TIME_CONTROL */
149 #define TIME_INCREMENT -1 /* if >= 0, MOVES_PER_SESSION unused */
150 #define WhiteOnMove(move) (((move) % 2) == 0)
151 #define ICS_HOST "chessclub.com"
152 #define ICS_PORT "5000"
153 #define ICS_COMM_PORT ""
154 #define FIRST_HOST "localhost"
155 #define SECOND_HOST "localhost"
156 #define TELNET_PROGRAM "telnet"
157 #define DEF_BITMAP_DIR "/usr/share/games/xboard/bitmaps.xchess" /* AP: shouldn't be hardcoded directory, but better than nothing at the moment */
158 #define MATCH_MODE "False"
159 #define INIT_STRING "new\nrandom\n"
160 #define WHITE_STRING "white\ngo\n"
161 #define BLACK_STRING "black\ngo\n"
162 #define COMPUTER_STRING "computer\n"
163 #define REUSE_CHESS_PROGRAMS 1
164 #define WHITE_PIECE_COLOR "#FFFFCC"
165 #define BLACK_PIECE_COLOR "#202020"
166 #define LIGHT_SQUARE_COLOR "#C8C365"
167 #define DARK_SQUARE_COLOR "#77A26D"
168 #define JAIL_SQUARE_COLOR "#808080"
169 #define HIGHLIGHT_SQUARE_COLOR "#FFFF00"
170 #define PREMOVE_HIGHLIGHT_COLOR "#FF0000"
171 #define BELLCHAR '\007'
172 #define NULLCHAR '\000'
173 #define FEATURE_TIMEOUT 10000 /*ms*/
176 #define ZIPPY_TALK FALSE
177 #define ZIPPY_PLAY FALSE
178 #define ZIPPY_LINES "yow.lines"
179 #define ZIPPY_PINHEAD ""
180 #define ZIPPY_PASSWORD ""
181 #define ZIPPY_PASSWORD2 ""
182 #define ZIPPY_WRONG_PASSWORD ""
183 #define ZIPPY_ACCEPT_ONLY ""
184 #define ZIPPY_USE_I TRUE
185 #define ZIPPY_BUGHOUSE 0
186 #define ZIPPY_NOPLAY_CRAFTY FALSE
187 #define ZIPPY_GAME_END "gameend\n"
188 #define ZIPPY_GAME_START ""
189 #define ZIPPY_ADJOURN FALSE
190 #define ZIPPY_ABORT FALSE
191 #define ZIPPY_VARIANTS "normal,fischerandom,crazyhouse,losers,suicide,3checks,twokings,bughouse,shatranj"
192 #define ZIPPY_MAX_GAMES 0
193 #define ZIPPY_REPLAY_TIMEOUT 120
196 BeginningOfGame, MachinePlaysWhite, MachinePlaysBlack,
197 AnalyzeMode, AnalyzeFile, TwoMachinesPlay,
198 EditGame, PlayFromGameFile, EndOfGame, EditPosition, Training,
199 IcsIdle, IcsPlayingWhite, IcsPlayingBlack, IcsObserving,
204 /* [HGM] the order here is crucial for Crazyhouse & Shogi: */
205 /* only the first N pieces can go into the holdings, and */
206 /* promotions in those variants shift P-W to U-S */
207 WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen,
208 WhiteFerz, WhiteAlfil, WhiteAngel, WhiteMarshall, WhiteWazir, WhiteMan,
209 WhiteCannon, WhiteNightrider, WhiteCardinal, WhiteDragon, WhiteGrasshopper,
210 WhiteSilver, WhiteFalcon, WhiteLance, WhiteCobra, WhiteUnicorn, WhiteKing,
211 BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen,
212 BlackFerz, BlackAlfil, BlackAngel, BlackMarshall, BlackWazir, BlackMan,
213 BlackCannon, BlackNightrider, BlackCardinal, BlackDragon, BlackGrasshopper,
214 BlackSilver, BlackFalcon, BlackLance, BlackCobra, BlackUnicorn, BlackKing,
216 NoRights, // [HGM] gamestate: for castling rights hidden in board[CASTLING]
217 ClearBoard, WhitePlay, BlackPlay, PromotePiece, DemotePiece /*for use on EditPosition menus*/
220 /* [HGM] some macros that can be used as prefixes to convert piece types */
221 #define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int)
222 #define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int)
223 #define PROMOTED (int)WhiteDragon - (int)WhiteRook + (int)
224 #define DEMOTED (int)WhiteRook - (int)WhiteDragon + (int)
225 #define SHOGI (int)EmptySquare + (int)
228 typedef ChessSquare Board[BOARD_RANKS][BOARD_FILES];
231 WhiteKingSideCastle = 1, WhiteQueenSideCastle,
232 WhiteKingSideCastleWild, WhiteQueenSideCastleWild,
233 WhiteHSideCastleFR, WhiteASideCastleFR,
234 BlackKingSideCastle, BlackQueenSideCastle,
235 BlackKingSideCastleWild, BlackQueenSideCastleWild,
236 BlackHSideCastleFR, BlackASideCastleFR,
237 WhitePromotionKnight, WhitePromotionBishop,
238 WhitePromotionRook, WhitePromotionQueen, WhitePromotionKing,
239 WhitePromotionChancellor, WhitePromotionArchbishop, WhitePromotionCentaur,
240 BlackPromotionKnight, BlackPromotionBishop,
241 BlackPromotionRook, BlackPromotionQueen, BlackPromotionKing,
242 BlackPromotionChancellor, BlackPromotionArchbishop, BlackPromotionCentaur,
243 WhiteCapturesEnPassant, BlackCapturesEnPassant,
244 WhiteDrop, BlackDrop,
245 NormalMove, AmbiguousMove, IllegalMove, ImpossibleMove,
246 WhiteWins, BlackWins, GameIsDrawn, GameUnfinished,
247 GNUChessGame, XBoardGame, MoveNumberOne,
248 Comment, PositionDiagram, ElapsedTime, PGNTag, NAG
252 ColorShout, ColorSShout, ColorChannel1, ColorChannel, ColorKibitz,
253 ColorTell, ColorChallenge, ColorRequest, ColorSeek, ColorNormal,
254 ColorNone, NColorClasses
258 SoundMove, SoundBell, SoundAlarm, SoundIcsWin, SoundIcsLoss,
259 SoundIcsDraw, SoundIcsUnfinished, NSoundClasses
262 /* Names for chess variants, not necessarily supported */
264 VariantNormal, /* Normal chess */
265 VariantLoadable, /* "loadgame" command allowed (not really a variant)*/
266 VariantWildCastle, /* Shuffle chess where king can castle from d file */
267 VariantNoCastle, /* Shuffle chess with no castling at all */
268 VariantFischeRandom, /* FischeRandom */
269 VariantBughouse, /* Bughouse, ICC/FICS rules */
270 VariantCrazyhouse, /* Crazyhouse, ICC/FICS rules */
271 VariantLosers, /* Try to lose all pieces or get mated (ICC wild 17)*/
272 VariantSuicide, /* Try to lose all pieces incl. king (FICS) */
273 VariantGiveaway, /* Try to have no legal moves left (ICC wild 26) */
274 VariantTwoKings, /* Weird ICC wild 9 */
275 VariantKriegspiel, /* Kriegspiel; pawns can capture invisible pieces */
276 VariantAtomic, /* Capturing piece explodes (ICC wild 27) */
277 Variant3Check, /* Win by giving check 3 times (ICC wild 25) */
278 VariantShatranj, /* Unsupported (ICC wild 28) */
279 Variant29, /* Temporary name for possible future ICC wild 29 */
280 Variant30, /* Temporary name for possible future ICC wild 30 */
281 Variant31, /* Temporary name for possible future ICC wild 31 */
282 Variant32, /* Temporary name for possible future ICC wild 32 */
283 Variant33, /* Temporary name for possible future ICC wild 33 */
284 Variant34, /* Temporary name for possible future ICC wild 34 */
285 Variant35, /* Temporary name for possible future ICC wild 35 */
286 Variant36, /* Temporary name for possible future ICC wild 36 */
287 VariantShogi, /* [HGM] added variants */
302 VariantUnknown /* Catchall for other unknown variants */
305 #define VARIANT_NAMES { \
348 #if !defined(_amigados)
349 char *whitePieceColor;
350 char *blackPieceColor;
351 char *lightSquareColor;
352 char *darkSquareColor;
353 char *jailSquareColor;
354 char *highlightSquareColor;
355 char *premoveHighlightColor;
359 int lightSquareColor;
362 int highlightSquareColor;
363 int premoveHighlightColor;
368 char *secondInitString;
369 char *firstComputerString;
370 char *secondComputerString;
371 char *firstChessProgram;
372 char *secondChessProgram;
373 char *firstDirectory;
374 char *secondDirectory;
375 Boolean firstPlaysBlack;
376 Boolean noChessProgram;
379 char *bitmapDirectory;
387 char *icsCommPort; /* if set, use serial port instead of tcp host/port */
388 char *icsLogon; /* Hack to permit variable logon scripts. */
395 int loadGameIndex; /* game # within file */
397 Boolean autoSaveGames;
398 char *loadPositionFile;
399 int loadPositionIndex; /* position # within file */
400 char *savePositionFile;
412 char *messageFont; /* WinBoard only */
414 char *font; /* xboard only: all other fonts */
415 char *tagsFont; /* WinBoard only */
416 char *commentFont; /* WinBoard only */
417 char *icsFont; /* WinBoard only */
418 Boolean ringBellAfterMoves;
419 Boolean autoCallFlag;
421 Boolean autoFlipView;
422 char *cmailGameName; /* xboard only */
423 Boolean alwaysPromoteToQueen;
424 Boolean oldSaveStyle;
426 Boolean showThinking;
427 Boolean ponderNextMove;
428 Boolean periodicUpdates;
432 Boolean testLegality;
433 int borderXoffset; /* xboard only */
434 int borderYoffset; /* xboard only */
435 Boolean titleInWindow; /* xboard only */
436 Boolean localLineEditing; /* WinBoard only */
439 int flashCount; /* Number of times to flash (xboard only) */
440 int flashRate; /* Flashes per second (xboard only) */
441 char *pixmapDirectory; /* Path to XPM/XIM files to use (xboard only) */
442 int msLoginDelay; /* Delay per character (in msec) while sending
443 ICS logon script (xboard only) */
444 Boolean colorize; /* If True, use the following colors to color text */
445 /* Strings for colors, as "fg, bg, bold" (strings used in xboard only) */
452 char *colorChallenge;
456 char *soundProgram; /* sound-playing program */
463 char *soundChallenge;
470 char *soundIcsUnfinished;
474 Boolean animateDragging; /* If True, animate mouse dragging of pieces */
475 Boolean animate; /* If True, animate non-mouse moves */
476 int animSpeed; /* Delay in milliseconds between animation frames */
477 Boolean popupMoveErrors;
478 Boolean popupExitMessage;
480 Boolean highlightLastMove;
481 Boolean highlightDragging;
482 Boolean blindfold; /* if true, no pieces are drawn */
483 Boolean premove; /* true if premove feature enabled */
484 Boolean premoveWhite; /* true if premoving White first move */
485 char *premoveWhiteText; /* text of White premove 1 */
486 Boolean premoveBlack; /* true if premoving Black first move */
487 char *premoveBlackText; /* text of Black premove 1 */
488 Boolean icsAlarm; /* true if sounding alarm at a certain time */
489 int icsAlarmTime; /* time to sound alarm, in milliseconds */
490 Boolean autoRaiseBoard;
491 int fontSizeTolerance; /* xboard only */
494 int firstProtocolVersion;
495 int secondProtocolVersion;
496 Boolean showButtonBar;
497 Boolean icsEngineAnalyze;
499 /* [AS] New properties (down to the "ZIPPY" part) */
500 Boolean firstScoreIsAbsolute; /* If true, engine score is always from white side */
501 Boolean secondScoreIsAbsolute; /* If true, engine score is always from white side */
502 Boolean saveExtendedInfoInPGN; /* If true, saved PGN games contain extended info */
503 Boolean hideThinkingFromHuman; /* If true, program thinking is generated but not displayed in human/computer matches */
504 char * liteBackTextureFile; /* Name of texture bitmap for lite squares */
505 char * darkBackTextureFile; /* Name of texture bitmap for dark squares */
506 int liteBackTextureMode;
507 int darkBackTextureMode;
508 char * renderPiecesWithFont; /* Name of font for rendering chess pieces */
509 char * fontToPieceTable; /* Map to translate font character to chess pieces */
510 int fontBackColorWhite;
511 int fontForeColorWhite;
512 int fontBackColorBlack;
513 int fontForeColorBlack;
514 int fontPieceSize; /* Size of font relative to square (percentage) */
515 int overrideLineGap; /* If >= 0 overrides the lineGap value of the board size properties */
516 int adjudicateLossThreshold; /* Adjudicate a two-machine game if both engines agree the score is below this for 6 plies */
519 char * nameOfDebugFile;
520 char * pgnEventHeader;
521 int defaultFrcPosition;
523 Boolean saveOutOfBookInfo;
524 Boolean showEvalInMoveHistory;
525 int evalHistColorWhite;
526 int evalHistColorBlack;
527 Boolean highlightMoveWithArrow;
528 int highlightArrowColor;
529 Boolean useStickyWindows;
530 int adjudicateDrawMoves;
531 Boolean autoDisplayComment;
532 Boolean autoDisplayTags;
535 Boolean firstHasOwnBookUCI;
536 Boolean secondHasOwnBookUCI;
538 Boolean usePolyglotBook;
541 int defaultCacheSizeEGTB;
542 char * defaultPathEGTB;
544 /* [HGM] Board size */
549 char * pieceToCharTable;
555 Boolean materialDraws;
556 Boolean trivialDraws;
564 char *zippyPassword2;
565 char *zippyWrongPassword;
566 char *zippyAcceptOnly;
569 int zippyNoplayCrafty;
571 char *zippyGameStart;
576 int zippyReplayTimeout; /*seconds*/
577 int zippyShortGame; /* [HGM] aborter */
579 Boolean lowTimeWarning; /* [HGM] low time */
580 char *lowTimeWarningColor;
582 char *serverMovesName;
583 Boolean suppressLoadMoves;
588 int firstAccumulateTC;
589 int secondAccumulateTC;
595 int rewindIndex; /* [HGM] autoinc */
596 int sameColorGames; /* [HGM] alternate */
597 int smpCores; /* [HGM] SMP */
599 int niceEngines; /* [HGM] nice */
600 char *firstLogo; /* [HGM] logo */
603 Boolean noGUI; /* [HGM] fast: suppress all display updates */
604 char *firstOptions; /* [HGM] options */
608 Boolean keepAlive; /* [HGM] alive */
609 Boolean forceIllegal;/*[HGM] illegal */
610 Boolean noJoin; /* [HGM] join */
611 char *wrapContSeq; /* continuation sequence when xboard wraps text */
612 Boolean useInternalWrap; /* use internal wrapping -- noJoin usurps this if set */
613 Boolean pasteSelection; /* paste X selection instead of clipboard */
614 } AppData, *AppDataPtr;
616 /* [AS] PGN tags (for showing in the game list) */
617 #define GLT_EVENT 'e'
620 #define GLT_ROUND 'o'
621 #define GLT_PLAYERS 'p' /* I.e. white "-" black */
622 #define GLT_RESULT 'r'
623 #define GLT_WHITE_ELO 'w'
624 #define GLT_BLACK_ELO 'b'
625 #define GLT_TIME_CONTROL 't'
626 #define GLT_VARIANT 'v'
627 #define GLT_OUT_OF_BOOK 'a'
628 #define GLT_RESULT_COMMENT 'c' /* [HGM] rescom */
630 #define GLT_DEFAULT_TAGS "eprd" /* Event, players, result, date */
632 #define GLT_ALL_TAGS "esdoprwbtvac"
634 #define PGN_OUT_OF_BOOK "Annotator"
636 extern AppData appData;
647 /* Additional info */
648 char *fen; /* NULL or FEN for starting position; input only */
651 char *extraTags; /* NULL or "[Tag \"Value\"]\n", etc. */
652 int whiteRating; /* -1 if unknown */
653 int blackRating; /* -1 if unknown */
654 VariantClass variant;
655 char *outOfBook; /* [AS] Move and score when engine went out of book */
656 int boardWidth; /* [HGM] adjustable board size */
658 /* [HGM] For Shogi and Crazyhouse: */
659 int holdingsSize; /* number of different piece types in holdings */
660 int holdingsWidth; /* number of files left and right of board, 0 or 2 */
663 /* [AS] Search stats from chessprogram, for the played move */
664 // [HGM] moved here from backend.h because it occurs in declarations of front-end functions
666 int score; /* Centipawns */
667 int depth; /* Plies */
668 int time; /* Milliseconds */
669 } ChessProgramStats_Move;
673 extern int chatCount;
674 extern char chatPartner[MAX_CHAT][MSG_SIZ];