void mysrandom(unsigned int seed);\r
\r
extern int whiteFlag, blackFlag;\r
+Boolean flipClock = FALSE;\r
\r
void DisplayHoldingsCount(HDC hdc, int x, int y, int align, int copyNumber);\r
\r
BoardSize boardSize;\r
BOOLEAN chessProgram;\r
static int boardX, boardY, consoleX, consoleY, consoleW, consoleH;\r
-static int squareSize, lineGap;\r
+static int squareSize, lineGap, minorSize;\r
static int winWidth, winHeight;\r
static RECT messageRect, whiteRect, blackRect;\r
static char messageText[MESSAGE_TEXT_MAX];\r
VOID APIENTRY MenuPopup(HWND hwnd, POINT pt, HMENU hmenu, UINT def);\r
void ParseIcsTextMenu(char *icsTextMenuString);\r
VOID PopUpMoveDialog(char firstchar);\r
+VOID PopUpNameDialog(char firstchar);\r
VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca);\r
\r
/* [AS] */\r
BOOL EngineOutputIsUp();\r
VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
\r
-VOID GothicPopUp(char *title);\r
+VOID GothicPopUp(char *title, VariantClass variant);\r
/*\r
* Setting "frozen" should disable all user input other than deleting\r
* the window. We do this while engines are initializing themselves.\r
SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);\r
\r
+#if 0\r
/* [AS] Disable the FRC stuff if not playing the proper variant */\r
if( gameInfo.variant != VariantFischeRandom ) {\r
EnableMenuItem( GetMenu(hwndMain), IDM_NewGameFRC, MF_GRAYED );\r
}\r
-#ifdef FAIRY\r
-#ifdef GOTHIC\r
- /* [HGM] Gothic licensing requirement */\r
- if(gameInfo.variant == VariantGothic)\r
- GothicPopUp(GOTHIC);\r
-#endif // GOTHIC\r
-#endif // FAIRY\r
+#endif\r
if (hwndConsole) {\r
#if AOT_CONSOLE\r
SetWindowPos(hwndConsole, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
{ "boardWidth", ArgInt, (LPVOID) &appData.NrFiles, TRUE },\r
{ "boardHeight", ArgInt, (LPVOID) &appData.NrRanks, TRUE },\r
{ "holdingsSize", ArgInt, (LPVOID) &appData.holdingsSize, TRUE },\r
- { "matchPause", ArgInt, (LPVOID) &appData.matchPause, FALSE },\r
- { "alphaRank", ArgBoolean, (LPVOID) &appData.alphaRank, TRUE },\r
+ { "matchPause", ArgInt, (LPVOID) &appData.matchPause, TRUE },\r
+ { "pieceToCharTable", ArgString, (LPVOID) &appData.pieceToCharTable, FALSE },\r
+ { "flipBlack", ArgBoolean, (LPVOID) &appData.upsideDown, TRUE },\r
+ { "allWhite", ArgBoolean, (LPVOID) &appData.allWhite, TRUE },\r
+ { "alphaRank", ArgBoolean, (LPVOID) &appData.alphaRank, FALSE },\r
{ "testClaims", ArgBoolean, (LPVOID) &appData.testClaims, TRUE },\r
{ "checkMates", ArgBoolean, (LPVOID) &appData.checkMates, TRUE },\r
{ "materialDraws", ArgBoolean, (LPVOID) &appData.materialDraws, TRUE },\r
{ "trivialDraws", ArgBoolean, (LPVOID) &appData.trivialDraws, TRUE },\r
{ "ruleMoves", ArgInt, (LPVOID) &appData.ruleMoves, TRUE },\r
{ "repeatsToDraw", ArgInt, (LPVOID) &appData.drawRepeats, TRUE },\r
+ { "autoKibitz", ArgTrue, (LPVOID) &appData.autoKibitz, FALSE },\r
+ { "engineDebugOutput", ArgInt, (LPVOID) &appData.engineComments, FALSE },\r
+ { "userName", ArgString, (LPVOID) &appData.userName, FALSE },\r
\r
#ifdef ZIPPY\r
{ "zippyTalk", ArgBoolean, (LPVOID) &appData.zippyTalk, FALSE },\r
/* Kludge to allow winboard.ini files from buggy 4.0.4 to be read: */\r
{ "zippyReplyTimeout", ArgInt, (LPVOID)&junk, FALSE },\r
#endif\r
+ /* [HGM] options for broadcasting and time odds */\r
+ { "serverMoves", ArgString, (LPVOID) &appData.serverMovesName, FALSE },\r
+ { "suppressLoadMoves", ArgBoolean, (LPVOID) &appData.suppressLoadMoves, FALSE },\r
+ { "serverPause", ArgInt, (LPVOID) &appData.serverPause, FALSE },\r
+ { "firstTimeOdds", ArgInt, (LPVOID) &appData.firstTimeOdds, FALSE },\r
+ { "secondTimeOdds", ArgInt, (LPVOID) &appData.secondTimeOdds, FALSE },\r
+ { "timeOddsMode", ArgInt, (LPVOID) &appData.timeOddsMode, TRUE },\r
+ { "firstAccumulateTC", ArgInt, (LPVOID) &appData.firstAccumulateTC, FALSE },\r
+ { "secondAccumulateTC", ArgInt, (LPVOID) &appData.secondAccumulateTC, FALSE },\r
+ { "firstNPS", ArgInt, (LPVOID) &appData.firstNPS, FALSE },\r
+ { "secondNPS", ArgInt, (LPVOID) &appData.secondNPS, FALSE },\r
{ NULL, ArgNone, NULL, FALSE }\r
};\r
\r
appData.drawRepeats = 6;\r
appData.matchPause = 10000;\r
appData.alphaRank = FALSE;\r
+ appData.allWhite = FALSE;\r
+ appData.upsideDown = FALSE;\r
+ appData.serverPause = 15;\r
+ appData.serverMovesName = NULL;\r
+ appData.suppressLoadMoves = FALSE;\r
+ appData.firstTimeOdds = 1;\r
+ appData.secondTimeOdds = 1;\r
+ appData.firstAccumulateTC = 1; // combine previous and current sessions\r
+ appData.secondAccumulateTC = 1;\r
+ appData.firstNPS = -1; // [HGM] nps: use wall-clock time\r
+ appData.secondNPS = -1;\r
+ appData.engineComments = 1;\r
+\r
\r
#ifdef ZIPPY\r
appData.zippyTalk = ZIPPY_TALK;\r
appData.NrRanks > BOARD_SIZE )\r
DisplayFatalError("Recompile with BOARD_SIZE > 12, to support this size", 0, 2);\r
\r
+ /* [HGM] After parsing the options from the .ini file, and overruling them\r
+ * with options from the command line, we now make an even higher priority\r
+ * overrule by WB options attached to the engine command line. This so that\r
+ * tournament managers can use WB options (such as /timeOdds) that follow\r
+ * the engines.\r
+ */\r
+ if(appData.firstChessProgram != NULL) {\r
+ char *p = StrStr(appData.firstChessProgram, "WBopt");\r
+ static char *f = "first";\r
+ char buf[MSG_SIZ], *q = buf;\r
+ if(p != NULL) { // engine command line contains WinBoard options\r
+ sprintf(buf, p+6, f, f, f, f, f, f, f, f, f, f); // replace %s in them by "first"\r
+ ParseArgs(StringGet, &q);\r
+ p[-1] = 0; // cut them offengine command line\r
+ }\r
+ }\r
+ // now do same for second chess program\r
+ if(appData.secondChessProgram != NULL) {\r
+ char *p = StrStr(appData.secondChessProgram, "WBopt");\r
+ static char *s = "second";\r
+ char buf[MSG_SIZ], *q = buf;\r
+ if(p != NULL) { // engine command line contains WinBoard options\r
+ sprintf(buf, p+6, s, s, s, s, s, s, s, s, s, s); // replace %s in them by "first"\r
+ ParseArgs(StringGet, &q);\r
+ p[-1] = 0; // cut them offengine command line\r
+ }\r
+ }\r
+\r
+\r
/* Propagate options that affect others */\r
if (appData.matchMode || appData.matchGames) chessProgram = TRUE;\r
if (appData.icsActive || appData.noChessProgram) {\r
PM_WB = (int) WhiteBishop, \r
PM_WR = (int) WhiteRook, \r
PM_WQ = (int) WhiteQueen, \r
-#ifdef FAIRY\r
PM_WF = (int) WhiteFerz, \r
PM_WW = (int) WhiteWazir, \r
PM_WE = (int) WhiteAlfil, \r
+ PM_WM = (int) WhiteMan, \r
+ PM_WO = (int) WhiteCannon, \r
+ PM_WU = (int) WhiteUnicorn, \r
PM_WH = (int) WhiteNightrider, \r
- PM_WA = (int) WhiteCardinal, \r
+ PM_WA = (int) WhiteAngel, \r
PM_WC = (int) WhiteMarshall, \r
PM_WG = (int) WhiteGrasshopper, \r
- PM_WO = (int) WhiteCannon, \r
- PM_WM = (int) WhiteMan, \r
- PM_WU = (int) WhiteUnicorn, \r
-#endif\r
PM_WK = (int) WhiteKing,\r
PM_BP = (int) BlackPawn, \r
PM_BN = (int) BlackKnight, \r
PM_BB = (int) BlackBishop, \r
PM_BR = (int) BlackRook, \r
PM_BQ = (int) BlackQueen, \r
-#ifdef FAIRY\r
PM_BF = (int) BlackFerz, \r
PM_BW = (int) BlackWazir, \r
PM_BE = (int) BlackAlfil, \r
+ PM_BM = (int) BlackMan,\r
+ PM_BO = (int) BlackCannon, \r
+ PM_BU = (int) BlackUnicorn, \r
PM_BH = (int) BlackNightrider, \r
- PM_BA = (int) BlackCardinal, \r
+ PM_BA = (int) BlackAngel, \r
PM_BC = (int) BlackMarshall, \r
PM_BG = (int) BlackGrasshopper, \r
- PM_BO = (int) BlackCannon, \r
- PM_BM = (int) BlackMan,\r
- PM_BU = (int) BlackUnicorn, \r
-#endif\r
PM_BK = (int) BlackKing\r
};\r
\r
static int fontBitmapSquareSize = 0;\r
static char pieceToFontChar[(int) EmptySquare] =\r
{ 'p', 'n', 'b', 'r', 'q', \r
-#ifdef FAIRY\r
'n', 'b', 'p', 'n', 'b', 'r', 'b', 'r', 'q', 'k',\r
-#endif\r
'k', 'o', 'm', 'v', 't', 'w', \r
-#ifdef FAIRY\r
'v', 't', 'o', 'm', 'v', 't', 'v', 't', 'w', 'l',\r
-#endif\r
'l' };\r
\r
-static BOOL SetPieceToFontCharTable( const char * map )\r
-{\r
- BOOL result = FALSE; int NrPieces;\r
-\r
- if( map != NULL && (NrPieces=strlen(map)) <= (int) EmptySquare \r
- && NrPieces >= 12 && !(NrPieces&1)) {\r
- int i; /* [HGM] Accept even length from 12 to 32 */\r
-\r
- for( i=0; i<(int) EmptySquare; i++ ) pieceToFontChar[i] = 0;\r
- for( i=0; i<NrPieces/2-1; i++ ) {\r
- pieceToFontChar[i] = map[i];\r
- pieceToFontChar[i + (int)BlackPawn - (int) WhitePawn] = map[i+NrPieces/2];\r
- }\r
- pieceToFontChar[(int) WhiteKing] = map[NrPieces/2-1];\r
- pieceToFontChar[(int) BlackKing] = map[NrPieces-1];\r
-\r
- result = TRUE;\r
- }\r
-\r
- return result;\r
-}\r
+extern BOOL SetCharTable( char *table, const char * map );\r
+/* [HGM] moved to backend.c */\r
\r
static void SetPieceBackground( HDC hdc, COLORREF color, int mode )\r
{\r
return PM_WQ;\r
case WhiteKing:\r
return PM_WK;\r
-#ifdef FAIRY\r
- case BlackCardinal:\r
+ case BlackAngel:\r
return PM_BA;\r
case BlackMarshall:\r
return PM_BC;\r
return PM_BG;\r
case BlackMan:\r
return PM_BM;\r
- case WhiteCardinal:\r
+ case WhiteAngel:\r
return PM_WA;\r
case WhiteMarshall:\r
return PM_WC;\r
return PM_WG;\r
case WhiteMan:\r
return PM_WM;\r
-#endif\r
}\r
\r
return 0;\r
}\r
else {\r
/* Setup font-to-piece character table */\r
- if( ! SetPieceToFontCharTable(appData.fontToPieceTable) ) {\r
+ if( ! SetCharTable(pieceToFontChar, appData.fontToPieceTable) ) {\r
/* No (or wrong) global settings, try to detect the font */\r
if( strstr(lf.lfFaceName,"Alpha") != NULL ) {\r
/* Alpha */\r
- SetPieceToFontCharTable("phbrqkojntwl");\r
+ SetCharTable(pieceToFontChar, "phbrqkojntwl");\r
}\r
else if( strstr(lf.lfFaceName,"DiagramTT") != NULL ) {\r
/* DiagramTT* family */\r
- SetPieceToFontCharTable("PNLRQKpnlrqk");\r
+ SetCharTable(pieceToFontChar, "PNLRQKpnlrqk");\r
}\r
-#ifdef FAIRY\r
else if( strstr(lf.lfFaceName,"WinboardF") != NULL ) {\r
/* Fairy symbols */\r
- SetPieceToFontCharTable("PNBRACFHEWUOGMQKpnbracfewuogmqk");\r
+ SetCharTable(pieceToFontChar, "PNBRQFEACWMOHIJGDVSLUKpnbrqfeacwmohijgdvsluk");\r
}\r
-#endif\r
else if( strstr(lf.lfFaceName,"GC2004D") != NULL ) {\r
/* Good Companion (Some characters get warped as literal :-( */\r
char s[] = "1cmWG0ñueOS¯®oYI23wgQU";\r
s[0]=0xB9; s[1]=0xA9; s[6]=0xB1; s[11]=0xBB; s[12]=0xAB; s[17]=0xB3;\r
- SetPieceToFontCharTable(s);\r
+ SetCharTable(pieceToFontChar, s);\r
}\r
else {\r
/* Cases, Condal, Leipzig, Lucena, Marroquin, Merida, Usual */\r
- SetPieceToFontCharTable("pnbrqkomvtwl");\r
+ SetCharTable(pieceToFontChar, "pnbrqkomvtwl");\r
}\r
}\r
\r
LOGBRUSH logbrush;\r
\r
/* [HGM] call with -1 uses old size (for if nr of files, ranks changes) */\r
- if(boardSize == (BoardSize)(-1) ) boardSize = oldBoardSize;\r
+ if(boardSize == (BoardSize)(-2) ) boardSize = oldBoardSize;\r
\r
tinyLayout = sizeInfo[boardSize].tinyLayout;\r
smallLayout = sizeInfo[boardSize].smallLayout;\r
squareSize = sizeInfo[boardSize].squareSize;\r
lineGap = sizeInfo[boardSize].lineGap;\r
+ minorSize = 0; /* [HGM] Kludge to see if demagnified pieces need to be shifted */\r
\r
if( appData.overrideLineGap >= 0 && appData.overrideLineGap <= 5 ) {\r
lineGap = appData.overrideLineGap;\r
}\r
}\r
\r
- if (boardSize == oldBoardSize) return;\r
+ /* [HGM] Licensing requirement */\r
+#ifdef GOTHIC\r
+ if(gameInfo.variant == VariantGothic) GothicPopUp( GOTHIC, VariantGothic); else\r
+#endif\r
+#ifdef FALCON\r
+ if(gameInfo.variant == VariantFalcon) GothicPopUp( FALCON, VariantFalcon); else\r
+#endif\r
+ GothicPopUp( "", VariantNormal);\r
+\r
+\r
+/* if (boardSize == oldBoardSize) return; [HGM] variant might have changed */\r
oldBoardSize = boardSize;\r
oldTinyLayout = tinyLayout;\r
\r
}\r
}\r
\r
+ // Orthodox Chess pieces\r
pieceBitmap[0][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "s");\r
pieceBitmap[0][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "s");\r
pieceBitmap[0][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "s");\r
pieceBitmap[0][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "s");\r
- pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "s");\r
pieceBitmap[0][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "s");\r
pieceBitmap[1][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "o");\r
pieceBitmap[1][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "o");\r
pieceBitmap[1][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "o");\r
pieceBitmap[1][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "o");\r
- pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "o");\r
pieceBitmap[1][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "o");\r
pieceBitmap[2][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "w");\r
pieceBitmap[2][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "w");\r
pieceBitmap[2][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "w");\r
pieceBitmap[2][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "w");\r
- pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w");\r
pieceBitmap[2][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "w");\r
-#ifdef FAIRY\r
- if(squareSize==72 || squareSize==49) { /* experiment with some home-made bitmaps */\r
- pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "s");\r
- pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "o");\r
- pieceBitmap[2][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "w");\r
- pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "s");\r
- pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "o");\r
- pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
- if(!strcmp(appData.variant, "shogi")) { /* promoted Gold represemtations */\r
- pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "wp", squareSize, "s");\r
- pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "wp", squareSize, "o");\r
- pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
- pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "s");\r
- pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "o");\r
- pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
- pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "wl", squareSize, "s");\r
- pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "wl", squareSize, "o");\r
- pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
- pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "ws", squareSize, "s");\r
- pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "ws", squareSize, "o");\r
- pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
- } else {\r
- pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "s");\r
- pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "o");\r
- pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "w");\r
- pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "s");\r
- pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "o");\r
- pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "w");\r
- pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "s");\r
- pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "o");\r
- pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "w");\r
- pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "s");\r
- pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "o");\r
- pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "w");\r
- pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "s");\r
- pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "o");\r
- pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "w");\r
- }\r
- pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "s");\r
- pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "o");\r
- pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "w");\r
- pieceBitmap[0][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "s");\r
- pieceBitmap[1][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "o");\r
- pieceBitmap[2][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "w");\r
- if(strcmp(appData.variant, "crazyhouse") && strcmp(appData.variant, "shogi")) {\r
- pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "s");\r
- pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "o");\r
- pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "w");\r
+ if( !strcmp(appData.variant, "shogi") && (squareSize==72 || squareSize==49)) {\r
+ // in Shogi, Hijack the unused Queen for Lance\r
+ pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "s");\r
+ pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "o");\r
+ pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "w");\r
} else {\r
- pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "dk", squareSize, "s");\r
- pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "dk", squareSize, "o");\r
- pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "dk", squareSize, "w");\r
- }\r
- if(!strcmp(appData.variant, "xiangqi") || !strcmp(appData.variant, "shogi")) {\r
- for(i=0; i<2; i++)\r
- if (pieceBitmap[i][WhiteQueen] != NULL)\r
- DeleteObject(pieceBitmap[i][WhiteQueen]);\r
- pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "o", squareSize, "s");\r
- pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "o", squareSize, "o");\r
- pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "o", squareSize, "w");\r
- }\r
+ pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "s");\r
+ pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "o");\r
+ pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w");\r
+ }\r
+\r
+ if(squareSize <= 72 && squareSize >= 33) { \r
+ /* A & C are available in most sizes now */\r
+ if(squareSize != 49 && squareSize != 72 && squareSize != 33) { // Vortex-like\r
+ pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "s");\r
+ pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "o");\r
+ pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "w");\r
+ pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "s");\r
+ pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "o");\r
+ pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "w");\r
+ pieceBitmap[0][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "s");\r
+ pieceBitmap[1][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "o");\r
+ pieceBitmap[2][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "w");\r
+ pieceBitmap[0][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "s");\r
+ pieceBitmap[1][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "o");\r
+ pieceBitmap[2][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "w");\r
+ } else { // Smirf-like\r
+ pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "s");\r
+ pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "o");\r
+ pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "w");\r
+ }\r
+ if(gameInfo.variant == VariantGothic) { // Vortex-like\r
+ pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "s");\r
+ pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "o");\r
+ pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "w");\r
+ } else { // WinBoard standard\r
+ pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "s");\r
+ pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "o");\r
+ pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "w");\r
+ }\r
+ }\r
+\r
+\r
+ if(squareSize==72 || squareSize==49 || squareSize==33) { /* experiment with some home-made bitmaps */\r
+ pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "s");\r
+ pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "o");\r
+ pieceBitmap[2][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "w");\r
+ pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "s");\r
+ pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "o");\r
+ pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
+ pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "s");\r
+ pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "o");\r
+ pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "w");\r
+ pieceBitmap[0][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "s");\r
+ pieceBitmap[1][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "o");\r
+ pieceBitmap[2][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "w");\r
+ pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "s");\r
+ pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "o");\r
+ pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "w");\r
+ pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "s");\r
+ pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "o");\r
+ pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "w");\r
+ pieceBitmap[0][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "s");\r
+ pieceBitmap[1][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "o");\r
+ pieceBitmap[2][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "w");\r
+ pieceBitmap[0][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "s");\r
+ pieceBitmap[1][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "o");\r
+ pieceBitmap[2][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "w");\r
+ pieceBitmap[0][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "s");\r
+ pieceBitmap[1][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "o");\r
+ pieceBitmap[2][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "w");\r
+ pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "s");\r
+ pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "o");\r
+ pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "w");\r
+\r
+ if(gameInfo.variant == VariantShogi) { /* promoted Gold represemtations */\r
+ pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "wp", squareSize, "s");\r
+ pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "wp", squareSize, "o");\r
+ pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
+ pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "s");\r
+ pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "o");\r
+ pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
+ pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "s");\r
+ pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "o");\r
+ pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
+ pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "s");\r
+ pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "o");\r
+ pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
+ } else {\r
+ pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "s");\r
+ pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "o");\r
+ pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "w");\r
+ pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "s");\r
+ pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "o");\r
+ pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "w");\r
+ pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "s");\r
+ pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "o");\r
+ pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "w");\r
+ pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "s");\r
+ pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "o");\r
+ pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "w");\r
+ }\r
+\r
+ } else { /* other size, no special bitmaps available. Use smaller symbols */\r
+ if((int)boardSize < 2) minorSize = sizeInfo[0].squareSize;\r
+ else minorSize = sizeInfo[(int)boardSize - 2].squareSize;\r
+ pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "s");\r
+ pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "o");\r
+ pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "w");\r
+ pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "s");\r
+ pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "o");\r
+ pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "w");\r
+ pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "s");\r
+ pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "o");\r
+ pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "w");\r
+ pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "s");\r
+ pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "o");\r
+ pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "w");\r
+ }\r
+\r
+\r
+ if(gameInfo.variant == VariantShogi && squareSize == 58)\r
+ /* special Shogi support in this size */\r
+ { for (i=0; i<=2; i++) { /* replace all bitmaps */\r
+ for (piece = WhitePawn;\r
+ (int) piece < (int) BlackPawn;\r
+ piece = (ChessSquare) ((int) piece + 1)) {\r
+ if (pieceBitmap[i][piece] != NULL)\r
+ DeleteObject(pieceBitmap[i][piece]);\r
+ }\r
+ }\r
+ pieceBitmap[0][WhitePawn] = DoLoadBitmap(hInst, "sp", squareSize, "o");\r
+ pieceBitmap[0][WhiteKnight] = DoLoadBitmap(hInst, "sn", squareSize, "o");\r
+ pieceBitmap[0][WhiteBishop] = DoLoadBitmap(hInst, "sb", squareSize, "o");\r
+ pieceBitmap[0][WhiteRook] = DoLoadBitmap(hInst, "sr", squareSize, "o");\r
+ pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "sl", squareSize, "o");\r
+ pieceBitmap[0][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "o");\r
+ pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "sf", squareSize, "o");\r
+ pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "o");\r
+ pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "su", squareSize, "o");\r
+ pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "sh", squareSize, "o");\r
+ pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "sa", squareSize, "o");\r
+ pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "sc", squareSize, "o");\r
+ pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "sg", squareSize, "o");\r
+ pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "ss", squareSize, "o");\r
+ pieceBitmap[1][WhitePawn] = DoLoadBitmap(hInst, "sp", squareSize, "o");\r
+ pieceBitmap[1][WhiteKnight] = DoLoadBitmap(hInst, "sn", squareSize, "o");\r
+ pieceBitmap[1][WhiteBishop] = DoLoadBitmap(hInst, "sb", squareSize, "o");\r
+ pieceBitmap[1][WhiteRook] = DoLoadBitmap(hInst, "sr", squareSize, "o");\r
+ pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "sl", squareSize, "o");\r
+ pieceBitmap[1][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "o");\r
+ pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "sf", squareSize, "o");\r
+ pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "o");\r
+ pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "su", squareSize, "o");\r
+ pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "sh", squareSize, "o");\r
+ pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "sa", squareSize, "o");\r
+ pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "sc", squareSize, "o");\r
+ pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "sg", squareSize, "o");\r
+ pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "ss", squareSize, "o");\r
+ pieceBitmap[2][WhitePawn] = DoLoadBitmap(hInst, "sp", squareSize, "w");\r
+ pieceBitmap[2][WhiteKnight] = DoLoadBitmap(hInst, "sn", squareSize, "w");\r
+ pieceBitmap[2][WhiteBishop] = DoLoadBitmap(hInst, "sr", squareSize, "w");\r
+ pieceBitmap[2][WhiteRook] = DoLoadBitmap(hInst, "sr", squareSize, "w");\r
+ pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "sl", squareSize, "w");\r
+ pieceBitmap[2][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "w");\r
+ pieceBitmap[2][WhiteFerz] = DoLoadBitmap(hInst, "sw", squareSize, "w");\r
+ pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "w");\r
+ pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "sp", squareSize, "w");\r
+ pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "sn", squareSize, "w");\r
+ pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "sr", squareSize, "w");\r
+ pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "sr", squareSize, "w");\r
+ pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "sl", squareSize, "w");\r
+ pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "sw", squareSize, "w");\r
+ minorSize = 0;\r
}\r
-#endif\r
-\r
}\r
\r
HBITMAP\r
oldFont = SelectObject(hdc, font[boardSize][COORD_FONT]->hf);\r
\r
y = boardRect.top + lineGap;\r
- x = boardRect.left + lineGap;\r
+ x = boardRect.left + lineGap + gameInfo.holdingsWidth*(squareSize + lineGap);\r
\r
SetTextAlign(hdc, TA_LEFT|TA_TOP);\r
for (i = 0; i < BOARD_HEIGHT; i++) {\r
y += squareSize + lineGap;\r
}\r
\r
- start = flipView ? 12-BOARD_WIDTH : 12;\r
+ start = flipView ? 12-(BOARD_RGHT-BOARD_LEFT) : 12;\r
\r
SetTextAlign(hdc, TA_RIGHT|TA_BOTTOM);\r
- for (i = 0; i < BOARD_WIDTH; i++) {\r
+ for (i = 0; i < BOARD_RGHT - BOARD_LEFT; i++) {\r
str[0] = ranks[start + i];\r
ExtTextOut(hdc, x + squareSize - 2, y - 1, 0, NULL, str, 1, NULL);\r
x += squareSize + lineGap;\r
{\r
HBITMAP oldBitmap;\r
HBRUSH oldBrush;\r
+ int tmpSize;\r
\r
if (appData.blindfold) return;\r
\r
BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0,\r
sqcolor ? SRCCOPY : NOTSRCCOPY);\r
} else {\r
- if (color) {\r
+ tmpSize = squareSize;\r
+ if(minorSize &&\r
+ (piece >= (int)WhiteNightrider && piece <= WhiteGrasshopper ||\r
+ piece >= (int)BlackNightrider && piece <= BlackGrasshopper) ) {\r
+ /* [HGM] no bitmap available for promoted pieces in Crazyhouse */\r
+ /* Bitmaps of smaller size are substituted, but we have to align them */\r
+ x += (squareSize - minorSize)>>1;\r
+ y += squareSize - minorSize - 2;\r
+ tmpSize = minorSize;\r
+ }\r
+ if (color || appData.allWhite ) {\r
oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, WHITE_PIECE));\r
- oldBrush = SelectObject(hdc, whitePieceBrush);\r
- BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, 0x00B8074A);\r
+ if( color )\r
+ oldBrush = SelectObject(hdc, whitePieceBrush);\r
+ else oldBrush = SelectObject(hdc, blackPieceBrush);\r
+ if(appData.upsideDown && color==flipView)\r
+ StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A);\r
+ else\r
+ BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
#if 0\r
/* Use black piece color for outline of white pieces */\r
/* Not sure this looks really good (though xboard does it).\r
Maybe better to have another selectable color, default black */\r
SelectObject(hdc, blackPieceBrush); /* could have own brush */\r
SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE));\r
- BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, 0x00B8074A);\r
+ BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
#else\r
/* Use black for outline of white pieces */\r
SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE));\r
- BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, SRCAND);\r
+ if(appData.upsideDown && color==flipView)\r
+ StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, SRCAND);\r
+ else\r
+ BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, SRCAND);\r
#endif\r
} else {\r
#if 0\r
Maybe better to have another selectable color, default medium gray? */\r
oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, BLACK_PIECE));\r
oldBrush = SelectObject(hdc, whitePieceBrush); /* could have own brush */\r
- BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, 0x00B8074A);\r
+ BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE));\r
SelectObject(hdc, blackPieceBrush);\r
- BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, 0x00B8074A);\r
+ BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
#else\r
/* Use square color for details of black pieces */\r
oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE));\r
oldBrush = SelectObject(hdc, blackPieceBrush);\r
- BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, 0x00B8074A);\r
+ if(appData.upsideDown && !flipView)\r
+ StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A);\r
+ else\r
+ BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
#endif\r
}\r
SelectObject(hdc, oldBrush);\r
piece_color = (int) piece < (int) BlackPawn;\r
\r
\r
-#ifdef FAIRY\r
/* [HGM] holdings file: light square or black */\r
if(column == BOARD_LEFT-2) {\r
if( row > BOARD_HEIGHT - gameInfo.holdingsSize - 1 )\r
else if( column == BOARD_RGHT) /* right align */\r
DisplayHoldingsCount(hdc, x, y, 1, (int) board[row][column]);\r
else\r
-#endif\r
if (appData.monoMode) {\r
if (piece == EmptySquare) {\r
BitBlt(hdc, x, y, squareSize, squareSize, 0, 0, 0,\r
}\r
}\r
\r
+int saveDiagFlag = 0; FILE *diagFile; // [HGM] diag\r
+void fputDW(FILE *f, int x)\r
+{\r
+ fputc(x & 255, f);\r
+ fputc(x>>8 & 255, f);\r
+ fputc(x>>16 & 255, f);\r
+ fputc(x>>24 & 255, f);\r
+}\r
+\r
#define MAX_CLIPS 200 /* more than enough */\r
\r
VOID\r
boardRect.right - boardRect.left,\r
boardRect.bottom - boardRect.top,\r
tmphdc, boardRect.left, boardRect.top, SRCCOPY);\r
+\r
+ if(saveDiagFlag) { \r
+ BITMAP b; int i, j, m, w, wb, fac=0; char pData[1000000]; \r
+ BITMAPINFOHEADER bih; int color[16], nrColors=0;\r
+\r
+ GetObject(bufferBitmap, sizeof(b), &b);\r
+ if(b.bmWidthBytes*b.bmHeight <= 990000) {\r
+ bih.biSize = sizeof(BITMAPINFOHEADER);\r
+ bih.biWidth = b.bmWidth;\r
+ bih.biHeight = b.bmHeight;\r
+ bih.biPlanes = 1;\r
+ bih.biBitCount = b.bmBitsPixel;\r
+ bih.biCompression = 0;\r
+ bih.biSizeImage = b.bmWidthBytes*b.bmHeight;\r
+ bih.biXPelsPerMeter = 0;\r
+ bih.biYPelsPerMeter = 0;\r
+ bih.biClrUsed = 0;\r
+ bih.biClrImportant = 0;\r
+// fprintf(diagFile, "t=%d\nw=%d\nh=%d\nB=%d\nP=%d\nX=%d\n", \r
+// b.bmType, b.bmWidth, b.bmHeight, b.bmWidthBytes, b.bmPlanes, b.bmBitsPixel);\r
+ GetDIBits(tmphdc,bufferBitmap,0,b.bmHeight,pData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);\r
+// fprintf(diagFile, "%8x\n", (int) pData);\r
+\r
+#if 1\r
+ wb = b.bmWidthBytes;\r
+ // count colors\r
+ for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN)>>2; i++) {\r
+ int k = ((int*) pData)[i];\r
+ for(j=0; j<nrColors; j++) if(color[j] == k) break;\r
+ if(j >= 16) break;\r
+ color[j] = k;\r
+ if(j >= nrColors) nrColors = j+1;\r
+ }\r
+ if(j<16) { // 16 colors is enough. Compress to 4 bits per pixel\r
+ INT p = 0;\r
+ for(i=0; i<b.bmHeight - boardRect.top + OUTER_MARGIN; i++) {\r
+ for(w=0; w<(wb>>2); w+=2) {\r
+ int k = ((int*) pData)[(wb*i>>2) + w];\r
+ for(j=0; j<nrColors; j++) if(color[j] == k) break;\r
+ k = ((int*) pData)[(wb*i>>2) + w + 1];\r
+ for(m=0; m<nrColors; m++) if(color[m] == k) break;\r
+ pData[p++] = m | j<<4;\r
+ }\r
+ while(p&3) pData[p++] = 0;\r
+ }\r
+ fac = 3;\r
+ wb = (wb+31>>5)<<2;\r
+ }\r
+ // write BITMAPFILEHEADER\r
+ fprintf(diagFile, "BM");\r
+ fputDW(diagFile, wb*(b.bmHeight - boardRect.top + OUTER_MARGIN)+0x36 + (fac?64:0));\r
+ fputDW(diagFile, 0);\r
+ fputDW(diagFile, 0x36 + (fac?64:0));\r
+ // write BITMAPINFOHEADER\r
+ fputDW(diagFile, 40);\r
+ fputDW(diagFile, b.bmWidth);\r
+ fputDW(diagFile, b.bmHeight - boardRect.top + OUTER_MARGIN);\r
+ if(fac) fputDW(diagFile, 0x040001); // planes and bits/pixel\r
+ else fputDW(diagFile, 0x200001); // planes and bits/pixel\r
+ fputDW(diagFile, 0);\r
+ fputDW(diagFile, 0);\r
+ fputDW(diagFile, 0);\r
+ fputDW(diagFile, 0);\r
+ fputDW(diagFile, 0);\r
+ fputDW(diagFile, 0);\r
+ // write color table\r
+ if(fac)\r
+ for(i=0; i<16; i++) fputDW(diagFile, color[i]);\r
+ // write bitmap data\r
+ for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN); i++) \r
+ fputc(pData[i], diagFile);\r
+#endif\r
+ }\r
+ }\r
+\r
SelectObject(tmphdc, oldBitmap);\r
\r
/* Massive cleanup */\r
lastDrawnValid = 1;\r
}\r
\r
+/* [HGM] diag: Save the current board display to the given open file and close the file */\r
+int\r
+SaveDiagram(f)\r
+ FILE *f;\r
+{\r
+ time_t tm;\r
+ char *fen;\r
+\r
+ saveDiagFlag = 1; diagFile = f;\r
+ HDCDrawPosition(NULL, TRUE, NULL);\r
+\r
+ saveDiagFlag = 0;\r
+\r
+// if(f != NULL) fprintf(f, "Sorry, but this feature is still in preparation\n");\r
+ \r
+ fclose(f);\r
+ return TRUE;\r
+}\r
+\r
\r
/*---------------------------------------------------------------------------*\\r
| CLIENT PAINT PROCEDURE\r
if (y == -2) {\r
/* Downclick vertically off board; check if on clock */\r
if (PtInRect((LPRECT) &whiteRect, pt)) {\r
- if (gameMode == EditPosition) {\r
+ if (gameMode == EditPosition) {\r
SetWhiteToPlayEvent();\r
} else if (gameMode == IcsPlayingBlack ||\r
gameMode == MachinePlaysWhite) {\r
CallFlagEvent();\r
- }\r
+ } else if (gameMode == EditGame) {\r
+ AdjustClock(flipClock, -1);\r
+ }\r
} else if (PtInRect((LPRECT) &blackRect, pt)) {\r
if (gameMode == EditPosition) {\r
SetBlackToPlayEvent();\r
} else if (gameMode == IcsPlayingWhite ||\r
gameMode == MachinePlaysBlack) {\r
CallFlagEvent();\r
+ } else if (gameMode == EditGame) {\r
+ AdjustClock(!flipClock, -1);\r
}\r
}\r
if (!appData.highlightLastMove) {\r
|| x == BOARD_LEFT-1 || x == BOARD_RGHT\r
|| x == BOARD_LEFT-2 && y < BOARD_HEIGHT-gameInfo.holdingsSize\r
|| x == BOARD_RGHT+1 && y >= gameInfo.holdingsSize\r
+ /* EditPosition, empty square, or different color piece;\r
+ click-click move is possible */\r
) {\r
break;\r
} else if (fromX == x && fromY == y) {\r
) {\r
/* Downclick on different square. */\r
/* [HGM] if on holdings file, should count as new first click ! */\r
- \r
- ChessSquare pdown, pup;\r
- pdown = boards[currentMove][fromY][fromX];\r
- pup = boards[currentMove][y][x];\r
- if (gameMode == EditPosition || /* [HGM] max piece > King! */\r
- !((WhitePawn <= pdown && pdown < BlackPawn &&\r
- WhitePawn <= pup && pup < BlackPawn) ||\r
- (BlackPawn <= pdown && pdown < EmptySquare &&\r
- BlackPawn <= pup && pup < EmptySquare))) {\r
- /* EditPosition, empty square, or different color piece;\r
- click-click move is possible */\r
+ { /* [HGM] <sameColor> now always do UserMoveTest(), and check colors there */\r
toX = x;\r
toY = y;\r
+ /* [HGM] <popupFix> UserMoveEvent requires two calls now,\r
+ to make sure move is legal before showing promotion popup */\r
moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR);\r
if(moveType != ImpossibleMove) {\r
- if (IsPromotion(fromX, fromY, toX, toY)) {\r
- /* [HGM] <popupFix> UserMoveEvent requires two calls now,\r
- to make sure move is legal before showing promotion popup */\r
- if (appData.alwaysPromoteToQueen) {\r
+ /* [HGM] We use PromotionToKnight in Shogi to indicate frorced promotion */\r
+ if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
+ (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&\r
+ appData.alwaysPromoteToQueen) {\r
FinishMove(moveType, fromX, fromY, toX, toY, 'q');\r
if (!appData.highlightLastMove) {\r
ClearHighlights();\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
}\r
- } else {\r
+ } else\r
+ if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) {\r
SetHighlights(fromX, fromY, toX, toY);\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
/* [HGM] <popupFix> Popup calls FinishMove now.\r
If promotion to Q is legal, all are legal! */\r
PromotionPopup(hwnd);\r
- }\r
} else { /* not a promotion */\r
if (appData.animate || appData.highlightLastMove) {\r
SetHighlights(fromX, fromY, toX, toY);\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
}\r
}\r
+ break;\r
+ }\r
+ if (gotPremove) {\r
+ /* [HGM] it seemed that braces were missing here */\r
+ SetPremoveHighlights(fromX, fromY, toX, toY);\r
+ fromX = fromY = -1;\r
+ break;\r
}\r
- if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);\r
- fromX = fromY = -1;\r
- break;\r
}\r
ClearHighlights();\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
ReleaseCapture();\r
if (fromX == -1) break;\r
if (x == fromX && y == fromY) {\r
+ dragInfo.from.x = dragInfo.from.y = -1;\r
/* Upclick on same square */\r
if (sameAgain) {\r
/* Clicked same square twice: abort click-click move */\r
/* First square clicked: start click-click move */\r
SetHighlights(fromX, fromY, -1, -1);\r
}\r
- dragInfo.from.x = dragInfo.from.y = -1;\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
} else if (dragInfo.from.x < 0 || dragInfo.from.y < 0) {\r
/* Errant click; ignore */\r
appData.animate = appData.animate && !appData.animateDragging;\r
moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR);\r
if(moveType != ImpossibleMove) {\r
- if (IsPromotion(fromX, fromY, toX, toY)) {\r
- if (appData.alwaysPromoteToQueen)\r
- FinishMove(moveType, fromX, fromY, toX, toY, 'q');\r
- else {\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */\r
- }\r
+ /* [HGM] use move type to determine if move is promotion.\r
+ Knight is Shogi kludge for mandatory promotion, Queen means choice */\r
+ if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
+ (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&\r
+ appData.alwaysPromoteToQueen) \r
+ FinishMove(moveType, fromX, fromY, toX, toY, 'q');\r
+ else \r
+ if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) {\r
+ DrawPosition(forceFullRepaint || FALSE, NULL);\r
+ PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */\r
} else FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
}\r
if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);\r
if (appData.highlightDragging) {\r
ClearHighlights();\r
}\r
+ if(y == -2) {\r
+ /* [HGM] right mouse button in clock area edit-game mode ups clock */\r
+ if (PtInRect((LPRECT) &whiteRect, pt)) {\r
+ if (gameMode == EditGame) AdjustClock(flipClock, 1);\r
+ } else if (PtInRect((LPRECT) &blackRect, pt)) {\r
+ if (gameMode == EditGame) AdjustClock(!flipClock, 1);\r
+ }\r
+ }\r
DrawPosition(TRUE, NULL);\r
\r
switch (gameMode) {\r
/* Just have one menu, on the right button. Windows users don't\r
think to try the middle one, and sometimes other software steals\r
it, or it doesn't really exist. */\r
- MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1);\r
+ if(gameInfo.variant != VariantShogi)\r
+ MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1);\r
+ else\r
+ MenuPopup(hwnd, pt, LoadMenu(hInst, "ShogiPieceMenu"), -1);\r
#endif\r
}\r
break;\r
(!appData.testLegality || gameInfo.variant == VariantSuicide ||\r
gameInfo.variant == VariantGiveaway) ?\r
SW_SHOW : SW_HIDE);\r
-#ifdef FAIRY\r
- /* [HGM] Only allow C & A promotions in Capablanca Chess */\r
+ /* [HGM] Only allow C & A promotions if these pieces are defined */\r
ShowWindow(GetDlgItem(hDlg, PB_Archbishop),\r
- (gameInfo.variant == VariantCapablanca || \r
- gameInfo.variant == VariantGothic) ?\r
+ (PieceToChar(WhiteAngel) >= 'A' &&\r
+ PieceToChar(WhiteAngel) != '~' ||\r
+ PieceToChar(BlackAngel) >= 'A' &&\r
+ PieceToChar(BlackAngel) != '~' ) ?\r
SW_SHOW : SW_HIDE);\r
ShowWindow(GetDlgItem(hDlg, PB_Chancellor), \r
- (gameInfo.variant == VariantCapablanca || \r
- gameInfo.variant == VariantGothic) ?\r
+ (PieceToChar(WhiteMarshall) >= 'A' &&\r
+ PieceToChar(WhiteMarshall) != '~' ||\r
+ PieceToChar(BlackMarshall) >= 'A' &&\r
+ PieceToChar(BlackMarshall) != '~' ) ?\r
+ SW_SHOW : SW_HIDE);\r
+ /* [HGM] Hide B & R button in Shogi, use Q as promote, N as defer */\r
+ ShowWindow(GetDlgItem(hDlg, PB_Rook),\r
+ gameInfo.variant != VariantShogi ?\r
+ SW_SHOW : SW_HIDE);\r
+ ShowWindow(GetDlgItem(hDlg, PB_Bishop), \r
+ gameInfo.variant != VariantShogi ?\r
+ SW_SHOW : SW_HIDE);\r
+ ShowWindow(GetDlgItem(hDlg, IDC_Yes), \r
+ gameInfo.variant == VariantShogi ?\r
+ SW_SHOW : SW_HIDE);\r
+ ShowWindow(GetDlgItem(hDlg, IDC_No), \r
+ gameInfo.variant == VariantShogi ?\r
SW_SHOW : SW_HIDE);\r
-#endif\r
return TRUE;\r
\r
case WM_COMMAND: /* message: received a command */\r
DrawPosition(FALSE, NULL);\r
return TRUE;\r
case PB_King:\r
- promoChar = 'k';\r
+ promoChar = PieceToChar(BlackKing);\r
break;\r
case PB_Queen:\r
- promoChar = 'q';\r
+ promoChar = gameInfo.variant == VariantShogi ? '+' : PieceToChar(BlackQueen);\r
break;\r
case PB_Rook:\r
- promoChar = 'r';\r
+ promoChar = PieceToChar(BlackRook);\r
break;\r
case PB_Bishop:\r
- promoChar = 'b';\r
+ promoChar = PieceToChar(BlackBishop);\r
break;\r
-#ifdef FAIRY\r
case PB_Chancellor:\r
- promoChar = 'c';\r
+ promoChar = PieceToChar(BlackMarshall);\r
break;\r
case PB_Archbishop:\r
- promoChar = 'a';\r
+ promoChar = PieceToChar(BlackAngel);\r
break;\r
-#endif\r
case PB_Knight:\r
- promoChar = 'n';\r
+ promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(BlackKnight);\r
break;\r
default:\r
return FALSE;\r
UINT number = 0;\r
FILE *f;\r
char fileTitle[MSG_SIZ];\r
- f = OpenFileDialog(hwnd, FALSE, "",\r
+ f = OpenFileDialog(hwnd, "rb", "",\r
appData.oldSaveStyle ? "gam" : "pgn",\r
GAME_FILT,\r
title, &number, fileTitle, NULL);\r
Reset(FALSE, TRUE);\r
}\r
number = 1;\r
- f = OpenFileDialog(hwnd, FALSE, "",\r
+ f = OpenFileDialog(hwnd, "rb", "",\r
appData.oldSaveStyle ? "pos" : "fen",\r
POSITION_FILT,\r
"Load Position from File", &number, fileTitle, NULL);\r
\r
case IDM_SaveGame:\r
defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn");\r
- f = OpenFileDialog(hwnd, TRUE, defName,\r
+ f = OpenFileDialog(hwnd, "a", defName,\r
appData.oldSaveStyle ? "gam" : "pgn",\r
GAME_FILT,\r
"Save Game to File", NULL, fileTitle, NULL);\r
\r
case IDM_SavePosition:\r
defName = DefaultFileName(appData.oldSaveStyle ? "pos" : "fen");\r
- f = OpenFileDialog(hwnd, TRUE, defName,\r
+ f = OpenFileDialog(hwnd, "a", defName,\r
appData.oldSaveStyle ? "pos" : "fen",\r
POSITION_FILT,\r
"Save Position to File", NULL, fileTitle, NULL);\r
}\r
break;\r
\r
+ case IDM_SaveDiagram:\r
+ defName = "diagram";\r
+ f = OpenFileDialog(hwnd, "wb", defName,\r
+ "bmp",\r
+ DIAGRAM_FILT,\r
+ "Save Diagram to File", NULL, fileTitle, NULL);\r
+ if (f != NULL) {\r
+ SaveDiagram(f);\r
+ }\r
+ break;\r
+\r
case IDM_CopyGame:\r
CopyGameToClipboard();\r
break;\r
PopUpMoveDialog('\000');\r
break;\r
\r
+ case IDM_TypeInName:\r
+ PopUpNameDialog('\000');\r
+ break;\r
+\r
case IDM_Backward:\r
BackwardEvent();\r
SetFocus(hwndMain);\r
DrawPosition(FALSE, NULL);\r
break;\r
\r
+ case IDM_FlipClock:\r
+ flipClock = !flipClock;\r
+ DisplayBothClocks();\r
+ break;\r
+\r
case IDM_GeneralOptions:\r
GeneralOptionsPopup(hwnd);\r
DrawPosition(TRUE, NULL);\r
fromX = fromY = -1;\r
break;\r
\r
+ case EP_WhiteFerz:\r
+ EditPositionMenuEvent(WhiteFerz, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_WhiteWazir:\r
+ EditPositionMenuEvent(WhiteWazir, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_WhiteAlfil:\r
+ EditPositionMenuEvent(WhiteAlfil, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_WhiteCannon:\r
+ EditPositionMenuEvent(WhiteCannon, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_WhiteCardinal:\r
+ EditPositionMenuEvent(WhiteAngel, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_WhiteMarshall:\r
+ EditPositionMenuEvent(WhiteMarshall, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
case EP_WhiteKing:\r
EditPositionMenuEvent(WhiteKing, fromX, fromY);\r
fromX = fromY = -1;\r
fromX = fromY = -1;\r
break;\r
\r
+ case EP_BlackFerz:\r
+ EditPositionMenuEvent(BlackFerz, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_BlackWazir:\r
+ EditPositionMenuEvent(BlackWazir, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_BlackAlfil:\r
+ EditPositionMenuEvent(BlackAlfil, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_BlackCannon:\r
+ EditPositionMenuEvent(BlackCannon, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_BlackCardinal:\r
+ EditPositionMenuEvent(BlackAngel, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_BlackMarshall:\r
+ EditPositionMenuEvent(BlackMarshall, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
case EP_BlackKing:\r
EditPositionMenuEvent(BlackKing, fromX, fromY);\r
fromX = fromY = -1;\r
fromX = fromY = -1;\r
break;\r
\r
+ case EP_Promote:\r
+ EditPositionMenuEvent(PromotePiece, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
+ case EP_Demote:\r
+ EditPositionMenuEvent(DemotePiece, fromX, fromY);\r
+ fromX = fromY = -1;\r
+ break;\r
+\r
case DP_Pawn:\r
DropMenuEvent(WhitePawn, fromX, fromY);\r
fromX = fromY = -1;\r
\r
\r
FILE *\r
-OpenFileDialog(HWND hwnd, BOOL write, char *defName, char *defExt,\r
+OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] diag: type of 'write' now string\r
char *nameFilt, char *dlgTitle, UINT *number,\r
char fileTitle[MSG_SIZ], char fileName[MSG_SIZ])\r
{\r
openFileName.lpstrInitialDir = NULL;\r
openFileName.lpstrTitle = dlgTitle;\r
openFileName.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY \r
- | (write ? 0 : OFN_FILEMUSTEXIST) \r
+ | (write[0] != 'r' ? 0 : OFN_FILEMUSTEXIST) \r
| (number ? OFN_ENABLETEMPLATE | OFN_ENABLEHOOK: 0)\r
| (oldDialog ? 0 : OFN_EXPLORER);\r
openFileName.nFileOffset = 0;\r
(LPOFNHOOKPROC) OldOpenFileHook : (LPOFNHOOKPROC) OpenFileHook;\r
openFileName.lpTemplateName = (LPSTR)(oldDialog ? 1536 : DLG_IndexNumber);\r
\r
- if (write ? GetSaveFileName(&openFileName) : \r
- GetOpenFileName(&openFileName)) {\r
+ if (write[0] != 'r' ? GetSaveFileName(&openFileName) : \r
+ GetOpenFileName(&openFileName)) {\r
/* open the file */\r
- f = fopen(openFileName.lpstrFile, write ? "a" : "rb");\r
+ f = fopen(openFileName.lpstrFile, write);\r
if (f == NULL) {\r
MessageBox(hwnd, "File open failed", NULL,\r
MB_OK|MB_ICONEXCLAMATION);\r
\r
/*---------------------------------------------------------------------------*\\r
*\r
+ * Type-in name dialog functions\r
+ * \r
+\*---------------------------------------------------------------------------*/\r
+\r
+LRESULT CALLBACK\r
+TypeInNameDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+ char move[MSG_SIZ];\r
+ HWND hInput;\r
+\r
+ switch (message) {\r
+ case WM_INITDIALOG:\r
+ move[0] = (char) lParam;\r
+ move[1] = NULLCHAR;\r
+ CenterWindowEx(hDlg, GetWindow(hDlg, GW_OWNER), 1 );\r
+ hInput = GetDlgItem(hDlg, OPT_Name);\r
+ SetWindowText(hInput, move);\r
+ SetFocus(hInput);\r
+ SendMessage(hInput, EM_SETSEL, (WPARAM)9999, (LPARAM)9999);\r
+ return FALSE;\r
+\r
+ case WM_COMMAND:\r
+ switch (LOWORD(wParam)) {\r
+ case IDOK:\r
+ GetDlgItemText(hDlg, OPT_Name, move, sizeof(move));\r
+ appData.userName = strdup(move);\r
+\r
+ EndDialog(hDlg, TRUE);\r
+ return TRUE;\r
+ case IDCANCEL:\r
+ EndDialog(hDlg, FALSE);\r
+ return TRUE;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+ return FALSE;\r
+}\r
+\r
+VOID\r
+PopUpNameDialog(char firstchar)\r
+{\r
+ FARPROC lpProc;\r
+ \r
+ lpProc = MakeProcInstance((FARPROC)TypeInNameDialog, hInst);\r
+ DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInName),\r
+ hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar);\r
+ FreeProcInstance(lpProc);\r
+}\r
+\r
+/*---------------------------------------------------------------------------*\\r
+ *\r
* Error dialogs\r
* \r
\*---------------------------------------------------------------------------*/\r
}\r
\r
#ifdef GOTHIC\r
+HWND gothicDialog = NULL;\r
+\r
LRESULT CALLBACK\r
GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
and it doesn't work when you resize the dialog.\r
For now, just give it a default position.\r
*/\r
-\r
+ gothicDialog = hDlg;\r
SetWindowText(hDlg, errorTitle);\r
hwndText = GetDlgItem(hDlg, OPT_ErrorText);\r
SetDlgItemText(hDlg, OPT_ErrorText, errorMessage);\r
}\r
\r
VOID\r
-GothicPopUp(char *title)\r
+GothicPopUp(char *title, VariantClass variant)\r
{\r
FARPROC lpProc;\r
char *p, *q;\r
BOOLEAN modal = hwndMain == NULL;\r
+ static char *lastTitle;\r
\r
strncpy(errorTitle, title, sizeof(errorTitle));\r
errorTitle[sizeof(errorTitle) - 1] = '\0';\r
- \r
+\r
+ if(lastTitle != title && gothicDialog != NULL) {\r
+ DestroyWindow(gothicDialog);\r
+ gothicDialog = NULL;\r
+ }\r
+ if(variant != VariantNormal && gothicDialog == NULL) {\r
+ title = lastTitle;\r
lpProc = MakeProcInstance((FARPROC)GothicDialog, hInst);\r
CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error),\r
hwndMain, (DLGPROC)lpProc);\r
FreeProcInstance(lpProc);\r
+ }\r
}\r
#endif\r
\r
\r
if (appData.clockMode) {\r
if (tinyLayout)\r
- sprintf(buf, "%c %s %s %s", color[0], TimeString(timeRemaining), flagFell);\r
+ sprintf(buf, "%c %s %s", color[0], TimeString(timeRemaining), flagFell);\r
else\r
sprintf(buf, "%s: %s %s", color, TimeString(timeRemaining), flagFell);\r
str = buf;\r
case IDOK:\r
*lpIndexFRC = GetDlgItemInt(hDlg, IDC_NFG_Edit, &index_is_ok, TRUE );\r
EndDialog( hDlg, 0 );\r
+ shuffleOpenings = TRUE; /* [HGM] shuffle: switch shuffling on for as long as we stay in current variant */\r
return TRUE;\r
case IDCANCEL:\r
EndDialog( hDlg, 1 ); \r
}\r
return TRUE;\r
case IDC_NFG_Random:\r
- sprintf( buf, "%d", myrandom() % 960 );\r
+ sprintf( buf, "%d", myrandom() ); /* [HGM] shuffle: no longer limit to 960 */\r
SetDlgItemText(hDlg, IDC_NFG_Edit, buf );\r
return TRUE;\r
}\r
static char buf[MSG_SIZ];\r
DWORD bufsiz = MSG_SIZ;\r
\r
+ if(appData.userName != NULL && appData.userName[0] != 0) { \r
+ return appData.userName; /* [HGM] username: prefer name selected by user over his system login */\r
+ }\r
if (!GetUserName(buf, &bufsiz)) {\r
/*DisplayError("Error getting user name", GetLastError());*/\r
strcpy(buf, "User");\r
char *flag = whiteFlag && gameMode == TwoMachinesPlay ? "(!)" : "";\r
\r
if (!IsIconic(hwndMain)) {\r
- DisplayAClock(hdc, timeRemaining, highlight, &whiteRect, "White", flag);\r
+ DisplayAClock(hdc, timeRemaining, highlight, flipClock ? &blackRect : &whiteRect, "White", flag);\r
}\r
if (highlight && iconCurrent == iconBlack) {\r
iconCurrent = iconWhite;\r
\r
hdc = GetDC(hwndMain);\r
if (!IsIconic(hwndMain)) {\r
- DisplayAClock(hdc, timeRemaining, highlight, &blackRect, "Black", flag);\r
+ DisplayAClock(hdc, timeRemaining, highlight, flipClock ? &whiteRect : &blackRect, "Black", flag);\r
}\r
if (highlight && iconCurrent == iconWhite) {\r
iconCurrent = iconBlack;\r
char fileTitle[MSG_SIZ];\r
\r
defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn");\r
- f = OpenFileDialog(hwndMain, TRUE, defName,\r
+ f = OpenFileDialog(hwndMain, "a", defName,\r
appData.oldSaveStyle ? "gam" : "pgn",\r
GAME_FILT, \r
"Save Game to File", NULL, fileTitle, NULL);\r
void\r
DestroyChildProcess(ProcRef pr, int/*boolean*/ signal)\r
{\r
- ChildProc *cp;\r
+ ChildProc *cp; int result;\r
\r
cp = (ChildProc *) pr;\r
if (cp == NULL) return;\r
/*!!if (signal) GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, cp->pid);*/\r
\r
/* [AS] Special termination modes for misbehaving programs... */\r
- if( signal == 9 ) {\r
+ if( signal == 9 ) { \r
+ result = TerminateProcess( cp->hProcess, 0 );\r
+\r
if ( appData.debugMode) {\r
- fprintf( debugFP, "Terminating process %u\n", cp->pid );\r
+ fprintf( debugFP, "Terminating process %u, result=%d\n", cp->pid, result );\r
}\r
-\r
- TerminateProcess( cp->hProcess, 0 );\r
}\r
else if( signal == 10 ) {\r
DWORD dw = WaitForSingleObject( cp->hProcess, 3*1000 ); // Wait 3 seconds at most\r
\r
if( dw != WAIT_OBJECT_0 ) {\r
+ result = TerminateProcess( cp->hProcess, 0 );\r
+\r
if ( appData.debugMode) {\r
- fprintf( debugFP, "Process %u still alive after timeout, killing...\n", cp->pid );\r
+ fprintf( debugFP, "Process %u still alive after timeout, killing... result=%d\n", cp->pid, result );\r
}\r
\r
- TerminateProcess( cp->hProcess, 0 );\r
}\r
}\r
\r